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

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

Issue 10568003: Add support for GL_CHROMIUM_consistent_uniform_locations (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 6 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 | Annotate | Revision Log
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/test_helper.h" 5 #include "gpu/command_buffer/service/test_helper.h"
6 6
7 #include "base/string_number_conversions.h" 7 #include "base/string_number_conversions.h"
8 #include "base/string_tokenizer.h" 8 #include "base/string_tokenizer.h"
9 #include "gpu/command_buffer/common/gl_mock.h" 9 #include "gpu/command_buffer/common/gl_mock.h"
10 #include "gpu/command_buffer/common/types.h" 10 #include "gpu/command_buffer/common/types.h"
11 #include "gpu/command_buffer/service/gl_utils.h" 11 #include "gpu/command_buffer/service/gl_utils.h"
12 #include "gpu/command_buffer/service/program_manager.h" 12 #include "gpu/command_buffer/service/program_manager.h"
13 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
14 14
15 #include <algorithm>
15 #include <string.h> 16 #include <string.h>
16 17
17 using ::testing::_; 18 using ::testing::_;
18 using ::testing::DoAll; 19 using ::testing::DoAll;
19 using ::testing::InSequence; 20 using ::testing::InSequence;
20 using ::testing::MatcherCast; 21 using ::testing::MatcherCast;
21 using ::testing::Pointee; 22 using ::testing::Pointee;
22 using ::testing::Return; 23 using ::testing::Return;
23 using ::testing::SetArrayArgument; 24 using ::testing::SetArrayArgument;
24 using ::testing::SetArgumentPointee; 25 using ::testing::SetArgumentPointee;
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 .Times(1) 362 .Times(1)
362 .RetiresOnSaturation(); 363 .RetiresOnSaturation();
363 break; 364 break;
364 default: 365 default:
365 NOTREACHED(); 366 NOTREACHED();
366 break; 367 break;
367 } 368 }
368 } 369 }
369 } 370 }
370 371
372 namespace {
373
374 struct UniformInfoComparer {
375 bool operator()(const TestHelper::UniformInfo& lhs,
376 const TestHelper::UniformInfo& rhs) const {
377 return strcmp(lhs.name, rhs.name) < 0;
378 }
379 };
380
381 } // anonymous namespace.
382
371 void TestHelper::SetupShader( 383 void TestHelper::SetupShader(
372 ::gfx::MockGLInterface* gl, 384 ::gfx::MockGLInterface* gl,
373 AttribInfo* attribs, size_t num_attribs, 385 AttribInfo* attribs, size_t num_attribs,
374 UniformInfo* uniforms, size_t num_uniforms, 386 UniformInfo* uniforms, size_t num_uniforms,
375 GLuint service_id) { 387 GLuint service_id) {
376 InSequence s; 388 InSequence s;
377 389
378 EXPECT_CALL(*gl, 390 EXPECT_CALL(*gl,
379 LinkProgram(service_id)) 391 LinkProgram(service_id))
380 .Times(1) 392 .Times(1)
(...skipping 12 matching lines...) Expand all
393 .RetiresOnSaturation(); 405 .RetiresOnSaturation();
394 size_t max_attrib_len = 0; 406 size_t max_attrib_len = 0;
395 for (size_t ii = 0; ii < num_attribs; ++ii) { 407 for (size_t ii = 0; ii < num_attribs; ++ii) {
396 size_t len = strlen(attribs[ii].name) + 1; 408 size_t len = strlen(attribs[ii].name) + 1;
397 max_attrib_len = std::max(max_attrib_len, len); 409 max_attrib_len = std::max(max_attrib_len, len);
398 } 410 }
399 EXPECT_CALL(*gl, 411 EXPECT_CALL(*gl,
400 GetProgramiv(service_id, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, _)) 412 GetProgramiv(service_id, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, _))
401 .WillOnce(SetArgumentPointee<2>(max_attrib_len)) 413 .WillOnce(SetArgumentPointee<2>(max_attrib_len))
402 .RetiresOnSaturation(); 414 .RetiresOnSaturation();
415
403 for (size_t ii = 0; ii < num_attribs; ++ii) { 416 for (size_t ii = 0; ii < num_attribs; ++ii) {
404 const AttribInfo& info = attribs[ii]; 417 const AttribInfo& info = attribs[ii];
405 EXPECT_CALL(*gl, 418 EXPECT_CALL(*gl,
406 GetActiveAttrib(service_id, ii, 419 GetActiveAttrib(service_id, ii,
407 max_attrib_len, _, _, _, _)) 420 max_attrib_len, _, _, _, _))
408 .WillOnce(DoAll( 421 .WillOnce(DoAll(
409 SetArgumentPointee<3>(strlen(info.name)), 422 SetArgumentPointee<3>(strlen(info.name)),
410 SetArgumentPointee<4>(info.size), 423 SetArgumentPointee<4>(info.size),
411 SetArgumentPointee<5>(info.type), 424 SetArgumentPointee<5>(info.type),
412 SetArrayArgument<6>(info.name, 425 SetArrayArgument<6>(info.name,
413 info.name + strlen(info.name) + 1))) 426 info.name + strlen(info.name) + 1)))
414 .RetiresOnSaturation(); 427 .RetiresOnSaturation();
415 if (!ProgramManager::IsInvalidPrefix(info.name, strlen(info.name))) { 428 if (!ProgramManager::IsInvalidPrefix(info.name, strlen(info.name))) {
416 EXPECT_CALL(*gl, GetAttribLocation(service_id, StrEq(info.name))) 429 EXPECT_CALL(*gl, GetAttribLocation(service_id, StrEq(info.name)))
417 .WillOnce(Return(info.location)) 430 .WillOnce(Return(info.location))
418 .RetiresOnSaturation(); 431 .RetiresOnSaturation();
419 } 432 }
420 } 433 }
421 EXPECT_CALL(*gl, 434 EXPECT_CALL(*gl,
422 GetProgramiv(service_id, GL_ACTIVE_UNIFORMS, _)) 435 GetProgramiv(service_id, GL_ACTIVE_UNIFORMS, _))
423 .WillOnce(SetArgumentPointee<2>(num_uniforms)) 436 .WillOnce(SetArgumentPointee<2>(num_uniforms))
424 .RetiresOnSaturation(); 437 .RetiresOnSaturation();
438
439 scoped_array<UniformInfo> sorted_uniforms(new UniformInfo[num_uniforms]);
440 size_t num_valid_uniforms = 0;
441
425 size_t max_uniform_len = 0; 442 size_t max_uniform_len = 0;
426 for (size_t ii = 0; ii < num_uniforms; ++ii) { 443 for (size_t ii = 0; ii < num_uniforms; ++ii) {
427 size_t len = strlen(uniforms[ii].name) + 1; 444 size_t len = strlen(uniforms[ii].name) + 1;
428 max_uniform_len = std::max(max_uniform_len, len); 445 max_uniform_len = std::max(max_uniform_len, len);
429 } 446 }
430 EXPECT_CALL(*gl, 447 EXPECT_CALL(*gl,
431 GetProgramiv(service_id, GL_ACTIVE_UNIFORM_MAX_LENGTH, _)) 448 GetProgramiv(service_id, GL_ACTIVE_UNIFORM_MAX_LENGTH, _))
432 .WillOnce(SetArgumentPointee<2>(max_uniform_len)) 449 .WillOnce(SetArgumentPointee<2>(max_uniform_len))
433 .RetiresOnSaturation(); 450 .RetiresOnSaturation();
434 for (size_t ii = 0; ii < num_uniforms; ++ii) { 451 for (size_t ii = 0; ii < num_uniforms; ++ii) {
435 const UniformInfo& info = uniforms[ii]; 452 const UniformInfo& info = uniforms[ii];
436 EXPECT_CALL(*gl, 453 EXPECT_CALL(*gl,
437 GetActiveUniform(service_id, ii, 454 GetActiveUniform(service_id, ii,
438 max_uniform_len, _, _, _, _)) 455 max_uniform_len, _, _, _, _))
439 .WillOnce(DoAll( 456 .WillOnce(DoAll(
440 SetArgumentPointee<3>(strlen(info.name)), 457 SetArgumentPointee<3>(strlen(info.name)),
441 SetArgumentPointee<4>(info.size), 458 SetArgumentPointee<4>(info.size),
442 SetArgumentPointee<5>(info.type), 459 SetArgumentPointee<5>(info.type),
443 SetArrayArgument<6>(info.name, 460 SetArrayArgument<6>(info.name,
444 info.name + strlen(info.name) + 1))) 461 info.name + strlen(info.name) + 1)))
445 .RetiresOnSaturation(); 462 .RetiresOnSaturation();
446 if (!ProgramManager::IsInvalidPrefix(info.name, strlen(info.name))) { 463 if (!ProgramManager::IsInvalidPrefix(info.name, strlen(info.name))) {
447 EXPECT_CALL(*gl, GetUniformLocation(service_id, StrEq(info.name))) 464 sorted_uniforms[num_valid_uniforms++] = uniforms[ii];
448 .WillOnce(Return(info.real_location)) 465 }
449 .RetiresOnSaturation(); 466 }
450 if (info.size > 1) { 467
451 std::string base_name = info.name; 468 std::sort(
452 size_t array_pos = base_name.rfind("[0]"); 469 &sorted_uniforms[0], &sorted_uniforms[num_valid_uniforms],
453 if (base_name.size() > 3 && array_pos == base_name.size() - 3) { 470 UniformInfoComparer());
454 base_name = base_name.substr(0, base_name.size() - 3); 471
455 } 472 for (size_t ii = 0; ii < num_valid_uniforms; ++ii) {
456 for (GLsizei jj = 1; jj < info.size; ++jj) { 473 const UniformInfo& info = sorted_uniforms[ii];
457 std::string element_name( 474 EXPECT_CALL(*gl, GetUniformLocation(service_id, StrEq(info.name)))
458 std::string(base_name) + "[" + base::IntToString(jj) + "]"); 475 .WillOnce(Return(info.real_location))
459 EXPECT_CALL(*gl, GetUniformLocation(service_id, StrEq(element_name))) 476 .RetiresOnSaturation();
460 .WillOnce(Return(info.real_location + jj * 2)) 477 if (info.size > 1) {
461 .RetiresOnSaturation(); 478 std::string base_name = info.name;
462 } 479 size_t array_pos = base_name.rfind("[0]");
480 if (base_name.size() > 3 && array_pos == base_name.size() - 3) {
481 base_name = base_name.substr(0, base_name.size() - 3);
482 }
483 for (GLsizei jj = 1; jj < info.size; ++jj) {
484 std::string element_name(
485 std::string(base_name) + "[" + base::IntToString(jj) + "]");
486 EXPECT_CALL(*gl, GetUniformLocation(service_id, StrEq(element_name)))
487 .WillOnce(Return(info.real_location + jj * 2))
488 .RetiresOnSaturation();
463 } 489 }
464 } 490 }
465 } 491 }
466 } 492 }
467 493
468
469 } // namespace gles2 494 } // namespace gles2
470 } // namespace gpu 495 } // namespace gpu
471 496
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698