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/shader_manager.h" | 5 #include "gpu/command_buffer/service/shader_manager.h" |
6 | 6 |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "gpu/command_buffer/service/gpu_service_test.h" | 8 #include "gpu/command_buffer/service/gpu_service_test.h" |
9 #include "gpu/command_buffer/service/mocks.h" | 9 #include "gpu/command_buffer/service/mocks.h" |
10 #include "gpu/command_buffer/service/test_helper.h" | 10 #include "gpu/command_buffer/service/test_helper.h" |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 const GLenum kUniform2Type = GL_FLOAT_MAT3; | 119 const GLenum kUniform2Type = GL_FLOAT_MAT3; |
120 const GLint kUniform2Size = 5; | 120 const GLint kUniform2Size = 5; |
121 const GLenum kUniform2Precision = GL_MEDIUM_FLOAT; | 121 const GLenum kUniform2Precision = GL_MEDIUM_FLOAT; |
122 const bool kUniform2StaticUse = false; | 122 const bool kUniform2StaticUse = false; |
123 const char* kUniform2Name = "uni2"; | 123 const char* kUniform2Name = "uni2"; |
124 const GLenum kVarying1Type = GL_FLOAT_VEC4; | 124 const GLenum kVarying1Type = GL_FLOAT_VEC4; |
125 const GLint kVarying1Size = 1; | 125 const GLint kVarying1Size = 1; |
126 const GLenum kVarying1Precision = GL_HIGH_FLOAT; | 126 const GLenum kVarying1Precision = GL_HIGH_FLOAT; |
127 const bool kVarying1StaticUse = false; | 127 const bool kVarying1StaticUse = false; |
128 const char* kVarying1Name = "varying1"; | 128 const char* kVarying1Name = "varying1"; |
| 129 const GLenum kOutputVariable1Type = GL_FLOAT_VEC4; |
| 130 const GLint kOutputVariable1Size = 4; |
| 131 const GLenum kOutputVariable1Precision = GL_MEDIUM_FLOAT; |
| 132 const char* kOutputVariable1Name = "gl_FragColor"; |
| 133 const bool kOutputVariable1StaticUse = true; |
129 | 134 |
130 // Check we can create shader. | 135 // Check we can create shader. |
131 Shader* shader1 = manager_.CreateShader( | 136 Shader* shader1 = manager_.CreateShader( |
132 kClient1Id, kService1Id, kShader1Type); | 137 kClient1Id, kService1Id, kShader1Type); |
133 // Check shader got created. | 138 // Check shader got created. |
134 ASSERT_TRUE(shader1 != NULL); | 139 ASSERT_TRUE(shader1 != NULL); |
135 EXPECT_EQ(kService1Id, shader1->service_id()); | 140 EXPECT_EQ(kService1Id, shader1->service_id()); |
136 // Check if the shader has correct type. | 141 // Check if the shader has correct type. |
137 EXPECT_EQ(kShader1Type, shader1->shader_type()); | 142 EXPECT_EQ(kShader1Type, shader1->shader_type()); |
138 EXPECT_FALSE(shader1->valid()); | 143 EXPECT_FALSE(shader1->valid()); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( | 185 uniform_map[kUniform1Name] = TestHelper::ConstructUniform( |
181 kUniform1Type, kUniform1Size, kUniform1Precision, | 186 kUniform1Type, kUniform1Size, kUniform1Precision, |
182 kUniform1StaticUse, kUniform1Name); | 187 kUniform1StaticUse, kUniform1Name); |
183 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( | 188 uniform_map[kUniform2Name] = TestHelper::ConstructUniform( |
184 kUniform2Type, kUniform2Size, kUniform2Precision, | 189 kUniform2Type, kUniform2Size, kUniform2Precision, |
185 kUniform2StaticUse, kUniform2Name); | 190 kUniform2StaticUse, kUniform2Name); |
186 VaryingMap varying_map; | 191 VaryingMap varying_map; |
187 varying_map[kVarying1Name] = TestHelper::ConstructVarying( | 192 varying_map[kVarying1Name] = TestHelper::ConstructVarying( |
188 kVarying1Type, kVarying1Size, kVarying1Precision, | 193 kVarying1Type, kVarying1Size, kVarying1Precision, |
189 kVarying1StaticUse, kVarying1Name); | 194 kVarying1StaticUse, kVarying1Name); |
190 | 195 AttributeList output_variable_list; |
| 196 output_variable_list.push_back(TestHelper::ConstructAttribute( |
| 197 kOutputVariable1Type, kOutputVariable1Size, kOutputVariable1Precision, |
| 198 kOutputVariable1StaticUse, kOutputVariable1Name)); |
191 TestHelper::SetShaderStates( | 199 TestHelper::SetShaderStates( |
192 gl_.get(), shader1, true, &kLog, &kTranslatedSource, NULL, | 200 gl_.get(), shader1, true, &kLog, &kTranslatedSource, nullptr, &attrib_map, |
193 &attrib_map, &uniform_map, &varying_map, NULL); | 201 &uniform_map, &varying_map, &output_variable_list, nullptr); |
194 EXPECT_TRUE(shader1->valid()); | 202 EXPECT_TRUE(shader1->valid()); |
195 // When compilation succeeds, no log is recorded. | 203 // When compilation succeeds, no log is recorded. |
196 EXPECT_STREQ("", shader1->log_info().c_str()); | 204 EXPECT_STREQ("", shader1->log_info().c_str()); |
197 EXPECT_STREQ(kClient1Source, shader1->last_compiled_source().c_str()); | 205 EXPECT_STREQ(kClient1Source, shader1->last_compiled_source().c_str()); |
198 EXPECT_STREQ(kTranslatedSource.c_str(), shader1->translated_source().c_str()); | 206 EXPECT_STREQ(kTranslatedSource.c_str(), shader1->translated_source().c_str()); |
199 | 207 |
200 // Check varying infos got copied. | 208 // Check varying infos got copied. |
201 EXPECT_EQ(attrib_map.size(), shader1->attrib_map().size()); | 209 EXPECT_EQ(attrib_map.size(), shader1->attrib_map().size()); |
202 for (AttributeMap::const_iterator it = attrib_map.begin(); | 210 for (AttributeMap::const_iterator it = attrib_map.begin(); |
203 it != attrib_map.end(); ++it) { | 211 it != attrib_map.end(); ++it) { |
(...skipping 22 matching lines...) Expand all Loading... |
226 for (VaryingMap::const_iterator it = varying_map.begin(); | 234 for (VaryingMap::const_iterator it = varying_map.begin(); |
227 it != varying_map.end(); ++it) { | 235 it != varying_map.end(); ++it) { |
228 const sh::Varying* variable_info = shader1->GetVaryingInfo(it->first); | 236 const sh::Varying* variable_info = shader1->GetVaryingInfo(it->first); |
229 ASSERT_TRUE(variable_info != NULL); | 237 ASSERT_TRUE(variable_info != NULL); |
230 EXPECT_EQ(it->second.type, variable_info->type); | 238 EXPECT_EQ(it->second.type, variable_info->type); |
231 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); | 239 EXPECT_EQ(it->second.arraySize, variable_info->arraySize); |
232 EXPECT_EQ(it->second.precision, variable_info->precision); | 240 EXPECT_EQ(it->second.precision, variable_info->precision); |
233 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); | 241 EXPECT_EQ(it->second.staticUse, variable_info->staticUse); |
234 EXPECT_STREQ(it->second.name.c_str(), variable_info->name.c_str()); | 242 EXPECT_STREQ(it->second.name.c_str(), variable_info->name.c_str()); |
235 } | 243 } |
| 244 // Check output variable infos got copied. |
| 245 EXPECT_EQ(output_variable_list.size(), |
| 246 shader1->output_variable_list().size()); |
| 247 for (auto it = output_variable_list.begin(); it != output_variable_list.end(); |
| 248 ++it) { |
| 249 const sh::Attribute* variable_info = |
| 250 shader1->GetOutputVariableInfo(it->mappedName); |
| 251 ASSERT_TRUE(variable_info != nullptr); |
| 252 EXPECT_EQ(it->type, variable_info->type); |
| 253 EXPECT_EQ(it->arraySize, variable_info->arraySize); |
| 254 EXPECT_EQ(it->precision, variable_info->precision); |
| 255 EXPECT_EQ(it->staticUse, variable_info->staticUse); |
| 256 EXPECT_STREQ(it->name.c_str(), variable_info->name.c_str()); |
| 257 } |
236 | 258 |
237 // Compile failure case. | 259 // Compile failure case. |
238 TestHelper::SetShaderStates( | 260 TestHelper::SetShaderStates( |
239 gl_.get(), shader1, false, &kLog, &kTranslatedSource, NULL, | 261 gl_.get(), shader1, false, &kLog, &kTranslatedSource, nullptr, |
240 &attrib_map, &uniform_map, &varying_map, NULL); | 262 &attrib_map, &uniform_map, &varying_map, &output_variable_list, nullptr); |
241 EXPECT_FALSE(shader1->valid()); | 263 EXPECT_FALSE(shader1->valid()); |
242 EXPECT_STREQ(kLog.c_str(), shader1->log_info().c_str()); | 264 EXPECT_STREQ(kLog.c_str(), shader1->log_info().c_str()); |
243 EXPECT_STREQ("", shader1->translated_source().c_str()); | 265 EXPECT_STREQ("", shader1->translated_source().c_str()); |
244 EXPECT_TRUE(shader1->attrib_map().empty()); | 266 EXPECT_TRUE(shader1->attrib_map().empty()); |
245 EXPECT_TRUE(shader1->uniform_map().empty()); | 267 EXPECT_TRUE(shader1->uniform_map().empty()); |
246 EXPECT_TRUE(shader1->varying_map().empty()); | 268 EXPECT_TRUE(shader1->varying_map().empty()); |
| 269 EXPECT_TRUE(shader1->output_variable_list().empty()); |
247 } | 270 } |
248 | 271 |
249 TEST_F(ShaderManagerTest, ShaderInfoUseCount) { | 272 TEST_F(ShaderManagerTest, ShaderInfoUseCount) { |
250 const GLuint kClient1Id = 1; | 273 const GLuint kClient1Id = 1; |
251 const GLuint kService1Id = 11; | 274 const GLuint kService1Id = 11; |
252 const GLenum kShader1Type = GL_VERTEX_SHADER; | 275 const GLenum kShader1Type = GL_VERTEX_SHADER; |
253 // Check we can create shader. | 276 // Check we can create shader. |
254 Shader* shader1 = manager_.CreateShader( | 277 Shader* shader1 = manager_.CreateShader( |
255 kClient1Id, kService1Id, kShader1Type); | 278 kClient1Id, kService1Id, kShader1Type); |
256 // Check shader got created. | 279 // Check shader got created. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 EXPECT_CALL(*gl_, DeleteShader(kService1Id)) | 313 EXPECT_CALL(*gl_, DeleteShader(kService1Id)) |
291 .Times(1) | 314 .Times(1) |
292 .RetiresOnSaturation(); | 315 .RetiresOnSaturation(); |
293 manager_.Delete(shader1); // this should delete the shader. | 316 manager_.Delete(shader1); // this should delete the shader. |
294 shader2 = manager_.GetShader(kClient1Id); | 317 shader2 = manager_.GetShader(kClient1Id); |
295 EXPECT_TRUE(shader2 == NULL); | 318 EXPECT_TRUE(shader2 == NULL); |
296 } | 319 } |
297 | 320 |
298 } // namespace gles2 | 321 } // namespace gles2 |
299 } // namespace gpu | 322 } // namespace gpu |
OLD | NEW |