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

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

Issue 2142353002: Validate fbo color image format and fragment shader output variable type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: revision addressed piman review comments Created 4 years, 5 months 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
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 8385921ed1330b8d9af941aa4c2c456cdb537ff8..0d4c44bd1160269ee0a5c7e3fe18e042075d3334 100644
--- a/gpu/command_buffer/service/program_manager_unittest.cc
+++ b/gpu/command_buffer/service/program_manager_unittest.cc
@@ -59,6 +59,7 @@ class ProgramManagerTestBase : public GpuServiceTest {
protected:
virtual void SetupProgramManager() {
manager_.reset(new ProgramManager(nullptr, kMaxVaryingVectors,
+ kMaxDrawBuffers,
kMaxDualSourceDrawBuffers,
gpu_preferences_,
feature_info_.get()));
@@ -1743,6 +1744,124 @@ TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) {
EXPECT_TRUE(LinkAsExpected(program, false));
}
+TEST_F(ProgramManagerWithShaderTest, FragmentOutputTypes) {
+ // Set up program
+ Shader* vshader = shader_manager_.CreateShader(
+ kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
+ TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr);
+ Shader* fshader = shader_manager_.CreateShader(
+ kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
+ ASSERT_TRUE(vshader && fshader);
+ Program* program =
+ manager_->CreateProgram(kClientProgramId, kServiceProgramId);
+ ASSERT_TRUE(program);
+ EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
+ EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
+
+ { // No outputs.
+ TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr);
+ EXPECT_TRUE(LinkAsExpected(program, true));
+ EXPECT_EQ(0u, program->fragment_output_type_mask());
+ EXPECT_EQ(0u, program->fragment_output_written_mask());
+ }
+
+ { // gl_FragColor
+ OutputVariableList fragment_outputs;
+ sh::OutputVariable var = TestHelper::ConstructOutputVariable(
+ GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_FragColor");
+ var.location = -1;
+ fragment_outputs.push_back(var);
+ TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr,
+ &fragment_outputs, nullptr);
+ EXPECT_TRUE(LinkAsExpected(program, true));
+ EXPECT_EQ(0x3u, program->fragment_output_type_mask());
+ EXPECT_EQ(0x3u, program->fragment_output_written_mask());
+ }
+
+ { // gl_FragData
+ OutputVariableList fragment_outputs;
+ sh::OutputVariable var = TestHelper::ConstructOutputVariable(
+ GL_FLOAT_VEC4, 8, GL_MEDIUM_FLOAT, true, "gl_FragData");
+ var.location = -1;
+ fragment_outputs.push_back(var);
+ TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr,
+ &fragment_outputs, nullptr);
+ EXPECT_TRUE(LinkAsExpected(program, true));
+ EXPECT_EQ(0xFFFFu, program->fragment_output_type_mask());
+ EXPECT_EQ(0xFFFFu, program->fragment_output_written_mask());
+ }
+
+ { // gl_FragColor, gl_FragDepth
+ OutputVariableList fragment_outputs;
+ sh::OutputVariable var = TestHelper::ConstructOutputVariable(
+ GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_FragColor");
+ var.location = -1;
+ fragment_outputs.push_back(var);
+ var = TestHelper::ConstructOutputVariable(
+ GL_FLOAT, 0, GL_MEDIUM_FLOAT, true, "gl_FragDepth");
+ var.location = -1;
+ fragment_outputs.push_back(var);
+ TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr,
+ &fragment_outputs, nullptr);
+ EXPECT_TRUE(LinkAsExpected(program, true));
+ EXPECT_EQ(0x3u, program->fragment_output_type_mask());
+ EXPECT_EQ(0x3u, program->fragment_output_written_mask());
+ }
+
+ { // Single user defined output.
+ OutputVariableList fragment_outputs;
+ sh::OutputVariable var = TestHelper::ConstructOutputVariable(
+ GL_UNSIGNED_INT_VEC4, 0, GL_MEDIUM_INT, true, "myOutput");
+ var.location = -1;
+ fragment_outputs.push_back(var);
+ TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr,
+ &fragment_outputs, nullptr);
+ EXPECT_TRUE(LinkAsExpected(program, true));
+ EXPECT_EQ(0x2u, program->fragment_output_type_mask());
+ EXPECT_EQ(0x3u, program->fragment_output_written_mask());
+ }
+
+ { // Single user defined output - no static use.
+ OutputVariableList fragment_outputs;
+ sh::OutputVariable var = TestHelper::ConstructOutputVariable(
+ GL_UNSIGNED_INT_VEC4, 0, GL_MEDIUM_INT, false, "myOutput");
+ var.location = -1;
+ fragment_outputs.push_back(var);
+ TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr,
+ &fragment_outputs, nullptr);
+ EXPECT_TRUE(LinkAsExpected(program, true));
+ EXPECT_EQ(0x2u, program->fragment_output_type_mask());
+ EXPECT_EQ(0x3u, program->fragment_output_written_mask());
+ }
+
+ { // Multiple user defined outputs.
+ OutputVariableList fragment_outputs;
+ sh::OutputVariable var = TestHelper::ConstructOutputVariable(
+ GL_INT_VEC4, 0, GL_MEDIUM_INT, true, "myOutput");
+ var.location = 0;
+ fragment_outputs.push_back(var);
+ var = TestHelper::ConstructOutputVariable(
+ GL_FLOAT_VEC4, 2, GL_MEDIUM_FLOAT, true, "myOutputArray");
+ var.location = 2;
+ fragment_outputs.push_back(var);
+ TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr,
+ &fragment_outputs, nullptr);
+ EXPECT_TRUE(LinkAsExpected(program, true));
+ EXPECT_EQ(0xF1u, program->fragment_output_type_mask());
+ EXPECT_EQ(0xF3u, program->fragment_output_written_mask());
+ }
+}
+
// Varyings go over 8 rows.
TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) {
const VarInfo kVertexVaryings[] = {
@@ -1951,6 +2070,7 @@ class ProgramManagerWithCacheTest : public ProgramManagerTestBase {
protected:
void SetupProgramManager() override {
manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors,
+ kMaxDrawBuffers,
kMaxDualSourceDrawBuffers,
gpu_preferences_,
feature_info_.get()));

Powered by Google App Engine
This is Rietveld 408576698