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/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
9 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 9 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
10 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 10 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
11 #include "gpu/command_buffer/common/id_allocator.h" | 11 #include "gpu/command_buffer/common/id_allocator.h" |
12 #include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" | 12 #include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" |
13 #include "gpu/command_buffer/service/async_pixel_transfer_manager.h" | 13 #include "gpu/command_buffer/service/async_pixel_transfer_manager.h" |
14 #include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" | 14 #include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" |
15 #include "gpu/command_buffer/service/cmd_buffer_engine.h" | 15 #include "gpu/command_buffer/service/cmd_buffer_engine.h" |
16 #include "gpu/command_buffer/service/context_group.h" | 16 #include "gpu/command_buffer/service/context_group.h" |
17 #include "gpu/command_buffer/service/context_state.h" | 17 #include "gpu/command_buffer/service/context_state.h" |
18 #include "gpu/command_buffer/service/gl_surface_mock.h" | 18 #include "gpu/command_buffer/service/gl_surface_mock.h" |
19 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h" | 19 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
20 #include "gpu/command_buffer/service/gpu_switches.h" | 20 #include "gpu/command_buffer/service/gpu_switches.h" |
21 #include "gpu/command_buffer/service/image_manager.h" | 21 #include "gpu/command_buffer/service/image_manager.h" |
22 #include "gpu/command_buffer/service/mailbox_manager.h" | 22 #include "gpu/command_buffer/service/mailbox_manager.h" |
23 #include "gpu/command_buffer/service/mocks.h" | 23 #include "gpu/command_buffer/service/mocks.h" |
24 #include "gpu/command_buffer/service/program_manager.h" | 24 #include "gpu/command_buffer/service/program_manager.h" |
25 #include "gpu/command_buffer/service/test_helper.h" | 25 #include "gpu/command_buffer/service/test_helper.h" |
26 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
27 #include "ui/gl/gl_implementation.h" | 27 #include "ui/gl/gl_implementation.h" |
28 #include "ui/gl/gl_mock.h" | 28 #include "ui/gl/gl_mock.h" |
29 #include "ui/gl/gl_surface_stub.h" | 29 #include "ui/gl/gl_surface_stub.h" |
30 | 30 |
31 | 31 |
32 #if !defined(GL_DEPTH24_STENCIL8) | 32 #if !defined(GL_DEPTH24_STENCIL8) |
33 #define GL_DEPTH24_STENCIL8 0x88F0 | 33 #define GL_DEPTH24_STENCIL8 0x88F0 |
34 #endif | 34 #endif |
35 | 35 |
36 using ::gfx::MockGLInterface; | 36 using ::gfx::MockGLInterface; |
37 using ::testing::_; | 37 using ::testing::_; |
38 using ::testing::DoAll; | 38 using ::testing::DoAll; |
39 using ::testing::InSequence; | 39 using ::testing::InSequence; |
40 using ::testing::Invoke; | 40 using ::testing::Invoke; |
41 using ::testing::MatcherCast; | 41 using ::testing::MatcherCast; |
| 42 using ::testing::Mock; |
42 using ::testing::Pointee; | 43 using ::testing::Pointee; |
43 using ::testing::Return; | 44 using ::testing::Return; |
44 using ::testing::SaveArg; | 45 using ::testing::SaveArg; |
45 using ::testing::SetArrayArgument; | 46 using ::testing::SetArrayArgument; |
46 using ::testing::SetArgumentPointee; | 47 using ::testing::SetArgumentPointee; |
47 using ::testing::SetArgPointee; | 48 using ::testing::SetArgPointee; |
48 using ::testing::StrEq; | 49 using ::testing::StrEq; |
49 using ::testing::StrictMock; | 50 using ::testing::StrictMock; |
50 | 51 |
51 namespace gpu { | 52 namespace gpu { |
52 namespace gles2 { | 53 namespace gles2 { |
53 | 54 |
54 using namespace cmds; | 55 using namespace cmds; |
55 | 56 |
56 class GLES2DecoderTest : public GLES2DecoderTestBase { | 57 void GLES2DecoderRGBBackbufferTest::SetUp() { |
57 public: | 58 // Test codepath with workaround clear_alpha_in_readpixels because |
58 GLES2DecoderTest() { } | 59 // ReadPixelsEmulator emulates the incorrect driver behavior. |
59 | |
60 protected: | |
61 void CheckReadPixelsOutOfRange( | |
62 GLint in_read_x, GLint in_read_y, | |
63 GLsizei in_read_width, GLsizei in_read_height, | |
64 bool init); | |
65 }; | |
66 | |
67 class GLES2DecoderTestWithExtensionsOnGLES2 | |
68 : public GLES2DecoderTest, | |
69 public ::testing::WithParamInterface<const char*> { | |
70 public: | |
71 GLES2DecoderTestWithExtensionsOnGLES2() {} | |
72 | |
73 virtual void SetUp() { | |
74 InitState init; | |
75 init.extensions = GetParam(); | |
76 init.gl_version = "opengl es 2.0"; | |
77 init.has_alpha = true; | |
78 init.has_depth = true; | |
79 init.request_alpha = true; | |
80 init.request_depth = true; | |
81 InitDecoder(init); | |
82 } | |
83 }; | |
84 | |
85 class GLES2DecoderWithShaderTest : public GLES2DecoderWithShaderTestBase { | |
86 public: | |
87 GLES2DecoderWithShaderTest() | |
88 : GLES2DecoderWithShaderTestBase() { | |
89 } | |
90 | |
91 void CheckTextureChangesMarkFBOAsNotComplete(bool bound_fbo); | |
92 void CheckRenderbufferChangesMarkFBOAsNotComplete(bool bound_fbo); | |
93 }; | |
94 | |
95 class GLES2DecoderGeometryInstancingTest : public GLES2DecoderWithShaderTest { | |
96 public: | |
97 GLES2DecoderGeometryInstancingTest() | |
98 : GLES2DecoderWithShaderTest() { | |
99 } | |
100 | |
101 virtual void SetUp() { | |
102 InitState init; | |
103 init.extensions = "GL_ANGLE_instanced_arrays"; | |
104 init.gl_version = "opengl es 2.0"; | |
105 init.has_alpha = true; | |
106 init.has_depth = true; | |
107 init.request_alpha = true; | |
108 init.request_depth = true; | |
109 init.bind_generates_resource = true; | |
110 InitDecoder(init); | |
111 SetupDefaultProgram(); | |
112 } | |
113 }; | |
114 | |
115 class GLES2DecoderRGBBackbufferTest : public GLES2DecoderWithShaderTest { | |
116 public: | |
117 GLES2DecoderRGBBackbufferTest() { } | |
118 | |
119 virtual void SetUp() { | |
120 // Test codepath with workaround clear_alpha_in_readpixels because | |
121 // ReadPixelsEmulator emulates the incorrect driver behavior. | |
122 CommandLine command_line(0, NULL); | |
123 command_line.AppendSwitchASCII( | |
124 switches::kGpuDriverBugWorkarounds, | |
125 base::IntToString(gpu::CLEAR_ALPHA_IN_READPIXELS)); | |
126 InitState init; | |
127 init.gl_version = "3.0"; | |
128 init.bind_generates_resource = true; | |
129 InitDecoderWithCommandLine(init, &command_line); | |
130 SetupDefaultProgram(); | |
131 } | |
132 }; | |
133 | |
134 class GLES2DecoderManualInitTest : public GLES2DecoderWithShaderTest { | |
135 public: | |
136 GLES2DecoderManualInitTest() { } | |
137 | |
138 // Override default setup so nothing gets setup. | |
139 virtual void SetUp() { | |
140 } | |
141 }; | |
142 | |
143 class GLES2DecoderCompressedFormatsTest : public GLES2DecoderManualInitTest { | |
144 public: | |
145 GLES2DecoderCompressedFormatsTest() { } | |
146 | |
147 static bool ValueInArray(GLint value, GLint* array, GLint count) { | |
148 for (GLint ii = 0; ii < count; ++ii) { | |
149 if (array[ii] == value) { | |
150 return true; | |
151 } | |
152 } | |
153 return false; | |
154 } | |
155 | |
156 void CheckFormats(const char* extension, const GLenum* formats, int count) { | |
157 InitState init; | |
158 init.extensions = extension; | |
159 init.gl_version = "3.0"; | |
160 init.bind_generates_resource = true; | |
161 InitDecoder(init); | |
162 | |
163 EXPECT_CALL(*gl_, GetError()) | |
164 .WillOnce(Return(GL_NO_ERROR)) | |
165 .WillOnce(Return(GL_NO_ERROR)) | |
166 .WillOnce(Return(GL_NO_ERROR)) | |
167 .WillOnce(Return(GL_NO_ERROR)) | |
168 .RetiresOnSaturation(); | |
169 | |
170 typedef GetIntegerv::Result Result; | |
171 Result* result = static_cast<Result*>(shared_memory_address_); | |
172 GetIntegerv cmd; | |
173 result->size = 0; | |
174 EXPECT_CALL(*gl_, GetIntegerv(_, _)) | |
175 .Times(0) | |
176 .RetiresOnSaturation(); | |
177 cmd.Init( | |
178 GL_NUM_COMPRESSED_TEXTURE_FORMATS, | |
179 shared_memory_id_, shared_memory_offset_); | |
180 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
181 EXPECT_EQ(1, result->GetNumResults()); | |
182 GLint num_formats = result->GetData()[0]; | |
183 EXPECT_EQ(count, num_formats); | |
184 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
185 | |
186 result->size = 0; | |
187 cmd.Init( | |
188 GL_COMPRESSED_TEXTURE_FORMATS, | |
189 shared_memory_id_, shared_memory_offset_); | |
190 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
191 EXPECT_EQ(num_formats, result->GetNumResults()); | |
192 | |
193 for (int i = 0; i < count; ++i) { | |
194 EXPECT_TRUE(ValueInArray( | |
195 formats[i], | |
196 result->GetData(), result->GetNumResults())); | |
197 } | |
198 | |
199 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
200 } | |
201 }; | |
202 | |
203 class GLES2DecoderRestoreStateTest : public GLES2DecoderManualInitTest { | |
204 public: | |
205 GLES2DecoderRestoreStateTest() { } | |
206 | |
207 protected: | |
208 void AddExpectationsForActiveTexture(GLenum unit); | |
209 void AddExpectationsForBindTexture(GLenum target, GLuint id); | |
210 void InitializeContextState( | |
211 ContextState* state, uint32 non_default_unit, uint32 active_unit); | |
212 }; | |
213 | |
214 void GLES2DecoderRestoreStateTest::AddExpectationsForActiveTexture( | |
215 GLenum unit) { | |
216 EXPECT_CALL(*gl_, ActiveTexture(unit)) | |
217 .Times(1) | |
218 .RetiresOnSaturation(); | |
219 } | |
220 | |
221 void GLES2DecoderRestoreStateTest::AddExpectationsForBindTexture(GLenum target, | |
222 GLuint id) { | |
223 EXPECT_CALL(*gl_, BindTexture(target, id)) | |
224 .Times(1) | |
225 .RetiresOnSaturation(); | |
226 } | |
227 | |
228 void GLES2DecoderRestoreStateTest::InitializeContextState( | |
229 ContextState* state, uint32 non_default_unit, uint32 active_unit) { | |
230 state->texture_units.resize(group().max_texture_units()); | |
231 for (uint32 tt = 0; tt < state->texture_units.size(); ++tt) { | |
232 TextureRef* ref_cube_map = | |
233 group().texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); | |
234 state->texture_units[tt].bound_texture_cube_map = ref_cube_map; | |
235 TextureRef* ref_2d = | |
236 (tt == non_default_unit) | |
237 ? group().texture_manager()->GetTexture(client_texture_id_) | |
238 : group().texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D); | |
239 state->texture_units[tt].bound_texture_2d = ref_2d; | |
240 } | |
241 state->active_texture_unit = active_unit; | |
242 } | |
243 | |
244 TEST_F(GLES2DecoderWithShaderTest, DrawArraysNoAttributesSucceeds) { | |
245 SetupTexture(); | |
246 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
247 SetupExpectationsForApplyingDefaultDirtyState(); | |
248 | |
249 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
250 .Times(1) | |
251 .RetiresOnSaturation(); | |
252 DrawArrays cmd; | |
253 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
254 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
255 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
256 } | |
257 | |
258 // Tests when the math overflows (0x40000000 * sizeof GLfloat) | |
259 TEST_F(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0OverflowFails) { | |
260 const GLsizei kLargeCount = 0x40000000; | |
261 SetupTexture(); | |
262 EXPECT_CALL(*gl_, DrawArrays(_, _, _)) | |
263 .Times(0) | |
264 .RetiresOnSaturation(); | |
265 DrawArrays cmd; | |
266 cmd.Init(GL_TRIANGLES, 0, kLargeCount); | |
267 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
268 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
269 EXPECT_FALSE(GetDecoder()->WasContextLost()); | |
270 } | |
271 | |
272 // Tests when the math overflows (0x7FFFFFFF + 1 = 0x8000000 verts) | |
273 TEST_F(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0PosToNegFails) { | |
274 const GLsizei kLargeCount = 0x7FFFFFFF; | |
275 SetupTexture(); | |
276 EXPECT_CALL(*gl_, DrawArrays(_, _, _)) | |
277 .Times(0) | |
278 .RetiresOnSaturation(); | |
279 DrawArrays cmd; | |
280 cmd.Init(GL_TRIANGLES, 0, kLargeCount); | |
281 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
282 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
283 EXPECT_FALSE(GetDecoder()->WasContextLost()); | |
284 } | |
285 | |
286 // Tests when the driver returns an error | |
287 TEST_F(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0OOMFails) { | |
288 const GLsizei kFakeLargeCount = 0x1234; | |
289 SetupTexture(); | |
290 AddExpectationsForSimulatedAttrib0WithError( | |
291 kFakeLargeCount, 0, GL_OUT_OF_MEMORY); | |
292 EXPECT_CALL(*gl_, DrawArrays(_, _, _)) | |
293 .Times(0) | |
294 .RetiresOnSaturation(); | |
295 DrawArrays cmd; | |
296 cmd.Init(GL_TRIANGLES, 0, kFakeLargeCount); | |
297 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
298 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
299 EXPECT_FALSE(GetDecoder()->WasContextLost()); | |
300 } | |
301 | |
302 // Test that we lose context. | |
303 TEST_F(GLES2DecoderManualInitTest, LoseContextWhenOOM) { | |
304 InitState init; | |
305 init.gl_version = "3.0"; | |
306 init.has_alpha = true; | |
307 init.has_depth = true; | |
308 init.request_alpha = true; | |
309 init.request_depth = true; | |
310 init.bind_generates_resource = true; | |
311 init.lose_context_when_out_of_memory = true; | |
312 InitDecoder(init); | |
313 SetupDefaultProgram(); | |
314 | |
315 const GLsizei kFakeLargeCount = 0x1234; | |
316 SetupTexture(); | |
317 AddExpectationsForSimulatedAttrib0WithError( | |
318 kFakeLargeCount, 0, GL_OUT_OF_MEMORY); | |
319 EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation(); | |
320 // Other contexts in the group should be lost also. | |
321 EXPECT_CALL(*mock_decoder_, LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB)) | |
322 .Times(1) | |
323 .RetiresOnSaturation(); | |
324 DrawArrays cmd; | |
325 cmd.Init(GL_TRIANGLES, 0, kFakeLargeCount); | |
326 // This context should be lost. | |
327 EXPECT_EQ(error::kLostContext, ExecuteCmd(cmd)); | |
328 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
329 EXPECT_TRUE(decoder_->WasContextLost()); | |
330 } | |
331 | |
332 TEST_F(GLES2DecoderWithShaderTest, DrawArraysBadTextureUsesBlack) { | |
333 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
334 // This is an NPOT texture. As the default filtering requires mips | |
335 // this should trigger replacing with black textures before rendering. | |
336 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
337 kSharedMemoryId, kSharedMemoryOffset); | |
338 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
339 { | |
340 InSequence sequence; | |
341 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) | |
342 .Times(1) | |
343 .RetiresOnSaturation(); | |
344 EXPECT_CALL(*gl_, BindTexture( | |
345 GL_TEXTURE_2D, TestHelper::kServiceBlackTexture2dId)) | |
346 .Times(1) | |
347 .RetiresOnSaturation(); | |
348 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
349 .Times(1) | |
350 .RetiresOnSaturation(); | |
351 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) | |
352 .Times(1) | |
353 .RetiresOnSaturation(); | |
354 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) | |
355 .Times(1) | |
356 .RetiresOnSaturation(); | |
357 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) | |
358 .Times(1) | |
359 .RetiresOnSaturation(); | |
360 } | |
361 SetupExpectationsForApplyingDefaultDirtyState(); | |
362 DrawArrays cmd; | |
363 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
364 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
365 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
366 } | |
367 | |
368 TEST_F(GLES2DecoderWithShaderTest, DrawArraysMissingAttributesFails) { | |
369 DoEnableVertexAttribArray(1); | |
370 | |
371 EXPECT_CALL(*gl_, DrawArrays(_, _, _)) | |
372 .Times(0); | |
373 DrawArrays cmd; | |
374 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
375 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
376 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
377 } | |
378 | |
379 TEST_F(GLES2DecoderWithShaderTest, | |
380 DrawArraysMissingAttributesZeroCountSucceeds) { | |
381 DoEnableVertexAttribArray(1); | |
382 | |
383 EXPECT_CALL(*gl_, DrawArrays(_, _, _)) | |
384 .Times(0); | |
385 DrawArrays cmd; | |
386 cmd.Init(GL_TRIANGLES, 0, 0); | |
387 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
388 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
389 } | |
390 | |
391 TEST_F(GLES2DecoderWithShaderTest, DrawArraysValidAttributesSucceeds) { | |
392 SetupTexture(); | |
393 SetupVertexBuffer(); | |
394 DoEnableVertexAttribArray(1); | |
395 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
396 AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); | |
397 SetupExpectationsForApplyingDefaultDirtyState(); | |
398 | |
399 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
400 .Times(1) | |
401 .RetiresOnSaturation(); | |
402 DrawArrays cmd; | |
403 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
404 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
405 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
406 } | |
407 | |
408 // Same as DrawArraysValidAttributesSucceeds, but with workaround | |
409 // |init_vertex_attributes|. | |
410 TEST_F(GLES2DecoderManualInitTest, InitVertexAttributes) { | |
411 CommandLine command_line(0, NULL); | 60 CommandLine command_line(0, NULL); |
412 command_line.AppendSwitchASCII( | 61 command_line.AppendSwitchASCII( |
413 switches::kGpuDriverBugWorkarounds, | 62 switches::kGpuDriverBugWorkarounds, |
414 base::IntToString(gpu::INIT_VERTEX_ATTRIBUTES)); | 63 base::IntToString(gpu::CLEAR_ALPHA_IN_READPIXELS)); |
415 InitState init; | 64 InitState init; |
416 init.gl_version = "3.0"; | 65 init.gl_version = "3.0"; |
417 init.has_alpha = true; | |
418 init.has_depth = true; | |
419 init.request_alpha = true; | |
420 init.request_depth = true; | |
421 init.bind_generates_resource = true; | 66 init.bind_generates_resource = true; |
422 InitDecoderWithCommandLine(init, &command_line); | 67 InitDecoderWithCommandLine(init, &command_line); |
423 SetupDefaultProgram(); | 68 SetupDefaultProgram(); |
424 SetupTexture(); | 69 } |
425 SetupVertexBuffer(); | 70 |
426 DoEnableVertexAttribArray(1); | 71 // Override default setup so nothing gets setup. |
427 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | 72 void GLES2DecoderManualInitTest::SetUp() { |
428 AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); | |
429 SetupExpectationsForApplyingDefaultDirtyState(); | |
430 | |
431 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
432 .Times(1) | |
433 .RetiresOnSaturation(); | |
434 DrawArrays cmd; | |
435 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
436 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
437 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
438 } | |
439 | |
440 TEST_F(GLES2DecoderWithShaderTest, DrawArraysDeletedBufferFails) { | |
441 SetupVertexBuffer(); | |
442 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
443 DeleteVertexBuffer(); | |
444 | |
445 EXPECT_CALL(*gl_, DrawArrays(_, _, _)) | |
446 .Times(0); | |
447 DrawArrays cmd; | |
448 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
449 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
450 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
451 } | |
452 | |
453 TEST_F(GLES2DecoderWithShaderTest, DrawArraysDeletedProgramSucceeds) { | |
454 SetupTexture(); | |
455 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
456 SetupExpectationsForApplyingDefaultDirtyState(); | |
457 DoDeleteProgram(client_program_id_, kServiceProgramId); | |
458 | |
459 EXPECT_CALL(*gl_, DrawArrays(_, _, _)) | |
460 .Times(1) | |
461 .RetiresOnSaturation(); | |
462 EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)) | |
463 .Times(1); | |
464 DrawArrays cmd; | |
465 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
466 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
467 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
468 } | |
469 | |
470 TEST_F(GLES2DecoderWithShaderTest, DrawArraysWithInvalidModeFails) { | |
471 SetupVertexBuffer(); | |
472 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
473 | |
474 EXPECT_CALL(*gl_, DrawArrays(_, _, _)) | |
475 .Times(0); | |
476 DrawArrays cmd; | |
477 cmd.Init(GL_QUADS, 0, 1); | |
478 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
479 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
480 cmd.Init(GL_POLYGON, 0, 1); | |
481 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
482 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
483 } | |
484 | |
485 TEST_F(GLES2DecoderWithShaderTest, DrawArraysInvalidCountFails) { | |
486 SetupVertexBuffer(); | |
487 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
488 | |
489 // Try start > 0 | |
490 EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0); | |
491 DrawArrays cmd; | |
492 cmd.Init(GL_TRIANGLES, 1, kNumVertices); | |
493 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
494 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
495 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
496 | |
497 // Try with count > size | |
498 cmd.Init(GL_TRIANGLES, 0, kNumVertices + 1); | |
499 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
500 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
501 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
502 | |
503 // Try with attrib offset > 0 | |
504 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
505 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 4); | |
506 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
507 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
508 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
509 | |
510 // Try with size > 2 (ie, vec3 instead of vec2) | |
511 DoVertexAttribPointer(1, 3, GL_FLOAT, 0, 0); | |
512 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
513 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
514 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
515 | |
516 // Try with stride > 8 (vec2 + vec2 byte) | |
517 DoVertexAttribPointer(1, 2, GL_FLOAT, sizeof(GLfloat) * 3, 0); | |
518 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
519 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
520 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
521 } | |
522 | |
523 TEST_F(GLES2DecoderWithShaderTest, DrawArraysInstancedANGLEFails) { | |
524 SetupTexture(); | |
525 SetupVertexBuffer(); | |
526 DoEnableVertexAttribArray(1); | |
527 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
528 | |
529 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) | |
530 .Times(0) | |
531 .RetiresOnSaturation(); | |
532 DrawArraysInstancedANGLE cmd; | |
533 cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); | |
534 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
535 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
536 } | |
537 | |
538 TEST_F(GLES2DecoderGeometryInstancingTest, | |
539 DrawArraysInstancedANGLENoAttributesFails) { | |
540 SetupTexture(); | |
541 | |
542 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) | |
543 .Times(0) | |
544 .RetiresOnSaturation(); | |
545 DrawArraysInstancedANGLE cmd; | |
546 cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); | |
547 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
548 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
549 } | |
550 | |
551 TEST_F(GLES2DecoderGeometryInstancingTest, | |
552 DrawArraysInstancedANGLESimulatedAttrib0) { | |
553 SetupTexture(); | |
554 SetupVertexBuffer(); | |
555 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
556 | |
557 AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); | |
558 SetupExpectationsForApplyingDefaultDirtyState(); | |
559 | |
560 DoVertexAttribDivisorANGLE(0, 1); | |
561 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, 3)) | |
562 .Times(1) | |
563 .RetiresOnSaturation(); | |
564 EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 0)) | |
565 .Times(1) | |
566 .RetiresOnSaturation(); | |
567 EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 1)) | |
568 .Times(1) | |
569 .RetiresOnSaturation(); | |
570 DrawArraysInstancedANGLE cmd; | |
571 cmd.Init(GL_TRIANGLES, 0, kNumVertices, 3); | |
572 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
573 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
574 } | |
575 | |
576 TEST_F(GLES2DecoderGeometryInstancingTest, | |
577 DrawArraysInstancedANGLEMissingAttributesFails) { | |
578 DoEnableVertexAttribArray(1); | |
579 | |
580 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) | |
581 .Times(0); | |
582 DrawArraysInstancedANGLE cmd; | |
583 cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); | |
584 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
585 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
586 } | |
587 | |
588 TEST_F(GLES2DecoderGeometryInstancingTest, | |
589 DrawArraysInstancedANGLEMissingAttributesZeroCountSucceeds) { | |
590 DoEnableVertexAttribArray(1); | |
591 | |
592 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) | |
593 .Times(0); | |
594 DrawArraysInstancedANGLE cmd; | |
595 cmd.Init(GL_TRIANGLES, 0, 0, 1); | |
596 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
597 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
598 } | |
599 | |
600 TEST_F(GLES2DecoderGeometryInstancingTest, | |
601 DrawArraysInstancedANGLEValidAttributesSucceeds) { | |
602 SetupTexture(); | |
603 SetupVertexBuffer(); | |
604 DoEnableVertexAttribArray(1); | |
605 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
606 AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); | |
607 SetupExpectationsForApplyingDefaultDirtyState(); | |
608 | |
609 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, 1)) | |
610 .Times(1) | |
611 .RetiresOnSaturation(); | |
612 DrawArraysInstancedANGLE cmd; | |
613 cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); | |
614 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
615 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
616 } | |
617 | |
618 TEST_F(GLES2DecoderGeometryInstancingTest, | |
619 DrawArraysInstancedANGLEWithInvalidModeFails) { | |
620 SetupVertexBuffer(); | |
621 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
622 | |
623 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) | |
624 .Times(0); | |
625 DrawArraysInstancedANGLE cmd; | |
626 cmd.Init(GL_QUADS, 0, 1, 1); | |
627 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
628 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
629 cmd.Init(GL_POLYGON, 0, 1, 1); | |
630 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
631 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
632 } | |
633 | |
634 TEST_F(GLES2DecoderGeometryInstancingTest, | |
635 DrawArraysInstancedANGLEInvalidPrimcountFails) { | |
636 SetupVertexBuffer(); | |
637 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
638 | |
639 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) | |
640 .Times(0); | |
641 DrawArraysInstancedANGLE cmd; | |
642 cmd.Init(GL_TRIANGLES, 0, 1, -1); | |
643 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
644 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
645 } | |
646 | |
647 // Per-instance data is twice as large, but number of instances is half | |
648 TEST_F(GLES2DecoderGeometryInstancingTest, | |
649 DrawArraysInstancedANGLELargeInstanceSucceeds) { | |
650 SetupTexture(); | |
651 SetupVertexBuffer(); | |
652 SetupExpectationsForApplyingDefaultDirtyState(); | |
653 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
654 | |
655 DoEnableVertexAttribArray(0); | |
656 DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); | |
657 DoVertexAttribDivisorANGLE(0, 1); | |
658 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, | |
659 kNumVertices / 2)) | |
660 .Times(1) | |
661 .RetiresOnSaturation(); | |
662 DrawArraysInstancedANGLE cmd; | |
663 cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices / 2); | |
664 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
665 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
666 } | |
667 | |
668 // Per-instance data is twice as large, but divisor is twice | |
669 TEST_F(GLES2DecoderGeometryInstancingTest, | |
670 DrawArraysInstancedANGLELargeDivisorSucceeds) { | |
671 SetupTexture(); | |
672 SetupVertexBuffer(); | |
673 SetupExpectationsForApplyingDefaultDirtyState(); | |
674 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
675 | |
676 DoEnableVertexAttribArray(0); | |
677 DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); | |
678 DoVertexAttribDivisorANGLE(0, 2); | |
679 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, | |
680 kNumVertices)) | |
681 .Times(1) | |
682 .RetiresOnSaturation(); | |
683 DrawArraysInstancedANGLE cmd; | |
684 cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices); | |
685 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
686 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
687 } | |
688 | |
689 TEST_F(GLES2DecoderGeometryInstancingTest, DrawArraysInstancedANGLELargeFails) { | |
690 SetupTexture(); | |
691 SetupVertexBuffer(); | |
692 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
693 | |
694 DoEnableVertexAttribArray(0); | |
695 DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); | |
696 DoVertexAttribDivisorANGLE(0, 1); | |
697 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) | |
698 .Times(0) | |
699 .RetiresOnSaturation(); | |
700 DrawArraysInstancedANGLE cmd; | |
701 cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices + 1); | |
702 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
703 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
704 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
705 | |
706 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) | |
707 .Times(0) | |
708 .RetiresOnSaturation(); | |
709 cmd.Init(GL_TRIANGLES, 0, kNumVertices + 1, kNumVertices); | |
710 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
711 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
712 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
713 } | |
714 | |
715 // Per-index data is twice as large, but number of indices is half | |
716 TEST_F(GLES2DecoderGeometryInstancingTest, | |
717 DrawArraysInstancedANGLELargeIndexSucceeds) { | |
718 SetupTexture(); | |
719 SetupVertexBuffer(); | |
720 SetupExpectationsForApplyingDefaultDirtyState(); | |
721 DoVertexAttribPointer(1, 4, GL_FLOAT, 0, 0); | |
722 | |
723 DoEnableVertexAttribArray(0); | |
724 DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); | |
725 DoVertexAttribDivisorANGLE(0, 1); | |
726 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices / 2, | |
727 kNumVertices)) | |
728 .Times(1) | |
729 .RetiresOnSaturation(); | |
730 DrawArraysInstancedANGLE cmd; | |
731 cmd.Init(GL_TRIANGLES, 0, kNumVertices / 2, kNumVertices); | |
732 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
733 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
734 } | |
735 | |
736 TEST_F(GLES2DecoderGeometryInstancingTest, | |
737 DrawArraysInstancedANGLENoDivisor0Fails) { | |
738 SetupTexture(); | |
739 SetupVertexBuffer(); | |
740 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
741 | |
742 DoEnableVertexAttribArray(0); | |
743 DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); | |
744 DoVertexAttribDivisorANGLE(0, 1); | |
745 DoVertexAttribDivisorANGLE(1, 1); | |
746 EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) | |
747 .Times(0) | |
748 .RetiresOnSaturation(); | |
749 DrawArraysInstancedANGLE cmd; | |
750 cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); | |
751 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
752 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
753 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
754 } | |
755 | |
756 TEST_F(GLES2DecoderWithShaderTest, DrawElementsNoAttributesSucceeds) { | |
757 SetupTexture(); | |
758 SetupIndexBuffer(); | |
759 AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0); | |
760 SetupExpectationsForApplyingDefaultDirtyState(); | |
761 EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount, | |
762 GL_UNSIGNED_SHORT, | |
763 BufferOffset(kValidIndexRangeStart * 2))) | |
764 .Times(1) | |
765 .RetiresOnSaturation(); | |
766 DrawElements cmd; | |
767 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
768 kValidIndexRangeStart * 2); | |
769 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
770 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
771 } | |
772 | |
773 TEST_F(GLES2DecoderWithShaderTest, DrawElementsMissingAttributesFails) { | |
774 SetupIndexBuffer(); | |
775 DoEnableVertexAttribArray(1); | |
776 | |
777 EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) | |
778 .Times(0); | |
779 DrawElements cmd; | |
780 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
781 kValidIndexRangeStart * 2); | |
782 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
783 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
784 } | |
785 | |
786 TEST_F(GLES2DecoderWithShaderTest, | |
787 DrawElementsMissingAttributesZeroCountSucceeds) { | |
788 SetupIndexBuffer(); | |
789 DoEnableVertexAttribArray(1); | |
790 | |
791 EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) | |
792 .Times(0); | |
793 DrawElements cmd; | |
794 cmd.Init(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT, | |
795 kValidIndexRangeStart * 2); | |
796 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
797 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
798 } | |
799 | |
800 TEST_F(GLES2DecoderWithShaderTest, DrawElementsExtraAttributesFails) { | |
801 SetupIndexBuffer(); | |
802 DoEnableVertexAttribArray(6); | |
803 | |
804 EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) | |
805 .Times(0); | |
806 DrawElements cmd; | |
807 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
808 kValidIndexRangeStart * 2); | |
809 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
810 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
811 } | |
812 | |
813 TEST_F(GLES2DecoderWithShaderTest, DrawElementsValidAttributesSucceeds) { | |
814 SetupTexture(); | |
815 SetupVertexBuffer(); | |
816 SetupIndexBuffer(); | |
817 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
818 AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId); | |
819 SetupExpectationsForApplyingDefaultDirtyState(); | |
820 | |
821 EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount, | |
822 GL_UNSIGNED_SHORT, | |
823 BufferOffset(kValidIndexRangeStart * 2))) | |
824 .Times(1) | |
825 .RetiresOnSaturation(); | |
826 DrawElements cmd; | |
827 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
828 kValidIndexRangeStart * 2); | |
829 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
830 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
831 } | |
832 | |
833 TEST_F(GLES2DecoderWithShaderTest, DrawElementsDeletedBufferFails) { | |
834 SetupVertexBuffer(); | |
835 SetupIndexBuffer(); | |
836 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
837 DeleteIndexBuffer(); | |
838 | |
839 EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) | |
840 .Times(0); | |
841 DrawElements cmd; | |
842 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
843 kValidIndexRangeStart * 2); | |
844 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
845 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
846 } | |
847 | |
848 TEST_F(GLES2DecoderWithShaderTest, DrawElementsDeletedProgramSucceeds) { | |
849 SetupTexture(); | |
850 SetupIndexBuffer(); | |
851 AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0); | |
852 SetupExpectationsForApplyingDefaultDirtyState(); | |
853 DoDeleteProgram(client_program_id_, kServiceProgramId); | |
854 | |
855 EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) | |
856 .Times(1); | |
857 EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)) | |
858 .Times(1); | |
859 DrawElements cmd; | |
860 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
861 kValidIndexRangeStart * 2); | |
862 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
863 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
864 } | |
865 | |
866 TEST_F(GLES2DecoderWithShaderTest, DrawElementsWithInvalidModeFails) { | |
867 SetupVertexBuffer(); | |
868 SetupIndexBuffer(); | |
869 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
870 | |
871 EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) | |
872 .Times(0); | |
873 DrawElements cmd; | |
874 cmd.Init(GL_QUADS, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
875 kValidIndexRangeStart * 2); | |
876 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
877 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
878 cmd.Init(GL_POLYGON, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
879 kValidIndexRangeStart); | |
880 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
881 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
882 } | |
883 | |
884 TEST_F(GLES2DecoderWithShaderTest, DrawElementsInvalidCountFails) { | |
885 SetupVertexBuffer(); | |
886 SetupIndexBuffer(); | |
887 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
888 | |
889 // Try start > 0 | |
890 EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); | |
891 DrawElements cmd; | |
892 cmd.Init(GL_TRIANGLES, kNumIndices, GL_UNSIGNED_SHORT, 2); | |
893 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
894 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
895 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
896 | |
897 // Try with count > size | |
898 cmd.Init(GL_TRIANGLES, kNumIndices + 1, GL_UNSIGNED_SHORT, 0); | |
899 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
900 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
901 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
902 } | |
903 | |
904 TEST_F(GLES2DecoderWithShaderTest, DrawElementsOutOfRangeIndicesFails) { | |
905 SetupVertexBuffer(); | |
906 SetupIndexBuffer(); | |
907 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
908 | |
909 EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); | |
910 DrawElements cmd; | |
911 cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT, | |
912 kInvalidIndexRangeStart * 2); | |
913 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
914 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
915 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
916 } | |
917 | |
918 TEST_F(GLES2DecoderWithShaderTest, DrawElementsOddOffsetForUint16Fails) { | |
919 SetupVertexBuffer(); | |
920 SetupIndexBuffer(); | |
921 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
922 | |
923 EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); | |
924 DrawElements cmd; | |
925 cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT, 1); | |
926 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
927 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
928 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
929 } | |
930 | |
931 TEST_F(GLES2DecoderWithShaderTest, DrawElementsInstancedANGLEFails) { | |
932 SetupTexture(); | |
933 SetupVertexBuffer(); | |
934 SetupIndexBuffer(); | |
935 DoEnableVertexAttribArray(1); | |
936 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
937 | |
938 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) | |
939 .Times(0) | |
940 .RetiresOnSaturation(); | |
941 DrawElementsInstancedANGLE cmd; | |
942 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
943 kValidIndexRangeStart * 2, 1); | |
944 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
945 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
946 } | |
947 | |
948 TEST_F(GLES2DecoderGeometryInstancingTest, | |
949 DrawElementsInstancedANGLENoAttributesFails) { | |
950 SetupTexture(); | |
951 SetupIndexBuffer(); | |
952 | |
953 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) | |
954 .Times(0) | |
955 .RetiresOnSaturation(); | |
956 DrawElementsInstancedANGLE cmd; | |
957 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
958 kValidIndexRangeStart * 2, 1); | |
959 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
960 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
961 } | |
962 | |
963 TEST_F(GLES2DecoderGeometryInstancingTest, | |
964 DrawElementsInstancedANGLESimulatedAttrib0) { | |
965 SetupTexture(); | |
966 SetupVertexBuffer(); | |
967 SetupIndexBuffer(); | |
968 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
969 | |
970 AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId); | |
971 SetupExpectationsForApplyingDefaultDirtyState(); | |
972 | |
973 DoVertexAttribDivisorANGLE(0, 1); | |
974 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE( | |
975 GL_TRIANGLES, | |
976 kValidIndexRangeCount, | |
977 GL_UNSIGNED_SHORT, | |
978 BufferOffset(kValidIndexRangeStart * 2), | |
979 3)) | |
980 .Times(1) | |
981 .RetiresOnSaturation(); | |
982 EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 0)) | |
983 .Times(1) | |
984 .RetiresOnSaturation(); | |
985 EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 1)) | |
986 .Times(1) | |
987 .RetiresOnSaturation(); | |
988 DrawElementsInstancedANGLE cmd; | |
989 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
990 kValidIndexRangeStart * 2, 3); | |
991 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
992 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
993 } | |
994 | |
995 TEST_F(GLES2DecoderGeometryInstancingTest, | |
996 DrawElementsInstancedANGLEMissingAttributesFails) { | |
997 SetupIndexBuffer(); | |
998 DoEnableVertexAttribArray(1); | |
999 | |
1000 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) | |
1001 .Times(0); | |
1002 DrawElementsInstancedANGLE cmd; | |
1003 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
1004 kValidIndexRangeStart * 2, 1); | |
1005 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1006 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1007 } | |
1008 | |
1009 TEST_F(GLES2DecoderGeometryInstancingTest, | |
1010 DrawElementsInstancedANGLEMissingAttributesZeroCountSucceeds) { | |
1011 SetupIndexBuffer(); | |
1012 DoEnableVertexAttribArray(1); | |
1013 | |
1014 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) | |
1015 .Times(0); | |
1016 DrawElementsInstancedANGLE cmd; | |
1017 cmd.Init(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT, | |
1018 kValidIndexRangeStart * 2, 1); | |
1019 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1020 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1021 } | |
1022 | |
1023 TEST_F(GLES2DecoderGeometryInstancingTest, | |
1024 DrawElementsInstancedANGLEValidAttributesSucceeds) { | |
1025 SetupIndexBuffer(); | |
1026 SetupTexture(); | |
1027 SetupVertexBuffer(); | |
1028 DoEnableVertexAttribArray(1); | |
1029 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
1030 AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId); | |
1031 SetupExpectationsForApplyingDefaultDirtyState(); | |
1032 | |
1033 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE( | |
1034 GL_TRIANGLES, | |
1035 kValidIndexRangeCount, | |
1036 GL_UNSIGNED_SHORT, | |
1037 BufferOffset(kValidIndexRangeStart * 2), | |
1038 1)) | |
1039 .Times(1) | |
1040 .RetiresOnSaturation(); | |
1041 DrawElementsInstancedANGLE cmd; | |
1042 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
1043 kValidIndexRangeStart * 2, 1); | |
1044 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1045 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1046 } | |
1047 | |
1048 TEST_F(GLES2DecoderGeometryInstancingTest, | |
1049 DrawElementsInstancedANGLEWithInvalidModeFails) { | |
1050 SetupIndexBuffer(); | |
1051 SetupVertexBuffer(); | |
1052 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
1053 | |
1054 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) | |
1055 .Times(0); | |
1056 DrawElementsInstancedANGLE cmd; | |
1057 cmd.Init(GL_QUADS, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
1058 kValidIndexRangeStart * 2, 1); | |
1059 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1060 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
1061 cmd.Init(GL_INVALID_ENUM, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
1062 kValidIndexRangeStart * 2, 1); | |
1063 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1064 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
1065 } | |
1066 | |
1067 // Per-instance data is twice as large, but number of instances is half | |
1068 TEST_F(GLES2DecoderGeometryInstancingTest, | |
1069 DrawElementsInstancedANGLELargeInstanceSucceeds) { | |
1070 SetupTexture(); | |
1071 SetupIndexBuffer(); | |
1072 SetupVertexBuffer(); | |
1073 SetupExpectationsForApplyingDefaultDirtyState(); | |
1074 //Add offset so we're sure we're accessing data near the end of the buffer. | |
1075 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, | |
1076 (kNumVertices - kMaxValidIndex - 1) * 2 * | |
1077 sizeof(GLfloat)); | |
1078 | |
1079 DoEnableVertexAttribArray(0); | |
1080 DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); | |
1081 DoVertexAttribDivisorANGLE(0, 1); | |
1082 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE( | |
1083 GL_TRIANGLES, | |
1084 kValidIndexRangeCount, | |
1085 GL_UNSIGNED_SHORT, | |
1086 BufferOffset(kValidIndexRangeStart * 2), | |
1087 kNumVertices / 2)) | |
1088 .Times(1) | |
1089 .RetiresOnSaturation(); | |
1090 DrawElementsInstancedANGLE cmd; | |
1091 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
1092 kValidIndexRangeStart * 2, kNumVertices / 2); | |
1093 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1094 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1095 } | |
1096 | |
1097 // Per-instance data is twice as large, but divisor is twice | |
1098 TEST_F(GLES2DecoderGeometryInstancingTest, | |
1099 DrawElementsInstancedANGLELargeDivisorSucceeds) { | |
1100 SetupTexture(); | |
1101 SetupIndexBuffer(); | |
1102 SetupVertexBuffer(); | |
1103 SetupExpectationsForApplyingDefaultDirtyState(); | |
1104 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
1105 | |
1106 DoEnableVertexAttribArray(0); | |
1107 DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); | |
1108 DoVertexAttribDivisorANGLE(0, 2); | |
1109 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE( | |
1110 GL_TRIANGLES, | |
1111 kValidIndexRangeCount, | |
1112 GL_UNSIGNED_SHORT, | |
1113 BufferOffset(kValidIndexRangeStart * 2), | |
1114 kNumVertices)) | |
1115 .Times(1) | |
1116 .RetiresOnSaturation(); | |
1117 DrawElementsInstancedANGLE cmd; | |
1118 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
1119 kValidIndexRangeStart * 2, kNumVertices); | |
1120 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1121 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1122 } | |
1123 | |
1124 TEST_F(GLES2DecoderGeometryInstancingTest, | |
1125 DrawElementsInstancedANGLELargeFails) { | |
1126 SetupTexture(); | |
1127 SetupIndexBuffer(); | |
1128 SetupVertexBuffer(); | |
1129 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
1130 | |
1131 DoEnableVertexAttribArray(0); | |
1132 DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); | |
1133 DoVertexAttribDivisorANGLE(0, 1); | |
1134 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) | |
1135 .Times(0) | |
1136 .RetiresOnSaturation(); | |
1137 DrawElementsInstancedANGLE cmd; | |
1138 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
1139 kValidIndexRangeStart * 2, kNumVertices + 1); | |
1140 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1141 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1142 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1143 | |
1144 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) | |
1145 .Times(0) | |
1146 .RetiresOnSaturation(); | |
1147 cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT, | |
1148 kInvalidIndexRangeStart * 2, kNumVertices); | |
1149 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1150 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1151 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1152 } | |
1153 | |
1154 TEST_F(GLES2DecoderGeometryInstancingTest, | |
1155 DrawElementsInstancedANGLEInvalidPrimcountFails) { | |
1156 SetupTexture(); | |
1157 SetupIndexBuffer(); | |
1158 SetupVertexBuffer(); | |
1159 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
1160 | |
1161 DoEnableVertexAttribArray(0); | |
1162 DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); | |
1163 DoVertexAttribDivisorANGLE(0, 1); | |
1164 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) | |
1165 .Times(0) | |
1166 .RetiresOnSaturation(); | |
1167 DrawElementsInstancedANGLE cmd; | |
1168 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
1169 kValidIndexRangeStart * 2, -1); | |
1170 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1171 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1172 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1173 } | |
1174 | |
1175 // Per-index data is twice as large, but values of indices are smaller | |
1176 TEST_F(GLES2DecoderGeometryInstancingTest, | |
1177 DrawElementsInstancedANGLELargeIndexSucceeds) { | |
1178 SetupTexture(); | |
1179 SetupIndexBuffer(); | |
1180 SetupVertexBuffer(); | |
1181 SetupExpectationsForApplyingDefaultDirtyState(); | |
1182 DoVertexAttribPointer(1, 4, GL_FLOAT, 0, 0); | |
1183 | |
1184 DoEnableVertexAttribArray(0); | |
1185 DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); | |
1186 DoVertexAttribDivisorANGLE(0, 1); | |
1187 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE( | |
1188 GL_TRIANGLES, | |
1189 kValidIndexRangeCount, | |
1190 GL_UNSIGNED_SHORT, | |
1191 BufferOffset(kValidIndexRangeStart * 2), | |
1192 kNumVertices)) | |
1193 .Times(1) | |
1194 .RetiresOnSaturation(); | |
1195 DrawElementsInstancedANGLE cmd; | |
1196 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
1197 kValidIndexRangeStart * 2, kNumVertices); | |
1198 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1199 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1200 } | |
1201 | |
1202 TEST_F(GLES2DecoderGeometryInstancingTest, | |
1203 DrawElementsInstancedANGLENoDivisor0Fails) { | |
1204 SetupTexture(); | |
1205 SetupIndexBuffer(); | |
1206 SetupVertexBuffer(); | |
1207 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
1208 | |
1209 DoEnableVertexAttribArray(0); | |
1210 DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); | |
1211 DoVertexAttribDivisorANGLE(0, 1); | |
1212 DoVertexAttribDivisorANGLE(1, 1); | |
1213 EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) | |
1214 .Times(0) | |
1215 .RetiresOnSaturation(); | |
1216 DrawElementsInstancedANGLE cmd; | |
1217 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
1218 kValidIndexRangeStart * 2, kNumVertices); | |
1219 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1220 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1221 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1222 } | |
1223 | |
1224 TEST_F(GLES2DecoderWithShaderTest, GetVertexAttribPointervSucceeds) { | |
1225 const float dummy = 0; | |
1226 const GLuint kOffsetToTestFor = sizeof(dummy) * 4; | |
1227 const GLuint kIndexToTest = 1; | |
1228 GetVertexAttribPointerv::Result* result = | |
1229 static_cast<GetVertexAttribPointerv::Result*>(shared_memory_address_); | |
1230 result->size = 0; | |
1231 const GLuint* result_value = result->GetData(); | |
1232 // Test that initial value is 0. | |
1233 GetVertexAttribPointerv cmd; | |
1234 cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER, | |
1235 shared_memory_id_, shared_memory_offset_); | |
1236 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1237 EXPECT_EQ(sizeof(*result_value), result->size); | |
1238 EXPECT_EQ(0u, *result_value); | |
1239 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1240 | |
1241 // Set the value and see that we get it. | |
1242 SetupVertexBuffer(); | |
1243 DoVertexAttribPointer(kIndexToTest, 2, GL_FLOAT, 0, kOffsetToTestFor); | |
1244 result->size = 0; | |
1245 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1246 EXPECT_EQ(sizeof(*result_value), result->size); | |
1247 EXPECT_EQ(kOffsetToTestFor, *result_value); | |
1248 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1249 } | |
1250 | |
1251 TEST_F(GLES2DecoderWithShaderTest, GetVertexAttribPointervBadArgsFails) { | |
1252 const GLuint kIndexToTest = 1; | |
1253 GetVertexAttribPointerv::Result* result = | |
1254 static_cast<GetVertexAttribPointerv::Result*>(shared_memory_address_); | |
1255 result->size = 0; | |
1256 const GLuint* result_value = result->GetData(); | |
1257 // Test pname invalid fails. | |
1258 GetVertexAttribPointerv cmd; | |
1259 cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER + 1, | |
1260 shared_memory_id_, shared_memory_offset_); | |
1261 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1262 EXPECT_EQ(0u, result->size); | |
1263 EXPECT_EQ(kInitialResult, *result_value); | |
1264 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
1265 | |
1266 // Test index out of range fails. | |
1267 result->size = 0; | |
1268 cmd.Init(kNumVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_POINTER, | |
1269 shared_memory_id_, shared_memory_offset_); | |
1270 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1271 EXPECT_EQ(0u, result->size); | |
1272 EXPECT_EQ(kInitialResult, *result_value); | |
1273 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1274 | |
1275 // Test memory id bad fails. | |
1276 cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER, | |
1277 kInvalidSharedMemoryId, shared_memory_offset_); | |
1278 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1279 | |
1280 // Test memory offset bad fails. | |
1281 cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER, | |
1282 shared_memory_id_, kInvalidSharedMemoryOffset); | |
1283 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1284 } | |
1285 | |
1286 TEST_F(GLES2DecoderWithShaderTest, GetUniformivSucceeds) { | |
1287 GetUniformiv::Result* result = | |
1288 static_cast<GetUniformiv::Result*>(shared_memory_address_); | |
1289 result->size = 0; | |
1290 GetUniformiv cmd; | |
1291 cmd.Init(client_program_id_, | |
1292 kUniform2FakeLocation, | |
1293 kSharedMemoryId, kSharedMemoryOffset); | |
1294 EXPECT_CALL(*gl_, GetUniformiv(kServiceProgramId, kUniform2RealLocation, _)) | |
1295 .Times(1); | |
1296 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1297 EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), | |
1298 result->size); | |
1299 } | |
1300 | |
1301 TEST_F(GLES2DecoderWithShaderTest, GetUniformivArrayElementSucceeds) { | |
1302 GetUniformiv::Result* result = | |
1303 static_cast<GetUniformiv::Result*>(shared_memory_address_); | |
1304 result->size = 0; | |
1305 GetUniformiv cmd; | |
1306 cmd.Init(client_program_id_, | |
1307 kUniform2ElementFakeLocation, | |
1308 kSharedMemoryId, kSharedMemoryOffset); | |
1309 EXPECT_CALL(*gl_, | |
1310 GetUniformiv(kServiceProgramId, kUniform2ElementRealLocation, _)) | |
1311 .Times(1); | |
1312 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1313 EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), | |
1314 result->size); | |
1315 } | |
1316 | |
1317 TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadProgramFails) { | |
1318 GetUniformiv::Result* result = | |
1319 static_cast<GetUniformiv::Result*>(shared_memory_address_); | |
1320 result->size = 0; | |
1321 GetUniformiv cmd; | |
1322 // non-existant program | |
1323 cmd.Init(kInvalidClientId, | |
1324 kUniform2FakeLocation, | |
1325 kSharedMemoryId, kSharedMemoryOffset); | |
1326 EXPECT_CALL(*gl_, GetUniformiv(_, _, _)) | |
1327 .Times(0); | |
1328 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1329 EXPECT_EQ(0U, result->size); | |
1330 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1331 // Valid id that is not a program. The GL spec requires a different error for | |
1332 // this case. | |
1333 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1334 result->size = kInitialResult; | |
1335 cmd.Init(client_shader_id_, | |
1336 kUniform2FakeLocation, | |
1337 kSharedMemoryId, kSharedMemoryOffset); | |
1338 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1339 EXPECT_EQ(0U, result->size); | |
1340 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1341 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1342 // Unlinked program | |
1343 EXPECT_CALL(*gl_, CreateProgram()) | |
1344 .Times(1) | |
1345 .WillOnce(Return(kNewServiceId)) | |
1346 .RetiresOnSaturation(); | |
1347 CreateProgram cmd2; | |
1348 cmd2.Init(kNewClientId); | |
1349 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
1350 result->size = kInitialResult; | |
1351 cmd.Init(kNewClientId, | |
1352 kUniform2FakeLocation, | |
1353 kSharedMemoryId, kSharedMemoryOffset); | |
1354 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1355 EXPECT_EQ(0U, result->size); | |
1356 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1357 } | |
1358 | |
1359 TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadLocationFails) { | |
1360 GetUniformiv::Result* result = | |
1361 static_cast<GetUniformiv::Result*>(shared_memory_address_); | |
1362 result->size = 0; | |
1363 GetUniformiv cmd; | |
1364 // invalid location | |
1365 cmd.Init(client_program_id_, kInvalidUniformLocation, | |
1366 kSharedMemoryId, kSharedMemoryOffset); | |
1367 EXPECT_CALL(*gl_, GetUniformiv(_, _, _)) | |
1368 .Times(0); | |
1369 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1370 EXPECT_EQ(0U, result->size); | |
1371 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1372 } | |
1373 | |
1374 TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadSharedMemoryFails) { | |
1375 GetUniformiv cmd; | |
1376 cmd.Init(client_program_id_, | |
1377 kUniform2FakeLocation, | |
1378 kInvalidSharedMemoryId, kSharedMemoryOffset); | |
1379 EXPECT_CALL(*gl_, GetUniformiv(_, _, _)) | |
1380 .Times(0); | |
1381 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1382 cmd.Init(client_program_id_, kUniform2FakeLocation, | |
1383 kSharedMemoryId, kInvalidSharedMemoryOffset); | |
1384 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1385 }; | |
1386 | |
1387 TEST_F(GLES2DecoderWithShaderTest, GetUniformfvSucceeds) { | |
1388 GetUniformfv::Result* result = | |
1389 static_cast<GetUniformfv::Result*>(shared_memory_address_); | |
1390 result->size = 0; | |
1391 GetUniformfv cmd; | |
1392 cmd.Init(client_program_id_, | |
1393 kUniform2FakeLocation, | |
1394 kSharedMemoryId, kSharedMemoryOffset); | |
1395 EXPECT_CALL(*gl_, GetUniformfv(kServiceProgramId, kUniform2RealLocation, _)) | |
1396 .Times(1); | |
1397 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1398 EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), | |
1399 result->size); | |
1400 } | |
1401 | |
1402 TEST_F(GLES2DecoderWithShaderTest, GetUniformfvArrayElementSucceeds) { | |
1403 GetUniformfv::Result* result = | |
1404 static_cast<GetUniformfv::Result*>(shared_memory_address_); | |
1405 result->size = 0; | |
1406 GetUniformfv cmd; | |
1407 cmd.Init(client_program_id_, | |
1408 kUniform2ElementFakeLocation, | |
1409 kSharedMemoryId, kSharedMemoryOffset); | |
1410 EXPECT_CALL(*gl_, | |
1411 GetUniformfv(kServiceProgramId, kUniform2ElementRealLocation, _)) | |
1412 .Times(1); | |
1413 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1414 EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), | |
1415 result->size); | |
1416 } | |
1417 | |
1418 TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadProgramFails) { | |
1419 GetUniformfv::Result* result = | |
1420 static_cast<GetUniformfv::Result*>(shared_memory_address_); | |
1421 result->size = 0; | |
1422 GetUniformfv cmd; | |
1423 // non-existant program | |
1424 cmd.Init(kInvalidClientId, | |
1425 kUniform2FakeLocation, | |
1426 kSharedMemoryId, kSharedMemoryOffset); | |
1427 EXPECT_CALL(*gl_, GetUniformfv(_, _, _)) | |
1428 .Times(0); | |
1429 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1430 EXPECT_EQ(0U, result->size); | |
1431 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1432 // Valid id that is not a program. The GL spec requires a different error for | |
1433 // this case. | |
1434 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1435 result->size = kInitialResult; | |
1436 cmd.Init(client_shader_id_, | |
1437 kUniform2FakeLocation, | |
1438 kSharedMemoryId, kSharedMemoryOffset); | |
1439 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1440 EXPECT_EQ(0U, result->size); | |
1441 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1442 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1443 // Unlinked program | |
1444 EXPECT_CALL(*gl_, CreateProgram()) | |
1445 .Times(1) | |
1446 .WillOnce(Return(kNewServiceId)) | |
1447 .RetiresOnSaturation(); | |
1448 CreateProgram cmd2; | |
1449 cmd2.Init(kNewClientId); | |
1450 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
1451 result->size = kInitialResult; | |
1452 cmd.Init(kNewClientId, | |
1453 kUniform2FakeLocation, | |
1454 kSharedMemoryId, kSharedMemoryOffset); | |
1455 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1456 EXPECT_EQ(0U, result->size); | |
1457 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1458 } | |
1459 | |
1460 TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadLocationFails) { | |
1461 GetUniformfv::Result* result = | |
1462 static_cast<GetUniformfv::Result*>(shared_memory_address_); | |
1463 result->size = 0; | |
1464 GetUniformfv cmd; | |
1465 // invalid location | |
1466 cmd.Init(client_program_id_, kInvalidUniformLocation, | |
1467 kSharedMemoryId, kSharedMemoryOffset); | |
1468 EXPECT_CALL(*gl_, GetUniformfv(_, _, _)) | |
1469 .Times(0); | |
1470 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1471 EXPECT_EQ(0U, result->size); | |
1472 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1473 } | |
1474 | |
1475 TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadSharedMemoryFails) { | |
1476 GetUniformfv cmd; | |
1477 cmd.Init(client_program_id_, | |
1478 kUniform2FakeLocation, | |
1479 kInvalidSharedMemoryId, kSharedMemoryOffset); | |
1480 EXPECT_CALL(*gl_, GetUniformfv(_, _, _)) | |
1481 .Times(0); | |
1482 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1483 cmd.Init(client_program_id_, kUniform2FakeLocation, | |
1484 kSharedMemoryId, kInvalidSharedMemoryOffset); | |
1485 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1486 }; | |
1487 | |
1488 TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersSucceeds) { | |
1489 GetAttachedShaders cmd; | |
1490 typedef GetAttachedShaders::Result Result; | |
1491 Result* result = static_cast<Result*>(shared_memory_address_); | |
1492 result->size = 0; | |
1493 EXPECT_CALL(*gl_, GetAttachedShaders(kServiceProgramId, 1, _, _)) | |
1494 .WillOnce(DoAll(SetArgumentPointee<2>(1), | |
1495 SetArgumentPointee<3>(kServiceShaderId))); | |
1496 cmd.Init(client_program_id_, shared_memory_id_, shared_memory_offset_, | |
1497 Result::ComputeSize(1)); | |
1498 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1499 EXPECT_EQ(1, result->GetNumResults()); | |
1500 EXPECT_EQ(client_shader_id_, result->GetData()[0]); | |
1501 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1502 } | |
1503 | |
1504 TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersResultNotInitFail) { | |
1505 GetAttachedShaders cmd; | |
1506 typedef GetAttachedShaders::Result Result; | |
1507 Result* result = static_cast<Result*>(shared_memory_address_); | |
1508 result->size = 1; | |
1509 EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)) | |
1510 .Times(0); | |
1511 cmd.Init(client_program_id_, shared_memory_id_, shared_memory_offset_, | |
1512 Result::ComputeSize(1)); | |
1513 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1514 } | |
1515 | |
1516 TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersBadProgramFails) { | |
1517 GetAttachedShaders cmd; | |
1518 typedef GetAttachedShaders::Result Result; | |
1519 Result* result = static_cast<Result*>(shared_memory_address_); | |
1520 result->size = 0; | |
1521 EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)) | |
1522 .Times(0); | |
1523 cmd.Init(kInvalidClientId, shared_memory_id_, shared_memory_offset_, | |
1524 Result::ComputeSize(1)); | |
1525 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1526 EXPECT_EQ(0U, result->size); | |
1527 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1528 } | |
1529 | |
1530 TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersBadSharedMemoryFails) { | |
1531 GetAttachedShaders cmd; | |
1532 typedef GetAttachedShaders::Result Result; | |
1533 cmd.Init(client_program_id_, kInvalidSharedMemoryId, shared_memory_offset_, | |
1534 Result::ComputeSize(1)); | |
1535 EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)) | |
1536 .Times(0); | |
1537 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1538 cmd.Init(client_program_id_, shared_memory_id_, kInvalidSharedMemoryOffset, | |
1539 Result::ComputeSize(1)); | |
1540 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1541 } | |
1542 | |
1543 TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatSucceeds) { | |
1544 ScopedGLImplementationSetter gl_impl(::gfx::kGLImplementationEGLGLES2); | |
1545 GetShaderPrecisionFormat cmd; | |
1546 typedef GetShaderPrecisionFormat::Result Result; | |
1547 Result* result = static_cast<Result*>(shared_memory_address_); | |
1548 result->success = 0; | |
1549 const GLint range[2] = { 62, 62 }; | |
1550 const GLint precision = 16; | |
1551 EXPECT_CALL(*gl_,GetShaderPrecisionFormat(_, _, _, _)) | |
1552 .WillOnce(DoAll(SetArrayArgument<2>(range,range+2), | |
1553 SetArgumentPointee<3>(precision))) | |
1554 .RetiresOnSaturation(); | |
1555 cmd.Init(GL_VERTEX_SHADER, GL_HIGH_FLOAT, | |
1556 shared_memory_id_, shared_memory_offset_); | |
1557 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1558 EXPECT_NE(0, result->success); | |
1559 EXPECT_EQ(range[0], result->min_range); | |
1560 EXPECT_EQ(range[1], result->max_range); | |
1561 EXPECT_EQ(precision, result->precision); | |
1562 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1563 } | |
1564 | |
1565 TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatResultNotInitFails) { | |
1566 GetShaderPrecisionFormat cmd; | |
1567 typedef GetShaderPrecisionFormat::Result Result; | |
1568 Result* result = static_cast<Result*>(shared_memory_address_); | |
1569 result->success = 1; | |
1570 // NOTE: GL might not be called. There is no Desktop OpenGL equivalent | |
1571 cmd.Init(GL_VERTEX_SHADER, GL_HIGH_FLOAT, | |
1572 shared_memory_id_, shared_memory_offset_); | |
1573 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1574 } | |
1575 | |
1576 TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatBadArgsFails) { | |
1577 typedef GetShaderPrecisionFormat::Result Result; | |
1578 Result* result = static_cast<Result*>(shared_memory_address_); | |
1579 result->success = 0; | |
1580 GetShaderPrecisionFormat cmd; | |
1581 cmd.Init(GL_TEXTURE_2D, GL_HIGH_FLOAT, | |
1582 shared_memory_id_, shared_memory_offset_); | |
1583 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1584 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
1585 result->success = 0; | |
1586 cmd.Init(GL_VERTEX_SHADER, GL_TEXTURE_2D, | |
1587 shared_memory_id_, shared_memory_offset_); | |
1588 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1589 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
1590 } | |
1591 | |
1592 TEST_F(GLES2DecoderWithShaderTest, | |
1593 GetShaderPrecisionFormatBadSharedMemoryFails) { | |
1594 GetShaderPrecisionFormat cmd; | |
1595 cmd.Init(GL_VERTEX_SHADER, GL_HIGH_FLOAT, | |
1596 kInvalidSharedMemoryId, shared_memory_offset_); | |
1597 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1598 cmd.Init(GL_VERTEX_SHADER, GL_TEXTURE_2D, | |
1599 shared_memory_id_, kInvalidSharedMemoryOffset); | |
1600 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1601 } | |
1602 | |
1603 TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformSucceeds) { | |
1604 const GLuint kUniformIndex = 1; | |
1605 const uint32 kBucketId = 123; | |
1606 GetActiveUniform cmd; | |
1607 typedef GetActiveUniform::Result Result; | |
1608 Result* result = static_cast<Result*>(shared_memory_address_); | |
1609 result->success = 0; | |
1610 cmd.Init(client_program_id_, kUniformIndex, kBucketId, | |
1611 shared_memory_id_, shared_memory_offset_); | |
1612 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1613 EXPECT_NE(0, result->success); | |
1614 EXPECT_EQ(kUniform2Size, result->size); | |
1615 EXPECT_EQ(kUniform2Type, result->type); | |
1616 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1617 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); | |
1618 ASSERT_TRUE(bucket != NULL); | |
1619 EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kUniform2Name, | |
1620 bucket->size())); | |
1621 } | |
1622 | |
1623 TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformResultNotInitFails) { | |
1624 const GLuint kUniformIndex = 1; | |
1625 const uint32 kBucketId = 123; | |
1626 GetActiveUniform cmd; | |
1627 typedef GetActiveUniform::Result Result; | |
1628 Result* result = static_cast<Result*>(shared_memory_address_); | |
1629 result->success = 1; | |
1630 cmd.Init(client_program_id_, kUniformIndex, kBucketId, | |
1631 shared_memory_id_, shared_memory_offset_); | |
1632 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1633 } | |
1634 | |
1635 TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadProgramFails) { | |
1636 const GLuint kUniformIndex = 1; | |
1637 const uint32 kBucketId = 123; | |
1638 GetActiveUniform cmd; | |
1639 typedef GetActiveUniform::Result Result; | |
1640 Result* result = static_cast<Result*>(shared_memory_address_); | |
1641 result->success = 0; | |
1642 cmd.Init(kInvalidClientId, kUniformIndex, kBucketId, | |
1643 shared_memory_id_, shared_memory_offset_); | |
1644 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1645 EXPECT_EQ(0, result->success); | |
1646 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1647 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1648 result->success = 0; | |
1649 cmd.Init(client_shader_id_, kUniformIndex, kBucketId, | |
1650 shared_memory_id_, shared_memory_offset_); | |
1651 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1652 EXPECT_EQ(0, result->success); | |
1653 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1654 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1655 } | |
1656 | |
1657 TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadIndexFails) { | |
1658 const uint32 kBucketId = 123; | |
1659 GetActiveUniform cmd; | |
1660 typedef GetActiveUniform::Result Result; | |
1661 Result* result = static_cast<Result*>(shared_memory_address_); | |
1662 result->success = 0; | |
1663 cmd.Init(client_program_id_, kBadUniformIndex, kBucketId, | |
1664 shared_memory_id_, shared_memory_offset_); | |
1665 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1666 EXPECT_EQ(0, result->success); | |
1667 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1668 } | |
1669 | |
1670 TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadSharedMemoryFails) { | |
1671 const GLuint kUniformIndex = 1; | |
1672 const uint32 kBucketId = 123; | |
1673 GetActiveUniform cmd; | |
1674 cmd.Init(client_program_id_, kUniformIndex, kBucketId, | |
1675 kInvalidSharedMemoryId, shared_memory_offset_); | |
1676 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1677 cmd.Init(client_program_id_, kUniformIndex, kBucketId, | |
1678 shared_memory_id_, kInvalidSharedMemoryOffset); | |
1679 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1680 } | |
1681 | |
1682 TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribSucceeds) { | |
1683 const GLuint kAttribIndex = 1; | |
1684 const uint32 kBucketId = 123; | |
1685 GetActiveAttrib cmd; | |
1686 typedef GetActiveAttrib::Result Result; | |
1687 Result* result = static_cast<Result*>(shared_memory_address_); | |
1688 result->success = 0; | |
1689 cmd.Init(client_program_id_, kAttribIndex, kBucketId, | |
1690 shared_memory_id_, shared_memory_offset_); | |
1691 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1692 EXPECT_NE(0, result->success); | |
1693 EXPECT_EQ(kAttrib2Size, result->size); | |
1694 EXPECT_EQ(kAttrib2Type, result->type); | |
1695 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1696 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); | |
1697 ASSERT_TRUE(bucket != NULL); | |
1698 EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kAttrib2Name, | |
1699 bucket->size())); | |
1700 } | |
1701 | |
1702 TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribResultNotInitFails) { | |
1703 const GLuint kAttribIndex = 1; | |
1704 const uint32 kBucketId = 123; | |
1705 GetActiveAttrib cmd; | |
1706 typedef GetActiveAttrib::Result Result; | |
1707 Result* result = static_cast<Result*>(shared_memory_address_); | |
1708 result->success = 1; | |
1709 cmd.Init(client_program_id_, kAttribIndex, kBucketId, | |
1710 shared_memory_id_, shared_memory_offset_); | |
1711 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1712 } | |
1713 | |
1714 TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadProgramFails) { | |
1715 const GLuint kAttribIndex = 1; | |
1716 const uint32 kBucketId = 123; | |
1717 GetActiveAttrib cmd; | |
1718 typedef GetActiveAttrib::Result Result; | |
1719 Result* result = static_cast<Result*>(shared_memory_address_); | |
1720 result->success = 0; | |
1721 cmd.Init(kInvalidClientId, kAttribIndex, kBucketId, | |
1722 shared_memory_id_, shared_memory_offset_); | |
1723 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1724 EXPECT_EQ(0, result->success); | |
1725 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1726 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1727 result->success = 0; | |
1728 cmd.Init(client_shader_id_, kAttribIndex, kBucketId, | |
1729 shared_memory_id_, shared_memory_offset_); | |
1730 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1731 EXPECT_EQ(0, result->success); | |
1732 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1733 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1734 } | |
1735 | |
1736 TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadIndexFails) { | |
1737 const uint32 kBucketId = 123; | |
1738 GetActiveAttrib cmd; | |
1739 typedef GetActiveAttrib::Result Result; | |
1740 Result* result = static_cast<Result*>(shared_memory_address_); | |
1741 result->success = 0; | |
1742 cmd.Init(client_program_id_, kBadAttribIndex, kBucketId, | |
1743 shared_memory_id_, shared_memory_offset_); | |
1744 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1745 EXPECT_EQ(0, result->success); | |
1746 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1747 } | |
1748 | |
1749 TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadSharedMemoryFails) { | |
1750 const GLuint kAttribIndex = 1; | |
1751 const uint32 kBucketId = 123; | |
1752 GetActiveAttrib cmd; | |
1753 cmd.Init(client_program_id_, kAttribIndex, kBucketId, | |
1754 kInvalidSharedMemoryId, shared_memory_offset_); | |
1755 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1756 cmd.Init(client_program_id_, kAttribIndex, kBucketId, | |
1757 shared_memory_id_, kInvalidSharedMemoryOffset); | |
1758 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1759 } | |
1760 | |
1761 TEST_F(GLES2DecoderWithShaderTest, GetShaderInfoLogValidArgs) { | |
1762 const char* kInfo = "hello"; | |
1763 const uint32 kBucketId = 123; | |
1764 CompileShader compile_cmd; | |
1765 GetShaderInfoLog cmd; | |
1766 EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _)); | |
1767 EXPECT_CALL(*gl_, CompileShader(kServiceShaderId)); | |
1768 EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _)) | |
1769 .WillOnce(SetArgumentPointee<2>(GL_FALSE)) | |
1770 .RetiresOnSaturation(); | |
1771 EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_INFO_LOG_LENGTH, _)) | |
1772 .WillOnce(SetArgumentPointee<2>(strlen(kInfo) + 1)) | |
1773 .RetiresOnSaturation(); | |
1774 EXPECT_CALL( | |
1775 *gl_, GetShaderInfoLog(kServiceShaderId, strlen(kInfo) + 1, _, _)) | |
1776 .WillOnce(DoAll(SetArgumentPointee<2>(strlen(kInfo)), | |
1777 SetArrayArgument<3>(kInfo, kInfo + strlen(kInfo) + 1))); | |
1778 compile_cmd.Init(client_shader_id_); | |
1779 cmd.Init(client_shader_id_, kBucketId); | |
1780 EXPECT_EQ(error::kNoError, ExecuteCmd(compile_cmd)); | |
1781 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1782 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); | |
1783 ASSERT_TRUE(bucket != NULL); | |
1784 EXPECT_EQ(strlen(kInfo) + 1, bucket->size()); | |
1785 EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kInfo, | |
1786 bucket->size())); | |
1787 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1788 } | |
1789 | |
1790 TEST_F(GLES2DecoderWithShaderTest, GetShaderInfoLogInvalidArgs) { | |
1791 const uint32 kBucketId = 123; | |
1792 GetShaderInfoLog cmd; | |
1793 cmd.Init(kInvalidClientId, kBucketId); | |
1794 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1795 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1796 } | 73 } |
1797 | 74 |
1798 TEST_F(GLES2DecoderTest, GetIntegervCached) { | 75 TEST_F(GLES2DecoderTest, GetIntegervCached) { |
1799 struct TestInfo { | 76 struct TestInfo { |
1800 GLenum pname; | 77 GLenum pname; |
1801 GLint expected; | 78 GLint expected; |
1802 }; | 79 }; |
1803 TestInfo tests[] = { | 80 TestInfo tests[] = { |
1804 { GL_MAX_TEXTURE_SIZE, TestHelper::kMaxTextureSize, }, | 81 { |
1805 { GL_MAX_CUBE_MAP_TEXTURE_SIZE, TestHelper::kMaxCubeMapTextureSize, }, | 82 GL_MAX_TEXTURE_SIZE, TestHelper::kMaxTextureSize, |
1806 { GL_MAX_RENDERBUFFER_SIZE, TestHelper::kMaxRenderbufferSize, }, | 83 }, |
| 84 { |
| 85 GL_MAX_CUBE_MAP_TEXTURE_SIZE, TestHelper::kMaxCubeMapTextureSize, |
| 86 }, |
| 87 { |
| 88 GL_MAX_RENDERBUFFER_SIZE, TestHelper::kMaxRenderbufferSize, |
| 89 }, |
1807 }; | 90 }; |
1808 typedef GetIntegerv::Result Result; | 91 typedef GetIntegerv::Result Result; |
1809 for (size_t ii = 0; ii < sizeof(tests) / sizeof(tests[0]); ++ii) { | 92 for (size_t ii = 0; ii < sizeof(tests) / sizeof(tests[0]); ++ii) { |
1810 const TestInfo& test = tests[ii]; | 93 const TestInfo& test = tests[ii]; |
1811 Result* result = static_cast<Result*>(shared_memory_address_); | 94 Result* result = static_cast<Result*>(shared_memory_address_); |
1812 EXPECT_CALL(*gl_, GetError()) | 95 EXPECT_CALL(*gl_, GetError()) |
1813 .WillOnce(Return(GL_NO_ERROR)) | 96 .WillOnce(Return(GL_NO_ERROR)) |
1814 .WillOnce(Return(GL_NO_ERROR)) | 97 .WillOnce(Return(GL_NO_ERROR)) |
1815 .RetiresOnSaturation(); | 98 .RetiresOnSaturation(); |
1816 EXPECT_CALL(*gl_, GetIntegerv(test.pname, _)) | 99 EXPECT_CALL(*gl_, GetIntegerv(test.pname, _)).Times(0); |
1817 .Times(0); | |
1818 result->size = 0; | 100 result->size = 0; |
1819 GetIntegerv cmd2; | 101 GetIntegerv cmd2; |
1820 cmd2.Init(test.pname, shared_memory_id_, shared_memory_offset_); | 102 cmd2.Init(test.pname, shared_memory_id_, shared_memory_offset_); |
1821 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | 103 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); |
1822 EXPECT_EQ( | 104 EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(test.pname), |
1823 decoder_->GetGLES2Util()->GLGetNumValuesReturned(test.pname), | 105 result->GetNumResults()); |
1824 result->GetNumResults()); | |
1825 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 106 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
1826 EXPECT_EQ(test.expected, result->GetData()[0]); | 107 EXPECT_EQ(test.expected, result->GetData()[0]); |
1827 } | 108 } |
1828 } | 109 } |
1829 | 110 |
1830 TEST_F(GLES2DecoderTest, CompileShaderValidArgs) { | |
1831 EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _)); | |
1832 EXPECT_CALL(*gl_, CompileShader(kServiceShaderId)); | |
1833 EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _)) | |
1834 .WillOnce(SetArgumentPointee<2>(GL_TRUE)) | |
1835 .RetiresOnSaturation(); | |
1836 CompileShader cmd; | |
1837 cmd.Init(client_shader_id_); | |
1838 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1839 } | |
1840 | |
1841 TEST_F(GLES2DecoderTest, CompileShaderInvalidArgs) { | |
1842 CompileShader cmd; | |
1843 cmd.Init(kInvalidClientId); | |
1844 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1845 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1846 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1847 cmd.Init(client_program_id_); | |
1848 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1849 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1850 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1851 } | |
1852 | |
1853 TEST_F(GLES2DecoderTest, ShaderSourceAndGetShaderSourceValidArgs) { | |
1854 const uint32 kBucketId = 123; | |
1855 const char kSource[] = "hello"; | |
1856 const uint32 kSourceSize = sizeof(kSource) - 1; | |
1857 memcpy(shared_memory_address_, kSource, kSourceSize); | |
1858 ShaderSource cmd; | |
1859 cmd.Init(client_shader_id_, | |
1860 kSharedMemoryId, kSharedMemoryOffset, kSourceSize); | |
1861 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1862 memset(shared_memory_address_, 0, kSourceSize); | |
1863 GetShaderSource get_cmd; | |
1864 get_cmd.Init(client_shader_id_, kBucketId); | |
1865 EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); | |
1866 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); | |
1867 ASSERT_TRUE(bucket != NULL); | |
1868 EXPECT_EQ(kSourceSize + 1, bucket->size()); | |
1869 EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kSource, | |
1870 bucket->size())); | |
1871 } | |
1872 | |
1873 TEST_F(GLES2DecoderTest, ShaderSourceInvalidArgs) { | |
1874 const char kSource[] = "hello"; | |
1875 const uint32 kSourceSize = sizeof(kSource) - 1; | |
1876 memcpy(shared_memory_address_, kSource, kSourceSize); | |
1877 ShaderSource cmd; | |
1878 cmd.Init(kInvalidClientId, | |
1879 kSharedMemoryId, kSharedMemoryOffset, kSourceSize); | |
1880 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1881 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1882 #if GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1883 cmd.Init(client_program_id_, | |
1884 kSharedMemoryId, kSharedMemoryOffset, kSourceSize); | |
1885 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1886 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1887 #endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS | |
1888 cmd.Init(client_shader_id_, | |
1889 kInvalidSharedMemoryId, kSharedMemoryOffset, kSourceSize); | |
1890 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1891 cmd.Init(client_shader_id_, | |
1892 kSharedMemoryId, kInvalidSharedMemoryOffset, kSourceSize); | |
1893 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1894 cmd.Init(client_shader_id_, | |
1895 kSharedMemoryId, kSharedMemoryOffset, kSharedBufferSize); | |
1896 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1897 } | |
1898 | |
1899 TEST_F(GLES2DecoderTest, ShaderSourceBucketAndGetShaderSourceValidArgs) { | |
1900 const uint32 kInBucketId = 123; | |
1901 const uint32 kOutBucketId = 125; | |
1902 const char kSource[] = "hello"; | |
1903 const uint32 kSourceSize = sizeof(kSource) - 1; | |
1904 SetBucketAsCString(kInBucketId, kSource); | |
1905 ShaderSourceBucket cmd; | |
1906 cmd.Init(client_shader_id_, kInBucketId); | |
1907 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1908 ClearSharedMemory(); | |
1909 GetShaderSource get_cmd; | |
1910 get_cmd.Init(client_shader_id_, kOutBucketId); | |
1911 EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); | |
1912 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kOutBucketId); | |
1913 ASSERT_TRUE(bucket != NULL); | |
1914 EXPECT_EQ(kSourceSize + 1, bucket->size()); | |
1915 EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kSource, | |
1916 bucket->size())); | |
1917 } | |
1918 | |
1919 TEST_F(GLES2DecoderTest, ShaderSourceBucketInvalidArgs) { | |
1920 const uint32 kBucketId = 123; | |
1921 const char kSource[] = "hello"; | |
1922 const uint32 kSourceSize = sizeof(kSource) - 1; | |
1923 memcpy(shared_memory_address_, kSource, kSourceSize); | |
1924 ShaderSourceBucket cmd; | |
1925 // Test no bucket. | |
1926 cmd.Init(client_texture_id_, kBucketId); | |
1927 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
1928 // Test invalid client. | |
1929 SetBucketAsCString(kBucketId, kSource); | |
1930 cmd.Init(kInvalidClientId, kBucketId); | |
1931 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1932 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
1933 } | |
1934 | |
1935 TEST_F(GLES2DecoderTest, ShaderSourceStripComments) { | |
1936 const uint32 kInBucketId = 123; | |
1937 const char kSource[] = "hello/*te\ast*/world//a\ab"; | |
1938 SetBucketAsCString(kInBucketId, kSource); | |
1939 ShaderSourceBucket cmd; | |
1940 cmd.Init(client_shader_id_, kInBucketId); | |
1941 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1942 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
1943 } | |
1944 | |
1945 TEST_F(GLES2DecoderTest, GenerateMipmapWrongFormatsFails) { | |
1946 EXPECT_CALL(*gl_, GenerateMipmapEXT(_)) | |
1947 .Times(0); | |
1948 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
1949 DoTexImage2D( | |
1950 GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
1951 0, 0); | |
1952 GenerateMipmap cmd; | |
1953 cmd.Init(GL_TEXTURE_2D); | |
1954 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1955 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
1956 } | |
1957 | |
1958 TEST_F(GLES2DecoderTest, GenerateMipmapHandlesOutOfMemory) { | |
1959 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
1960 TextureManager* manager = group().texture_manager(); | |
1961 TextureRef* texture_ref = manager->GetTexture(client_texture_id_); | |
1962 ASSERT_TRUE(texture_ref != NULL); | |
1963 Texture* texture = texture_ref->texture(); | |
1964 GLint width = 0; | |
1965 GLint height = 0; | |
1966 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height)); | |
1967 DoTexImage2D( | |
1968 GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
1969 kSharedMemoryId, kSharedMemoryOffset); | |
1970 EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D)) | |
1971 .Times(1); | |
1972 EXPECT_CALL(*gl_, GetError()) | |
1973 .WillOnce(Return(GL_NO_ERROR)) | |
1974 .WillOnce(Return(GL_OUT_OF_MEMORY)) | |
1975 .RetiresOnSaturation(); | |
1976 GenerateMipmap cmd; | |
1977 cmd.Init(GL_TEXTURE_2D); | |
1978 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
1979 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
1980 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height)); | |
1981 } | |
1982 | |
1983 TEST_F(GLES2DecoderTest, GenerateMipmapClearsUnclearedTexture) { | |
1984 EXPECT_CALL(*gl_, GenerateMipmapEXT(_)) | |
1985 .Times(0); | |
1986 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
1987 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
1988 0, 0); | |
1989 SetupClearTextureExpectations( | |
1990 kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, | |
1991 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); | |
1992 EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D)); | |
1993 EXPECT_CALL(*gl_, GetError()) | |
1994 .WillOnce(Return(GL_NO_ERROR)) | |
1995 .WillOnce(Return(GL_NO_ERROR)) | |
1996 .RetiresOnSaturation(); | |
1997 GenerateMipmap cmd; | |
1998 cmd.Init(GL_TEXTURE_2D); | |
1999 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2000 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
2001 } | |
2002 | |
2003 // Same as GenerateMipmapClearsUnclearedTexture, but with workaround | |
2004 // |set_texture_filters_before_generating_mipmap|. | |
2005 TEST_F(GLES2DecoderManualInitTest, SetTextureFiltersBeforeGenerateMipmap) { | |
2006 CommandLine command_line(0, NULL); | |
2007 command_line.AppendSwitchASCII( | |
2008 switches::kGpuDriverBugWorkarounds, | |
2009 base::IntToString(gpu::SET_TEXTURE_FILTER_BEFORE_GENERATING_MIPMAP)); | |
2010 InitState init; | |
2011 init.gl_version = "3.0"; | |
2012 init.bind_generates_resource = true; | |
2013 InitDecoderWithCommandLine(init, &command_line); | |
2014 | |
2015 EXPECT_CALL(*gl_, GenerateMipmapEXT(_)) | |
2016 .Times(0); | |
2017 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
2018 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
2019 0, 0); | |
2020 SetupClearTextureExpectations( | |
2021 kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, | |
2022 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); | |
2023 EXPECT_CALL(*gl_, TexParameteri( | |
2024 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST)) | |
2025 .Times(1) | |
2026 .RetiresOnSaturation(); | |
2027 EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D)); | |
2028 EXPECT_CALL(*gl_, TexParameteri( | |
2029 GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR)) | |
2030 .Times(1) | |
2031 .RetiresOnSaturation(); | |
2032 EXPECT_CALL(*gl_, GetError()) | |
2033 .WillOnce(Return(GL_NO_ERROR)) | |
2034 .WillOnce(Return(GL_NO_ERROR)) | |
2035 .RetiresOnSaturation(); | |
2036 GenerateMipmap cmd; | |
2037 cmd.Init(GL_TEXTURE_2D); | |
2038 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2039 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
2040 } | |
2041 | |
2042 TEST_F(GLES2DecoderWithShaderTest, Uniform1iValidArgs) { | |
2043 EXPECT_CALL(*gl_, Uniform1i(kUniform1RealLocation, 2)); | |
2044 Uniform1i cmd; | |
2045 cmd.Init(kUniform1FakeLocation, 2); | |
2046 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2047 } | |
2048 | |
2049 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivValidArgs) { | |
2050 EXPECT_CALL( | |
2051 *gl_, Uniform1iv(kUniform1RealLocation, 1, | |
2052 reinterpret_cast<const GLint*>(shared_memory_address_))); | |
2053 Uniform1iv cmd; | |
2054 cmd.Init(kUniform1FakeLocation, | |
2055 1, shared_memory_id_, shared_memory_offset_); | |
2056 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2057 } | |
2058 | |
2059 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidArgs2_0) { | |
2060 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); | |
2061 Uniform1iv cmd; | |
2062 cmd.Init(kUniform1FakeLocation, | |
2063 1, kInvalidSharedMemoryId, 0); | |
2064 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); | |
2065 } | |
2066 | |
2067 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidArgs2_1) { | |
2068 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); | |
2069 Uniform1iv cmd; | |
2070 cmd.Init(kUniform1FakeLocation, | |
2071 1, shared_memory_id_, kInvalidSharedMemoryOffset); | |
2072 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); | |
2073 } | |
2074 | |
2075 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivImmediateValidArgs) { | |
2076 Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); | |
2077 EXPECT_CALL( | |
2078 *gl_, | |
2079 Uniform1iv(kUniform1RealLocation, 1, | |
2080 reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); | |
2081 GLint temp[1 * 2] = { 0, }; | |
2082 cmd.Init(kUniform1FakeLocation, 1, | |
2083 &temp[0]); | |
2084 EXPECT_EQ(error::kNoError, | |
2085 ExecuteImmediateCmd(cmd, sizeof(temp))); | |
2086 } | |
2087 | |
2088 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidValidArgs) { | |
2089 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); | |
2090 Uniform1iv cmd; | |
2091 cmd.Init(kUniform1FakeLocation, | |
2092 2, shared_memory_id_, shared_memory_offset_); | |
2093 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2094 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
2095 } | |
2096 | |
2097 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivZeroCount) { | |
2098 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); | |
2099 Uniform1iv cmd; | |
2100 cmd.Init(kUniform1FakeLocation, | |
2101 0, shared_memory_id_, shared_memory_offset_); | |
2102 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2103 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
2104 } | |
2105 | |
2106 TEST_F(GLES2DecoderWithShaderTest, Uniform1iSamplerIsLmited) { | |
2107 EXPECT_CALL(*gl_, Uniform1i(_, _)).Times(0); | |
2108 Uniform1i cmd; | |
2109 cmd.Init( | |
2110 kUniform1FakeLocation, | |
2111 kNumTextureUnits); | |
2112 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2113 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
2114 } | |
2115 | |
2116 TEST_F(GLES2DecoderWithShaderTest, Uniform1ivSamplerIsLimited) { | |
2117 EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); | |
2118 Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); | |
2119 GLint temp[] = { kNumTextureUnits }; | |
2120 cmd.Init(kUniform1FakeLocation, 1, | |
2121 &temp[0]); | |
2122 EXPECT_EQ(error::kNoError, | |
2123 ExecuteImmediateCmd(cmd, sizeof(temp))); | |
2124 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
2125 } | |
2126 | |
2127 TEST_F(GLES2DecoderWithShaderTest, BindBufferToDifferentTargetFails) { | |
2128 // Bind the buffer to GL_ARRAY_BUFFER | |
2129 DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); | |
2130 // Attempt to rebind to GL_ELEMENT_ARRAY_BUFFER | |
2131 // NOTE: Real GLES2 does not have this restriction but WebGL and we do. | |
2132 // This can be restriction can be removed at runtime. | |
2133 EXPECT_CALL(*gl_, BindBuffer(_, _)) | |
2134 .Times(0); | |
2135 BindBuffer cmd; | |
2136 cmd.Init(GL_ELEMENT_ARRAY_BUFFER, client_buffer_id_); | |
2137 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2138 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
2139 } | |
2140 | |
2141 TEST_F(GLES2DecoderTest, ActiveTextureValidArgs) { | |
2142 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1)); | |
2143 SpecializedSetup<ActiveTexture, 0>(true); | |
2144 ActiveTexture cmd; | |
2145 cmd.Init(GL_TEXTURE1); | |
2146 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2147 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
2148 } | |
2149 | |
2150 TEST_F(GLES2DecoderTest, ActiveTextureInvalidArgs) { | |
2151 EXPECT_CALL(*gl_, ActiveTexture(_)).Times(0); | |
2152 SpecializedSetup<ActiveTexture, 0>(false); | |
2153 ActiveTexture cmd; | |
2154 cmd.Init(GL_TEXTURE0 - 1); | |
2155 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2156 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
2157 cmd.Init(kNumTextureUnits); | |
2158 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2159 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
2160 } | |
2161 | |
2162 TEST_F(GLES2DecoderTest, CheckFramebufferStatusWithNoBoundTarget) { | |
2163 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(_)) | |
2164 .Times(0); | |
2165 CheckFramebufferStatus::Result* result = | |
2166 static_cast<CheckFramebufferStatus::Result*>(shared_memory_address_); | |
2167 *result = 0; | |
2168 CheckFramebufferStatus cmd; | |
2169 cmd.Init(GL_FRAMEBUFFER, shared_memory_id_, shared_memory_offset_); | |
2170 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2171 EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), *result); | |
2172 } | |
2173 | |
2174 TEST_F(GLES2DecoderWithShaderTest, BindAndDeleteFramebuffer) { | |
2175 SetupTexture(); | |
2176 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
2177 SetupExpectationsForApplyingDefaultDirtyState(); | |
2178 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
2179 kServiceFramebufferId); | |
2180 DoDeleteFramebuffer( | |
2181 client_framebuffer_id_, kServiceFramebufferId, | |
2182 true, GL_FRAMEBUFFER, 0, | |
2183 true, GL_FRAMEBUFFER, 0); | |
2184 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
2185 .Times(1) | |
2186 .RetiresOnSaturation(); | |
2187 DrawArrays cmd; | |
2188 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
2189 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2190 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
2191 } | |
2192 | |
2193 TEST_F(GLES2DecoderTest, FramebufferRenderbufferWithNoBoundTarget) { | |
2194 EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(_, _, _, _)) | |
2195 .Times(0); | |
2196 FramebufferRenderbuffer cmd; | |
2197 cmd.Init( | |
2198 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
2199 client_renderbuffer_id_); | |
2200 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2201 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
2202 } | |
2203 | |
2204 TEST_F(GLES2DecoderTest, FramebufferTexture2DWithNoBoundTarget) { | |
2205 EXPECT_CALL(*gl_, FramebufferTexture2DEXT(_, _, _, _, _)) | |
2206 .Times(0); | |
2207 FramebufferTexture2D cmd; | |
2208 cmd.Init( | |
2209 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_, | |
2210 0); | |
2211 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2212 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
2213 } | |
2214 | |
2215 TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithNoBoundTarget) { | |
2216 EXPECT_CALL(*gl_, GetError()) | |
2217 .WillOnce(Return(GL_NO_ERROR)) | |
2218 .WillOnce(Return(GL_NO_ERROR)) | |
2219 .RetiresOnSaturation(); | |
2220 EXPECT_CALL(*gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _)) | |
2221 .Times(0); | |
2222 GetFramebufferAttachmentParameteriv cmd; | |
2223 cmd.Init( | |
2224 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, | |
2225 GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, shared_memory_id_, | |
2226 shared_memory_offset_); | |
2227 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2228 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
2229 } | |
2230 | |
2231 TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithRenderbuffer) { | |
2232 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
2233 kServiceFramebufferId); | |
2234 EXPECT_CALL(*gl_, GetError()) | |
2235 .WillOnce(Return(GL_NO_ERROR)) | |
2236 .RetiresOnSaturation(); | |
2237 EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( | |
2238 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
2239 kServiceRenderbufferId)) | |
2240 .Times(1) | |
2241 .RetiresOnSaturation(); | |
2242 EXPECT_CALL(*gl_, GetError()) | |
2243 .WillOnce(Return(GL_NO_ERROR)) | |
2244 .RetiresOnSaturation(); | |
2245 EXPECT_CALL(*gl_, GetError()) | |
2246 .WillOnce(Return(GL_NO_ERROR)) | |
2247 .WillOnce(Return(GL_NO_ERROR)) | |
2248 .RetiresOnSaturation(); | |
2249 GetFramebufferAttachmentParameteriv::Result* result = | |
2250 static_cast<GetFramebufferAttachmentParameteriv::Result*>( | |
2251 shared_memory_address_); | |
2252 result->size = 0; | |
2253 const GLint* result_value = result->GetData(); | |
2254 FramebufferRenderbuffer fbrb_cmd; | |
2255 GetFramebufferAttachmentParameteriv cmd; | |
2256 fbrb_cmd.Init( | |
2257 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
2258 client_renderbuffer_id_); | |
2259 cmd.Init( | |
2260 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, | |
2261 GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, shared_memory_id_, | |
2262 shared_memory_offset_); | |
2263 EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); | |
2264 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2265 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
2266 EXPECT_EQ(static_cast<GLuint>(*result_value), client_renderbuffer_id_); | |
2267 } | |
2268 | |
2269 TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithTexture) { | |
2270 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
2271 kServiceFramebufferId); | |
2272 EXPECT_CALL(*gl_, GetError()) | |
2273 .WillOnce(Return(GL_NO_ERROR)) | |
2274 .RetiresOnSaturation(); | |
2275 EXPECT_CALL(*gl_, FramebufferTexture2DEXT( | |
2276 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
2277 kServiceTextureId, 0)) | |
2278 .Times(1) | |
2279 .RetiresOnSaturation(); | |
2280 EXPECT_CALL(*gl_, GetError()) | |
2281 .WillOnce(Return(GL_NO_ERROR)) | |
2282 .RetiresOnSaturation(); | |
2283 EXPECT_CALL(*gl_, GetError()) | |
2284 .WillOnce(Return(GL_NO_ERROR)) | |
2285 .WillOnce(Return(GL_NO_ERROR)) | |
2286 .RetiresOnSaturation(); | |
2287 GetFramebufferAttachmentParameteriv::Result* result = | |
2288 static_cast<GetFramebufferAttachmentParameteriv::Result*>( | |
2289 shared_memory_address_); | |
2290 result->SetNumResults(0); | |
2291 const GLint* result_value = result->GetData(); | |
2292 FramebufferTexture2D fbtex_cmd; | |
2293 GetFramebufferAttachmentParameteriv cmd; | |
2294 fbtex_cmd.Init( | |
2295 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_, | |
2296 0); | |
2297 cmd.Init( | |
2298 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, | |
2299 GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, shared_memory_id_, | |
2300 shared_memory_offset_); | |
2301 EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd)); | |
2302 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2303 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
2304 EXPECT_EQ(static_cast<GLuint>(*result_value), client_texture_id_); | |
2305 } | |
2306 | |
2307 TEST_F(GLES2DecoderTest, GetRenderbufferParameterivWithNoBoundTarget) { | |
2308 EXPECT_CALL(*gl_, GetError()) | |
2309 .WillOnce(Return(GL_NO_ERROR)) | |
2310 .WillOnce(Return(GL_NO_ERROR)) | |
2311 .RetiresOnSaturation(); | |
2312 EXPECT_CALL(*gl_, GetRenderbufferParameterivEXT(_, _, _)) | |
2313 .Times(0); | |
2314 GetRenderbufferParameteriv cmd; | |
2315 cmd.Init( | |
2316 GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, shared_memory_id_, | |
2317 shared_memory_offset_); | |
2318 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2319 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
2320 } | |
2321 | |
2322 TEST_F(GLES2DecoderTest, RenderbufferStorageWithNoBoundTarget) { | |
2323 EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)) | |
2324 .Times(0); | |
2325 RenderbufferStorage cmd; | |
2326 cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, 4); | |
2327 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2328 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
2329 } | |
2330 | |
2331 namespace { | |
2332 | |
2333 // A class to emulate glReadPixels | |
2334 class ReadPixelsEmulator { | |
2335 public: | |
2336 // pack_alignment is the alignment you want ReadPixels to use | |
2337 // when copying. The actual data passed in pixels should be contiguous. | |
2338 ReadPixelsEmulator(GLsizei width, GLsizei height, GLint bytes_per_pixel, | |
2339 const void* src_pixels, const void* expected_pixels, | |
2340 GLint pack_alignment) | |
2341 : width_(width), | |
2342 height_(height), | |
2343 pack_alignment_(pack_alignment), | |
2344 bytes_per_pixel_(bytes_per_pixel), | |
2345 src_pixels_(reinterpret_cast<const int8*>(src_pixels)), | |
2346 expected_pixels_(reinterpret_cast<const int8*>(expected_pixels)) { | |
2347 } | |
2348 | |
2349 void ReadPixels( | |
2350 GLint x, GLint y, GLsizei width, GLsizei height, | |
2351 GLenum format, GLenum type, void* pixels) const { | |
2352 DCHECK_GE(x, 0); | |
2353 DCHECK_GE(y, 0); | |
2354 DCHECK_LE(x + width, width_); | |
2355 DCHECK_LE(y + height, height_); | |
2356 for (GLint yy = 0; yy < height; ++yy) { | |
2357 const int8* src = GetPixelAddress(src_pixels_, x, y + yy); | |
2358 const void* dst = ComputePackAlignmentAddress(0, yy, width, pixels); | |
2359 memcpy(const_cast<void*>(dst), src, width * bytes_per_pixel_); | |
2360 } | |
2361 } | |
2362 | |
2363 bool CompareRowSegment( | |
2364 GLint x, GLint y, GLsizei width, const void* data) const { | |
2365 DCHECK(x + width <= width_ || width == 0); | |
2366 return memcmp(data, GetPixelAddress(expected_pixels_, x, y), | |
2367 width * bytes_per_pixel_) == 0; | |
2368 } | |
2369 | |
2370 // Helper to compute address of pixel in pack aligned data. | |
2371 const void* ComputePackAlignmentAddress( | |
2372 GLint x, GLint y, GLsizei width, const void* address) const { | |
2373 GLint unpadded_row_size = ComputeImageDataSize(width, 1); | |
2374 GLint two_rows_size = ComputeImageDataSize(width, 2); | |
2375 GLsizei padded_row_size = two_rows_size - unpadded_row_size; | |
2376 GLint offset = y * padded_row_size + x * bytes_per_pixel_; | |
2377 return static_cast<const int8*>(address) + offset; | |
2378 } | |
2379 | |
2380 GLint ComputeImageDataSize(GLint width, GLint height) const { | |
2381 GLint row_size = width * bytes_per_pixel_; | |
2382 if (height > 1) { | |
2383 GLint temp = row_size + pack_alignment_ - 1; | |
2384 GLint padded_row_size = (temp / pack_alignment_) * pack_alignment_; | |
2385 GLint size_of_all_but_last_row = (height - 1) * padded_row_size; | |
2386 return size_of_all_but_last_row + row_size; | |
2387 } else { | |
2388 return height * row_size; | |
2389 } | |
2390 } | |
2391 | |
2392 private: | |
2393 const int8* GetPixelAddress(const int8* base, GLint x, GLint y) const { | |
2394 return base + (width_ * y + x) * bytes_per_pixel_; | |
2395 } | |
2396 | |
2397 GLsizei width_; | |
2398 GLsizei height_; | |
2399 GLint pack_alignment_; | |
2400 GLint bytes_per_pixel_; | |
2401 const int8* src_pixels_; | |
2402 const int8* expected_pixels_; | |
2403 }; | |
2404 | |
2405 } // anonymous namespace | |
2406 | |
2407 void GLES2DecoderTest::CheckReadPixelsOutOfRange( | |
2408 GLint in_read_x, GLint in_read_y, | |
2409 GLsizei in_read_width, GLsizei in_read_height, | |
2410 bool init) { | |
2411 const GLsizei kWidth = 5; | |
2412 const GLsizei kHeight = 3; | |
2413 const GLint kBytesPerPixel = 3; | |
2414 const GLint kPackAlignment = 4; | |
2415 const GLenum kFormat = GL_RGB; | |
2416 static const int8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = { | |
2417 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19, 18, 19, 13, | |
2418 29, 28, 23, 22, 21, 22, 21, 29, 28, 23, 22, 21, 22, 21, 28, | |
2419 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32, 37, 32, 34, | |
2420 }; | |
2421 | |
2422 ClearSharedMemory(); | |
2423 | |
2424 // We need to setup an FBO so we can know the max size that ReadPixels will | |
2425 // access | |
2426 if (init) { | |
2427 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
2428 DoTexImage2D( | |
2429 GL_TEXTURE_2D, 0, kFormat, kWidth, kHeight, 0, | |
2430 kFormat, GL_UNSIGNED_BYTE, kSharedMemoryId, | |
2431 kSharedMemoryOffset); | |
2432 DoBindFramebuffer( | |
2433 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
2434 DoFramebufferTexture2D( | |
2435 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
2436 client_texture_id_, kServiceTextureId, 0, GL_NO_ERROR); | |
2437 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) | |
2438 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) | |
2439 .RetiresOnSaturation(); | |
2440 } | |
2441 | |
2442 ReadPixelsEmulator emu( | |
2443 kWidth, kHeight, kBytesPerPixel, kSrcPixels, kSrcPixels, kPackAlignment); | |
2444 typedef ReadPixels::Result Result; | |
2445 Result* result = GetSharedMemoryAs<Result*>(); | |
2446 uint32 result_shm_id = kSharedMemoryId; | |
2447 uint32 result_shm_offset = kSharedMemoryOffset; | |
2448 uint32 pixels_shm_id = kSharedMemoryId; | |
2449 uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); | |
2450 void* dest = &result[1]; | |
2451 EXPECT_CALL(*gl_, GetError()) | |
2452 .WillOnce(Return(GL_NO_ERROR)) | |
2453 .WillOnce(Return(GL_NO_ERROR)) | |
2454 .RetiresOnSaturation(); | |
2455 // ReadPixels will be called for valid size only even though the command | |
2456 // is requesting a larger size. | |
2457 GLint read_x = std::max(0, in_read_x); | |
2458 GLint read_y = std::max(0, in_read_y); | |
2459 GLint read_end_x = std::max(0, std::min(kWidth, in_read_x + in_read_width)); | |
2460 GLint read_end_y = std::max(0, std::min(kHeight, in_read_y + in_read_height)); | |
2461 GLint read_width = read_end_x - read_x; | |
2462 GLint read_height = read_end_y - read_y; | |
2463 if (read_width > 0 && read_height > 0) { | |
2464 for (GLint yy = read_y; yy < read_end_y; ++yy) { | |
2465 EXPECT_CALL( | |
2466 *gl_, ReadPixels(read_x, yy, read_width, 1, | |
2467 kFormat, GL_UNSIGNED_BYTE, _)) | |
2468 .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels)) | |
2469 .RetiresOnSaturation(); | |
2470 } | |
2471 } | |
2472 ReadPixels cmd; | |
2473 cmd.Init(in_read_x, in_read_y, in_read_width, in_read_height, | |
2474 kFormat, GL_UNSIGNED_BYTE, | |
2475 pixels_shm_id, pixels_shm_offset, | |
2476 result_shm_id, result_shm_offset, | |
2477 false); | |
2478 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2479 | |
2480 GLint unpadded_row_size = emu.ComputeImageDataSize(in_read_width, 1); | |
2481 scoped_ptr<int8[]> zero(new int8[unpadded_row_size]); | |
2482 scoped_ptr<int8[]> pack(new int8[kPackAlignment]); | |
2483 memset(zero.get(), 0, unpadded_row_size); | |
2484 memset(pack.get(), kInitialMemoryValue, kPackAlignment); | |
2485 for (GLint yy = 0; yy < in_read_height; ++yy) { | |
2486 const int8* row = static_cast<const int8*>( | |
2487 emu.ComputePackAlignmentAddress(0, yy, in_read_width, dest)); | |
2488 GLint y = in_read_y + yy; | |
2489 if (y < 0 || y >= kHeight) { | |
2490 EXPECT_EQ(0, memcmp(zero.get(), row, unpadded_row_size)); | |
2491 } else { | |
2492 // check off left. | |
2493 GLint num_left_pixels = std::max(-in_read_x, 0); | |
2494 GLint num_left_bytes = num_left_pixels * kBytesPerPixel; | |
2495 EXPECT_EQ(0, memcmp(zero.get(), row, num_left_bytes)); | |
2496 | |
2497 // check off right. | |
2498 GLint num_right_pixels = std::max(in_read_x + in_read_width - kWidth, 0); | |
2499 GLint num_right_bytes = num_right_pixels * kBytesPerPixel; | |
2500 EXPECT_EQ(0, memcmp(zero.get(), | |
2501 row + unpadded_row_size - num_right_bytes, | |
2502 num_right_bytes)); | |
2503 | |
2504 // check middle. | |
2505 GLint x = std::max(in_read_x, 0); | |
2506 GLint num_middle_pixels = | |
2507 std::max(in_read_width - num_left_pixels - num_right_pixels, 0); | |
2508 EXPECT_TRUE(emu.CompareRowSegment( | |
2509 x, y, num_middle_pixels, row + num_left_bytes)); | |
2510 } | |
2511 | |
2512 // check padding | |
2513 if (yy != in_read_height - 1) { | |
2514 GLint num_padding_bytes = | |
2515 (kPackAlignment - 1) - (unpadded_row_size % kPackAlignment); | |
2516 EXPECT_EQ(0, | |
2517 memcmp(pack.get(), row + unpadded_row_size, num_padding_bytes)); | |
2518 } | |
2519 } | |
2520 } | |
2521 | |
2522 TEST_F(GLES2DecoderTest, ReadPixels) { | |
2523 const GLsizei kWidth = 5; | |
2524 const GLsizei kHeight = 3; | |
2525 const GLint kBytesPerPixel = 3; | |
2526 const GLint kPackAlignment = 4; | |
2527 static const int8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = { | |
2528 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19, 18, 19, 13, | |
2529 29, 28, 23, 22, 21, 22, 21, 29, 28, 23, 22, 21, 22, 21, 28, | |
2530 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32, 37, 32, 34, | |
2531 }; | |
2532 | |
2533 surface_->SetSize(gfx::Size(INT_MAX, INT_MAX)); | |
2534 | |
2535 ReadPixelsEmulator emu( | |
2536 kWidth, kHeight, kBytesPerPixel, kSrcPixels, kSrcPixels, kPackAlignment); | |
2537 typedef ReadPixels::Result Result; | |
2538 Result* result = GetSharedMemoryAs<Result*>(); | |
2539 uint32 result_shm_id = kSharedMemoryId; | |
2540 uint32 result_shm_offset = kSharedMemoryOffset; | |
2541 uint32 pixels_shm_id = kSharedMemoryId; | |
2542 uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); | |
2543 void* dest = &result[1]; | |
2544 EXPECT_CALL(*gl_, GetError()) | |
2545 .WillOnce(Return(GL_NO_ERROR)) | |
2546 .WillOnce(Return(GL_NO_ERROR)) | |
2547 .RetiresOnSaturation(); | |
2548 EXPECT_CALL( | |
2549 *gl_, ReadPixels(0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, _)) | |
2550 .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels)); | |
2551 ReadPixels cmd; | |
2552 cmd.Init(0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, | |
2553 pixels_shm_id, pixels_shm_offset, | |
2554 result_shm_id, result_shm_offset, | |
2555 false); | |
2556 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2557 for (GLint yy = 0; yy < kHeight; ++yy) { | |
2558 EXPECT_TRUE(emu.CompareRowSegment( | |
2559 0, yy, kWidth, | |
2560 emu.ComputePackAlignmentAddress(0, yy, kWidth, dest))); | |
2561 } | |
2562 } | |
2563 | |
2564 TEST_F(GLES2DecoderRGBBackbufferTest, ReadPixelsNoAlphaBackbuffer) { | |
2565 const GLsizei kWidth = 3; | |
2566 const GLsizei kHeight = 3; | |
2567 const GLint kBytesPerPixel = 4; | |
2568 const GLint kPackAlignment = 4; | |
2569 static const uint8 kExpectedPixels[kWidth * kHeight * kBytesPerPixel] = { | |
2570 12, 13, 14, 255, 19, 18, 19, 255, 13, 14, 18, 255, | |
2571 29, 28, 23, 255, 21, 22, 21, 255, 28, 23, 22, 255, | |
2572 31, 34, 39, 255, 32, 37, 32, 255, 34, 39, 37, 255, | |
2573 }; | |
2574 static const uint8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = { | |
2575 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19, | |
2576 29, 28, 23, 22, 21, 22, 21, 29, 28, 23, 22, 21, | |
2577 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32, | |
2578 }; | |
2579 | |
2580 surface_->SetSize(gfx::Size(INT_MAX, INT_MAX)); | |
2581 | |
2582 ReadPixelsEmulator emu( | |
2583 kWidth, kHeight, kBytesPerPixel, kSrcPixels, kExpectedPixels, | |
2584 kPackAlignment); | |
2585 typedef ReadPixels::Result Result; | |
2586 Result* result = GetSharedMemoryAs<Result*>(); | |
2587 uint32 result_shm_id = kSharedMemoryId; | |
2588 uint32 result_shm_offset = kSharedMemoryOffset; | |
2589 uint32 pixels_shm_id = kSharedMemoryId; | |
2590 uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); | |
2591 void* dest = &result[1]; | |
2592 EXPECT_CALL(*gl_, GetError()) | |
2593 .WillOnce(Return(GL_NO_ERROR)) | |
2594 .WillOnce(Return(GL_NO_ERROR)) | |
2595 .RetiresOnSaturation(); | |
2596 EXPECT_CALL( | |
2597 *gl_, ReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, _)) | |
2598 .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels)); | |
2599 ReadPixels cmd; | |
2600 cmd.Init(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, | |
2601 pixels_shm_id, pixels_shm_offset, | |
2602 result_shm_id, result_shm_offset, | |
2603 false); | |
2604 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2605 for (GLint yy = 0; yy < kHeight; ++yy) { | |
2606 EXPECT_TRUE(emu.CompareRowSegment( | |
2607 0, yy, kWidth, | |
2608 emu.ComputePackAlignmentAddress(0, yy, kWidth, dest))); | |
2609 } | |
2610 } | |
2611 | |
2612 TEST_F(GLES2DecoderTest, ReadPixelsOutOfRange) { | |
2613 static GLint tests[][4] = { | |
2614 { -2, -1, 9, 5, }, // out of range on all sides | |
2615 { 2, 1, 9, 5, }, // out of range on right, bottom | |
2616 { -7, -4, 9, 5, }, // out of range on left, top | |
2617 { 0, -5, 9, 5, }, // completely off top | |
2618 { 0, 3, 9, 5, }, // completely off bottom | |
2619 { -9, 0, 9, 5, }, // completely off left | |
2620 { 5, 0, 9, 5, }, // completely off right | |
2621 }; | |
2622 | |
2623 for (size_t tt = 0; tt < arraysize(tests); ++tt) { | |
2624 CheckReadPixelsOutOfRange( | |
2625 tests[tt][0], tests[tt][1], tests[tt][2], tests[tt][3], tt == 0); | |
2626 } | |
2627 } | |
2628 | |
2629 TEST_F(GLES2DecoderTest, ReadPixelsInvalidArgs) { | |
2630 typedef ReadPixels::Result Result; | |
2631 Result* result = GetSharedMemoryAs<Result*>(); | |
2632 uint32 result_shm_id = kSharedMemoryId; | |
2633 uint32 result_shm_offset = kSharedMemoryOffset; | |
2634 uint32 pixels_shm_id = kSharedMemoryId; | |
2635 uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); | |
2636 EXPECT_CALL(*gl_, ReadPixels(_, _, _, _, _, _, _)).Times(0); | |
2637 ReadPixels cmd; | |
2638 cmd.Init(0, 0, -1, 1, GL_RGB, GL_UNSIGNED_BYTE, | |
2639 pixels_shm_id, pixels_shm_offset, | |
2640 result_shm_id, result_shm_offset, | |
2641 false); | |
2642 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2643 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
2644 cmd.Init(0, 0, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, | |
2645 pixels_shm_id, pixels_shm_offset, | |
2646 result_shm_id, result_shm_offset, | |
2647 false); | |
2648 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2649 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
2650 cmd.Init(0, 0, 1, 1, GL_RGB, GL_INT, | |
2651 pixels_shm_id, pixels_shm_offset, | |
2652 result_shm_id, result_shm_offset, | |
2653 false); | |
2654 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2655 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
2656 cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, | |
2657 kInvalidSharedMemoryId, pixels_shm_offset, | |
2658 result_shm_id, result_shm_offset, | |
2659 false); | |
2660 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2661 cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, | |
2662 pixels_shm_id, kInvalidSharedMemoryOffset, | |
2663 result_shm_id, result_shm_offset, | |
2664 false); | |
2665 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2666 cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, | |
2667 pixels_shm_id, pixels_shm_offset, | |
2668 kInvalidSharedMemoryId, result_shm_offset, | |
2669 false); | |
2670 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2671 cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, | |
2672 pixels_shm_id, pixels_shm_offset, | |
2673 result_shm_id, kInvalidSharedMemoryOffset, | |
2674 false); | |
2675 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2676 } | |
2677 | |
2678 TEST_F(GLES2DecoderManualInitTest, ReadPixelsAsyncError) { | |
2679 InitState init; | |
2680 init.extensions = "GL_ARB_sync"; | |
2681 init.gl_version = "opengl es 3.0"; | |
2682 init.has_alpha = true; | |
2683 init.request_alpha = true; | |
2684 init.bind_generates_resource = true; | |
2685 InitDecoder(init); | |
2686 | |
2687 typedef ReadPixels::Result Result; | |
2688 Result* result = GetSharedMemoryAs<Result*>(); | |
2689 | |
2690 const GLsizei kWidth = 4; | |
2691 const GLsizei kHeight = 4; | |
2692 uint32 result_shm_id = kSharedMemoryId; | |
2693 uint32 result_shm_offset = kSharedMemoryOffset; | |
2694 uint32 pixels_shm_id = kSharedMemoryId; | |
2695 uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); | |
2696 | |
2697 EXPECT_CALL(*gl_, GetError()) | |
2698 // first error check must pass to get to the test | |
2699 .WillOnce(Return(GL_NO_ERROR)) | |
2700 // second check is after BufferData, simulate fail here | |
2701 .WillOnce(Return(GL_INVALID_OPERATION)) | |
2702 // third error check is fall-through call to sync ReadPixels | |
2703 .WillOnce(Return(GL_NO_ERROR)) | |
2704 .RetiresOnSaturation(); | |
2705 | |
2706 EXPECT_CALL(*gl_, ReadPixels(0, 0, kWidth, kHeight, GL_RGB, | |
2707 GL_UNSIGNED_BYTE, _)).Times(1); | |
2708 EXPECT_CALL(*gl_, GenBuffersARB(1, _)).Times(1); | |
2709 EXPECT_CALL(*gl_, BindBuffer(GL_PIXEL_PACK_BUFFER_ARB, _)).Times(2); | |
2710 EXPECT_CALL(*gl_, BufferData(GL_PIXEL_PACK_BUFFER_ARB, _, NULL, | |
2711 GL_STREAM_READ)).Times(1); | |
2712 | |
2713 ReadPixels cmd; | |
2714 cmd.Init(0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, | |
2715 pixels_shm_id, pixels_shm_offset, | |
2716 result_shm_id, result_shm_offset, | |
2717 true); | |
2718 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2719 } | |
2720 | |
2721 TEST_F(GLES2DecoderTest, BindAttribLocation) { | |
2722 const GLint kLocation = 2; | |
2723 const char* kName = "testing"; | |
2724 const uint32 kNameSize = strlen(kName); | |
2725 EXPECT_CALL( | |
2726 *gl_, BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) | |
2727 .Times(1); | |
2728 memcpy(shared_memory_address_, kName, kNameSize); | |
2729 BindAttribLocation cmd; | |
2730 cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset, | |
2731 kNameSize); | |
2732 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2733 } | |
2734 | |
2735 TEST_F(GLES2DecoderTest, BindAttribLocationInvalidArgs) { | |
2736 const GLint kLocation = 2; | |
2737 const char* kName = "testing"; | |
2738 const char* kBadName = "test\aing"; | |
2739 const uint32 kNameSize = strlen(kName); | |
2740 const uint32 kBadNameSize = strlen(kBadName); | |
2741 EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0); | |
2742 memcpy(shared_memory_address_, kName, kNameSize); | |
2743 BindAttribLocation cmd; | |
2744 cmd.Init(kInvalidClientId, kLocation, | |
2745 kSharedMemoryId, kSharedMemoryOffset, kNameSize); | |
2746 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2747 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
2748 cmd.Init(client_program_id_, kLocation, | |
2749 kInvalidSharedMemoryId, kSharedMemoryOffset, kNameSize); | |
2750 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2751 cmd.Init(client_program_id_, kLocation, | |
2752 kSharedMemoryId, kInvalidSharedMemoryOffset, kNameSize); | |
2753 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2754 cmd.Init(client_program_id_, kLocation, | |
2755 kSharedMemoryId, kSharedMemoryOffset, kSharedBufferSize); | |
2756 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2757 memcpy(shared_memory_address_, kBadName, kBadNameSize); | |
2758 cmd.Init(client_program_id_, kLocation, | |
2759 kSharedMemoryId, kSharedMemoryOffset, kBadNameSize); | |
2760 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2761 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
2762 } | |
2763 | |
2764 TEST_F(GLES2DecoderTest, BindAttribLocationBucket) { | |
2765 const uint32 kBucketId = 123; | |
2766 const GLint kLocation = 2; | |
2767 const char* kName = "testing"; | |
2768 EXPECT_CALL( | |
2769 *gl_, BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) | |
2770 .Times(1); | |
2771 SetBucketAsCString(kBucketId, kName); | |
2772 BindAttribLocationBucket cmd; | |
2773 cmd.Init(client_program_id_, kLocation, kBucketId); | |
2774 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2775 } | |
2776 | |
2777 TEST_F(GLES2DecoderTest, BindAttribLocationBucketInvalidArgs) { | |
2778 const uint32 kBucketId = 123; | |
2779 const GLint kLocation = 2; | |
2780 const char* kName = "testing"; | |
2781 EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0); | |
2782 BindAttribLocationBucket cmd; | |
2783 // check bucket does not exist. | |
2784 cmd.Init(client_program_id_, kLocation, kBucketId); | |
2785 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2786 // check bucket is empty. | |
2787 SetBucketAsCString(kBucketId, NULL); | |
2788 cmd.Init(client_program_id_, kLocation, kBucketId); | |
2789 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2790 // Check bad program id | |
2791 SetBucketAsCString(kBucketId, kName); | |
2792 cmd.Init(kInvalidClientId, kLocation, kBucketId); | |
2793 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2794 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
2795 } | |
2796 | |
2797 TEST_F(GLES2DecoderWithShaderTest, GetAttribLocation) { | |
2798 const uint32 kNameSize = strlen(kAttrib2Name); | |
2799 const char* kNonExistentName = "foobar"; | |
2800 const uint32 kNonExistentNameSize = strlen(kNonExistentName); | |
2801 typedef GetAttribLocation::Result Result; | |
2802 Result* result = GetSharedMemoryAs<Result*>(); | |
2803 *result = -1; | |
2804 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); | |
2805 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); | |
2806 memcpy(name, kAttrib2Name, kNameSize); | |
2807 GetAttribLocation cmd; | |
2808 cmd.Init(client_program_id_, | |
2809 kSharedMemoryId, kNameOffset, | |
2810 kSharedMemoryId, kSharedMemoryOffset, | |
2811 kNameSize); | |
2812 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2813 EXPECT_EQ(kAttrib2Location, *result); | |
2814 *result = -1; | |
2815 memcpy(name, kNonExistentName, kNonExistentNameSize); | |
2816 cmd.Init(client_program_id_, | |
2817 kSharedMemoryId, kNameOffset, | |
2818 kSharedMemoryId, kSharedMemoryOffset, | |
2819 kNonExistentNameSize); | |
2820 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2821 EXPECT_EQ(-1, *result); | |
2822 } | |
2823 | |
2824 TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationInvalidArgs) { | |
2825 const uint32 kNameSize = strlen(kAttrib2Name); | |
2826 const char* kBadName = "foo\abar"; | |
2827 const uint32 kBadNameSize = strlen(kBadName); | |
2828 typedef GetAttribLocation::Result Result; | |
2829 Result* result = GetSharedMemoryAs<Result*>(); | |
2830 *result = -1; | |
2831 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); | |
2832 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); | |
2833 memcpy(name, kAttrib2Name, kNameSize); | |
2834 GetAttribLocation cmd; | |
2835 cmd.Init(kInvalidClientId, | |
2836 kSharedMemoryId, kNameOffset, | |
2837 kSharedMemoryId, kSharedMemoryOffset, | |
2838 kNameSize); | |
2839 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2840 EXPECT_EQ(-1, *result); | |
2841 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
2842 *result = -1; | |
2843 cmd.Init(client_program_id_, | |
2844 kInvalidSharedMemoryId, kNameOffset, | |
2845 kSharedMemoryId, kSharedMemoryOffset, | |
2846 kNameSize); | |
2847 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2848 EXPECT_EQ(-1, *result); | |
2849 cmd.Init(client_program_id_, | |
2850 kSharedMemoryId, kInvalidSharedMemoryOffset, | |
2851 kSharedMemoryId, kSharedMemoryOffset, | |
2852 kNameSize); | |
2853 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2854 EXPECT_EQ(-1, *result); | |
2855 cmd.Init(client_program_id_, | |
2856 kSharedMemoryId, kNameOffset, | |
2857 kInvalidSharedMemoryId, kSharedMemoryOffset, | |
2858 kNameSize); | |
2859 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2860 EXPECT_EQ(-1, *result); | |
2861 cmd.Init(client_program_id_, | |
2862 kSharedMemoryId, kNameOffset, | |
2863 kSharedMemoryId, kInvalidSharedMemoryOffset, | |
2864 kNameSize); | |
2865 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2866 EXPECT_EQ(-1, *result); | |
2867 cmd.Init(client_program_id_, | |
2868 kSharedMemoryId, kNameOffset, | |
2869 kSharedMemoryId, kSharedMemoryOffset, | |
2870 kSharedBufferSize); | |
2871 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2872 EXPECT_EQ(-1, *result); | |
2873 memcpy(name, kBadName, kBadNameSize); | |
2874 cmd.Init(client_program_id_, | |
2875 kSharedMemoryId, kNameOffset, | |
2876 kSharedMemoryId, kSharedMemoryOffset, | |
2877 kBadNameSize); | |
2878 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2879 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
2880 } | |
2881 | |
2882 TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationBucket) { | |
2883 const uint32 kBucketId = 123; | |
2884 const char* kNonExistentName = "foobar"; | |
2885 typedef GetAttribLocationBucket::Result Result; | |
2886 Result* result = GetSharedMemoryAs<Result*>(); | |
2887 SetBucketAsCString(kBucketId, kAttrib2Name); | |
2888 *result = -1; | |
2889 GetAttribLocationBucket cmd; | |
2890 cmd.Init(client_program_id_, kBucketId, | |
2891 kSharedMemoryId, kSharedMemoryOffset); | |
2892 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2893 EXPECT_EQ(kAttrib2Location, *result); | |
2894 SetBucketAsCString(kBucketId, kNonExistentName); | |
2895 *result = -1; | |
2896 cmd.Init(client_program_id_, kBucketId, | |
2897 kSharedMemoryId, kSharedMemoryOffset); | |
2898 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2899 EXPECT_EQ(-1, *result); | |
2900 } | |
2901 | |
2902 TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationBucketInvalidArgs) { | |
2903 const uint32 kBucketId = 123; | |
2904 typedef GetAttribLocationBucket::Result Result; | |
2905 Result* result = GetSharedMemoryAs<Result*>(); | |
2906 *result = -1; | |
2907 GetAttribLocationBucket cmd; | |
2908 // Check no bucket | |
2909 cmd.Init(client_program_id_, kBucketId, | |
2910 kSharedMemoryId, kSharedMemoryOffset); | |
2911 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2912 EXPECT_EQ(-1, *result); | |
2913 // Check bad program id. | |
2914 SetBucketAsCString(kBucketId, kAttrib2Name); | |
2915 cmd.Init(kInvalidClientId, kBucketId, | |
2916 kSharedMemoryId, kSharedMemoryOffset); | |
2917 *result = -1; | |
2918 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2919 EXPECT_EQ(-1, *result); | |
2920 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
2921 // Check bad memory | |
2922 cmd.Init(client_program_id_, kBucketId, | |
2923 kInvalidSharedMemoryId, kSharedMemoryOffset); | |
2924 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2925 cmd.Init(client_program_id_, kBucketId, | |
2926 kSharedMemoryId, kInvalidSharedMemoryOffset); | |
2927 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2928 } | |
2929 | |
2930 TEST_F(GLES2DecoderWithShaderTest, GetUniformLocation) { | |
2931 const uint32 kNameSize = strlen(kUniform2Name); | |
2932 const char* kNonExistentName = "foobar"; | |
2933 const uint32 kNonExistentNameSize = strlen(kNonExistentName); | |
2934 typedef GetUniformLocation::Result Result; | |
2935 Result* result = GetSharedMemoryAs<Result*>(); | |
2936 *result = -1; | |
2937 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); | |
2938 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); | |
2939 memcpy(name, kUniform2Name, kNameSize); | |
2940 GetUniformLocation cmd; | |
2941 cmd.Init(client_program_id_, | |
2942 kSharedMemoryId, kNameOffset, | |
2943 kSharedMemoryId, kSharedMemoryOffset, | |
2944 kNameSize); | |
2945 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2946 EXPECT_EQ(kUniform2FakeLocation, *result); | |
2947 memcpy(name, kNonExistentName, kNonExistentNameSize); | |
2948 *result = -1; | |
2949 cmd.Init(client_program_id_, | |
2950 kSharedMemoryId, kNameOffset, | |
2951 kSharedMemoryId, kSharedMemoryOffset, | |
2952 kNonExistentNameSize); | |
2953 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2954 EXPECT_EQ(-1, *result); | |
2955 } | |
2956 | |
2957 TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationInvalidArgs) { | |
2958 const uint32 kNameSize = strlen(kUniform2Name); | |
2959 const char* kBadName = "foo\abar"; | |
2960 const uint32 kBadNameSize = strlen(kBadName); | |
2961 typedef GetUniformLocation::Result Result; | |
2962 Result* result = GetSharedMemoryAs<Result*>(); | |
2963 *result = -1; | |
2964 char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); | |
2965 const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); | |
2966 memcpy(name, kUniform2Name, kNameSize); | |
2967 GetUniformLocation cmd; | |
2968 cmd.Init(kInvalidClientId, | |
2969 kSharedMemoryId, kNameOffset, | |
2970 kSharedMemoryId, kSharedMemoryOffset, | |
2971 kNameSize); | |
2972 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
2973 EXPECT_EQ(-1, *result); | |
2974 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
2975 *result = -1; | |
2976 cmd.Init(client_program_id_, | |
2977 kInvalidSharedMemoryId, kNameOffset, | |
2978 kSharedMemoryId, kSharedMemoryOffset, | |
2979 kNameSize); | |
2980 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2981 EXPECT_EQ(-1, *result); | |
2982 cmd.Init(client_program_id_, | |
2983 kSharedMemoryId, kInvalidSharedMemoryOffset, | |
2984 kSharedMemoryId, kSharedMemoryOffset, | |
2985 kNameSize); | |
2986 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2987 EXPECT_EQ(-1, *result); | |
2988 cmd.Init(client_program_id_, | |
2989 kSharedMemoryId, kNameOffset, | |
2990 kInvalidSharedMemoryId, kSharedMemoryOffset, | |
2991 kNameSize); | |
2992 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2993 EXPECT_EQ(-1, *result); | |
2994 cmd.Init(client_program_id_, | |
2995 kSharedMemoryId, kNameOffset, | |
2996 kSharedMemoryId, kInvalidSharedMemoryOffset, | |
2997 kNameSize); | |
2998 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
2999 EXPECT_EQ(-1, *result); | |
3000 cmd.Init(client_program_id_, | |
3001 kSharedMemoryId, kNameOffset, | |
3002 kSharedMemoryId, kSharedMemoryOffset, | |
3003 kSharedBufferSize); | |
3004 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
3005 EXPECT_EQ(-1, *result); | |
3006 memcpy(name, kBadName, kBadNameSize); | |
3007 cmd.Init(client_program_id_, | |
3008 kSharedMemoryId, kNameOffset, | |
3009 kSharedMemoryId, kSharedMemoryOffset, | |
3010 kBadNameSize); | |
3011 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3012 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3013 } | |
3014 | |
3015 TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationBucket) { | |
3016 const uint32 kBucketId = 123; | |
3017 const char* kNonExistentName = "foobar"; | |
3018 typedef GetUniformLocationBucket::Result Result; | |
3019 Result* result = GetSharedMemoryAs<Result*>(); | |
3020 SetBucketAsCString(kBucketId, kUniform2Name); | |
3021 *result = -1; | |
3022 GetUniformLocationBucket cmd; | |
3023 cmd.Init(client_program_id_, kBucketId, | |
3024 kSharedMemoryId, kSharedMemoryOffset); | |
3025 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3026 EXPECT_EQ(kUniform2FakeLocation, *result); | |
3027 SetBucketAsCString(kBucketId, kNonExistentName); | |
3028 *result = -1; | |
3029 cmd.Init(client_program_id_, kBucketId, | |
3030 kSharedMemoryId, kSharedMemoryOffset); | |
3031 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3032 EXPECT_EQ(-1, *result); | |
3033 } | |
3034 | |
3035 TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationBucketInvalidArgs) { | |
3036 const uint32 kBucketId = 123; | |
3037 typedef GetUniformLocationBucket::Result Result; | |
3038 Result* result = GetSharedMemoryAs<Result*>(); | |
3039 *result = -1; | |
3040 GetUniformLocationBucket cmd; | |
3041 // Check no bucket | |
3042 cmd.Init(client_program_id_, kBucketId, | |
3043 kSharedMemoryId, kSharedMemoryOffset); | |
3044 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
3045 EXPECT_EQ(-1, *result); | |
3046 // Check bad program id. | |
3047 SetBucketAsCString(kBucketId, kUniform2Name); | |
3048 cmd.Init(kInvalidClientId, kBucketId, | |
3049 kSharedMemoryId, kSharedMemoryOffset); | |
3050 *result = -1; | |
3051 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3052 EXPECT_EQ(-1, *result); | |
3053 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3054 // Check bad memory | |
3055 cmd.Init(client_program_id_, kBucketId, | |
3056 kInvalidSharedMemoryId, kSharedMemoryOffset); | |
3057 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
3058 cmd.Init(client_program_id_, kBucketId, | |
3059 kSharedMemoryId, kInvalidSharedMemoryOffset); | |
3060 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
3061 } | |
3062 | |
3063 TEST_F(GLES2DecoderWithShaderTest, GetMaxValueInBufferCHROMIUM) { | 111 TEST_F(GLES2DecoderWithShaderTest, GetMaxValueInBufferCHROMIUM) { |
3064 SetupIndexBuffer(); | 112 SetupIndexBuffer(); |
3065 GetMaxValueInBufferCHROMIUM::Result* result = | 113 GetMaxValueInBufferCHROMIUM::Result* result = |
3066 static_cast<GetMaxValueInBufferCHROMIUM::Result*>(shared_memory_address_); | 114 static_cast<GetMaxValueInBufferCHROMIUM::Result*>(shared_memory_address_); |
3067 *result = 0; | 115 *result = 0; |
3068 | 116 |
3069 GetMaxValueInBufferCHROMIUM cmd; | 117 GetMaxValueInBufferCHROMIUM cmd; |
3070 cmd.Init(client_element_buffer_id_, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | 118 cmd.Init(client_element_buffer_id_, |
3071 kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); | 119 kValidIndexRangeCount, |
3072 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3073 EXPECT_EQ(7u, *result); | |
3074 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3075 cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1, | |
3076 GL_UNSIGNED_SHORT, | |
3077 kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); | |
3078 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3079 EXPECT_EQ(100u, *result); | |
3080 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3081 | |
3082 cmd.Init(kInvalidClientId, kValidIndexRangeCount, | |
3083 GL_UNSIGNED_SHORT, | |
3084 kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); | |
3085 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3086 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3087 cmd.Init(client_element_buffer_id_, kOutOfRangeIndexRangeEnd, | |
3088 GL_UNSIGNED_SHORT, | |
3089 kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); | |
3090 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3091 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
3092 cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1, | |
3093 GL_UNSIGNED_SHORT, | |
3094 kOutOfRangeIndexRangeEnd * 2, kSharedMemoryId, kSharedMemoryOffset); | |
3095 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3096 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
3097 cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1, | |
3098 GL_UNSIGNED_SHORT, | |
3099 kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); | |
3100 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3101 cmd.Init(client_buffer_id_, kValidIndexRangeCount + 1, | |
3102 GL_UNSIGNED_SHORT, | |
3103 kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); | |
3104 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3105 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
3106 cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1, | |
3107 GL_UNSIGNED_SHORT, | 120 GL_UNSIGNED_SHORT, |
3108 kValidIndexRangeStart * 2, | 121 kValidIndexRangeStart * 2, |
3109 kInvalidSharedMemoryId, kSharedMemoryOffset); | 122 kSharedMemoryId, |
3110 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 123 kSharedMemoryOffset); |
3111 cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1, | 124 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 125 EXPECT_EQ(7u, *result); |
| 126 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 127 cmd.Init(client_element_buffer_id_, |
| 128 kValidIndexRangeCount + 1, |
3112 GL_UNSIGNED_SHORT, | 129 GL_UNSIGNED_SHORT, |
3113 kValidIndexRangeStart * 2, | 130 kValidIndexRangeStart * 2, |
3114 kSharedMemoryId, kInvalidSharedMemoryOffset); | 131 kSharedMemoryId, |
| 132 kSharedMemoryOffset); |
| 133 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 134 EXPECT_EQ(100u, *result); |
| 135 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 136 |
| 137 cmd.Init(kInvalidClientId, |
| 138 kValidIndexRangeCount, |
| 139 GL_UNSIGNED_SHORT, |
| 140 kValidIndexRangeStart * 2, |
| 141 kSharedMemoryId, |
| 142 kSharedMemoryOffset); |
| 143 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 144 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
| 145 cmd.Init(client_element_buffer_id_, |
| 146 kOutOfRangeIndexRangeEnd, |
| 147 GL_UNSIGNED_SHORT, |
| 148 kValidIndexRangeStart * 2, |
| 149 kSharedMemoryId, |
| 150 kSharedMemoryOffset); |
| 151 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 152 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 153 cmd.Init(client_element_buffer_id_, |
| 154 kValidIndexRangeCount + 1, |
| 155 GL_UNSIGNED_SHORT, |
| 156 kOutOfRangeIndexRangeEnd * 2, |
| 157 kSharedMemoryId, |
| 158 kSharedMemoryOffset); |
| 159 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 160 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 161 cmd.Init(client_element_buffer_id_, |
| 162 kValidIndexRangeCount + 1, |
| 163 GL_UNSIGNED_SHORT, |
| 164 kValidIndexRangeStart * 2, |
| 165 kSharedMemoryId, |
| 166 kSharedMemoryOffset); |
| 167 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 168 cmd.Init(client_buffer_id_, |
| 169 kValidIndexRangeCount + 1, |
| 170 GL_UNSIGNED_SHORT, |
| 171 kValidIndexRangeStart * 2, |
| 172 kSharedMemoryId, |
| 173 kSharedMemoryOffset); |
| 174 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 175 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 176 cmd.Init(client_element_buffer_id_, |
| 177 kValidIndexRangeCount + 1, |
| 178 GL_UNSIGNED_SHORT, |
| 179 kValidIndexRangeStart * 2, |
| 180 kInvalidSharedMemoryId, |
| 181 kSharedMemoryOffset); |
| 182 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
| 183 cmd.Init(client_element_buffer_id_, |
| 184 kValidIndexRangeCount + 1, |
| 185 GL_UNSIGNED_SHORT, |
| 186 kValidIndexRangeStart * 2, |
| 187 kSharedMemoryId, |
| 188 kInvalidSharedMemoryOffset); |
3115 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 189 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
3116 } | 190 } |
3117 | 191 |
3118 TEST_F(GLES2DecoderTest, SharedIds) { | 192 TEST_F(GLES2DecoderTest, SharedIds) { |
3119 GenSharedIdsCHROMIUM gen_cmd; | 193 GenSharedIdsCHROMIUM gen_cmd; |
3120 RegisterSharedIdsCHROMIUM reg_cmd; | 194 RegisterSharedIdsCHROMIUM reg_cmd; |
3121 DeleteSharedIdsCHROMIUM del_cmd; | 195 DeleteSharedIdsCHROMIUM del_cmd; |
3122 | 196 |
3123 const GLuint kNamespaceId = id_namespaces::kTextures; | 197 const GLuint kNamespaceId = id_namespaces::kTextures; |
3124 const GLuint kExpectedId1 = 1; | 198 const GLuint kExpectedId1 = 1; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3225 const GLuint kNamespaceId = id_namespaces::kTextures; | 299 const GLuint kNamespaceId = id_namespaces::kTextures; |
3226 DeleteSharedIdsCHROMIUM cmd; | 300 DeleteSharedIdsCHROMIUM cmd; |
3227 cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset); | 301 cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset); |
3228 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 302 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
3229 cmd.Init(kNamespaceId, 1, kInvalidSharedMemoryId, kSharedMemoryOffset); | 303 cmd.Init(kNamespaceId, 1, kInvalidSharedMemoryId, kSharedMemoryOffset); |
3230 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 304 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
3231 cmd.Init(kNamespaceId, 1, kSharedMemoryId, kInvalidSharedMemoryOffset); | 305 cmd.Init(kNamespaceId, 1, kSharedMemoryId, kInvalidSharedMemoryOffset); |
3232 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 306 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
3233 } | 307 } |
3234 | 308 |
3235 TEST_F(GLES2DecoderTest, TexSubImage2DValidArgs) { | |
3236 const int kWidth = 16; | |
3237 const int kHeight = 8; | |
3238 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
3239 DoTexImage2D( | |
3240 GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
3241 kSharedMemoryId, kSharedMemoryOffset); | |
3242 EXPECT_CALL(*gl_, TexSubImage2D( | |
3243 GL_TEXTURE_2D, 1, 1, 0, kWidth - 1, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, | |
3244 shared_memory_address_)) | |
3245 .Times(1) | |
3246 .RetiresOnSaturation(); | |
3247 TexSubImage2D cmd; | |
3248 cmd.Init( | |
3249 GL_TEXTURE_2D, 1, 1, 0, kWidth - 1, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, | |
3250 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3251 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3252 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3253 } | |
3254 | |
3255 TEST_F(GLES2DecoderTest, TexSubImage2DBadArgs) { | |
3256 const int kWidth = 16; | |
3257 const int kHeight = 8; | |
3258 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
3259 DoTexImage2D( | |
3260 GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
3261 0, 0); | |
3262 TexSubImage2D cmd; | |
3263 cmd.Init(GL_TEXTURE0, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, | |
3264 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3265 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3266 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
3267 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_TRUE, GL_UNSIGNED_BYTE, | |
3268 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3269 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3270 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
3271 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_INT, | |
3272 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3273 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3274 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
3275 cmd.Init(GL_TEXTURE_2D, 1, -1, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, | |
3276 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3277 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3278 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3279 cmd.Init(GL_TEXTURE_2D, 1, 1, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, | |
3280 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3281 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3282 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3283 cmd.Init(GL_TEXTURE_2D, 1, 0, -1, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, | |
3284 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3285 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3286 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3287 cmd.Init(GL_TEXTURE_2D, 1, 0, 1, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, | |
3288 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3289 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3290 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3291 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth + 1, kHeight, GL_RGBA, | |
3292 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3293 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3294 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3295 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight + 1, GL_RGBA, | |
3296 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3297 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3298 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3299 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, | |
3300 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3301 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3302 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
3303 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, | |
3304 GL_UNSIGNED_SHORT_4_4_4_4, kSharedMemoryId, kSharedMemoryOffset, | |
3305 GL_FALSE); | |
3306 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3307 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
3308 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, | |
3309 kInvalidSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
3310 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
3311 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, | |
3312 kSharedMemoryId, kInvalidSharedMemoryOffset, GL_FALSE); | |
3313 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
3314 } | |
3315 | |
3316 TEST_F(GLES2DecoderTest, CopyTexSubImage2DValidArgs) { | |
3317 const int kWidth = 16; | |
3318 const int kHeight = 8; | |
3319 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
3320 DoTexImage2D( | |
3321 GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
3322 kSharedMemoryId, kSharedMemoryOffset); | |
3323 EXPECT_CALL(*gl_, CopyTexSubImage2D( | |
3324 GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight)) | |
3325 .Times(1) | |
3326 .RetiresOnSaturation(); | |
3327 CopyTexSubImage2D cmd; | |
3328 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight); | |
3329 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3330 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3331 } | |
3332 | |
3333 TEST_F(GLES2DecoderTest, CopyTexSubImage2DBadArgs) { | |
3334 const int kWidth = 16; | |
3335 const int kHeight = 8; | |
3336 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
3337 DoTexImage2D( | |
3338 GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
3339 0, 0); | |
3340 CopyTexSubImage2D cmd; | |
3341 cmd.Init(GL_TEXTURE0, 1, 0, 0, 0, 0, kWidth, kHeight); | |
3342 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3343 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
3344 cmd.Init(GL_TEXTURE_2D, 1, -1, 0, 0, 0, kWidth, kHeight); | |
3345 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3346 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3347 cmd.Init(GL_TEXTURE_2D, 1, 1, 0, 0, 0, kWidth, kHeight); | |
3348 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3349 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3350 cmd.Init(GL_TEXTURE_2D, 1, 0, -1, 0, 0, kWidth, kHeight); | |
3351 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3352 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3353 cmd.Init(GL_TEXTURE_2D, 1, 0, 1, 0, 0, kWidth, kHeight); | |
3354 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3355 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3356 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth + 1, kHeight); | |
3357 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3358 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3359 cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight + 1); | |
3360 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3361 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3362 } | |
3363 | |
3364 // Check that if a renderbuffer is attached and GL returns | |
3365 // GL_FRAMEBUFFER_COMPLETE that the buffer is cleared and state is restored. | |
3366 TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearColor) { | |
3367 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
3368 kServiceFramebufferId); | |
3369 ClearColor color_cmd; | |
3370 ColorMask color_mask_cmd; | |
3371 Enable enable_cmd; | |
3372 FramebufferRenderbuffer cmd; | |
3373 color_cmd.Init(0.1f, 0.2f, 0.3f, 0.4f); | |
3374 color_mask_cmd.Init(0, 1, 0, 1); | |
3375 enable_cmd.Init(GL_SCISSOR_TEST); | |
3376 cmd.Init( | |
3377 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
3378 client_renderbuffer_id_); | |
3379 InSequence sequence; | |
3380 EXPECT_CALL(*gl_, ClearColor(0.1f, 0.2f, 0.3f, 0.4f)) | |
3381 .Times(1) | |
3382 .RetiresOnSaturation(); | |
3383 EXPECT_CALL(*gl_, GetError()) | |
3384 .WillOnce(Return(GL_NO_ERROR)) | |
3385 .RetiresOnSaturation(); | |
3386 EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( | |
3387 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
3388 kServiceRenderbufferId)) | |
3389 .Times(1) | |
3390 .RetiresOnSaturation(); | |
3391 EXPECT_CALL(*gl_, GetError()) | |
3392 .WillOnce(Return(GL_NO_ERROR)) | |
3393 .RetiresOnSaturation(); | |
3394 EXPECT_EQ(error::kNoError, ExecuteCmd(color_cmd)); | |
3395 EXPECT_EQ(error::kNoError, ExecuteCmd(color_mask_cmd)); | |
3396 EXPECT_EQ(error::kNoError, ExecuteCmd(enable_cmd)); | |
3397 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3398 } | |
3399 | |
3400 TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepth) { | |
3401 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
3402 kServiceFramebufferId); | |
3403 ClearDepthf depth_cmd; | |
3404 DepthMask depth_mask_cmd; | |
3405 FramebufferRenderbuffer cmd; | |
3406 depth_cmd.Init(0.5f); | |
3407 depth_mask_cmd.Init(false); | |
3408 cmd.Init( | |
3409 GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, | |
3410 client_renderbuffer_id_); | |
3411 InSequence sequence; | |
3412 EXPECT_CALL(*gl_, ClearDepth(0.5f)) | |
3413 .Times(1) | |
3414 .RetiresOnSaturation(); | |
3415 EXPECT_CALL(*gl_, GetError()) | |
3416 .WillOnce(Return(GL_NO_ERROR)) | |
3417 .RetiresOnSaturation(); | |
3418 EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( | |
3419 GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, | |
3420 kServiceRenderbufferId)) | |
3421 .Times(1) | |
3422 .RetiresOnSaturation(); | |
3423 EXPECT_CALL(*gl_, GetError()) | |
3424 .WillOnce(Return(GL_NO_ERROR)) | |
3425 .RetiresOnSaturation(); | |
3426 EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd)); | |
3427 EXPECT_EQ(error::kNoError, ExecuteCmd(depth_mask_cmd)); | |
3428 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3429 } | |
3430 | |
3431 TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearStencil) { | |
3432 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
3433 kServiceFramebufferId); | |
3434 ClearStencil stencil_cmd; | |
3435 StencilMaskSeparate stencil_mask_separate_cmd; | |
3436 FramebufferRenderbuffer cmd; | |
3437 stencil_cmd.Init(123); | |
3438 stencil_mask_separate_cmd.Init(GL_BACK, 0x1234u); | |
3439 cmd.Init( | |
3440 GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, | |
3441 client_renderbuffer_id_); | |
3442 InSequence sequence; | |
3443 EXPECT_CALL(*gl_, ClearStencil(123)) | |
3444 .Times(1) | |
3445 .RetiresOnSaturation(); | |
3446 EXPECT_CALL(*gl_, GetError()) | |
3447 .WillOnce(Return(GL_NO_ERROR)) | |
3448 .RetiresOnSaturation(); | |
3449 EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( | |
3450 GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, | |
3451 kServiceRenderbufferId)) | |
3452 .Times(1) | |
3453 .RetiresOnSaturation(); | |
3454 EXPECT_CALL(*gl_, GetError()) | |
3455 .WillOnce(Return(GL_NO_ERROR)) | |
3456 .RetiresOnSaturation(); | |
3457 EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd)); | |
3458 EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_mask_separate_cmd)); | |
3459 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3460 } | |
3461 | |
3462 TEST_F(GLES2DecoderTest, IsBuffer) { | 309 TEST_F(GLES2DecoderTest, IsBuffer) { |
3463 EXPECT_FALSE(DoIsBuffer(client_buffer_id_)); | 310 EXPECT_FALSE(DoIsBuffer(client_buffer_id_)); |
3464 DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); | 311 DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); |
3465 EXPECT_TRUE(DoIsBuffer(client_buffer_id_)); | 312 EXPECT_TRUE(DoIsBuffer(client_buffer_id_)); |
3466 DoDeleteBuffer(client_buffer_id_, kServiceBufferId); | 313 DoDeleteBuffer(client_buffer_id_, kServiceBufferId); |
3467 EXPECT_FALSE(DoIsBuffer(client_buffer_id_)); | 314 EXPECT_FALSE(DoIsBuffer(client_buffer_id_)); |
3468 } | 315 } |
3469 | 316 |
3470 TEST_F(GLES2DecoderTest, IsFramebuffer) { | 317 TEST_F(GLES2DecoderTest, IsFramebuffer) { |
3471 EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_)); | 318 EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_)); |
3472 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | 319 DoBindFramebuffer( |
3473 kServiceFramebufferId); | 320 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); |
3474 EXPECT_TRUE(DoIsFramebuffer(client_framebuffer_id_)); | 321 EXPECT_TRUE(DoIsFramebuffer(client_framebuffer_id_)); |
3475 DoDeleteFramebuffer( | 322 DoDeleteFramebuffer(client_framebuffer_id_, |
3476 client_framebuffer_id_, kServiceFramebufferId, | 323 kServiceFramebufferId, |
3477 true, GL_FRAMEBUFFER, 0, | 324 true, |
3478 true, GL_FRAMEBUFFER, 0); | 325 GL_FRAMEBUFFER, |
| 326 0, |
| 327 true, |
| 328 GL_FRAMEBUFFER, |
| 329 0); |
3479 EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_)); | 330 EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_)); |
3480 } | 331 } |
3481 | 332 |
3482 TEST_F(GLES2DecoderTest, IsProgram) { | 333 TEST_F(GLES2DecoderTest, IsProgram) { |
3483 // IsProgram is true as soon as the program is created. | 334 // IsProgram is true as soon as the program is created. |
3484 EXPECT_TRUE(DoIsProgram(client_program_id_)); | 335 EXPECT_TRUE(DoIsProgram(client_program_id_)); |
3485 EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)) | 336 EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)) |
3486 .Times(1) | 337 .Times(1) |
3487 .RetiresOnSaturation(); | 338 .RetiresOnSaturation(); |
3488 DoDeleteProgram(client_program_id_, kServiceProgramId); | 339 DoDeleteProgram(client_program_id_, kServiceProgramId); |
3489 EXPECT_FALSE(DoIsProgram(client_program_id_)); | 340 EXPECT_FALSE(DoIsProgram(client_program_id_)); |
3490 | |
3491 } | 341 } |
3492 | 342 |
3493 TEST_F(GLES2DecoderTest, IsRenderbuffer) { | 343 TEST_F(GLES2DecoderTest, IsRenderbuffer) { |
3494 EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_)); | 344 EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_)); |
3495 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | 345 DoBindRenderbuffer( |
3496 kServiceRenderbufferId); | 346 GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); |
3497 EXPECT_TRUE(DoIsRenderbuffer(client_renderbuffer_id_)); | 347 EXPECT_TRUE(DoIsRenderbuffer(client_renderbuffer_id_)); |
3498 DoDeleteRenderbuffer(client_renderbuffer_id_, kServiceRenderbufferId); | 348 DoDeleteRenderbuffer(client_renderbuffer_id_, kServiceRenderbufferId); |
3499 EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_)); | 349 EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_)); |
3500 } | 350 } |
3501 | 351 |
3502 TEST_F(GLES2DecoderTest, IsShader) { | 352 TEST_F(GLES2DecoderTest, IsShader) { |
3503 // IsShader is true as soon as the program is created. | 353 // IsShader is true as soon as the program is created. |
3504 EXPECT_TRUE(DoIsShader(client_shader_id_)); | 354 EXPECT_TRUE(DoIsShader(client_shader_id_)); |
3505 DoDeleteShader(client_shader_id_, kServiceShaderId); | 355 DoDeleteShader(client_shader_id_, kServiceShaderId); |
3506 EXPECT_FALSE(DoIsShader(client_shader_id_)); | 356 EXPECT_FALSE(DoIsShader(client_shader_id_)); |
3507 } | 357 } |
3508 | 358 |
3509 TEST_F(GLES2DecoderTest, IsTexture) { | 359 TEST_F(GLES2DecoderTest, IsTexture) { |
3510 EXPECT_FALSE(DoIsTexture(client_texture_id_)); | 360 EXPECT_FALSE(DoIsTexture(client_texture_id_)); |
3511 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | 361 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
3512 EXPECT_TRUE(DoIsTexture(client_texture_id_)); | 362 EXPECT_TRUE(DoIsTexture(client_texture_id_)); |
3513 DoDeleteTexture(client_texture_id_, kServiceTextureId); | 363 DoDeleteTexture(client_texture_id_, kServiceTextureId); |
3514 EXPECT_FALSE(DoIsTexture(client_texture_id_)); | 364 EXPECT_FALSE(DoIsTexture(client_texture_id_)); |
3515 } | 365 } |
3516 | 366 |
3517 #if 0 // Turn this test on once we allow GL_DEPTH_STENCIL_ATTACHMENT | |
3518 TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepthStencil) { | |
3519 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
3520 kServiceFramebufferId); | |
3521 ClearDepthf depth_cmd; | |
3522 ClearStencil stencil_cmd; | |
3523 FramebufferRenderbuffer cmd; | |
3524 depth_cmd.Init(0.5f); | |
3525 stencil_cmd.Init(123); | |
3526 cmd.Init( | |
3527 GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, | |
3528 client_renderbuffer_id_); | |
3529 InSequence sequence; | |
3530 EXPECT_CALL(*gl_, ClearDepth(0.5f)) | |
3531 .Times(1) | |
3532 .RetiresOnSaturation(); | |
3533 EXPECT_CALL(*gl_, ClearStencil(123)) | |
3534 .Times(1) | |
3535 .RetiresOnSaturation(); | |
3536 EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( | |
3537 GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, | |
3538 kServiceRenderbufferId)) | |
3539 .Times(1) | |
3540 .RetiresOnSaturation(); | |
3541 EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd)); | |
3542 EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd)); | |
3543 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3544 } | |
3545 #endif | |
3546 | |
3547 TEST_F(GLES2DecoderWithShaderTest, VertexAttribPointer) { | |
3548 SetupVertexBuffer(); | |
3549 static const GLenum types[] = { | |
3550 GL_BYTE, | |
3551 GL_UNSIGNED_BYTE, | |
3552 GL_SHORT, | |
3553 GL_UNSIGNED_SHORT, | |
3554 GL_FLOAT, | |
3555 GL_FIXED, | |
3556 GL_INT, | |
3557 GL_UNSIGNED_INT, | |
3558 }; | |
3559 static const GLsizei sizes[] = { | |
3560 1, | |
3561 1, | |
3562 2, | |
3563 2, | |
3564 4, | |
3565 4, | |
3566 4, | |
3567 4, | |
3568 }; | |
3569 static const GLuint indices[] = { | |
3570 0, | |
3571 1, | |
3572 kNumVertexAttribs - 1, | |
3573 kNumVertexAttribs, | |
3574 }; | |
3575 static const GLsizei offset_mult[] = { | |
3576 0, | |
3577 0, | |
3578 1, | |
3579 1, | |
3580 2, | |
3581 1000, | |
3582 }; | |
3583 static const GLsizei offset_offset[] = { | |
3584 0, | |
3585 1, | |
3586 0, | |
3587 1, | |
3588 0, | |
3589 0, | |
3590 }; | |
3591 static const GLsizei stride_mult[] = { | |
3592 -1, | |
3593 0, | |
3594 0, | |
3595 1, | |
3596 1, | |
3597 2, | |
3598 1000, | |
3599 }; | |
3600 static const GLsizei stride_offset[] = { | |
3601 0, | |
3602 0, | |
3603 1, | |
3604 0, | |
3605 1, | |
3606 0, | |
3607 0, | |
3608 }; | |
3609 for (size_t tt = 0; tt < arraysize(types); ++tt) { | |
3610 GLenum type = types[tt]; | |
3611 GLsizei num_bytes = sizes[tt]; | |
3612 for (size_t ii = 0; ii < arraysize(indices); ++ii) { | |
3613 GLuint index = indices[ii]; | |
3614 for (GLint size = 0; size < 5; ++size) { | |
3615 for (size_t oo = 0; oo < arraysize(offset_mult); ++oo) { | |
3616 GLuint offset = num_bytes * offset_mult[oo] + offset_offset[oo]; | |
3617 for (size_t ss = 0; ss < arraysize(stride_mult); ++ss) { | |
3618 GLsizei stride = num_bytes * stride_mult[ss] + stride_offset[ss]; | |
3619 for (int normalize = 0; normalize < 2; ++normalize) { | |
3620 bool index_good = index < static_cast<GLuint>(kNumVertexAttribs); | |
3621 bool size_good = (size > 0 && size < 5); | |
3622 bool offset_good = (offset % num_bytes == 0); | |
3623 bool stride_good = (stride % num_bytes == 0) && stride >= 0 && | |
3624 stride <= 255; | |
3625 bool type_good = (type != GL_INT && type != GL_UNSIGNED_INT && | |
3626 type != GL_FIXED); | |
3627 bool good = size_good && offset_good && stride_good && | |
3628 type_good && index_good; | |
3629 bool call = good && (type != GL_FIXED); | |
3630 if (call) { | |
3631 EXPECT_CALL(*gl_, VertexAttribPointer( | |
3632 index, size, type, normalize, stride, | |
3633 BufferOffset(offset))); | |
3634 } | |
3635 VertexAttribPointer cmd; | |
3636 cmd.Init(index, size, type, normalize, stride, offset); | |
3637 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3638 if (good) { | |
3639 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3640 } else if (size_good && | |
3641 offset_good && | |
3642 stride_good && | |
3643 type_good && | |
3644 !index_good) { | |
3645 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3646 } else if (size_good && | |
3647 offset_good && | |
3648 stride_good && | |
3649 !type_good && | |
3650 index_good) { | |
3651 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
3652 } else if (size_good && | |
3653 offset_good && | |
3654 !stride_good && | |
3655 type_good && | |
3656 index_good) { | |
3657 if (stride < 0 || stride > 255) { | |
3658 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3659 } else { | |
3660 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
3661 } | |
3662 } else if (size_good && | |
3663 !offset_good && | |
3664 stride_good && | |
3665 type_good && | |
3666 index_good) { | |
3667 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
3668 } else if (!size_good && | |
3669 offset_good && | |
3670 stride_good && | |
3671 type_good && | |
3672 index_good) { | |
3673 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
3674 } else { | |
3675 EXPECT_NE(GL_NO_ERROR, GetGLError()); | |
3676 } | |
3677 } | |
3678 } | |
3679 } | |
3680 } | |
3681 } | |
3682 } | |
3683 } | |
3684 | |
3685 // Test that with an RGB backbuffer if we set the color mask to 1,1,1,1 it is | |
3686 // set to 1,1,1,0 at Draw time but is 1,1,1,1 at query time. | |
3687 TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMask) { | |
3688 ColorMask cmd; | |
3689 cmd.Init(true, true, true, true); | |
3690 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3691 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3692 | |
3693 SetupTexture(); | |
3694 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
3695 SetupExpectationsForApplyingDirtyState( | |
3696 true, // Framebuffer is RGB | |
3697 false, // Framebuffer has depth | |
3698 false, // Framebuffer has stencil | |
3699 0x1110, // color bits | |
3700 false, // depth mask | |
3701 false, // depth enabled | |
3702 0, // front stencil mask | |
3703 0, // back stencil mask | |
3704 false, // stencil enabled | |
3705 false, // cull_face_enabled | |
3706 false, // scissor_test_enabled | |
3707 false); // blend_enabled | |
3708 | |
3709 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
3710 .Times(1) | |
3711 .RetiresOnSaturation(); | |
3712 DrawArrays draw_cmd; | |
3713 draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
3714 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
3715 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3716 | |
3717 EXPECT_CALL(*gl_, GetError()) | |
3718 .WillOnce(Return(GL_NO_ERROR)) | |
3719 .WillOnce(Return(GL_NO_ERROR)) | |
3720 .RetiresOnSaturation(); | |
3721 typedef GetIntegerv::Result Result; | |
3722 Result* result = static_cast<Result*>(shared_memory_address_); | |
3723 EXPECT_CALL(*gl_, GetIntegerv(GL_COLOR_WRITEMASK, result->GetData())) | |
3724 .Times(0); | |
3725 result->size = 0; | |
3726 GetIntegerv cmd2; | |
3727 cmd2.Init(GL_COLOR_WRITEMASK, shared_memory_id_, shared_memory_offset_); | |
3728 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
3729 EXPECT_EQ( | |
3730 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_COLOR_WRITEMASK), | |
3731 result->GetNumResults()); | |
3732 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3733 EXPECT_EQ(1, result->GetData()[0]); | |
3734 EXPECT_EQ(1, result->GetData()[1]); | |
3735 EXPECT_EQ(1, result->GetData()[2]); | |
3736 EXPECT_EQ(1, result->GetData()[3]); | |
3737 } | |
3738 | |
3739 // Test that with no depth if we set DepthMask true that it's set to false at | |
3740 // draw time but querying it returns true. | |
3741 TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferDepthMask) { | |
3742 EXPECT_CALL(*gl_, DepthMask(true)) | |
3743 .Times(0) | |
3744 .RetiresOnSaturation(); | |
3745 DepthMask cmd; | |
3746 cmd.Init(true); | |
3747 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3748 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3749 | |
3750 SetupTexture(); | |
3751 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
3752 SetupExpectationsForApplyingDirtyState( | |
3753 true, // Framebuffer is RGB | |
3754 false, // Framebuffer has depth | |
3755 false, // Framebuffer has stencil | |
3756 0x1110, // color bits | |
3757 false, // depth mask | |
3758 false, // depth enabled | |
3759 0, // front stencil mask | |
3760 0, // back stencil mask | |
3761 false, // stencil enabled | |
3762 false, // cull_face_enabled | |
3763 false, // scissor_test_enabled | |
3764 false); // blend_enabled | |
3765 | |
3766 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
3767 .Times(1) | |
3768 .RetiresOnSaturation(); | |
3769 DrawArrays draw_cmd; | |
3770 draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
3771 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
3772 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3773 | |
3774 EXPECT_CALL(*gl_, GetError()) | |
3775 .WillOnce(Return(GL_NO_ERROR)) | |
3776 .WillOnce(Return(GL_NO_ERROR)) | |
3777 .RetiresOnSaturation(); | |
3778 typedef GetIntegerv::Result Result; | |
3779 Result* result = static_cast<Result*>(shared_memory_address_); | |
3780 EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_WRITEMASK, result->GetData())) | |
3781 .Times(0); | |
3782 result->size = 0; | |
3783 GetIntegerv cmd2; | |
3784 cmd2.Init(GL_DEPTH_WRITEMASK, shared_memory_id_, shared_memory_offset_); | |
3785 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
3786 EXPECT_EQ( | |
3787 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_WRITEMASK), | |
3788 result->GetNumResults()); | |
3789 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3790 EXPECT_EQ(1, result->GetData()[0]); | |
3791 } | |
3792 | |
3793 // Test that with no stencil if we set the stencil mask it's still set to 0 at | |
3794 // draw time but gets our value if we query. | |
3795 TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferStencilMask) { | |
3796 const GLint kMask = 123; | |
3797 EXPECT_CALL(*gl_, StencilMask(kMask)) | |
3798 .Times(0) | |
3799 .RetiresOnSaturation(); | |
3800 StencilMask cmd; | |
3801 cmd.Init(kMask); | |
3802 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3803 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3804 | |
3805 SetupTexture(); | |
3806 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
3807 SetupExpectationsForApplyingDirtyState( | |
3808 true, // Framebuffer is RGB | |
3809 false, // Framebuffer has depth | |
3810 false, // Framebuffer has stencil | |
3811 0x1110, // color bits | |
3812 false, // depth mask | |
3813 false, // depth enabled | |
3814 0, // front stencil mask | |
3815 0, // back stencil mask | |
3816 false, // stencil enabled | |
3817 false, // cull_face_enabled | |
3818 false, // scissor_test_enabled | |
3819 false); // blend_enabled | |
3820 | |
3821 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
3822 .Times(1) | |
3823 .RetiresOnSaturation(); | |
3824 DrawArrays draw_cmd; | |
3825 draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
3826 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
3827 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3828 | |
3829 EXPECT_CALL(*gl_, GetError()) | |
3830 .WillOnce(Return(GL_NO_ERROR)) | |
3831 .WillOnce(Return(GL_NO_ERROR)) | |
3832 .RetiresOnSaturation(); | |
3833 typedef GetIntegerv::Result Result; | |
3834 Result* result = static_cast<Result*>(shared_memory_address_); | |
3835 EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_WRITEMASK, result->GetData())) | |
3836 .Times(0); | |
3837 result->size = 0; | |
3838 GetIntegerv cmd2; | |
3839 cmd2.Init(GL_STENCIL_WRITEMASK, shared_memory_id_, shared_memory_offset_); | |
3840 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
3841 EXPECT_EQ( | |
3842 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_WRITEMASK), | |
3843 result->GetNumResults()); | |
3844 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3845 EXPECT_EQ(kMask, result->GetData()[0]); | |
3846 } | |
3847 | |
3848 // Test that if an FBO is bound we get the correct masks. | |
3849 TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMaskFBO) { | |
3850 ColorMask cmd; | |
3851 cmd.Init(true, true, true, true); | |
3852 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
3853 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3854 | |
3855 SetupTexture(); | |
3856 SetupVertexBuffer(); | |
3857 DoEnableVertexAttribArray(0); | |
3858 DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); | |
3859 DoEnableVertexAttribArray(1); | |
3860 DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); | |
3861 DoEnableVertexAttribArray(2); | |
3862 DoVertexAttribPointer(2, 2, GL_FLOAT, 0, 0); | |
3863 SetupExpectationsForApplyingDirtyState( | |
3864 true, // Framebuffer is RGB | |
3865 false, // Framebuffer has depth | |
3866 false, // Framebuffer has stencil | |
3867 0x1110, // color bits | |
3868 false, // depth mask | |
3869 false, // depth enabled | |
3870 0, // front stencil mask | |
3871 0, // back stencil mask | |
3872 false, // stencil enabled | |
3873 false, // cull_face_enabled | |
3874 false, // scissor_test_enabled | |
3875 false); // blend_enabled | |
3876 | |
3877 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
3878 .Times(1) | |
3879 .RetiresOnSaturation(); | |
3880 DrawArrays draw_cmd; | |
3881 draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
3882 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
3883 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3884 | |
3885 // Check that no extra calls are made on the next draw. | |
3886 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
3887 .Times(1) | |
3888 .RetiresOnSaturation(); | |
3889 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
3890 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3891 | |
3892 // Setup Frame buffer. | |
3893 // needs to be 1x1 or else it's not renderable. | |
3894 const GLsizei kWidth = 1; | |
3895 const GLsizei kHeight = 1; | |
3896 const GLenum kFormat = GL_RGB; | |
3897 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
3898 // Pass some data so the texture will be marked as cleared. | |
3899 DoTexImage2D( | |
3900 GL_TEXTURE_2D, 0, kFormat, kWidth, kHeight, 0, | |
3901 kFormat, GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); | |
3902 DoBindFramebuffer( | |
3903 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
3904 DoFramebufferTexture2D( | |
3905 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
3906 client_texture_id_, kServiceTextureId, 0, GL_NO_ERROR); | |
3907 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) | |
3908 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) | |
3909 .RetiresOnSaturation(); | |
3910 | |
3911 // This time state needs to be set. | |
3912 SetupExpectationsForApplyingDirtyState( | |
3913 false, // Framebuffer is RGB | |
3914 false, // Framebuffer has depth | |
3915 false, // Framebuffer has stencil | |
3916 0x1110, // color bits | |
3917 false, // depth mask | |
3918 false, // depth enabled | |
3919 0, // front stencil mask | |
3920 0, // back stencil mask | |
3921 false, // stencil enabled | |
3922 false, // cull_face_enabled | |
3923 false, // scissor_test_enabled | |
3924 false); // blend_enabled | |
3925 | |
3926 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
3927 .Times(1) | |
3928 .RetiresOnSaturation(); | |
3929 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
3930 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3931 | |
3932 // Check that no extra calls are made on the next draw. | |
3933 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
3934 .Times(1) | |
3935 .RetiresOnSaturation(); | |
3936 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
3937 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3938 | |
3939 // Unbind | |
3940 DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); | |
3941 | |
3942 SetupExpectationsForApplyingDirtyState( | |
3943 true, // Framebuffer is RGB | |
3944 false, // Framebuffer has depth | |
3945 false, // Framebuffer has stencil | |
3946 0x1110, // color bits | |
3947 false, // depth mask | |
3948 false, // depth enabled | |
3949 0, // front stencil mask | |
3950 0, // back stencil mask | |
3951 false, // stencil enabled | |
3952 false, // cull_face_enabled | |
3953 false, // scissor_test_enabled | |
3954 false); // blend_enabled | |
3955 | |
3956 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
3957 .Times(1) | |
3958 .RetiresOnSaturation(); | |
3959 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
3960 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3961 } | |
3962 | |
3963 TEST_F(GLES2DecoderManualInitTest, ActualAlphaMatchesRequestedAlpha) { | |
3964 InitState init; | |
3965 init.gl_version = "3.0"; | |
3966 init.has_alpha = true; | |
3967 init.request_alpha = true; | |
3968 init.bind_generates_resource = true; | |
3969 InitDecoder(init); | |
3970 | |
3971 EXPECT_CALL(*gl_, GetError()) | |
3972 .WillOnce(Return(GL_NO_ERROR)) | |
3973 .WillOnce(Return(GL_NO_ERROR)) | |
3974 .RetiresOnSaturation(); | |
3975 typedef GetIntegerv::Result Result; | |
3976 Result* result = static_cast<Result*>(shared_memory_address_); | |
3977 EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _)) | |
3978 .WillOnce(SetArgumentPointee<1>(8)) | |
3979 .RetiresOnSaturation(); | |
3980 result->size = 0; | |
3981 GetIntegerv cmd2; | |
3982 cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_); | |
3983 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
3984 EXPECT_EQ( | |
3985 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS), | |
3986 result->GetNumResults()); | |
3987 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
3988 EXPECT_EQ(8, result->GetData()[0]); | |
3989 } | |
3990 | |
3991 TEST_F(GLES2DecoderManualInitTest, ActualAlphaDoesNotMatchRequestedAlpha) { | |
3992 InitState init; | |
3993 init.gl_version = "3.0"; | |
3994 init.has_alpha = true; | |
3995 init.bind_generates_resource = true; | |
3996 InitDecoder(init); | |
3997 | |
3998 EXPECT_CALL(*gl_, GetError()) | |
3999 .WillOnce(Return(GL_NO_ERROR)) | |
4000 .WillOnce(Return(GL_NO_ERROR)) | |
4001 .RetiresOnSaturation(); | |
4002 typedef GetIntegerv::Result Result; | |
4003 Result* result = static_cast<Result*>(shared_memory_address_); | |
4004 EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _)) | |
4005 .WillOnce(SetArgumentPointee<1>(8)) | |
4006 .RetiresOnSaturation(); | |
4007 result->size = 0; | |
4008 GetIntegerv cmd2; | |
4009 cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_); | |
4010 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4011 EXPECT_EQ( | |
4012 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS), | |
4013 result->GetNumResults()); | |
4014 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4015 EXPECT_EQ(0, result->GetData()[0]); | |
4016 } | |
4017 | |
4018 TEST_F(GLES2DecoderManualInitTest, ActualDepthMatchesRequestedDepth) { | |
4019 InitState init; | |
4020 init.gl_version = "3.0"; | |
4021 init.has_depth = true; | |
4022 init.request_depth = true; | |
4023 init.bind_generates_resource = true; | |
4024 InitDecoder(init); | |
4025 | |
4026 EXPECT_CALL(*gl_, GetError()) | |
4027 .WillOnce(Return(GL_NO_ERROR)) | |
4028 .WillOnce(Return(GL_NO_ERROR)) | |
4029 .RetiresOnSaturation(); | |
4030 typedef GetIntegerv::Result Result; | |
4031 Result* result = static_cast<Result*>(shared_memory_address_); | |
4032 EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) | |
4033 .WillOnce(SetArgumentPointee<1>(24)) | |
4034 .RetiresOnSaturation(); | |
4035 result->size = 0; | |
4036 GetIntegerv cmd2; | |
4037 cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); | |
4038 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4039 EXPECT_EQ( | |
4040 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), | |
4041 result->GetNumResults()); | |
4042 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4043 EXPECT_EQ(24, result->GetData()[0]); | |
4044 } | |
4045 | |
4046 TEST_F(GLES2DecoderManualInitTest, ActualDepthDoesNotMatchRequestedDepth) { | |
4047 InitState init; | |
4048 init.gl_version = "3.0"; | |
4049 init.has_depth = true; | |
4050 init.bind_generates_resource = true; | |
4051 InitDecoder(init); | |
4052 | |
4053 EXPECT_CALL(*gl_, GetError()) | |
4054 .WillOnce(Return(GL_NO_ERROR)) | |
4055 .WillOnce(Return(GL_NO_ERROR)) | |
4056 .RetiresOnSaturation(); | |
4057 typedef GetIntegerv::Result Result; | |
4058 Result* result = static_cast<Result*>(shared_memory_address_); | |
4059 EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) | |
4060 .WillOnce(SetArgumentPointee<1>(24)) | |
4061 .RetiresOnSaturation(); | |
4062 result->size = 0; | |
4063 GetIntegerv cmd2; | |
4064 cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); | |
4065 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4066 EXPECT_EQ( | |
4067 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), | |
4068 result->GetNumResults()); | |
4069 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4070 EXPECT_EQ(0, result->GetData()[0]); | |
4071 } | |
4072 | |
4073 TEST_F(GLES2DecoderManualInitTest, ActualStencilMatchesRequestedStencil) { | |
4074 InitState init; | |
4075 init.gl_version = "3.0"; | |
4076 init.has_stencil = true; | |
4077 init.request_stencil = true; | |
4078 init.bind_generates_resource = true; | |
4079 InitDecoder(init); | |
4080 | |
4081 EXPECT_CALL(*gl_, GetError()) | |
4082 .WillOnce(Return(GL_NO_ERROR)) | |
4083 .WillOnce(Return(GL_NO_ERROR)) | |
4084 .RetiresOnSaturation(); | |
4085 typedef GetIntegerv::Result Result; | |
4086 Result* result = static_cast<Result*>(shared_memory_address_); | |
4087 EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) | |
4088 .WillOnce(SetArgumentPointee<1>(8)) | |
4089 .RetiresOnSaturation(); | |
4090 result->size = 0; | |
4091 GetIntegerv cmd2; | |
4092 cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); | |
4093 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4094 EXPECT_EQ( | |
4095 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), | |
4096 result->GetNumResults()); | |
4097 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4098 EXPECT_EQ(8, result->GetData()[0]); | |
4099 } | |
4100 | |
4101 TEST_F(GLES2DecoderManualInitTest, ActualStencilDoesNotMatchRequestedStencil) { | |
4102 InitState init; | |
4103 init.gl_version = "3.0"; | |
4104 init.has_stencil = true; | |
4105 init.bind_generates_resource = true; | |
4106 InitDecoder(init); | |
4107 | |
4108 EXPECT_CALL(*gl_, GetError()) | |
4109 .WillOnce(Return(GL_NO_ERROR)) | |
4110 .WillOnce(Return(GL_NO_ERROR)) | |
4111 .RetiresOnSaturation(); | |
4112 typedef GetIntegerv::Result Result; | |
4113 Result* result = static_cast<Result*>(shared_memory_address_); | |
4114 EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) | |
4115 .WillOnce(SetArgumentPointee<1>(8)) | |
4116 .RetiresOnSaturation(); | |
4117 result->size = 0; | |
4118 GetIntegerv cmd2; | |
4119 cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); | |
4120 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4121 EXPECT_EQ( | |
4122 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), | |
4123 result->GetNumResults()); | |
4124 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4125 EXPECT_EQ(0, result->GetData()[0]); | |
4126 } | |
4127 | |
4128 TEST_F(GLES2DecoderManualInitTest, DepthEnableWithDepth) { | |
4129 InitState init; | |
4130 init.gl_version = "3.0"; | |
4131 init.has_depth = true; | |
4132 init.request_depth = true; | |
4133 init.bind_generates_resource = true; | |
4134 InitDecoder(init); | |
4135 | |
4136 Enable cmd; | |
4137 cmd.Init(GL_DEPTH_TEST); | |
4138 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4139 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4140 | |
4141 SetupDefaultProgram(); | |
4142 SetupTexture(); | |
4143 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
4144 SetupExpectationsForApplyingDirtyState( | |
4145 true, // Framebuffer is RGB | |
4146 true, // Framebuffer has depth | |
4147 false, // Framebuffer has stencil | |
4148 0x1110, // color bits | |
4149 true, // depth mask | |
4150 true, // depth enabled | |
4151 0, // front stencil mask | |
4152 0, // back stencil mask | |
4153 false, // stencil enabled | |
4154 false, // cull_face_enabled | |
4155 false, // scissor_test_enabled | |
4156 false); // blend_enabled | |
4157 | |
4158 | |
4159 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
4160 .Times(1) | |
4161 .RetiresOnSaturation(); | |
4162 DrawArrays draw_cmd; | |
4163 draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
4164 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
4165 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4166 | |
4167 EXPECT_CALL(*gl_, GetError()) | |
4168 .WillOnce(Return(GL_NO_ERROR)) | |
4169 .WillOnce(Return(GL_NO_ERROR)) | |
4170 .RetiresOnSaturation(); | |
4171 typedef GetIntegerv::Result Result; | |
4172 Result* result = static_cast<Result*>(shared_memory_address_); | |
4173 EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_TEST, _)) | |
4174 .Times(0) | |
4175 .RetiresOnSaturation(); | |
4176 result->size = 0; | |
4177 GetIntegerv cmd2; | |
4178 cmd2.Init(GL_DEPTH_TEST, shared_memory_id_, shared_memory_offset_); | |
4179 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4180 EXPECT_EQ( | |
4181 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_TEST), | |
4182 result->GetNumResults()); | |
4183 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4184 EXPECT_EQ(1, result->GetData()[0]); | |
4185 } | |
4186 | |
4187 TEST_F(GLES2DecoderManualInitTest, DepthEnableWithoutRequestedDepth) { | |
4188 InitState init; | |
4189 init.gl_version = "3.0"; | |
4190 init.has_depth = true; | |
4191 init.bind_generates_resource = true; | |
4192 InitDecoder(init); | |
4193 | |
4194 Enable cmd; | |
4195 cmd.Init(GL_DEPTH_TEST); | |
4196 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4197 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4198 | |
4199 SetupDefaultProgram(); | |
4200 SetupTexture(); | |
4201 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
4202 SetupExpectationsForApplyingDirtyState( | |
4203 true, // Framebuffer is RGB | |
4204 false, // Framebuffer has depth | |
4205 false, // Framebuffer has stencil | |
4206 0x1110, // color bits | |
4207 false, // depth mask | |
4208 false, // depth enabled | |
4209 0, // front stencil mask | |
4210 0, // back stencil mask | |
4211 false, // stencil enabled | |
4212 false, // cull_face_enabled | |
4213 false, // scissor_test_enabled | |
4214 false); // blend_enabled | |
4215 | |
4216 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
4217 .Times(1) | |
4218 .RetiresOnSaturation(); | |
4219 DrawArrays draw_cmd; | |
4220 draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
4221 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
4222 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4223 | |
4224 EXPECT_CALL(*gl_, GetError()) | |
4225 .WillOnce(Return(GL_NO_ERROR)) | |
4226 .WillOnce(Return(GL_NO_ERROR)) | |
4227 .RetiresOnSaturation(); | |
4228 typedef GetIntegerv::Result Result; | |
4229 Result* result = static_cast<Result*>(shared_memory_address_); | |
4230 EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_TEST, _)) | |
4231 .Times(0) | |
4232 .RetiresOnSaturation(); | |
4233 result->size = 0; | |
4234 GetIntegerv cmd2; | |
4235 cmd2.Init(GL_DEPTH_TEST, shared_memory_id_, shared_memory_offset_); | |
4236 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4237 EXPECT_EQ( | |
4238 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_TEST), | |
4239 result->GetNumResults()); | |
4240 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4241 EXPECT_EQ(1, result->GetData()[0]); | |
4242 } | |
4243 | |
4244 TEST_F(GLES2DecoderManualInitTest, StencilEnableWithStencil) { | |
4245 InitState init; | |
4246 init.gl_version = "3.0"; | |
4247 init.has_stencil = true; | |
4248 init.request_stencil = true; | |
4249 init.bind_generates_resource = true; | |
4250 InitDecoder(init); | |
4251 | |
4252 Enable cmd; | |
4253 cmd.Init(GL_STENCIL_TEST); | |
4254 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4255 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4256 | |
4257 SetupDefaultProgram(); | |
4258 SetupTexture(); | |
4259 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
4260 SetupExpectationsForApplyingDirtyState( | |
4261 true, // Framebuffer is RGB | |
4262 false, // Framebuffer has depth | |
4263 true, // Framebuffer has stencil | |
4264 0x1110, // color bits | |
4265 false, // depth mask | |
4266 false, // depth enabled | |
4267 -1, // front stencil mask | |
4268 -1, // back stencil mask | |
4269 true, // stencil enabled | |
4270 false, // cull_face_enabled | |
4271 false, // scissor_test_enabled | |
4272 false); // blend_enabled | |
4273 | |
4274 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
4275 .Times(1) | |
4276 .RetiresOnSaturation(); | |
4277 DrawArrays draw_cmd; | |
4278 draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
4279 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
4280 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4281 | |
4282 EXPECT_CALL(*gl_, GetError()) | |
4283 .WillOnce(Return(GL_NO_ERROR)) | |
4284 .WillOnce(Return(GL_NO_ERROR)) | |
4285 .RetiresOnSaturation(); | |
4286 typedef GetIntegerv::Result Result; | |
4287 Result* result = static_cast<Result*>(shared_memory_address_); | |
4288 EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, _)) | |
4289 .Times(0) | |
4290 .RetiresOnSaturation(); | |
4291 result->size = 0; | |
4292 GetIntegerv cmd2; | |
4293 cmd2.Init(GL_STENCIL_TEST, shared_memory_id_, shared_memory_offset_); | |
4294 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4295 EXPECT_EQ( | |
4296 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_TEST), | |
4297 result->GetNumResults()); | |
4298 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4299 EXPECT_EQ(1, result->GetData()[0]); | |
4300 } | |
4301 | |
4302 TEST_F(GLES2DecoderManualInitTest, StencilEnableWithoutRequestedStencil) { | |
4303 InitState init; | |
4304 init.gl_version = "3.0"; | |
4305 init.has_stencil = true; | |
4306 init.bind_generates_resource = true; | |
4307 InitDecoder(init); | |
4308 | |
4309 Enable cmd; | |
4310 cmd.Init(GL_STENCIL_TEST); | |
4311 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4312 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4313 | |
4314 SetupDefaultProgram(); | |
4315 SetupTexture(); | |
4316 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
4317 SetupExpectationsForApplyingDirtyState( | |
4318 true, // Framebuffer is RGB | |
4319 false, // Framebuffer has depth | |
4320 false, // Framebuffer has stencil | |
4321 0x1110, // color bits | |
4322 false, // depth mask | |
4323 false, // depth enabled | |
4324 0, // front stencil mask | |
4325 0, // back stencil mask | |
4326 false, // stencil enabled | |
4327 false, // cull_face_enabled | |
4328 false, // scissor_test_enabled | |
4329 false); // blend_enabled | |
4330 | |
4331 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
4332 .Times(1) | |
4333 .RetiresOnSaturation(); | |
4334 DrawArrays draw_cmd; | |
4335 draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
4336 EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); | |
4337 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4338 | |
4339 EXPECT_CALL(*gl_, GetError()) | |
4340 .WillOnce(Return(GL_NO_ERROR)) | |
4341 .WillOnce(Return(GL_NO_ERROR)) | |
4342 .RetiresOnSaturation(); | |
4343 typedef GetIntegerv::Result Result; | |
4344 Result* result = static_cast<Result*>(shared_memory_address_); | |
4345 EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, _)) | |
4346 .Times(0) | |
4347 .RetiresOnSaturation(); | |
4348 result->size = 0; | |
4349 GetIntegerv cmd2; | |
4350 cmd2.Init(GL_STENCIL_TEST, shared_memory_id_, shared_memory_offset_); | |
4351 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4352 EXPECT_EQ( | |
4353 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_TEST), | |
4354 result->GetNumResults()); | |
4355 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4356 EXPECT_EQ(1, result->GetData()[0]); | |
4357 } | |
4358 | |
4359 TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilReportsCorrectValues) { | |
4360 InitState init; | |
4361 init.extensions = "GL_OES_packed_depth_stencil"; | |
4362 init.gl_version = "opengl es 2.0"; | |
4363 init.has_depth = true; | |
4364 init.has_stencil = true; | |
4365 init.request_depth = true; | |
4366 init.request_stencil = true; | |
4367 init.bind_generates_resource = true; | |
4368 InitDecoder(init); | |
4369 | |
4370 EXPECT_CALL(*gl_, GetError()) | |
4371 .WillOnce(Return(GL_NO_ERROR)) | |
4372 .WillOnce(Return(GL_NO_ERROR)) | |
4373 .WillOnce(Return(GL_NO_ERROR)) | |
4374 .WillOnce(Return(GL_NO_ERROR)) | |
4375 .RetiresOnSaturation(); | |
4376 typedef GetIntegerv::Result Result; | |
4377 Result* result = static_cast<Result*>(shared_memory_address_); | |
4378 result->size = 0; | |
4379 GetIntegerv cmd2; | |
4380 cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); | |
4381 EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) | |
4382 .WillOnce(SetArgumentPointee<1>(8)) | |
4383 .RetiresOnSaturation(); | |
4384 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4385 EXPECT_EQ( | |
4386 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), | |
4387 result->GetNumResults()); | |
4388 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4389 EXPECT_EQ(8, result->GetData()[0]); | |
4390 result->size = 0; | |
4391 cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); | |
4392 EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) | |
4393 .WillOnce(SetArgumentPointee<1>(24)) | |
4394 .RetiresOnSaturation(); | |
4395 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4396 EXPECT_EQ( | |
4397 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), | |
4398 result->GetNumResults()); | |
4399 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4400 EXPECT_EQ(24, result->GetData()[0]); | |
4401 } | |
4402 | |
4403 TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilNoRequestedStencil) { | |
4404 InitState init; | |
4405 init.extensions = "GL_OES_packed_depth_stencil"; | |
4406 init.gl_version = "opengl es 2.0"; | |
4407 init.has_depth = true; | |
4408 init.has_stencil = true; | |
4409 init.request_depth = true; | |
4410 init.bind_generates_resource = true; | |
4411 InitDecoder(init); | |
4412 | |
4413 EXPECT_CALL(*gl_, GetError()) | |
4414 .WillOnce(Return(GL_NO_ERROR)) | |
4415 .WillOnce(Return(GL_NO_ERROR)) | |
4416 .WillOnce(Return(GL_NO_ERROR)) | |
4417 .WillOnce(Return(GL_NO_ERROR)) | |
4418 .RetiresOnSaturation(); | |
4419 typedef GetIntegerv::Result Result; | |
4420 Result* result = static_cast<Result*>(shared_memory_address_); | |
4421 result->size = 0; | |
4422 GetIntegerv cmd2; | |
4423 cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); | |
4424 EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) | |
4425 .WillOnce(SetArgumentPointee<1>(8)) | |
4426 .RetiresOnSaturation(); | |
4427 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4428 EXPECT_EQ( | |
4429 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), | |
4430 result->GetNumResults()); | |
4431 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4432 EXPECT_EQ(0, result->GetData()[0]); | |
4433 result->size = 0; | |
4434 cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); | |
4435 EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) | |
4436 .WillOnce(SetArgumentPointee<1>(24)) | |
4437 .RetiresOnSaturation(); | |
4438 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4439 EXPECT_EQ( | |
4440 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), | |
4441 result->GetNumResults()); | |
4442 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4443 EXPECT_EQ(24, result->GetData()[0]); | |
4444 } | |
4445 | |
4446 TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilRenderbufferDepth) { | |
4447 InitState init; | |
4448 init.extensions = "GL_OES_packed_depth_stencil"; | |
4449 init.gl_version = "opengl es 2.0"; | |
4450 init.bind_generates_resource = true; | |
4451 InitDecoder(init); | |
4452 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
4453 kServiceRenderbufferId); | |
4454 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
4455 kServiceFramebufferId); | |
4456 | |
4457 EXPECT_CALL(*gl_, GetError()) | |
4458 .WillOnce(Return(GL_NO_ERROR)) // for RenderbufferStoage | |
4459 .WillOnce(Return(GL_NO_ERROR)) | |
4460 .WillOnce(Return(GL_NO_ERROR)) // for FramebufferRenderbuffer | |
4461 .WillOnce(Return(GL_NO_ERROR)) | |
4462 .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv | |
4463 .WillOnce(Return(GL_NO_ERROR)) | |
4464 .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv | |
4465 .WillOnce(Return(GL_NO_ERROR)) | |
4466 .RetiresOnSaturation(); | |
4467 | |
4468 EXPECT_CALL(*gl_, RenderbufferStorageEXT( | |
4469 GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50)) | |
4470 .Times(1) | |
4471 .RetiresOnSaturation(); | |
4472 RenderbufferStorage cmd; | |
4473 cmd.Init(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50); | |
4474 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4475 EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( | |
4476 GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, | |
4477 kServiceRenderbufferId)) | |
4478 .Times(1) | |
4479 .RetiresOnSaturation(); | |
4480 FramebufferRenderbuffer fbrb_cmd; | |
4481 fbrb_cmd.Init( | |
4482 GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, | |
4483 client_renderbuffer_id_); | |
4484 EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); | |
4485 | |
4486 typedef GetIntegerv::Result Result; | |
4487 Result* result = static_cast<Result*>(shared_memory_address_); | |
4488 result->size = 0; | |
4489 GetIntegerv cmd2; | |
4490 cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); | |
4491 EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) | |
4492 .WillOnce(SetArgumentPointee<1>(8)) | |
4493 .RetiresOnSaturation(); | |
4494 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4495 EXPECT_EQ( | |
4496 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), | |
4497 result->GetNumResults()); | |
4498 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4499 EXPECT_EQ(0, result->GetData()[0]); | |
4500 result->size = 0; | |
4501 cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); | |
4502 EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) | |
4503 .WillOnce(SetArgumentPointee<1>(24)) | |
4504 .RetiresOnSaturation(); | |
4505 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4506 EXPECT_EQ( | |
4507 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), | |
4508 result->GetNumResults()); | |
4509 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4510 EXPECT_EQ(24, result->GetData()[0]); | |
4511 } | |
4512 | |
4513 TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilRenderbufferStencil) { | |
4514 InitState init; | |
4515 init.extensions = "GL_OES_packed_depth_stencil"; | |
4516 init.gl_version = "opengl es 2.0"; | |
4517 init.bind_generates_resource = true; | |
4518 InitDecoder(init); | |
4519 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
4520 kServiceRenderbufferId); | |
4521 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
4522 kServiceFramebufferId); | |
4523 | |
4524 EXPECT_CALL(*gl_, GetError()) | |
4525 .WillOnce(Return(GL_NO_ERROR)) // for RenderbufferStoage | |
4526 .WillOnce(Return(GL_NO_ERROR)) | |
4527 .WillOnce(Return(GL_NO_ERROR)) // for FramebufferRenderbuffer | |
4528 .WillOnce(Return(GL_NO_ERROR)) | |
4529 .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv | |
4530 .WillOnce(Return(GL_NO_ERROR)) | |
4531 .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv | |
4532 .WillOnce(Return(GL_NO_ERROR)) | |
4533 .RetiresOnSaturation(); | |
4534 | |
4535 EXPECT_CALL(*gl_, RenderbufferStorageEXT( | |
4536 GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50)) | |
4537 .Times(1) | |
4538 .RetiresOnSaturation(); | |
4539 RenderbufferStorage cmd; | |
4540 cmd.Init(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50); | |
4541 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4542 EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( | |
4543 GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, | |
4544 kServiceRenderbufferId)) | |
4545 .Times(1) | |
4546 .RetiresOnSaturation(); | |
4547 FramebufferRenderbuffer fbrb_cmd; | |
4548 fbrb_cmd.Init( | |
4549 GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, | |
4550 client_renderbuffer_id_); | |
4551 EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); | |
4552 | |
4553 typedef GetIntegerv::Result Result; | |
4554 Result* result = static_cast<Result*>(shared_memory_address_); | |
4555 result->size = 0; | |
4556 GetIntegerv cmd2; | |
4557 cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); | |
4558 EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) | |
4559 .WillOnce(SetArgumentPointee<1>(8)) | |
4560 .RetiresOnSaturation(); | |
4561 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4562 EXPECT_EQ( | |
4563 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), | |
4564 result->GetNumResults()); | |
4565 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4566 EXPECT_EQ(8, result->GetData()[0]); | |
4567 result->size = 0; | |
4568 cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); | |
4569 EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) | |
4570 .WillOnce(SetArgumentPointee<1>(24)) | |
4571 .RetiresOnSaturation(); | |
4572 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4573 EXPECT_EQ( | |
4574 decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), | |
4575 result->GetNumResults()); | |
4576 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4577 EXPECT_EQ(0, result->GetData()[0]); | |
4578 } | |
4579 | |
4580 TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMValidArgs) { | 367 TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMValidArgs) { |
4581 const GLsizei kCount = 3; | 368 const GLsizei kCount = 3; |
4582 GLenum* pnames = GetSharedMemoryAs<GLenum*>(); | 369 GLenum* pnames = GetSharedMemoryAs<GLenum*>(); |
4583 pnames[0] = GL_DEPTH_WRITEMASK; | 370 pnames[0] = GL_DEPTH_WRITEMASK; |
4584 pnames[1] = GL_COLOR_WRITEMASK; | 371 pnames[1] = GL_COLOR_WRITEMASK; |
4585 pnames[2] = GL_STENCIL_WRITEMASK; | 372 pnames[2] = GL_STENCIL_WRITEMASK; |
4586 GLint* results = | 373 GLint* results = |
4587 GetSharedMemoryAsWithOffset<GLint*>(sizeof(*pnames) * kCount); | 374 GetSharedMemoryAsWithOffset<GLint*>(sizeof(*pnames) * kCount); |
4588 | 375 |
4589 GLsizei num_results = 0; | 376 GLsizei num_results = 0; |
4590 for (GLsizei ii = 0; ii < kCount; ++ii) { | 377 for (GLsizei ii = 0; ii < kCount; ++ii) { |
4591 num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]); | 378 num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]); |
4592 } | 379 } |
4593 const GLsizei result_size = num_results * sizeof(*results); | 380 const GLsizei result_size = num_results * sizeof(*results); |
4594 memset(results, 0, result_size); | 381 memset(results, 0, result_size); |
4595 | 382 |
4596 const GLint kSentinel = 0x12345678; | 383 const GLint kSentinel = 0x12345678; |
4597 results[num_results] = kSentinel; | 384 results[num_results] = kSentinel; |
4598 | 385 |
4599 GetMultipleIntegervCHROMIUM cmd; | 386 GetMultipleIntegervCHROMIUM cmd; |
4600 cmd.Init( | 387 cmd.Init(kSharedMemoryId, |
4601 kSharedMemoryId, kSharedMemoryOffset, kCount, | 388 kSharedMemoryOffset, |
4602 kSharedMemoryId, kSharedMemoryOffset + sizeof(*pnames) * kCount, | 389 kCount, |
4603 result_size); | 390 kSharedMemoryId, |
4604 | 391 kSharedMemoryOffset + sizeof(*pnames) * kCount, |
4605 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 392 result_size); |
4606 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 393 |
4607 EXPECT_EQ(1, results[0]); // Depth writemask | 394 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
4608 EXPECT_EQ(1, results[1]); // color writemask red | 395 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
4609 EXPECT_EQ(1, results[2]); // color writemask green | 396 EXPECT_EQ(1, results[0]); // Depth writemask |
4610 EXPECT_EQ(1, results[3]); // color writemask blue | 397 EXPECT_EQ(1, results[1]); // color writemask red |
4611 EXPECT_EQ(1, results[4]); // color writemask alpha | 398 EXPECT_EQ(1, results[2]); // color writemask green |
4612 EXPECT_EQ(-1, results[5]); // stencil writemask alpha | 399 EXPECT_EQ(1, results[3]); // color writemask blue |
| 400 EXPECT_EQ(1, results[4]); // color writemask alpha |
| 401 EXPECT_EQ(-1, results[5]); // stencil writemask alpha |
4613 EXPECT_EQ(kSentinel, results[num_results]); // End of results | 402 EXPECT_EQ(kSentinel, results[num_results]); // End of results |
4614 } | 403 } |
4615 | 404 |
4616 TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMInvalidArgs) { | 405 TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMInvalidArgs) { |
4617 const GLsizei kCount = 3; | 406 const GLsizei kCount = 3; |
4618 // Offset the pnames because GLGetError will use the first uint32. | 407 // Offset the pnames because GLGetError will use the first uint32. |
4619 const uint32 kPnameOffset = sizeof(uint32); | 408 const uint32 kPnameOffset = sizeof(uint32); |
4620 const uint32 kResultsOffset = kPnameOffset + sizeof(GLint) * kCount; | 409 const uint32 kResultsOffset = kPnameOffset + sizeof(GLint) * kCount; |
4621 GLenum* pnames = GetSharedMemoryAsWithOffset<GLenum*>(kPnameOffset); | 410 GLenum* pnames = GetSharedMemoryAsWithOffset<GLenum*>(kPnameOffset); |
4622 pnames[0] = GL_DEPTH_WRITEMASK; | 411 pnames[0] = GL_DEPTH_WRITEMASK; |
4623 pnames[1] = GL_COLOR_WRITEMASK; | 412 pnames[1] = GL_COLOR_WRITEMASK; |
4624 pnames[2] = GL_STENCIL_WRITEMASK; | 413 pnames[2] = GL_STENCIL_WRITEMASK; |
4625 GLint* results = GetSharedMemoryAsWithOffset<GLint*>(kResultsOffset); | 414 GLint* results = GetSharedMemoryAsWithOffset<GLint*>(kResultsOffset); |
4626 | 415 |
4627 GLsizei num_results = 0; | 416 GLsizei num_results = 0; |
4628 for (GLsizei ii = 0; ii < kCount; ++ii) { | 417 for (GLsizei ii = 0; ii < kCount; ++ii) { |
4629 num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]); | 418 num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]); |
4630 } | 419 } |
4631 const GLsizei result_size = num_results * sizeof(*results); | 420 const GLsizei result_size = num_results * sizeof(*results); |
4632 memset(results, 0, result_size); | 421 memset(results, 0, result_size); |
4633 | 422 |
4634 const GLint kSentinel = 0x12345678; | 423 const GLint kSentinel = 0x12345678; |
4635 results[num_results] = kSentinel; | 424 results[num_results] = kSentinel; |
4636 | 425 |
4637 GetMultipleIntegervCHROMIUM cmd; | 426 GetMultipleIntegervCHROMIUM cmd; |
4638 // Check bad pnames pointer. | 427 // Check bad pnames pointer. |
4639 cmd.Init( | 428 cmd.Init(kInvalidSharedMemoryId, |
4640 kInvalidSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, | 429 kSharedMemoryOffset + kPnameOffset, |
4641 kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, | 430 kCount, |
4642 result_size); | 431 kSharedMemoryId, |
| 432 kSharedMemoryOffset + kResultsOffset, |
| 433 result_size); |
4643 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); | 434 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); |
4644 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 435 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
4645 // Check bad pnames pointer. | 436 // Check bad pnames pointer. |
4646 cmd.Init( | 437 cmd.Init(kSharedMemoryId, |
4647 kSharedMemoryId, kInvalidSharedMemoryOffset, kCount, | 438 kInvalidSharedMemoryOffset, |
4648 kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, | 439 kCount, |
4649 result_size); | 440 kSharedMemoryId, |
| 441 kSharedMemoryOffset + kResultsOffset, |
| 442 result_size); |
4650 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); | 443 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); |
4651 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 444 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
4652 // Check bad count. | 445 // Check bad count. |
4653 cmd.Init( | 446 cmd.Init(kSharedMemoryId, |
4654 kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, -1, | 447 kSharedMemoryOffset + kPnameOffset, |
4655 kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, | 448 -1, |
4656 result_size); | 449 kSharedMemoryId, |
| 450 kSharedMemoryOffset + kResultsOffset, |
| 451 result_size); |
4657 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); | 452 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); |
4658 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 453 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
4659 // Check bad results pointer. | 454 // Check bad results pointer. |
4660 cmd.Init( | 455 cmd.Init(kSharedMemoryId, |
4661 kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, | 456 kSharedMemoryOffset + kPnameOffset, |
4662 kInvalidSharedMemoryId, kSharedMemoryOffset + kResultsOffset, | 457 kCount, |
4663 result_size); | 458 kInvalidSharedMemoryId, |
| 459 kSharedMemoryOffset + kResultsOffset, |
| 460 result_size); |
4664 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); | 461 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); |
4665 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 462 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
4666 // Check bad results pointer. | 463 // Check bad results pointer. |
4667 cmd.Init( | 464 cmd.Init(kSharedMemoryId, |
4668 kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, | 465 kSharedMemoryOffset + kPnameOffset, |
4669 kSharedMemoryId, kInvalidSharedMemoryOffset, | 466 kCount, |
4670 result_size); | 467 kSharedMemoryId, |
| 468 kInvalidSharedMemoryOffset, |
| 469 result_size); |
4671 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); | 470 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); |
4672 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 471 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
4673 // Check bad size. | 472 // Check bad size. |
4674 cmd.Init( | 473 cmd.Init(kSharedMemoryId, |
4675 kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, | 474 kSharedMemoryOffset + kPnameOffset, |
4676 kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, | 475 kCount, |
4677 result_size + 1); | 476 kSharedMemoryId, |
| 477 kSharedMemoryOffset + kResultsOffset, |
| 478 result_size + 1); |
4678 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 479 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
4679 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 480 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
4680 // Check bad size. | 481 // Check bad size. |
4681 cmd.Init( | 482 cmd.Init(kSharedMemoryId, |
4682 kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, | 483 kSharedMemoryOffset + kPnameOffset, |
4683 kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, | 484 kCount, |
4684 result_size - 1); | 485 kSharedMemoryId, |
| 486 kSharedMemoryOffset + kResultsOffset, |
| 487 result_size - 1); |
4685 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 488 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
4686 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | 489 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); |
4687 // Check bad enum. | 490 // Check bad enum. |
4688 cmd.Init( | 491 cmd.Init(kSharedMemoryId, |
4689 kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, | 492 kSharedMemoryOffset + kPnameOffset, |
4690 kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, | 493 kCount, |
4691 result_size); | 494 kSharedMemoryId, |
| 495 kSharedMemoryOffset + kResultsOffset, |
| 496 result_size); |
4692 GLenum temp = pnames[2]; | 497 GLenum temp = pnames[2]; |
4693 pnames[2] = GL_TRUE; | 498 pnames[2] = GL_TRUE; |
4694 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 499 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
4695 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | 500 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); |
4696 pnames[2] = temp; | 501 pnames[2] = temp; |
4697 // Check results area has not been cleared by client. | 502 // Check results area has not been cleared by client. |
4698 results[1] = 1; | 503 results[1] = 1; |
4699 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); | 504 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); |
4700 // Check buffer is what we expect | 505 // Check buffer is what we expect |
4701 EXPECT_EQ(0, results[0]); | 506 EXPECT_EQ(0, results[0]); |
4702 EXPECT_EQ(1, results[1]); | 507 EXPECT_EQ(1, results[1]); |
4703 EXPECT_EQ(0, results[2]); | 508 EXPECT_EQ(0, results[2]); |
4704 EXPECT_EQ(0, results[3]); | 509 EXPECT_EQ(0, results[3]); |
4705 EXPECT_EQ(0, results[4]); | 510 EXPECT_EQ(0, results[4]); |
4706 EXPECT_EQ(0, results[5]); | 511 EXPECT_EQ(0, results[5]); |
4707 EXPECT_EQ(kSentinel, results[num_results]); // End of results | 512 EXPECT_EQ(kSentinel, results[num_results]); // End of results |
4708 } | 513 } |
4709 | 514 |
4710 TEST_F(GLES2DecoderTest, TexImage2DRedefinitionSucceeds) { | |
4711 const int kWidth = 16; | |
4712 const int kHeight = 8; | |
4713 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
4714 EXPECT_CALL(*gl_, GetError()) | |
4715 .WillRepeatedly(Return(GL_NO_ERROR)); | |
4716 for (int ii = 0; ii < 2; ++ii) { | |
4717 TexImage2D cmd; | |
4718 if (ii == 0) { | |
4719 EXPECT_CALL(*gl_, TexImage2D( | |
4720 GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, | |
4721 GL_UNSIGNED_BYTE, _)) | |
4722 .Times(1) | |
4723 .RetiresOnSaturation(); | |
4724 cmd.Init( | |
4725 GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, | |
4726 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); | |
4727 } else { | |
4728 SetupClearTextureExpectations( | |
4729 kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, | |
4730 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, kWidth, kHeight); | |
4731 cmd.Init( | |
4732 GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, | |
4733 GL_UNSIGNED_BYTE, 0, 0); | |
4734 } | |
4735 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4736 EXPECT_CALL(*gl_, TexSubImage2D( | |
4737 GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight - 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
4738 shared_memory_address_)) | |
4739 .Times(1) | |
4740 .RetiresOnSaturation(); | |
4741 // Consider this TexSubImage2D command part of the previous TexImage2D | |
4742 // (last GL_TRUE argument). It will be skipped if there are bugs in the | |
4743 // redefinition case. | |
4744 TexSubImage2D cmd2; | |
4745 cmd2.Init( | |
4746 GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight - 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
4747 kSharedMemoryId, kSharedMemoryOffset, GL_TRUE); | |
4748 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
4749 } | |
4750 } | |
4751 | |
4752 TEST_F(GLES2DecoderTest, TexImage2DGLError) { | |
4753 GLenum target = GL_TEXTURE_2D; | |
4754 GLint level = 0; | |
4755 GLenum internal_format = GL_RGBA; | |
4756 GLsizei width = 2; | |
4757 GLsizei height = 4; | |
4758 GLint border = 0; | |
4759 GLenum format = GL_RGBA; | |
4760 GLenum type = GL_UNSIGNED_BYTE; | |
4761 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
4762 TextureManager* manager = group().texture_manager(); | |
4763 TextureRef* texture_ref = manager->GetTexture(client_texture_id_); | |
4764 ASSERT_TRUE(texture_ref != NULL); | |
4765 Texture* texture = texture_ref->texture(); | |
4766 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); | |
4767 EXPECT_CALL(*gl_, GetError()) | |
4768 .WillOnce(Return(GL_NO_ERROR)) | |
4769 .WillOnce(Return(GL_OUT_OF_MEMORY)) | |
4770 .RetiresOnSaturation(); | |
4771 EXPECT_CALL(*gl_, TexImage2D(target, level, internal_format, | |
4772 width, height, border, format, type, _)) | |
4773 .Times(1) | |
4774 .RetiresOnSaturation(); | |
4775 TexImage2D cmd; | |
4776 cmd.Init(target, level, internal_format, width, height, border, format, | |
4777 type, kSharedMemoryId, kSharedMemoryOffset); | |
4778 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4779 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
4780 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); | |
4781 } | |
4782 | |
4783 TEST_F(GLES2DecoderTest, BufferDataGLError) { | |
4784 GLenum target = GL_ARRAY_BUFFER; | |
4785 GLsizeiptr size = 4; | |
4786 DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); | |
4787 BufferManager* manager = group().buffer_manager(); | |
4788 Buffer* buffer = manager->GetBuffer(client_buffer_id_); | |
4789 ASSERT_TRUE(buffer != NULL); | |
4790 EXPECT_EQ(0, buffer->size()); | |
4791 EXPECT_CALL(*gl_, GetError()) | |
4792 .WillOnce(Return(GL_NO_ERROR)) | |
4793 .WillOnce(Return(GL_OUT_OF_MEMORY)) | |
4794 .RetiresOnSaturation(); | |
4795 EXPECT_CALL(*gl_, BufferData(target, size, _, GL_STREAM_DRAW)) | |
4796 .Times(1) | |
4797 .RetiresOnSaturation(); | |
4798 BufferData cmd; | |
4799 cmd.Init(target, size, 0, 0, GL_STREAM_DRAW); | |
4800 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4801 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
4802 EXPECT_EQ(0, buffer->size()); | |
4803 } | |
4804 | |
4805 TEST_F(GLES2DecoderTest, CopyTexImage2DGLError) { | |
4806 GLenum target = GL_TEXTURE_2D; | |
4807 GLint level = 0; | |
4808 GLenum internal_format = GL_RGBA; | |
4809 GLsizei width = 2; | |
4810 GLsizei height = 4; | |
4811 GLint border = 0; | |
4812 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
4813 TextureManager* manager = group().texture_manager(); | |
4814 TextureRef* texture_ref = manager->GetTexture(client_texture_id_); | |
4815 ASSERT_TRUE(texture_ref != NULL); | |
4816 Texture* texture = texture_ref->texture(); | |
4817 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); | |
4818 EXPECT_CALL(*gl_, GetError()) | |
4819 .WillOnce(Return(GL_NO_ERROR)) | |
4820 .WillOnce(Return(GL_OUT_OF_MEMORY)) | |
4821 .RetiresOnSaturation(); | |
4822 EXPECT_CALL(*gl_, CopyTexImage2D( | |
4823 target, level, internal_format, 0, 0, width, height, border)) | |
4824 .Times(1) | |
4825 .RetiresOnSaturation(); | |
4826 CopyTexImage2D cmd; | |
4827 cmd.Init(target, level, internal_format, 0, 0, width, height, border); | |
4828 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4829 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
4830 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); | |
4831 } | |
4832 | |
4833 TEST_F(GLES2DecoderTest, FramebufferRenderbufferGLError) { | |
4834 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
4835 kServiceFramebufferId); | |
4836 EXPECT_CALL(*gl_, GetError()) | |
4837 .WillOnce(Return(GL_NO_ERROR)) | |
4838 .WillOnce(Return(GL_OUT_OF_MEMORY)) | |
4839 .RetiresOnSaturation(); | |
4840 EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( | |
4841 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
4842 kServiceRenderbufferId)) | |
4843 .Times(1) | |
4844 .RetiresOnSaturation(); | |
4845 FramebufferRenderbuffer cmd; | |
4846 cmd.Init( | |
4847 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
4848 client_renderbuffer_id_); | |
4849 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4850 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
4851 } | |
4852 | |
4853 TEST_F(GLES2DecoderTest, FramebufferTexture2DGLError) { | |
4854 const GLsizei kWidth = 5; | |
4855 const GLsizei kHeight = 3; | |
4856 const GLenum kFormat = GL_RGB; | |
4857 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
4858 DoTexImage2D(GL_TEXTURE_2D, 0, kFormat, kWidth, kHeight, 0, | |
4859 kFormat, GL_UNSIGNED_BYTE, 0, 0); | |
4860 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
4861 kServiceFramebufferId); | |
4862 EXPECT_CALL(*gl_, GetError()) | |
4863 .WillOnce(Return(GL_NO_ERROR)) | |
4864 .WillOnce(Return(GL_OUT_OF_MEMORY)) | |
4865 .RetiresOnSaturation(); | |
4866 EXPECT_CALL(*gl_, FramebufferTexture2DEXT( | |
4867 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
4868 kServiceTextureId, 0)) | |
4869 .Times(1) | |
4870 .RetiresOnSaturation(); | |
4871 FramebufferTexture2D fbtex_cmd; | |
4872 fbtex_cmd.Init( | |
4873 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_, | |
4874 0); | |
4875 EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd)); | |
4876 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
4877 } | |
4878 | |
4879 TEST_F(GLES2DecoderTest, RenderbufferStorageGLError) { | |
4880 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
4881 kServiceRenderbufferId); | |
4882 EXPECT_CALL(*gl_, GetError()) | |
4883 .WillOnce(Return(GL_NO_ERROR)) | |
4884 .WillOnce(Return(GL_OUT_OF_MEMORY)) | |
4885 .RetiresOnSaturation(); | |
4886 EXPECT_CALL(*gl_, RenderbufferStorageEXT( | |
4887 GL_RENDERBUFFER, GL_RGBA, 100, 50)) | |
4888 .Times(1) | |
4889 .RetiresOnSaturation(); | |
4890 RenderbufferStorage cmd; | |
4891 cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 100, 50); | |
4892 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4893 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
4894 } | |
4895 | |
4896 TEST_F(GLES2DecoderTest, RenderbufferStorageBadArgs) { | |
4897 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
4898 kServiceRenderbufferId); | |
4899 EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)) | |
4900 .Times(0) | |
4901 .RetiresOnSaturation(); | |
4902 RenderbufferStorage cmd; | |
4903 cmd.Init(GL_RENDERBUFFER, GL_RGBA4, TestHelper::kMaxRenderbufferSize + 1, 1); | |
4904 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4905 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
4906 cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 1, TestHelper::kMaxRenderbufferSize + 1); | |
4907 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4908 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
4909 } | |
4910 | |
4911 TEST_F(GLES2DecoderManualInitTest, | |
4912 RenderbufferStorageMultisampleCHROMIUMGLError) { | |
4913 InitState init; | |
4914 init.extensions = "GL_EXT_framebuffer_multisample"; | |
4915 init.gl_version = "2.1"; | |
4916 init.bind_generates_resource = true; | |
4917 InitDecoder(init); | |
4918 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
4919 kServiceRenderbufferId); | |
4920 EXPECT_CALL(*gl_, GetError()) | |
4921 .WillOnce(Return(GL_NO_ERROR)) | |
4922 .WillOnce(Return(GL_OUT_OF_MEMORY)) | |
4923 .RetiresOnSaturation(); | |
4924 EXPECT_CALL(*gl_, RenderbufferStorageMultisampleEXT( | |
4925 GL_RENDERBUFFER, 1, GL_RGBA, 100, 50)) | |
4926 .Times(1) | |
4927 .RetiresOnSaturation(); | |
4928 RenderbufferStorageMultisampleCHROMIUM cmd; | |
4929 cmd.Init(GL_RENDERBUFFER, 1, GL_RGBA4, 100, 50); | |
4930 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4931 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
4932 } | |
4933 | |
4934 TEST_F(GLES2DecoderManualInitTest, | |
4935 RenderbufferStorageMultisampleCHROMIUMBadArgs) { | |
4936 InitState init; | |
4937 init.extensions = "GL_EXT_framebuffer_multisample"; | |
4938 init.gl_version = "2.1"; | |
4939 init.bind_generates_resource = true; | |
4940 InitDecoder(init); | |
4941 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
4942 kServiceRenderbufferId); | |
4943 EXPECT_CALL(*gl_, RenderbufferStorageMultisampleEXT(_, _, _, _, _)) | |
4944 .Times(0) | |
4945 .RetiresOnSaturation(); | |
4946 RenderbufferStorageMultisampleCHROMIUM cmd; | |
4947 cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples + 1, | |
4948 GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1); | |
4949 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4950 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
4951 cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, | |
4952 GL_RGBA4, TestHelper::kMaxRenderbufferSize + 1, 1); | |
4953 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4954 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
4955 cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, | |
4956 GL_RGBA4, 1, TestHelper::kMaxRenderbufferSize + 1); | |
4957 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4958 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
4959 } | |
4960 | |
4961 TEST_F(GLES2DecoderManualInitTest, RenderbufferStorageMultisampleCHROMIUM) { | |
4962 InitState init; | |
4963 init.extensions = "GL_EXT_framebuffer_multisample"; | |
4964 init.gl_version = "2.1"; | |
4965 InitDecoder(init); | |
4966 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
4967 kServiceRenderbufferId); | |
4968 InSequence sequence; | |
4969 EXPECT_CALL(*gl_, GetError()) | |
4970 .WillOnce(Return(GL_NO_ERROR)) | |
4971 .RetiresOnSaturation(); | |
4972 EXPECT_CALL( | |
4973 *gl_, | |
4974 RenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, | |
4975 TestHelper::kMaxSamples, | |
4976 GL_RGBA, | |
4977 TestHelper::kMaxRenderbufferSize, | |
4978 1)) | |
4979 .Times(1) | |
4980 .RetiresOnSaturation(); | |
4981 EXPECT_CALL(*gl_, GetError()) | |
4982 .WillOnce(Return(GL_NO_ERROR)) | |
4983 .RetiresOnSaturation(); | |
4984 RenderbufferStorageMultisampleCHROMIUM cmd; | |
4985 cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, | |
4986 GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1); | |
4987 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
4988 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
4989 } | |
4990 | |
4991 TEST_F(GLES2DecoderManualInitTest, | |
4992 RenderbufferStorageMultisampleEXTNotSupported) { | |
4993 InitState init; | |
4994 init.extensions = "GL_EXT_framebuffer_multisample"; | |
4995 init.gl_version = "2.1"; | |
4996 init.bind_generates_resource = true; | |
4997 InitDecoder(init); | |
4998 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
4999 kServiceRenderbufferId); | |
5000 InSequence sequence; | |
5001 // GL_EXT_framebuffer_multisample uses RenderbufferStorageMultisampleCHROMIUM. | |
5002 RenderbufferStorageMultisampleEXT cmd; | |
5003 cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, | |
5004 GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1); | |
5005 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5006 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5007 } | |
5008 | |
5009 class GLES2DecoderMultisampledRenderToTextureTest | |
5010 : public GLES2DecoderTestWithExtensionsOnGLES2 {}; | |
5011 | |
5012 TEST_P(GLES2DecoderMultisampledRenderToTextureTest, | |
5013 NotCompatibleWithRenderbufferStorageMultisampleCHROMIUM) { | |
5014 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
5015 kServiceRenderbufferId); | |
5016 RenderbufferStorageMultisampleCHROMIUM cmd; | |
5017 cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, | |
5018 GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1); | |
5019 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5020 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5021 } | |
5022 | |
5023 TEST_P(GLES2DecoderMultisampledRenderToTextureTest, | |
5024 RenderbufferStorageMultisampleEXT) { | |
5025 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
5026 kServiceRenderbufferId); | |
5027 InSequence sequence; | |
5028 EXPECT_CALL(*gl_, GetError()) | |
5029 .WillOnce(Return(GL_NO_ERROR)) | |
5030 .RetiresOnSaturation(); | |
5031 if (strstr(GetParam(), "GL_IMG_multisampled_render_to_texture")) { | |
5032 EXPECT_CALL( | |
5033 *gl_, | |
5034 RenderbufferStorageMultisampleIMG(GL_RENDERBUFFER, | |
5035 TestHelper::kMaxSamples, | |
5036 GL_RGBA, | |
5037 TestHelper::kMaxRenderbufferSize, | |
5038 1)) | |
5039 .Times(1) | |
5040 .RetiresOnSaturation(); | |
5041 } else { | |
5042 EXPECT_CALL( | |
5043 *gl_, | |
5044 RenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, | |
5045 TestHelper::kMaxSamples, | |
5046 GL_RGBA, | |
5047 TestHelper::kMaxRenderbufferSize, | |
5048 1)) | |
5049 .Times(1) | |
5050 .RetiresOnSaturation(); | |
5051 } | |
5052 EXPECT_CALL(*gl_, GetError()) | |
5053 .WillOnce(Return(GL_NO_ERROR)) | |
5054 .RetiresOnSaturation(); | |
5055 RenderbufferStorageMultisampleEXT cmd; | |
5056 cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, | |
5057 GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1); | |
5058 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5059 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5060 } | |
5061 | |
5062 INSTANTIATE_TEST_CASE_P( | |
5063 GLES2DecoderMultisampledRenderToTextureTests, | |
5064 GLES2DecoderMultisampledRenderToTextureTest, | |
5065 ::testing::Values("GL_EXT_multisampled_render_to_texture", | |
5066 "GL_IMG_multisampled_render_to_texture")); | |
5067 | |
5068 TEST_F(GLES2DecoderTest, ReadPixelsGLError) { | |
5069 GLenum kFormat = GL_RGBA; | |
5070 GLint x = 0; | |
5071 GLint y = 0; | |
5072 GLsizei width = 2; | |
5073 GLsizei height = 4; | |
5074 typedef ReadPixels::Result Result; | |
5075 Result* result = GetSharedMemoryAs<Result*>(); | |
5076 uint32 result_shm_id = kSharedMemoryId; | |
5077 uint32 result_shm_offset = kSharedMemoryOffset; | |
5078 uint32 pixels_shm_id = kSharedMemoryId; | |
5079 uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); | |
5080 EXPECT_CALL(*gl_, GetError()) | |
5081 .WillOnce(Return(GL_NO_ERROR)) | |
5082 .WillOnce(Return(GL_OUT_OF_MEMORY)) | |
5083 .RetiresOnSaturation(); | |
5084 EXPECT_CALL( | |
5085 *gl_, ReadPixels(x, y, width, height, kFormat, GL_UNSIGNED_BYTE, _)) | |
5086 .Times(1) | |
5087 .RetiresOnSaturation(); | |
5088 ReadPixels cmd; | |
5089 cmd.Init(x, y, width, height, kFormat, GL_UNSIGNED_BYTE, | |
5090 pixels_shm_id, pixels_shm_offset, | |
5091 result_shm_id, result_shm_offset, | |
5092 false); | |
5093 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5094 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | |
5095 } | |
5096 | |
5097 TEST_F(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsS3TC) { | |
5098 const GLenum formats[] = { | |
5099 GL_COMPRESSED_RGB_S3TC_DXT1_EXT, | |
5100 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, | |
5101 GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, | |
5102 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT | |
5103 }; | |
5104 CheckFormats("GL_EXT_texture_compression_s3tc", formats, 4); | |
5105 } | |
5106 | |
5107 TEST_F(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsATC) { | |
5108 const GLenum formats[] = { | |
5109 GL_ATC_RGB_AMD, | |
5110 GL_ATC_RGBA_EXPLICIT_ALPHA_AMD, | |
5111 GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD | |
5112 }; | |
5113 CheckFormats("GL_AMD_compressed_ATC_texture", formats, 3); | |
5114 } | |
5115 | |
5116 TEST_F(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsPVRTC) { | |
5117 const GLenum formats[] = { | |
5118 GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, | |
5119 GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG, | |
5120 GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, | |
5121 GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG | |
5122 }; | |
5123 CheckFormats("GL_IMG_texture_compression_pvrtc", formats, 4); | |
5124 } | |
5125 | |
5126 TEST_F(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsETC1) { | |
5127 const GLenum formats[] = { | |
5128 GL_ETC1_RGB8_OES | |
5129 }; | |
5130 CheckFormats("GL_OES_compressed_ETC1_RGB8_texture", formats, 1); | |
5131 } | |
5132 | |
5133 TEST_F(GLES2DecoderManualInitTest, GetNoCompressedTextureFormats) { | |
5134 InitState init; | |
5135 init.gl_version = "3.0"; | |
5136 init.bind_generates_resource = true; | |
5137 InitDecoder(init); | |
5138 | |
5139 EXPECT_CALL(*gl_, GetError()) | |
5140 .WillOnce(Return(GL_NO_ERROR)) | |
5141 .WillOnce(Return(GL_NO_ERROR)) | |
5142 .WillOnce(Return(GL_NO_ERROR)) | |
5143 .WillOnce(Return(GL_NO_ERROR)) | |
5144 .RetiresOnSaturation(); | |
5145 | |
5146 typedef GetIntegerv::Result Result; | |
5147 Result* result = static_cast<Result*>(shared_memory_address_); | |
5148 GetIntegerv cmd; | |
5149 result->size = 0; | |
5150 EXPECT_CALL(*gl_, GetIntegerv(_, _)) | |
5151 .Times(0) | |
5152 .RetiresOnSaturation(); | |
5153 cmd.Init( | |
5154 GL_NUM_COMPRESSED_TEXTURE_FORMATS, | |
5155 shared_memory_id_, shared_memory_offset_); | |
5156 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5157 EXPECT_EQ(1, result->GetNumResults()); | |
5158 GLint num_formats = result->GetData()[0]; | |
5159 EXPECT_EQ(0, num_formats); | |
5160 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5161 | |
5162 result->size = 0; | |
5163 cmd.Init( | |
5164 GL_COMPRESSED_TEXTURE_FORMATS, | |
5165 shared_memory_id_, shared_memory_offset_); | |
5166 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5167 EXPECT_EQ(num_formats, result->GetNumResults()); | |
5168 | |
5169 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5170 } | |
5171 | |
5172 TEST_F(GLES2DecoderManualInitTest, CompressedTexImage2DBucketBadBucket) { | |
5173 InitState init; | |
5174 init.extensions = "GL_EXT_texture_compression_s3tc"; | |
5175 init.gl_version = "3.0"; | |
5176 init.bind_generates_resource = true; | |
5177 InitDecoder(init); | |
5178 | |
5179 const uint32 kBadBucketId = 123; | |
5180 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
5181 CompressedTexImage2DBucket cmd; | |
5182 cmd.Init( | |
5183 GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 4, 4, 0, | |
5184 kBadBucketId); | |
5185 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
5186 CompressedTexSubImage2DBucket cmd2; | |
5187 cmd2.Init( | |
5188 GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, | |
5189 kBadBucketId); | |
5190 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | |
5191 } | |
5192 | |
5193 namespace { | |
5194 | |
5195 struct S3TCTestData { | |
5196 GLenum format; | |
5197 size_t block_size; | |
5198 }; | |
5199 | |
5200 } // anonymous namespace. | |
5201 | |
5202 TEST_F(GLES2DecoderManualInitTest, CompressedTexImage2DS3TC) { | |
5203 InitState init; | |
5204 init.extensions = "GL_EXT_texture_compression_s3tc"; | |
5205 init.gl_version = "3.0"; | |
5206 init.bind_generates_resource = true; | |
5207 InitDecoder(init); | |
5208 const uint32 kBucketId = 123; | |
5209 CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId); | |
5210 ASSERT_TRUE(bucket != NULL); | |
5211 | |
5212 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
5213 | |
5214 static const S3TCTestData test_data[] = { | |
5215 { GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, }, | |
5216 { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, }, | |
5217 { GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 16, }, | |
5218 { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 16, }, | |
5219 }; | |
5220 | |
5221 for (size_t ii = 0; ii < arraysize(test_data); ++ii) { | |
5222 const S3TCTestData& test = test_data[ii]; | |
5223 CompressedTexImage2DBucket cmd; | |
5224 // test small width. | |
5225 DoCompressedTexImage2D( | |
5226 GL_TEXTURE_2D, 0, test.format, 2, 4, 0, test.block_size, | |
5227 kBucketId); | |
5228 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5229 | |
5230 // test bad width. | |
5231 cmd.Init( | |
5232 GL_TEXTURE_2D, 0, test.format, 5, 4, 0, | |
5233 kBucketId); | |
5234 bucket->SetSize(test.block_size * 2); | |
5235 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5236 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5237 | |
5238 // test small height. | |
5239 DoCompressedTexImage2D( | |
5240 GL_TEXTURE_2D, 0, test.format, 4, 2, 0, test.block_size, | |
5241 kBucketId); | |
5242 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5243 | |
5244 // test too bad height. | |
5245 cmd.Init( | |
5246 GL_TEXTURE_2D, 0, test.format, 4, 5, 0, | |
5247 kBucketId); | |
5248 bucket->SetSize(test.block_size * 2); | |
5249 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5250 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5251 | |
5252 // test small for level 0. | |
5253 DoCompressedTexImage2D( | |
5254 GL_TEXTURE_2D, 0, test.format, 1, 1, 0, test.block_size, | |
5255 kBucketId); | |
5256 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5257 | |
5258 // test small for level 0. | |
5259 DoCompressedTexImage2D( | |
5260 GL_TEXTURE_2D, 0, test.format, 2, 2, 0, test.block_size, | |
5261 kBucketId); | |
5262 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5263 | |
5264 // test size too large. | |
5265 cmd.Init( | |
5266 GL_TEXTURE_2D, 0, test.format, 4, 4, 0, | |
5267 kBucketId); | |
5268 bucket->SetSize(test.block_size * 2); | |
5269 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5270 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5271 | |
5272 // test size too small. | |
5273 cmd.Init( | |
5274 GL_TEXTURE_2D, 0, test.format, 4, 4, 0, | |
5275 kBucketId); | |
5276 bucket->SetSize(test.block_size / 2); | |
5277 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5278 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5279 | |
5280 // test with 3 mips. | |
5281 DoCompressedTexImage2D( | |
5282 GL_TEXTURE_2D, 0, test.format, 4, 4, 0, test.block_size, kBucketId); | |
5283 DoCompressedTexImage2D( | |
5284 GL_TEXTURE_2D, 1, test.format, 2, 2, 0, test.block_size, kBucketId); | |
5285 DoCompressedTexImage2D( | |
5286 GL_TEXTURE_2D, 2, test.format, 1, 1, 0, test.block_size, kBucketId); | |
5287 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5288 | |
5289 // Test a 16x16 | |
5290 DoCompressedTexImage2D( | |
5291 GL_TEXTURE_2D, 0, test.format, 16, 16, 0, test.block_size * 4 * 4, | |
5292 kBucketId); | |
5293 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5294 | |
5295 CompressedTexSubImage2DBucket sub_cmd; | |
5296 bucket->SetSize(test.block_size); | |
5297 // Test sub image bad xoffset | |
5298 sub_cmd.Init( | |
5299 GL_TEXTURE_2D, 0, 1, 0, 4, 4, test.format, kBucketId); | |
5300 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); | |
5301 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5302 | |
5303 // Test sub image bad yoffset | |
5304 sub_cmd.Init( | |
5305 GL_TEXTURE_2D, 0, 0, 2, 4, 4, test.format, kBucketId); | |
5306 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); | |
5307 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5308 | |
5309 // Test sub image bad width | |
5310 bucket->SetSize(test.block_size * 2); | |
5311 sub_cmd.Init( | |
5312 GL_TEXTURE_2D, 0, 0, 0, 5, 4, test.format, kBucketId); | |
5313 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); | |
5314 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5315 | |
5316 // Test sub image bad height | |
5317 sub_cmd.Init( | |
5318 GL_TEXTURE_2D, 0, 0, 0, 4, 5, test.format, kBucketId); | |
5319 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); | |
5320 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5321 | |
5322 // Test sub image bad size | |
5323 bucket->SetSize(test.block_size + 1); | |
5324 sub_cmd.Init( | |
5325 GL_TEXTURE_2D, 0, 0, 0, 4, 4, test.format, kBucketId); | |
5326 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); | |
5327 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5328 | |
5329 for (GLint yoffset = 0; yoffset <= 8; yoffset += 4) { | |
5330 for (GLint xoffset = 0; xoffset <= 8; xoffset += 4) { | |
5331 for (GLsizei height = 4; height <= 8; height +=4 ) { | |
5332 for (GLsizei width = 4; width <= 8; width += 4) { | |
5333 GLsizei size = test.block_size * (width / 4) * (height / 4); | |
5334 bucket->SetSize(size); | |
5335 EXPECT_CALL(*gl_, CompressedTexSubImage2D( | |
5336 GL_TEXTURE_2D, 0, xoffset, yoffset, width, height, test.format, | |
5337 size, _)) | |
5338 .Times(1) | |
5339 .RetiresOnSaturation(); | |
5340 sub_cmd.Init( | |
5341 GL_TEXTURE_2D, 0, xoffset, yoffset, width, height, test.format, | |
5342 kBucketId); | |
5343 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); | |
5344 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5345 } | |
5346 } | |
5347 } | |
5348 } | |
5349 } | |
5350 } | |
5351 | |
5352 TEST_F(GLES2DecoderManualInitTest, CompressedTexImage2DETC1) { | |
5353 InitState init; | |
5354 init.extensions = "GL_OES_compressed_ETC1_RGB8_texture"; | |
5355 init.gl_version = "opengl es 2.0"; | |
5356 init.bind_generates_resource = true; | |
5357 InitDecoder(init); | |
5358 const uint32 kBucketId = 123; | |
5359 CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId); | |
5360 ASSERT_TRUE(bucket != NULL); | |
5361 | |
5362 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
5363 | |
5364 const GLenum kFormat = GL_ETC1_RGB8_OES; | |
5365 const size_t kBlockSize = 8; | |
5366 | |
5367 CompressedTexImage2DBucket cmd; | |
5368 // test small width. | |
5369 DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 4, 8, 0, 16, kBucketId); | |
5370 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5371 | |
5372 // test small height. | |
5373 DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 8, 4, 0, 16, kBucketId); | |
5374 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5375 | |
5376 // test size too large. | |
5377 cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, 0, kBucketId); | |
5378 bucket->SetSize(kBlockSize * 2); | |
5379 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5380 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5381 | |
5382 // test size too small. | |
5383 cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, 0, kBucketId); | |
5384 bucket->SetSize(kBlockSize / 2); | |
5385 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5386 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5387 | |
5388 // Test a 16x16 | |
5389 DoCompressedTexImage2D( | |
5390 GL_TEXTURE_2D, 0, kFormat, 16, 16, 0, kBlockSize * 16, kBucketId); | |
5391 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5392 | |
5393 // Test CompressedTexSubImage not allowed | |
5394 CompressedTexSubImage2DBucket sub_cmd; | |
5395 bucket->SetSize(kBlockSize); | |
5396 sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, kFormat, kBucketId); | |
5397 EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); | |
5398 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5399 | |
5400 // Test TexSubImage not allowed for ETC1 compressed texture | |
5401 TextureRef* texture_ref = GetTexture(client_texture_id_); | |
5402 ASSERT_TRUE(texture_ref != NULL); | |
5403 Texture* texture = texture_ref->texture(); | |
5404 GLenum type, internal_format; | |
5405 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); | |
5406 EXPECT_EQ(kFormat, internal_format); | |
5407 TexSubImage2D texsub_cmd; | |
5408 texsub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, | |
5409 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
5410 EXPECT_EQ(error::kNoError, ExecuteCmd(texsub_cmd)); | |
5411 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5412 | |
5413 // Test CopyTexSubImage not allowed for ETC1 compressed texture | |
5414 CopyTexSubImage2D copy_cmd; | |
5415 copy_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4); | |
5416 EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd)); | |
5417 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5418 } | |
5419 | |
5420 TEST_F(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMValidArgs) { | |
5421 const uint32 kBucketId = 123; | |
5422 GetProgramInfoCHROMIUM cmd; | |
5423 cmd.Init(client_program_id_, kBucketId); | |
5424 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5425 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); | |
5426 EXPECT_GT(bucket->size(), 0u); | |
5427 } | |
5428 | |
5429 TEST_F(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMInvalidArgs) { | |
5430 const uint32 kBucketId = 123; | |
5431 CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); | |
5432 EXPECT_TRUE(bucket == NULL); | |
5433 GetProgramInfoCHROMIUM cmd; | |
5434 cmd.Init(kInvalidClientId, kBucketId); | |
5435 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5436 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5437 bucket = decoder_->GetBucket(kBucketId); | |
5438 ASSERT_TRUE(bucket != NULL); | |
5439 EXPECT_EQ(sizeof(ProgramInfoHeader), bucket->size()); | |
5440 ProgramInfoHeader* info = bucket->GetDataAs<ProgramInfoHeader*>( | |
5441 0, sizeof(ProgramInfoHeader)); | |
5442 ASSERT_TRUE(info != 0); | |
5443 EXPECT_EQ(0u, info->link_status); | |
5444 EXPECT_EQ(0u, info->num_attribs); | |
5445 EXPECT_EQ(0u, info->num_uniforms); | |
5446 } | |
5447 | |
5448 TEST_F(GLES2DecoderManualInitTest, EGLImageExternalBindTexture) { | |
5449 InitState init; | |
5450 init.extensions = "GL_OES_EGL_image_external"; | |
5451 init.gl_version = "opengl es 2.0"; | |
5452 init.bind_generates_resource = true; | |
5453 InitDecoder(init); | |
5454 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_EXTERNAL_OES, kNewServiceId)); | |
5455 EXPECT_CALL(*gl_, GenTextures(1, _)) | |
5456 .WillOnce(SetArgumentPointee<1>(kNewServiceId)); | |
5457 BindTexture cmd; | |
5458 cmd.Init(GL_TEXTURE_EXTERNAL_OES, kNewClientId); | |
5459 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5460 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5461 TextureRef* texture_ref = GetTexture(kNewClientId); | |
5462 EXPECT_TRUE(texture_ref != NULL); | |
5463 EXPECT_TRUE(texture_ref->texture()->target() == GL_TEXTURE_EXTERNAL_OES); | |
5464 } | |
5465 | |
5466 TEST_F(GLES2DecoderManualInitTest, EGLImageExternalGetBinding) { | |
5467 InitState init; | |
5468 init.extensions = "GL_OES_EGL_image_external"; | |
5469 init.gl_version = "opengl es 2.0"; | |
5470 init.bind_generates_resource = true; | |
5471 InitDecoder(init); | |
5472 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); | |
5473 | |
5474 EXPECT_CALL(*gl_, GetError()) | |
5475 .WillOnce(Return(GL_NO_ERROR)) | |
5476 .WillOnce(Return(GL_NO_ERROR)) | |
5477 .RetiresOnSaturation(); | |
5478 typedef GetIntegerv::Result Result; | |
5479 Result* result = static_cast<Result*>(shared_memory_address_); | |
5480 EXPECT_CALL(*gl_, GetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, | |
5481 result->GetData())) | |
5482 .Times(0); | |
5483 result->size = 0; | |
5484 GetIntegerv cmd; | |
5485 cmd.Init(GL_TEXTURE_BINDING_EXTERNAL_OES, | |
5486 shared_memory_id_, | |
5487 shared_memory_offset_); | |
5488 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5489 EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( | |
5490 GL_TEXTURE_BINDING_EXTERNAL_OES), result->GetNumResults()); | |
5491 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5492 EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]); | |
5493 } | |
5494 | |
5495 TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureDefaults) { | |
5496 InitState init; | |
5497 init.extensions = "GL_OES_EGL_image_external"; | |
5498 init.gl_version = "opengl es 2.0"; | |
5499 init.bind_generates_resource = true; | |
5500 InitDecoder(init); | |
5501 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); | |
5502 | |
5503 TextureRef* texture_ref = GetTexture(client_texture_id_); | |
5504 EXPECT_TRUE(texture_ref != NULL); | |
5505 Texture* texture = texture_ref->texture(); | |
5506 EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES); | |
5507 EXPECT_TRUE(texture->min_filter() == GL_LINEAR); | |
5508 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); | |
5509 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); | |
5510 } | |
5511 | |
5512 TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureParam) { | |
5513 InitState init; | |
5514 init.extensions = "GL_OES_EGL_image_external"; | |
5515 init.gl_version = "opengl es 2.0"; | |
5516 init.bind_generates_resource = true; | |
5517 InitDecoder(init); | |
5518 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); | |
5519 | |
5520 EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES, | |
5521 GL_TEXTURE_MIN_FILTER, | |
5522 GL_NEAREST)); | |
5523 EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES, | |
5524 GL_TEXTURE_MIN_FILTER, | |
5525 GL_LINEAR)); | |
5526 EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES, | |
5527 GL_TEXTURE_WRAP_S, | |
5528 GL_CLAMP_TO_EDGE)); | |
5529 EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES, | |
5530 GL_TEXTURE_WRAP_T, | |
5531 GL_CLAMP_TO_EDGE)); | |
5532 TexParameteri cmd; | |
5533 cmd.Init(GL_TEXTURE_EXTERNAL_OES, | |
5534 GL_TEXTURE_MIN_FILTER, | |
5535 GL_NEAREST); | |
5536 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5537 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5538 | |
5539 cmd.Init(GL_TEXTURE_EXTERNAL_OES, | |
5540 GL_TEXTURE_MIN_FILTER, | |
5541 GL_LINEAR); | |
5542 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5543 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5544 | |
5545 cmd.Init(GL_TEXTURE_EXTERNAL_OES, | |
5546 GL_TEXTURE_WRAP_S, | |
5547 GL_CLAMP_TO_EDGE); | |
5548 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5549 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5550 | |
5551 cmd.Init(GL_TEXTURE_EXTERNAL_OES, | |
5552 GL_TEXTURE_WRAP_T, | |
5553 GL_CLAMP_TO_EDGE); | |
5554 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5555 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5556 | |
5557 TextureRef* texture_ref = GetTexture(client_texture_id_); | |
5558 EXPECT_TRUE(texture_ref != NULL); | |
5559 Texture* texture = texture_ref->texture(); | |
5560 EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES); | |
5561 EXPECT_TRUE(texture->min_filter() == GL_LINEAR); | |
5562 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); | |
5563 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); | |
5564 } | |
5565 | |
5566 TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureParamInvalid) { | |
5567 InitState init; | |
5568 init.extensions = "GL_OES_EGL_image_external"; | |
5569 init.gl_version = "opengl es 2.0"; | |
5570 init.bind_generates_resource = true; | |
5571 InitDecoder(init); | |
5572 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); | |
5573 | |
5574 TexParameteri cmd; | |
5575 cmd.Init(GL_TEXTURE_EXTERNAL_OES, | |
5576 GL_TEXTURE_MIN_FILTER, | |
5577 GL_NEAREST_MIPMAP_NEAREST); | |
5578 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5579 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
5580 | |
5581 cmd.Init(GL_TEXTURE_EXTERNAL_OES, | |
5582 GL_TEXTURE_WRAP_S, | |
5583 GL_REPEAT); | |
5584 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5585 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
5586 | |
5587 cmd.Init(GL_TEXTURE_EXTERNAL_OES, | |
5588 GL_TEXTURE_WRAP_T, | |
5589 GL_REPEAT); | |
5590 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5591 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
5592 | |
5593 TextureRef* texture_ref = GetTexture(client_texture_id_); | |
5594 EXPECT_TRUE(texture_ref != NULL); | |
5595 Texture* texture = texture_ref->texture(); | |
5596 EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES); | |
5597 EXPECT_TRUE(texture->min_filter() == GL_LINEAR); | |
5598 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); | |
5599 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); | |
5600 } | |
5601 | |
5602 TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTexImage2DError) { | |
5603 InitState init; | |
5604 init.extensions = "GL_OES_EGL_image_external"; | |
5605 init.gl_version = "opengl es 2.0"; | |
5606 init.bind_generates_resource = true; | |
5607 InitDecoder(init); | |
5608 | |
5609 GLenum target = GL_TEXTURE_EXTERNAL_OES; | |
5610 GLint level = 0; | |
5611 GLenum internal_format = GL_RGBA; | |
5612 GLsizei width = 2; | |
5613 GLsizei height = 4; | |
5614 GLint border = 0; | |
5615 GLenum format = GL_RGBA; | |
5616 GLenum type = GL_UNSIGNED_BYTE; | |
5617 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); | |
5618 ASSERT_TRUE(GetTexture(client_texture_id_) != NULL); | |
5619 TexImage2D cmd; | |
5620 cmd.Init(target, level, internal_format, width, height, border, format, | |
5621 type, kSharedMemoryId, kSharedMemoryOffset); | |
5622 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5623 | |
5624 // TexImage2D is not allowed with GL_TEXTURE_EXTERNAL_OES targets. | |
5625 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
5626 } | |
5627 | |
5628 TEST_F(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) { | 515 TEST_F(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) { |
5629 InitState init; | 516 InitState init; |
5630 init.gl_version = "3.0"; | 517 init.gl_version = "3.0"; |
5631 InitDecoder(init); | 518 InitDecoder(init); |
5632 | 519 |
5633 BindTexture cmd1; | 520 BindTexture cmd1; |
5634 cmd1.Init(GL_TEXTURE_2D, kInvalidClientId); | 521 cmd1.Init(GL_TEXTURE_2D, kInvalidClientId); |
5635 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | 522 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); |
5636 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 523 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
5637 | 524 |
5638 BindBuffer cmd2; | 525 BindBuffer cmd2; |
5639 cmd2.Init(GL_ARRAY_BUFFER, kInvalidClientId); | 526 cmd2.Init(GL_ARRAY_BUFFER, kInvalidClientId); |
5640 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | 527 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); |
5641 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 528 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
5642 | 529 |
5643 BindFramebuffer cmd3; | 530 BindFramebuffer cmd3; |
5644 cmd3.Init(GL_FRAMEBUFFER, kInvalidClientId); | 531 cmd3.Init(GL_FRAMEBUFFER, kInvalidClientId); |
5645 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd3)); | 532 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd3)); |
5646 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 533 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
5647 | 534 |
5648 BindRenderbuffer cmd4; | 535 BindRenderbuffer cmd4; |
5649 cmd4.Init(GL_RENDERBUFFER, kInvalidClientId); | 536 cmd4.Init(GL_RENDERBUFFER, kInvalidClientId); |
5650 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd4)); | 537 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd4)); |
5651 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 538 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
5652 } | 539 } |
5653 | 540 |
5654 TEST_F(GLES2DecoderManualInitTest, DefaultTextureZero) { | |
5655 InitState init; | |
5656 init.gl_version = "3.0"; | |
5657 InitDecoder(init); | |
5658 | |
5659 BindTexture cmd1; | |
5660 cmd1.Init(GL_TEXTURE_2D, 0); | |
5661 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); | |
5662 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5663 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5664 | |
5665 BindTexture cmd2; | |
5666 cmd2.Init(GL_TEXTURE_CUBE_MAP, 0); | |
5667 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0)); | |
5668 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5669 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5670 } | |
5671 | |
5672 TEST_F(GLES2DecoderManualInitTest, DefaultTextureBGR) { | |
5673 InitState init; | |
5674 init.gl_version = "3.0"; | |
5675 init.bind_generates_resource = true; | |
5676 InitDecoder(init); | |
5677 | |
5678 BindTexture cmd1; | |
5679 cmd1.Init(GL_TEXTURE_2D, 0); | |
5680 EXPECT_CALL( | |
5681 *gl_, BindTexture(GL_TEXTURE_2D, TestHelper::kServiceDefaultTexture2dId)); | |
5682 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5683 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5684 | |
5685 BindTexture cmd2; | |
5686 cmd2.Init(GL_TEXTURE_CUBE_MAP, 0); | |
5687 EXPECT_CALL(*gl_, | |
5688 BindTexture(GL_TEXTURE_CUBE_MAP, | |
5689 TestHelper::kServiceDefaultTextureCubemapId)); | |
5690 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5691 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5692 } | |
5693 | |
5694 // Test that default texture 0 is immutable. | |
5695 TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameterf) { | |
5696 InitState init; | |
5697 init.gl_version = "3.0"; | |
5698 InitDecoder(init); | |
5699 | |
5700 { | |
5701 BindTexture cmd1; | |
5702 cmd1.Init(GL_TEXTURE_2D, 0); | |
5703 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); | |
5704 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5705 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5706 | |
5707 TexParameterf cmd2; | |
5708 cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
5709 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5710 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5711 } | |
5712 | |
5713 { | |
5714 BindTexture cmd1; | |
5715 cmd1.Init(GL_TEXTURE_CUBE_MAP, 0); | |
5716 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0)); | |
5717 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5718 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5719 | |
5720 TexParameterf cmd2; | |
5721 cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
5722 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5723 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5724 } | |
5725 } | |
5726 | |
5727 TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameteri) { | |
5728 InitState init; | |
5729 init.gl_version = "3.0"; | |
5730 InitDecoder(init); | |
5731 | |
5732 { | |
5733 BindTexture cmd1; | |
5734 cmd1.Init(GL_TEXTURE_2D, 0); | |
5735 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); | |
5736 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5737 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5738 | |
5739 TexParameteri cmd2; | |
5740 cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
5741 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5742 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5743 } | |
5744 | |
5745 { | |
5746 BindTexture cmd1; | |
5747 cmd1.Init(GL_TEXTURE_CUBE_MAP, 0); | |
5748 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0)); | |
5749 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5750 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5751 | |
5752 TexParameteri cmd2; | |
5753 cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
5754 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5755 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5756 } | |
5757 } | |
5758 | |
5759 TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameterfv) { | |
5760 InitState init; | |
5761 init.gl_version = "3.0"; | |
5762 InitDecoder(init); | |
5763 | |
5764 { | |
5765 BindTexture cmd1; | |
5766 cmd1.Init(GL_TEXTURE_2D, 0); | |
5767 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); | |
5768 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5769 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5770 | |
5771 TexParameterfv cmd2; | |
5772 cmd2.Init(GL_TEXTURE_2D, | |
5773 GL_TEXTURE_MAG_FILTER, | |
5774 shared_memory_id_, | |
5775 shared_memory_offset_); | |
5776 GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; | |
5777 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5778 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5779 } | |
5780 | |
5781 { | |
5782 BindTexture cmd1; | |
5783 cmd1.Init(GL_TEXTURE_CUBE_MAP, 0); | |
5784 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0)); | |
5785 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5786 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5787 | |
5788 TexParameterfv cmd2; | |
5789 cmd2.Init(GL_TEXTURE_CUBE_MAP, | |
5790 GL_TEXTURE_MAG_FILTER, | |
5791 shared_memory_id_, | |
5792 shared_memory_offset_); | |
5793 GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; | |
5794 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5795 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5796 } | |
5797 } | |
5798 | |
5799 TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameteriv) { | |
5800 InitState init; | |
5801 init.gl_version = "3.0"; | |
5802 InitDecoder(init); | |
5803 | |
5804 { | |
5805 BindTexture cmd1; | |
5806 cmd1.Init(GL_TEXTURE_2D, 0); | |
5807 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); | |
5808 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5809 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5810 | |
5811 TexParameteriv cmd2; | |
5812 cmd2.Init(GL_TEXTURE_2D, | |
5813 GL_TEXTURE_MAG_FILTER, | |
5814 shared_memory_id_, | |
5815 shared_memory_offset_); | |
5816 GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; | |
5817 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5818 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5819 } | |
5820 | |
5821 { | |
5822 BindTexture cmd1; | |
5823 cmd1.Init(GL_TEXTURE_CUBE_MAP, 0); | |
5824 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0)); | |
5825 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5826 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5827 | |
5828 TexParameteriv cmd2; | |
5829 cmd2.Init(GL_TEXTURE_CUBE_MAP, | |
5830 GL_TEXTURE_MAG_FILTER, | |
5831 shared_memory_id_, | |
5832 shared_memory_offset_); | |
5833 GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; | |
5834 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5835 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
5836 } | |
5837 } | |
5838 | |
5839 TEST_F(GLES2DecoderManualInitTest, NoDefaultTexImage2D) { | |
5840 InitState init; | |
5841 init.gl_version = "3.0"; | |
5842 InitDecoder(init); | |
5843 | |
5844 BindTexture cmd1; | |
5845 cmd1.Init(GL_TEXTURE_2D, 0); | |
5846 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); | |
5847 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5848 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5849 | |
5850 TexImage2D cmd2; | |
5851 cmd2.Init(GL_TEXTURE_2D, | |
5852 0, | |
5853 GL_RGBA, | |
5854 2, | |
5855 2, | |
5856 0, | |
5857 GL_RGBA, | |
5858 GL_UNSIGNED_BYTE, | |
5859 kSharedMemoryId, | |
5860 kSharedMemoryOffset); | |
5861 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5862 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5863 } | |
5864 | |
5865 TEST_F(GLES2DecoderManualInitTest, NoDefaultTexSubImage2D) { | |
5866 InitState init; | |
5867 init.gl_version = "3.0"; | |
5868 InitDecoder(init); | |
5869 | |
5870 BindTexture cmd1; | |
5871 cmd1.Init(GL_TEXTURE_2D, 0); | |
5872 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); | |
5873 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); | |
5874 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5875 | |
5876 TexSubImage2D cmd2; | |
5877 cmd2.Init(GL_TEXTURE_2D, | |
5878 0, | |
5879 1, | |
5880 1, | |
5881 1, | |
5882 1, | |
5883 GL_RGBA, | |
5884 GL_UNSIGNED_BYTE, | |
5885 kSharedMemoryId, | |
5886 kSharedMemoryOffset, | |
5887 GL_FALSE); | |
5888 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); | |
5889 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
5890 } | |
5891 | |
5892 TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleBindTexture) { | |
5893 InitState init; | |
5894 init.extensions = "GL_ARB_texture_rectangle"; | |
5895 init.gl_version = "3.0"; | |
5896 init.bind_generates_resource = true; | |
5897 InitDecoder(init); | |
5898 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_RECTANGLE_ARB, kNewServiceId)); | |
5899 EXPECT_CALL(*gl_, GenTextures(1, _)) | |
5900 .WillOnce(SetArgumentPointee<1>(kNewServiceId)); | |
5901 BindTexture cmd; | |
5902 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, kNewClientId); | |
5903 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5904 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5905 Texture* texture = GetTexture(kNewClientId)->texture(); | |
5906 EXPECT_TRUE(texture != NULL); | |
5907 EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); | |
5908 } | |
5909 | |
5910 TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleGetBinding) { | |
5911 InitState init; | |
5912 init.extensions = "GL_ARB_texture_rectangle"; | |
5913 init.gl_version = "3.0"; | |
5914 init.bind_generates_resource = true; | |
5915 InitDecoder(init); | |
5916 DoBindTexture( | |
5917 GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); | |
5918 | |
5919 EXPECT_CALL(*gl_, GetError()) | |
5920 .WillOnce(Return(GL_NO_ERROR)) | |
5921 .WillOnce(Return(GL_NO_ERROR)) | |
5922 .RetiresOnSaturation(); | |
5923 typedef GetIntegerv::Result Result; | |
5924 Result* result = static_cast<Result*>(shared_memory_address_); | |
5925 EXPECT_CALL(*gl_, GetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, | |
5926 result->GetData())) | |
5927 .Times(0); | |
5928 result->size = 0; | |
5929 GetIntegerv cmd; | |
5930 cmd.Init(GL_TEXTURE_BINDING_RECTANGLE_ARB, | |
5931 shared_memory_id_, | |
5932 shared_memory_offset_); | |
5933 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5934 EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( | |
5935 GL_TEXTURE_BINDING_RECTANGLE_ARB), result->GetNumResults()); | |
5936 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5937 EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]); | |
5938 } | |
5939 | |
5940 TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTextureDefaults) { | |
5941 InitState init; | |
5942 init.extensions = "GL_ARB_texture_rectangle"; | |
5943 init.gl_version = "3.0"; | |
5944 init.bind_generates_resource = true; | |
5945 InitDecoder(init); | |
5946 DoBindTexture( | |
5947 GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); | |
5948 | |
5949 Texture* texture = GetTexture(client_texture_id_)->texture(); | |
5950 EXPECT_TRUE(texture != NULL); | |
5951 EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); | |
5952 EXPECT_TRUE(texture->min_filter() == GL_LINEAR); | |
5953 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); | |
5954 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); | |
5955 } | |
5956 | |
5957 TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParam) { | |
5958 InitState init; | |
5959 init.extensions = "GL_ARB_texture_rectangle"; | |
5960 init.gl_version = "3.0"; | |
5961 init.bind_generates_resource = true; | |
5962 InitDecoder(init); | |
5963 | |
5964 DoBindTexture( | |
5965 GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); | |
5966 | |
5967 EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB, | |
5968 GL_TEXTURE_MIN_FILTER, | |
5969 GL_NEAREST)); | |
5970 EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB, | |
5971 GL_TEXTURE_MIN_FILTER, | |
5972 GL_LINEAR)); | |
5973 EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB, | |
5974 GL_TEXTURE_WRAP_S, | |
5975 GL_CLAMP_TO_EDGE)); | |
5976 EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB, | |
5977 GL_TEXTURE_WRAP_T, | |
5978 GL_CLAMP_TO_EDGE)); | |
5979 TexParameteri cmd; | |
5980 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, | |
5981 GL_TEXTURE_MIN_FILTER, | |
5982 GL_NEAREST); | |
5983 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5984 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5985 | |
5986 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, | |
5987 GL_TEXTURE_MIN_FILTER, | |
5988 GL_LINEAR); | |
5989 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5990 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5991 | |
5992 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, | |
5993 GL_TEXTURE_WRAP_S, | |
5994 GL_CLAMP_TO_EDGE); | |
5995 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
5996 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
5997 | |
5998 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, | |
5999 GL_TEXTURE_WRAP_T, | |
6000 GL_CLAMP_TO_EDGE); | |
6001 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6002 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6003 | |
6004 Texture* texture = GetTexture(client_texture_id_)->texture(); | |
6005 EXPECT_TRUE(texture != NULL); | |
6006 EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); | |
6007 EXPECT_TRUE(texture->min_filter() == GL_LINEAR); | |
6008 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); | |
6009 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); | |
6010 } | |
6011 | |
6012 TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParamInvalid) { | |
6013 InitState init; | |
6014 init.extensions = "GL_ARB_texture_rectangle"; | |
6015 init.gl_version = "3.0"; | |
6016 init.bind_generates_resource = true; | |
6017 InitDecoder(init); | |
6018 | |
6019 DoBindTexture( | |
6020 GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); | |
6021 | |
6022 TexParameteri cmd; | |
6023 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, | |
6024 GL_TEXTURE_MIN_FILTER, | |
6025 GL_NEAREST_MIPMAP_NEAREST); | |
6026 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6027 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
6028 | |
6029 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, | |
6030 GL_TEXTURE_WRAP_S, | |
6031 GL_REPEAT); | |
6032 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6033 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
6034 | |
6035 cmd.Init(GL_TEXTURE_RECTANGLE_ARB, | |
6036 GL_TEXTURE_WRAP_T, | |
6037 GL_REPEAT); | |
6038 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6039 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
6040 | |
6041 Texture* texture = GetTexture(client_texture_id_)->texture(); | |
6042 EXPECT_TRUE(texture != NULL); | |
6043 EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); | |
6044 EXPECT_TRUE(texture->min_filter() == GL_LINEAR); | |
6045 EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); | |
6046 EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); | |
6047 } | |
6048 | |
6049 TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTexImage2DError) { | |
6050 InitState init; | |
6051 init.extensions = "GL_ARB_texture_rectangle"; | |
6052 init.gl_version = "3.0"; | |
6053 init.bind_generates_resource = true; | |
6054 InitDecoder(init); | |
6055 | |
6056 GLenum target = GL_TEXTURE_RECTANGLE_ARB; | |
6057 GLint level = 0; | |
6058 GLenum internal_format = GL_RGBA; | |
6059 GLsizei width = 2; | |
6060 GLsizei height = 4; | |
6061 GLint border = 0; | |
6062 GLenum format = GL_RGBA; | |
6063 GLenum type = GL_UNSIGNED_BYTE; | |
6064 DoBindTexture( | |
6065 GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); | |
6066 ASSERT_TRUE(GetTexture(client_texture_id_) != NULL); | |
6067 TexImage2D cmd; | |
6068 cmd.Init(target, level, internal_format, width, height, border, format, | |
6069 type, kSharedMemoryId, kSharedMemoryOffset); | |
6070 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6071 | |
6072 // TexImage2D is not allowed with GL_TEXTURE_RECTANGLE_ARB targets. | |
6073 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
6074 } | |
6075 | |
6076 TEST_F(GLES2DecoderTest, EnableFeatureCHROMIUMBadBucket) { | 541 TEST_F(GLES2DecoderTest, EnableFeatureCHROMIUMBadBucket) { |
6077 const uint32 kBadBucketId = 123; | 542 const uint32 kBadBucketId = 123; |
6078 EnableFeatureCHROMIUM cmd; | 543 EnableFeatureCHROMIUM cmd; |
6079 cmd.Init(kBadBucketId, shared_memory_id_, shared_memory_offset_); | 544 cmd.Init(kBadBucketId, shared_memory_id_, shared_memory_offset_); |
6080 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 545 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
6081 } | 546 } |
6082 | 547 |
6083 TEST_F(GLES2DecoderTest, RequestExtensionCHROMIUMBadBucket) { | 548 TEST_F(GLES2DecoderTest, RequestExtensionCHROMIUMBadBucket) { |
6084 const uint32 kBadBucketId = 123; | 549 const uint32 kBadBucketId = 123; |
6085 RequestExtensionCHROMIUM cmd; | 550 RequestExtensionCHROMIUM cmd; |
6086 cmd.Init(kBadBucketId); | 551 cmd.Init(kBadBucketId); |
6087 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 552 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
6088 } | 553 } |
6089 | 554 |
6090 TEST_F(GLES2DecoderTest, TexSubImage2DClearsAfterTexImage2DNULL) { | |
6091 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
6092 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
6093 0, 0); | |
6094 SetupClearTextureExpectations( | |
6095 kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, | |
6096 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); | |
6097 EXPECT_CALL(*gl_, TexSubImage2D( | |
6098 GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6099 shared_memory_address_)) | |
6100 .Times(1) | |
6101 .RetiresOnSaturation(); | |
6102 TexSubImage2D cmd; | |
6103 cmd.Init( | |
6104 GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6105 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
6106 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6107 // Test if we call it again it does not clear. | |
6108 EXPECT_CALL(*gl_, TexSubImage2D( | |
6109 GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6110 shared_memory_address_)) | |
6111 .Times(1) | |
6112 .RetiresOnSaturation(); | |
6113 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6114 } | |
6115 | |
6116 TEST_F(GLES2DecoderTest, TexSubImage2DDoesNotClearAfterTexImage2DNULLThenData) { | |
6117 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
6118 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
6119 0, 0); | |
6120 DoTexImage2D( | |
6121 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
6122 kSharedMemoryId, kSharedMemoryOffset); | |
6123 EXPECT_CALL(*gl_, TexSubImage2D( | |
6124 GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6125 shared_memory_address_)) | |
6126 .Times(1) | |
6127 .RetiresOnSaturation(); | |
6128 TexSubImage2D cmd; | |
6129 cmd.Init( | |
6130 GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6131 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
6132 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6133 // Test if we call it again it does not clear. | |
6134 EXPECT_CALL(*gl_, TexSubImage2D( | |
6135 GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6136 shared_memory_address_)) | |
6137 .Times(1) | |
6138 .RetiresOnSaturation(); | |
6139 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6140 } | |
6141 | |
6142 TEST_F( | |
6143 GLES2DecoderManualInitTest, | |
6144 TexSubImage2DDoesNotClearAfterTexImage2DNULLThenDataWithTexImage2DIsFaster)
{ | |
6145 CommandLine command_line(0, NULL); | |
6146 command_line.AppendSwitchASCII( | |
6147 switches::kGpuDriverBugWorkarounds, | |
6148 base::IntToString(gpu::TEXSUBIMAGE2D_FASTER_THAN_TEXIMAGE2D)); | |
6149 InitState init; | |
6150 init.gl_version = "3.0"; | |
6151 init.bind_generates_resource = true; | |
6152 InitDecoderWithCommandLine(init, &command_line); | |
6153 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
6154 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
6155 0, 0); | |
6156 | |
6157 { | |
6158 // Uses texSubimage internally because the above workaround is active and | |
6159 // the update is for the full size of the texture. | |
6160 EXPECT_CALL(*gl_, | |
6161 TexSubImage2D( | |
6162 GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, _)) | |
6163 .Times(1) | |
6164 .RetiresOnSaturation(); | |
6165 cmds::TexImage2D cmd; | |
6166 cmd.Init(GL_TEXTURE_2D, | |
6167 0, | |
6168 GL_RGBA, | |
6169 2, | |
6170 2, | |
6171 0, | |
6172 GL_RGBA, | |
6173 GL_UNSIGNED_BYTE, | |
6174 kSharedMemoryId, | |
6175 kSharedMemoryOffset); | |
6176 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6177 } | |
6178 | |
6179 EXPECT_CALL(*gl_, TexSubImage2D( | |
6180 GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6181 shared_memory_address_)) | |
6182 .Times(1) | |
6183 .RetiresOnSaturation(); | |
6184 TexSubImage2D cmd; | |
6185 cmd.Init( | |
6186 GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6187 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
6188 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6189 // Test if we call it again it does not clear. | |
6190 EXPECT_CALL(*gl_, TexSubImage2D( | |
6191 GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6192 shared_memory_address_)) | |
6193 .Times(1) | |
6194 .RetiresOnSaturation(); | |
6195 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6196 } | |
6197 | |
6198 TEST_F(GLES2DecoderTest, TexSubImage2DClearsAfterTexImage2DWithDataThenNULL) { | |
6199 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
6200 // Put in data (so it should be marked as cleared) | |
6201 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
6202 kSharedMemoryId, kSharedMemoryOffset); | |
6203 // Put in no data. | |
6204 TexImage2D tex_cmd; | |
6205 tex_cmd.Init( | |
6206 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); | |
6207 // It won't actually call TexImage2D, just mark it as uncleared. | |
6208 EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd)); | |
6209 // Next call to TexSubImage2d should clear. | |
6210 SetupClearTextureExpectations( | |
6211 kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, | |
6212 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); | |
6213 EXPECT_CALL(*gl_, TexSubImage2D( | |
6214 GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6215 shared_memory_address_)) | |
6216 .Times(1) | |
6217 .RetiresOnSaturation(); | |
6218 TexSubImage2D cmd; | |
6219 cmd.Init( | |
6220 GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6221 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
6222 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6223 } | |
6224 | |
6225 TEST_F(GLES2DecoderWithShaderTest, DrawArraysClearsAfterTexImage2DNULL) { | |
6226 SetupAllNeededVertexBuffers(); | |
6227 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
6228 // Create an uncleared texture with 2 levels. | |
6229 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
6230 0, 0); | |
6231 DoTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
6232 0, 0); | |
6233 // Expect 2 levels will be cleared. | |
6234 SetupClearTextureExpectations( | |
6235 kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, | |
6236 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); | |
6237 SetupClearTextureExpectations( | |
6238 kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, | |
6239 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 1, 1); | |
6240 SetupExpectationsForApplyingDefaultDirtyState(); | |
6241 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
6242 .Times(1) | |
6243 .RetiresOnSaturation(); | |
6244 DrawArrays cmd; | |
6245 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
6246 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6247 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6248 | |
6249 // But not again | |
6250 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
6251 .Times(1) | |
6252 .RetiresOnSaturation(); | |
6253 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6254 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6255 } | |
6256 | |
6257 TEST_F(GLES2DecoderWithShaderTest, DrawElementsClearsAfterTexImage2DNULL) { | |
6258 SetupAllNeededVertexBuffers(); | |
6259 SetupIndexBuffer(); | |
6260 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
6261 // Create an uncleared texture with 2 levels. | |
6262 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
6263 0, 0); | |
6264 DoTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
6265 0, 0); | |
6266 // Expect 2 levels will be cleared. | |
6267 SetupClearTextureExpectations( | |
6268 kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, | |
6269 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); | |
6270 SetupClearTextureExpectations( | |
6271 kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, | |
6272 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 1, 1); | |
6273 SetupExpectationsForApplyingDefaultDirtyState(); | |
6274 | |
6275 EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount, | |
6276 GL_UNSIGNED_SHORT, | |
6277 BufferOffset(kValidIndexRangeStart * 2))) | |
6278 .Times(1) | |
6279 .RetiresOnSaturation(); | |
6280 DrawElements cmd; | |
6281 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
6282 kValidIndexRangeStart * 2); | |
6283 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6284 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6285 | |
6286 // But not again | |
6287 EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount, | |
6288 GL_UNSIGNED_SHORT, | |
6289 BufferOffset(kValidIndexRangeStart * 2))) | |
6290 .Times(1) | |
6291 .RetiresOnSaturation(); | |
6292 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6293 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6294 } | |
6295 | |
6296 TEST_F(GLES2DecoderWithShaderTest, DrawClearsAfterTexImage2DNULLInFBO) { | |
6297 const GLuint kFBOClientTextureId = 4100; | |
6298 const GLuint kFBOServiceTextureId = 4101; | |
6299 | |
6300 SetupAllNeededVertexBuffers(); | |
6301 // Register a texture id. | |
6302 EXPECT_CALL(*gl_, GenTextures(_, _)) | |
6303 .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) | |
6304 .RetiresOnSaturation(); | |
6305 GenHelper<GenTexturesImmediate>(kFBOClientTextureId); | |
6306 | |
6307 // Setup "render to" texture. | |
6308 DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); | |
6309 DoTexImage2D( | |
6310 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); | |
6311 DoBindFramebuffer( | |
6312 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
6313 DoFramebufferTexture2D( | |
6314 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
6315 kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); | |
6316 | |
6317 // Setup "render from" texture. | |
6318 SetupTexture(); | |
6319 | |
6320 SetupExpectationsForFramebufferClearing( | |
6321 GL_FRAMEBUFFER, // target | |
6322 GL_COLOR_BUFFER_BIT, // clear bits | |
6323 0, 0, 0, 0, // color | |
6324 0, // stencil | |
6325 1.0f, // depth | |
6326 false); // scissor test | |
6327 | |
6328 SetupExpectationsForApplyingDirtyState( | |
6329 false, // Framebuffer is RGB | |
6330 false, // Framebuffer has depth | |
6331 false, // Framebuffer has stencil | |
6332 0x1111, // color bits | |
6333 false, // depth mask | |
6334 false, // depth enabled | |
6335 0, // front stencil mask | |
6336 0, // back stencil mask | |
6337 false, // stencil enabled | |
6338 false, // cull_face_enabled | |
6339 false, // scissor_test_enabled | |
6340 false); // blend_enabled | |
6341 | |
6342 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
6343 .Times(1) | |
6344 .RetiresOnSaturation(); | |
6345 DrawArrays cmd; | |
6346 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
6347 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6348 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6349 | |
6350 // But not again. | |
6351 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
6352 .Times(1) | |
6353 .RetiresOnSaturation(); | |
6354 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6355 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6356 } | |
6357 | |
6358 TEST_F(GLES2DecoderWithShaderTest, DrawWitFBOThatCantClearDoesNotDraw) { | |
6359 const GLuint kFBOClientTextureId = 4100; | |
6360 const GLuint kFBOServiceTextureId = 4101; | |
6361 | |
6362 // Register a texture id. | |
6363 EXPECT_CALL(*gl_, GenTextures(_, _)) | |
6364 .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) | |
6365 .RetiresOnSaturation(); | |
6366 GenHelper<GenTexturesImmediate>(kFBOClientTextureId); | |
6367 | |
6368 // Setup "render to" texture. | |
6369 DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); | |
6370 DoTexImage2D( | |
6371 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); | |
6372 DoBindFramebuffer( | |
6373 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
6374 DoFramebufferTexture2D( | |
6375 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
6376 kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); | |
6377 | |
6378 // Setup "render from" texture. | |
6379 SetupTexture(); | |
6380 | |
6381 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) | |
6382 .WillOnce(Return(GL_FRAMEBUFFER_UNSUPPORTED)) | |
6383 .RetiresOnSaturation(); | |
6384 EXPECT_CALL(*gl_, DrawArrays(_, _, _)) | |
6385 .Times(0) | |
6386 .RetiresOnSaturation(); | |
6387 DrawArrays cmd; | |
6388 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
6389 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6390 EXPECT_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, GetGLError()); | |
6391 } | |
6392 | |
6393 TEST_F(GLES2DecoderTest, CopyTexImage2DMarksTextureAsCleared) { | |
6394 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
6395 | |
6396 TextureManager* manager = group().texture_manager(); | |
6397 TextureRef* texture_ref = manager->GetTexture(client_texture_id_); | |
6398 ASSERT_TRUE(texture_ref != NULL); | |
6399 Texture* texture = texture_ref->texture(); | |
6400 | |
6401 EXPECT_CALL(*gl_, GetError()) | |
6402 .WillOnce(Return(GL_NO_ERROR)) | |
6403 .RetiresOnSaturation(); | |
6404 EXPECT_CALL(*gl_, CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0)) | |
6405 .Times(1) | |
6406 .RetiresOnSaturation(); | |
6407 EXPECT_CALL(*gl_, GetError()) | |
6408 .WillOnce(Return(GL_NO_ERROR)) | |
6409 .RetiresOnSaturation(); | |
6410 CopyTexImage2D cmd; | |
6411 cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0); | |
6412 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6413 | |
6414 EXPECT_TRUE(texture->SafeToRenderFrom()); | |
6415 } | |
6416 | |
6417 TEST_F(GLES2DecoderTest, CopyTexSubImage2DClearsUnclearedTexture) { | |
6418 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
6419 DoTexImage2D( | |
6420 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); | |
6421 | |
6422 SetupClearTextureExpectations( | |
6423 kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, | |
6424 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); | |
6425 EXPECT_CALL(*gl_, CopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1)) | |
6426 .Times(1) | |
6427 .RetiresOnSaturation(); | |
6428 CopyTexSubImage2D cmd; | |
6429 cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1); | |
6430 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6431 } | |
6432 | |
6433 TEST_F(GLES2DecoderManualInitTest, CompressedImage2DMarksTextureAsCleared) { | |
6434 InitState init; | |
6435 init.extensions = "GL_EXT_texture_compression_s3tc"; | |
6436 init.gl_version = "3.0"; | |
6437 init.bind_generates_resource = true; | |
6438 InitDecoder(init); | |
6439 | |
6440 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
6441 EXPECT_CALL(*gl_, GetError()) | |
6442 .WillOnce(Return(GL_NO_ERROR)) | |
6443 .RetiresOnSaturation(); | |
6444 EXPECT_CALL(*gl_, CompressedTexImage2D( | |
6445 GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, 8, _)) | |
6446 .Times(1) | |
6447 .RetiresOnSaturation(); | |
6448 EXPECT_CALL(*gl_, GetError()) | |
6449 .WillOnce(Return(GL_NO_ERROR)) | |
6450 .RetiresOnSaturation(); | |
6451 CompressedTexImage2D cmd; | |
6452 cmd.Init(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, | |
6453 8, kSharedMemoryId, kSharedMemoryOffset); | |
6454 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6455 TextureManager* manager = group().texture_manager(); | |
6456 TextureRef* texture_ref = manager->GetTexture(client_texture_id_); | |
6457 EXPECT_TRUE(texture_ref->texture()->SafeToRenderFrom()); | |
6458 } | |
6459 | |
6460 TEST_F(GLES2DecoderWithShaderTest, UnClearedAttachmentsGetClearedOnClear) { | |
6461 const GLuint kFBOClientTextureId = 4100; | |
6462 const GLuint kFBOServiceTextureId = 4101; | |
6463 | |
6464 // Register a texture id. | |
6465 EXPECT_CALL(*gl_, GenTextures(_, _)) | |
6466 .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) | |
6467 .RetiresOnSaturation(); | |
6468 GenHelper<GenTexturesImmediate>(kFBOClientTextureId); | |
6469 | |
6470 // Setup "render to" texture. | |
6471 DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); | |
6472 DoTexImage2D( | |
6473 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); | |
6474 DoBindFramebuffer( | |
6475 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
6476 DoFramebufferTexture2D( | |
6477 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
6478 kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); | |
6479 | |
6480 // Setup "render from" texture. | |
6481 SetupTexture(); | |
6482 | |
6483 SetupExpectationsForFramebufferClearing( | |
6484 GL_FRAMEBUFFER, // target | |
6485 GL_COLOR_BUFFER_BIT, // clear bits | |
6486 0, 0, 0, 0, // color | |
6487 0, // stencil | |
6488 1.0f, // depth | |
6489 false); // scissor test | |
6490 SetupExpectationsForApplyingDirtyState( | |
6491 false, // Framebuffer is RGB | |
6492 false, // Framebuffer has depth | |
6493 false, // Framebuffer has stencil | |
6494 0x1111, // color bits | |
6495 false, // depth mask | |
6496 false, // depth enabled | |
6497 0, // front stencil mask | |
6498 0, // back stencil mask | |
6499 false, // stencil enabled | |
6500 false, // cull_face_enabled | |
6501 false, // scissor_test_enabled | |
6502 false); // blend_enabled | |
6503 | |
6504 EXPECT_CALL(*gl_, Clear(GL_COLOR_BUFFER_BIT)) | |
6505 .Times(1) | |
6506 .RetiresOnSaturation(); | |
6507 | |
6508 Clear cmd; | |
6509 cmd.Init(GL_COLOR_BUFFER_BIT); | |
6510 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6511 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6512 } | |
6513 | |
6514 TEST_F(GLES2DecoderWithShaderTest, UnClearedAttachmentsGetClearedOnReadPixels) { | |
6515 const GLuint kFBOClientTextureId = 4100; | |
6516 const GLuint kFBOServiceTextureId = 4101; | |
6517 | |
6518 // Register a texture id. | |
6519 EXPECT_CALL(*gl_, GenTextures(_, _)) | |
6520 .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) | |
6521 .RetiresOnSaturation(); | |
6522 GenHelper<GenTexturesImmediate>(kFBOClientTextureId); | |
6523 | |
6524 // Setup "render to" texture. | |
6525 DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); | |
6526 DoTexImage2D( | |
6527 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); | |
6528 DoBindFramebuffer( | |
6529 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
6530 DoFramebufferTexture2D( | |
6531 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
6532 kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); | |
6533 | |
6534 // Setup "render from" texture. | |
6535 SetupTexture(); | |
6536 | |
6537 SetupExpectationsForFramebufferClearing( | |
6538 GL_FRAMEBUFFER, // target | |
6539 GL_COLOR_BUFFER_BIT, // clear bits | |
6540 0, 0, 0, 0, // color | |
6541 0, // stencil | |
6542 1.0f, // depth | |
6543 false); // scissor test | |
6544 | |
6545 EXPECT_CALL(*gl_, GetError()) | |
6546 .WillOnce(Return(GL_NO_ERROR)) | |
6547 .WillOnce(Return(GL_NO_ERROR)) | |
6548 .RetiresOnSaturation(); | |
6549 EXPECT_CALL(*gl_, ReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, _)) | |
6550 .Times(1) | |
6551 .RetiresOnSaturation(); | |
6552 typedef ReadPixels::Result Result; | |
6553 Result* result = GetSharedMemoryAs<Result*>(); | |
6554 uint32 result_shm_id = kSharedMemoryId; | |
6555 uint32 result_shm_offset = kSharedMemoryOffset; | |
6556 uint32 pixels_shm_id = kSharedMemoryId; | |
6557 uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); | |
6558 ReadPixels cmd; | |
6559 cmd.Init(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6560 pixels_shm_id, pixels_shm_offset, | |
6561 result_shm_id, result_shm_offset, | |
6562 false); | |
6563 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6564 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6565 } | |
6566 | |
6567 TEST_F(GLES2DecoderManualInitTest, | |
6568 UnClearedAttachmentsGetClearedOnReadPixelsAndDrawBufferGetsRestored) { | |
6569 InitState init; | |
6570 init.extensions = "GL_EXT_framebuffer_multisample"; | |
6571 init.gl_version = "2.1"; | |
6572 init.bind_generates_resource = true; | |
6573 InitDecoder(init); | |
6574 const GLuint kFBOClientTextureId = 4100; | |
6575 const GLuint kFBOServiceTextureId = 4101; | |
6576 | |
6577 // Register a texture id. | |
6578 EXPECT_CALL(*gl_, GenTextures(_, _)) | |
6579 .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) | |
6580 .RetiresOnSaturation(); | |
6581 GenHelper<GenTexturesImmediate>(kFBOClientTextureId); | |
6582 | |
6583 // Setup "render from" texture. | |
6584 DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); | |
6585 DoTexImage2D( | |
6586 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); | |
6587 DoBindFramebuffer( | |
6588 GL_READ_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
6589 DoFramebufferTexture2D( | |
6590 GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
6591 kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); | |
6592 | |
6593 SetupExpectationsForFramebufferClearingMulti( | |
6594 kServiceFramebufferId, // read framebuffer service id | |
6595 0, // backbuffer service id | |
6596 GL_READ_FRAMEBUFFER, // target | |
6597 GL_COLOR_BUFFER_BIT, // clear bits | |
6598 0, 0, 0, 0, // color | |
6599 0, // stencil | |
6600 1.0f, // depth | |
6601 false); // scissor test | |
6602 | |
6603 EXPECT_CALL(*gl_, GetError()) | |
6604 .WillOnce(Return(GL_NO_ERROR)) | |
6605 .WillOnce(Return(GL_NO_ERROR)) | |
6606 .RetiresOnSaturation(); | |
6607 EXPECT_CALL(*gl_, ReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, _)) | |
6608 .Times(1) | |
6609 .RetiresOnSaturation(); | |
6610 typedef ReadPixels::Result Result; | |
6611 uint32 result_shm_id = kSharedMemoryId; | |
6612 uint32 result_shm_offset = kSharedMemoryOffset; | |
6613 uint32 pixels_shm_id = kSharedMemoryId; | |
6614 uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(Result); | |
6615 ReadPixels cmd; | |
6616 cmd.Init(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, | |
6617 pixels_shm_id, pixels_shm_offset, | |
6618 result_shm_id, result_shm_offset, | |
6619 false); | |
6620 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6621 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6622 } | |
6623 | |
6624 TEST_F(GLES2DecoderWithShaderTest, DrawClearsAfterRenderbufferStorageInFBO) { | |
6625 SetupTexture(); | |
6626 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
6627 kServiceRenderbufferId); | |
6628 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
6629 kServiceFramebufferId); | |
6630 DoRenderbufferStorage( | |
6631 GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 100, 50, GL_NO_ERROR); | |
6632 DoFramebufferRenderbuffer( | |
6633 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
6634 client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR); | |
6635 | |
6636 SetupExpectationsForFramebufferClearing( | |
6637 GL_FRAMEBUFFER, // target | |
6638 GL_COLOR_BUFFER_BIT, // clear bits | |
6639 0, 0, 0, 0, // color | |
6640 0, // stencil | |
6641 1.0f, // depth | |
6642 false); // scissor test | |
6643 | |
6644 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
6645 SetupExpectationsForApplyingDirtyState( | |
6646 false, // Framebuffer is RGB | |
6647 false, // Framebuffer has depth | |
6648 false, // Framebuffer has stencil | |
6649 0x1111, // color bits | |
6650 false, // depth mask | |
6651 false, // depth enabled | |
6652 0, // front stencil mask | |
6653 0, // back stencil mask | |
6654 false, // stencil enabled | |
6655 false, // cull_face_enabled | |
6656 false, // scissor_test_enabled | |
6657 false); // blend_enabled | |
6658 | |
6659 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
6660 .Times(1) | |
6661 .RetiresOnSaturation(); | |
6662 DrawArrays cmd; | |
6663 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
6664 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6665 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6666 } | |
6667 | |
6668 TEST_F(GLES2DecoderTest, DrawArraysClearsAfterTexImage2DNULLCubemap) { | |
6669 static const GLenum faces[] = { | |
6670 GL_TEXTURE_CUBE_MAP_POSITIVE_X, | |
6671 GL_TEXTURE_CUBE_MAP_NEGATIVE_X, | |
6672 GL_TEXTURE_CUBE_MAP_POSITIVE_Y, | |
6673 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, | |
6674 GL_TEXTURE_CUBE_MAP_POSITIVE_Z, | |
6675 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, | |
6676 }; | |
6677 SetupCubemapProgram(); | |
6678 DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId); | |
6679 // Fill out all the faces for 2 levels, leave 2 uncleared. | |
6680 for (int ii = 0; ii < 6; ++ii) { | |
6681 GLenum face = faces[ii]; | |
6682 int32 shm_id = | |
6683 (face == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) ? 0 : kSharedMemoryId; | |
6684 uint32 shm_offset = | |
6685 (face == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) ? 0 : kSharedMemoryOffset; | |
6686 DoTexImage2D(face, 0, GL_RGBA, 2, 2, 0, GL_RGBA, | |
6687 GL_UNSIGNED_BYTE, shm_id, shm_offset); | |
6688 DoTexImage2D(face, 1, GL_RGBA, 1, 1, 0, GL_RGBA, | |
6689 GL_UNSIGNED_BYTE, shm_id, shm_offset); | |
6690 } | |
6691 // Expect 2 levels will be cleared. | |
6692 SetupClearTextureExpectations( | |
6693 kServiceTextureId, kServiceTextureId, GL_TEXTURE_CUBE_MAP, | |
6694 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, | |
6695 2, 2); | |
6696 SetupClearTextureExpectations( | |
6697 kServiceTextureId, kServiceTextureId, GL_TEXTURE_CUBE_MAP, | |
6698 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, | |
6699 1, 1); | |
6700 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
6701 SetupExpectationsForApplyingDefaultDirtyState(); | |
6702 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
6703 .Times(1) | |
6704 .RetiresOnSaturation(); | |
6705 DrawArrays cmd; | |
6706 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
6707 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6708 } | |
6709 | |
6710 TEST_F(GLES2DecoderTest, TextureUsageAngleExtNotEnabledByDefault) { | |
6711 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
6712 | |
6713 TexParameteri cmd; | |
6714 cmd.Init(GL_TEXTURE_2D, | |
6715 GL_TEXTURE_USAGE_ANGLE, | |
6716 GL_FRAMEBUFFER_ATTACHMENT_ANGLE); | |
6717 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6718 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
6719 } | |
6720 | |
6721 TEST_F(GLES2DecoderWithShaderTest, | |
6722 DrawClearsAfterRenderbuffersWithMultipleAttachments) { | |
6723 const GLuint kFBOClientTextureId = 4100; | |
6724 const GLuint kFBOServiceTextureId = 4101; | |
6725 | |
6726 // Register a texture id. | |
6727 EXPECT_CALL(*gl_, GenTextures(_, _)) | |
6728 .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) | |
6729 .RetiresOnSaturation(); | |
6730 GenHelper<GenTexturesImmediate>(kFBOClientTextureId); | |
6731 | |
6732 // Setup "render to" texture. | |
6733 DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); | |
6734 DoTexImage2D( | |
6735 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); | |
6736 DoBindFramebuffer( | |
6737 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
6738 DoFramebufferTexture2D( | |
6739 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
6740 kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); | |
6741 | |
6742 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
6743 kServiceRenderbufferId); | |
6744 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
6745 kServiceFramebufferId); | |
6746 DoRenderbufferStorage( | |
6747 GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, | |
6748 1, 1, GL_NO_ERROR); | |
6749 DoFramebufferRenderbuffer( | |
6750 GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, | |
6751 client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR); | |
6752 | |
6753 SetupTexture(); | |
6754 SetupExpectationsForFramebufferClearing( | |
6755 GL_FRAMEBUFFER, // target | |
6756 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, // clear bits | |
6757 0, 0, 0, 0, // color | |
6758 0, // stencil | |
6759 1.0f, // depth | |
6760 false); // scissor test | |
6761 | |
6762 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
6763 SetupExpectationsForApplyingDirtyState( | |
6764 false, // Framebuffer is RGB | |
6765 true, // Framebuffer has depth | |
6766 false, // Framebuffer has stencil | |
6767 0x1111, // color bits | |
6768 true, // depth mask | |
6769 false, // depth enabled | |
6770 0, // front stencil mask | |
6771 0, // back stencil mask | |
6772 false, // stencil enabled | |
6773 false, // cull_face_enabled | |
6774 false, // scissor_test_enabled | |
6775 false); // blend_enabled | |
6776 | |
6777 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
6778 .Times(1) | |
6779 .RetiresOnSaturation(); | |
6780 DrawArrays cmd; | |
6781 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
6782 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6783 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
6784 } | |
6785 | |
6786 TEST_F(GLES2DecoderWithShaderTest, CopyTexImageWithInCompleteFBOFails) { | |
6787 GLenum target = GL_TEXTURE_2D; | |
6788 GLint level = 0; | |
6789 GLenum internal_format = GL_RGBA; | |
6790 GLsizei width = 2; | |
6791 GLsizei height = 4; | |
6792 GLint border = 0; | |
6793 SetupTexture(); | |
6794 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
6795 kServiceRenderbufferId); | |
6796 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
6797 kServiceFramebufferId); | |
6798 DoRenderbufferStorage( | |
6799 GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 0, 0, GL_NO_ERROR); | |
6800 DoFramebufferRenderbuffer( | |
6801 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
6802 client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR); | |
6803 | |
6804 EXPECT_CALL(*gl_, CopyTexImage2D(_, _, _, _, _, _, _, _)) | |
6805 .Times(0) | |
6806 .RetiresOnSaturation(); | |
6807 CopyTexImage2D cmd; | |
6808 cmd.Init(target, level, internal_format, 0, 0, width, height, border); | |
6809 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6810 EXPECT_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, GetGLError()); | |
6811 } | |
6812 | |
6813 void GLES2DecoderWithShaderTest::CheckRenderbufferChangesMarkFBOAsNotComplete( | |
6814 bool bound_fbo) { | |
6815 FramebufferManager* framebuffer_manager = group().framebuffer_manager(); | |
6816 SetupTexture(); | |
6817 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
6818 kServiceRenderbufferId); | |
6819 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
6820 kServiceFramebufferId); | |
6821 DoRenderbufferStorage( | |
6822 GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 1, 1, GL_NO_ERROR); | |
6823 DoFramebufferRenderbuffer( | |
6824 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
6825 client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR); | |
6826 | |
6827 | |
6828 if (!bound_fbo) { | |
6829 DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); | |
6830 } | |
6831 | |
6832 Framebuffer* framebuffer = | |
6833 framebuffer_manager->GetFramebuffer(client_framebuffer_id_); | |
6834 ASSERT_TRUE(framebuffer != NULL); | |
6835 framebuffer_manager->MarkAsComplete(framebuffer); | |
6836 EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); | |
6837 | |
6838 // Test that renderbufferStorage marks fbo as not complete. | |
6839 DoRenderbufferStorage( | |
6840 GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 1, 1, GL_NO_ERROR); | |
6841 EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); | |
6842 framebuffer_manager->MarkAsComplete(framebuffer); | |
6843 EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); | |
6844 | |
6845 // Test deleting renderbuffer marks fbo as not complete. | |
6846 DoDeleteRenderbuffer(client_renderbuffer_id_, kServiceRenderbufferId); | |
6847 if (bound_fbo) { | |
6848 EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); | |
6849 } else { | |
6850 EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); | |
6851 } | |
6852 // Cleanup | |
6853 DoDeleteFramebuffer( | |
6854 client_framebuffer_id_, kServiceFramebufferId, | |
6855 bound_fbo, GL_FRAMEBUFFER, 0, | |
6856 bound_fbo, GL_FRAMEBUFFER, 0); | |
6857 } | |
6858 | |
6859 TEST_F(GLES2DecoderWithShaderTest, | |
6860 RenderbufferChangesMarkFBOAsNotCompleteBoundFBO) { | |
6861 CheckRenderbufferChangesMarkFBOAsNotComplete(true); | |
6862 } | |
6863 | |
6864 TEST_F(GLES2DecoderWithShaderTest, | |
6865 RenderbufferChangesMarkFBOAsNotCompleteUnboundFBO) { | |
6866 CheckRenderbufferChangesMarkFBOAsNotComplete(false); | |
6867 } | |
6868 | |
6869 void GLES2DecoderWithShaderTest::CheckTextureChangesMarkFBOAsNotComplete( | |
6870 bool bound_fbo) { | |
6871 FramebufferManager* framebuffer_manager = group().framebuffer_manager(); | |
6872 const GLuint kFBOClientTextureId = 4100; | |
6873 const GLuint kFBOServiceTextureId = 4101; | |
6874 | |
6875 // Register a texture id. | |
6876 EXPECT_CALL(*gl_, GenTextures(_, _)) | |
6877 .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) | |
6878 .RetiresOnSaturation(); | |
6879 GenHelper<GenTexturesImmediate>(kFBOClientTextureId); | |
6880 | |
6881 SetupTexture(); | |
6882 | |
6883 // Setup "render to" texture. | |
6884 DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); | |
6885 DoTexImage2D( | |
6886 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); | |
6887 DoBindFramebuffer( | |
6888 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
6889 DoFramebufferTexture2D( | |
6890 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
6891 kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); | |
6892 | |
6893 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | |
6894 kServiceRenderbufferId); | |
6895 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
6896 kServiceFramebufferId); | |
6897 DoRenderbufferStorage( | |
6898 GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, | |
6899 1, 1, GL_NO_ERROR); | |
6900 DoFramebufferRenderbuffer( | |
6901 GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, | |
6902 client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR); | |
6903 | |
6904 if (!bound_fbo) { | |
6905 DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); | |
6906 } | |
6907 | |
6908 Framebuffer* framebuffer = | |
6909 framebuffer_manager->GetFramebuffer(client_framebuffer_id_); | |
6910 ASSERT_TRUE(framebuffer != NULL); | |
6911 framebuffer_manager->MarkAsComplete(framebuffer); | |
6912 EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); | |
6913 | |
6914 // Test TexImage2D marks fbo as not complete. | |
6915 DoTexImage2D( | |
6916 GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0, 0); | |
6917 EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); | |
6918 framebuffer_manager->MarkAsComplete(framebuffer); | |
6919 EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); | |
6920 | |
6921 // Test CopyImage2D marks fbo as not complete. | |
6922 EXPECT_CALL(*gl_, GetError()) | |
6923 .WillOnce(Return(GL_NO_ERROR)) | |
6924 .RetiresOnSaturation(); | |
6925 EXPECT_CALL(*gl_, CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, 1, 0)) | |
6926 .Times(1) | |
6927 .RetiresOnSaturation(); | |
6928 EXPECT_CALL(*gl_, GetError()) | |
6929 .WillOnce(Return(GL_NO_ERROR)) | |
6930 .RetiresOnSaturation(); | |
6931 CopyTexImage2D cmd; | |
6932 cmd.Init(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, 1, 0); | |
6933 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
6934 EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); | |
6935 | |
6936 // Test deleting texture marks fbo as not complete. | |
6937 framebuffer_manager->MarkAsComplete(framebuffer); | |
6938 EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); | |
6939 DoDeleteTexture(kFBOClientTextureId, kFBOServiceTextureId); | |
6940 | |
6941 if (bound_fbo) { | |
6942 EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); | |
6943 } else { | |
6944 EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); | |
6945 } | |
6946 // Cleanup | |
6947 DoDeleteFramebuffer( | |
6948 client_framebuffer_id_, kServiceFramebufferId, | |
6949 bound_fbo, GL_FRAMEBUFFER, 0, | |
6950 bound_fbo, GL_FRAMEBUFFER, 0); | |
6951 } | |
6952 | |
6953 TEST_F(GLES2DecoderWithShaderTest, TextureChangesMarkFBOAsNotCompleteBoundFBO) { | |
6954 CheckTextureChangesMarkFBOAsNotComplete(true); | |
6955 } | |
6956 | |
6957 TEST_F(GLES2DecoderWithShaderTest, | |
6958 TextureChangesMarkFBOAsNotCompleteUnboundFBO) { | |
6959 CheckTextureChangesMarkFBOAsNotComplete(false); | |
6960 } | |
6961 | |
6962 TEST_F(GLES2DecoderWithShaderTest, | |
6963 DrawingWithFBOTwiceChecksForFBOCompleteOnce) { | |
6964 const GLuint kFBOClientTextureId = 4100; | |
6965 const GLuint kFBOServiceTextureId = 4101; | |
6966 | |
6967 SetupAllNeededVertexBuffers(); | |
6968 | |
6969 // Register a texture id. | |
6970 EXPECT_CALL(*gl_, GenTextures(_, _)) | |
6971 .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) | |
6972 .RetiresOnSaturation(); | |
6973 GenHelper<GenTexturesImmediate>(kFBOClientTextureId); | |
6974 | |
6975 // Setup "render to" texture that is cleared. | |
6976 DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); | |
6977 DoTexImage2D( | |
6978 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
6979 kSharedMemoryId, kSharedMemoryOffset); | |
6980 DoBindFramebuffer( | |
6981 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
6982 DoFramebufferTexture2D( | |
6983 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
6984 kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); | |
6985 | |
6986 // Setup "render from" texture. | |
6987 SetupTexture(); | |
6988 | |
6989 // Make sure we check for framebuffer complete. | |
6990 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) | |
6991 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) | |
6992 .RetiresOnSaturation(); | |
6993 | |
6994 SetupExpectationsForApplyingDirtyState( | |
6995 false, // Framebuffer is RGB | |
6996 false, // Framebuffer has depth | |
6997 false, // Framebuffer has stencil | |
6998 0x1111, // color bits | |
6999 false, // depth mask | |
7000 false, // depth enabled | |
7001 0, // front stencil mask | |
7002 0, // back stencil mask | |
7003 false, // stencil enabled | |
7004 false, // cull_face_enabled | |
7005 false, // scissor_test_enabled | |
7006 false); // blend_enabled | |
7007 | |
7008 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
7009 .Times(1) | |
7010 .RetiresOnSaturation(); | |
7011 DrawArrays cmd; | |
7012 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
7013 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7014 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7015 | |
7016 // But not again. | |
7017 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
7018 .Times(1) | |
7019 .RetiresOnSaturation(); | |
7020 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7021 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7022 } | |
7023 | |
7024 TEST_F(GLES2DecoderTest, BeginQueryEXTDisabled) { | 555 TEST_F(GLES2DecoderTest, BeginQueryEXTDisabled) { |
7025 // Test something fails if off. | 556 // Test something fails if off. |
7026 } | 557 } |
7027 | 558 |
7028 TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXT) { | 559 TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXT) { |
7029 InitState init; | 560 InitState init; |
7030 init.extensions = "GL_EXT_occlusion_query_boolean"; | 561 init.extensions = "GL_EXT_occlusion_query_boolean"; |
7031 init.gl_version = "opengl es 2.0"; | 562 init.gl_version = "opengl es 2.0"; |
7032 init.has_alpha = true; | 563 init.has_alpha = true; |
7033 init.request_alpha = true; | 564 init.request_alpha = true; |
(...skipping 11 matching lines...) Expand all Loading... |
7045 // Test id = 0 fails. | 576 // Test id = 0 fails. |
7046 begin_cmd.Init( | 577 begin_cmd.Init( |
7047 GL_ANY_SAMPLES_PASSED_EXT, 0, kSharedMemoryId, kSharedMemoryOffset); | 578 GL_ANY_SAMPLES_PASSED_EXT, 0, kSharedMemoryId, kSharedMemoryOffset); |
7048 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); | 579 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); |
7049 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 580 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
7050 | 581 |
7051 GenHelper<GenQueriesEXTImmediate>(kNewClientId); | 582 GenHelper<GenQueriesEXTImmediate>(kNewClientId); |
7052 | 583 |
7053 // Test valid parameters work. | 584 // Test valid parameters work. |
7054 EXPECT_CALL(*gl_, GenQueriesARB(1, _)) | 585 EXPECT_CALL(*gl_, GenQueriesARB(1, _)) |
7055 .WillOnce(SetArgumentPointee<1>(kNewServiceId)) | 586 .WillOnce(SetArgumentPointee<1>(kNewServiceId)) |
7056 .RetiresOnSaturation(); | 587 .RetiresOnSaturation(); |
7057 EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kNewServiceId)) | 588 EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kNewServiceId)) |
7058 .Times(1) | 589 .Times(1) |
7059 .RetiresOnSaturation(); | 590 .RetiresOnSaturation(); |
7060 | 591 |
7061 // Query object should not be created untill BeginQueriesEXT. | 592 // Query object should not be created untill BeginQueriesEXT. |
7062 QueryManager* query_manager = decoder_->GetQueryManager(); | 593 QueryManager* query_manager = decoder_->GetQueryManager(); |
7063 ASSERT_TRUE(query_manager != NULL); | 594 ASSERT_TRUE(query_manager != NULL); |
7064 QueryManager::Query* query = query_manager->GetQuery(kNewClientId); | 595 QueryManager::Query* query = query_manager->GetQuery(kNewClientId); |
7065 EXPECT_TRUE(query == NULL); | 596 EXPECT_TRUE(query == NULL); |
7066 | 597 |
7067 // BeginQueryEXT should fail if id is not generated from GenQueriesEXT. | 598 // BeginQueryEXT should fail if id is not generated from GenQueriesEXT. |
7068 begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, | 599 begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, |
7069 kInvalidClientId, | 600 kInvalidClientId, |
7070 kSharedMemoryId, | 601 kSharedMemoryId, |
7071 kSharedMemoryOffset); | 602 kSharedMemoryOffset); |
7072 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); | 603 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); |
7073 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 604 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
7074 | 605 |
7075 begin_cmd.Init( | 606 begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, |
7076 GL_ANY_SAMPLES_PASSED_EXT, kNewClientId, | 607 kNewClientId, |
7077 kSharedMemoryId, kSharedMemoryOffset); | 608 kSharedMemoryId, |
| 609 kSharedMemoryOffset); |
7078 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); | 610 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); |
7079 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 611 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
7080 | 612 |
7081 // After BeginQueriesEXT id name should have query object associated with it. | 613 // After BeginQueriesEXT id name should have query object associated with it. |
7082 query = query_manager->GetQuery(kNewClientId); | 614 query = query_manager->GetQuery(kNewClientId); |
7083 ASSERT_TRUE(query != NULL); | 615 ASSERT_TRUE(query != NULL); |
7084 EXPECT_FALSE(query->pending()); | 616 EXPECT_FALSE(query->pending()); |
7085 | 617 |
7086 // Test trying begin again fails | 618 // Test trying begin again fails |
7087 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); | 619 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); |
7088 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 620 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
7089 | 621 |
7090 // Test end fails with different target | 622 // Test end fails with different target |
7091 end_cmd.Init(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, 1); | 623 end_cmd.Init(GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, 1); |
7092 EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); | 624 EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); |
7093 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 625 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
7094 | 626 |
7095 // Test end succeeds | 627 // Test end succeeds |
7096 EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT)) | 628 EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT)) |
7097 .Times(1) | 629 .Times(1) |
7098 .RetiresOnSaturation(); | 630 .RetiresOnSaturation(); |
7099 end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1); | 631 end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1); |
7100 EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); | 632 EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); |
7101 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 633 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
7102 EXPECT_TRUE(query->pending()); | 634 EXPECT_TRUE(query->pending()); |
7103 | 635 |
7104 EXPECT_CALL(*gl_, DeleteQueriesARB(1, _)) | 636 EXPECT_CALL(*gl_, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation(); |
7105 .Times(1) | |
7106 .RetiresOnSaturation(); | |
7107 } | 637 } |
7108 | 638 |
7109 struct QueryType { | 639 struct QueryType { |
7110 GLenum type; | 640 GLenum type; |
7111 bool is_gl; | 641 bool is_gl; |
7112 }; | 642 }; |
7113 | 643 |
7114 const QueryType kQueryTypes[] = { | 644 const QueryType kQueryTypes[] = { |
7115 { GL_COMMANDS_ISSUED_CHROMIUM, false }, | 645 {GL_COMMANDS_ISSUED_CHROMIUM, false}, |
7116 { GL_LATENCY_QUERY_CHROMIUM, false }, | 646 {GL_LATENCY_QUERY_CHROMIUM, false}, |
7117 { GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, false }, | 647 {GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, false}, |
7118 { GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, false }, | 648 {GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, false}, |
7119 { GL_GET_ERROR_QUERY_CHROMIUM, false }, | 649 {GL_GET_ERROR_QUERY_CHROMIUM, false}, |
7120 { GL_COMMANDS_COMPLETED_CHROMIUM, false }, | 650 {GL_COMMANDS_COMPLETED_CHROMIUM, false}, |
7121 { GL_ANY_SAMPLES_PASSED_EXT, true }, | 651 {GL_ANY_SAMPLES_PASSED_EXT, true}, |
7122 }; | 652 }; |
7123 | 653 |
7124 static void CheckBeginEndQueryBadMemoryFails( | 654 static void CheckBeginEndQueryBadMemoryFails(GLES2DecoderTestBase* test, |
7125 GLES2DecoderTestBase* test, | 655 GLuint client_id, |
7126 GLuint client_id, | 656 GLuint service_id, |
7127 GLuint service_id, | 657 const QueryType& query_type, |
7128 const QueryType& query_type, | 658 int32 shm_id, |
7129 int32 shm_id, | 659 uint32 shm_offset) { |
7130 uint32 shm_offset) { | |
7131 // We need to reset the decoder on each iteration, because we lose the | 660 // We need to reset the decoder on each iteration, because we lose the |
7132 // context every time. | 661 // context every time. |
7133 GLES2DecoderTestBase::InitState init; | 662 GLES2DecoderTestBase::InitState init; |
7134 init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync"; | 663 init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync"; |
7135 init.gl_version = "opengl es 2.0"; | 664 init.gl_version = "opengl es 2.0"; |
7136 init.has_alpha = true; | 665 init.has_alpha = true; |
7137 init.request_alpha = true; | 666 init.request_alpha = true; |
7138 init.bind_generates_resource = true; | 667 init.bind_generates_resource = true; |
7139 test->InitDecoder(init); | 668 test->InitDecoder(init); |
7140 ::testing::StrictMock< ::gfx::MockGLInterface>* gl = test->GetGLMock(); | 669 ::testing::StrictMock< ::gfx::MockGLInterface>* gl = test->GetGLMock(); |
7141 | 670 |
7142 BeginQueryEXT begin_cmd; | 671 BeginQueryEXT begin_cmd; |
7143 | 672 |
7144 test->GenHelper<GenQueriesEXTImmediate>(client_id); | 673 test->GenHelper<GenQueriesEXTImmediate>(client_id); |
7145 | 674 |
7146 if (query_type.is_gl) { | 675 if (query_type.is_gl) { |
7147 EXPECT_CALL(*gl, GenQueriesARB(1, _)) | 676 EXPECT_CALL(*gl, GenQueriesARB(1, _)) |
7148 .WillOnce(SetArgumentPointee<1>(service_id)) | 677 .WillOnce(SetArgumentPointee<1>(service_id)) |
7149 .RetiresOnSaturation(); | 678 .RetiresOnSaturation(); |
7150 EXPECT_CALL(*gl, BeginQueryARB(query_type.type, service_id)) | 679 EXPECT_CALL(*gl, BeginQueryARB(query_type.type, service_id)) |
7151 .Times(1) | 680 .Times(1) |
7152 .RetiresOnSaturation(); | 681 .RetiresOnSaturation(); |
7153 } | 682 } |
7154 | 683 |
7155 // Test bad shared memory fails | 684 // Test bad shared memory fails |
7156 begin_cmd.Init(query_type.type, client_id, shm_id, shm_offset); | 685 begin_cmd.Init(query_type.type, client_id, shm_id, shm_offset); |
7157 error::Error error1 = test->ExecuteCmd(begin_cmd); | 686 error::Error error1 = test->ExecuteCmd(begin_cmd); |
7158 | 687 |
7159 if (query_type.is_gl) { | 688 if (query_type.is_gl) { |
(...skipping 12 matching lines...) Expand all Loading... |
7172 EXPECT_CALL(*gl, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)) | 701 EXPECT_CALL(*gl, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)) |
7173 .WillOnce(Return(kGlSync)) | 702 .WillOnce(Return(kGlSync)) |
7174 .RetiresOnSaturation(); | 703 .RetiresOnSaturation(); |
7175 } | 704 } |
7176 | 705 |
7177 EndQueryEXT end_cmd; | 706 EndQueryEXT end_cmd; |
7178 end_cmd.Init(query_type.type, 1); | 707 end_cmd.Init(query_type.type, 1); |
7179 error::Error error2 = test->ExecuteCmd(end_cmd); | 708 error::Error error2 = test->ExecuteCmd(end_cmd); |
7180 | 709 |
7181 if (query_type.is_gl) { | 710 if (query_type.is_gl) { |
7182 EXPECT_CALL(*gl, | 711 EXPECT_CALL( |
7183 GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) | 712 *gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) |
7184 .WillOnce(SetArgumentPointee<2>(1)) | 713 .WillOnce(SetArgumentPointee<2>(1)) |
7185 .RetiresOnSaturation(); | 714 .RetiresOnSaturation(); |
7186 EXPECT_CALL(*gl, | 715 EXPECT_CALL(*gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_EXT, _)) |
7187 GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_EXT, _)) | |
7188 .WillOnce(SetArgumentPointee<2>(1)) | 716 .WillOnce(SetArgumentPointee<2>(1)) |
7189 .RetiresOnSaturation(); | 717 .RetiresOnSaturation(); |
7190 } | 718 } |
7191 if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) { | 719 if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) { |
7192 EXPECT_CALL(*gl, ClientWaitSync(kGlSync, _, _)) | 720 EXPECT_CALL(*gl, ClientWaitSync(kGlSync, _, _)) |
7193 .WillOnce(Return(GL_ALREADY_SIGNALED)) | 721 .WillOnce(Return(GL_ALREADY_SIGNALED)) |
7194 .RetiresOnSaturation(); | 722 .RetiresOnSaturation(); |
7195 } | 723 } |
7196 | 724 |
7197 QueryManager* query_manager = test->GetDecoder()->GetQueryManager(); | 725 QueryManager* query_manager = test->GetDecoder()->GetQueryManager(); |
7198 ASSERT_TRUE(query_manager != NULL); | 726 ASSERT_TRUE(query_manager != NULL); |
7199 bool process_success = query_manager->ProcessPendingQueries(); | 727 bool process_success = query_manager->ProcessPendingQueries(); |
7200 | 728 |
7201 EXPECT_TRUE(error1 != error::kNoError || | 729 EXPECT_TRUE(error1 != error::kNoError || error2 != error::kNoError || |
7202 error2 != error::kNoError || | |
7203 !process_success); | 730 !process_success); |
7204 | 731 |
7205 if (query_type.is_gl) { | 732 if (query_type.is_gl) { |
7206 EXPECT_CALL(*gl, DeleteQueriesARB(1, _)) | 733 EXPECT_CALL(*gl, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation(); |
7207 .Times(1) | |
7208 .RetiresOnSaturation(); | |
7209 } | 734 } |
7210 if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) | 735 if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) |
7211 EXPECT_CALL(*gl, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); | 736 EXPECT_CALL(*gl, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); |
7212 test->ResetDecoder(); | 737 test->ResetDecoder(); |
7213 } | 738 } |
7214 | 739 |
7215 TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryIdFails) { | 740 TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryIdFails) { |
7216 for (size_t i = 0; i < arraysize(kQueryTypes); ++i) { | 741 for (size_t i = 0; i < arraysize(kQueryTypes); ++i) { |
7217 CheckBeginEndQueryBadMemoryFails( | 742 CheckBeginEndQueryBadMemoryFails(this, |
7218 this, kNewClientId, kNewServiceId, | 743 kNewClientId, |
7219 kQueryTypes[i], | 744 kNewServiceId, |
7220 kInvalidSharedMemoryId, kSharedMemoryOffset); | 745 kQueryTypes[i], |
| 746 kInvalidSharedMemoryId, |
| 747 kSharedMemoryOffset); |
7221 } | 748 } |
7222 } | 749 } |
7223 | 750 |
7224 TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryOffsetFails) { | 751 TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryOffsetFails) { |
7225 for (size_t i = 0; i < arraysize(kQueryTypes); ++i) { | 752 for (size_t i = 0; i < arraysize(kQueryTypes); ++i) { |
7226 // Out-of-bounds. | 753 // Out-of-bounds. |
7227 CheckBeginEndQueryBadMemoryFails( | 754 CheckBeginEndQueryBadMemoryFails(this, |
7228 this, kNewClientId, kNewServiceId, | 755 kNewClientId, |
7229 kQueryTypes[i], | 756 kNewServiceId, |
7230 kSharedMemoryId, kInvalidSharedMemoryOffset); | 757 kQueryTypes[i], |
| 758 kSharedMemoryId, |
| 759 kInvalidSharedMemoryOffset); |
7231 // Overflow. | 760 // Overflow. |
7232 CheckBeginEndQueryBadMemoryFails( | 761 CheckBeginEndQueryBadMemoryFails(this, |
7233 this, kNewClientId, kNewServiceId, | 762 kNewClientId, |
7234 kQueryTypes[i], | 763 kNewServiceId, |
7235 kSharedMemoryId, 0xfffffffcu); | 764 kQueryTypes[i], |
| 765 kSharedMemoryId, |
| 766 0xfffffffcu); |
7236 } | 767 } |
7237 } | 768 } |
7238 | 769 |
7239 TEST_F(GLES2DecoderTest, BeginEndQueryEXTCommandsIssuedCHROMIUM) { | 770 TEST_F(GLES2DecoderTest, BeginEndQueryEXTCommandsIssuedCHROMIUM) { |
7240 BeginQueryEXT begin_cmd; | 771 BeginQueryEXT begin_cmd; |
7241 | 772 |
7242 GenHelper<GenQueriesEXTImmediate>(kNewClientId); | 773 GenHelper<GenQueriesEXTImmediate>(kNewClientId); |
7243 | 774 |
7244 // Test valid parameters work. | 775 // Test valid parameters work. |
7245 begin_cmd.Init( | 776 begin_cmd.Init(GL_COMMANDS_ISSUED_CHROMIUM, |
7246 GL_COMMANDS_ISSUED_CHROMIUM, kNewClientId, | 777 kNewClientId, |
7247 kSharedMemoryId, kSharedMemoryOffset); | 778 kSharedMemoryId, |
| 779 kSharedMemoryOffset); |
7248 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); | 780 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); |
7249 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 781 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
7250 | 782 |
7251 QueryManager* query_manager = decoder_->GetQueryManager(); | 783 QueryManager* query_manager = decoder_->GetQueryManager(); |
7252 ASSERT_TRUE(query_manager != NULL); | 784 ASSERT_TRUE(query_manager != NULL); |
7253 QueryManager::Query* query = query_manager->GetQuery(kNewClientId); | 785 QueryManager::Query* query = query_manager->GetQuery(kNewClientId); |
7254 ASSERT_TRUE(query != NULL); | 786 ASSERT_TRUE(query != NULL); |
7255 EXPECT_FALSE(query->pending()); | 787 EXPECT_FALSE(query->pending()); |
7256 | 788 |
7257 // Test end succeeds | 789 // Test end succeeds |
7258 EndQueryEXT end_cmd; | 790 EndQueryEXT end_cmd; |
7259 end_cmd.Init(GL_COMMANDS_ISSUED_CHROMIUM, 1); | 791 end_cmd.Init(GL_COMMANDS_ISSUED_CHROMIUM, 1); |
7260 EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); | 792 EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); |
7261 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 793 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
7262 EXPECT_FALSE(query->pending()); | 794 EXPECT_FALSE(query->pending()); |
7263 } | 795 } |
7264 | 796 |
7265 TEST_F(GLES2DecoderTest, BeginEndQueryEXTGetErrorQueryCHROMIUM) { | 797 TEST_F(GLES2DecoderTest, BeginEndQueryEXTGetErrorQueryCHROMIUM) { |
7266 BeginQueryEXT begin_cmd; | 798 BeginQueryEXT begin_cmd; |
7267 | 799 |
7268 GenHelper<GenQueriesEXTImmediate>(kNewClientId); | 800 GenHelper<GenQueriesEXTImmediate>(kNewClientId); |
7269 | 801 |
7270 // Test valid parameters work. | 802 // Test valid parameters work. |
7271 begin_cmd.Init( | 803 begin_cmd.Init(GL_GET_ERROR_QUERY_CHROMIUM, |
7272 GL_GET_ERROR_QUERY_CHROMIUM, kNewClientId, | 804 kNewClientId, |
7273 kSharedMemoryId, kSharedMemoryOffset); | 805 kSharedMemoryId, |
| 806 kSharedMemoryOffset); |
7274 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); | 807 EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); |
7275 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 808 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
7276 | 809 |
7277 QueryManager* query_manager = decoder_->GetQueryManager(); | 810 QueryManager* query_manager = decoder_->GetQueryManager(); |
7278 ASSERT_TRUE(query_manager != NULL); | 811 ASSERT_TRUE(query_manager != NULL); |
7279 QueryManager::Query* query = query_manager->GetQuery(kNewClientId); | 812 QueryManager::Query* query = query_manager->GetQuery(kNewClientId); |
7280 ASSERT_TRUE(query != NULL); | 813 ASSERT_TRUE(query != NULL); |
7281 EXPECT_FALSE(query->pending()); | 814 EXPECT_FALSE(query->pending()); |
7282 | 815 |
7283 // Test end succeeds | 816 // Test end succeeds |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7348 | 881 |
7349 EXPECT_TRUE(process_success); | 882 EXPECT_TRUE(process_success); |
7350 EXPECT_FALSE(query->pending()); | 883 EXPECT_FALSE(query->pending()); |
7351 QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_); | 884 QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_); |
7352 EXPECT_EQ(static_cast<GLenum>(0), static_cast<GLenum>(sync->result)); | 885 EXPECT_EQ(static_cast<GLenum>(0), static_cast<GLenum>(sync->result)); |
7353 | 886 |
7354 EXPECT_CALL(*gl_, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); | 887 EXPECT_CALL(*gl_, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); |
7355 ResetDecoder(); | 888 ResetDecoder(); |
7356 } | 889 } |
7357 | 890 |
7358 TEST_F(GLES2DecoderTest, ProduceAndConsumeTextureCHROMIUM) { | |
7359 Mailbox mailbox = Mailbox::Generate(); | |
7360 | |
7361 memcpy(shared_memory_address_, mailbox.name, sizeof(mailbox.name)); | |
7362 | |
7363 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
7364 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
7365 0, 0); | |
7366 DoTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
7367 0, 0); | |
7368 TextureRef* texture_ref = group().texture_manager()->GetTexture( | |
7369 client_texture_id_); | |
7370 ASSERT_TRUE(texture_ref != NULL); | |
7371 Texture* texture = texture_ref->texture(); | |
7372 EXPECT_EQ(kServiceTextureId, texture->service_id()); | |
7373 | |
7374 ProduceTextureCHROMIUM produce_cmd; | |
7375 produce_cmd.Init(GL_TEXTURE_2D, kSharedMemoryId, kSharedMemoryOffset); | |
7376 EXPECT_EQ(error::kNoError, ExecuteCmd(produce_cmd)); | |
7377 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7378 | |
7379 // Texture didn't change. | |
7380 GLsizei width; | |
7381 GLsizei height; | |
7382 GLenum type; | |
7383 GLenum internal_format; | |
7384 | |
7385 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); | |
7386 EXPECT_EQ(3, width); | |
7387 EXPECT_EQ(1, height); | |
7388 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); | |
7389 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); | |
7390 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); | |
7391 | |
7392 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); | |
7393 EXPECT_EQ(2, width); | |
7394 EXPECT_EQ(4, height); | |
7395 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format)); | |
7396 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); | |
7397 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); | |
7398 | |
7399 // Service ID has not changed. | |
7400 EXPECT_EQ(kServiceTextureId, texture->service_id()); | |
7401 | |
7402 // Create new texture for consume. | |
7403 EXPECT_CALL(*gl_, GenTextures(_, _)) | |
7404 .WillOnce(SetArgumentPointee<1>(kNewServiceId)) | |
7405 .RetiresOnSaturation(); | |
7406 DoBindTexture(GL_TEXTURE_2D, kNewClientId, kNewServiceId); | |
7407 | |
7408 // Assigns and binds original service size texture ID. | |
7409 EXPECT_CALL(*gl_, DeleteTextures(1, _)) | |
7410 .Times(1) | |
7411 .RetiresOnSaturation(); | |
7412 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) | |
7413 .Times(1) | |
7414 .RetiresOnSaturation(); | |
7415 | |
7416 memcpy(shared_memory_address_, mailbox.name, sizeof(mailbox.name)); | |
7417 ConsumeTextureCHROMIUM consume_cmd; | |
7418 consume_cmd.Init(GL_TEXTURE_2D, kSharedMemoryId, kSharedMemoryOffset); | |
7419 EXPECT_EQ(error::kNoError, ExecuteCmd(consume_cmd)); | |
7420 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7421 | |
7422 // Texture is redefined. | |
7423 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); | |
7424 EXPECT_EQ(3, width); | |
7425 EXPECT_EQ(1, height); | |
7426 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); | |
7427 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); | |
7428 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); | |
7429 | |
7430 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); | |
7431 EXPECT_EQ(2, width); | |
7432 EXPECT_EQ(4, height); | |
7433 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format)); | |
7434 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); | |
7435 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); | |
7436 | |
7437 // Service ID is restored. | |
7438 EXPECT_EQ(kServiceTextureId, texture->service_id()); | |
7439 } | |
7440 | |
7441 | |
7442 TEST_F(GLES2DecoderTest, CanChangeSurface) { | |
7443 scoped_refptr<GLSurfaceMock> other_surface(new GLSurfaceMock); | |
7444 EXPECT_CALL(*other_surface.get(), GetBackingFrameBufferObject()). | |
7445 WillOnce(Return(7)); | |
7446 EXPECT_CALL(*gl_, BindFramebufferEXT(GL_FRAMEBUFFER_EXT, 7)); | |
7447 | |
7448 decoder_->SetSurface(other_surface); | |
7449 } | |
7450 | |
7451 TEST_F(GLES2DecoderTest, IsEnabledReturnsCachedValue) { | 891 TEST_F(GLES2DecoderTest, IsEnabledReturnsCachedValue) { |
7452 // NOTE: There are no expectations because no GL functions should be | 892 // NOTE: There are no expectations because no GL functions should be |
7453 // called for DEPTH_TEST or STENCIL_TEST | 893 // called for DEPTH_TEST or STENCIL_TEST |
7454 static const GLenum kStates[] = { | 894 static const GLenum kStates[] = { |
7455 GL_DEPTH_TEST, | 895 GL_DEPTH_TEST, GL_STENCIL_TEST, |
7456 GL_STENCIL_TEST, | |
7457 }; | 896 }; |
7458 for (size_t ii = 0; ii < arraysize(kStates); ++ii) { | 897 for (size_t ii = 0; ii < arraysize(kStates); ++ii) { |
7459 Enable enable_cmd; | 898 Enable enable_cmd; |
7460 GLenum state = kStates[ii]; | 899 GLenum state = kStates[ii]; |
7461 enable_cmd.Init(state); | 900 enable_cmd.Init(state); |
7462 EXPECT_EQ(error::kNoError, ExecuteCmd(enable_cmd)); | 901 EXPECT_EQ(error::kNoError, ExecuteCmd(enable_cmd)); |
7463 IsEnabled::Result* result = | 902 IsEnabled::Result* result = |
7464 static_cast<IsEnabled::Result*>(shared_memory_address_); | 903 static_cast<IsEnabled::Result*>(shared_memory_address_); |
7465 IsEnabled is_enabled_cmd; | 904 IsEnabled is_enabled_cmd; |
7466 is_enabled_cmd.Init(state, shared_memory_id_, shared_memory_offset_); | 905 is_enabled_cmd.Init(state, shared_memory_id_, shared_memory_offset_); |
7467 EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd)); | 906 EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd)); |
7468 EXPECT_NE(0u, *result); | 907 EXPECT_NE(0u, *result); |
7469 Disable disable_cmd; | 908 Disable disable_cmd; |
7470 disable_cmd.Init(state); | 909 disable_cmd.Init(state); |
7471 EXPECT_EQ(error::kNoError, ExecuteCmd(disable_cmd)); | 910 EXPECT_EQ(error::kNoError, ExecuteCmd(disable_cmd)); |
7472 EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd)); | 911 EXPECT_EQ(error::kNoError, ExecuteCmd(is_enabled_cmd)); |
7473 EXPECT_EQ(0u, *result); | 912 EXPECT_EQ(0u, *result); |
7474 } | 913 } |
7475 } | 914 } |
7476 | 915 |
7477 TEST_F(GLES2DecoderManualInitTest, DepthTextureBadArgs) { | |
7478 InitState init; | |
7479 init.extensions = "GL_ANGLE_depth_texture"; | |
7480 init.gl_version = "opengl es 2.0"; | |
7481 init.has_depth = true; | |
7482 init.has_stencil = true; | |
7483 init.request_depth = true; | |
7484 init.request_stencil = true; | |
7485 init.bind_generates_resource = true; | |
7486 InitDecoder(init); | |
7487 | |
7488 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
7489 // Check trying to upload data fails. | |
7490 TexImage2D tex_cmd; | |
7491 tex_cmd.Init( | |
7492 GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, | |
7493 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, | |
7494 kSharedMemoryId, kSharedMemoryOffset); | |
7495 EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd)); | |
7496 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
7497 // Try level > 0. | |
7498 tex_cmd.Init( | |
7499 GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT, | |
7500 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, 0); | |
7501 EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd)); | |
7502 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
7503 // Make a 1 pixel depth texture. | |
7504 DoTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, | |
7505 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, 0); | |
7506 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7507 | |
7508 // Check that trying to update it fails. | |
7509 TexSubImage2D tex_sub_cmd; | |
7510 tex_sub_cmd.Init( | |
7511 GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, | |
7512 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
7513 EXPECT_EQ(error::kNoError, ExecuteCmd(tex_sub_cmd)); | |
7514 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
7515 | |
7516 // Check that trying to CopyTexImage2D fails | |
7517 CopyTexImage2D copy_tex_cmd; | |
7518 copy_tex_cmd.Init(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, 1, 1, 0); | |
7519 EXPECT_EQ(error::kNoError, ExecuteCmd(copy_tex_cmd)); | |
7520 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
7521 | |
7522 // Check that trying to CopyTexSubImage2D fails | |
7523 CopyTexSubImage2D copy_sub_cmd; | |
7524 copy_sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1); | |
7525 EXPECT_EQ(error::kNoError, ExecuteCmd(copy_sub_cmd)); | |
7526 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
7527 } | |
7528 | |
7529 TEST_F(GLES2DecoderManualInitTest, GenerateMipmapDepthTexture) { | |
7530 InitState init; | |
7531 init.extensions = "GL_ANGLE_depth_texture"; | |
7532 init.gl_version = "opengl es 2.0"; | |
7533 init.has_depth = true; | |
7534 init.has_stencil = true; | |
7535 init.request_depth = true; | |
7536 init.request_stencil = true; | |
7537 init.bind_generates_resource = true; | |
7538 InitDecoder(init); | |
7539 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
7540 DoTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, | |
7541 2, 2, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, | |
7542 0, 0); | |
7543 GenerateMipmap cmd; | |
7544 cmd.Init(GL_TEXTURE_2D); | |
7545 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7546 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
7547 } | |
7548 | |
7549 TEST_F(GLES2DecoderManualInitTest, DrawClearsDepthTexture) { | |
7550 InitState init; | |
7551 init.extensions = "GL_ANGLE_depth_texture"; | |
7552 init.gl_version = "opengl es 2.0"; | |
7553 init.has_alpha = true; | |
7554 init.has_depth = true; | |
7555 init.request_alpha = true; | |
7556 init.request_depth = true; | |
7557 init.bind_generates_resource = true; | |
7558 InitDecoder(init); | |
7559 | |
7560 SetupDefaultProgram(); | |
7561 SetupAllNeededVertexBuffers(); | |
7562 const GLenum attachment = GL_DEPTH_ATTACHMENT; | |
7563 const GLenum target = GL_TEXTURE_2D; | |
7564 const GLint level = 0; | |
7565 DoBindTexture(target, client_texture_id_, kServiceTextureId); | |
7566 | |
7567 // Create a depth texture. | |
7568 DoTexImage2D(target, level, GL_DEPTH_COMPONENT, 1, 1, 0, | |
7569 GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, 0); | |
7570 | |
7571 EXPECT_CALL(*gl_, GenFramebuffersEXT(1, _)) | |
7572 .Times(1) | |
7573 .RetiresOnSaturation(); | |
7574 EXPECT_CALL(*gl_, BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, _)) | |
7575 .Times(1) | |
7576 .RetiresOnSaturation(); | |
7577 | |
7578 EXPECT_CALL(*gl_, FramebufferTexture2DEXT( | |
7579 GL_DRAW_FRAMEBUFFER_EXT, attachment, target, kServiceTextureId, level)) | |
7580 .Times(1) | |
7581 .RetiresOnSaturation(); | |
7582 EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT)) | |
7583 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) | |
7584 .RetiresOnSaturation(); | |
7585 | |
7586 EXPECT_CALL(*gl_, ClearStencil(0)) | |
7587 .Times(1) | |
7588 .RetiresOnSaturation(); | |
7589 EXPECT_CALL(*gl_, StencilMask(-1)) | |
7590 .Times(1) | |
7591 .RetiresOnSaturation(); | |
7592 EXPECT_CALL(*gl_, ClearDepth(1.0f)) | |
7593 .Times(1) | |
7594 .RetiresOnSaturation(); | |
7595 EXPECT_CALL(*gl_, DepthMask(true)) | |
7596 .Times(1) | |
7597 .RetiresOnSaturation(); | |
7598 EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST)) | |
7599 .Times(1) | |
7600 .RetiresOnSaturation(); | |
7601 | |
7602 EXPECT_CALL(*gl_, Clear(GL_DEPTH_BUFFER_BIT)) | |
7603 .Times(1) | |
7604 .RetiresOnSaturation(); | |
7605 | |
7606 SetupExpectationsForRestoreClearState( | |
7607 0.0f, 0.0f, 0.0f, 0.0f, 0, 1.0f, false); | |
7608 | |
7609 EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _)) | |
7610 .Times(1) | |
7611 .RetiresOnSaturation(); | |
7612 EXPECT_CALL(*gl_, BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0)) | |
7613 .Times(1) | |
7614 .RetiresOnSaturation(); | |
7615 | |
7616 SetupExpectationsForApplyingDefaultDirtyState(); | |
7617 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
7618 .Times(1) | |
7619 .RetiresOnSaturation(); | |
7620 DrawArrays cmd; | |
7621 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
7622 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7623 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7624 } | |
7625 | |
7626 TEST_F(GLES2DecoderWithShaderTest, BindUniformLocationCHROMIUM) { | |
7627 const GLint kLocation = 2; | |
7628 const char* kName = "testing"; | |
7629 const uint32 kNameSize = strlen(kName); | |
7630 const char* kBadName1 = "gl_testing"; | |
7631 const uint32 kBadName1Size = strlen(kBadName1); | |
7632 const char* kBadName2 = "testing[1]"; | |
7633 const uint32 kBadName2Size = strlen(kBadName2); | |
7634 memcpy(shared_memory_address_, kName, kNameSize); | |
7635 BindUniformLocationCHROMIUM cmd; | |
7636 cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset, | |
7637 kNameSize); | |
7638 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7639 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7640 // check negative location | |
7641 memcpy(shared_memory_address_, kName, kNameSize); | |
7642 cmd.Init(client_program_id_, -1, kSharedMemoryId, kSharedMemoryOffset, | |
7643 kNameSize); | |
7644 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7645 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
7646 // check highest location | |
7647 memcpy(shared_memory_address_, kName, kNameSize); | |
7648 GLint kMaxLocation = | |
7649 (kMaxFragmentUniformVectors + kMaxVertexUniformVectors) * 4 - 1; | |
7650 cmd.Init(client_program_id_, kMaxLocation, kSharedMemoryId, | |
7651 kSharedMemoryOffset, kNameSize); | |
7652 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7653 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7654 // check too high location | |
7655 memcpy(shared_memory_address_, kName, kNameSize); | |
7656 cmd.Init(client_program_id_, kMaxLocation + 1, kSharedMemoryId, | |
7657 kSharedMemoryOffset, kNameSize); | |
7658 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7659 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
7660 // check bad name "gl_..." | |
7661 memcpy(shared_memory_address_, kBadName1, kBadName1Size); | |
7662 cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset, | |
7663 kBadName1Size); | |
7664 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7665 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
7666 // check bad name "name[1]" non zero | |
7667 memcpy(shared_memory_address_, kBadName2, kBadName2Size); | |
7668 cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset, | |
7669 kBadName2Size); | |
7670 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7671 EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); | |
7672 } | |
7673 | |
7674 class GLES2DecoderVertexArraysOESTest : public GLES2DecoderWithShaderTest { | |
7675 public: | |
7676 GLES2DecoderVertexArraysOESTest() { } | |
7677 | |
7678 bool vertex_array_deleted_manually_; | |
7679 | |
7680 virtual void SetUp() { | |
7681 InitState init; | |
7682 init.extensions = "GL_OES_vertex_array_object"; | |
7683 init.gl_version = "opengl es 2.0"; | |
7684 init.bind_generates_resource = true; | |
7685 InitDecoder(init); | |
7686 SetupDefaultProgram(); | |
7687 | |
7688 AddExpectationsForGenVertexArraysOES(); | |
7689 GenHelper<GenVertexArraysOESImmediate>(client_vertexarray_id_); | |
7690 | |
7691 vertex_array_deleted_manually_ = false; | |
7692 } | |
7693 | |
7694 virtual void TearDown() { | |
7695 // This should only be set if the test handled deletion of the vertex array | |
7696 // itself. Necessary because vertex_array_objects are not sharable, and thus | |
7697 // not managed in the ContextGroup, meaning they will be destroyed during | |
7698 // test tear down | |
7699 if (!vertex_array_deleted_manually_) { | |
7700 AddExpectationsForDeleteVertexArraysOES(); | |
7701 } | |
7702 | |
7703 GLES2DecoderWithShaderTest::TearDown(); | |
7704 } | |
7705 | |
7706 void GenVertexArraysOESValidArgs() { | |
7707 AddExpectationsForGenVertexArraysOES(); | |
7708 GetSharedMemoryAs<GLuint*>()[0] = kNewClientId; | |
7709 GenVertexArraysOES cmd; | |
7710 cmd.Init(1, shared_memory_id_, shared_memory_offset_); | |
7711 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7712 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7713 EXPECT_TRUE(GetVertexArrayInfo(kNewClientId) != NULL); | |
7714 AddExpectationsForDeleteVertexArraysOES(); | |
7715 } | |
7716 | |
7717 void GenVertexArraysOESInvalidArgs() { | |
7718 EXPECT_CALL(*gl_, GenVertexArraysOES(_, _)).Times(0); | |
7719 GetSharedMemoryAs<GLuint*>()[0] = client_vertexarray_id_; | |
7720 GenVertexArraysOES cmd; | |
7721 cmd.Init(1, shared_memory_id_, shared_memory_offset_); | |
7722 EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); | |
7723 } | |
7724 | |
7725 void GenVertexArraysOESImmediateValidArgs() { | |
7726 AddExpectationsForGenVertexArraysOES(); | |
7727 GenVertexArraysOESImmediate* cmd = | |
7728 GetImmediateAs<GenVertexArraysOESImmediate>(); | |
7729 GLuint temp = kNewClientId; | |
7730 cmd->Init(1, &temp); | |
7731 EXPECT_EQ(error::kNoError, | |
7732 ExecuteImmediateCmd(*cmd, sizeof(temp))); | |
7733 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7734 EXPECT_TRUE(GetVertexArrayInfo(kNewClientId) != NULL); | |
7735 AddExpectationsForDeleteVertexArraysOES(); | |
7736 } | |
7737 | |
7738 void GenVertexArraysOESImmediateInvalidArgs() { | |
7739 EXPECT_CALL(*gl_, GenVertexArraysOES(_, _)).Times(0); | |
7740 GenVertexArraysOESImmediate* cmd = | |
7741 GetImmediateAs<GenVertexArraysOESImmediate>(); | |
7742 cmd->Init(1, &client_vertexarray_id_); | |
7743 EXPECT_EQ(error::kInvalidArguments, | |
7744 ExecuteImmediateCmd(*cmd, sizeof(&client_vertexarray_id_))); | |
7745 } | |
7746 | |
7747 void DeleteVertexArraysOESValidArgs() { | |
7748 AddExpectationsForDeleteVertexArraysOES(); | |
7749 GetSharedMemoryAs<GLuint*>()[0] = client_vertexarray_id_; | |
7750 DeleteVertexArraysOES cmd; | |
7751 cmd.Init(1, shared_memory_id_, shared_memory_offset_); | |
7752 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7753 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7754 EXPECT_TRUE( | |
7755 GetVertexArrayInfo(client_vertexarray_id_) == NULL); | |
7756 vertex_array_deleted_manually_ = true; | |
7757 } | |
7758 | |
7759 void DeleteVertexArraysOESInvalidArgs() { | |
7760 GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId; | |
7761 DeleteVertexArraysOES cmd; | |
7762 cmd.Init(1, shared_memory_id_, shared_memory_offset_); | |
7763 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7764 } | |
7765 | |
7766 void DeleteVertexArraysOESImmediateValidArgs() { | |
7767 AddExpectationsForDeleteVertexArraysOES(); | |
7768 DeleteVertexArraysOESImmediate& cmd = | |
7769 *GetImmediateAs<DeleteVertexArraysOESImmediate>(); | |
7770 cmd.Init(1, &client_vertexarray_id_); | |
7771 EXPECT_EQ(error::kNoError, | |
7772 ExecuteImmediateCmd(cmd, sizeof(client_vertexarray_id_))); | |
7773 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7774 EXPECT_TRUE( | |
7775 GetVertexArrayInfo(client_vertexarray_id_) == NULL); | |
7776 vertex_array_deleted_manually_ = true; | |
7777 } | |
7778 | |
7779 void DeleteVertexArraysOESImmediateInvalidArgs() { | |
7780 DeleteVertexArraysOESImmediate& cmd = | |
7781 *GetImmediateAs<DeleteVertexArraysOESImmediate>(); | |
7782 GLuint temp = kInvalidClientId; | |
7783 cmd.Init(1, &temp); | |
7784 EXPECT_EQ(error::kNoError, | |
7785 ExecuteImmediateCmd(cmd, sizeof(temp))); | |
7786 } | |
7787 | |
7788 void DeleteBoundVertexArraysOESImmediateValidArgs() { | |
7789 BindVertexArrayOESValidArgs(); | |
7790 | |
7791 AddExpectationsForDeleteBoundVertexArraysOES(); | |
7792 DeleteVertexArraysOESImmediate& cmd = | |
7793 *GetImmediateAs<DeleteVertexArraysOESImmediate>(); | |
7794 cmd.Init(1, &client_vertexarray_id_); | |
7795 EXPECT_EQ(error::kNoError, | |
7796 ExecuteImmediateCmd(cmd, sizeof(client_vertexarray_id_))); | |
7797 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7798 EXPECT_TRUE(GetVertexArrayInfo(client_vertexarray_id_) == NULL); | |
7799 vertex_array_deleted_manually_ = true; | |
7800 } | |
7801 | |
7802 void IsVertexArrayOESValidArgs() { | |
7803 IsVertexArrayOES cmd; | |
7804 cmd.Init(client_vertexarray_id_, shared_memory_id_, shared_memory_offset_); | |
7805 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7806 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7807 } | |
7808 | |
7809 void IsVertexArrayOESInvalidArgsBadSharedMemoryId() { | |
7810 IsVertexArrayOES cmd; | |
7811 cmd.Init( | |
7812 client_vertexarray_id_, kInvalidSharedMemoryId, shared_memory_offset_); | |
7813 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); | |
7814 cmd.Init( | |
7815 client_vertexarray_id_, shared_memory_id_, kInvalidSharedMemoryOffset); | |
7816 EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); | |
7817 } | |
7818 | |
7819 void BindVertexArrayOESValidArgs() { | |
7820 AddExpectationsForBindVertexArrayOES(); | |
7821 BindVertexArrayOES cmd; | |
7822 cmd.Init(client_vertexarray_id_); | |
7823 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7824 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
7825 } | |
7826 | |
7827 void BindVertexArrayOESValidArgsNewId() { | |
7828 BindVertexArrayOES cmd; | |
7829 cmd.Init(kNewClientId); | |
7830 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
7831 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
7832 } | |
7833 }; | |
7834 | |
7835 class GLES2DecoderEmulatedVertexArraysOESTest | |
7836 : public GLES2DecoderVertexArraysOESTest { | |
7837 public: | |
7838 GLES2DecoderEmulatedVertexArraysOESTest() { } | |
7839 | |
7840 virtual void SetUp() { | |
7841 InitState init; | |
7842 init.gl_version = "3.0"; | |
7843 init.bind_generates_resource = true; | |
7844 InitDecoder(init); | |
7845 SetupDefaultProgram(); | |
7846 | |
7847 AddExpectationsForGenVertexArraysOES(); | |
7848 GenHelper<GenVertexArraysOESImmediate>(client_vertexarray_id_); | |
7849 | |
7850 vertex_array_deleted_manually_ = false; | |
7851 } | |
7852 }; | |
7853 | |
7854 // Test vertex array objects with native support | |
7855 TEST_F(GLES2DecoderVertexArraysOESTest, GenVertexArraysOESValidArgs) { | |
7856 GenVertexArraysOESValidArgs(); | |
7857 } | |
7858 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, GenVertexArraysOESValidArgs) { | |
7859 GenVertexArraysOESValidArgs(); | |
7860 } | |
7861 | |
7862 TEST_F(GLES2DecoderVertexArraysOESTest, GenVertexArraysOESInvalidArgs) { | |
7863 GenVertexArraysOESInvalidArgs(); | |
7864 } | |
7865 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, ) { | |
7866 GenVertexArraysOESInvalidArgs(); | |
7867 } | |
7868 | |
7869 TEST_F(GLES2DecoderVertexArraysOESTest, GenVertexArraysOESImmediateValidArgs) { | |
7870 GenVertexArraysOESImmediateValidArgs(); | |
7871 } | |
7872 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, | |
7873 GenVertexArraysOESImmediateValidArgs) { | |
7874 GenVertexArraysOESImmediateValidArgs(); | |
7875 } | |
7876 | |
7877 TEST_F(GLES2DecoderVertexArraysOESTest, | |
7878 GenVertexArraysOESImmediateInvalidArgs) { | |
7879 GenVertexArraysOESImmediateInvalidArgs(); | |
7880 } | |
7881 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, | |
7882 GenVertexArraysOESImmediateInvalidArgs) { | |
7883 GenVertexArraysOESImmediateInvalidArgs(); | |
7884 } | |
7885 | |
7886 TEST_F(GLES2DecoderVertexArraysOESTest, DeleteVertexArraysOESValidArgs) { | |
7887 DeleteVertexArraysOESValidArgs(); | |
7888 } | |
7889 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, | |
7890 DeleteVertexArraysOESValidArgs) { | |
7891 DeleteVertexArraysOESValidArgs(); | |
7892 } | |
7893 | |
7894 TEST_F(GLES2DecoderVertexArraysOESTest, DeleteVertexArraysOESInvalidArgs) { | |
7895 DeleteVertexArraysOESInvalidArgs(); | |
7896 } | |
7897 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, | |
7898 DeleteVertexArraysOESInvalidArgs) { | |
7899 DeleteVertexArraysOESInvalidArgs(); | |
7900 } | |
7901 | |
7902 TEST_F(GLES2DecoderVertexArraysOESTest, | |
7903 DeleteVertexArraysOESImmediateValidArgs) { | |
7904 DeleteVertexArraysOESImmediateValidArgs(); | |
7905 } | |
7906 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, | |
7907 DeleteVertexArraysOESImmediateValidArgs) { | |
7908 DeleteVertexArraysOESImmediateValidArgs(); | |
7909 } | |
7910 | |
7911 TEST_F(GLES2DecoderVertexArraysOESTest, | |
7912 DeleteVertexArraysOESImmediateInvalidArgs) { | |
7913 DeleteVertexArraysOESImmediateInvalidArgs(); | |
7914 } | |
7915 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, | |
7916 DeleteVertexArraysOESImmediateInvalidArgs) { | |
7917 DeleteVertexArraysOESImmediateInvalidArgs(); | |
7918 } | |
7919 | |
7920 TEST_F(GLES2DecoderVertexArraysOESTest, | |
7921 DeleteBoundVertexArraysOESImmediateValidArgs) { | |
7922 DeleteBoundVertexArraysOESImmediateValidArgs(); | |
7923 } | |
7924 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, | |
7925 DeleteBoundVertexArraysOESImmediateValidArgs) { | |
7926 DeleteBoundVertexArraysOESImmediateValidArgs(); | |
7927 } | |
7928 | |
7929 TEST_F(GLES2DecoderVertexArraysOESTest, IsVertexArrayOESValidArgs) { | |
7930 IsVertexArrayOESValidArgs(); | |
7931 } | |
7932 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, IsVertexArrayOESValidArgs) { | |
7933 IsVertexArrayOESValidArgs(); | |
7934 } | |
7935 | |
7936 TEST_F(GLES2DecoderVertexArraysOESTest, | |
7937 IsVertexArrayOESInvalidArgsBadSharedMemoryId) { | |
7938 IsVertexArrayOESInvalidArgsBadSharedMemoryId(); | |
7939 } | |
7940 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, | |
7941 IsVertexArrayOESInvalidArgsBadSharedMemoryId) { | |
7942 IsVertexArrayOESInvalidArgsBadSharedMemoryId(); | |
7943 } | |
7944 | |
7945 TEST_F(GLES2DecoderVertexArraysOESTest, BindVertexArrayOESValidArgs) { | |
7946 BindVertexArrayOESValidArgs(); | |
7947 } | |
7948 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, BindVertexArrayOESValidArgs) { | |
7949 BindVertexArrayOESValidArgs(); | |
7950 } | |
7951 | |
7952 TEST_F(GLES2DecoderVertexArraysOESTest, BindVertexArrayOESValidArgsNewId) { | |
7953 BindVertexArrayOESValidArgsNewId(); | |
7954 } | |
7955 TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, | |
7956 BindVertexArrayOESValidArgsNewId) { | |
7957 BindVertexArrayOESValidArgsNewId(); | |
7958 } | |
7959 | |
7960 TEST_F(GLES2DecoderTest, BindTexImage2DCHROMIUM) { | |
7961 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
7962 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
7963 0, 0); | |
7964 TextureRef* texture_ref = group().texture_manager()->GetTexture( | |
7965 client_texture_id_); | |
7966 ASSERT_TRUE(texture_ref != NULL); | |
7967 Texture* texture = texture_ref->texture(); | |
7968 EXPECT_EQ(kServiceTextureId, texture->service_id()); | |
7969 | |
7970 group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1); | |
7971 EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL); | |
7972 | |
7973 GLsizei width; | |
7974 GLsizei height; | |
7975 GLenum type; | |
7976 GLenum internal_format; | |
7977 | |
7978 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); | |
7979 EXPECT_EQ(3, width); | |
7980 EXPECT_EQ(1, height); | |
7981 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); | |
7982 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); | |
7983 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); | |
7984 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); | |
7985 | |
7986 // Bind image to texture. | |
7987 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. | |
7988 EXPECT_CALL(*gl_, GetError()) | |
7989 .WillOnce(Return(GL_NO_ERROR)) | |
7990 .WillOnce(Return(GL_NO_ERROR)) | |
7991 .RetiresOnSaturation(); | |
7992 BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; | |
7993 bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1); | |
7994 EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); | |
7995 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); | |
7996 // Image should now be set. | |
7997 EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); | |
7998 | |
7999 // Define new texture image. | |
8000 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
8001 0, 0); | |
8002 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); | |
8003 // Image should no longer be set. | |
8004 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); | |
8005 } | |
8006 | |
8007 TEST_F(GLES2DecoderTest, BindTexImage2DCHROMIUMCubeMapNotAllowed) { | |
8008 group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1); | |
8009 DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId); | |
8010 | |
8011 BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; | |
8012 bind_tex_image_2d_cmd.Init(GL_TEXTURE_CUBE_MAP, 1); | |
8013 EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); | |
8014 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
8015 } | |
8016 | |
8017 TEST_F(GLES2DecoderTest, OrphanGLImageWithTexImage2D) { | |
8018 group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1); | |
8019 DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId); | |
8020 | |
8021 BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; | |
8022 bind_tex_image_2d_cmd.Init(GL_TEXTURE_CUBE_MAP, 1); | |
8023 EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); | |
8024 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | |
8025 | |
8026 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
8027 0, 0); | |
8028 TextureRef* texture_ref = group().texture_manager()->GetTexture( | |
8029 client_texture_id_); | |
8030 ASSERT_TRUE(texture_ref != NULL); | |
8031 Texture* texture = texture_ref->texture(); | |
8032 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); | |
8033 } | |
8034 | |
8035 TEST_F(GLES2DecoderTest, ReleaseTexImage2DCHROMIUM) { | |
8036 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
8037 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
8038 0, 0); | |
8039 TextureRef* texture_ref = group().texture_manager()->GetTexture( | |
8040 client_texture_id_); | |
8041 ASSERT_TRUE(texture_ref != NULL); | |
8042 Texture* texture = texture_ref->texture(); | |
8043 EXPECT_EQ(kServiceTextureId, texture->service_id()); | |
8044 | |
8045 group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1); | |
8046 EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL); | |
8047 | |
8048 GLsizei width; | |
8049 GLsizei height; | |
8050 GLenum type; | |
8051 GLenum internal_format; | |
8052 | |
8053 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); | |
8054 EXPECT_EQ(3, width); | |
8055 EXPECT_EQ(1, height); | |
8056 EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); | |
8057 EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); | |
8058 EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); | |
8059 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); | |
8060 | |
8061 // Bind image to texture. | |
8062 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. | |
8063 EXPECT_CALL(*gl_, GetError()) | |
8064 .WillOnce(Return(GL_NO_ERROR)) | |
8065 .WillOnce(Return(GL_NO_ERROR)) | |
8066 .RetiresOnSaturation(); | |
8067 BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; | |
8068 bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1); | |
8069 EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); | |
8070 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); | |
8071 // Image should now be set. | |
8072 EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); | |
8073 | |
8074 // Release image from texture. | |
8075 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. | |
8076 EXPECT_CALL(*gl_, GetError()) | |
8077 .WillOnce(Return(GL_NO_ERROR)) | |
8078 .WillOnce(Return(GL_NO_ERROR)) | |
8079 .RetiresOnSaturation(); | |
8080 ReleaseTexImage2DCHROMIUM release_tex_image_2d_cmd; | |
8081 release_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1); | |
8082 EXPECT_EQ(error::kNoError, ExecuteCmd(release_tex_image_2d_cmd)); | |
8083 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); | |
8084 // Image should no longer be set. | |
8085 EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); | |
8086 } | |
8087 | |
8088 class MockGLImage : public gfx::GLImage { | |
8089 public: | |
8090 MockGLImage() {} | |
8091 | |
8092 // Overridden from gfx::GLImage: | |
8093 MOCK_METHOD0(Destroy, void()); | |
8094 MOCK_METHOD0(GetSize, gfx::Size()); | |
8095 MOCK_METHOD1(BindTexImage, bool(unsigned)); | |
8096 MOCK_METHOD1(ReleaseTexImage, void(unsigned)); | |
8097 MOCK_METHOD0(WillUseTexImage, void()); | |
8098 MOCK_METHOD0(DidUseTexImage, void()); | |
8099 MOCK_METHOD0(WillModifyTexImage, void()); | |
8100 MOCK_METHOD0(DidModifyTexImage, void()); | |
8101 | |
8102 protected: | |
8103 virtual ~MockGLImage() {} | |
8104 }; | |
8105 | |
8106 TEST_F(GLES2DecoderWithShaderTest, UseTexImage) { | |
8107 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
8108 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, | |
8109 kSharedMemoryId, kSharedMemoryOffset); | |
8110 | |
8111 TextureRef* texture_ref = group().texture_manager()->GetTexture( | |
8112 client_texture_id_); | |
8113 ASSERT_TRUE(texture_ref != NULL); | |
8114 Texture* texture = texture_ref->texture(); | |
8115 EXPECT_EQ(kServiceTextureId, texture->service_id()); | |
8116 | |
8117 const int32 kImageId = 1; | |
8118 scoped_refptr<MockGLImage> image(new MockGLImage); | |
8119 group().image_manager()->AddImage(image.get(), kImageId); | |
8120 | |
8121 // Bind image to texture. | |
8122 EXPECT_CALL(*image, BindTexImage(GL_TEXTURE_2D)) | |
8123 .Times(1) | |
8124 .WillOnce(Return(true)) | |
8125 .RetiresOnSaturation(); | |
8126 EXPECT_CALL(*image, GetSize()) | |
8127 .Times(1) | |
8128 .WillOnce(Return(gfx::Size(1, 1))) | |
8129 .RetiresOnSaturation(); | |
8130 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. | |
8131 EXPECT_CALL(*gl_, GetError()) | |
8132 .WillOnce(Return(GL_NO_ERROR)) | |
8133 .WillOnce(Return(GL_NO_ERROR)) | |
8134 .RetiresOnSaturation(); | |
8135 BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; | |
8136 bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, kImageId); | |
8137 EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); | |
8138 | |
8139 AddExpectationsForSimulatedAttrib0(kNumVertices, 0); | |
8140 SetupExpectationsForApplyingDefaultDirtyState(); | |
8141 | |
8142 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. | |
8143 EXPECT_CALL(*gl_, GetError()) | |
8144 .WillOnce(Return(GL_NO_ERROR)) | |
8145 .WillOnce(Return(GL_NO_ERROR)) | |
8146 .WillOnce(Return(GL_NO_ERROR)) | |
8147 .WillOnce(Return(GL_NO_ERROR)) | |
8148 .RetiresOnSaturation(); | |
8149 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) | |
8150 .Times(3) | |
8151 .RetiresOnSaturation(); | |
8152 EXPECT_CALL(*image, WillUseTexImage()) | |
8153 .Times(1) | |
8154 .RetiresOnSaturation(); | |
8155 EXPECT_CALL(*image, DidUseTexImage()) | |
8156 .Times(1) | |
8157 .RetiresOnSaturation(); | |
8158 EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) | |
8159 .Times(1) | |
8160 .RetiresOnSaturation(); | |
8161 DrawArrays cmd; | |
8162 cmd.Init(GL_TRIANGLES, 0, kNumVertices); | |
8163 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
8164 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8165 | |
8166 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
8167 kServiceFramebufferId); | |
8168 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. | |
8169 EXPECT_CALL(*gl_, GetError()) | |
8170 .WillOnce(Return(GL_NO_ERROR)) | |
8171 .WillOnce(Return(GL_NO_ERROR)) | |
8172 .RetiresOnSaturation(); | |
8173 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) | |
8174 .Times(1) | |
8175 .RetiresOnSaturation(); | |
8176 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) | |
8177 .Times(2) | |
8178 .RetiresOnSaturation(); | |
8179 // Image will be 'in use' as long as bound to a framebuffer. | |
8180 EXPECT_CALL(*image, WillUseTexImage()) | |
8181 .Times(1) | |
8182 .RetiresOnSaturation(); | |
8183 EXPECT_CALL(*gl_, FramebufferTexture2DEXT( | |
8184 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
8185 kServiceTextureId, 0)) | |
8186 .Times(1) | |
8187 .RetiresOnSaturation(); | |
8188 EXPECT_CALL(*gl_, GetError()) | |
8189 .WillOnce(Return(GL_NO_ERROR)) | |
8190 .WillOnce(Return(GL_NO_ERROR)) | |
8191 .RetiresOnSaturation(); | |
8192 FramebufferTexture2D fbtex_cmd; | |
8193 fbtex_cmd.Init( | |
8194 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_, | |
8195 0); | |
8196 EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd)); | |
8197 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8198 | |
8199 // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. | |
8200 EXPECT_CALL(*gl_, GetError()) | |
8201 .WillOnce(Return(GL_NO_ERROR)) | |
8202 .WillOnce(Return(GL_NO_ERROR)) | |
8203 .RetiresOnSaturation(); | |
8204 EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( | |
8205 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
8206 kServiceRenderbufferId)) | |
8207 .Times(1) | |
8208 .RetiresOnSaturation(); | |
8209 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) | |
8210 .Times(1) | |
8211 .RetiresOnSaturation(); | |
8212 EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) | |
8213 .Times(2) | |
8214 .RetiresOnSaturation(); | |
8215 // Image should no longer be 'in use' after being unbound from framebuffer. | |
8216 EXPECT_CALL(*image, DidUseTexImage()) | |
8217 .Times(1) | |
8218 .RetiresOnSaturation(); | |
8219 EXPECT_CALL(*gl_, GetError()) | |
8220 .WillOnce(Return(GL_NO_ERROR)) | |
8221 .WillOnce(Return(GL_NO_ERROR)) | |
8222 .RetiresOnSaturation(); | |
8223 FramebufferRenderbuffer fbrb_cmd; | |
8224 fbrb_cmd.Init( | |
8225 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | |
8226 client_renderbuffer_id_); | |
8227 EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); | |
8228 } | |
8229 | |
8230 TEST_F(GLES2DecoderManualInitTest, DrawWithGLImageExternal) { | |
8231 InitState init; | |
8232 init.extensions = "GL_OES_EGL_image_external"; | |
8233 init.gl_version = "opengl es 2.0"; | |
8234 init.has_alpha = true; | |
8235 init.has_depth = true; | |
8236 init.request_alpha = true; | |
8237 init.request_depth = true; | |
8238 init.bind_generates_resource = true; | |
8239 InitDecoder(init); | |
8240 | |
8241 TextureRef* texture_ref = GetTexture(client_texture_id_); | |
8242 scoped_refptr<MockGLImage> image(new MockGLImage); | |
8243 group().texture_manager()->SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES); | |
8244 group().texture_manager()->SetLevelInfo(texture_ref, | |
8245 GL_TEXTURE_EXTERNAL_OES, | |
8246 0, | |
8247 GL_RGBA, | |
8248 0, | |
8249 0, | |
8250 1, | |
8251 0, | |
8252 GL_RGBA, | |
8253 GL_UNSIGNED_BYTE, | |
8254 true); | |
8255 group().texture_manager()->SetLevelImage( | |
8256 texture_ref, GL_TEXTURE_EXTERNAL_OES, 0, image); | |
8257 | |
8258 DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); | |
8259 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8260 | |
8261 SetupSamplerExternalProgram(); | |
8262 SetupIndexBuffer(); | |
8263 AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0); | |
8264 SetupExpectationsForApplyingDefaultDirtyState(); | |
8265 EXPECT_TRUE(group().texture_manager()->CanRender(texture_ref)); | |
8266 | |
8267 InSequence s; | |
8268 EXPECT_CALL(*gl_, GetError()) | |
8269 .WillOnce(Return(GL_NO_ERROR)) | |
8270 .RetiresOnSaturation(); | |
8271 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) | |
8272 .Times(1) | |
8273 .RetiresOnSaturation(); | |
8274 EXPECT_CALL(*image, WillUseTexImage()) | |
8275 .Times(1) | |
8276 .RetiresOnSaturation(); | |
8277 EXPECT_CALL(*gl_, GetError()) | |
8278 .WillOnce(Return(GL_NO_ERROR)) | |
8279 .RetiresOnSaturation(); | |
8280 EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) | |
8281 .Times(1); | |
8282 EXPECT_CALL(*gl_, GetError()) | |
8283 .WillOnce(Return(GL_NO_ERROR)) | |
8284 .RetiresOnSaturation(); | |
8285 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) | |
8286 .Times(1) | |
8287 .RetiresOnSaturation(); | |
8288 EXPECT_CALL(*image, DidUseTexImage()) | |
8289 .Times(1) | |
8290 .RetiresOnSaturation(); | |
8291 EXPECT_CALL(*gl_, GetError()) | |
8292 .WillOnce(Return(GL_NO_ERROR)) | |
8293 .RetiresOnSaturation(); | |
8294 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) | |
8295 .Times(1) | |
8296 .RetiresOnSaturation(); | |
8297 DrawElements cmd; | |
8298 cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, | |
8299 kValidIndexRangeStart * 2); | |
8300 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
8301 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8302 } | |
8303 | |
8304 TEST_F(GLES2DecoderManualInitTest, GpuMemoryManagerCHROMIUM) { | 916 TEST_F(GLES2DecoderManualInitTest, GpuMemoryManagerCHROMIUM) { |
8305 InitState init; | 917 InitState init; |
8306 init.extensions = "GL_ARB_texture_rectangle"; | 918 init.extensions = "GL_ARB_texture_rectangle"; |
8307 init.gl_version = "3.0"; | 919 init.gl_version = "3.0"; |
8308 init.bind_generates_resource = true; | 920 init.bind_generates_resource = true; |
8309 InitDecoder(init); | 921 InitDecoder(init); |
8310 | 922 |
8311 Texture* texture = GetTexture(client_texture_id_)->texture(); | 923 Texture* texture = GetTexture(client_texture_id_)->texture(); |
8312 EXPECT_TRUE(texture != NULL); | 924 EXPECT_TRUE(texture != NULL); |
8313 EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_UNMANAGED_CHROMIUM); | 925 EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_UNMANAGED_CHROMIUM); |
8314 | 926 |
8315 DoBindTexture( | 927 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
8316 GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
8317 | 928 |
8318 TexParameteri cmd; | 929 TexParameteri cmd; |
8319 cmd.Init(GL_TEXTURE_2D, | 930 cmd.Init(GL_TEXTURE_2D, |
8320 GL_TEXTURE_POOL_CHROMIUM, | 931 GL_TEXTURE_POOL_CHROMIUM, |
8321 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM); | 932 GL_TEXTURE_POOL_UNMANAGED_CHROMIUM); |
8322 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 933 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8323 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 934 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
8324 | 935 |
8325 cmd.Init(GL_TEXTURE_2D, | 936 cmd.Init(GL_TEXTURE_2D, |
8326 GL_TEXTURE_POOL_CHROMIUM, | 937 GL_TEXTURE_POOL_CHROMIUM, |
8327 GL_TEXTURE_POOL_MANAGED_CHROMIUM); | 938 GL_TEXTURE_POOL_MANAGED_CHROMIUM); |
8328 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 939 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8329 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 940 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
8330 | 941 |
8331 EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_MANAGED_CHROMIUM); | 942 EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_MANAGED_CHROMIUM); |
8332 | 943 |
8333 cmd.Init(GL_TEXTURE_2D, | 944 cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROMIUM, GL_NONE); |
8334 GL_TEXTURE_POOL_CHROMIUM, | |
8335 GL_NONE); | |
8336 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 945 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8337 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); | 946 EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); |
8338 } | 947 } |
8339 | 948 |
8340 TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransfers) { | |
8341 InitState init; | |
8342 init.extensions = "GL_CHROMIUM_async_pixel_transfers"; | |
8343 init.gl_version = "3.0"; | |
8344 init.bind_generates_resource = true; | |
8345 InitDecoder(init); | |
8346 | |
8347 // Set up the texture. | |
8348 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
8349 TextureRef* texture_ref = GetTexture(client_texture_id_); | |
8350 Texture* texture = texture_ref->texture(); | |
8351 | |
8352 // Set a mock Async delegate | |
8353 StrictMock<gpu::MockAsyncPixelTransferManager>* manager = | |
8354 new StrictMock<gpu::MockAsyncPixelTransferManager>; | |
8355 manager->Initialize(group().texture_manager()); | |
8356 decoder_->SetAsyncPixelTransferManagerForTest(manager); | |
8357 StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL; | |
8358 | |
8359 // Tex(Sub)Image2D upload commands. | |
8360 AsyncTexImage2DCHROMIUM teximage_cmd; | |
8361 teximage_cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, | |
8362 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, | |
8363 0, 0, 0); | |
8364 AsyncTexSubImage2DCHROMIUM texsubimage_cmd; | |
8365 texsubimage_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGBA, | |
8366 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, | |
8367 0, 0, 0); | |
8368 WaitAsyncTexImage2DCHROMIUM wait_cmd; | |
8369 wait_cmd.Init(GL_TEXTURE_2D); | |
8370 WaitAllAsyncTexImage2DCHROMIUM wait_all_cmd; | |
8371 wait_all_cmd.Init(); | |
8372 | |
8373 // No transfer state exists initially. | |
8374 EXPECT_FALSE( | |
8375 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8376 texture_ref)); | |
8377 | |
8378 base::Closure bind_callback; | |
8379 | |
8380 // AsyncTexImage2D | |
8381 { | |
8382 // Create transfer state since it doesn't exist. | |
8383 EXPECT_EQ(texture_ref->num_observers(), 0); | |
8384 EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) | |
8385 .WillOnce(Return( | |
8386 delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) | |
8387 .RetiresOnSaturation(); | |
8388 EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)) | |
8389 .WillOnce(SaveArg<2>(&bind_callback)) | |
8390 .RetiresOnSaturation(); | |
8391 // Command succeeds. | |
8392 EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); | |
8393 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8394 EXPECT_EQ( | |
8395 delegate, | |
8396 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8397 texture_ref)); | |
8398 EXPECT_TRUE(texture->IsImmutable()); | |
8399 // The texture is safe but the level has not been defined yet. | |
8400 EXPECT_TRUE(texture->SafeToRenderFrom()); | |
8401 GLsizei width, height; | |
8402 EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); | |
8403 EXPECT_EQ(texture_ref->num_observers(), 1); | |
8404 } | |
8405 { | |
8406 // Async redefinitions are not allowed! | |
8407 // Command fails. | |
8408 EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); | |
8409 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
8410 EXPECT_EQ( | |
8411 delegate, | |
8412 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8413 texture_ref)); | |
8414 EXPECT_TRUE(texture->IsImmutable()); | |
8415 EXPECT_TRUE(texture->SafeToRenderFrom()); | |
8416 } | |
8417 | |
8418 // Binding/defining of the async transfer | |
8419 { | |
8420 // TODO(epenner): We should check that the manager gets the | |
8421 // BindCompletedAsyncTransfers() call, which is required to | |
8422 // guarantee the delegate calls the bind callback. | |
8423 | |
8424 // Simulate the bind callback from the delegate. | |
8425 bind_callback.Run(); | |
8426 | |
8427 // After the bind callback is run, the texture is safe, | |
8428 // and has the right size etc. | |
8429 EXPECT_TRUE(texture->SafeToRenderFrom()); | |
8430 GLsizei width, height; | |
8431 EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); | |
8432 EXPECT_EQ(width, 8); | |
8433 EXPECT_EQ(height, 8); | |
8434 } | |
8435 | |
8436 // AsyncTexSubImage2D | |
8437 EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); | |
8438 decoder_->GetAsyncPixelTransferManager() | |
8439 ->ClearPixelTransferDelegateForTest(texture_ref); | |
8440 EXPECT_EQ(texture_ref->num_observers(), 0); | |
8441 texture->SetImmutable(false); | |
8442 { | |
8443 // Create transfer state since it doesn't exist. | |
8444 EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) | |
8445 .WillOnce(Return( | |
8446 delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) | |
8447 .RetiresOnSaturation(); | |
8448 EXPECT_CALL(*delegate, AsyncTexSubImage2D(_, _)) | |
8449 .RetiresOnSaturation(); | |
8450 // Command succeeds. | |
8451 EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd)); | |
8452 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8453 EXPECT_EQ( | |
8454 delegate, | |
8455 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8456 texture_ref)); | |
8457 EXPECT_TRUE(texture->IsImmutable()); | |
8458 EXPECT_TRUE(texture->SafeToRenderFrom()); | |
8459 } | |
8460 { | |
8461 // No transfer is in progress. | |
8462 EXPECT_CALL(*delegate, TransferIsInProgress()) | |
8463 .WillOnce(Return(false)) // texSubImage validation | |
8464 .WillOnce(Return(false)) // async validation | |
8465 .RetiresOnSaturation(); | |
8466 EXPECT_CALL(*delegate, AsyncTexSubImage2D(_, _)) | |
8467 .RetiresOnSaturation(); | |
8468 // Command succeeds. | |
8469 EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd)); | |
8470 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8471 EXPECT_EQ( | |
8472 delegate, | |
8473 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8474 texture_ref)); | |
8475 EXPECT_TRUE(texture->IsImmutable()); | |
8476 EXPECT_TRUE(texture->SafeToRenderFrom()); | |
8477 } | |
8478 { | |
8479 // A transfer is still in progress! | |
8480 EXPECT_CALL(*delegate, TransferIsInProgress()) | |
8481 .WillOnce(Return(true)) | |
8482 .RetiresOnSaturation(); | |
8483 // No async call, command fails. | |
8484 EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd)); | |
8485 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
8486 EXPECT_EQ( | |
8487 delegate, | |
8488 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8489 texture_ref)); | |
8490 EXPECT_TRUE(texture->IsImmutable()); | |
8491 EXPECT_TRUE(texture->SafeToRenderFrom()); | |
8492 } | |
8493 | |
8494 // Delete delegate on DeleteTexture. | |
8495 { | |
8496 EXPECT_EQ(texture_ref->num_observers(), 1); | |
8497 EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); | |
8498 DoDeleteTexture(client_texture_id_, kServiceTextureId); | |
8499 EXPECT_FALSE( | |
8500 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8501 texture_ref)); | |
8502 texture = NULL; | |
8503 texture_ref = NULL; | |
8504 delegate = NULL; | |
8505 } | |
8506 | |
8507 // WaitAsyncTexImage2D | |
8508 { | |
8509 // Get a fresh texture since the existing texture cannot be respecified | |
8510 // asynchronously and AsyncTexSubImage2D does not involve binding. | |
8511 EXPECT_CALL(*gl_, GenTextures(1, _)) | |
8512 .WillOnce(SetArgumentPointee<1>(kServiceTextureId)); | |
8513 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
8514 texture_ref = GetTexture(client_texture_id_); | |
8515 texture = texture_ref->texture(); | |
8516 texture->SetImmutable(false); | |
8517 // Create transfer state since it doesn't exist. | |
8518 EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) | |
8519 .WillOnce(Return( | |
8520 delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) | |
8521 .RetiresOnSaturation(); | |
8522 EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)) | |
8523 .RetiresOnSaturation(); | |
8524 // Start async transfer. | |
8525 EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); | |
8526 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8527 EXPECT_EQ( | |
8528 delegate, | |
8529 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8530 texture_ref)); | |
8531 | |
8532 EXPECT_TRUE(texture->IsImmutable()); | |
8533 // Wait for completion. | |
8534 EXPECT_CALL(*delegate, WaitForTransferCompletion()); | |
8535 EXPECT_CALL(*manager, BindCompletedAsyncTransfers()); | |
8536 EXPECT_EQ(error::kNoError, ExecuteCmd(wait_cmd)); | |
8537 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8538 } | |
8539 | |
8540 // WaitAllAsyncTexImage2D | |
8541 EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); | |
8542 DoDeleteTexture(client_texture_id_, kServiceTextureId); | |
8543 EXPECT_FALSE( | |
8544 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8545 texture_ref)); | |
8546 texture = NULL; | |
8547 texture_ref = NULL; | |
8548 delegate = NULL; | |
8549 { | |
8550 // Get a fresh texture since the existing texture cannot be respecified | |
8551 // asynchronously and AsyncTexSubImage2D does not involve binding. | |
8552 EXPECT_CALL(*gl_, GenTextures(1, _)) | |
8553 .WillOnce(SetArgumentPointee<1>(kServiceTextureId)); | |
8554 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
8555 texture_ref = GetTexture(client_texture_id_); | |
8556 texture = texture_ref->texture(); | |
8557 texture->SetImmutable(false); | |
8558 // Create transfer state since it doesn't exist. | |
8559 EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) | |
8560 .WillOnce(Return( | |
8561 delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) | |
8562 .RetiresOnSaturation(); | |
8563 EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)) | |
8564 .RetiresOnSaturation(); | |
8565 // Start async transfer. | |
8566 EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); | |
8567 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8568 EXPECT_EQ( | |
8569 delegate, | |
8570 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8571 texture_ref)); | |
8572 | |
8573 EXPECT_TRUE(texture->IsImmutable()); | |
8574 // Wait for completion of all uploads. | |
8575 EXPECT_CALL(*manager, WaitAllAsyncTexImage2D()).RetiresOnSaturation(); | |
8576 EXPECT_CALL(*manager, BindCompletedAsyncTransfers()); | |
8577 EXPECT_EQ(error::kNoError, ExecuteCmd(wait_all_cmd)); | |
8578 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8579 } | |
8580 | |
8581 // Remove PixelTransferManager before the decoder destroys. | |
8582 EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); | |
8583 decoder_->ResetAsyncPixelTransferManagerForTest(); | |
8584 manager = NULL; | |
8585 } | |
8586 | |
8587 TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransferManager) { | |
8588 InitState init; | |
8589 init.extensions = "GL_CHROMIUM_async_pixel_transfers"; | |
8590 init.gl_version = "3.0"; | |
8591 init.bind_generates_resource = true; | |
8592 InitDecoder(init); | |
8593 | |
8594 // Set up the texture. | |
8595 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
8596 TextureRef* texture_ref = GetTexture(client_texture_id_); | |
8597 | |
8598 // Set a mock Async delegate. | |
8599 StrictMock<gpu::MockAsyncPixelTransferManager>* manager = | |
8600 new StrictMock<gpu::MockAsyncPixelTransferManager>; | |
8601 manager->Initialize(group().texture_manager()); | |
8602 decoder_->SetAsyncPixelTransferManagerForTest(manager); | |
8603 StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL; | |
8604 | |
8605 AsyncTexImage2DCHROMIUM teximage_cmd; | |
8606 teximage_cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, | |
8607 GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, | |
8608 0, 0, 0); | |
8609 | |
8610 // No transfer delegate exists initially. | |
8611 EXPECT_FALSE( | |
8612 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8613 texture_ref)); | |
8614 | |
8615 // Create delegate on AsyncTexImage2D. | |
8616 { | |
8617 EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) | |
8618 .WillOnce(Return( | |
8619 delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) | |
8620 .RetiresOnSaturation(); | |
8621 EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)).RetiresOnSaturation(); | |
8622 | |
8623 // Command succeeds. | |
8624 EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); | |
8625 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8626 } | |
8627 | |
8628 // Delegate is cached. | |
8629 EXPECT_EQ(delegate, | |
8630 decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( | |
8631 texture_ref)); | |
8632 | |
8633 // Delete delegate on manager teardown. | |
8634 { | |
8635 EXPECT_EQ(texture_ref->num_observers(), 1); | |
8636 EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); | |
8637 decoder_->ResetAsyncPixelTransferManagerForTest(); | |
8638 manager = NULL; | |
8639 | |
8640 // Texture ref still valid. | |
8641 EXPECT_EQ(texture_ref, GetTexture(client_texture_id_)); | |
8642 EXPECT_EQ(texture_ref->num_observers(), 0); | |
8643 } | |
8644 } | |
8645 | |
8646 namespace { | 949 namespace { |
8647 | 950 |
8648 class SizeOnlyMemoryTracker : public MemoryTracker { | 951 class SizeOnlyMemoryTracker : public MemoryTracker { |
8649 public: | 952 public: |
8650 SizeOnlyMemoryTracker() { | 953 SizeOnlyMemoryTracker() { |
8651 // These are the default textures. 1 for TEXTURE_2D and 6 faces for | 954 // These are the default textures. 1 for TEXTURE_2D and 6 faces for |
8652 // TEXTURE_CUBE_MAP. | 955 // TEXTURE_CUBE_MAP. |
8653 const size_t kInitialUnmanagedPoolSize = 7 * 4; | 956 const size_t kInitialUnmanagedPoolSize = 7 * 4; |
8654 const size_t kInitialManagedPoolSize = 0; | 957 const size_t kInitialManagedPoolSize = 0; |
8655 pool_infos_[MemoryTracker::kUnmanaged].initial_size = | 958 pool_infos_[MemoryTracker::kUnmanaged].initial_size = |
8656 kInitialUnmanagedPoolSize; | 959 kInitialUnmanagedPoolSize; |
8657 pool_infos_[MemoryTracker::kManaged].initial_size = | 960 pool_infos_[MemoryTracker::kManaged].initial_size = kInitialManagedPoolSize; |
8658 kInitialManagedPoolSize; | |
8659 } | 961 } |
8660 | 962 |
8661 // Ensure a certain amount of GPU memory is free. Returns true on success. | 963 // Ensure a certain amount of GPU memory is free. Returns true on success. |
8662 MOCK_METHOD1(EnsureGPUMemoryAvailable, bool(size_t size_needed)); | 964 MOCK_METHOD1(EnsureGPUMemoryAvailable, bool(size_t size_needed)); |
8663 | 965 |
8664 virtual void TrackMemoryAllocatedChange( | 966 virtual void TrackMemoryAllocatedChange(size_t old_size, |
8665 size_t old_size, size_t new_size, Pool pool) { | 967 size_t new_size, |
| 968 Pool pool) { |
8666 PoolInfo& info = pool_infos_[pool]; | 969 PoolInfo& info = pool_infos_[pool]; |
8667 info.size += new_size - old_size; | 970 info.size += new_size - old_size; |
8668 } | 971 } |
8669 | 972 |
8670 size_t GetPoolSize(Pool pool) { | 973 size_t GetPoolSize(Pool pool) { |
8671 const PoolInfo& info = pool_infos_[pool]; | 974 const PoolInfo& info = pool_infos_[pool]; |
8672 return info.size - info.initial_size; | 975 return info.size - info.initial_size; |
8673 } | 976 } |
8674 | 977 |
8675 private: | 978 private: |
8676 virtual ~SizeOnlyMemoryTracker() { | 979 virtual ~SizeOnlyMemoryTracker() {} |
8677 } | |
8678 struct PoolInfo { | 980 struct PoolInfo { |
8679 PoolInfo() | 981 PoolInfo() : initial_size(0), size(0) {} |
8680 : initial_size(0), | |
8681 size(0) { | |
8682 } | |
8683 size_t initial_size; | 982 size_t initial_size; |
8684 size_t size; | 983 size_t size; |
8685 }; | 984 }; |
8686 std::map<Pool, PoolInfo> pool_infos_; | 985 std::map<Pool, PoolInfo> pool_infos_; |
8687 }; | 986 }; |
8688 | 987 |
8689 } // anonymous namespace. | 988 } // anonymous namespace. |
8690 | 989 |
8691 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerInitialSize) { | 990 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerInitialSize) { |
8692 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = | 991 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = |
(...skipping 11 matching lines...) Expand all Loading... |
8704 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexImage2D) { | 1003 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexImage2D) { |
8705 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = | 1004 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = |
8706 new SizeOnlyMemoryTracker(); | 1005 new SizeOnlyMemoryTracker(); |
8707 set_memory_tracker(memory_tracker.get()); | 1006 set_memory_tracker(memory_tracker.get()); |
8708 InitState init; | 1007 InitState init; |
8709 init.gl_version = "3.0"; | 1008 init.gl_version = "3.0"; |
8710 init.bind_generates_resource = true; | 1009 init.bind_generates_resource = true; |
8711 InitDecoder(init); | 1010 InitDecoder(init); |
8712 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | 1011 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
8713 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) | 1012 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8714 .WillOnce(Return(true)).RetiresOnSaturation(); | 1013 .WillOnce(Return(true)) |
8715 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, | 1014 .RetiresOnSaturation(); |
8716 kSharedMemoryId, kSharedMemoryOffset); | 1015 DoTexImage2D(GL_TEXTURE_2D, |
| 1016 0, |
| 1017 GL_RGBA, |
| 1018 8, |
| 1019 4, |
| 1020 0, |
| 1021 GL_RGBA, |
| 1022 GL_UNSIGNED_BYTE, |
| 1023 kSharedMemoryId, |
| 1024 kSharedMemoryOffset); |
8717 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 1025 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8718 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64)) | 1026 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64)) |
8719 .WillOnce(Return(true)).RetiresOnSaturation(); | 1027 .WillOnce(Return(true)) |
8720 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, | 1028 .RetiresOnSaturation(); |
8721 kSharedMemoryId, kSharedMemoryOffset); | 1029 DoTexImage2D(GL_TEXTURE_2D, |
| 1030 0, |
| 1031 GL_RGBA, |
| 1032 4, |
| 1033 4, |
| 1034 0, |
| 1035 GL_RGBA, |
| 1036 GL_UNSIGNED_BYTE, |
| 1037 kSharedMemoryId, |
| 1038 kSharedMemoryOffset); |
8722 EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 1039 EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8723 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 1040 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
8724 // Check we get out of memory and no call to glTexImage2D if Ensure fails. | 1041 // Check we get out of memory and no call to glTexImage2D if Ensure fails. |
8725 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64)) | 1042 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64)) |
8726 .WillOnce(Return(false)).RetiresOnSaturation(); | 1043 .WillOnce(Return(false)) |
| 1044 .RetiresOnSaturation(); |
8727 TexImage2D cmd; | 1045 TexImage2D cmd; |
8728 cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, | 1046 cmd.Init(GL_TEXTURE_2D, |
8729 kSharedMemoryId, kSharedMemoryOffset); | 1047 0, |
| 1048 GL_RGBA, |
| 1049 4, |
| 1050 4, |
| 1051 0, |
| 1052 GL_RGBA, |
| 1053 GL_UNSIGNED_BYTE, |
| 1054 kSharedMemoryId, |
| 1055 kSharedMemoryOffset); |
8730 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 1056 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8731 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | 1057 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); |
8732 EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 1058 EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8733 } | 1059 } |
8734 | 1060 |
8735 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) { | 1061 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) { |
8736 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = | 1062 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = |
8737 new SizeOnlyMemoryTracker(); | 1063 new SizeOnlyMemoryTracker(); |
8738 set_memory_tracker(memory_tracker.get()); | 1064 set_memory_tracker(memory_tracker.get()); |
8739 InitState init; | 1065 InitState init; |
8740 init.gl_version = "3.0"; | 1066 init.gl_version = "3.0"; |
8741 init.bind_generates_resource = true; | 1067 init.bind_generates_resource = true; |
8742 InitDecoder(init); | 1068 InitDecoder(init); |
8743 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | 1069 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
8744 // Check we get out of memory and no call to glTexStorage2DEXT | 1070 // Check we get out of memory and no call to glTexStorage2DEXT |
8745 // if Ensure fails. | 1071 // if Ensure fails. |
8746 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) | 1072 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8747 .WillOnce(Return(false)).RetiresOnSaturation(); | 1073 .WillOnce(Return(false)) |
| 1074 .RetiresOnSaturation(); |
8748 TexStorage2DEXT cmd; | 1075 TexStorage2DEXT cmd; |
8749 cmd.Init(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 4); | 1076 cmd.Init(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 4); |
8750 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 1077 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8751 EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 1078 EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8752 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | 1079 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); |
8753 } | 1080 } |
8754 | 1081 |
8755 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) { | 1082 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) { |
8756 GLenum target = GL_TEXTURE_2D; | 1083 GLenum target = GL_TEXTURE_2D; |
8757 GLint level = 0; | 1084 GLint level = 0; |
8758 GLenum internal_format = GL_RGBA; | 1085 GLenum internal_format = GL_RGBA; |
8759 GLsizei width = 4; | 1086 GLsizei width = 4; |
8760 GLsizei height = 8; | 1087 GLsizei height = 8; |
8761 GLint border = 0; | 1088 GLint border = 0; |
8762 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = | 1089 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = |
8763 new SizeOnlyMemoryTracker(); | 1090 new SizeOnlyMemoryTracker(); |
8764 set_memory_tracker(memory_tracker.get()); | 1091 set_memory_tracker(memory_tracker.get()); |
8765 InitState init; | 1092 InitState init; |
8766 init.gl_version = "3.0"; | 1093 init.gl_version = "3.0"; |
8767 init.has_alpha = true; | 1094 init.has_alpha = true; |
8768 init.request_alpha = true; | 1095 init.request_alpha = true; |
8769 init.bind_generates_resource = true; | 1096 init.bind_generates_resource = true; |
8770 InitDecoder(init); | 1097 InitDecoder(init); |
8771 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | 1098 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); |
8772 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) | 1099 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8773 .WillOnce(Return(true)).RetiresOnSaturation(); | 1100 .WillOnce(Return(true)) |
| 1101 .RetiresOnSaturation(); |
8774 EXPECT_CALL(*gl_, GetError()) | 1102 EXPECT_CALL(*gl_, GetError()) |
8775 .WillOnce(Return(GL_NO_ERROR)) | 1103 .WillOnce(Return(GL_NO_ERROR)) |
8776 .WillOnce(Return(GL_NO_ERROR)) | 1104 .WillOnce(Return(GL_NO_ERROR)) |
8777 .RetiresOnSaturation(); | 1105 .RetiresOnSaturation(); |
8778 EXPECT_CALL(*gl_, CopyTexImage2D( | 1106 EXPECT_CALL(*gl_, |
8779 target, level, internal_format, 0, 0, width, height, border)) | 1107 CopyTexImage2D( |
| 1108 target, level, internal_format, 0, 0, width, height, border)) |
8780 .Times(1) | 1109 .Times(1) |
8781 .RetiresOnSaturation(); | 1110 .RetiresOnSaturation(); |
8782 CopyTexImage2D cmd; | 1111 CopyTexImage2D cmd; |
8783 cmd.Init(target, level, internal_format, 0, 0, width, height, border); | 1112 cmd.Init(target, level, internal_format, 0, 0, width, height, border); |
8784 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 1113 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8785 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 1114 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8786 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 1115 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
8787 // Check we get out of memory and no call to glCopyTexImage2D if Ensure fails. | 1116 // Check we get out of memory and no call to glCopyTexImage2D if Ensure fails. |
8788 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) | 1117 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8789 .WillOnce(Return(false)).RetiresOnSaturation(); | 1118 .WillOnce(Return(false)) |
| 1119 .RetiresOnSaturation(); |
8790 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 1120 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8791 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | 1121 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); |
8792 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 1122 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8793 } | 1123 } |
8794 | 1124 |
8795 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) { | 1125 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) { |
8796 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = | 1126 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = |
8797 new SizeOnlyMemoryTracker(); | 1127 new SizeOnlyMemoryTracker(); |
8798 set_memory_tracker(memory_tracker.get()); | 1128 set_memory_tracker(memory_tracker.get()); |
8799 InitState init; | 1129 InitState init; |
8800 init.gl_version = "3.0"; | 1130 init.gl_version = "3.0"; |
8801 init.bind_generates_resource = true; | 1131 init.bind_generates_resource = true; |
8802 InitDecoder(init); | 1132 InitDecoder(init); |
8803 DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, | 1133 DoBindRenderbuffer( |
8804 kServiceRenderbufferId); | 1134 GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); |
8805 EXPECT_CALL(*gl_, GetError()) | 1135 EXPECT_CALL(*gl_, GetError()) |
8806 .WillOnce(Return(GL_NO_ERROR)) | 1136 .WillOnce(Return(GL_NO_ERROR)) |
8807 .WillOnce(Return(GL_NO_ERROR)) | 1137 .WillOnce(Return(GL_NO_ERROR)) |
8808 .RetiresOnSaturation(); | 1138 .RetiresOnSaturation(); |
8809 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) | 1139 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8810 .WillOnce(Return(true)).RetiresOnSaturation(); | 1140 .WillOnce(Return(true)) |
8811 EXPECT_CALL(*gl_, RenderbufferStorageEXT( | 1141 .RetiresOnSaturation(); |
8812 GL_RENDERBUFFER, GL_RGBA, 8, 4)) | 1142 EXPECT_CALL(*gl_, RenderbufferStorageEXT(GL_RENDERBUFFER, GL_RGBA, 8, 4)) |
8813 .Times(1) | 1143 .Times(1) |
8814 .RetiresOnSaturation(); | 1144 .RetiresOnSaturation(); |
8815 RenderbufferStorage cmd; | 1145 RenderbufferStorage cmd; |
8816 cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 8, 4); | 1146 cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 8, 4); |
8817 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 1147 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8818 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 1148 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
8819 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 1149 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8820 // Check we get out of memory and no call to glRenderbufferStorage if Ensure | 1150 // Check we get out of memory and no call to glRenderbufferStorage if Ensure |
8821 // fails. | 1151 // fails. |
8822 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) | 1152 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8823 .WillOnce(Return(false)).RetiresOnSaturation(); | 1153 .WillOnce(Return(false)) |
| 1154 .RetiresOnSaturation(); |
8824 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 1155 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8825 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | 1156 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); |
8826 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); | 1157 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); |
8827 } | 1158 } |
8828 | 1159 |
8829 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerBufferData) { | 1160 TEST_F(GLES2DecoderManualInitTest, MemoryTrackerBufferData) { |
8830 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = | 1161 scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = |
8831 new SizeOnlyMemoryTracker(); | 1162 new SizeOnlyMemoryTracker(); |
8832 set_memory_tracker(memory_tracker.get()); | 1163 set_memory_tracker(memory_tracker.get()); |
8833 InitState init; | 1164 InitState init; |
8834 init.gl_version = "3.0"; | 1165 init.gl_version = "3.0"; |
8835 init.bind_generates_resource = true; | 1166 init.bind_generates_resource = true; |
8836 InitDecoder(init); | 1167 InitDecoder(init); |
8837 DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, | 1168 DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); |
8838 kServiceBufferId); | |
8839 EXPECT_CALL(*gl_, GetError()) | 1169 EXPECT_CALL(*gl_, GetError()) |
8840 .WillOnce(Return(GL_NO_ERROR)) | 1170 .WillOnce(Return(GL_NO_ERROR)) |
8841 .WillOnce(Return(GL_NO_ERROR)) | 1171 .WillOnce(Return(GL_NO_ERROR)) |
8842 .RetiresOnSaturation(); | 1172 .RetiresOnSaturation(); |
8843 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) | 1173 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8844 .WillOnce(Return(true)).RetiresOnSaturation(); | 1174 .WillOnce(Return(true)) |
| 1175 .RetiresOnSaturation(); |
8845 EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER, 128, _, GL_STREAM_DRAW)) | 1176 EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER, 128, _, GL_STREAM_DRAW)) |
8846 .Times(1) | 1177 .Times(1) |
8847 .RetiresOnSaturation(); | 1178 .RetiresOnSaturation(); |
8848 BufferData cmd; | 1179 BufferData cmd; |
8849 cmd.Init(GL_ARRAY_BUFFER, 128, 0, 0, GL_STREAM_DRAW); | 1180 cmd.Init(GL_ARRAY_BUFFER, 128, 0, 0, GL_STREAM_DRAW); |
8850 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 1181 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8851 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 1182 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
8852 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); | 1183 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); |
8853 // Check we get out of memory and no call to glBufferData if Ensure | 1184 // Check we get out of memory and no call to glBufferData if Ensure |
8854 // fails. | 1185 // fails. |
8855 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) | 1186 EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) |
8856 .WillOnce(Return(false)).RetiresOnSaturation(); | 1187 .WillOnce(Return(false)) |
| 1188 .RetiresOnSaturation(); |
8857 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 1189 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
8858 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); | 1190 EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); |
8859 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); | 1191 EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); |
8860 } | 1192 } |
8861 | 1193 |
8862 TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateSuccceeds) { | |
8863 const GLsizei count = 1; | |
8864 const GLenum bufs[] = { GL_COLOR_ATTACHMENT0 }; | |
8865 DrawBuffersEXTImmediate& cmd = | |
8866 *GetImmediateAs<DrawBuffersEXTImmediate>(); | |
8867 cmd.Init(count, bufs); | |
8868 | |
8869 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
8870 kServiceFramebufferId); | |
8871 EXPECT_CALL(*gl_, DrawBuffersARB(count, _)) | |
8872 .Times(1) | |
8873 .RetiresOnSaturation(); | |
8874 EXPECT_EQ(error::kNoError, | |
8875 ExecuteImmediateCmd(cmd, sizeof(bufs))); | |
8876 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8877 } | |
8878 | |
8879 TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateFails) { | |
8880 const GLsizei count = 1; | |
8881 const GLenum bufs[] = { GL_COLOR_ATTACHMENT1_EXT }; | |
8882 DrawBuffersEXTImmediate& cmd = | |
8883 *GetImmediateAs<DrawBuffersEXTImmediate>(); | |
8884 cmd.Init(count, bufs); | |
8885 | |
8886 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
8887 kServiceFramebufferId); | |
8888 EXPECT_EQ(error::kNoError, | |
8889 ExecuteImmediateCmd(cmd, sizeof(bufs))); | |
8890 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
8891 } | |
8892 | |
8893 TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateBackbuffer) { | |
8894 const GLsizei count = 1; | |
8895 const GLenum bufs[] = { GL_BACK }; | |
8896 DrawBuffersEXTImmediate& cmd = | |
8897 *GetImmediateAs<DrawBuffersEXTImmediate>(); | |
8898 cmd.Init(count, bufs); | |
8899 | |
8900 DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, | |
8901 kServiceFramebufferId); | |
8902 EXPECT_EQ(error::kNoError, | |
8903 ExecuteImmediateCmd(cmd, sizeof(bufs))); | |
8904 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
8905 | |
8906 DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); // unbind | |
8907 | |
8908 EXPECT_CALL(*gl_, DrawBuffersARB(count, _)) | |
8909 .Times(1) | |
8910 .RetiresOnSaturation(); | |
8911 | |
8912 EXPECT_EQ(error::kNoError, | |
8913 ExecuteImmediateCmd(cmd, sizeof(bufs))); | |
8914 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8915 } | |
8916 | |
8917 TEST_F(GLES2DecoderManualInitTest, InvalidateFramebufferBinding) { | |
8918 InitState init; | |
8919 init.gl_version = "opengl es 3.0"; | |
8920 InitDecoder(init); | |
8921 | |
8922 // EXPECT_EQ can't be used to compare function pointers | |
8923 EXPECT_TRUE( | |
8924 gfx::MockGLInterface::GetGLProcAddress("glInvalidateFramebuffer") == | |
8925 gfx::g_driver_gl.fn.glDiscardFramebufferEXTFn); | |
8926 EXPECT_TRUE( | |
8927 gfx::MockGLInterface::GetGLProcAddress("glInvalidateFramebuffer") != | |
8928 gfx::MockGLInterface::GetGLProcAddress("glDiscardFramebufferEXT")); | |
8929 } | |
8930 | |
8931 TEST_F(GLES2DecoderManualInitTest, DiscardFramebufferEXT) { | |
8932 InitState init; | |
8933 init.extensions = "GL_EXT_discard_framebuffer"; | |
8934 init.gl_version = "opengl es 2.0"; | |
8935 InitDecoder(init); | |
8936 | |
8937 // EXPECT_EQ can't be used to compare function pointers | |
8938 EXPECT_TRUE( | |
8939 gfx::MockGLInterface::GetGLProcAddress("glDiscardFramebufferEXT") == | |
8940 gfx::g_driver_gl.fn.glDiscardFramebufferEXTFn); | |
8941 | |
8942 const GLenum target = GL_FRAMEBUFFER; | |
8943 const GLsizei count = 1; | |
8944 const GLenum attachments[] = { GL_COLOR_ATTACHMENT0 }; | |
8945 | |
8946 SetupTexture(); | |
8947 DoBindFramebuffer( | |
8948 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
8949 DoFramebufferTexture2D(GL_FRAMEBUFFER, | |
8950 GL_COLOR_ATTACHMENT0, | |
8951 GL_TEXTURE_2D, | |
8952 client_texture_id_, | |
8953 kServiceTextureId, | |
8954 0, | |
8955 GL_NO_ERROR); | |
8956 FramebufferManager* framebuffer_manager = group().framebuffer_manager(); | |
8957 Framebuffer* framebuffer = | |
8958 framebuffer_manager->GetFramebuffer(client_framebuffer_id_); | |
8959 EXPECT_TRUE(framebuffer->IsCleared()); | |
8960 | |
8961 EXPECT_CALL(*gl_, DiscardFramebufferEXT(target, count, _)) | |
8962 .Times(1) | |
8963 .RetiresOnSaturation(); | |
8964 DiscardFramebufferEXTImmediate& cmd = | |
8965 *GetImmediateAs<DiscardFramebufferEXTImmediate>(); | |
8966 cmd.Init(target, count, attachments); | |
8967 | |
8968 EXPECT_EQ(error::kNoError, | |
8969 ExecuteImmediateCmd(cmd, sizeof(attachments))); | |
8970 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
8971 EXPECT_FALSE(framebuffer->IsCleared()); | |
8972 } | |
8973 | |
8974 TEST_F(GLES2DecoderTest, DiscardFramebufferEXTUnsupported) { | |
8975 const GLenum target = GL_FRAMEBUFFER; | |
8976 const GLsizei count = 1; | |
8977 const GLenum attachments[] = { GL_COLOR_EXT }; | |
8978 DiscardFramebufferEXTImmediate& cmd = | |
8979 *GetImmediateAs<DiscardFramebufferEXTImmediate>(); | |
8980 cmd.Init(target, count, attachments); | |
8981 | |
8982 // Should not result into a call into GL. | |
8983 EXPECT_EQ(error::kNoError, | |
8984 ExecuteImmediateCmd(cmd, sizeof(attachments))); | |
8985 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | |
8986 } | |
8987 | |
8988 TEST_F(GLES2DecoderRestoreStateTest, NullPreviousStateBGR) { | |
8989 InitState init; | |
8990 init.gl_version = "3.0"; | |
8991 init.bind_generates_resource = true; | |
8992 InitDecoder(init); | |
8993 SetupTexture(); | |
8994 | |
8995 InSequence sequence; | |
8996 // Expect to restore texture bindings for unit GL_TEXTURE0. | |
8997 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
8998 AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); | |
8999 AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, | |
9000 TestHelper::kServiceDefaultTextureCubemapId); | |
9001 | |
9002 // Expect to restore texture bindings for remaining units. | |
9003 for (uint32 i = 1; i < group().max_texture_units() ; ++i) { | |
9004 AddExpectationsForActiveTexture(GL_TEXTURE0 + i); | |
9005 AddExpectationsForBindTexture(GL_TEXTURE_2D, | |
9006 TestHelper::kServiceDefaultTexture2dId); | |
9007 AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, | |
9008 TestHelper::kServiceDefaultTextureCubemapId); | |
9009 } | |
9010 | |
9011 // Expect to restore the active texture unit to GL_TEXTURE0. | |
9012 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9013 | |
9014 GetDecoder()->RestoreAllTextureUnitBindings(NULL); | |
9015 } | |
9016 | |
9017 TEST_F(GLES2DecoderRestoreStateTest, NullPreviousState) { | |
9018 InitState init; | |
9019 init.gl_version = "3.0"; | |
9020 InitDecoder(init); | |
9021 SetupTexture(); | |
9022 | |
9023 InSequence sequence; | |
9024 // Expect to restore texture bindings for unit GL_TEXTURE0. | |
9025 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9026 AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); | |
9027 AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0); | |
9028 | |
9029 // Expect to restore texture bindings for remaining units. | |
9030 for (uint32 i = 1; i < group().max_texture_units(); ++i) { | |
9031 AddExpectationsForActiveTexture(GL_TEXTURE0 + i); | |
9032 AddExpectationsForBindTexture(GL_TEXTURE_2D, 0); | |
9033 AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0); | |
9034 } | |
9035 | |
9036 // Expect to restore the active texture unit to GL_TEXTURE0. | |
9037 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9038 | |
9039 GetDecoder()->RestoreAllTextureUnitBindings(NULL); | |
9040 } | |
9041 | |
9042 TEST_F(GLES2DecoderRestoreStateTest, WithPreviousStateBGR) { | |
9043 InitState init; | |
9044 init.gl_version = "3.0"; | |
9045 init.bind_generates_resource = true; | |
9046 InitDecoder(init); | |
9047 SetupTexture(); | |
9048 | |
9049 // Construct a previous ContextState with all texture bindings | |
9050 // set to default textures. | |
9051 ContextState prev_state(NULL, NULL, NULL); | |
9052 InitializeContextState(&prev_state, std::numeric_limits<uint32>::max(), 0); | |
9053 | |
9054 InSequence sequence; | |
9055 // Expect to restore only GL_TEXTURE_2D binding for GL_TEXTURE0 unit, | |
9056 // since the rest of the bindings haven't changed between the current | |
9057 // state and the |prev_state|. | |
9058 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9059 AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); | |
9060 | |
9061 // Expect to restore active texture unit to GL_TEXTURE0. | |
9062 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9063 | |
9064 GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); | |
9065 } | |
9066 | |
9067 TEST_F(GLES2DecoderRestoreStateTest, WithPreviousState) { | |
9068 InitState init; | |
9069 init.gl_version = "3.0"; | |
9070 InitDecoder(init); | |
9071 SetupTexture(); | |
9072 | |
9073 // Construct a previous ContextState with all texture bindings | |
9074 // set to default textures. | |
9075 ContextState prev_state(NULL, NULL, NULL); | |
9076 InitializeContextState(&prev_state, std::numeric_limits<uint32>::max(), 0); | |
9077 | |
9078 InSequence sequence; | |
9079 // Expect to restore only GL_TEXTURE_2D binding for GL_TEXTURE0 unit, | |
9080 // since the rest of the bindings haven't changed between the current | |
9081 // state and the |prev_state|. | |
9082 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9083 AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); | |
9084 | |
9085 // Expect to restore active texture unit to GL_TEXTURE0. | |
9086 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9087 | |
9088 GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); | |
9089 } | |
9090 | |
9091 TEST_F(GLES2DecoderRestoreStateTest, ActiveUnit1) { | |
9092 InitState init; | |
9093 init.gl_version = "3.0"; | |
9094 InitDecoder(init); | |
9095 | |
9096 // Bind a non-default texture to GL_TEXTURE1 unit. | |
9097 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1)); | |
9098 ActiveTexture cmd; | |
9099 cmd.Init(GL_TEXTURE1); | |
9100 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
9101 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
9102 SetupTexture(); | |
9103 | |
9104 // Construct a previous ContextState with all texture bindings | |
9105 // set to default textures. | |
9106 ContextState prev_state(NULL, NULL, NULL); | |
9107 InitializeContextState(&prev_state, std::numeric_limits<uint32>::max(), 0); | |
9108 | |
9109 InSequence sequence; | |
9110 // Expect to restore only GL_TEXTURE_2D binding for GL_TEXTURE1 unit, | |
9111 // since the rest of the bindings haven't changed between the current | |
9112 // state and the |prev_state|. | |
9113 AddExpectationsForActiveTexture(GL_TEXTURE1); | |
9114 AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); | |
9115 | |
9116 // Expect to restore active texture unit to GL_TEXTURE1. | |
9117 AddExpectationsForActiveTexture(GL_TEXTURE1); | |
9118 | |
9119 GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); | |
9120 } | |
9121 | |
9122 TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit0BGR) { | |
9123 InitState init; | |
9124 init.gl_version = "3.0"; | |
9125 init.bind_generates_resource = true; | |
9126 InitDecoder(init); | |
9127 | |
9128 // Bind a non-default texture to GL_TEXTURE1 unit. | |
9129 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1)); | |
9130 SpecializedSetup<ActiveTexture, 0>(true); | |
9131 ActiveTexture cmd; | |
9132 cmd.Init(GL_TEXTURE1); | |
9133 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
9134 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
9135 SetupTexture(); | |
9136 | |
9137 // Construct a previous ContextState with GL_TEXTURE_2D target in | |
9138 // GL_TEXTURE0 unit bound to a non-default texture and the rest | |
9139 // set to default textures. | |
9140 ContextState prev_state(NULL, NULL, NULL); | |
9141 InitializeContextState(&prev_state, 0, kServiceTextureId); | |
9142 | |
9143 InSequence sequence; | |
9144 // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE0 unit to | |
9145 // a default texture. | |
9146 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9147 AddExpectationsForBindTexture(GL_TEXTURE_2D, | |
9148 TestHelper::kServiceDefaultTexture2dId); | |
9149 | |
9150 // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE1 unit to | |
9151 // non-default. | |
9152 AddExpectationsForActiveTexture(GL_TEXTURE1); | |
9153 AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); | |
9154 | |
9155 // Expect to restore active texture unit to GL_TEXTURE1. | |
9156 AddExpectationsForActiveTexture(GL_TEXTURE1); | |
9157 | |
9158 GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); | |
9159 } | |
9160 | |
9161 TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit1BGR) { | |
9162 InitState init; | |
9163 init.gl_version = "3.0"; | |
9164 init.bind_generates_resource = true; | |
9165 InitDecoder(init); | |
9166 | |
9167 // Bind a non-default texture to GL_TEXTURE0 unit. | |
9168 SetupTexture(); | |
9169 | |
9170 // Construct a previous ContextState with GL_TEXTURE_2D target in | |
9171 // GL_TEXTURE1 unit bound to a non-default texture and the rest | |
9172 // set to default textures. | |
9173 ContextState prev_state(NULL, NULL, NULL); | |
9174 InitializeContextState(&prev_state, 1, kServiceTextureId); | |
9175 | |
9176 InSequence sequence; | |
9177 // Expect to restore GL_TEXTURE_2D binding to the non-default texture | |
9178 // for GL_TEXTURE0 unit. | |
9179 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9180 AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); | |
9181 | |
9182 // Expect to restore GL_TEXTURE_2D binding to the default texture | |
9183 // for GL_TEXTURE1 unit. | |
9184 AddExpectationsForActiveTexture(GL_TEXTURE1); | |
9185 AddExpectationsForBindTexture(GL_TEXTURE_2D, | |
9186 TestHelper::kServiceDefaultTexture2dId); | |
9187 | |
9188 // Expect to restore active texture unit to GL_TEXTURE0. | |
9189 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9190 | |
9191 GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); | |
9192 } | |
9193 | |
9194 TEST_F(GLES2DecoderRestoreStateTest, DefaultUnit0) { | |
9195 InitState init; | |
9196 init.gl_version = "3.0"; | |
9197 InitDecoder(init); | |
9198 | |
9199 // Bind a non-default texture to GL_TEXTURE1 unit. | |
9200 EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1)); | |
9201 SpecializedSetup<ActiveTexture, 0>(true); | |
9202 ActiveTexture cmd; | |
9203 cmd.Init(GL_TEXTURE1); | |
9204 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
9205 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
9206 SetupTexture(); | |
9207 | |
9208 // Construct a previous ContextState with GL_TEXTURE_2D target in | |
9209 // GL_TEXTURE0 unit bound to a non-default texture and the rest | |
9210 // set to default textures. | |
9211 ContextState prev_state(NULL, NULL, NULL); | |
9212 InitializeContextState(&prev_state, 0, kServiceTextureId); | |
9213 | |
9214 InSequence sequence; | |
9215 // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE0 unit to | |
9216 // the 0 texture. | |
9217 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9218 AddExpectationsForBindTexture(GL_TEXTURE_2D, 0); | |
9219 | |
9220 // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE1 unit to | |
9221 // non-default. | |
9222 AddExpectationsForActiveTexture(GL_TEXTURE1); | |
9223 AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); | |
9224 | |
9225 // Expect to restore active texture unit to GL_TEXTURE1. | |
9226 AddExpectationsForActiveTexture(GL_TEXTURE1); | |
9227 | |
9228 GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); | |
9229 } | |
9230 | |
9231 TEST_F(GLES2DecoderRestoreStateTest, DefaultUnit1) { | |
9232 InitState init; | |
9233 init.gl_version = "3.0"; | |
9234 InitDecoder(init); | |
9235 | |
9236 // Bind a non-default texture to GL_TEXTURE0 unit. | |
9237 SetupTexture(); | |
9238 | |
9239 // Construct a previous ContextState with GL_TEXTURE_2D target in | |
9240 // GL_TEXTURE1 unit bound to a non-default texture and the rest | |
9241 // set to default textures. | |
9242 ContextState prev_state(NULL, NULL, NULL); | |
9243 InitializeContextState(&prev_state, 1, kServiceTextureId); | |
9244 | |
9245 InSequence sequence; | |
9246 // Expect to restore GL_TEXTURE_2D binding to the non-default texture | |
9247 // for GL_TEXTURE0 unit. | |
9248 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9249 AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); | |
9250 | |
9251 // Expect to restore GL_TEXTURE_2D binding to the 0 texture | |
9252 // for GL_TEXTURE1 unit. | |
9253 AddExpectationsForActiveTexture(GL_TEXTURE1); | |
9254 AddExpectationsForBindTexture(GL_TEXTURE_2D, 0); | |
9255 | |
9256 // Expect to restore active texture unit to GL_TEXTURE0. | |
9257 AddExpectationsForActiveTexture(GL_TEXTURE0); | |
9258 | |
9259 GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); | |
9260 } | |
9261 | |
9262 // TODO(vmiura): Tests for VAO restore. | |
9263 | |
9264 // TODO(vmiura): Tests for ContextState::RestoreAttribute(). | |
9265 | |
9266 // TODO(vmiura): Tests for ContextState::RestoreBufferBindings(). | |
9267 | |
9268 // TODO(vmiura): Tests for ContextState::RestoreProgramBindings(). | |
9269 | |
9270 // TODO(vmiura): Tests for RestoreRenderbufferBindings(). | |
9271 | |
9272 // TODO(vmiura): Tests for RestoreProgramBindings(). | |
9273 | |
9274 // TODO(vmiura): Tests for RestoreGlobalState(). | |
9275 | |
9276 TEST_F(GLES2DecoderManualInitTest, ClearUniformsBeforeFirstProgramUse) { | |
9277 CommandLine command_line(0, NULL); | |
9278 command_line.AppendSwitchASCII( | |
9279 switches::kGpuDriverBugWorkarounds, | |
9280 base::IntToString(gpu::CLEAR_UNIFORMS_BEFORE_FIRST_PROGRAM_USE)); | |
9281 InitState init; | |
9282 init.gl_version = "3.0"; | |
9283 init.has_alpha = true; | |
9284 init.request_alpha = true; | |
9285 init.bind_generates_resource = true; | |
9286 InitDecoderWithCommandLine(init, &command_line); | |
9287 { | |
9288 static AttribInfo attribs[] = { | |
9289 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, | |
9290 { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, }, | |
9291 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, | |
9292 }; | |
9293 static UniformInfo uniforms[] = { | |
9294 { kUniform1Name, kUniform1Size, kUniform1Type, | |
9295 kUniform1FakeLocation, kUniform1RealLocation, | |
9296 kUniform1DesiredLocation }, | |
9297 { kUniform2Name, kUniform2Size, kUniform2Type, | |
9298 kUniform2FakeLocation, kUniform2RealLocation, | |
9299 kUniform2DesiredLocation }, | |
9300 { kUniform3Name, kUniform3Size, kUniform3Type, | |
9301 kUniform3FakeLocation, kUniform3RealLocation, | |
9302 kUniform3DesiredLocation }, | |
9303 }; | |
9304 SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms), | |
9305 client_program_id_, kServiceProgramId, | |
9306 client_vertex_shader_id_, kServiceVertexShaderId, | |
9307 client_fragment_shader_id_, kServiceFragmentShaderId); | |
9308 TestHelper::SetupExpectationsForClearingUniforms( | |
9309 gl_.get(), uniforms, arraysize(uniforms)); | |
9310 } | |
9311 | |
9312 { | |
9313 EXPECT_CALL(*gl_, UseProgram(kServiceProgramId)) | |
9314 .Times(1) | |
9315 .RetiresOnSaturation(); | |
9316 cmds::UseProgram cmd; | |
9317 cmd.Init(client_program_id_); | |
9318 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
9319 } | |
9320 } | |
9321 | |
9322 TEST_F(GLES2DecoderManualInitTest, TexImage2DFloatOnGLES2) { | |
9323 InitState init; | |
9324 init.extensions = "GL_OES_texture_float"; | |
9325 init.gl_version = "opengl es 2.0"; | |
9326 InitDecoder(init); | |
9327 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
9328 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0); | |
9329 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0); | |
9330 DoTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0, GL_LUMINANCE, | |
9331 GL_FLOAT, 0, 0); | |
9332 DoTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0, GL_ALPHA, GL_FLOAT, | |
9333 0, 0); | |
9334 DoTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 16, 17, 0, | |
9335 GL_LUMINANCE_ALPHA, GL_FLOAT, 0, 0); | |
9336 } | |
9337 | |
9338 TEST_F(GLES2DecoderManualInitTest, TexImage2DFloatOnGLES3) { | |
9339 InitState init; | |
9340 init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float"; | |
9341 init.gl_version = "opengl es 3.0"; | |
9342 InitDecoder(init); | |
9343 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
9344 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0); | |
9345 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0); | |
9346 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, | |
9347 0); | |
9348 DoTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0, GL_LUMINANCE, | |
9349 GL_FLOAT, 0, 0); | |
9350 DoTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0, GL_ALPHA, GL_FLOAT, | |
9351 0, 0); | |
9352 DoTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 16, 17, 0, | |
9353 GL_LUMINANCE_ALPHA, GL_FLOAT, 0, 0); | |
9354 } | |
9355 | |
9356 TEST_F(GLES2DecoderManualInitTest, TexSubImage2DFloatOnGLES3) { | |
9357 InitState init; | |
9358 init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float"; | |
9359 init.gl_version = "opengl es 3.0"; | |
9360 InitDecoder(init); | |
9361 const int kWidth = 8; | |
9362 const int kHeight = 4; | |
9363 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
9364 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, kWidth, kHeight, 0, GL_RGBA, | |
9365 GL_FLOAT, 0, 0); | |
9366 EXPECT_CALL(*gl_, TexImage2D( | |
9367 GL_TEXTURE_2D, 0, GL_RGBA32F, kWidth, kHeight, 0, GL_RGBA, GL_FLOAT, | |
9368 shared_memory_address_)) | |
9369 .Times(1) | |
9370 .RetiresOnSaturation(); | |
9371 TexSubImage2D cmd; | |
9372 cmd.Init( | |
9373 GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_RGBA, GL_FLOAT, | |
9374 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
9375 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
9376 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
9377 } | |
9378 | |
9379 TEST_F(GLES2DecoderManualInitTest, TexSubImage2DFloatDoesClearOnGLES3) { | |
9380 InitState init; | |
9381 init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float"; | |
9382 init.gl_version = "opengl es 3.0"; | |
9383 InitDecoder(init); | |
9384 const int kWidth = 8; | |
9385 const int kHeight = 4; | |
9386 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
9387 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, kWidth, kHeight, 0, GL_RGBA, | |
9388 GL_FLOAT, 0, 0); | |
9389 SetupClearTextureExpectations( | |
9390 kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, | |
9391 0, GL_RGBA32F, GL_RGBA, GL_FLOAT, kWidth, kHeight); | |
9392 EXPECT_CALL(*gl_, TexSubImage2D( | |
9393 GL_TEXTURE_2D, 0, 1, 0, kWidth - 1, kHeight, GL_RGBA, GL_FLOAT, | |
9394 shared_memory_address_)) | |
9395 .Times(1) | |
9396 .RetiresOnSaturation(); | |
9397 TexSubImage2D cmd; | |
9398 cmd.Init( | |
9399 GL_TEXTURE_2D, 0, 1, 0, kWidth - 1, kHeight, GL_RGBA, GL_FLOAT, | |
9400 kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); | |
9401 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
9402 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
9403 } | |
9404 | |
9405 TEST_F(GLES2DecoderManualInitTest, TexImage2DFloatConvertsFormatDesktop) { | |
9406 InitState init; | |
9407 init.extensions = "GL_ARB_texture_float"; | |
9408 init.gl_version = "2.1"; | |
9409 InitDecoder(init); | |
9410 DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); | |
9411 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, | |
9412 0); | |
9413 DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0); | |
9414 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, | |
9415 GL_RGBA, GL_FLOAT, 0, 0, GL_RGBA32F_ARB); | |
9416 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0, | |
9417 GL_RGB, GL_FLOAT, 0, 0, GL_RGB32F_ARB); | |
9418 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0, | |
9419 GL_LUMINANCE, GL_FLOAT, 0, 0, | |
9420 GL_LUMINANCE32F_ARB); | |
9421 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0, | |
9422 GL_ALPHA, GL_FLOAT, 0, 0, GL_ALPHA32F_ARB); | |
9423 DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 16, | |
9424 17, 0, GL_LUMINANCE_ALPHA, GL_FLOAT, 0, 0, | |
9425 GL_LUMINANCE_ALPHA32F_ARB); | |
9426 } | |
9427 | |
9428 TEST_F(GLES2DecoderManualInitTest, ReadFormatExtension) { | |
9429 InitState init; | |
9430 init.extensions = "GL_OES_read_format"; | |
9431 init.gl_version = "2.1"; | |
9432 init.bind_generates_resource = true; | |
9433 InitDecoder(init); | |
9434 | |
9435 EXPECT_CALL(*gl_, GetError()) | |
9436 .WillOnce(Return(GL_NO_ERROR)) | |
9437 .WillOnce(Return(GL_NO_ERROR)) | |
9438 .WillOnce(Return(GL_NO_ERROR)) | |
9439 .WillOnce(Return(GL_NO_ERROR)) | |
9440 .RetiresOnSaturation(); | |
9441 EXPECT_CALL(*gl_, GetError()) | |
9442 .Times(6) | |
9443 .RetiresOnSaturation(); | |
9444 | |
9445 typedef GetIntegerv::Result Result; | |
9446 Result* result = static_cast<Result*>(shared_memory_address_); | |
9447 GetIntegerv cmd; | |
9448 const GLuint kFBOClientTextureId = 4100; | |
9449 const GLuint kFBOServiceTextureId = 4101; | |
9450 | |
9451 // Register a texture id. | |
9452 EXPECT_CALL(*gl_, GenTextures(_, _)) | |
9453 .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) | |
9454 .RetiresOnSaturation(); | |
9455 GenHelper<GenTexturesImmediate>(kFBOClientTextureId); | |
9456 | |
9457 // Setup "render to" texture. | |
9458 DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); | |
9459 DoTexImage2D( | |
9460 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); | |
9461 DoBindFramebuffer( | |
9462 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
9463 DoFramebufferTexture2D( | |
9464 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
9465 kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); | |
9466 | |
9467 result->size = 0; | |
9468 EXPECT_CALL(*gl_, GetIntegerv(_, _)) | |
9469 .Times(1) | |
9470 .RetiresOnSaturation(); | |
9471 cmd.Init( | |
9472 GL_IMPLEMENTATION_COLOR_READ_FORMAT, | |
9473 shared_memory_id_, shared_memory_offset_); | |
9474 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
9475 EXPECT_EQ(1, result->GetNumResults()); | |
9476 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
9477 | |
9478 result->size = 0; | |
9479 EXPECT_CALL(*gl_, GetIntegerv(_, _)) | |
9480 .Times(1) | |
9481 .RetiresOnSaturation(); | |
9482 cmd.Init( | |
9483 GL_IMPLEMENTATION_COLOR_READ_TYPE, | |
9484 shared_memory_id_, shared_memory_offset_); | |
9485 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
9486 EXPECT_EQ(1, result->GetNumResults()); | |
9487 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
9488 } | |
9489 | |
9490 TEST_F(GLES2DecoderManualInitTest, NoReadFormatExtension) { | |
9491 InitState init; | |
9492 init.gl_version = "2.1"; | |
9493 init.bind_generates_resource = true; | |
9494 InitDecoder(init); | |
9495 | |
9496 EXPECT_CALL(*gl_, GetError()) | |
9497 .WillOnce(Return(GL_NO_ERROR)) | |
9498 .WillOnce(Return(GL_NO_ERROR)) | |
9499 .WillOnce(Return(GL_NO_ERROR)) | |
9500 .WillOnce(Return(GL_NO_ERROR)) | |
9501 .RetiresOnSaturation(); | |
9502 | |
9503 typedef GetIntegerv::Result Result; | |
9504 Result* result = static_cast<Result*>(shared_memory_address_); | |
9505 GetIntegerv cmd; | |
9506 const GLuint kFBOClientTextureId = 4100; | |
9507 const GLuint kFBOServiceTextureId = 4101; | |
9508 | |
9509 // Register a texture id. | |
9510 EXPECT_CALL(*gl_, GenTextures(_, _)) | |
9511 .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) | |
9512 .RetiresOnSaturation(); | |
9513 GenHelper<GenTexturesImmediate>(kFBOClientTextureId); | |
9514 | |
9515 // Setup "render to" texture. | |
9516 DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); | |
9517 DoTexImage2D( | |
9518 GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); | |
9519 DoBindFramebuffer( | |
9520 GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); | |
9521 DoFramebufferTexture2D( | |
9522 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, | |
9523 kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); | |
9524 | |
9525 result->size = 0; | |
9526 EXPECT_CALL(*gl_, GetIntegerv(_, _)) | |
9527 .Times(0) | |
9528 .RetiresOnSaturation(); | |
9529 cmd.Init( | |
9530 GL_IMPLEMENTATION_COLOR_READ_FORMAT, | |
9531 shared_memory_id_, shared_memory_offset_); | |
9532 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
9533 EXPECT_EQ(1, result->GetNumResults()); | |
9534 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
9535 | |
9536 result->size = 0; | |
9537 EXPECT_CALL(*gl_, GetIntegerv(_, _)) | |
9538 .Times(0) | |
9539 .RetiresOnSaturation(); | |
9540 cmd.Init( | |
9541 GL_IMPLEMENTATION_COLOR_READ_TYPE, | |
9542 shared_memory_id_, shared_memory_offset_); | |
9543 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | |
9544 EXPECT_EQ(1, result->GetNumResults()); | |
9545 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | |
9546 } | |
9547 | |
9548 // TODO(gman): Complete this test. | |
9549 // TEST_F(GLES2DecoderTest, CompressedTexImage2DGLError) { | |
9550 // } | |
9551 | |
9552 // TODO(gman): BufferData | |
9553 | |
9554 // TODO(gman): BufferDataImmediate | |
9555 | |
9556 // TODO(gman): BufferSubData | |
9557 | |
9558 // TODO(gman): BufferSubDataImmediate | |
9559 | |
9560 // TODO(gman): CompressedTexImage2D | |
9561 | |
9562 // TODO(gman): CompressedTexImage2DImmediate | |
9563 | |
9564 // TODO(gman): CompressedTexSubImage2DImmediate | |
9565 | |
9566 // TODO(gman): DeleteProgram | |
9567 | |
9568 // TODO(gman): DeleteShader | |
9569 | |
9570 // TODO(gman): PixelStorei | |
9571 | |
9572 // TODO(gman): TexImage2D | |
9573 | |
9574 // TODO(gman): TexImage2DImmediate | |
9575 | |
9576 // TODO(gman): TexSubImage2DImmediate | |
9577 | |
9578 // TODO(gman): UseProgram | |
9579 | |
9580 // TODO(gman): SwapBuffers | |
9581 | |
9582 } // namespace gles2 | 1194 } // namespace gles2 |
9583 } // namespace gpu | 1195 } // namespace gpu |
OLD | NEW |