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

Side by Side 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: Created 5 years, 3 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
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/command_line.h" 9 #include "base/command_line.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/strings/string_number_conversions.h" 11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
13 13
14 #include "gpu/command_buffer/common/gles2_cmd_format.h" 14 #include "gpu/command_buffer/common/gles2_cmd_format.h"
15 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 15 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
16 #include "gpu/command_buffer/service/common_decoder.h" 16 #include "gpu/command_buffer/service/common_decoder.h"
17 #include "gpu/command_buffer/service/feature_info.h" 17 #include "gpu/command_buffer/service/feature_info.h"
18 #include "gpu/command_buffer/service/gpu_service_test.h" 18 #include "gpu/command_buffer/service/gpu_service_test.h"
19 #include "gpu/command_buffer/service/gpu_switches.h" 19 #include "gpu/command_buffer/service/gpu_switches.h"
20 #include "gpu/command_buffer/service/mocks.h" 20 #include "gpu/command_buffer/service/mocks.h"
21 #include "gpu/command_buffer/service/shader_manager.h" 21 #include "gpu/command_buffer/service/shader_manager.h"
22 #include "gpu/command_buffer/service/test_helper.h" 22 #include "gpu/command_buffer/service/test_helper.h"
23 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
24 #include "ui/gl/gl_mock.h" 24 #include "ui/gl/gl_mock.h"
25 #include "ui/gl/gl_version_info.h"
25 26
26 using ::testing::_; 27 using ::testing::_;
27 using ::testing::DoAll; 28 using ::testing::DoAll;
28 using ::testing::InSequence; 29 using ::testing::InSequence;
29 using ::testing::MatcherCast; 30 using ::testing::MatcherCast;
30 using ::testing::Pointee; 31 using ::testing::Pointee;
31 using ::testing::Return; 32 using ::testing::Return;
32 using ::testing::ReturnRef; 33 using ::testing::ReturnRef;
33 using ::testing::SetArrayArgument; 34 using ::testing::SetArrayArgument;
34 using ::testing::SetArgPointee; 35 using ::testing::SetArgPointee;
35 using ::testing::StrEq; 36 using ::testing::StrEq;
36 37
37 namespace gpu { 38 namespace gpu {
38 namespace gles2 { 39 namespace gles2 {
39 40
40 namespace { 41 namespace {
41 const uint32 kMaxVaryingVectors = 8; 42 const uint32 kMaxVaryingVectors = 8;
43 const uint32 kMaxDrawBuffers = 8;
44 const uint32 kMaxDualSourceDrawBuffers = 8;
42 45
43 void ShaderCacheCb(const std::string& key, const std::string& shader) {} 46 void ShaderCacheCb(const std::string& key, const std::string& shader) {}
44 47
45 uint32 ComputeOffset(const void* start, const void* position) { 48 uint32 ComputeOffset(const void* start, const void* position) {
46 return static_cast<const uint8*>(position) - 49 return static_cast<const uint8*>(position) -
47 static_cast<const uint8*>(start); 50 static_cast<const uint8*>(start);
48 } 51 }
49 52
50 } // namespace anonymous 53 } // namespace anonymous
51 54
52 class ProgramManagerTestBase : public GpuServiceTest { 55 class ProgramManagerTestBase : public GpuServiceTest {
53 protected: 56 protected:
54 virtual void SetupProgramManager() { 57 virtual void SetupProgramManager() {
55 manager_.reset( 58 manager_.reset(new ProgramManager(nullptr, kMaxVaryingVectors,
56 new ProgramManager(NULL, kMaxVaryingVectors, feature_info_.get())); 59 kMaxDualSourceDrawBuffers,
60 feature_info_.get()));
57 } 61 }
58 void SetUpBase(const char* gl_version, 62 void SetUpBase(const char* gl_version,
59 const char* gl_extensions, 63 const char* gl_extensions,
60 FeatureInfo* feature_info = NULL) { 64 FeatureInfo* feature_info = NULL) {
61 GpuServiceTest::SetUpWithGLVersion(gl_version, gl_extensions); 65 GpuServiceTest::SetUpWithGLVersion(gl_version, gl_extensions);
62 TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( 66 TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
63 gl_.get(), gl_extensions, "", gl_version); 67 gl_.get(), gl_extensions, "", gl_version);
64 if (!feature_info) { 68 if (!feature_info) {
65 feature_info = new FeatureInfo(); 69 feature_info = new FeatureInfo();
66 } 70 }
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 static const GLint kUniform3RealLocation = 33; 214 static const GLint kUniform3RealLocation = 33;
211 static const GLint kUniform1DesiredLocation = -1; 215 static const GLint kUniform1DesiredLocation = -1;
212 static const GLint kUniform2DesiredLocation = -1; 216 static const GLint kUniform2DesiredLocation = -1;
213 static const GLint kUniform3DesiredLocation = -1; 217 static const GLint kUniform3DesiredLocation = -1;
214 static const GLenum kUniform1Type = GL_FLOAT_VEC4; 218 static const GLenum kUniform1Type = GL_FLOAT_VEC4;
215 static const GLenum kUniform2Type = GL_INT_VEC2; 219 static const GLenum kUniform2Type = GL_INT_VEC2;
216 static const GLenum kUniform3Type = GL_FLOAT_VEC3; 220 static const GLenum kUniform3Type = GL_FLOAT_VEC3;
217 static const GLint kInvalidUniformLocation = 30; 221 static const GLint kInvalidUniformLocation = 30;
218 static const GLint kBadUniformIndex = 1000; 222 static const GLint kBadUniformIndex = 1000;
219 223
224 static const char* kOutputVariable1Name;
225 static const GLint kOutputVariable1Size = 1;
226 static const GLenum kOutputVariable1Precision = GL_MEDIUM_FLOAT;
227 static const bool kOutputVariable1StaticUse = true;
228 static const GLint kOutputVariable1Location = -1;
229 static const GLenum kOutputVariable1Type = GL_FLOAT_VEC4;
230
220 static const size_t kNumAttribs; 231 static const size_t kNumAttribs;
221 static const size_t kNumUniforms; 232 static const size_t kNumUniforms;
222 233
223 protected: 234 protected:
224 typedef TestHelper::AttribInfo AttribInfo; 235 typedef TestHelper::AttribInfo AttribInfo;
225 typedef TestHelper::UniformInfo UniformInfo; 236 typedef TestHelper::UniformInfo UniformInfo;
226 237
227 typedef enum { 238 typedef enum {
228 kVarUniform, 239 kVarUniform,
229 kVarVarying, 240 kVarVarying,
230 kVarAttribute 241 kVarAttribute,
242 kVarOutput,
231 } VarCategory; 243 } VarCategory;
232 244
233 typedef struct { 245 typedef struct {
234 GLenum type; 246 GLenum type;
235 GLint size; 247 GLint size;
236 GLenum precision; 248 GLenum precision;
237 bool static_use; 249 bool static_use;
238 std::string name; 250 std::string name;
239 VarCategory category; 251 VarCategory category;
240 } VarInfo; 252 } VarInfo;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 SetupShaderExpectations(kAttribs, kNumAttribs, kUniforms, kNumUniforms, 306 SetupShaderExpectations(kAttribs, kNumAttribs, kUniforms, kNumUniforms,
295 service_id); 307 service_id);
296 } 308 }
297 program->Link(NULL, Program::kCountOnlyStaticallyUsed, 309 program->Link(NULL, Program::kCountOnlyStaticallyUsed,
298 base::Bind(&ShaderCacheCb)); 310 base::Bind(&ShaderCacheCb));
299 GLint link_status; 311 GLint link_status;
300 program->GetProgramiv(GL_LINK_STATUS, &link_status); 312 program->GetProgramiv(GL_LINK_STATUS, &link_status);
301 return (static_cast<bool>(link_status) == expected_link_status); 313 return (static_cast<bool>(link_status) == expected_link_status);
302 } 314 }
303 315
304 Program* SetupShaderVariableTest(const VarInfo* vertex_variables, 316 Program* SetupProgramForVariables(const VarInfo* vertex_variables,
305 size_t vertex_variable_size, 317 size_t vertex_variable_size,
306 const VarInfo* fragment_variables, 318 const VarInfo* fragment_variables,
307 size_t fragment_variable_size) { 319 size_t fragment_variable_size,
320 const int* const shader_version = nullptr) {
308 // Set up shader 321 // Set up shader
309 AttributeMap vertex_attrib_map; 322 AttributeMap vertex_attrib_map;
310 UniformMap vertex_uniform_map; 323 UniformMap vertex_uniform_map;
311 VaryingMap vertex_varying_map; 324 VaryingMap vertex_varying_map;
325 AttributeList vertex_output_variable_list;
312 for (size_t ii = 0; ii < vertex_variable_size; ++ii) { 326 for (size_t ii = 0; ii < vertex_variable_size; ++ii) {
313 switch (vertex_variables[ii].category) { 327 switch (vertex_variables[ii].category) {
314 case kVarAttribute: 328 case kVarAttribute:
315 vertex_attrib_map[vertex_variables[ii].name] = 329 vertex_attrib_map[vertex_variables[ii].name] =
316 TestHelper::ConstructAttribute( 330 TestHelper::ConstructAttribute(
317 vertex_variables[ii].type, 331 vertex_variables[ii].type,
318 vertex_variables[ii].size, 332 vertex_variables[ii].size,
319 vertex_variables[ii].precision, 333 vertex_variables[ii].precision,
320 vertex_variables[ii].static_use, 334 vertex_variables[ii].static_use,
321 vertex_variables[ii].name); 335 vertex_variables[ii].name);
322 break; 336 break;
323 case kVarUniform: 337 case kVarUniform:
324 vertex_uniform_map[vertex_variables[ii].name] = 338 vertex_uniform_map[vertex_variables[ii].name] =
325 TestHelper::ConstructUniform( 339 TestHelper::ConstructUniform(
326 vertex_variables[ii].type, 340 vertex_variables[ii].type,
327 vertex_variables[ii].size, 341 vertex_variables[ii].size,
328 vertex_variables[ii].precision, 342 vertex_variables[ii].precision,
329 vertex_variables[ii].static_use, 343 vertex_variables[ii].static_use,
330 vertex_variables[ii].name); 344 vertex_variables[ii].name);
331 break; 345 break;
332 case kVarVarying: 346 case kVarVarying:
333 vertex_varying_map[vertex_variables[ii].name] = 347 vertex_varying_map[vertex_variables[ii].name] =
334 TestHelper::ConstructVarying( 348 TestHelper::ConstructVarying(
335 vertex_variables[ii].type, 349 vertex_variables[ii].type,
336 vertex_variables[ii].size, 350 vertex_variables[ii].size,
337 vertex_variables[ii].precision, 351 vertex_variables[ii].precision,
338 vertex_variables[ii].static_use, 352 vertex_variables[ii].static_use,
339 vertex_variables[ii].name); 353 vertex_variables[ii].name);
340 break; 354 break;
355 case kVarOutput:
356 vertex_output_variable_list.push_back(TestHelper::ConstructAttribute(
357 vertex_variables[ii].type, vertex_variables[ii].size,
358 vertex_variables[ii].precision, vertex_variables[ii].static_use,
359 vertex_variables[ii].name));
360 break;
341 default: 361 default:
342 NOTREACHED(); 362 NOTREACHED();
343 } 363 }
344 } 364 }
345 365
346 AttributeMap frag_attrib_map; 366 AttributeMap frag_attrib_map;
347 UniformMap frag_uniform_map; 367 UniformMap frag_uniform_map;
348 VaryingMap frag_varying_map; 368 VaryingMap frag_varying_map;
369 AttributeList frag_output_variable_list;
349 for (size_t ii = 0; ii < fragment_variable_size; ++ii) { 370 for (size_t ii = 0; ii < fragment_variable_size; ++ii) {
350 switch (fragment_variables[ii].category) { 371 switch (fragment_variables[ii].category) {
351 case kVarAttribute: 372 case kVarAttribute:
352 frag_attrib_map[fragment_variables[ii].name] = 373 frag_attrib_map[fragment_variables[ii].name] =
353 TestHelper::ConstructAttribute( 374 TestHelper::ConstructAttribute(
354 fragment_variables[ii].type, 375 fragment_variables[ii].type,
355 fragment_variables[ii].size, 376 fragment_variables[ii].size,
356 fragment_variables[ii].precision, 377 fragment_variables[ii].precision,
357 fragment_variables[ii].static_use, 378 fragment_variables[ii].static_use,
358 fragment_variables[ii].name); 379 fragment_variables[ii].name);
359 break; 380 break;
360 case kVarUniform: 381 case kVarUniform:
361 frag_uniform_map[fragment_variables[ii].name] = 382 frag_uniform_map[fragment_variables[ii].name] =
362 TestHelper::ConstructUniform( 383 TestHelper::ConstructUniform(
363 fragment_variables[ii].type, 384 fragment_variables[ii].type,
364 fragment_variables[ii].size, 385 fragment_variables[ii].size,
365 fragment_variables[ii].precision, 386 fragment_variables[ii].precision,
366 fragment_variables[ii].static_use, 387 fragment_variables[ii].static_use,
367 fragment_variables[ii].name); 388 fragment_variables[ii].name);
368 break; 389 break;
369 case kVarVarying: 390 case kVarVarying:
370 frag_varying_map[fragment_variables[ii].name] = 391 frag_varying_map[fragment_variables[ii].name] =
371 TestHelper::ConstructVarying( 392 TestHelper::ConstructVarying(
372 fragment_variables[ii].type, 393 fragment_variables[ii].type,
373 fragment_variables[ii].size, 394 fragment_variables[ii].size,
374 fragment_variables[ii].precision, 395 fragment_variables[ii].precision,
375 fragment_variables[ii].static_use, 396 fragment_variables[ii].static_use,
376 fragment_variables[ii].name); 397 fragment_variables[ii].name);
377 break; 398 break;
399 case kVarOutput:
400 frag_output_variable_list.push_back(TestHelper::ConstructAttribute(
401 fragment_variables[ii].type, fragment_variables[ii].size,
402 fragment_variables[ii].precision,
403 fragment_variables[ii].static_use, fragment_variables[ii].name));
404 break;
378 default: 405 default:
379 NOTREACHED(); 406 NOTREACHED();
380 } 407 }
381 } 408 }
382 409
383 // Check we can create shader. 410 // Check we can create shader.
384 Shader* vshader = shader_manager_.CreateShader( 411 Shader* vshader = shader_manager_.CreateShader(
385 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 412 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
386 Shader* fshader = shader_manager_.CreateShader( 413 Shader* fshader = shader_manager_.CreateShader(
387 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); 414 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
388 // Check shader got created. 415 // Check shader got created.
389 EXPECT_TRUE(vshader != NULL && fshader != NULL); 416 EXPECT_TRUE(vshader != NULL && fshader != NULL);
390 // Set Status 417 // Set Status
391 TestHelper::SetShaderStates( 418 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
392 gl_.get(), vshader, true, NULL, NULL, NULL, 419 shader_version, &vertex_attrib_map,
393 &vertex_attrib_map, &vertex_uniform_map, &vertex_varying_map, NULL); 420 &vertex_uniform_map, &vertex_varying_map,
394 TestHelper::SetShaderStates( 421 &vertex_output_variable_list, nullptr);
395 gl_.get(), fshader, true, NULL, NULL, NULL, 422 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
396 &frag_attrib_map, &frag_uniform_map, &frag_varying_map, NULL); 423 shader_version, &frag_attrib_map,
424 &frag_uniform_map, &frag_varying_map,
425 &frag_output_variable_list, nullptr);
397 426
398 // Set up program 427 // Set up program
399 Program* program = 428 Program* program =
400 manager_->CreateProgram(kClientProgramId, kServiceProgramId); 429 manager_->CreateProgram(kClientProgramId, kServiceProgramId);
401 EXPECT_TRUE(program != NULL); 430 EXPECT_TRUE(program != NULL);
402 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 431 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
403 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 432 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
404 return program; 433 return program;
405 } 434 }
406 435
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1"; 526 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1";
498 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2"; 527 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2";
499 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3"; 528 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3";
500 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1"; 529 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1";
501 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2"; 530 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2";
502 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex = 531 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex =
503 "uniform2[0]"; 532 "uniform2[0]";
504 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3"; 533 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3";
505 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex = 534 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex =
506 "uniform3[0]"; 535 "uniform3[0]";
536 const char* ProgramManagerWithShaderTest::kOutputVariable1Name = "outputVar1";
507 537
508 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) { 538 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) {
509 const Program* program = SetupDefaultProgram(); 539 const Program* program = SetupDefaultProgram();
510 ASSERT_TRUE(program != NULL); 540 ASSERT_TRUE(program != NULL);
511 const Program::AttribInfoVector& infos = 541 const Program::AttribInfoVector& infos =
512 program->GetAttribInfos(); 542 program->GetAttribInfos();
513 ASSERT_EQ(kNumAttribs, infos.size()); 543 ASSERT_EQ(kNumAttribs, infos.size());
514 for (size_t ii = 0; ii < kNumAttribs; ++ii) { 544 for (size_t ii = 0; ii < kNumAttribs; ++ii) {
515 const Program::VertexAttrib& info = infos[ii]; 545 const Program::VertexAttrib& info = infos[ii];
516 const AttribInfo& expected = kAttribs[ii]; 546 const AttribInfo& expected = kAttribs[ii];
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 // Some GL drivers incorrectly return the wrong type. For example they return 830 // Some GL drivers incorrectly return the wrong type. For example they return
801 // GL_FLOAT_VEC2 when they should return GL_FLOAT_MAT2. Check we handle this. 831 // GL_FLOAT_VEC2 when they should return GL_FLOAT_MAT2. Check we handle this.
802 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) { 832 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) {
803 static GLenum kAttrib2BadType = GL_FLOAT_VEC2; 833 static GLenum kAttrib2BadType = GL_FLOAT_VEC2;
804 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2; 834 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2;
805 static GLenum kUniform2BadType = GL_FLOAT_VEC3; 835 static GLenum kUniform2BadType = GL_FLOAT_VEC3;
806 static GLenum kUniform2GoodType = GL_FLOAT_MAT3; 836 static GLenum kUniform2GoodType = GL_FLOAT_MAT3;
807 AttributeMap attrib_map; 837 AttributeMap attrib_map;
808 UniformMap uniform_map; 838 UniformMap uniform_map;
809 VaryingMap varying_map; 839 VaryingMap varying_map;
840 AttributeList output_variable_list;
810 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute( 841 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute(
811 kAttrib1Type, kAttrib1Size, kAttrib1Precision, 842 kAttrib1Type, kAttrib1Size, kAttrib1Precision,
812 kAttribStaticUse, kAttrib1Name); 843 kAttribStaticUse, kAttrib1Name);
813 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute( 844 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute(
814 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision, 845 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision,
815 kAttribStaticUse, kAttrib2Name); 846 kAttribStaticUse, kAttrib2Name);
816 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute( 847 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute(
817 kAttrib3Type, kAttrib3Size, kAttrib3Precision, 848 kAttrib3Type, kAttrib3Size, kAttrib3Precision,
818 kAttribStaticUse, kAttrib3Name); 849 kAttribStaticUse, kAttrib3Name);
819 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( 850 uniform_map[kUniform1Name] = TestHelper::ConstructUniform(
820 kUniform1Type, kUniform1Size, kUniform1Precision, 851 kUniform1Type, kUniform1Size, kUniform1Precision,
821 kUniform1StaticUse, kUniform1Name); 852 kUniform1StaticUse, kUniform1Name);
822 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( 853 uniform_map[kUniform2Name] = TestHelper::ConstructUniform(
823 kUniform2GoodType, kUniform2Size, kUniform2Precision, 854 kUniform2GoodType, kUniform2Size, kUniform2Precision,
824 kUniform2StaticUse, kUniform2Name); 855 kUniform2StaticUse, kUniform2Name);
825 uniform_map[kUniform3Name] = TestHelper::ConstructUniform( 856 uniform_map[kUniform3Name] = TestHelper::ConstructUniform(
826 kUniform3Type, kUniform3Size, kUniform3Precision, 857 kUniform3Type, kUniform3Size, kUniform3Precision,
827 kUniform3StaticUse, kUniform3Name); 858 kUniform3StaticUse, kUniform3Name);
859 output_variable_list.push_back(TestHelper::ConstructAttribute(
860 kOutputVariable1Type, kOutputVariable1Size, kOutputVariable1Precision,
861 kOutputVariable1StaticUse, kOutputVariable1Name));
862
828 Shader* vshader = shader_manager_.CreateShader( 863 Shader* vshader = shader_manager_.CreateShader(
829 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 864 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
830 ASSERT_TRUE(vshader != NULL); 865 ASSERT_TRUE(vshader != NULL);
831 TestHelper::SetShaderStates( 866 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
832 gl_.get(), vshader, true, NULL, NULL, NULL, 867 nullptr, &attrib_map, &uniform_map, &varying_map,
833 &attrib_map, &uniform_map, &varying_map, NULL); 868 &output_variable_list, nullptr);
834 Shader* fshader = shader_manager_.CreateShader( 869 Shader* fshader = shader_manager_.CreateShader(
835 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); 870 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
836 ASSERT_TRUE(fshader != NULL); 871 ASSERT_TRUE(fshader != NULL);
837 TestHelper::SetShaderStates( 872 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
838 gl_.get(), fshader, true, NULL, NULL, NULL, 873 nullptr, &attrib_map, &uniform_map, &varying_map,
839 &attrib_map, &uniform_map, &varying_map, NULL); 874 &output_variable_list, nullptr);
840 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = { 875 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = {
841 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, 876 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
842 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, }, 877 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, },
843 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, 878 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
844 }; 879 };
845 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = { 880 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = {
846 { kUniform1Name, 881 { kUniform1Name,
847 kUniform1Size, 882 kUniform1Size,
848 kUniform1Type, 883 kUniform1Type,
849 kUniform1FakeLocation, 884 kUniform1FakeLocation,
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 kAttribStaticUse, 1503 kAttribStaticUse,
1469 kAttribMatName); 1504 kAttribMatName);
1470 // Check we can create shader. 1505 // Check we can create shader.
1471 Shader* vshader = shader_manager_.CreateShader( 1506 Shader* vshader = shader_manager_.CreateShader(
1472 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 1507 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
1473 Shader* fshader = shader_manager_.CreateShader( 1508 Shader* fshader = shader_manager_.CreateShader(
1474 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); 1509 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
1475 // Check shader got created. 1510 // Check shader got created.
1476 ASSERT_TRUE(vshader != NULL && fshader != NULL); 1511 ASSERT_TRUE(vshader != NULL && fshader != NULL);
1477 // Set Status 1512 // Set Status
1478 TestHelper::SetShaderStates( 1513 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
1479 gl_.get(), vshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, 1514 nullptr, &attrib_map, nullptr, nullptr, nullptr,
1480 NULL); 1515 nullptr);
1481 // Check attrib infos got copied. 1516 // Check attrib infos got copied.
1482 for (AttributeMap::const_iterator it = attrib_map.begin(); 1517 for (AttributeMap::const_iterator it = attrib_map.begin();
1483 it != attrib_map.end(); ++it) { 1518 it != attrib_map.end(); ++it) {
1484 const sh::Attribute* variable_info = 1519 const sh::Attribute* variable_info =
1485 vshader->GetAttribInfo(it->first); 1520 vshader->GetAttribInfo(it->first);
1486 ASSERT_TRUE(variable_info != NULL); 1521 ASSERT_TRUE(variable_info != NULL);
1487 EXPECT_EQ(it->second.type, variable_info->type); 1522 EXPECT_EQ(it->second.type, variable_info->type);
1488 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); 1523 EXPECT_EQ(it->second.arraySize, variable_info->arraySize);
1489 EXPECT_EQ(it->second.precision, variable_info->precision); 1524 EXPECT_EQ(it->second.precision, variable_info->precision);
1490 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); 1525 EXPECT_EQ(it->second.staticUse, variable_info->staticUse);
1491 EXPECT_EQ(it->second.name, variable_info->name); 1526 EXPECT_EQ(it->second.name, variable_info->name);
1492 } 1527 }
1493 TestHelper::SetShaderStates( 1528 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
1494 gl_.get(), fshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, 1529 nullptr, &attrib_map, nullptr, nullptr, nullptr,
1495 NULL); 1530 nullptr);
1496 1531
1497 // Set up program 1532 // Set up program
1498 Program* program = 1533 Program* program =
1499 manager_->CreateProgram(kClientProgramId, kServiceProgramId); 1534 manager_->CreateProgram(kClientProgramId, kServiceProgramId);
1500 ASSERT_TRUE(program != NULL); 1535 ASSERT_TRUE(program != NULL);
1501 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 1536 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
1502 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 1537 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
1503 1538
1504 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts()); 1539 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts());
1505 EXPECT_TRUE(LinkAsExpected(program, true)); 1540 EXPECT_TRUE(LinkAsExpected(program, true));
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1552 GL_FLOAT, 3, GL_LOW_FLOAT, true, "a"); 1587 GL_FLOAT, 3, GL_LOW_FLOAT, true, "a");
1553 1588
1554 // Check we can create shader. 1589 // Check we can create shader.
1555 Shader* vshader = shader_manager_.CreateShader( 1590 Shader* vshader = shader_manager_.CreateShader(
1556 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 1591 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
1557 Shader* fshader = shader_manager_.CreateShader( 1592 Shader* fshader = shader_manager_.CreateShader(
1558 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); 1593 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
1559 // Check shader got created. 1594 // Check shader got created.
1560 ASSERT_TRUE(vshader != NULL && fshader != NULL); 1595 ASSERT_TRUE(vshader != NULL && fshader != NULL);
1561 // Set Status 1596 // Set Status
1562 TestHelper::SetShaderStates( 1597 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
1563 gl_.get(), vshader, true, NULL, NULL, NULL, NULL, 1598 nullptr, nullptr, &vertex_uniform_map, nullptr,
1564 &vertex_uniform_map, NULL, NULL); 1599 nullptr, nullptr);
1565 TestHelper::SetShaderStates( 1600 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
1566 gl_.get(), fshader, true, NULL, NULL, NULL, NULL, 1601 nullptr, nullptr, &frag_uniform_map, nullptr,
1567 &frag_uniform_map, NULL, NULL); 1602 nullptr, nullptr);
1568 1603
1569 // Set up program 1604 // Set up program
1570 Program* program = 1605 Program* program =
1571 manager_->CreateProgram(kClientProgramId, kServiceProgramId); 1606 manager_->CreateProgram(kClientProgramId, kServiceProgramId);
1572 ASSERT_TRUE(program != NULL); 1607 ASSERT_TRUE(program != NULL);
1573 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 1608 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
1574 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 1609 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
1575 1610
1576 std::string conflicting_name; 1611 std::string conflicting_name;
1577 1612
1578 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name)); 1613 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name));
1579 EXPECT_EQ("a", conflicting_name); 1614 EXPECT_EQ("a", conflicting_name);
1580 EXPECT_TRUE(LinkAsExpected(program, false)); 1615 EXPECT_TRUE(LinkAsExpected(program, false));
1581 } 1616 }
1582 1617
1583 // If a varying has different type in the vertex and fragment 1618 // If a varying has different type in the vertex and fragment
1584 // shader, linking should fail. 1619 // shader, linking should fail.
1585 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { 1620 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) {
1586 const VarInfo kVertexVarying = 1621 const VarInfo kVertexVarying =
1587 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1622 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1588 const VarInfo kFragmentVarying = 1623 const VarInfo kFragmentVarying =
1589 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1624 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1590 Program* program = SetupShaderVariableTest( 1625 Program* program =
1591 &kVertexVarying, 1, &kFragmentVarying, 1); 1626 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1);
1592 1627
1593 std::string conflicting_name; 1628 std::string conflicting_name;
1594 1629
1595 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); 1630 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name));
1596 EXPECT_EQ("a", conflicting_name); 1631 EXPECT_EQ("a", conflicting_name);
1597 EXPECT_TRUE(LinkAsExpected(program, false)); 1632 EXPECT_TRUE(LinkAsExpected(program, false));
1598 } 1633 }
1599 1634
1600 // If a varying has different array size in the vertex and fragment 1635 // If a varying has different array size in the vertex and fragment
1601 // shader, linking should fail. 1636 // shader, linking should fail.
1602 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { 1637 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) {
1603 const VarInfo kVertexVarying = 1638 const VarInfo kVertexVarying =
1604 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1639 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1605 const VarInfo kFragmentVarying = 1640 const VarInfo kFragmentVarying =
1606 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1641 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1607 Program* program = SetupShaderVariableTest( 1642 Program* program =
1608 &kVertexVarying, 1, &kFragmentVarying, 1); 1643 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1);
1609 1644
1610 std::string conflicting_name; 1645 std::string conflicting_name;
1611 1646
1612 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); 1647 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name));
1613 EXPECT_EQ("a", conflicting_name); 1648 EXPECT_EQ("a", conflicting_name);
1614 EXPECT_TRUE(LinkAsExpected(program, false)); 1649 EXPECT_TRUE(LinkAsExpected(program, false));
1615 } 1650 }
1616 1651
1617 // If a varying has different precision in the vertex and fragment 1652 // If a varying has different precision in the vertex and fragment
1618 // shader, linking should succeed. 1653 // shader, linking should succeed.
1619 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { 1654 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) {
1620 const VarInfo kVertexVarying = 1655 const VarInfo kVertexVarying =
1621 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying }; 1656 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying };
1622 const VarInfo kFragmentVarying = 1657 const VarInfo kFragmentVarying =
1623 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1658 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1624 Program* program = SetupShaderVariableTest( 1659 Program* program =
1625 &kVertexVarying, 1, &kFragmentVarying, 1); 1660 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1);
1626 1661
1627 std::string conflicting_name; 1662 std::string conflicting_name;
1628 1663
1629 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); 1664 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name));
1630 EXPECT_TRUE(conflicting_name.empty()); 1665 EXPECT_TRUE(conflicting_name.empty());
1631 EXPECT_TRUE(LinkAsExpected(program, true)); 1666 EXPECT_TRUE(LinkAsExpected(program, true));
1632 } 1667 }
1633 1668
1634 // If a varying is statically used in fragment shader but not 1669 // If a varying is statically used in fragment shader but not
1635 // declared in vertex shader, link should fail. 1670 // declared in vertex shader, link should fail.
1636 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { 1671 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) {
1637 const VarInfo kFragmentVarying = 1672 const VarInfo kFragmentVarying =
1638 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1673 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1639 Program* program = SetupShaderVariableTest( 1674 Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1);
1640 NULL, 0, &kFragmentVarying, 1);
1641 1675
1642 std::string conflicting_name; 1676 std::string conflicting_name;
1643 1677
1644 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); 1678 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name));
1645 EXPECT_EQ("a", conflicting_name); 1679 EXPECT_EQ("a", conflicting_name);
1646 EXPECT_TRUE(LinkAsExpected(program, false)); 1680 EXPECT_TRUE(LinkAsExpected(program, false));
1647 } 1681 }
1648 1682
1649 // If a varying is declared but not statically used in fragment 1683 // If a varying is declared but not statically used in fragment
1650 // shader, even if it's not declared in vertex shader, link should 1684 // shader, even if it's not declared in vertex shader, link should
1651 // succeed. 1685 // succeed.
1652 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { 1686 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) {
1653 const VarInfo kFragmentVarying = 1687 const VarInfo kFragmentVarying =
1654 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying }; 1688 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying };
1655 Program* program = SetupShaderVariableTest( 1689 Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1);
1656 NULL, 0, &kFragmentVarying, 1);
1657 1690
1658 std::string conflicting_name; 1691 std::string conflicting_name;
1659 1692
1660 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); 1693 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name));
1661 EXPECT_TRUE(conflicting_name.empty()); 1694 EXPECT_TRUE(conflicting_name.empty());
1662 EXPECT_TRUE(LinkAsExpected(program, true)); 1695 EXPECT_TRUE(LinkAsExpected(program, true));
1663 } 1696 }
1664 1697
1665 // Uniforms and attributes are both global variables, thus sharing 1698 // Uniforms and attributes are both global variables, thus sharing
1666 // the same namespace. Any name conflicts should cause link 1699 // the same namespace. Any name conflicts should cause link
1667 // failure. 1700 // failure.
1668 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { 1701 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) {
1669 const VarInfo kVertexAttribute = 1702 const VarInfo kVertexAttribute =
1670 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute }; 1703 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute };
1671 const VarInfo kFragmentUniform = 1704 const VarInfo kFragmentUniform =
1672 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform }; 1705 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform };
1673 Program* program = SetupShaderVariableTest( 1706 Program* program =
1674 &kVertexAttribute, 1, &kFragmentUniform, 1); 1707 SetupProgramForVariables(&kVertexAttribute, 1, &kFragmentUniform, 1);
1675 1708
1676 std::string conflicting_name; 1709 std::string conflicting_name;
1677 1710
1678 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); 1711 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name));
1679 EXPECT_EQ("a", conflicting_name); 1712 EXPECT_EQ("a", conflicting_name);
1680 EXPECT_TRUE(LinkAsExpected(program, false)); 1713 EXPECT_TRUE(LinkAsExpected(program, false));
1681 } 1714 }
1682 1715
1683 // Varyings go over 8 rows. 1716 // Varyings go over 8 rows.
1684 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { 1717 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) {
1685 const VarInfo kVertexVaryings[] = { 1718 const VarInfo kVertexVaryings[] = {
1686 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, 1719 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying },
1687 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1720 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1688 }; 1721 };
1689 const VarInfo kFragmentVaryings[] = { 1722 const VarInfo kFragmentVaryings[] = {
1690 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, 1723 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying },
1691 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1724 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1692 }; 1725 };
1693 Program* program = SetupShaderVariableTest( 1726 Program* program =
1694 kVertexVaryings, 2, kFragmentVaryings, 2); 1727 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2);
1695 1728
1696 EXPECT_FALSE( 1729 EXPECT_FALSE(
1697 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); 1730 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed));
1698 EXPECT_TRUE(LinkAsExpected(program, false)); 1731 EXPECT_TRUE(LinkAsExpected(program, false));
1699 } 1732 }
1700 1733
1701 // Varyings go over 8 rows but some are inactive 1734 // Varyings go over 8 rows but some are inactive
1702 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) { 1735 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) {
1703 const VarInfo kVertexVaryings[] = { 1736 const VarInfo kVertexVaryings[] = {
1704 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, 1737 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying },
1705 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1738 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1706 }; 1739 };
1707 const VarInfo kFragmentVaryings[] = { 1740 const VarInfo kFragmentVaryings[] = {
1708 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, 1741 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying },
1709 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1742 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1710 }; 1743 };
1711 Program* program = SetupShaderVariableTest( 1744 Program* program =
1712 kVertexVaryings, 2, kFragmentVaryings, 2); 1745 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2);
1713 1746
1714 EXPECT_TRUE( 1747 EXPECT_TRUE(
1715 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); 1748 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed));
1716 EXPECT_TRUE(LinkAsExpected(program, true)); 1749 EXPECT_TRUE(LinkAsExpected(program, true));
1717 } 1750 }
1718 1751
1719 // Varyings go over 8 rows but some are inactive. 1752 // Varyings go over 8 rows but some are inactive.
1720 // However, we still fail the check if kCountAll option is used. 1753 // However, we still fail the check if kCountAll option is used.
1721 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) { 1754 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) {
1722 const VarInfo kVertexVaryings[] = { 1755 const VarInfo kVertexVaryings[] = {
1723 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, 1756 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying },
1724 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1757 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1725 }; 1758 };
1726 const VarInfo kFragmentVaryings[] = { 1759 const VarInfo kFragmentVaryings[] = {
1727 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, 1760 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying },
1728 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1761 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1729 }; 1762 };
1730 Program* program = SetupShaderVariableTest( 1763 Program* program =
1731 kVertexVaryings, 2, kFragmentVaryings, 2); 1764 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2);
1732 1765
1733 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll)); 1766 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll));
1734 } 1767 }
1735 1768
1736 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) { 1769 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) {
1737 Shader* vshader = shader_manager_.CreateShader( 1770 Shader* vshader = shader_manager_.CreateShader(
1738 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 1771 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
1739 ASSERT_TRUE(vshader != NULL); 1772 ASSERT_TRUE(vshader != NULL);
1740 TestHelper::SetShaderStates(gl_.get(), vshader, true); 1773 TestHelper::SetShaderStates(gl_.get(), vshader, true);
1741 Shader* fshader = shader_manager_.CreateShader( 1774 Shader* fshader = shader_manager_.CreateShader(
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1881 ProgramManagerWithCacheTest() 1914 ProgramManagerWithCacheTest()
1882 : cache_(new MockProgramCache()), 1915 : cache_(new MockProgramCache()),
1883 vertex_shader_(NULL), 1916 vertex_shader_(NULL),
1884 fragment_shader_(NULL), 1917 fragment_shader_(NULL),
1885 program_(NULL) { 1918 program_(NULL) {
1886 } 1919 }
1887 1920
1888 protected: 1921 protected:
1889 void SetupProgramManager() override { 1922 void SetupProgramManager() override {
1890 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors, 1923 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors,
1924 kMaxDualSourceDrawBuffers,
1891 feature_info_.get())); 1925 feature_info_.get()));
1892 } 1926 }
1893 1927
1894 void SetUp() override { 1928 void SetUp() override {
1895 ProgramManagerTestBase::SetUp(); 1929 ProgramManagerTestBase::SetUp();
1896 1930
1897 vertex_shader_ = shader_manager_.CreateShader( 1931 vertex_shader_ = shader_manager_.CreateShader(
1898 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 1932 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
1899 fragment_shader_ = shader_manager_.CreateShader( 1933 fragment_shader_ = shader_manager_.CreateShader(
1900 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); 1934 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
1901 ASSERT_TRUE(vertex_shader_ != NULL); 1935 ASSERT_TRUE(vertex_shader_ != NULL);
1902 ASSERT_TRUE(fragment_shader_ != NULL); 1936 ASSERT_TRUE(fragment_shader_ != NULL);
1903 vertex_shader_->set_source("lka asjf bjajsdfj"); 1937 vertex_shader_->set_source("lka asjf bjajsdfj");
1904 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj"); 1938 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj");
1905 1939
1906 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId); 1940 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId);
1907 ASSERT_TRUE(program_ != NULL); 1941 ASSERT_TRUE(program_ != NULL);
1908 1942
1909 program_->AttachShader(&shader_manager_, vertex_shader_); 1943 program_->AttachShader(&shader_manager_, vertex_shader_);
1910 program_->AttachShader(&shader_manager_, fragment_shader_); 1944 program_->AttachShader(&shader_manager_, fragment_shader_);
1911 } 1945 }
1946
1912 void TearDown() override { 1947 void TearDown() override {
1913 shader_manager_.Destroy(false); 1948 shader_manager_.Destroy(false);
1914 ProgramManagerTestBase::TearDown(); 1949 ProgramManagerTestBase::TearDown();
1915 } 1950 }
1951
1916 void SetShadersCompiled() { 1952 void SetShadersCompiled() {
1917 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); 1953 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true);
1918 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); 1954 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true);
1919 } 1955 }
1920 1956
1921 void SetProgramCached() { 1957 void SetProgramCached() {
1922 cache_->LinkedProgramCacheSuccess( 1958 cache_->LinkedProgramCacheSuccess(
1923 vertex_shader_->source(), 1959 vertex_shader_->source(),
1924 fragment_shader_->source(), 1960 fragment_shader_->source(),
1925 &program_->bind_attrib_location_map(), 1961 &program_->bind_attrib_location_map(),
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
2175 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying( 2211 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying(
2176 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision, 2212 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision,
2177 kFragmentInput1StaticUse, kFragmentInput1Name); 2213 kFragmentInput1StaticUse, kFragmentInput1Name);
2178 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying( 2214 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying(
2179 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision, 2215 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision,
2180 kFragmentInput2StaticUse, kFragmentInput2Name); 2216 kFragmentInput2StaticUse, kFragmentInput2Name);
2181 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying( 2217 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying(
2182 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision, 2218 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision,
2183 kFragmentInput3StaticUse, kFragmentInput3Name); 2219 kFragmentInput3StaticUse, kFragmentInput3Name);
2184 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, 2220 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
2185 nullptr, nullptr, nullptr, &varying_map, nullptr); 2221 nullptr, nullptr, nullptr, &varying_map, nullptr,
2222 nullptr);
2186 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, 2223 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
2187 nullptr, nullptr, nullptr, &varying_map, nullptr); 2224 nullptr, nullptr, nullptr, &varying_map, nullptr,
2225 nullptr);
2188 Program* program = 2226 Program* program =
2189 manager_->CreateProgram(kClientProgramId, kServiceProgramId); 2227 manager_->CreateProgram(kClientProgramId, kServiceProgramId);
2190 ASSERT_TRUE(program != NULL); 2228 ASSERT_TRUE(program != NULL);
2191 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 2229 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
2192 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 2230 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
2193 EXPECT_TRUE(program->SetFragmentInputLocationBinding( 2231 EXPECT_TRUE(program->SetFragmentInputLocationBinding(
2194 kFragmentInput1Name, kFragmentInput1DesiredLocation)); 2232 kFragmentInput1Name, kFragmentInput1DesiredLocation));
2195 EXPECT_TRUE(program->SetFragmentInputLocationBinding( 2233 EXPECT_TRUE(program->SetFragmentInputLocationBinding(
2196 kFragmentInput3Name, kFragmentInput3DesiredLocation)); 2234 kFragmentInput3Name, kFragmentInput3DesiredLocation));
2197 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = { 2235 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2248 INSTANTIATE_TEST_CASE_P( 2286 INSTANTIATE_TEST_CASE_P(
2249 SupportedContexts, 2287 SupportedContexts,
2250 ProgramManagerWithPathRenderingTest, 2288 ProgramManagerWithPathRenderingTest,
2251 testing::Values( 2289 testing::Values(
2252 make_gl_ext_tuple("3.2", 2290 make_gl_ext_tuple("3.2",
2253 "GL_ARB_program_interface_query " 2291 "GL_ARB_program_interface_query "
2254 "GL_EXT_direct_state_access GL_NV_path_rendering"), 2292 "GL_EXT_direct_state_access GL_NV_path_rendering"),
2255 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"), 2293 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"),
2256 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering"))); 2294 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering")));
2257 2295
2296 class ProgramManagerDualSourceBlendingTest
2297 : public ProgramManagerWithShaderTest,
2298 public testing::WithParamInterface<
2299 testing::tuple<const char*, const char*>> {
2300 public:
2301 ProgramManagerDualSourceBlendingTest() {}
2302
2303 protected:
2304 void SetUpWithFeatureInfo(FeatureInfo* feature_info) {
2305 const char* gl_version = testing::get<0>(GetParam());
2306 const char* gl_extensions = testing::get<1>(GetParam());
2307 SetUpBase(gl_version, gl_extensions, feature_info);
2308 }
2309
2310 void SetUp() override { SetUpWithFeatureInfo(nullptr); }
2311 };
2312
2313 class ProgramManagerDualSourceBlendingES2Test
2314 : public ProgramManagerDualSourceBlendingTest {};
2315
2316 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragCoord) {
2317 DCHECK(feature_info_->feature_flags().ext_blend_func_extended);
2318
2319 const VarInfo kFragmentVaryings[] = {
2320 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_SecondaryFragColorEXT",
2321 kVarOutput},
2322 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_FragColor", kVarOutput},
2323 };
2324
2325 int shader_version = 100;
2326 Program* program =
2327 SetupProgramForVariables(nullptr, 0, kFragmentVaryings,
2328 arraysize(kFragmentVaryings), &shader_version);
2329
2330 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info();
2331 if (!gl_version.is_es) {
2332 // The call is expected only for OpenGL. OpenGL ES expects to
2333 // output GLES SL 1.00, which does not bind.
2334 EXPECT_CALL(*(gl_.get()),
2335 BindFragDataLocationIndexed(kServiceProgramId, 0, 1,
2336 StrEq("angle_SecondaryFragColor")))
2337 .Times(1)
2338 .RetiresOnSaturation();
2339 }
2340
2341 EXPECT_TRUE(LinkAsExpected(program, true));
2342 }
2343
2344 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragData) {
2345 const VarInfo kFragmentVaryings[] = {
2346 {GL_FLOAT_VEC4, kMaxDualSourceDrawBuffers, GL_MEDIUM_FLOAT, true,
2347 "gl_SecondaryFragDataEXT", kVarOutput},
2348 {GL_FLOAT_VEC4, kMaxDrawBuffers, GL_MEDIUM_FLOAT, true, "gl_FragData",
2349 kVarOutput},
2350 };
2351
2352 int shader_version = 100;
2353 Program* program =
2354 SetupProgramForVariables(nullptr, 0, kFragmentVaryings,
2355 arraysize(kFragmentVaryings), &shader_version);
2356
2357 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info();
2358 if (!gl_version.is_es) {
2359 // The call is expected only for OpenGL. OpenGL ES expects to
2360 // output GLES SL 1.00, which does not bind.
2361 EXPECT_CALL(*(gl_.get()),
2362 BindFragDataLocationIndexed(kServiceProgramId, 0, 1,
2363 StrEq("angle_SecondaryFragData")))
2364 .Times(1)
2365 .RetiresOnSaturation();
2366 }
2367
2368 EXPECT_TRUE(LinkAsExpected(program, true));
2369 }
2370
2371 INSTANTIATE_TEST_CASE_P(
2372 SupportedContexts,
2373 ProgramManagerDualSourceBlendingES2Test,
2374 testing::Values(
2375 testing::make_tuple("3.2",
2376 "GL_ARB_draw_buffers GL_ARB_blend_func_extended"),
2377 testing::make_tuple("opengl es 2.0",
2378 "GL_EXT_draw_buffers GL_EXT_blend_func_extended"),
2379 testing::make_tuple("opengl es 3.0",
2380 "GL_EXT_draw_buffers GL_EXT_blend_func_extended")));
2381
2258 } // namespace gles2 2382 } // namespace gles2
2259 } // namespace gpu 2383 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698