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

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

Powered by Google App Engine
This is Rietveld 408576698