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

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: address review comments 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 OutputVariableList 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(
357 TestHelper::ConstructOutputVariable(
358 vertex_variables[ii].type, vertex_variables[ii].size,
359 vertex_variables[ii].precision,
360 vertex_variables[ii].static_use, vertex_variables[ii].name));
361 break;
341 default: 362 default:
342 NOTREACHED(); 363 NOTREACHED();
343 } 364 }
344 } 365 }
345 366
346 AttributeMap frag_attrib_map; 367 AttributeMap frag_attrib_map;
347 UniformMap frag_uniform_map; 368 UniformMap frag_uniform_map;
348 VaryingMap frag_varying_map; 369 VaryingMap frag_varying_map;
370 OutputVariableList frag_output_variable_list;
349 for (size_t ii = 0; ii < fragment_variable_size; ++ii) { 371 for (size_t ii = 0; ii < fragment_variable_size; ++ii) {
350 switch (fragment_variables[ii].category) { 372 switch (fragment_variables[ii].category) {
351 case kVarAttribute: 373 case kVarAttribute:
352 frag_attrib_map[fragment_variables[ii].name] = 374 frag_attrib_map[fragment_variables[ii].name] =
353 TestHelper::ConstructAttribute( 375 TestHelper::ConstructAttribute(
354 fragment_variables[ii].type, 376 fragment_variables[ii].type,
355 fragment_variables[ii].size, 377 fragment_variables[ii].size,
356 fragment_variables[ii].precision, 378 fragment_variables[ii].precision,
357 fragment_variables[ii].static_use, 379 fragment_variables[ii].static_use,
358 fragment_variables[ii].name); 380 fragment_variables[ii].name);
359 break; 381 break;
360 case kVarUniform: 382 case kVarUniform:
361 frag_uniform_map[fragment_variables[ii].name] = 383 frag_uniform_map[fragment_variables[ii].name] =
362 TestHelper::ConstructUniform( 384 TestHelper::ConstructUniform(
363 fragment_variables[ii].type, 385 fragment_variables[ii].type,
364 fragment_variables[ii].size, 386 fragment_variables[ii].size,
365 fragment_variables[ii].precision, 387 fragment_variables[ii].precision,
366 fragment_variables[ii].static_use, 388 fragment_variables[ii].static_use,
367 fragment_variables[ii].name); 389 fragment_variables[ii].name);
368 break; 390 break;
369 case kVarVarying: 391 case kVarVarying:
370 frag_varying_map[fragment_variables[ii].name] = 392 frag_varying_map[fragment_variables[ii].name] =
371 TestHelper::ConstructVarying( 393 TestHelper::ConstructVarying(
372 fragment_variables[ii].type, 394 fragment_variables[ii].type,
373 fragment_variables[ii].size, 395 fragment_variables[ii].size,
374 fragment_variables[ii].precision, 396 fragment_variables[ii].precision,
375 fragment_variables[ii].static_use, 397 fragment_variables[ii].static_use,
376 fragment_variables[ii].name); 398 fragment_variables[ii].name);
377 break; 399 break;
400 case kVarOutput:
401 frag_output_variable_list.push_back(
402 TestHelper::ConstructOutputVariable(
403 fragment_variables[ii].type, fragment_variables[ii].size,
404 fragment_variables[ii].precision,
405 fragment_variables[ii].static_use,
406 fragment_variables[ii].name));
407 break;
378 default: 408 default:
379 NOTREACHED(); 409 NOTREACHED();
380 } 410 }
381 } 411 }
382 412
383 // Check we can create shader. 413 // Check we can create shader.
384 Shader* vshader = shader_manager_.CreateShader( 414 Shader* vshader = shader_manager_.CreateShader(
385 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 415 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
386 Shader* fshader = shader_manager_.CreateShader( 416 Shader* fshader = shader_manager_.CreateShader(
387 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); 417 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
388 // Check shader got created. 418 // Check shader got created.
389 EXPECT_TRUE(vshader != NULL && fshader != NULL); 419 EXPECT_TRUE(vshader != NULL && fshader != NULL);
390 // Set Status 420 // Set Status
391 TestHelper::SetShaderStates( 421 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
392 gl_.get(), vshader, true, NULL, NULL, NULL, 422 shader_version, &vertex_attrib_map,
393 &vertex_attrib_map, &vertex_uniform_map, &vertex_varying_map, NULL); 423 &vertex_uniform_map, &vertex_varying_map,
394 TestHelper::SetShaderStates( 424 &vertex_output_variable_list, nullptr);
395 gl_.get(), fshader, true, NULL, NULL, NULL, 425 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
396 &frag_attrib_map, &frag_uniform_map, &frag_varying_map, NULL); 426 shader_version, &frag_attrib_map,
427 &frag_uniform_map, &frag_varying_map,
428 &frag_output_variable_list, nullptr);
397 429
398 // Set up program 430 // Set up program
399 Program* program = 431 Program* program =
400 manager_->CreateProgram(kClientProgramId, kServiceProgramId); 432 manager_->CreateProgram(kClientProgramId, kServiceProgramId);
401 EXPECT_TRUE(program != NULL); 433 EXPECT_TRUE(program != NULL);
402 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 434 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
403 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 435 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
404 return program; 436 return program;
405 } 437 }
406 438
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1"; 529 const char* ProgramManagerWithShaderTest::kAttrib1Name = "attrib1";
498 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2"; 530 const char* ProgramManagerWithShaderTest::kAttrib2Name = "attrib2";
499 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3"; 531 const char* ProgramManagerWithShaderTest::kAttrib3Name = "attrib3";
500 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1"; 532 const char* ProgramManagerWithShaderTest::kUniform1Name = "uniform1";
501 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2"; 533 const char* ProgramManagerWithShaderTest::kUniform2Name = "uniform2";
502 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex = 534 const char* ProgramManagerWithShaderTest::kUniform2NameWithArrayIndex =
503 "uniform2[0]"; 535 "uniform2[0]";
504 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3"; 536 const char* ProgramManagerWithShaderTest::kUniform3Name = "uniform3";
505 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex = 537 const char* ProgramManagerWithShaderTest::kUniform3NameWithArrayIndex =
506 "uniform3[0]"; 538 "uniform3[0]";
539 const char* ProgramManagerWithShaderTest::kOutputVariable1Name = "outputVar1";
507 540
508 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) { 541 TEST_F(ProgramManagerWithShaderTest, GetAttribInfos) {
509 const Program* program = SetupDefaultProgram(); 542 const Program* program = SetupDefaultProgram();
510 ASSERT_TRUE(program != NULL); 543 ASSERT_TRUE(program != NULL);
511 const Program::AttribInfoVector& infos = 544 const Program::AttribInfoVector& infos =
512 program->GetAttribInfos(); 545 program->GetAttribInfos();
513 ASSERT_EQ(kNumAttribs, infos.size()); 546 ASSERT_EQ(kNumAttribs, infos.size());
514 for (size_t ii = 0; ii < kNumAttribs; ++ii) { 547 for (size_t ii = 0; ii < kNumAttribs; ++ii) {
515 const Program::VertexAttrib& info = infos[ii]; 548 const Program::VertexAttrib& info = infos[ii];
516 const AttribInfo& expected = kAttribs[ii]; 549 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 833 // 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. 834 // GL_FLOAT_VEC2 when they should return GL_FLOAT_MAT2. Check we handle this.
802 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) { 835 TEST_F(ProgramManagerWithShaderTest, GLDriverReturnsWrongTypeInfo) {
803 static GLenum kAttrib2BadType = GL_FLOAT_VEC2; 836 static GLenum kAttrib2BadType = GL_FLOAT_VEC2;
804 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2; 837 static GLenum kAttrib2GoodType = GL_FLOAT_MAT2;
805 static GLenum kUniform2BadType = GL_FLOAT_VEC3; 838 static GLenum kUniform2BadType = GL_FLOAT_VEC3;
806 static GLenum kUniform2GoodType = GL_FLOAT_MAT3; 839 static GLenum kUniform2GoodType = GL_FLOAT_MAT3;
807 AttributeMap attrib_map; 840 AttributeMap attrib_map;
808 UniformMap uniform_map; 841 UniformMap uniform_map;
809 VaryingMap varying_map; 842 VaryingMap varying_map;
843 OutputVariableList output_variable_list;
810 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute( 844 attrib_map[kAttrib1Name] = TestHelper::ConstructAttribute(
811 kAttrib1Type, kAttrib1Size, kAttrib1Precision, 845 kAttrib1Type, kAttrib1Size, kAttrib1Precision,
812 kAttribStaticUse, kAttrib1Name); 846 kAttribStaticUse, kAttrib1Name);
813 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute( 847 attrib_map[kAttrib2Name] = TestHelper::ConstructAttribute(
814 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision, 848 kAttrib2GoodType, kAttrib2Size, kAttrib2Precision,
815 kAttribStaticUse, kAttrib2Name); 849 kAttribStaticUse, kAttrib2Name);
816 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute( 850 attrib_map[kAttrib3Name] = TestHelper::ConstructAttribute(
817 kAttrib3Type, kAttrib3Size, kAttrib3Precision, 851 kAttrib3Type, kAttrib3Size, kAttrib3Precision,
818 kAttribStaticUse, kAttrib3Name); 852 kAttribStaticUse, kAttrib3Name);
819 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( 853 uniform_map[kUniform1Name] = TestHelper::ConstructUniform(
820 kUniform1Type, kUniform1Size, kUniform1Precision, 854 kUniform1Type, kUniform1Size, kUniform1Precision,
821 kUniform1StaticUse, kUniform1Name); 855 kUniform1StaticUse, kUniform1Name);
822 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( 856 uniform_map[kUniform2Name] = TestHelper::ConstructUniform(
823 kUniform2GoodType, kUniform2Size, kUniform2Precision, 857 kUniform2GoodType, kUniform2Size, kUniform2Precision,
824 kUniform2StaticUse, kUniform2Name); 858 kUniform2StaticUse, kUniform2Name);
825 uniform_map[kUniform3Name] = TestHelper::ConstructUniform( 859 uniform_map[kUniform3Name] = TestHelper::ConstructUniform(
826 kUniform3Type, kUniform3Size, kUniform3Precision, 860 kUniform3Type, kUniform3Size, kUniform3Precision,
827 kUniform3StaticUse, kUniform3Name); 861 kUniform3StaticUse, kUniform3Name);
862 output_variable_list.push_back(TestHelper::ConstructOutputVariable(
863 kOutputVariable1Type, kOutputVariable1Size, kOutputVariable1Precision,
864 kOutputVariable1StaticUse, kOutputVariable1Name));
865
828 Shader* vshader = shader_manager_.CreateShader( 866 Shader* vshader = shader_manager_.CreateShader(
829 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 867 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
830 ASSERT_TRUE(vshader != NULL); 868 ASSERT_TRUE(vshader != NULL);
831 TestHelper::SetShaderStates( 869 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
832 gl_.get(), vshader, true, NULL, NULL, NULL, 870 nullptr, &attrib_map, &uniform_map, &varying_map,
833 &attrib_map, &uniform_map, &varying_map, NULL); 871 &output_variable_list, nullptr);
834 Shader* fshader = shader_manager_.CreateShader( 872 Shader* fshader = shader_manager_.CreateShader(
835 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); 873 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
836 ASSERT_TRUE(fshader != NULL); 874 ASSERT_TRUE(fshader != NULL);
837 TestHelper::SetShaderStates( 875 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
838 gl_.get(), fshader, true, NULL, NULL, NULL, 876 nullptr, &attrib_map, &uniform_map, &varying_map,
839 &attrib_map, &uniform_map, &varying_map, NULL); 877 &output_variable_list, nullptr);
840 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = { 878 static ProgramManagerWithShaderTest::AttribInfo kAttribs[] = {
841 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, 879 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, },
842 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, }, 880 { kAttrib2Name, kAttrib2Size, kAttrib2BadType, kAttrib2Location, },
843 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, 881 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, },
844 }; 882 };
845 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = { 883 static ProgramManagerWithShaderTest::UniformInfo kUniforms[] = {
846 { kUniform1Name, 884 { kUniform1Name,
847 kUniform1Size, 885 kUniform1Size,
848 kUniform1Type, 886 kUniform1Type,
849 kUniform1FakeLocation, 887 kUniform1FakeLocation,
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after
1492 kAttribStaticUse, 1530 kAttribStaticUse,
1493 kAttribMatName); 1531 kAttribMatName);
1494 // Check we can create shader. 1532 // Check we can create shader.
1495 Shader* vshader = shader_manager_.CreateShader( 1533 Shader* vshader = shader_manager_.CreateShader(
1496 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 1534 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
1497 Shader* fshader = shader_manager_.CreateShader( 1535 Shader* fshader = shader_manager_.CreateShader(
1498 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); 1536 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
1499 // Check shader got created. 1537 // Check shader got created.
1500 ASSERT_TRUE(vshader != NULL && fshader != NULL); 1538 ASSERT_TRUE(vshader != NULL && fshader != NULL);
1501 // Set Status 1539 // Set Status
1502 TestHelper::SetShaderStates( 1540 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
1503 gl_.get(), vshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, 1541 nullptr, &attrib_map, nullptr, nullptr, nullptr,
1504 NULL); 1542 nullptr);
1505 // Check attrib infos got copied. 1543 // Check attrib infos got copied.
1506 for (AttributeMap::const_iterator it = attrib_map.begin(); 1544 for (AttributeMap::const_iterator it = attrib_map.begin();
1507 it != attrib_map.end(); ++it) { 1545 it != attrib_map.end(); ++it) {
1508 const sh::Attribute* variable_info = 1546 const sh::Attribute* variable_info =
1509 vshader->GetAttribInfo(it->first); 1547 vshader->GetAttribInfo(it->first);
1510 ASSERT_TRUE(variable_info != NULL); 1548 ASSERT_TRUE(variable_info != NULL);
1511 EXPECT_EQ(it->second.type, variable_info->type); 1549 EXPECT_EQ(it->second.type, variable_info->type);
1512 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); 1550 EXPECT_EQ(it->second.arraySize, variable_info->arraySize);
1513 EXPECT_EQ(it->second.precision, variable_info->precision); 1551 EXPECT_EQ(it->second.precision, variable_info->precision);
1514 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); 1552 EXPECT_EQ(it->second.staticUse, variable_info->staticUse);
1515 EXPECT_EQ(it->second.name, variable_info->name); 1553 EXPECT_EQ(it->second.name, variable_info->name);
1516 } 1554 }
1517 TestHelper::SetShaderStates( 1555 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
1518 gl_.get(), fshader, true, NULL, NULL, NULL, &attrib_map, NULL, NULL, 1556 nullptr, &attrib_map, nullptr, nullptr, nullptr,
1519 NULL); 1557 nullptr);
1520 1558
1521 // Set up program 1559 // Set up program
1522 Program* program = 1560 Program* program =
1523 manager_->CreateProgram(kClientProgramId, kServiceProgramId); 1561 manager_->CreateProgram(kClientProgramId, kServiceProgramId);
1524 ASSERT_TRUE(program != NULL); 1562 ASSERT_TRUE(program != NULL);
1525 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 1563 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
1526 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 1564 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
1527 1565
1528 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts()); 1566 EXPECT_FALSE(program->DetectAttribLocationBindingConflicts());
1529 EXPECT_TRUE(LinkAsExpected(program, true)); 1567 EXPECT_TRUE(LinkAsExpected(program, true));
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1576 GL_FLOAT, 3, GL_LOW_FLOAT, true, "a"); 1614 GL_FLOAT, 3, GL_LOW_FLOAT, true, "a");
1577 1615
1578 // Check we can create shader. 1616 // Check we can create shader.
1579 Shader* vshader = shader_manager_.CreateShader( 1617 Shader* vshader = shader_manager_.CreateShader(
1580 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 1618 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
1581 Shader* fshader = shader_manager_.CreateShader( 1619 Shader* fshader = shader_manager_.CreateShader(
1582 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); 1620 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
1583 // Check shader got created. 1621 // Check shader got created.
1584 ASSERT_TRUE(vshader != NULL && fshader != NULL); 1622 ASSERT_TRUE(vshader != NULL && fshader != NULL);
1585 // Set Status 1623 // Set Status
1586 TestHelper::SetShaderStates( 1624 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
1587 gl_.get(), vshader, true, NULL, NULL, NULL, NULL, 1625 nullptr, nullptr, &vertex_uniform_map, nullptr,
1588 &vertex_uniform_map, NULL, NULL); 1626 nullptr, nullptr);
1589 TestHelper::SetShaderStates( 1627 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
1590 gl_.get(), fshader, true, NULL, NULL, NULL, NULL, 1628 nullptr, nullptr, &frag_uniform_map, nullptr,
1591 &frag_uniform_map, NULL, NULL); 1629 nullptr, nullptr);
1592 1630
1593 // Set up program 1631 // Set up program
1594 Program* program = 1632 Program* program =
1595 manager_->CreateProgram(kClientProgramId, kServiceProgramId); 1633 manager_->CreateProgram(kClientProgramId, kServiceProgramId);
1596 ASSERT_TRUE(program != NULL); 1634 ASSERT_TRUE(program != NULL);
1597 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 1635 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
1598 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 1636 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
1599 1637
1600 std::string conflicting_name; 1638 std::string conflicting_name;
1601 1639
1602 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name)); 1640 EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name));
1603 EXPECT_EQ("a", conflicting_name); 1641 EXPECT_EQ("a", conflicting_name);
1604 EXPECT_TRUE(LinkAsExpected(program, false)); 1642 EXPECT_TRUE(LinkAsExpected(program, false));
1605 } 1643 }
1606 1644
1607 // If a varying has different type in the vertex and fragment 1645 // If a varying has different type in the vertex and fragment
1608 // shader, linking should fail. 1646 // shader, linking should fail.
1609 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { 1647 TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) {
1610 const VarInfo kVertexVarying = 1648 const VarInfo kVertexVarying =
1611 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1649 { GL_FLOAT_VEC3, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1612 const VarInfo kFragmentVarying = 1650 const VarInfo kFragmentVarying =
1613 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1651 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1614 Program* program = SetupShaderVariableTest( 1652 Program* program =
1615 &kVertexVarying, 1, &kFragmentVarying, 1); 1653 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1);
1616 1654
1617 std::string conflicting_name; 1655 std::string conflicting_name;
1618 1656
1619 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); 1657 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name));
1620 EXPECT_EQ("a", conflicting_name); 1658 EXPECT_EQ("a", conflicting_name);
1621 EXPECT_TRUE(LinkAsExpected(program, false)); 1659 EXPECT_TRUE(LinkAsExpected(program, false));
1622 } 1660 }
1623 1661
1624 // If a varying has different array size in the vertex and fragment 1662 // If a varying has different array size in the vertex and fragment
1625 // shader, linking should fail. 1663 // shader, linking should fail.
1626 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { 1664 TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) {
1627 const VarInfo kVertexVarying = 1665 const VarInfo kVertexVarying =
1628 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1666 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1629 const VarInfo kFragmentVarying = 1667 const VarInfo kFragmentVarying =
1630 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1668 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1631 Program* program = SetupShaderVariableTest( 1669 Program* program =
1632 &kVertexVarying, 1, &kFragmentVarying, 1); 1670 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1);
1633 1671
1634 std::string conflicting_name; 1672 std::string conflicting_name;
1635 1673
1636 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); 1674 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name));
1637 EXPECT_EQ("a", conflicting_name); 1675 EXPECT_EQ("a", conflicting_name);
1638 EXPECT_TRUE(LinkAsExpected(program, false)); 1676 EXPECT_TRUE(LinkAsExpected(program, false));
1639 } 1677 }
1640 1678
1641 // If a varying has different precision in the vertex and fragment 1679 // If a varying has different precision in the vertex and fragment
1642 // shader, linking should succeed. 1680 // shader, linking should succeed.
1643 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { 1681 TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) {
1644 const VarInfo kVertexVarying = 1682 const VarInfo kVertexVarying =
1645 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying }; 1683 { GL_FLOAT, 2, GL_HIGH_FLOAT, true, "a", kVarVarying };
1646 const VarInfo kFragmentVarying = 1684 const VarInfo kFragmentVarying =
1647 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1685 { GL_FLOAT, 2, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1648 Program* program = SetupShaderVariableTest( 1686 Program* program =
1649 &kVertexVarying, 1, &kFragmentVarying, 1); 1687 SetupProgramForVariables(&kVertexVarying, 1, &kFragmentVarying, 1);
1650 1688
1651 std::string conflicting_name; 1689 std::string conflicting_name;
1652 1690
1653 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); 1691 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name));
1654 EXPECT_TRUE(conflicting_name.empty()); 1692 EXPECT_TRUE(conflicting_name.empty());
1655 EXPECT_TRUE(LinkAsExpected(program, true)); 1693 EXPECT_TRUE(LinkAsExpected(program, true));
1656 } 1694 }
1657 1695
1658 // If a varying is statically used in fragment shader but not 1696 // If a varying is statically used in fragment shader but not
1659 // declared in vertex shader, link should fail. 1697 // declared in vertex shader, link should fail.
1660 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { 1698 TEST_F(ProgramManagerWithShaderTest, VaryingMissing) {
1661 const VarInfo kFragmentVarying = 1699 const VarInfo kFragmentVarying =
1662 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying }; 1700 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, true, "a", kVarVarying };
1663 Program* program = SetupShaderVariableTest( 1701 Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1);
1664 NULL, 0, &kFragmentVarying, 1);
1665 1702
1666 std::string conflicting_name; 1703 std::string conflicting_name;
1667 1704
1668 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); 1705 EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name));
1669 EXPECT_EQ("a", conflicting_name); 1706 EXPECT_EQ("a", conflicting_name);
1670 EXPECT_TRUE(LinkAsExpected(program, false)); 1707 EXPECT_TRUE(LinkAsExpected(program, false));
1671 } 1708 }
1672 1709
1673 // If a varying is declared but not statically used in fragment 1710 // If a varying is declared but not statically used in fragment
1674 // shader, even if it's not declared in vertex shader, link should 1711 // shader, even if it's not declared in vertex shader, link should
1675 // succeed. 1712 // succeed.
1676 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { 1713 TEST_F(ProgramManagerWithShaderTest, InactiveVarying) {
1677 const VarInfo kFragmentVarying = 1714 const VarInfo kFragmentVarying =
1678 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying }; 1715 { GL_FLOAT, 3, GL_MEDIUM_FLOAT, false, "a", kVarVarying };
1679 Program* program = SetupShaderVariableTest( 1716 Program* program = SetupProgramForVariables(nullptr, 0, &kFragmentVarying, 1);
1680 NULL, 0, &kFragmentVarying, 1);
1681 1717
1682 std::string conflicting_name; 1718 std::string conflicting_name;
1683 1719
1684 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); 1720 EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name));
1685 EXPECT_TRUE(conflicting_name.empty()); 1721 EXPECT_TRUE(conflicting_name.empty());
1686 EXPECT_TRUE(LinkAsExpected(program, true)); 1722 EXPECT_TRUE(LinkAsExpected(program, true));
1687 } 1723 }
1688 1724
1689 // Uniforms and attributes are both global variables, thus sharing 1725 // Uniforms and attributes are both global variables, thus sharing
1690 // the same namespace. Any name conflicts should cause link 1726 // the same namespace. Any name conflicts should cause link
1691 // failure. 1727 // failure.
1692 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { 1728 TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) {
1693 const VarInfo kVertexAttribute = 1729 const VarInfo kVertexAttribute =
1694 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute }; 1730 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarAttribute };
1695 const VarInfo kFragmentUniform = 1731 const VarInfo kFragmentUniform =
1696 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform }; 1732 { GL_FLOAT_VEC4, 1, GL_MEDIUM_FLOAT, true, "a", kVarUniform };
1697 Program* program = SetupShaderVariableTest( 1733 Program* program =
1698 &kVertexAttribute, 1, &kFragmentUniform, 1); 1734 SetupProgramForVariables(&kVertexAttribute, 1, &kFragmentUniform, 1);
1699 1735
1700 std::string conflicting_name; 1736 std::string conflicting_name;
1701 1737
1702 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); 1738 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name));
1703 EXPECT_EQ("a", conflicting_name); 1739 EXPECT_EQ("a", conflicting_name);
1704 EXPECT_TRUE(LinkAsExpected(program, false)); 1740 EXPECT_TRUE(LinkAsExpected(program, false));
1705 } 1741 }
1706 1742
1707 // Varyings go over 8 rows. 1743 // Varyings go over 8 rows.
1708 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { 1744 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) {
1709 const VarInfo kVertexVaryings[] = { 1745 const VarInfo kVertexVaryings[] = {
1710 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, 1746 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying },
1711 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1747 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1712 }; 1748 };
1713 const VarInfo kFragmentVaryings[] = { 1749 const VarInfo kFragmentVaryings[] = {
1714 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, 1750 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying },
1715 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1751 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1716 }; 1752 };
1717 Program* program = SetupShaderVariableTest( 1753 Program* program =
1718 kVertexVaryings, 2, kFragmentVaryings, 2); 1754 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2);
1719 1755
1720 EXPECT_FALSE( 1756 EXPECT_FALSE(
1721 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); 1757 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed));
1722 EXPECT_TRUE(LinkAsExpected(program, false)); 1758 EXPECT_TRUE(LinkAsExpected(program, false));
1723 } 1759 }
1724 1760
1725 // Varyings go over 8 rows but some are inactive 1761 // Varyings go over 8 rows but some are inactive
1726 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) { 1762 TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) {
1727 const VarInfo kVertexVaryings[] = { 1763 const VarInfo kVertexVaryings[] = {
1728 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, 1764 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying },
1729 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1765 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1730 }; 1766 };
1731 const VarInfo kFragmentVaryings[] = { 1767 const VarInfo kFragmentVaryings[] = {
1732 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, 1768 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying },
1733 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1769 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1734 }; 1770 };
1735 Program* program = SetupShaderVariableTest( 1771 Program* program =
1736 kVertexVaryings, 2, kFragmentVaryings, 2); 1772 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2);
1737 1773
1738 EXPECT_TRUE( 1774 EXPECT_TRUE(
1739 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed)); 1775 program->CheckVaryingsPacking(Program::kCountOnlyStaticallyUsed));
1740 EXPECT_TRUE(LinkAsExpected(program, true)); 1776 EXPECT_TRUE(LinkAsExpected(program, true));
1741 } 1777 }
1742 1778
1743 // Varyings go over 8 rows but some are inactive. 1779 // Varyings go over 8 rows but some are inactive.
1744 // However, we still fail the check if kCountAll option is used. 1780 // However, we still fail the check if kCountAll option is used.
1745 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) { 1781 TEST_F(ProgramManagerWithShaderTest, CountAllVaryingsInPacking) {
1746 const VarInfo kVertexVaryings[] = { 1782 const VarInfo kVertexVaryings[] = {
1747 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, 1783 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying },
1748 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1784 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1749 }; 1785 };
1750 const VarInfo kFragmentVaryings[] = { 1786 const VarInfo kFragmentVaryings[] = {
1751 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying }, 1787 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, false, "a", kVarVarying },
1752 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1788 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1753 }; 1789 };
1754 Program* program = SetupShaderVariableTest( 1790 Program* program =
1755 kVertexVaryings, 2, kFragmentVaryings, 2); 1791 SetupProgramForVariables(kVertexVaryings, 2, kFragmentVaryings, 2);
1756 1792
1757 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll)); 1793 EXPECT_FALSE(program->CheckVaryingsPacking(Program::kCountAll));
1758 } 1794 }
1759 1795
1760 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) { 1796 TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) {
1761 Shader* vshader = shader_manager_.CreateShader( 1797 Shader* vshader = shader_manager_.CreateShader(
1762 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 1798 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
1763 ASSERT_TRUE(vshader != NULL); 1799 ASSERT_TRUE(vshader != NULL);
1764 TestHelper::SetShaderStates(gl_.get(), vshader, true); 1800 TestHelper::SetShaderStates(gl_.get(), vshader, true);
1765 Shader* fshader = shader_manager_.CreateShader( 1801 Shader* fshader = shader_manager_.CreateShader(
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1905 ProgramManagerWithCacheTest() 1941 ProgramManagerWithCacheTest()
1906 : cache_(new MockProgramCache()), 1942 : cache_(new MockProgramCache()),
1907 vertex_shader_(NULL), 1943 vertex_shader_(NULL),
1908 fragment_shader_(NULL), 1944 fragment_shader_(NULL),
1909 program_(NULL) { 1945 program_(NULL) {
1910 } 1946 }
1911 1947
1912 protected: 1948 protected:
1913 void SetupProgramManager() override { 1949 void SetupProgramManager() override {
1914 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors, 1950 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors,
1951 kMaxDualSourceDrawBuffers,
1915 feature_info_.get())); 1952 feature_info_.get()));
1916 } 1953 }
1917 1954
1918 void SetUp() override { 1955 void SetUp() override {
1919 ProgramManagerTestBase::SetUp(); 1956 ProgramManagerTestBase::SetUp();
1920 1957
1921 vertex_shader_ = shader_manager_.CreateShader( 1958 vertex_shader_ = shader_manager_.CreateShader(
1922 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 1959 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
1923 fragment_shader_ = shader_manager_.CreateShader( 1960 fragment_shader_ = shader_manager_.CreateShader(
1924 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); 1961 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
1925 ASSERT_TRUE(vertex_shader_ != NULL); 1962 ASSERT_TRUE(vertex_shader_ != NULL);
1926 ASSERT_TRUE(fragment_shader_ != NULL); 1963 ASSERT_TRUE(fragment_shader_ != NULL);
1927 vertex_shader_->set_source("lka asjf bjajsdfj"); 1964 vertex_shader_->set_source("lka asjf bjajsdfj");
1928 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj"); 1965 fragment_shader_->set_source("lka asjf a fasgag 3rdsf3 bjajsdfj");
1929 1966
1930 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId); 1967 program_ = manager_->CreateProgram(kClientProgramId, kServiceProgramId);
1931 ASSERT_TRUE(program_ != NULL); 1968 ASSERT_TRUE(program_ != NULL);
1932 1969
1933 program_->AttachShader(&shader_manager_, vertex_shader_); 1970 program_->AttachShader(&shader_manager_, vertex_shader_);
1934 program_->AttachShader(&shader_manager_, fragment_shader_); 1971 program_->AttachShader(&shader_manager_, fragment_shader_);
1935 } 1972 }
1973
1936 void TearDown() override { 1974 void TearDown() override {
1937 shader_manager_.Destroy(false); 1975 shader_manager_.Destroy(false);
1938 ProgramManagerTestBase::TearDown(); 1976 ProgramManagerTestBase::TearDown();
1939 } 1977 }
1978
1940 void SetShadersCompiled() { 1979 void SetShadersCompiled() {
1941 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); 1980 TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true);
1942 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); 1981 TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true);
1943 } 1982 }
1944 1983
1945 void SetProgramCached() { 1984 void SetProgramCached() {
1946 cache_->LinkedProgramCacheSuccess( 1985 cache_->LinkedProgramCacheSuccess(
1947 vertex_shader_->source(), 1986 vertex_shader_->source(),
1948 fragment_shader_->source(), 1987 fragment_shader_->source(),
1949 &program_->bind_attrib_location_map(), 1988 &program_->bind_attrib_location_map(),
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2014 program_->transform_feedback_buffer_mode(), 2053 program_->transform_feedback_buffer_mode(),
2015 _)) 2054 _))
2016 .WillOnce(Return(result)); 2055 .WillOnce(Return(result));
2017 } 2056 }
2018 2057
2019 void SetExpectationsForProgramLoadSuccess() { 2058 void SetExpectationsForProgramLoadSuccess() {
2020 SetExpectationsForProgramLoadSuccess(kServiceProgramId); 2059 SetExpectationsForProgramLoadSuccess(kServiceProgramId);
2021 } 2060 }
2022 2061
2023 void SetExpectationsForProgramLoadSuccess(GLuint service_program_id) { 2062 void SetExpectationsForProgramLoadSuccess(GLuint service_program_id) {
2024 TestHelper::SetupProgramSuccessExpectations(gl_.get(), feature_info_.get(), 2063 TestHelper::SetupProgramSuccessExpectations(
2025 nullptr, 0, nullptr, 0, nullptr, 2064 gl_.get(), feature_info_.get(), nullptr, 0, nullptr, 0, nullptr, 0,
2026 0, service_program_id); 2065 nullptr, 0, service_program_id);
2027 } 2066 }
2028 2067
2029 void SetExpectationsForProgramLink() { 2068 void SetExpectationsForProgramLink() {
2030 SetExpectationsForProgramLink(kServiceProgramId); 2069 SetExpectationsForProgramLink(kServiceProgramId);
2031 } 2070 }
2032 2071
2033 void SetExpectationsForProgramLink(GLuint service_program_id) { 2072 void SetExpectationsForProgramLink(GLuint service_program_id) {
2034 TestHelper::SetupShaderExpectations(gl_.get(), feature_info_.get(), nullptr, 2073 TestHelper::SetupShaderExpectations(gl_.get(), feature_info_.get(), nullptr,
2035 0, nullptr, 0, service_program_id); 2074 0, nullptr, 0, service_program_id);
2036 if (gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary) { 2075 if (gfx::g_driver_gl.ext.b_GL_ARB_get_program_binary) {
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
2124 void SetUp() override { 2163 void SetUp() override {
2125 base::CommandLine command_line(*base::CommandLine::ForCurrentProcess()); 2164 base::CommandLine command_line(*base::CommandLine::ForCurrentProcess());
2126 command_line.AppendSwitch(switches::kEnableGLPathRendering); 2165 command_line.AppendSwitch(switches::kEnableGLPathRendering);
2127 FeatureInfo* feature_info = new FeatureInfo(command_line); 2166 FeatureInfo* feature_info = new FeatureInfo(command_line);
2128 SetUpBase(testing::get<0>(GetParam()), testing::get<1>(GetParam()), 2167 SetUpBase(testing::get<0>(GetParam()), testing::get<1>(GetParam()),
2129 feature_info); 2168 feature_info);
2130 } 2169 }
2131 static const char* kFragmentInput1Name; 2170 static const char* kFragmentInput1Name;
2132 static const char* kFragmentInput1GoodName; 2171 static const char* kFragmentInput1GoodName;
2133 static const char* kFragmentInput2Name; 2172 static const char* kFragmentInput2Name;
2134 static const char* kFragmentInput2GoodName;
2135 static const char* kFragmentInput3Name; 2173 static const char* kFragmentInput3Name;
2136 static const char* kFragmentInput3GoodName; 2174 static const char* kFragmentInput3GoodName;
2137 static const GLint kFragmentInput1Size = 1; 2175 static const GLint kFragmentInput1Size = 1;
2138 static const GLint kFragmentInput2Size = 3; 2176 static const GLint kFragmentInput2Size = 3;
2139 static const GLint kFragmentInput3Size = 2; 2177 static const GLint kFragmentInput3Size = 2;
2140 static const int kFragmentInput1Precision = GL_LOW_FLOAT; 2178 static const int kFragmentInput1Precision = GL_LOW_FLOAT;
2141 static const int kFragmentInput2Precision = GL_MEDIUM_INT; 2179 static const int kFragmentInput2Precision = GL_MEDIUM_INT;
2142 static const int kFragmentInput3Precision = GL_HIGH_FLOAT; 2180 static const int kFragmentInput3Precision = GL_HIGH_FLOAT;
2143 static const int kFragmentInput1StaticUse = 1; 2181 static const int kFragmentInput1StaticUse = 1;
2144 static const int kFragmentInput2StaticUse = 1; 2182 static const int kFragmentInput2StaticUse = 1;
(...skipping 26 matching lines...) Expand all
2171 const GLint ProgramManagerWithPathRenderingTest::kFragmentInput3RealLocation; 2209 const GLint ProgramManagerWithPathRenderingTest::kFragmentInput3RealLocation;
2172 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput1Type; 2210 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput1Type;
2173 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput2Type; 2211 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput2Type;
2174 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput3Type; 2212 const GLenum ProgramManagerWithPathRenderingTest::kFragmentInput3Type;
2175 #endif 2213 #endif
2176 2214
2177 const char* ProgramManagerWithPathRenderingTest::kFragmentInput1Name = "color1"; 2215 const char* ProgramManagerWithPathRenderingTest::kFragmentInput1Name = "color1";
2178 const char* ProgramManagerWithPathRenderingTest::kFragmentInput1GoodName = 2216 const char* ProgramManagerWithPathRenderingTest::kFragmentInput1GoodName =
2179 "color1[0]"; 2217 "color1[0]";
2180 const char* ProgramManagerWithPathRenderingTest::kFragmentInput2Name = "color2"; 2218 const char* ProgramManagerWithPathRenderingTest::kFragmentInput2Name = "color2";
2181 const char* ProgramManagerWithPathRenderingTest::kFragmentInput2GoodName =
2182 "color2[0]";
2183 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3Name = "color3"; 2219 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3Name = "color3";
2184 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3GoodName = 2220 const char* ProgramManagerWithPathRenderingTest::kFragmentInput3GoodName =
2185 "color3[0]"; 2221 "color3[0]";
2186 2222
2187 TEST_P(ProgramManagerWithPathRenderingTest, BindFragmentInputLocation) { 2223 TEST_P(ProgramManagerWithPathRenderingTest, BindFragmentInputLocation) {
2188 const GLint kFragmentInput1DesiredLocation = 10; 2224 const GLint kFragmentInput1DesiredLocation = 10;
2189 const GLint kFragmentInput2DesiredLocation = -1; 2225 const GLint kFragmentInput2DesiredLocation = -1;
2190 const GLint kFragmentInput3DesiredLocation = 5; 2226 const GLint kFragmentInput3DesiredLocation = 5;
2191 2227
2192 Shader* vshader = shader_manager_.CreateShader( 2228 Shader* vshader = shader_manager_.CreateShader(
2193 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 2229 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
2194 ASSERT_TRUE(vshader != NULL); 2230 ASSERT_TRUE(vshader != NULL);
2195 Shader* fshader = shader_manager_.CreateShader( 2231 Shader* fshader = shader_manager_.CreateShader(
2196 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); 2232 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
2197 ASSERT_TRUE(fshader != NULL); 2233 ASSERT_TRUE(fshader != NULL);
2198 VaryingMap varying_map; 2234 VaryingMap varying_map;
2199 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying( 2235 varying_map[kFragmentInput1Name] = TestHelper::ConstructVarying(
2200 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision, 2236 kFragmentInput1Type, kFragmentInput1Size, kFragmentInput1Precision,
2201 kFragmentInput1StaticUse, kFragmentInput1Name); 2237 kFragmentInput1StaticUse, kFragmentInput1Name);
2202 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying( 2238 varying_map[kFragmentInput2Name] = TestHelper::ConstructVarying(
2203 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision, 2239 kFragmentInput2Type, kFragmentInput2Size, kFragmentInput2Precision,
2204 kFragmentInput2StaticUse, kFragmentInput2Name); 2240 kFragmentInput2StaticUse, kFragmentInput2Name);
2205 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying( 2241 varying_map[kFragmentInput3Name] = TestHelper::ConstructVarying(
2206 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision, 2242 kFragmentInput3Type, kFragmentInput3Size, kFragmentInput3Precision,
2207 kFragmentInput3StaticUse, kFragmentInput3Name); 2243 kFragmentInput3StaticUse, kFragmentInput3Name);
2208 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr, 2244 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
2209 nullptr, nullptr, nullptr, &varying_map, nullptr); 2245 nullptr, nullptr, nullptr, &varying_map, nullptr,
2246 nullptr);
2210 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr, 2247 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
2211 nullptr, nullptr, nullptr, &varying_map, nullptr); 2248 nullptr, nullptr, nullptr, &varying_map, nullptr,
2249 nullptr);
2212 Program* program = 2250 Program* program =
2213 manager_->CreateProgram(kClientProgramId, kServiceProgramId); 2251 manager_->CreateProgram(kClientProgramId, kServiceProgramId);
2214 ASSERT_TRUE(program != NULL); 2252 ASSERT_TRUE(program != NULL);
2215 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); 2253 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
2216 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); 2254 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
2217 EXPECT_TRUE(program->SetFragmentInputLocationBinding( 2255 EXPECT_TRUE(program->SetFragmentInputLocationBinding(
2218 kFragmentInput1Name, kFragmentInput1DesiredLocation)); 2256 kFragmentInput1Name, kFragmentInput1DesiredLocation));
2219 EXPECT_TRUE(program->SetFragmentInputLocationBinding( 2257 EXPECT_TRUE(program->SetFragmentInputLocationBinding(
2220 kFragmentInput3Name, kFragmentInput3DesiredLocation)); 2258 kFragmentInput3Name, kFragmentInput3DesiredLocation));
2221 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = { 2259 TestHelper::VaryingInfo kFragmentInputExpectationInfos[] = {
2222 { 2260 {
2223 kFragmentInput1Name, kFragmentInput1Size, kFragmentInput1Type, 2261 kFragmentInput1Name, kFragmentInput1Size, kFragmentInput1Type,
2224 kFragmentInput1FakeLocation, kFragmentInput1RealLocation, 2262 kFragmentInput1FakeLocation, kFragmentInput1RealLocation,
2225 kFragmentInput1DesiredLocation, 2263 kFragmentInput1DesiredLocation,
2226 }, 2264 },
2227 { 2265 {
2228 kFragmentInput2Name, kFragmentInput2Size, kFragmentInput2Type, 2266 kFragmentInput2Name, kFragmentInput2Size, kFragmentInput2Type,
2229 kFragmentInput2FakeLocation, kFragmentInput2RealLocation, 2267 kFragmentInput2FakeLocation, kFragmentInput2RealLocation,
2230 kFragmentInput2DesiredLocation, 2268 kFragmentInput2DesiredLocation,
2231 }, 2269 },
2232 { 2270 {
2233 kFragmentInput3Name, kFragmentInput3Size, kFragmentInput3Type, 2271 kFragmentInput3Name, kFragmentInput3Size, kFragmentInput3Type,
2234 kFragmentInput3FakeLocation, kFragmentInput3RealLocation, 2272 kFragmentInput3FakeLocation, kFragmentInput3RealLocation,
2235 kFragmentInput3DesiredLocation, 2273 kFragmentInput3DesiredLocation,
2236 }, 2274 },
2237 }; 2275 };
2238 TestHelper::SetupShaderExpectationsWithVaryings( 2276 TestHelper::SetupShaderExpectationsWithVaryings(
2239 gl_.get(), feature_info_.get(), nullptr, 0, nullptr, 0, 2277 gl_.get(), feature_info_.get(), nullptr, 0, nullptr, 0,
2240 kFragmentInputExpectationInfos, arraysize(kFragmentInputExpectationInfos), 2278 kFragmentInputExpectationInfos, arraysize(kFragmentInputExpectationInfos),
2241 kServiceProgramId); 2279 nullptr, 0, kServiceProgramId);
2242 program->Link(NULL, Program::kCountOnlyStaticallyUsed, 2280 program->Link(NULL, Program::kCountOnlyStaticallyUsed,
2243 base::Bind(&ShaderCacheCb)); 2281 base::Bind(&ShaderCacheCb));
2244 GLint loc1 = 0; 2282 GLint loc1 = 0;
2245 const Program::FragmentInputInfo* info1 = 2283 const Program::FragmentInputInfo* info1 =
2246 program->GetFragmentInputInfoByFakeLocation( 2284 program->GetFragmentInputInfoByFakeLocation(
2247 kFragmentInput1DesiredLocation, &loc1); 2285 kFragmentInput1DesiredLocation, &loc1);
2248 ASSERT_NE(info1, nullptr); 2286 ASSERT_NE(info1, nullptr);
2249 EXPECT_EQ(kFragmentInput1GoodName, info1->name); 2287 EXPECT_EQ(kFragmentInput1GoodName, info1->name);
2250 EXPECT_EQ(kFragmentInput1RealLocation, info1->location); 2288 EXPECT_EQ(kFragmentInput1RealLocation, info1->location);
2251 EXPECT_EQ(kFragmentInput1RealLocation, loc1); 2289 EXPECT_EQ(kFragmentInput1RealLocation, loc1);
(...skipping 20 matching lines...) Expand all
2272 INSTANTIATE_TEST_CASE_P( 2310 INSTANTIATE_TEST_CASE_P(
2273 SupportedContexts, 2311 SupportedContexts,
2274 ProgramManagerWithPathRenderingTest, 2312 ProgramManagerWithPathRenderingTest,
2275 testing::Values( 2313 testing::Values(
2276 make_gl_ext_tuple("3.2", 2314 make_gl_ext_tuple("3.2",
2277 "GL_ARB_program_interface_query " 2315 "GL_ARB_program_interface_query "
2278 "GL_EXT_direct_state_access GL_NV_path_rendering"), 2316 "GL_EXT_direct_state_access GL_NV_path_rendering"),
2279 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"), 2317 make_gl_ext_tuple("4.5", "GL_NV_path_rendering"),
2280 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering"))); 2318 make_gl_ext_tuple("opengl es 3.1", "GL_NV_path_rendering")));
2281 2319
2320 class ProgramManagerDualSourceBlendingTest
2321 : public ProgramManagerWithShaderTest,
2322 public testing::WithParamInterface<
2323 testing::tuple<const char*, const char*>> {
2324 public:
2325 ProgramManagerDualSourceBlendingTest() {}
2326
2327 protected:
2328 void SetUpWithFeatureInfo(FeatureInfo* feature_info) {
2329 const char* gl_version = testing::get<0>(GetParam());
2330 const char* gl_extensions = testing::get<1>(GetParam());
2331 SetUpBase(gl_version, gl_extensions, feature_info);
2332 }
2333
2334 void SetUp() override { SetUpWithFeatureInfo(nullptr); }
2335 };
2336
2337 class ProgramManagerDualSourceBlendingES2Test
2338 : public ProgramManagerDualSourceBlendingTest {};
2339
2340 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragCoord) {
2341 DCHECK(feature_info_->feature_flags().ext_blend_func_extended);
2342
2343 const VarInfo kFragmentVaryings[] = {
2344 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_SecondaryFragColorEXT",
2345 kVarOutput},
2346 {GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_FragColor", kVarOutput},
2347 };
2348
2349 int shader_version = 100;
2350 Program* program =
2351 SetupProgramForVariables(nullptr, 0, kFragmentVaryings,
2352 arraysize(kFragmentVaryings), &shader_version);
2353
2354 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info();
2355 if (!gl_version.is_es) {
2356 // The call is expected only for OpenGL. OpenGL ES expects to
2357 // output GLES SL 1.00, which does not bind.
2358 EXPECT_CALL(*(gl_.get()),
2359 BindFragDataLocationIndexed(kServiceProgramId, 0, 1,
2360 StrEq("angle_SecondaryFragColor")))
2361 .Times(1)
2362 .RetiresOnSaturation();
2363 }
2364
2365 EXPECT_TRUE(LinkAsExpected(program, true));
2366 }
2367
2368 TEST_P(ProgramManagerDualSourceBlendingES2Test, UseSecondaryFragData) {
2369 const VarInfo kFragmentVaryings[] = {
2370 {GL_FLOAT_VEC4, kMaxDualSourceDrawBuffers, GL_MEDIUM_FLOAT, true,
2371 "gl_SecondaryFragDataEXT", kVarOutput},
2372 {GL_FLOAT_VEC4, kMaxDrawBuffers, GL_MEDIUM_FLOAT, true, "gl_FragData",
2373 kVarOutput},
2374 };
2375
2376 int shader_version = 100;
2377 Program* program =
2378 SetupProgramForVariables(nullptr, 0, kFragmentVaryings,
2379 arraysize(kFragmentVaryings), &shader_version);
2380
2381 const gfx::GLVersionInfo& gl_version = feature_info_->gl_version_info();
2382 if (!gl_version.is_es) {
2383 // The call is expected only for OpenGL. OpenGL ES expects to
2384 // output GLES SL 1.00, which does not bind.
2385 EXPECT_CALL(*(gl_.get()),
2386 BindFragDataLocationIndexed(kServiceProgramId, 0, 1,
2387 StrEq("angle_SecondaryFragData")))
2388 .Times(1)
2389 .RetiresOnSaturation();
2390 }
2391
2392 EXPECT_TRUE(LinkAsExpected(program, true));
2393 }
2394
2395 INSTANTIATE_TEST_CASE_P(
2396 SupportedContexts,
2397 ProgramManagerDualSourceBlendingES2Test,
2398 testing::Values(
2399 testing::make_tuple("3.2",
2400 "GL_ARB_draw_buffers GL_ARB_blend_func_extended "
2401 "GL_ARB_program_interface_query"),
2402 testing::make_tuple("opengl es 3.1",
2403 "GL_EXT_draw_buffers GL_EXT_blend_func_extended")));
2404
2282 } // namespace gles2 2405 } // namespace gles2
2283 } // namespace gpu 2406 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698