OLD | NEW |
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 <stddef.h> |
| 8 #include <stdint.h> |
| 9 |
7 #include <algorithm> | 10 #include <algorithm> |
8 | 11 |
9 #include "base/command_line.h" | 12 #include "base/command_line.h" |
10 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
11 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
12 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
13 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 16 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
14 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 17 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
15 #include "gpu/command_buffer/service/common_decoder.h" | 18 #include "gpu/command_buffer/service/common_decoder.h" |
16 #include "gpu/command_buffer/service/feature_info.h" | 19 #include "gpu/command_buffer/service/feature_info.h" |
(...skipping 14 matching lines...) Expand all Loading... |
31 using ::testing::Return; | 34 using ::testing::Return; |
32 using ::testing::ReturnRef; | 35 using ::testing::ReturnRef; |
33 using ::testing::SetArrayArgument; | 36 using ::testing::SetArrayArgument; |
34 using ::testing::SetArgPointee; | 37 using ::testing::SetArgPointee; |
35 using ::testing::StrEq; | 38 using ::testing::StrEq; |
36 | 39 |
37 namespace gpu { | 40 namespace gpu { |
38 namespace gles2 { | 41 namespace gles2 { |
39 | 42 |
40 namespace { | 43 namespace { |
41 const uint32 kMaxVaryingVectors = 8; | 44 const uint32_t kMaxVaryingVectors = 8; |
42 const uint32 kMaxDrawBuffers = 8; | 45 const uint32_t kMaxDrawBuffers = 8; |
43 const uint32 kMaxDualSourceDrawBuffers = 8; | 46 const uint32_t kMaxDualSourceDrawBuffers = 8; |
44 | 47 |
45 void ShaderCacheCb(const std::string& key, const std::string& shader) {} | 48 void ShaderCacheCb(const std::string& key, const std::string& shader) {} |
46 | 49 |
47 uint32 ComputeOffset(const void* start, const void* position) { | 50 uint32_t ComputeOffset(const void* start, const void* position) { |
48 return static_cast<const uint8*>(position) - | 51 return static_cast<const uint8_t*>(position) - |
49 static_cast<const uint8*>(start); | 52 static_cast<const uint8_t*>(start); |
50 } | 53 } |
51 | 54 |
52 } // namespace anonymous | 55 } // namespace anonymous |
53 | 56 |
54 class ProgramManagerTestBase : public GpuServiceTest { | 57 class ProgramManagerTestBase : public GpuServiceTest { |
55 protected: | 58 protected: |
56 virtual void SetupProgramManager() { | 59 virtual void SetupProgramManager() { |
57 manager_.reset(new ProgramManager(nullptr, kMaxVaryingVectors, | 60 manager_.reset(new ProgramManager(nullptr, kMaxVaryingVectors, |
58 kMaxDualSourceDrawBuffers, | 61 kMaxDualSourceDrawBuffers, |
59 feature_info_.get())); | 62 feature_info_.get())); |
(...skipping 995 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1055 ASSERT_TRUE(header != NULL); | 1058 ASSERT_TRUE(header != NULL); |
1056 EXPECT_EQ(1u, header->link_status); | 1059 EXPECT_EQ(1u, header->link_status); |
1057 EXPECT_EQ(arraysize(kAttribs), header->num_attribs); | 1060 EXPECT_EQ(arraysize(kAttribs), header->num_attribs); |
1058 EXPECT_EQ(arraysize(kUniforms), header->num_uniforms); | 1061 EXPECT_EQ(arraysize(kUniforms), header->num_uniforms); |
1059 const ProgramInput* inputs = bucket.GetDataAs<const ProgramInput*>( | 1062 const ProgramInput* inputs = bucket.GetDataAs<const ProgramInput*>( |
1060 sizeof(*header), | 1063 sizeof(*header), |
1061 sizeof(ProgramInput) * (header->num_attribs + header->num_uniforms)); | 1064 sizeof(ProgramInput) * (header->num_attribs + header->num_uniforms)); |
1062 ASSERT_TRUE(inputs != NULL); | 1065 ASSERT_TRUE(inputs != NULL); |
1063 const ProgramInput* input = inputs; | 1066 const ProgramInput* input = inputs; |
1064 // TODO(gman): Don't assume these are in order. | 1067 // TODO(gman): Don't assume these are in order. |
1065 for (uint32 ii = 0; ii < header->num_attribs; ++ii) { | 1068 for (uint32_t ii = 0; ii < header->num_attribs; ++ii) { |
1066 const AttribInfo& expected = kAttribs[ii]; | 1069 const AttribInfo& expected = kAttribs[ii]; |
1067 EXPECT_EQ(expected.size, input->size); | 1070 EXPECT_EQ(expected.size, input->size); |
1068 EXPECT_EQ(expected.type, input->type); | 1071 EXPECT_EQ(expected.type, input->type); |
1069 const int32* location = bucket.GetDataAs<const int32*>( | 1072 const int32_t* location = bucket.GetDataAs<const int32_t*>( |
1070 input->location_offset, sizeof(int32)); | 1073 input->location_offset, sizeof(int32_t)); |
1071 ASSERT_TRUE(location != NULL); | 1074 ASSERT_TRUE(location != NULL); |
1072 EXPECT_EQ(expected.location, *location); | 1075 EXPECT_EQ(expected.location, *location); |
1073 const char* name_buf = bucket.GetDataAs<const char*>( | 1076 const char* name_buf = bucket.GetDataAs<const char*>( |
1074 input->name_offset, input->name_length); | 1077 input->name_offset, input->name_length); |
1075 ASSERT_TRUE(name_buf != NULL); | 1078 ASSERT_TRUE(name_buf != NULL); |
1076 std::string name(name_buf, input->name_length); | 1079 std::string name(name_buf, input->name_length); |
1077 EXPECT_STREQ(expected.name, name.c_str()); | 1080 EXPECT_STREQ(expected.name, name.c_str()); |
1078 ++input; | 1081 ++input; |
1079 } | 1082 } |
1080 // TODO(gman): Don't assume these are in order. | 1083 // TODO(gman): Don't assume these are in order. |
1081 for (uint32 ii = 0; ii < header->num_uniforms; ++ii) { | 1084 for (uint32_t ii = 0; ii < header->num_uniforms; ++ii) { |
1082 const UniformInfo& expected = kUniforms[ii]; | 1085 const UniformInfo& expected = kUniforms[ii]; |
1083 EXPECT_EQ(expected.size, input->size); | 1086 EXPECT_EQ(expected.size, input->size); |
1084 EXPECT_EQ(expected.type, input->type); | 1087 EXPECT_EQ(expected.type, input->type); |
1085 const int32* locations = bucket.GetDataAs<const int32*>( | 1088 const int32_t* locations = bucket.GetDataAs<const int32_t*>( |
1086 input->location_offset, sizeof(int32) * input->size); | 1089 input->location_offset, sizeof(int32_t) * input->size); |
1087 ASSERT_TRUE(locations != NULL); | 1090 ASSERT_TRUE(locations != NULL); |
1088 for (int32 jj = 0; jj < input->size; ++jj) { | 1091 for (int32_t jj = 0; jj < input->size; ++jj) { |
1089 EXPECT_EQ( | 1092 EXPECT_EQ( |
1090 ProgramManager::MakeFakeLocation(expected.fake_location, jj), | 1093 ProgramManager::MakeFakeLocation(expected.fake_location, jj), |
1091 locations[jj]); | 1094 locations[jj]); |
1092 } | 1095 } |
1093 const char* name_buf = bucket.GetDataAs<const char*>( | 1096 const char* name_buf = bucket.GetDataAs<const char*>( |
1094 input->name_offset, input->name_length); | 1097 input->name_offset, input->name_length); |
1095 ASSERT_TRUE(name_buf != NULL); | 1098 ASSERT_TRUE(name_buf != NULL); |
1096 std::string name(name_buf, input->name_length); | 1099 std::string name(name_buf, input->name_length); |
1097 EXPECT_STREQ(expected.good_name, name.c_str()); | 1100 EXPECT_STREQ(expected.good_name, name.c_str()); |
1098 ++input; | 1101 ++input; |
1099 } | 1102 } |
1100 EXPECT_EQ(header->num_attribs + header->num_uniforms, | 1103 EXPECT_EQ(header->num_attribs + header->num_uniforms, |
1101 static_cast<uint32>(input - inputs)); | 1104 static_cast<uint32_t>(input - inputs)); |
1102 } | 1105 } |
1103 | 1106 |
1104 TEST_F(ProgramManagerWithShaderTest, ProgramInfoGetUniformBlocksNone) { | 1107 TEST_F(ProgramManagerWithShaderTest, ProgramInfoGetUniformBlocksNone) { |
1105 CommonDecoder::Bucket bucket; | 1108 CommonDecoder::Bucket bucket; |
1106 const Program* program = SetupDefaultProgram(); | 1109 const Program* program = SetupDefaultProgram(); |
1107 ASSERT_TRUE(program != NULL); | 1110 ASSERT_TRUE(program != NULL); |
1108 // The program's previous link failed. | 1111 // The program's previous link failed. |
1109 EXPECT_CALL(*(gl_.get()), | 1112 EXPECT_CALL(*(gl_.get()), |
1110 GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _)) | 1113 GetProgramiv(kServiceProgramId, GL_LINK_STATUS, _)) |
1111 .WillOnce(SetArgPointee<2>(GL_FALSE)) | 1114 .WillOnce(SetArgPointee<2>(GL_FALSE)) |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1487 bucket.GetDataAs<ProgramInfoHeader*>(0, sizeof(ProgramInfoHeader)); | 1490 bucket.GetDataAs<ProgramInfoHeader*>(0, sizeof(ProgramInfoHeader)); |
1488 ASSERT_TRUE(header != NULL); | 1491 ASSERT_TRUE(header != NULL); |
1489 EXPECT_EQ(1u, header->link_status); | 1492 EXPECT_EQ(1u, header->link_status); |
1490 EXPECT_EQ(arraysize(kAttribs), header->num_attribs); | 1493 EXPECT_EQ(arraysize(kAttribs), header->num_attribs); |
1491 EXPECT_EQ(arraysize(kUniforms), header->num_uniforms); | 1494 EXPECT_EQ(arraysize(kUniforms), header->num_uniforms); |
1492 const ProgramInput* inputs = bucket.GetDataAs<const ProgramInput*>( | 1495 const ProgramInput* inputs = bucket.GetDataAs<const ProgramInput*>( |
1493 sizeof(*header), | 1496 sizeof(*header), |
1494 sizeof(ProgramInput) * (header->num_attribs + header->num_uniforms)); | 1497 sizeof(ProgramInput) * (header->num_attribs + header->num_uniforms)); |
1495 ASSERT_TRUE(inputs != NULL); | 1498 ASSERT_TRUE(inputs != NULL); |
1496 const ProgramInput* input = inputs + header->num_attribs; | 1499 const ProgramInput* input = inputs + header->num_attribs; |
1497 for (uint32 ii = 0; ii < header->num_uniforms; ++ii) { | 1500 for (uint32_t ii = 0; ii < header->num_uniforms; ++ii) { |
1498 const UniformInfo& expected = kUniforms[ii]; | 1501 const UniformInfo& expected = kUniforms[ii]; |
1499 EXPECT_EQ(expected.size, input->size); | 1502 EXPECT_EQ(expected.size, input->size); |
1500 const int32* locations = bucket.GetDataAs<const int32*>( | 1503 const int32_t* locations = bucket.GetDataAs<const int32_t*>( |
1501 input->location_offset, sizeof(int32) * input->size); | 1504 input->location_offset, sizeof(int32_t) * input->size); |
1502 ASSERT_TRUE(locations != NULL); | 1505 ASSERT_TRUE(locations != NULL); |
1503 EXPECT_EQ( | 1506 EXPECT_EQ( |
1504 ProgramManager::MakeFakeLocation(expected.fake_location, 0), | 1507 ProgramManager::MakeFakeLocation(expected.fake_location, 0), |
1505 locations[0]); | 1508 locations[0]); |
1506 for (int32 jj = 1; jj < input->size; ++jj) | 1509 for (int32_t jj = 1; jj < input->size; ++jj) |
1507 EXPECT_EQ(-1, locations[jj]); | 1510 EXPECT_EQ(-1, locations[jj]); |
1508 ++input; | 1511 ++input; |
1509 } | 1512 } |
1510 } | 1513 } |
1511 | 1514 |
1512 TEST_F(ProgramManagerWithShaderTest, BindAttribLocationConflicts) { | 1515 TEST_F(ProgramManagerWithShaderTest, BindAttribLocationConflicts) { |
1513 // Set up shader | 1516 // Set up shader |
1514 AttributeMap attrib_map; | 1517 AttributeMap attrib_map; |
1515 for (uint32 ii = 0; ii < kNumAttribs; ++ii) { | 1518 for (uint32_t ii = 0; ii < kNumAttribs; ++ii) { |
1516 attrib_map[kAttribs[ii].name] = TestHelper::ConstructAttribute( | 1519 attrib_map[kAttribs[ii].name] = TestHelper::ConstructAttribute( |
1517 kAttribs[ii].type, | 1520 kAttribs[ii].type, |
1518 kAttribs[ii].size, | 1521 kAttribs[ii].size, |
1519 GL_MEDIUM_FLOAT, | 1522 GL_MEDIUM_FLOAT, |
1520 kAttribStaticUse, | 1523 kAttribStaticUse, |
1521 kAttribs[ii].name); | 1524 kAttribs[ii].name); |
1522 } | 1525 } |
1523 const char kAttribMatName[] = "matAttrib"; | 1526 const char kAttribMatName[] = "matAttrib"; |
1524 attrib_map[kAttribMatName] = TestHelper::ConstructAttribute( | 1527 attrib_map[kAttribMatName] = TestHelper::ConstructAttribute( |
1525 GL_FLOAT_MAT2, | 1528 GL_FLOAT_MAT2, |
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2389 ProgramManagerDualSourceBlendingES2Test, | 2392 ProgramManagerDualSourceBlendingES2Test, |
2390 testing::Values( | 2393 testing::Values( |
2391 make_gl_ext_tuple("3.2", | 2394 make_gl_ext_tuple("3.2", |
2392 "GL_ARB_draw_buffers GL_ARB_blend_func_extended " | 2395 "GL_ARB_draw_buffers GL_ARB_blend_func_extended " |
2393 "GL_ARB_program_interface_query"), | 2396 "GL_ARB_program_interface_query"), |
2394 make_gl_ext_tuple("opengl es 3.1", | 2397 make_gl_ext_tuple("opengl es 3.1", |
2395 "GL_EXT_draw_buffers GL_EXT_blend_func_extended"))); | 2398 "GL_EXT_draw_buffers GL_EXT_blend_func_extended"))); |
2396 | 2399 |
2397 } // namespace gles2 | 2400 } // namespace gles2 |
2398 } // namespace gpu | 2401 } // namespace gpu |
OLD | NEW |