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 |