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 "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 Loading... |
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 Loading... |
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 |
OLD | NEW |