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

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

Issue 998423005: Updated shader program caching to account for transform feedback varyings (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed zmo@'s feedback Created 5 years, 9 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_cache.h" 5 #include "gpu/command_buffer/service/program_cache.h"
6 6
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "gpu/command_buffer/service/mocks.h" 8 #include "gpu/command_buffer/service/mocks.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 10
11 using ::testing::Return; 11 using ::testing::Return;
12 12
13 namespace gpu { 13 namespace gpu {
14 namespace gles2 { 14 namespace gles2 {
15 15
16 class NoBackendProgramCache : public ProgramCache { 16 class NoBackendProgramCache : public ProgramCache {
17 public: 17 public:
18 ProgramLoadResult LoadLinkedProgram( 18 ProgramLoadResult LoadLinkedProgram(
19 GLuint /* program */, 19 GLuint /* program */,
20 Shader* /* shader_a */, 20 Shader* /* shader_a */,
21 Shader* /* shader_b */, 21 Shader* /* shader_b */,
22 const LocationMap* /* bind_attrib_location_map */, 22 const LocationMap* /* bind_attrib_location_map */,
23 const std::vector<std::string>* /* transform_feedback_varyings */,
24 GLenum /* transform_feedback_buffer_mode */,
23 const ShaderCacheCallback& /* callback */) override { 25 const ShaderCacheCallback& /* callback */) override {
24 return PROGRAM_LOAD_SUCCESS; 26 return PROGRAM_LOAD_SUCCESS;
25 } 27 }
26 void SaveLinkedProgram(GLuint /* program */, 28 void SaveLinkedProgram(
27 const Shader* /* shader_a */, 29 GLuint /* program */,
28 const Shader* /* shader_b */, 30 const Shader* /* shader_a */,
29 const LocationMap* /* bind_attrib_location_map */, 31 const Shader* /* shader_b */,
30 const ShaderCacheCallback& /* callback */) override {} 32 const LocationMap* /* bind_attrib_location_map */,
33 const std::vector<std::string>* /* transform_feedback_varyings */,
34 GLenum /* transform_feedback_buffer_mode */,
35 const ShaderCacheCallback& /* callback */) override {}
31 36
32 void LoadProgram(const std::string& /* program */) override {} 37 void LoadProgram(const std::string& /* program */) override {}
33 38
34 void ClearBackend() override {} 39 void ClearBackend() override {}
35 40
36 void SaySuccessfullyCached(const std::string& shader1, 41 void SaySuccessfullyCached(const std::string& shader1,
37 const std::string& shader2, 42 const std::string& shader2,
38 std::map<std::string, GLint>* attrib_map) { 43 std::map<std::string, GLint>* attrib_map,
44 const std::vector<std::string>* varyings,
45 GLenum buffer_mode) {
39 char a_sha[kHashLength]; 46 char a_sha[kHashLength];
40 char b_sha[kHashLength]; 47 char b_sha[kHashLength];
41 ComputeShaderHash(shader1, a_sha); 48 ComputeShaderHash(shader1, a_sha);
42 ComputeShaderHash(shader2, b_sha); 49 ComputeShaderHash(shader2, b_sha);
43 50
44 char sha[kHashLength]; 51 char sha[kHashLength];
45 ComputeProgramHash(a_sha, 52 ComputeProgramHash(a_sha,
46 b_sha, 53 b_sha,
47 attrib_map, 54 attrib_map,
55 varyings,
56 buffer_mode,
48 sha); 57 sha);
49 const std::string shaString(sha, kHashLength); 58 const std::string shaString(sha, kHashLength);
50 59
51 LinkedProgramCacheSuccess(shaString); 60 LinkedProgramCacheSuccess(shaString);
52 } 61 }
53 62
54 void ComputeShaderHash(const std::string& shader, 63 void ComputeShaderHash(const std::string& shader,
55 char* result) const { 64 char* result) const {
56 ProgramCache::ComputeShaderHash(shader, result); 65 ProgramCache::ComputeShaderHash(shader, result);
57 } 66 }
58 67
59 void ComputeProgramHash(const char* hashed_shader_0, 68 void ComputeProgramHash(
60 const char* hashed_shader_1, 69 const char* hashed_shader_0,
61 const LocationMap* bind_attrib_location_map, 70 const char* hashed_shader_1,
62 char* result) const { 71 const LocationMap* bind_attrib_location_map,
72 const std::vector<std::string>* transform_feedback_varyings,
73 GLenum transform_feedback_buffer_mode,
74 char* result) const {
63 ProgramCache::ComputeProgramHash(hashed_shader_0, 75 ProgramCache::ComputeProgramHash(hashed_shader_0,
64 hashed_shader_1, 76 hashed_shader_1,
65 bind_attrib_location_map, 77 bind_attrib_location_map,
78 transform_feedback_varyings,
79 transform_feedback_buffer_mode,
66 result); 80 result);
67 } 81 }
68 82
69 void Evict(const std::string& program_hash) { 83 void Evict(const std::string& program_hash) {
70 ProgramCache::Evict(program_hash); 84 ProgramCache::Evict(program_hash);
71 } 85 }
72 }; 86 };
73 87
74 class ProgramCacheTest : public testing::Test { 88 class ProgramCacheTest : public testing::Test {
75 public: 89 public:
76 ProgramCacheTest() : 90 ProgramCacheTest() :
77 cache_(new NoBackendProgramCache()) { } 91 cache_(new NoBackendProgramCache()) { }
78 92
79 protected: 93 protected:
80 scoped_ptr<NoBackendProgramCache> cache_; 94 scoped_ptr<NoBackendProgramCache> cache_;
81 }; 95 };
82 96
83 TEST_F(ProgramCacheTest, LinkStatusSave) { 97 TEST_F(ProgramCacheTest, LinkStatusSave) {
84 const std::string shader1 = "abcd1234"; 98 const std::string shader1 = "abcd1234";
85 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; 99 const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
86 { 100 {
87 std::string shader_a = shader1; 101 std::string shader_a = shader1;
88 std::string shader_b = shader2; 102 std::string shader_b = shader2;
89 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, 103 EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
90 cache_->GetLinkedProgramStatus( 104 cache_->GetLinkedProgramStatus(
91 shader_a, shader_b, NULL)); 105 shader_a, shader_b, NULL, NULL, GL_NONE));
92 cache_->SaySuccessfullyCached(shader_a, shader_b, NULL); 106 cache_->SaySuccessfullyCached(shader_a, shader_b, NULL, NULL, GL_NONE);
93 107
94 shader_a.clear(); 108 shader_a.clear();
95 shader_b.clear(); 109 shader_b.clear();
96 } 110 }
97 // make sure it was copied 111 // make sure it was copied
98 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, 112 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED,
99 cache_->GetLinkedProgramStatus( 113 cache_->GetLinkedProgramStatus(
100 shader1, shader2, NULL)); 114 shader1, shader2, NULL, NULL, GL_NONE));
101 } 115 }
102 116
103 TEST_F(ProgramCacheTest, LinkUnknownOnFragmentSourceChange) { 117 TEST_F(ProgramCacheTest, LinkUnknownOnFragmentSourceChange) {
104 const std::string shader1 = "abcd1234"; 118 const std::string shader1 = "abcd1234";
105 std::string shader2 = "abcda sda b1~#4 bbbbb1234"; 119 std::string shader2 = "abcda sda b1~#4 bbbbb1234";
106 cache_->SaySuccessfullyCached(shader1, shader2, NULL); 120 cache_->SaySuccessfullyCached(shader1, shader2, NULL, NULL, GL_NONE);
107 121
108 shader2 = "different!"; 122 shader2 = "different!";
109 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, 123 EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
110 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); 124 cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
125 NULL, GL_NONE));
111 } 126 }
112 127
113 TEST_F(ProgramCacheTest, LinkUnknownOnVertexSourceChange) { 128 TEST_F(ProgramCacheTest, LinkUnknownOnVertexSourceChange) {
114 std::string shader1 = "abcd1234"; 129 std::string shader1 = "abcd1234";
115 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; 130 const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
116 cache_->SaySuccessfullyCached(shader1, shader2, NULL); 131 cache_->SaySuccessfullyCached(shader1, shader2, NULL, NULL, GL_NONE);
117 132
118 shader1 = "different!"; 133 shader1 = "different!";
119 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, 134 EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
120 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); 135 cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
136 NULL, GL_NONE));
121 } 137 }
piman 2015/03/13 18:32:10 Can you add a test for the new code? If you change
122 138
123 TEST_F(ProgramCacheTest, StatusEviction) { 139 TEST_F(ProgramCacheTest, StatusEviction) {
124 const std::string shader1 = "abcd1234"; 140 const std::string shader1 = "abcd1234";
125 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; 141 const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
126 cache_->SaySuccessfullyCached(shader1, shader2, NULL); 142 cache_->SaySuccessfullyCached(shader1, shader2, NULL, NULL, GL_NONE);
127 char a_sha[ProgramCache::kHashLength]; 143 char a_sha[ProgramCache::kHashLength];
128 char b_sha[ProgramCache::kHashLength]; 144 char b_sha[ProgramCache::kHashLength];
129 cache_->ComputeShaderHash(shader1, a_sha); 145 cache_->ComputeShaderHash(shader1, a_sha);
130 cache_->ComputeShaderHash(shader2, b_sha); 146 cache_->ComputeShaderHash(shader2, b_sha);
131 147
132 char sha[ProgramCache::kHashLength]; 148 char sha[ProgramCache::kHashLength];
133 cache_->ComputeProgramHash(a_sha, 149 cache_->ComputeProgramHash(a_sha,
134 b_sha, 150 b_sha,
135 NULL, 151 NULL,
152 NULL,
153 GL_NONE,
136 sha); 154 sha);
137 cache_->Evict(std::string(sha, ProgramCache::kHashLength)); 155 cache_->Evict(std::string(sha, ProgramCache::kHashLength));
138 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, 156 EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
139 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); 157 cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
158 NULL, GL_NONE));
140 } 159 }
141 160
142 TEST_F(ProgramCacheTest, EvictionWithReusedShader) { 161 TEST_F(ProgramCacheTest, EvictionWithReusedShader) {
143 const std::string shader1 = "abcd1234"; 162 const std::string shader1 = "abcd1234";
144 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; 163 const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
145 const std::string shader3 = "asbjbbjj239a"; 164 const std::string shader3 = "asbjbbjj239a";
146 cache_->SaySuccessfullyCached(shader1, shader2, NULL); 165 cache_->SaySuccessfullyCached(shader1, shader2, NULL, NULL, GL_NONE);
147 cache_->SaySuccessfullyCached(shader1, shader3, NULL); 166 cache_->SaySuccessfullyCached(shader1, shader3, NULL, NULL, GL_NONE);
148 167
149 char a_sha[ProgramCache::kHashLength]; 168 char a_sha[ProgramCache::kHashLength];
150 char b_sha[ProgramCache::kHashLength]; 169 char b_sha[ProgramCache::kHashLength];
151 char c_sha[ProgramCache::kHashLength]; 170 char c_sha[ProgramCache::kHashLength];
152 cache_->ComputeShaderHash(shader1, a_sha); 171 cache_->ComputeShaderHash(shader1, a_sha);
153 cache_->ComputeShaderHash(shader2, b_sha); 172 cache_->ComputeShaderHash(shader2, b_sha);
154 cache_->ComputeShaderHash(shader3, c_sha); 173 cache_->ComputeShaderHash(shader3, c_sha);
155 174
156 char sha[ProgramCache::kHashLength]; 175 char sha[ProgramCache::kHashLength];
157 cache_->ComputeProgramHash(a_sha, 176 cache_->ComputeProgramHash(a_sha,
158 b_sha, 177 b_sha,
159 NULL, 178 NULL,
179 NULL,
180 GL_NONE,
160 sha); 181 sha);
161 cache_->Evict(std::string(sha, ProgramCache::kHashLength)); 182 cache_->Evict(std::string(sha, ProgramCache::kHashLength));
162 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, 183 EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
163 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); 184 cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
185 NULL, GL_NONE));
164 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, 186 EXPECT_EQ(ProgramCache::LINK_SUCCEEDED,
165 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); 187 cache_->GetLinkedProgramStatus(shader1, shader3, NULL,
188 NULL, GL_NONE));
166 189
167 190
168 cache_->ComputeProgramHash(a_sha, 191 cache_->ComputeProgramHash(a_sha,
169 c_sha, 192 c_sha,
170 NULL, 193 NULL,
194 NULL,
195 GL_NONE,
171 sha); 196 sha);
172 cache_->Evict(std::string(sha, ProgramCache::kHashLength)); 197 cache_->Evict(std::string(sha, ProgramCache::kHashLength));
173 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, 198 EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
174 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); 199 cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
200 NULL, GL_NONE));
175 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, 201 EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
176 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); 202 cache_->GetLinkedProgramStatus(shader1, shader3, NULL,
203 NULL, GL_NONE));
177 } 204 }
178 205
179 TEST_F(ProgramCacheTest, StatusClear) { 206 TEST_F(ProgramCacheTest, StatusClear) {
180 const std::string shader1 = "abcd1234"; 207 const std::string shader1 = "abcd1234";
181 const std::string shader2 = "abcda sda b1~#4 bbbbb1234"; 208 const std::string shader2 = "abcda sda b1~#4 bbbbb1234";
182 const std::string shader3 = "asbjbbjj239a"; 209 const std::string shader3 = "asbjbbjj239a";
183 cache_->SaySuccessfullyCached(shader1, shader2, NULL); 210 cache_->SaySuccessfullyCached(shader1, shader2, NULL, NULL, GL_NONE);
184 cache_->SaySuccessfullyCached(shader1, shader3, NULL); 211 cache_->SaySuccessfullyCached(shader1, shader3, NULL, NULL, GL_NONE);
185 cache_->Clear(); 212 cache_->Clear();
186 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, 213 EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
187 cache_->GetLinkedProgramStatus(shader1, shader2, NULL)); 214 cache_->GetLinkedProgramStatus(shader1, shader2, NULL,
215 NULL, GL_NONE));
188 EXPECT_EQ(ProgramCache::LINK_UNKNOWN, 216 EXPECT_EQ(ProgramCache::LINK_UNKNOWN,
189 cache_->GetLinkedProgramStatus(shader1, shader3, NULL)); 217 cache_->GetLinkedProgramStatus(shader1, shader3, NULL,
218 NULL, GL_NONE));
190 } 219 }
191 220
192 } // namespace gles2 221 } // namespace gles2
193 } // namespace gpu 222 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698