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

Side by Side Diff: gpu/command_buffer/service/program_manager_unittest.cc

Issue 132183002: Report relevant variable names in info logs on failed shader link (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Fix nits Created 6 years, 11 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 unified diff | Download patch
« no previous file with comments | « gpu/command_buffer/service/program_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/program_manager.h" 5 #include "gpu/command_buffer/service/program_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
(...skipping 1237 matching lines...) Expand 10 before | Expand all | Expand 10 after
1248 1248
1249 // Set up program 1249 // Set up program
1250 const GLuint kClientProgramId = 6666; 1250 const GLuint kClientProgramId = 6666;
1251 const GLuint kServiceProgramId = 8888; 1251 const GLuint kServiceProgramId = 8888;
1252 Program* program = 1252 Program* program =
1253 manager_.CreateProgram(kClientProgramId, kServiceProgramId); 1253 manager_.CreateProgram(kClientProgramId, kServiceProgramId);
1254 ASSERT_TRUE(program != NULL); 1254 ASSERT_TRUE(program != NULL);
1255 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 1255 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
1256 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 1256 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
1257 1257
1258 EXPECT_TRUE(program->DetectUniformsMismatch()); 1258 std::string conflicting_name;
1259
1260 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name));
1261 EXPECT_EQ(conflicting_name, "a");
1259 EXPECT_TRUE(LinkAsExpected(program, false)); 1262 EXPECT_TRUE(LinkAsExpected(program, false));
1260 } 1263 }
1261 1264
1262 // If a varying has different type in the vertex and fragment 1265 // If a varying has different type in the vertex and fragment
1263 // shader, linking should fail. 1266 // shader, linking should fail.
1264 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { 1267 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) {
1265 const VarInfo kVertexVarying = 1268 const VarInfo kVertexVarying =
1266 { SH_FLOAT_VEC3, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; 1269 { SH_FLOAT_VEC3, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying };
1267 const VarInfo kFragmentVarying = 1270 const VarInfo kFragmentVarying =
1268 { SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; 1271 { SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying };
1269 Program* program = SetupShaderVariableTest( 1272 Program* program = SetupShaderVariableTest(
1270 &kVertexVarying, 1, &kFragmentVarying, 1); 1273 &kVertexVarying, 1, &kFragmentVarying, 1);
1271 1274
1272 EXPECT_TRUE(program->DetectVaryingsMismatch()); 1275 std::string conflicting_name;
1276
1277 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name));
1278 EXPECT_EQ(conflicting_name, "a");
1273 EXPECT_TRUE(LinkAsExpected(program, false)); 1279 EXPECT_TRUE(LinkAsExpected(program, false));
1274 } 1280 }
1275 1281
1276 // If a varying has different array size in the vertex and fragment 1282 // If a varying has different array size in the vertex and fragment
1277 // shader, linking should fail. 1283 // shader, linking should fail.
1278 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { 1284 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) {
1279 const VarInfo kVertexVarying = 1285 const VarInfo kVertexVarying =
1280 { SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; 1286 { SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying };
1281 const VarInfo kFragmentVarying = 1287 const VarInfo kFragmentVarying =
1282 { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; 1288 { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying };
1283 Program* program = SetupShaderVariableTest( 1289 Program* program = SetupShaderVariableTest(
1284 &kVertexVarying, 1, &kFragmentVarying, 1); 1290 &kVertexVarying, 1, &kFragmentVarying, 1);
1285 1291
1286 EXPECT_TRUE(program->DetectVaryingsMismatch()); 1292 std::string conflicting_name;
1293
1294 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name));
1295 EXPECT_EQ(conflicting_name, "a");
1287 EXPECT_TRUE(LinkAsExpected(program, false)); 1296 EXPECT_TRUE(LinkAsExpected(program, false));
1288 } 1297 }
1289 1298
1290 // If a varying has different precision in the vertex and fragment 1299 // If a varying has different precision in the vertex and fragment
1291 // shader, linking should succeed. 1300 // shader, linking should succeed.
1292 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { 1301 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) {
1293 const VarInfo kVertexVarying = 1302 const VarInfo kVertexVarying =
1294 { SH_FLOAT, 2, SH_PRECISION_HIGHP, 1, "a", kVarVarying }; 1303 { SH_FLOAT, 2, SH_PRECISION_HIGHP, 1, "a", kVarVarying };
1295 const VarInfo kFragmentVarying = 1304 const VarInfo kFragmentVarying =
1296 { SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; 1305 { SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying };
1297 Program* program = SetupShaderVariableTest( 1306 Program* program = SetupShaderVariableTest(
1298 &kVertexVarying, 1, &kFragmentVarying, 1); 1307 &kVertexVarying, 1, &kFragmentVarying, 1);
1299 1308
1300 EXPECT_FALSE(program->DetectVaryingsMismatch()); 1309 std::string conflicting_name;
1310
1311 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name));
1312 EXPECT_TRUE(conflicting_name.empty());
1301 EXPECT_TRUE(LinkAsExpected(program, true)); 1313 EXPECT_TRUE(LinkAsExpected(program, true));
1302 } 1314 }
1303 1315
1304 // If a varying is statically used in fragment shader but not 1316 // If a varying is statically used in fragment shader but not
1305 // declared in vertex shader, link should fail. 1317 // declared in vertex shader, link should fail.
1306 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { 1318 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) {
1307 const VarInfo kFragmentVarying = 1319 const VarInfo kFragmentVarying =
1308 { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; 1320 { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying };
1309 Program* program = SetupShaderVariableTest( 1321 Program* program = SetupShaderVariableTest(
1310 NULL, 0, &kFragmentVarying, 1); 1322 NULL, 0, &kFragmentVarying, 1);
1311 1323
1312 EXPECT_TRUE(program->DetectVaryingsMismatch()); 1324 std::string conflicting_name;
1325
1326 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name));
1327 EXPECT_EQ(conflicting_name, "a");
Ken Russell (switch to Gerrit) 2014/01/09 21:40:03 The constant should come first in these expression
1313 EXPECT_TRUE(LinkAsExpected(program, false)); 1328 EXPECT_TRUE(LinkAsExpected(program, false));
1314 } 1329 }
1315 1330
1316 // If a varying is declared but not statically used in fragment 1331 // If a varying is declared but not statically used in fragment
1317 // shader, even if it's not declared in vertex shader, link should 1332 // shader, even if it's not declared in vertex shader, link should
1318 // succeed. 1333 // succeed.
1319 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { 1334 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) {
1320 const VarInfo kFragmentVarying = 1335 const VarInfo kFragmentVarying =
1321 { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 0, "a", kVarVarying }; 1336 { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 0, "a", kVarVarying };
1322 Program* program = SetupShaderVariableTest( 1337 Program* program = SetupShaderVariableTest(
1323 NULL, 0, &kFragmentVarying, 1); 1338 NULL, 0, &kFragmentVarying, 1);
1324 1339
1325 EXPECT_FALSE(program->DetectVaryingsMismatch()); 1340 std::string conflicting_name;
1341
1342 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name));
1343 EXPECT_TRUE(conflicting_name.empty());
1326 EXPECT_TRUE(LinkAsExpected(program, true)); 1344 EXPECT_TRUE(LinkAsExpected(program, true));
1327 } 1345 }
1328 1346
1329 // Uniforms and attributes are both global variables, thus sharing 1347 // Uniforms and attributes are both global variables, thus sharing
1330 // the same namespace. Any name conflicts should cause link 1348 // the same namespace. Any name conflicts should cause link
1331 // failure. 1349 // failure.
1332 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { 1350 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) {
1333 const VarInfo kVertexAttribute = 1351 const VarInfo kVertexAttribute =
1334 { SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarAttribute }; 1352 { SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarAttribute };
1335 const VarInfo kFragmentUniform = 1353 const VarInfo kFragmentUniform =
1336 { SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarUniform }; 1354 { SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarUniform };
1337 Program* program = SetupShaderVariableTest( 1355 Program* program = SetupShaderVariableTest(
1338 &kVertexAttribute, 1, &kFragmentUniform, 1); 1356 &kVertexAttribute, 1, &kFragmentUniform, 1);
1339 1357
1340 EXPECT_TRUE(program->DetectGlobalNameConflicts()); 1358 std::string conflicting_name;
1359
1360 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name));
1361 EXPECT_EQ(conflicting_name, "a");
1341 EXPECT_TRUE(LinkAsExpected(program, false)); 1362 EXPECT_TRUE(LinkAsExpected(program, false));
1342 } 1363 }
1343 1364
1344 // Varyings go over 8 rows. 1365 // Varyings go over 8 rows.
1345 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { 1366 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) {
1346 const VarInfo kVertexVaryings[] = { 1367 const VarInfo kVertexVaryings[] = {
1347 { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }, 1368 { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying },
1348 { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b", kVarVarying } 1369 { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b", kVarVarying }
1349 }; 1370 };
1350 const VarInfo kFragmentVaryings[] = { 1371 const VarInfo kFragmentVaryings[] = {
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
1748 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_SUCCESS); 1769 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_SUCCESS);
1749 SetExpectationsForNotCachingProgram(); 1770 SetExpectationsForNotCachingProgram();
1750 SetExpectationsForProgramLoadSuccess(); 1771 SetExpectationsForProgramLoadSuccess();
1751 1772
1752 EXPECT_TRUE(program_->Link(NULL, NULL, NULL, NULL, 1773 EXPECT_TRUE(program_->Link(NULL, NULL, NULL, NULL,
1753 base::Bind(&ShaderCacheCb))); 1774 base::Bind(&ShaderCacheCb)));
1754 } 1775 }
1755 1776
1756 } // namespace gles2 1777 } // namespace gles2
1757 } // namespace gpu 1778 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/program_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698