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

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

Issue 566023002: Clean up interfaces between Shader / ShaderTranslator / ANGLE side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/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 "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/gl/gl_mock.h" 12 #include "ui/gl/gl_mock.h"
12 13
13 using ::testing::Return; 14 using ::testing::Return;
14 using ::testing::ReturnRef; 15 using ::testing::ReturnRef;
15 16
16 namespace gpu { 17 namespace gpu {
17 namespace gles2 { 18 namespace gles2 {
18 19
19 class ShaderManagerTest : public GpuServiceTest { 20 class ShaderManagerTest : public GpuServiceTest {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 manager_.CreateShader(kClient2Id, kService2Id, kShaderType)); 80 manager_.CreateShader(kClient2Id, kService2Id, kShaderType));
80 ASSERT_TRUE(shader1.get()); 81 ASSERT_TRUE(shader1.get());
81 ASSERT_TRUE(shader2.get()); 82 ASSERT_TRUE(shader2.get());
82 manager_.UseShader(shader1.get()); 83 manager_.UseShader(shader1.get());
83 manager_.MarkAsDeleted(shader1.get()); 84 manager_.MarkAsDeleted(shader1.get());
84 manager_.MarkAsDeleted(shader2.get()); 85 manager_.MarkAsDeleted(shader2.get());
85 EXPECT_TRUE(manager_.IsOwned(shader1.get())); 86 EXPECT_TRUE(manager_.IsOwned(shader1.get()));
86 EXPECT_FALSE(manager_.IsOwned(shader2.get())); 87 EXPECT_FALSE(manager_.IsOwned(shader2.get()));
87 } 88 }
88 89
89 TEST_F(ShaderManagerTest, Shader) { 90 TEST_F(ShaderManagerTest, DoCompile) {
90 const GLuint kClient1Id = 1; 91 const GLuint kClient1Id = 1;
91 const GLuint kService1Id = 11; 92 const GLuint kService1Id = 11;
92 const GLenum kShader1Type = GL_VERTEX_SHADER; 93 const GLenum kShader1Type = GL_VERTEX_SHADER;
93 const char* kClient1Source = "hello world"; 94 const char* kClient1Source = "hello world";
94 // Check we can create shader.
95 Shader* shader1 = manager_.CreateShader(
96 kClient1Id, kService1Id, kShader1Type);
97 // Check shader got created.
98 ASSERT_TRUE(shader1 != NULL);
99 EXPECT_EQ(kService1Id, shader1->service_id());
100 // Check if the shader has correct type.
101 EXPECT_EQ(kShader1Type, shader1->shader_type());
102 EXPECT_FALSE(shader1->IsValid());
103 EXPECT_FALSE(shader1->InUse());
104 EXPECT_TRUE(shader1->source() == NULL);
105 EXPECT_TRUE(shader1->log_info() == NULL);
106 const char* kLog = "foo";
107 shader1->SetStatus(true, kLog, NULL);
108 EXPECT_TRUE(shader1->IsValid());
109 EXPECT_STREQ(kLog, shader1->log_info()->c_str());
110 // Check we can set its source.
111 shader1->UpdateSource(kClient1Source);
112 EXPECT_STREQ(kClient1Source, shader1->source()->c_str());
113 EXPECT_EQ(NULL, shader1->translated_source());
114 // Check we can set its translated source.
115 shader1->UpdateTranslatedSource(kClient1Source);
116 EXPECT_STREQ(kClient1Source,
117 shader1->translated_source()->c_str());
118 }
119
120 TEST_F(ShaderManagerTest, GetInfo) {
121 const GLuint kClient1Id = 1;
122 const GLuint kService1Id = 11;
123 const GLenum kShader1Type = GL_VERTEX_SHADER;
124 const GLenum kAttrib1Type = GL_FLOAT_VEC2; 95 const GLenum kAttrib1Type = GL_FLOAT_VEC2;
125 const GLsizei kAttrib1Size = 2; 96 const GLsizei kAttrib1Size = 2;
126 const int kAttrib1Precision = SH_PRECISION_MEDIUMP; 97 const int kAttrib1Precision = SH_PRECISION_MEDIUMP;
127 const char* kAttrib1Name = "attr1"; 98 const char* kAttrib1Name = "attr1";
128 const GLenum kAttrib2Type = GL_FLOAT_VEC3; 99 const GLenum kAttrib2Type = GL_FLOAT_VEC3;
129 const GLsizei kAttrib2Size = 4; 100 const GLsizei kAttrib2Size = 4;
130 const int kAttrib2Precision = SH_PRECISION_HIGHP; 101 const int kAttrib2Precision = SH_PRECISION_HIGHP;
131 const char* kAttrib2Name = "attr2"; 102 const char* kAttrib2Name = "attr2";
132 const int kAttribStaticUse = 0; 103 const int kAttribStaticUse = 0;
133 const GLenum kUniform1Type = GL_FLOAT_MAT2; 104 const GLenum kUniform1Type = GL_FLOAT_MAT2;
134 const GLsizei kUniform1Size = 3; 105 const GLsizei kUniform1Size = 3;
135 const int kUniform1Precision = SH_PRECISION_LOWP; 106 const int kUniform1Precision = SH_PRECISION_LOWP;
136 const int kUniform1StaticUse = 1; 107 const int kUniform1StaticUse = 1;
137 const char* kUniform1Name = "uni1"; 108 const char* kUniform1Name = "uni1";
138 const GLenum kUniform2Type = GL_FLOAT_MAT3; 109 const GLenum kUniform2Type = GL_FLOAT_MAT3;
139 const GLsizei kUniform2Size = 5; 110 const GLsizei kUniform2Size = 5;
140 const int kUniform2Precision = SH_PRECISION_MEDIUMP; 111 const int kUniform2Precision = SH_PRECISION_MEDIUMP;
141 const int kUniform2StaticUse = 0; 112 const int kUniform2StaticUse = 0;
142 const char* kUniform2Name = "uni2"; 113 const char* kUniform2Name = "uni2";
114 const GLenum kVarying1Type = GL_FLOAT_VEC4;
115 const GLsizei kVarying1Size = 1;
116 const int kVarying1Precision = SH_PRECISION_HIGHP;
117 const int kVarying1StaticUse = 0;
118 const char* kVarying1Name = "varying1";
143 119
144 MockShaderTranslator shader_translator; 120 // Check we can create shader.
121 Shader* shader1 = manager_.CreateShader(
122 kClient1Id, kService1Id, kShader1Type);
123 // Check shader got created.
124 ASSERT_TRUE(shader1 != NULL);
125 EXPECT_EQ(kService1Id, shader1->service_id());
126 // Check if the shader has correct type.
127 EXPECT_EQ(kShader1Type, shader1->shader_type());
128 EXPECT_FALSE(shader1->valid());
129 EXPECT_FALSE(shader1->InUse());
130 EXPECT_TRUE(shader1->source().empty());
131 EXPECT_TRUE(shader1->log_info().empty());
132 EXPECT_TRUE(shader1->signature_source().empty());
133 EXPECT_TRUE(shader1->translated_source().empty());
134 EXPECT_EQ(0u, shader1->attrib_map().size());
135 EXPECT_EQ(0u, shader1->uniform_map().size());
136 EXPECT_EQ(0u, shader1->varying_map().size());
137
138 // Check we can set its source.
139 shader1->set_source(kClient1Source);
140 EXPECT_STREQ(kClient1Source, shader1->source().c_str());
141 EXPECT_TRUE(shader1->signature_source().empty());
142
143 // Check DoCompile() will set compilation states, log, translated source,
144 // shader variables, and name mapping.
145 const std::string kLog = "foo";
146 const std::string kTranslatedSource = "poo";
147
145 ShaderTranslator::VariableMap attrib_map; 148 ShaderTranslator::VariableMap attrib_map;
146 attrib_map[kAttrib1Name] = ShaderTranslatorInterface::VariableInfo( 149 attrib_map[kAttrib1Name] = ShaderTranslatorInterface::VariableInfo(
147 kAttrib1Type, kAttrib1Size, kAttrib1Precision, 150 kAttrib1Type, kAttrib1Size, kAttrib1Precision,
148 kAttribStaticUse, kAttrib1Name); 151 kAttribStaticUse, kAttrib1Name);
149 attrib_map[kAttrib2Name] = ShaderTranslatorInterface::VariableInfo( 152 attrib_map[kAttrib2Name] = ShaderTranslatorInterface::VariableInfo(
150 kAttrib2Type, kAttrib2Size, kAttrib2Precision, 153 kAttrib2Type, kAttrib2Size, kAttrib2Precision,
151 kAttribStaticUse, kAttrib2Name); 154 kAttribStaticUse, kAttrib2Name);
152 ShaderTranslator::VariableMap uniform_map; 155 ShaderTranslator::VariableMap uniform_map;
153 uniform_map[kUniform1Name] = ShaderTranslatorInterface::VariableInfo( 156 uniform_map[kUniform1Name] = ShaderTranslatorInterface::VariableInfo(
154 kUniform1Type, kUniform1Size, kUniform1Precision, 157 kUniform1Type, kUniform1Size, kUniform1Precision,
155 kUniform1StaticUse, kUniform1Name); 158 kUniform1StaticUse, kUniform1Name);
156 uniform_map[kUniform2Name] = ShaderTranslatorInterface::VariableInfo( 159 uniform_map[kUniform2Name] = ShaderTranslatorInterface::VariableInfo(
157 kUniform2Type, kUniform2Size, kUniform2Precision, 160 kUniform2Type, kUniform2Size, kUniform2Precision,
158 kUniform2StaticUse, kUniform2Name); 161 kUniform2StaticUse, kUniform2Name);
159 EXPECT_CALL(shader_translator, attrib_map())
160 .WillRepeatedly(ReturnRef(attrib_map));
161 EXPECT_CALL(shader_translator, uniform_map())
162 .WillRepeatedly(ReturnRef(uniform_map));
163 ShaderTranslator::VariableMap varying_map; 162 ShaderTranslator::VariableMap varying_map;
164 EXPECT_CALL(shader_translator, varying_map()) 163 varying_map[kVarying1Name] = ShaderTranslatorInterface::VariableInfo(
165 .WillRepeatedly(ReturnRef(varying_map)); 164 kVarying1Type, kVarying1Size, kVarying1Precision,
166 ShaderTranslator::NameMap name_map; 165 kVarying1StaticUse, kVarying1Name);
167 EXPECT_CALL(shader_translator, name_map()) 166
168 .WillRepeatedly(ReturnRef(name_map)); 167 TestHelper::SetShaderStates(
169 // Check we can create shader. 168 gl_.get(), shader1, true, &kLog, &kTranslatedSource,
170 Shader* shader1 = manager_.CreateShader( 169 &attrib_map, &uniform_map, &varying_map, NULL);
171 kClient1Id, kService1Id, kShader1Type); 170 EXPECT_TRUE(shader1->valid());
172 // Check shader got created. 171 // When compilation succeeds, no log is recorded.
173 ASSERT_TRUE(shader1 != NULL); 172 EXPECT_STREQ("", shader1->log_info().c_str());
174 // Set Status 173 EXPECT_STREQ(kClient1Source, shader1->signature_source().c_str());
175 shader1->SetStatus(true, "", &shader_translator); 174 EXPECT_STREQ(kTranslatedSource.c_str(), shader1->translated_source().c_str());
176 // Check attrib and uniform infos got copied. 175
176 // Check varying infos got copied.
177 EXPECT_EQ(attrib_map.size(), shader1->attrib_map().size());
177 for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin(); 178 for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin();
178 it != attrib_map.end(); ++it) { 179 it != attrib_map.end(); ++it) {
179 const Shader::VariableInfo* variable_info = 180 const Shader::VariableInfo* variable_info =
180 shader1->GetAttribInfo(it->first); 181 shader1->GetAttribInfo(it->first);
181 ASSERT_TRUE(variable_info != NULL); 182 ASSERT_TRUE(variable_info != NULL);
182 EXPECT_EQ(it->second.type, variable_info->type); 183 EXPECT_EQ(it->second.type, variable_info->type);
183 EXPECT_EQ(it->second.size, variable_info->size); 184 EXPECT_EQ(it->second.size, variable_info->size);
184 EXPECT_EQ(it->second.precision, variable_info->precision); 185 EXPECT_EQ(it->second.precision, variable_info->precision);
185 EXPECT_EQ(it->second.static_use, variable_info->static_use); 186 EXPECT_EQ(it->second.static_use, variable_info->static_use);
186 EXPECT_EQ(it->second.name, variable_info->name); 187 EXPECT_STREQ(it->second.name.c_str(), variable_info->name.c_str());
187 } 188 }
189 // Check uniform infos got copied.
190 EXPECT_EQ(uniform_map.size(), shader1->uniform_map().size());
188 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); 191 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin();
189 it != uniform_map.end(); ++it) { 192 it != uniform_map.end(); ++it) {
190 const Shader::VariableInfo* variable_info = 193 const Shader::VariableInfo* variable_info =
191 shader1->GetUniformInfo(it->first); 194 shader1->GetUniformInfo(it->first);
192 ASSERT_TRUE(variable_info != NULL); 195 ASSERT_TRUE(variable_info != NULL);
193 EXPECT_EQ(it->second.type, variable_info->type); 196 EXPECT_EQ(it->second.type, variable_info->type);
194 EXPECT_EQ(it->second.size, variable_info->size); 197 EXPECT_EQ(it->second.size, variable_info->size);
195 EXPECT_EQ(it->second.precision, variable_info->precision); 198 EXPECT_EQ(it->second.precision, variable_info->precision);
196 EXPECT_EQ(it->second.static_use, variable_info->static_use); 199 EXPECT_EQ(it->second.static_use, variable_info->static_use);
197 EXPECT_EQ(it->second.name, variable_info->name); 200 EXPECT_STREQ(it->second.name.c_str(), variable_info->name.c_str());
198 } 201 }
199 // Check attrib and uniform get cleared. 202 // Check varying infos got copied.
200 shader1->SetStatus(true, NULL, NULL); 203 EXPECT_EQ(varying_map.size(), shader1->varying_map().size());
201 EXPECT_TRUE(shader1->log_info() == NULL); 204 for (ShaderTranslator::VariableMap::const_iterator it = varying_map.begin();
202 for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin(); 205 it != varying_map.end(); ++it) {
203 it != attrib_map.end(); ++it) {
204 const Shader::VariableInfo* variable_info = 206 const Shader::VariableInfo* variable_info =
205 shader1->GetAttribInfo(it->first); 207 shader1->GetVaryingInfo(it->first);
206 EXPECT_TRUE(variable_info == NULL); 208 ASSERT_TRUE(variable_info != NULL);
209 EXPECT_EQ(it->second.type, variable_info->type);
210 EXPECT_EQ(it->second.size, variable_info->size);
211 EXPECT_EQ(it->second.precision, variable_info->precision);
212 EXPECT_EQ(it->second.static_use, variable_info->static_use);
213 EXPECT_STREQ(it->second.name.c_str(), variable_info->name.c_str());
207 } 214 }
208 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); 215
209 it != uniform_map.end(); ++it) { 216 // Compile failure case.
210 const Shader::VariableInfo* variable_info = 217 TestHelper::SetShaderStates(
211 shader1->GetUniformInfo(it->first); 218 gl_.get(), shader1, false, &kLog, &kTranslatedSource,
212 ASSERT_TRUE(variable_info == NULL); 219 &attrib_map, &uniform_map, &varying_map, NULL);
213 } 220 EXPECT_FALSE(shader1->valid());
221 EXPECT_STREQ(kLog.c_str(), shader1->log_info().c_str());
222 EXPECT_STREQ("", shader1->translated_source().c_str());
223 EXPECT_TRUE(shader1->attrib_map().empty());
224 EXPECT_TRUE(shader1->uniform_map().empty());
225 EXPECT_TRUE(shader1->varying_map().empty());
214 } 226 }
215 227
216 TEST_F(ShaderManagerTest, ShaderInfoUseCount) { 228 TEST_F(ShaderManagerTest, ShaderInfoUseCount) {
217 const GLuint kClient1Id = 1; 229 const GLuint kClient1Id = 1;
218 const GLuint kService1Id = 11; 230 const GLuint kService1Id = 11;
219 const GLenum kShader1Type = GL_VERTEX_SHADER; 231 const GLenum kShader1Type = GL_VERTEX_SHADER;
220 // Check we can create shader. 232 // Check we can create shader.
221 Shader* shader1 = manager_.CreateShader( 233 Shader* shader1 = manager_.CreateShader(
222 kClient1Id, kService1Id, kShader1Type); 234 kClient1Id, kService1Id, kShader1Type);
223 // Check shader got created. 235 // Check shader got created.
(...skipping 27 matching lines...) Expand all
251 EXPECT_FALSE(shader1->InUse()); 263 EXPECT_FALSE(shader1->InUse());
252 shader2 = manager_.GetShader(kClient1Id); 264 shader2 = manager_.GetShader(kClient1Id);
253 EXPECT_EQ(shader1, shader2); 265 EXPECT_EQ(shader1, shader2);
254 manager_.MarkAsDeleted(shader1); // this should delete the shader. 266 manager_.MarkAsDeleted(shader1); // this should delete the shader.
255 shader2 = manager_.GetShader(kClient1Id); 267 shader2 = manager_.GetShader(kClient1Id);
256 EXPECT_TRUE(shader2 == NULL); 268 EXPECT_TRUE(shader2 == NULL);
257 } 269 }
258 270
259 } // namespace gles2 271 } // namespace gles2
260 } // namespace gpu 272 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/shader_manager.cc ('k') | gpu/command_buffer/service/shader_translator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698