Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Unified Diff: gpu/command_buffer/service/program_manager_unittest.cc

Issue 1309743005: command_buffer: Implement EXT_blend_func_extended (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@new-05-path-fragment-input-gen
Patch Set: rebase Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/program_manager.cc ('k') | gpu/command_buffer/service/shader_manager.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/program_manager_unittest.cc
diff --git a/gpu/command_buffer/service/program_manager_unittest.cc b/gpu/command_buffer/service/program_manager_unittest.cc
index 404017f1e44aa38e0f2342a74dc79a1e7cddd797..8343e56ece9081acf9339057a5ad2945d46ffcaa 100644
--- a/gpu/command_buffer/service/program_manager_unittest.cc
+++ b/gpu/command_buffer/service/program_manager_unittest.cc
@@ -21,6 +21,7 @@
#include "gpu/command_buffer/service/test_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gl/gl_mock.h"
+#include "ui/gl/gl_version_info.h"
using ::testing::_;
using ::testing::DoAll;
@@ -38,6 +39,8 @@ namespace gles2 {
namespace {
const uint32 kMaxVaryingVectors = 8;
+const uint32 kMaxDrawBuffers = 8;
+const uint32 kMaxDualSourceDrawBuffers = 8;
void ShaderCacheCb(const std::string& key, const std::string& shader) {}
@@ -51,8 +54,9 @@ uint32 ComputeOffset(const void* start, const void* position) {
class ProgramManagerTestBase : public GpuServiceTest {
protected:
virtual void SetupProgramManager() {
- manager_.reset(
- new ProgramManager(NULL, kMaxVaryingVectors, feature_info_.get()));
+ manager_.reset(new ProgramManager(nullptr, kMaxVaryingVectors,
+ kMaxDualSourceDrawBuffers,
+ feature_info_.get()));
}
void SetUpBase(const char* gl_version,
const char* gl_extensions,
@@ -215,6 +219,13 @@ class ProgramManagerWithShaderTest : public ProgramManagerTestBase {
static const GLint kInvalidUniformLocation = 30;
static const GLint kBadUniformIndex = 1000;
+ static const char* kOutputVariable1Name;
+ static const GLint kOutputVariable1Size = 1;
+ static const GLenum kOutputVariable1Precision = GL_MEDIUM_FLOAT;
+ static const bool kOutputVariable1StaticUse = true;
+ static const GLint kOutputVariable1Location = -1;
+ static const GLenum kOutputVariable1Type = GL_FLOAT_VEC4;
+
static const size_t kNumAttribs;
static const size_t kNumUniforms;
@@ -225,7 +236,8 @@ class ProgramManagerWithShaderTest : public ProgramManagerTestBase {
typedef enum {
kVarUniform,
kVarVarying,
- kVarAttribute
+ kVarAttribute,
+ kVarOutput,
} VarCategory;
typedef struct {
@@ -299,14 +311,16 @@ class ProgramManagerWithShaderTest : public ProgramManagerTestBase {
return (static_cast<bool>(link_status) == expected_link_status);
}
- Program* SetupShaderVariableTest(const VarInfo* vertex_variables,
- size_t vertex_variable_size,
- const VarInfo* fragment_variables,
- size_t fragment_variable_size) {
+ Program* SetupProgramForVariables(const VarInfo* vertex_variables,
+ size_t vertex_variable_size,
+ const VarInfo* fragment_variables,
+ size_t fragment_variable_size,
+ const int* const shader_version = nullptr) {
// Set up shader
AttributeMap vertex_attrib_map;
UniformMap vertex_uniform_map;
VaryingMap vertex_varying_map;
+ OutputVariableList vertex_output_variable_list;
for (size_t ii = 0; ii < vertex_variable_size; ++ii) {
switch (vertex_variables[ii].category) {
case kVarAttribute:
@@ -336,6 +350,13 @@ class ProgramManagerWithShaderTest : public ProgramManagerTestBase {
vertex_variables[ii].static_use,
vertex_variables[ii].name);
break;
+ case kVarOutput:
+ vertex_output_variable_list.push_back(
+ TestHelper::ConstructOutputVariable(
+ vertex_variables[ii].type, vertex_variables[ii].size,
+ vertex_variables[ii].precision,
+ vertex_variables[ii].static_use, vertex_variables[ii].name));
+ break;
default:
NOTREACHED();
}
@@ -344,6 +365,7 @@ class ProgramManagerWithShaderTest : public ProgramManagerTestBase {
AttributeMap frag_attrib_map;
UniformMap frag_uniform_map;
VaryingMap frag_varying_map;
+ OutputVariableList frag_output_variable_list;
for (size_t ii = 0; ii < fragment_variable_size; ++ii) {
switch (fragment_variables[ii].category) {
case kVarAttribute:
@@ -373,6 +395,14 @@ class ProgramManagerWithShaderTest : public ProgramManagerTestBase {
fragment_variables[ii].static_use,
fragment_variables[ii].name);
break;
+ case kVarOutput:
+ frag_output_variable_list.push_back(
+ TestHelper::ConstructOutputVariable(
+ fragment_variables[ii].type, fragment_variables[ii].size,
+ fragment_variables[ii].precision,
+ fragment_variables[ii].static_use,
+ fragment_variables[ii].name));
+ break;
default:
NOTREACHED();
}
@@ -386,12 +416,14 @@ class ProgramManagerWithShaderTest : public ProgramManagerTestBase {
// Check shader got created.
EXPECT_TRUE(vshader != NULL && fshader != NULL);
// Set Status
- TestHelper::SetShaderStates(
- gl_.get(), vshader, true, NULL, NULL, NULL, &vertex_attrib_map,
- &vertex_uniform_map, &vertex_varying_map, NULL, NULL);
- TestHelper::SetShaderStates(
- gl_.get(), fshader, true, NULL, NULL, NULL,
- &frag_attrib_map, &frag_uniform_map, &frag_varying_map, NULL, NULL);
+ TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
+ shader_version, &vertex_attrib_map,
+ &vertex_uniform_map, &vertex_varying_map,
+ nullptr, &vertex_output_variable_list, nullptr);
+ TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
+ shader_version, &frag_attrib_map,
+ &frag_uniform_map, &frag_varying_map, nullptr,
+ &frag_output_variable_list, nullptr);
// Set up program
Program* program =
@@ -502,6 +534,7 @@ const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex =
const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3";
const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex =
"uniform3[0]";
+const char* ProgramManagerWithShaderTest::kOutputVariable1Name = "outputVar1";
TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) {
const Program* program = SetupDefaultProgram();
@@ -805,6 +838,7 @@ TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) {
AttributeMap attrib_map;
UniformMap uniform_map;
VaryingMap varying_map;
+ OutputVariableList output_variable_list;
attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute(
kAttrib1Type, kAttrib1Size, kAttrib1Precision,
kAttribStaticUse, kAttrib1Name);
@@ -823,18 +857,22 @@ TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) {
uniform_map[kUniform3Name] = TestHelper::ConstructUniform(
kUniform3Type, kUniform3Size, kUniform3Precision,
kUniform3StaticUse, kUniform3Name);
+ output_variable_list.push_back(TestHelper::ConstructOutputVariable(
+ kOutputVariable1Type, kOutputVariable1Size, kOutputVariable1Precision,
+ kOutputVariable1StaticUse, kOutputVariable1Name));
+
Shader* vshader = shader_manager_.CreateShader(
kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
ASSERT_TRUE(vshader != NULL);
- TestHelper::SetShaderStates(
- gl_.get(), vshader, true, NULL, NULL, NULL,
- &attrib_map, &uniform_map, &varying_map, NULL, NULL);
+ TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
+ nullptr, &attrib_map, &uniform_map, &varying_map,
+ nullptr, &output_variable_list, nullptr);
Shader* fshader = shader_manager_.CreateShader(
kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
ASSERT_TRUE(fshader != NULL);
- TestHelper::SetShaderStates(
- gl_.get(), fshader, true, NULL, NULL, NULL,
- &attrib_map, &uniform_map, &varying_map, NULL, NULL);
+ TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
+ nullptr, &attrib_map, &uniform_map, &varying_map,
+ nullptr, &output_variable_list, nullptr);
static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = {
{ kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
{ kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, },
@@ -1497,9 +1535,9 @@ TEST_F(ProgramManagerWithShaderTest, BindAttribLocationConflicts) {
// Check shader got created.
ASSERT_TRUE(vshader != NULL && fshader != NULL);
// Set Status
- TestHelper::SetShaderStates(
- gl_.get(), vshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL,
- NULL, NULL);
+ TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
+ nullptr, &attrib_map, nullptr, nullptr, nullptr,
+ nullptr, nullptr);
// Check attrib infos got copied.
for (AttributeMap::const_iterator it = attrib_map.begin();
it != attrib_map.end(); ++it) {
@@ -1512,10 +1550,9 @@ TEST_F(ProgramManagerWithShaderTest, BindAttribLocationConflicts) {
EXPECT_EQ(it->second.staticUse, variable_info->staticUse);
EXPECT_EQ(it->second.name, variable_info->name);
}
- TestHelper::SetShaderStates(
- gl_.get(), fshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL,
- NULL, NULL);
-
+ TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
+ nullptr, &attrib_map, nullptr, nullptr, nullptr,
+ nullptr, nullptr);
// Set up program
Program* program =
manager_->CreateProgram(kClientProgramId, kServiceProgramId);
@@ -1581,13 +1618,12 @@ TEST_F(ProgramManagerWithShaderTest, UniformsPrecisionMismatch) {
// Check shader got created.
ASSERT_TRUE(vshader != NULL && fshader != NULL);
// Set Status
- TestHelper::SetShaderStates(
- gl_.get(), vshader, true, NULL, NULL, NULL, NULL,
- &vertex_uniform_map, NULL, NULL, NULL);
- TestHelper::SetShaderStates(
- gl_.get(), fshader, true, NULL, NULL, NULL, NULL,
- &frag_uniform_map, NULL, NULL, NULL);
-
+ TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
+ nullptr, nullptr, &vertex_uniform_map, nullptr,
+ nullptr, nullptr, nullptr);
+ TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
+ nullptr, nullptr, &frag_uniform_map, nullptr,
+ nullptr, nullptr, nullptr);
// Set up program
Program* program =
manager_->CreateProgram(kClientProgramId, kServiceProgramId);
@@ -1609,8 +1645,8 @@ TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) {
{ GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
const VarInfo kFragmentVarying =
{ GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
- Program* program = SetupShaderVariableTest(
- &kVertexVarying, 1, &kFragmentVarying, 1);
+ Program* program =
+ SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1);
std::string conflicting_name;
@@ -1626,8 +1662,8 @@ TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) {
{ GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
const VarInfo kFragmentVarying =
{ GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
- Program* program = SetupShaderVariableTest(
- &kVertexVarying, 1, &kFragmentVarying, 1);
+ Program* program =
+ SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1);
std::string conflicting_name;
@@ -1643,8 +1679,8 @@ TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) {
{ GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying };
const VarInfo kFragmentVarying =
{ GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
- Program* program = SetupShaderVariableTest(
- &kVertexVarying, 1, &kFragmentVarying, 1);
+ Program* program =
+ SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1);
std::string conflicting_name;
@@ -1658,8 +1694,7 @@ TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) {
TEST_F(ProgramManagerWithShaderTest, VaryingMissing) {
const VarInfo kFragmentVarying =
{ GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
- Program* program = SetupShaderVariableTest(
- NULL, 0, &kFragmentVarying, 1);
+ Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1);
std::string conflicting_name;
@@ -1674,8 +1709,7 @@ TEST_F(ProgramManagerWithShaderTest, VaryingMissing) {
TEST_F(ProgramManagerWithShaderTest, InactiveVarying) {
const VarInfo kFragmentVarying =
{ GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying };
- Program* program = SetupShaderVariableTest(
- NULL, 0, &kFragmentVarying, 1);
+ Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1);
std::string conflicting_name;
@@ -1692,8 +1726,8 @@ TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) {
{ GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute };
const VarInfo kFragmentUniform =
{ GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform };
- Program* program = SetupShaderVariableTest(
- &kVertexAttribute, 1, &kFragmentUniform, 1);
+ Program* program =
+ SetupProgramForVariables(&kVertexAttribute, 1, &kFragmentUniform, 1);
std::string conflicting_name;
@@ -1712,8 +1746,8 @@ TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) {
{ GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying },
{ GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
};
- Program* program = SetupShaderVariableTest(
- kVertexVaryings, 2, kFragmentVaryings, 2);
+ Program* program =
+ SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2);
EXPECT_FALSE(
program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed));
@@ -1730,8 +1764,8 @@ TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) {
{ GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying },
{ GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
};
- Program* program = SetupShaderVariableTest(
- kVertexVaryings, 2, kFragmentVaryings, 2);
+ Program* program =
+ SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2);
EXPECT_TRUE(
program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed));
@@ -1749,8 +1783,8 @@ TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) {
{ GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying },
{ GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
};
- Program* program = SetupShaderVariableTest(
- kVertexVaryings, 2, kFragmentVaryings, 2);
+ Program* program =
+ SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2);
EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll));
}
@@ -1910,6 +1944,7 @@ class ProgramManagerWithCacheTest : public ProgramManagerTestBase {
protected:
void SetupProgramManager() override {
manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors,
+ kMaxDualSourceDrawBuffers,
feature_info_.get()));
}
@@ -1931,10 +1966,12 @@ class ProgramManagerWithCacheTest : public ProgramManagerTestBase {
program_->AttachShader(&shader_manager_, vertex_shader_);
program_->AttachShader(&shader_manager_, fragment_shader_);
}
+
void TearDown() override {
shader_manager_.Destroy(false);
ProgramManagerTestBase::TearDown();
}
+
void SetShadersCompiled() {
TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true);
TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true);
@@ -2019,9 +2056,9 @@ class ProgramManagerWithCacheTest : public ProgramManagerTestBase {
}
void SetExpectationsForProgramLoadSuccess(GLuint service_program_id) {
- TestHelper::SetupProgramSuccessExpectations(gl_.get(), feature_info_.get(),
- nullptr, 0, nullptr, 0, nullptr,
- 0, service_program_id);
+ TestHelper::SetupProgramSuccessExpectations(
+ gl_.get(), feature_info_.get(), nullptr, 0, nullptr, 0, nullptr, 0,
+ nullptr, 0, service_program_id);
}
void SetExpectationsForProgramLink() {
@@ -2177,7 +2214,6 @@ const char* ProgramManagerWithPathRenderingTest::kFragmentInput1Name = "color1";
const char* ProgramManagerWithPathRenderingTest::kFragmentInput2Name = "color2";
const char* ProgramManagerWithPathRenderingTest::kFragmentInput2GLName =
"color2[0]";
-
const char* ProgramManagerWithPathRenderingTest::kFragmentInput3Name = "color3";
const char* ProgramManagerWithPathRenderingTest::kFragmentInput3GLName =
"color3[0]";
@@ -2205,10 +2241,10 @@ TEST_P(ProgramManagerWithPathRenderingTest, BindFragmentInputLocation) {
kFragmentInput3StaticUse, kFragmentInput3Name);
TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
nullptr, nullptr, nullptr, &varying_map, nullptr,
- nullptr);
+ nullptr, nullptr);
TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
nullptr, nullptr, nullptr, &varying_map, nullptr,
- nullptr);
+ nullptr, nullptr);
Program* program =
manager_->CreateProgram(kClientProgramId, kServiceProgramId);
ASSERT_TRUE(program != NULL);
@@ -2238,7 +2274,7 @@ TEST_P(ProgramManagerWithPathRenderingTest, BindFragmentInputLocation) {
TestHelper::SetupShaderExpectationsWithVaryings(
gl_.get(), feature_info_.get(), nullptr, 0, nullptr, 0,
kFragmentInputExpectationInfos, arraysize(kFragmentInputExpectationInfos),
- kServiceProgramId);
+ nullptr, 0, kServiceProgramId);
program->Link(NULL, Program::kCountOnlyStaticallyUsed,
base::Bind(&ShaderCacheCb));
const Program::FragmentInputInfo* info1 =
@@ -2273,5 +2309,90 @@ INSTANTIATE_TEST_CASE_P(
make_gl_ext_tuple("4.5", "GL_NV_path_rendering"),
make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering")));
+class ProgramManagerDualSourceBlendingTest
+ : public ProgramManagerWithShaderTest,
+ public testing::WithParamInterface<
+ testing::tuple<const char*, const char*>> {
+ public:
+ ProgramManagerDualSourceBlendingTest() {}
+
+ protected:
+ void SetUpWithFeatureInfo(FeatureInfo* feature_info) {
+ const char* gl_version = testing::get<0>(GetParam());
+ const char* gl_extensions = testing::get<1>(GetParam());
+ SetUpBase(gl_version, gl_extensions, feature_info);
+ }
+
+ void SetUp() override { SetUpWithFeatureInfo(nullptr); }
+};
+
+class ProgramManagerDualSourceBlendingES2Test
+ : public ProgramManagerDualSourceBlendingTest {};
+
+TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragCoord) {
+ DCHECK(feature_info_->feature_flags().ext_blend_func_extended);
+
+ const VarInfo kFragmentVaryings[] = {
+ {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_SecondaryFragColorEXT",
+ kVarOutput},
+ {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_FragColor", kVarOutput},
+ };
+
+ int shader_version = 100;
+ Program* program =
+ SetupProgramForVariables(nullptr, 0, kFragmentVaryings,
+ arraysize(kFragmentVaryings), &shader_version);
+
+ const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info();
+ if (!gl_version.is_es) {
+ // The call is expected only for OpenGL. OpenGL ES expects to
+ // output GLES SL 1.00, which does not bind.
+ EXPECT_CALL(*(gl_.get()),
+ BindFragDataLocationIndexed(kServiceProgramId, 0, 1,
+ StrEq("angle_SecondaryFragColor")))
+ .Times(1)
+ .RetiresOnSaturation();
+ }
+
+ EXPECT_TRUE(LinkAsExpected(program, true));
+}
+
+TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragData) {
+ const VarInfo kFragmentVaryings[] = {
+ {GL_FLOAT_VEC4, kMaxDualSourceDrawBuffers, GL_MEDIUM_FLOAT, true,
+ "gl_SecondaryFragDataEXT", kVarOutput},
+ {GL_FLOAT_VEC4, kMaxDrawBuffers, GL_MEDIUM_FLOAT, true, "gl_FragData",
+ kVarOutput},
+ };
+
+ int shader_version = 100;
+ Program* program =
+ SetupProgramForVariables(nullptr, 0, kFragmentVaryings,
+ arraysize(kFragmentVaryings), &shader_version);
+
+ const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info();
+ if (!gl_version.is_es) {
+ // The call is expected only for OpenGL. OpenGL ES expects to
+ // output GLES SL 1.00, which does not bind.
+ EXPECT_CALL(*(gl_.get()),
+ BindFragDataLocationIndexed(kServiceProgramId, 0, 1,
+ StrEq("angle_SecondaryFragData")))
+ .Times(1)
+ .RetiresOnSaturation();
+ }
+
+ EXPECT_TRUE(LinkAsExpected(program, true));
+}
+
+INSTANTIATE_TEST_CASE_P(
+ SupportedContexts,
+ ProgramManagerDualSourceBlendingES2Test,
+ testing::Values(
+ make_gl_ext_tuple("3.2",
+ "GL_ARB_draw_buffers GL_ARB_blend_func_extended "
+ "GL_ARB_program_interface_query"),
+ make_gl_ext_tuple("opengl es 3.1",
+ "GL_EXT_draw_buffers GL_EXT_blend_func_extended")));
+
} // namespace gles2
} // namespace gpu
« no previous file with comments | « gpu/command_buffer/service/program_manager.cc ('k') | gpu/command_buffer/service/shader_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698