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
3 // found in the LICENSE file.
5 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/string_split.h"
13 #include "gpu/command_buffer/common/gles2_cmd_format.h"
14 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
15 #include "gpu/command_buffer/service/cmd_buffer_engine.h"
16 #include "gpu/command_buffer/service/context_group.h"
17 #include "gpu/command_buffer/service/logger.h"
18 #include "gpu/command_buffer/service/mailbox_manager.h"
19 #include "gpu/command_buffer/service/program_manager.h"
20 #include "gpu/command_buffer/service/test_helper.h"
21 #include "gpu/command_buffer/service/vertex_attrib_manager.h"
22 #include "testing/gtest/include/gtest/gtest.h"
23 #include "ui/gl/gl_implementation.h"
24 #include "ui/gl/gl_mock.h"
25 #include "ui/gl/gl_surface.h"
27 using ::gfx::MockGLInterface
;
29 using ::testing::DoAll
;
30 using ::testing::InSequence
;
31 using ::testing::Invoke
;
32 using ::testing::InvokeWithoutArgs
;
33 using ::testing::MatcherCast
;
34 using ::testing::Pointee
;
35 using ::testing::Return
;
36 using ::testing::SetArrayArgument
;
37 using ::testing::SetArgPointee
;
38 using ::testing::SetArgumentPointee
;
39 using ::testing::StrEq
;
40 using ::testing::StrictMock
;
41 using ::testing::WithArg
;
45 void NormalizeInitState(gpu::gles2::GLES2DecoderTestBase::InitState
* init
) {
47 const char* kVAOExtensions
[] = {
48 "GL_OES_vertex_array_object",
49 "GL_ARB_vertex_array_object",
50 "GL_APPLE_vertex_array_object"
52 bool contains_vao_extension
= false;
53 for (size_t ii
= 0; ii
< arraysize(kVAOExtensions
); ++ii
) {
54 if (init
->extensions
.find(kVAOExtensions
[ii
]) != std::string::npos
) {
55 contains_vao_extension
= true;
59 if (init
->use_native_vao
) {
60 if (contains_vao_extension
)
62 if (!init
->extensions
.empty())
63 init
->extensions
+= " ";
64 if (StartsWithASCII(init
->gl_version
, "opengl es", false)) {
65 init
->extensions
+= kVAOExtensions
[0];
67 #if !defined(OS_MACOSX)
68 init
->extensions
+= kVAOExtensions
[1];
70 init
->extensions
+= kVAOExtensions
[2];
74 // Make sure we don't set up an invalid InitState.
75 CHECK(!contains_vao_extension
);
79 } // namespace Anonymous
84 GLES2DecoderTestBase::GLES2DecoderTestBase()
87 memory_tracker_(NULL
),
88 client_buffer_id_(100),
89 client_framebuffer_id_(101),
90 client_program_id_(102),
91 client_renderbuffer_id_(103),
92 client_shader_id_(104),
93 client_texture_id_(106),
94 client_element_buffer_id_(107),
95 client_vertex_shader_id_(121),
96 client_fragment_shader_id_(122),
97 client_query_id_(123),
98 client_vertexarray_id_(124),
99 service_renderbuffer_id_(0),
100 service_renderbuffer_valid_(false),
101 ignore_cached_state_for_test_(GetParam()),
102 cached_color_mask_red_(true),
103 cached_color_mask_green_(true),
104 cached_color_mask_blue_(true),
105 cached_color_mask_alpha_(true),
106 cached_depth_mask_(true),
107 cached_stencil_front_mask_(static_cast<GLuint
>(-1)),
108 cached_stencil_back_mask_(static_cast<GLuint
>(-1)) {
109 memset(immediate_buffer_
, 0xEE, sizeof(immediate_buffer_
));
112 GLES2DecoderTestBase::~GLES2DecoderTestBase() {}
114 void GLES2DecoderTestBase::SetUp() {
116 init
.gl_version
= "3.0";
117 init
.has_alpha
= true;
118 init
.has_depth
= true;
119 init
.request_alpha
= true;
120 init
.request_depth
= true;
121 init
.bind_generates_resource
= true;
125 void GLES2DecoderTestBase::AddExpectationsForVertexAttribManager() {
126 for (GLint ii
= 0; ii
< kNumVertexAttribs
; ++ii
) {
127 EXPECT_CALL(*gl_
, VertexAttrib4f(ii
, 0.0f
, 0.0f
, 0.0f
, 1.0f
))
129 .RetiresOnSaturation();
133 GLES2DecoderTestBase::InitState::InitState()
137 request_alpha(false),
138 request_depth(false),
139 request_stencil(false),
140 bind_generates_resource(false),
141 lose_context_when_out_of_memory(false),
142 use_native_vao(true) {
145 void GLES2DecoderTestBase::InitDecoder(const InitState
& init
) {
146 InitDecoderWithCommandLine(init
, NULL
);
149 void GLES2DecoderTestBase::InitDecoderWithCommandLine(
150 const InitState
& init
,
151 const base::CommandLine
* command_line
) {
152 InitState normalized_init
= init
;
153 NormalizeInitState(&normalized_init
);
154 Framebuffer::ClearFramebufferCompleteComboMap();
156 gfx::SetGLGetProcAddressProc(gfx::MockGLInterface::GetGLProcAddress
);
157 gfx::GLSurface::InitializeOneOffWithMockBindingsForTests();
159 gl_
.reset(new StrictMock
<MockGLInterface
>());
160 ::gfx::MockGLInterface::SetGLInterface(gl_
.get());
162 SetupMockGLBehaviors();
164 // Only create stream texture manager if extension is requested.
165 std::vector
<std::string
> list
;
166 base::SplitString(normalized_init
.extensions
, ' ', &list
);
167 scoped_refptr
<FeatureInfo
> feature_info
;
169 feature_info
= new FeatureInfo(*command_line
);
170 group_
= scoped_refptr
<ContextGroup
>(
171 new ContextGroup(NULL
,
173 new ShaderTranslatorCache
,
175 normalized_init
.bind_generates_resource
));
176 bool use_default_textures
= normalized_init
.bind_generates_resource
;
180 surface_
= new gfx::GLSurfaceStub
;
181 surface_
->SetSize(gfx::Size(kBackBufferWidth
, kBackBufferHeight
));
183 // Context needs to be created before initializing ContextGroup, which will
184 // in turn initialize FeatureInfo, which needs a context to determine
185 // extension support.
186 context_
= new gfx::GLContextStubWithExtensions
;
187 context_
->AddExtensionsString(normalized_init
.extensions
.c_str());
188 context_
->SetGLVersionString(normalized_init
.gl_version
.c_str());
190 context_
->MakeCurrent(surface_
.get());
191 gfx::GLSurface::InitializeDynamicMockBindingsForTests(context_
.get());
193 TestHelper::SetupContextGroupInitExpectations(
195 DisallowedFeatures(),
196 normalized_init
.extensions
.c_str(),
197 normalized_init
.gl_version
.c_str(),
198 normalized_init
.bind_generates_resource
);
200 // We initialize the ContextGroup with a MockGLES2Decoder so that
201 // we can use the ContextGroup to figure out how the real GLES2Decoder
202 // will initialize itself.
203 mock_decoder_
.reset(new MockGLES2Decoder());
205 // Install FakeDoCommands handler so we can use individual DoCommand()
207 EXPECT_CALL(*mock_decoder_
, DoCommands(_
, _
, _
, _
)).WillRepeatedly(
208 Invoke(mock_decoder_
.get(), &MockGLES2Decoder::FakeDoCommands
));
211 group_
->Initialize(mock_decoder_
.get(), DisallowedFeatures()));
213 if (group_
->feature_info()->feature_flags().native_vertex_array_object
) {
214 EXPECT_CALL(*gl_
, GenVertexArraysOES(1, _
))
215 .WillOnce(SetArgumentPointee
<1>(kServiceVertexArrayId
))
216 .RetiresOnSaturation();
217 EXPECT_CALL(*gl_
, BindVertexArrayOES(_
)).Times(1).RetiresOnSaturation();
220 if (group_
->feature_info()->workarounds().init_vertex_attributes
)
221 AddExpectationsForVertexAttribManager();
223 AddExpectationsForBindVertexArrayOES();
225 EXPECT_CALL(*gl_
, EnableVertexAttribArray(0))
227 .RetiresOnSaturation();
228 static GLuint attrib_0_id
[] = {
229 kServiceAttrib0BufferId
,
231 static GLuint fixed_attrib_buffer_id
[] = {
232 kServiceFixedAttribBufferId
,
234 EXPECT_CALL(*gl_
, GenBuffersARB(arraysize(attrib_0_id
), _
))
235 .WillOnce(SetArrayArgument
<1>(attrib_0_id
,
236 attrib_0_id
+ arraysize(attrib_0_id
)))
237 .RetiresOnSaturation();
238 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, kServiceAttrib0BufferId
))
240 .RetiresOnSaturation();
241 EXPECT_CALL(*gl_
, VertexAttribPointer(0, 1, GL_FLOAT
, GL_FALSE
, 0, NULL
))
243 .RetiresOnSaturation();
244 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, 0))
246 .RetiresOnSaturation();
247 EXPECT_CALL(*gl_
, GenBuffersARB(arraysize(fixed_attrib_buffer_id
), _
))
248 .WillOnce(SetArrayArgument
<1>(
249 fixed_attrib_buffer_id
,
250 fixed_attrib_buffer_id
+ arraysize(fixed_attrib_buffer_id
)))
251 .RetiresOnSaturation();
253 for (GLint tt
= 0; tt
< TestHelper::kNumTextureUnits
; ++tt
) {
254 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
+ tt
))
256 .RetiresOnSaturation();
257 if (group_
->feature_info()->feature_flags().oes_egl_image_external
) {
259 BindTexture(GL_TEXTURE_EXTERNAL_OES
,
261 ? TestHelper::kServiceDefaultExternalTextureId
264 .RetiresOnSaturation();
266 if (group_
->feature_info()->feature_flags().arb_texture_rectangle
) {
269 BindTexture(GL_TEXTURE_RECTANGLE_ARB
,
271 ? TestHelper::kServiceDefaultRectangleTextureId
274 .RetiresOnSaturation();
277 BindTexture(GL_TEXTURE_CUBE_MAP
,
279 ? TestHelper::kServiceDefaultTextureCubemapId
282 .RetiresOnSaturation();
287 use_default_textures
? TestHelper::kServiceDefaultTexture2dId
: 0))
289 .RetiresOnSaturation();
291 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
))
293 .RetiresOnSaturation();
295 EXPECT_CALL(*gl_
, BindFramebufferEXT(GL_FRAMEBUFFER
, 0))
297 .RetiresOnSaturation();
298 EXPECT_CALL(*gl_
, GetIntegerv(GL_ALPHA_BITS
, _
))
299 .WillOnce(SetArgumentPointee
<1>(normalized_init
.has_alpha
? 8 : 0))
300 .RetiresOnSaturation();
301 EXPECT_CALL(*gl_
, GetIntegerv(GL_DEPTH_BITS
, _
))
302 .WillOnce(SetArgumentPointee
<1>(normalized_init
.has_depth
? 24 : 0))
303 .RetiresOnSaturation();
304 EXPECT_CALL(*gl_
, GetIntegerv(GL_STENCIL_BITS
, _
))
305 .WillOnce(SetArgumentPointee
<1>(normalized_init
.has_stencil
? 8 : 0))
306 .RetiresOnSaturation();
308 EXPECT_CALL(*gl_
, Enable(GL_VERTEX_PROGRAM_POINT_SIZE
))
310 .RetiresOnSaturation();
312 EXPECT_CALL(*gl_
, Enable(GL_POINT_SPRITE
))
314 .RetiresOnSaturation();
316 static GLint max_viewport_dims
[] = {
320 EXPECT_CALL(*gl_
, GetIntegerv(GL_MAX_VIEWPORT_DIMS
, _
))
321 .WillOnce(SetArrayArgument
<1>(
322 max_viewport_dims
, max_viewport_dims
+ arraysize(max_viewport_dims
)))
323 .RetiresOnSaturation();
325 SetupInitCapabilitiesExpectations();
326 SetupInitStateExpectations();
328 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
))
330 .RetiresOnSaturation();
332 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, 0))
334 .RetiresOnSaturation();
335 EXPECT_CALL(*gl_
, BindBuffer(GL_ELEMENT_ARRAY_BUFFER
, 0))
337 .RetiresOnSaturation();
338 EXPECT_CALL(*gl_
, BindFramebufferEXT(GL_FRAMEBUFFER
, 0))
340 .RetiresOnSaturation();
341 EXPECT_CALL(*gl_
, BindRenderbufferEXT(GL_RENDERBUFFER
, 0))
343 .RetiresOnSaturation();
345 // TODO(boliu): Remove OS_ANDROID once crbug.com/259023 is fixed and the
346 // workaround has been reverted.
347 #if !defined(OS_ANDROID)
348 EXPECT_CALL(*gl_
, Clear(
349 GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
| GL_STENCIL_BUFFER_BIT
))
351 .RetiresOnSaturation();
354 engine_
.reset(new StrictMock
<MockCommandBufferEngine
>());
355 scoped_refptr
<gpu::Buffer
> buffer
=
356 engine_
->GetSharedMemoryBuffer(kSharedMemoryId
);
357 shared_memory_offset_
= kSharedMemoryOffset
;
358 shared_memory_address_
=
359 reinterpret_cast<int8
*>(buffer
->memory()) + shared_memory_offset_
;
360 shared_memory_id_
= kSharedMemoryId
;
361 shared_memory_base_
= buffer
->memory();
363 static const int32 kLoseContextWhenOutOfMemory
= 0x10002;
365 int32 attributes
[] = {
367 normalized_init
.request_alpha
? 8 : 0,
369 normalized_init
.request_depth
? 24 : 0,
371 normalized_init
.request_stencil
? 8 : 0,
372 kLoseContextWhenOutOfMemory
,
373 normalized_init
.lose_context_when_out_of_memory
? 1 : 0, };
374 std::vector
<int32
> attribs(attributes
, attributes
+ arraysize(attributes
));
376 decoder_
.reset(GLES2Decoder::Create(group_
.get()));
377 decoder_
->SetIgnoreCachedStateForTest(ignore_cached_state_for_test_
);
378 decoder_
->GetLogger()->set_log_synthesized_gl_errors(false);
379 decoder_
->Initialize(surface_
,
383 DisallowedFeatures(),
385 decoder_
->MakeCurrent();
386 decoder_
->set_engine(engine_
.get());
387 decoder_
->BeginDecoding();
389 EXPECT_CALL(*gl_
, GenBuffersARB(_
, _
))
390 .WillOnce(SetArgumentPointee
<1>(kServiceBufferId
))
391 .RetiresOnSaturation();
392 GenHelper
<cmds::GenBuffersImmediate
>(client_buffer_id_
);
393 EXPECT_CALL(*gl_
, GenFramebuffersEXT(_
, _
))
394 .WillOnce(SetArgumentPointee
<1>(kServiceFramebufferId
))
395 .RetiresOnSaturation();
396 GenHelper
<cmds::GenFramebuffersImmediate
>(client_framebuffer_id_
);
397 EXPECT_CALL(*gl_
, GenRenderbuffersEXT(_
, _
))
398 .WillOnce(SetArgumentPointee
<1>(kServiceRenderbufferId
))
399 .RetiresOnSaturation();
400 GenHelper
<cmds::GenRenderbuffersImmediate
>(client_renderbuffer_id_
);
401 EXPECT_CALL(*gl_
, GenTextures(_
, _
))
402 .WillOnce(SetArgumentPointee
<1>(kServiceTextureId
))
403 .RetiresOnSaturation();
404 GenHelper
<cmds::GenTexturesImmediate
>(client_texture_id_
);
405 EXPECT_CALL(*gl_
, GenBuffersARB(_
, _
))
406 .WillOnce(SetArgumentPointee
<1>(kServiceElementBufferId
))
407 .RetiresOnSaturation();
408 GenHelper
<cmds::GenBuffersImmediate
>(client_element_buffer_id_
);
410 DoCreateProgram(client_program_id_
, kServiceProgramId
);
411 DoCreateShader(GL_VERTEX_SHADER
, client_shader_id_
, kServiceShaderId
);
413 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
416 void GLES2DecoderTestBase::ResetDecoder() {
419 // All Tests should have read all their GLErrors before getting here.
420 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
422 EXPECT_CALL(*gl_
, DeleteBuffersARB(1, _
))
424 .RetiresOnSaturation();
425 if (group_
->feature_info()->feature_flags().native_vertex_array_object
) {
426 EXPECT_CALL(*gl_
, DeleteVertexArraysOES(1, Pointee(kServiceVertexArrayId
)))
428 .RetiresOnSaturation();
431 decoder_
->EndDecoding();
432 decoder_
->Destroy(true);
434 group_
->Destroy(mock_decoder_
.get(), false);
436 ::gfx::MockGLInterface::SetGLInterface(NULL
);
438 gfx::ClearGLBindings();
441 void GLES2DecoderTestBase::TearDown() {
445 void GLES2DecoderTestBase::ExpectEnableDisable(GLenum cap
, bool enable
) {
447 EXPECT_CALL(*gl_
, Enable(cap
))
449 .RetiresOnSaturation();
451 EXPECT_CALL(*gl_
, Disable(cap
))
453 .RetiresOnSaturation();
458 GLint
GLES2DecoderTestBase::GetGLError() {
459 EXPECT_CALL(*gl_
, GetError())
460 .WillOnce(Return(GL_NO_ERROR
))
461 .RetiresOnSaturation();
463 cmd
.Init(shared_memory_id_
, shared_memory_offset_
);
464 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
465 return static_cast<GLint
>(*GetSharedMemoryAs
<GLenum
*>());
468 void GLES2DecoderTestBase::DoCreateShader(
469 GLenum shader_type
, GLuint client_id
, GLuint service_id
) {
470 EXPECT_CALL(*gl_
, CreateShader(shader_type
))
472 .WillOnce(Return(service_id
))
473 .RetiresOnSaturation();
474 cmds::CreateShader cmd
;
475 cmd
.Init(shader_type
, client_id
);
476 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
479 bool GLES2DecoderTestBase::DoIsShader(GLuint client_id
) {
480 return IsObjectHelper
<cmds::IsShader
, cmds::IsShader::Result
>(client_id
);
483 void GLES2DecoderTestBase::DoDeleteShader(
484 GLuint client_id
, GLuint service_id
) {
485 EXPECT_CALL(*gl_
, DeleteShader(service_id
))
487 .RetiresOnSaturation();
488 cmds::DeleteShader cmd
;
490 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
493 void GLES2DecoderTestBase::DoCreateProgram(
494 GLuint client_id
, GLuint service_id
) {
495 EXPECT_CALL(*gl_
, CreateProgram())
497 .WillOnce(Return(service_id
))
498 .RetiresOnSaturation();
499 cmds::CreateProgram cmd
;
501 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
504 bool GLES2DecoderTestBase::DoIsProgram(GLuint client_id
) {
505 return IsObjectHelper
<cmds::IsProgram
, cmds::IsProgram::Result
>(client_id
);
508 void GLES2DecoderTestBase::DoDeleteProgram(
509 GLuint client_id
, GLuint
/* service_id */) {
510 cmds::DeleteProgram cmd
;
512 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
515 void GLES2DecoderTestBase::SetBucketAsCString(
516 uint32 bucket_id
, const char* str
) {
517 uint32 size
= str
? (strlen(str
) + 1) : 0;
518 cmd::SetBucketSize cmd1
;
519 cmd1
.Init(bucket_id
, size
);
520 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
522 memcpy(shared_memory_address_
, str
, size
);
523 cmd::SetBucketData cmd2
;
524 cmd2
.Init(bucket_id
, 0, size
, kSharedMemoryId
, kSharedMemoryOffset
);
525 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
530 void GLES2DecoderTestBase::SetupClearTextureExpectations(
532 GLuint old_service_id
,
536 GLenum internal_format
,
541 EXPECT_CALL(*gl_
, BindTexture(bind_target
, service_id
))
543 .RetiresOnSaturation();
544 EXPECT_CALL(*gl_
, TexImage2D(
545 target
, level
, internal_format
, width
, height
, 0, format
, type
, _
))
547 .RetiresOnSaturation();
548 EXPECT_CALL(*gl_
, BindTexture(bind_target
, old_service_id
))
550 .RetiresOnSaturation();
553 void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearing(
556 GLclampf restore_red
,
557 GLclampf restore_green
,
558 GLclampf restore_blue
,
559 GLclampf restore_alpha
,
560 GLuint restore_stencil
,
561 GLclampf restore_depth
,
562 bool restore_scissor_test
) {
563 SetupExpectationsForFramebufferClearingMulti(
574 restore_scissor_test
);
577 void GLES2DecoderTestBase::SetupExpectationsForRestoreClearState(
578 GLclampf restore_red
,
579 GLclampf restore_green
,
580 GLclampf restore_blue
,
581 GLclampf restore_alpha
,
582 GLuint restore_stencil
,
583 GLclampf restore_depth
,
584 bool restore_scissor_test
) {
585 EXPECT_CALL(*gl_
, ClearColor(
586 restore_red
, restore_green
, restore_blue
, restore_alpha
))
588 .RetiresOnSaturation();
589 EXPECT_CALL(*gl_
, ClearStencil(restore_stencil
))
591 .RetiresOnSaturation();
592 EXPECT_CALL(*gl_
, ClearDepth(restore_depth
))
594 .RetiresOnSaturation();
595 if (restore_scissor_test
) {
596 EXPECT_CALL(*gl_
, Enable(GL_SCISSOR_TEST
))
598 .RetiresOnSaturation();
602 void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearingMulti(
603 GLuint read_framebuffer_service_id
,
604 GLuint draw_framebuffer_service_id
,
607 GLclampf restore_red
,
608 GLclampf restore_green
,
609 GLclampf restore_blue
,
610 GLclampf restore_alpha
,
611 GLuint restore_stencil
,
612 GLclampf restore_depth
,
613 bool restore_scissor_test
) {
614 // TODO(gman): Figure out why InSequence stopped working.
615 // InSequence sequence;
616 EXPECT_CALL(*gl_
, CheckFramebufferStatusEXT(target
))
617 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE
))
618 .RetiresOnSaturation();
619 if (target
== GL_READ_FRAMEBUFFER_EXT
) {
620 EXPECT_CALL(*gl_
, BindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT
, 0))
622 .RetiresOnSaturation();
623 EXPECT_CALL(*gl_
, BindFramebufferEXT(
624 GL_DRAW_FRAMEBUFFER_EXT
, read_framebuffer_service_id
))
626 .RetiresOnSaturation();
628 if ((clear_bits
& GL_COLOR_BUFFER_BIT
) != 0) {
629 EXPECT_CALL(*gl_
, ClearColor(0.0f
, 0.0f
, 0.0f
, 0.0f
))
631 .RetiresOnSaturation();
632 SetupExpectationsForColorMask(true, true, true, true);
634 if ((clear_bits
& GL_STENCIL_BUFFER_BIT
) != 0) {
635 EXPECT_CALL(*gl_
, ClearStencil(0))
637 .RetiresOnSaturation();
638 EXPECT_CALL(*gl_
, StencilMask(static_cast<GLuint
>(-1)))
640 .RetiresOnSaturation();
642 if ((clear_bits
& GL_DEPTH_BUFFER_BIT
) != 0) {
643 EXPECT_CALL(*gl_
, ClearDepth(1.0f
))
645 .RetiresOnSaturation();
646 SetupExpectationsForDepthMask(true);
648 SetupExpectationsForEnableDisable(GL_SCISSOR_TEST
, false);
649 EXPECT_CALL(*gl_
, Clear(clear_bits
))
651 .RetiresOnSaturation();
652 SetupExpectationsForRestoreClearState(
653 restore_red
, restore_green
, restore_blue
, restore_alpha
,
654 restore_stencil
, restore_depth
, restore_scissor_test
);
655 if (target
== GL_READ_FRAMEBUFFER_EXT
) {
656 EXPECT_CALL(*gl_
, BindFramebufferEXT(
657 GL_READ_FRAMEBUFFER_EXT
, read_framebuffer_service_id
))
659 .RetiresOnSaturation();
660 EXPECT_CALL(*gl_
, BindFramebufferEXT(
661 GL_DRAW_FRAMEBUFFER_EXT
, draw_framebuffer_service_id
))
663 .RetiresOnSaturation();
667 void GLES2DecoderTestBase::SetupShaderForUniform(GLenum uniform_type
) {
668 static AttribInfo attribs
[] = {
669 { "foo", 1, GL_FLOAT
, 1, },
670 { "goo", 1, GL_FLOAT
, 2, },
672 UniformInfo uniforms
[] = {
673 { "bar", 1, uniform_type
, 0, 2, -1, },
674 { "car", 4, uniform_type
, 1, 1, -1, },
676 const GLuint kClientVertexShaderId
= 5001;
677 const GLuint kServiceVertexShaderId
= 6001;
678 const GLuint kClientFragmentShaderId
= 5002;
679 const GLuint kServiceFragmentShaderId
= 6002;
680 SetupShader(attribs
, arraysize(attribs
), uniforms
, arraysize(uniforms
),
681 client_program_id_
, kServiceProgramId
,
682 kClientVertexShaderId
, kServiceVertexShaderId
,
683 kClientFragmentShaderId
, kServiceFragmentShaderId
);
685 EXPECT_CALL(*gl_
, UseProgram(kServiceProgramId
))
687 .RetiresOnSaturation();
688 cmds::UseProgram cmd
;
689 cmd
.Init(client_program_id_
);
690 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
693 void GLES2DecoderTestBase::DoBindBuffer(
694 GLenum target
, GLuint client_id
, GLuint service_id
) {
695 EXPECT_CALL(*gl_
, BindBuffer(target
, service_id
))
697 .RetiresOnSaturation();
698 cmds::BindBuffer cmd
;
699 cmd
.Init(target
, client_id
);
700 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
703 bool GLES2DecoderTestBase::DoIsBuffer(GLuint client_id
) {
704 return IsObjectHelper
<cmds::IsBuffer
, cmds::IsBuffer::Result
>(client_id
);
707 void GLES2DecoderTestBase::DoDeleteBuffer(
708 GLuint client_id
, GLuint service_id
) {
709 EXPECT_CALL(*gl_
, DeleteBuffersARB(1, Pointee(service_id
)))
711 .RetiresOnSaturation();
712 GenHelper
<cmds::DeleteBuffersImmediate
>(client_id
);
715 void GLES2DecoderTestBase::SetupExpectationsForColorMask(bool red
,
719 if (ignore_cached_state_for_test_
|| cached_color_mask_red_
!= red
||
720 cached_color_mask_green_
!= green
|| cached_color_mask_blue_
!= blue
||
721 cached_color_mask_alpha_
!= alpha
) {
722 cached_color_mask_red_
= red
;
723 cached_color_mask_green_
= green
;
724 cached_color_mask_blue_
= blue
;
725 cached_color_mask_alpha_
= alpha
;
726 EXPECT_CALL(*gl_
, ColorMask(red
, green
, blue
, alpha
))
728 .RetiresOnSaturation();
732 void GLES2DecoderTestBase::SetupExpectationsForDepthMask(bool mask
) {
733 if (ignore_cached_state_for_test_
|| cached_depth_mask_
!= mask
) {
734 cached_depth_mask_
= mask
;
735 EXPECT_CALL(*gl_
, DepthMask(mask
)).Times(1).RetiresOnSaturation();
739 void GLES2DecoderTestBase::SetupExpectationsForStencilMask(GLuint front_mask
,
741 if (ignore_cached_state_for_test_
||
742 cached_stencil_front_mask_
!= front_mask
) {
743 cached_stencil_front_mask_
= front_mask
;
744 EXPECT_CALL(*gl_
, StencilMaskSeparate(GL_FRONT
, front_mask
))
746 .RetiresOnSaturation();
749 if (ignore_cached_state_for_test_
||
750 cached_stencil_back_mask_
!= back_mask
) {
751 cached_stencil_back_mask_
= back_mask
;
752 EXPECT_CALL(*gl_
, StencilMaskSeparate(GL_BACK
, back_mask
))
754 .RetiresOnSaturation();
758 void GLES2DecoderTestBase::SetupExpectationsForEnableDisable(GLenum cap
,
762 if (enable_flags_
.cached_blend
== enable
&&
763 !ignore_cached_state_for_test_
)
765 enable_flags_
.cached_blend
= enable
;
768 if (enable_flags_
.cached_cull_face
== enable
&&
769 !ignore_cached_state_for_test_
)
771 enable_flags_
.cached_cull_face
= enable
;
774 if (enable_flags_
.cached_depth_test
== enable
&&
775 !ignore_cached_state_for_test_
)
777 enable_flags_
.cached_depth_test
= enable
;
780 if (enable_flags_
.cached_dither
== enable
&&
781 !ignore_cached_state_for_test_
)
783 enable_flags_
.cached_dither
= enable
;
785 case GL_POLYGON_OFFSET_FILL
:
786 if (enable_flags_
.cached_polygon_offset_fill
== enable
&&
787 !ignore_cached_state_for_test_
)
789 enable_flags_
.cached_polygon_offset_fill
= enable
;
791 case GL_SAMPLE_ALPHA_TO_COVERAGE
:
792 if (enable_flags_
.cached_sample_alpha_to_coverage
== enable
&&
793 !ignore_cached_state_for_test_
)
795 enable_flags_
.cached_sample_alpha_to_coverage
= enable
;
797 case GL_SAMPLE_COVERAGE
:
798 if (enable_flags_
.cached_sample_coverage
== enable
&&
799 !ignore_cached_state_for_test_
)
801 enable_flags_
.cached_sample_coverage
= enable
;
803 case GL_SCISSOR_TEST
:
804 if (enable_flags_
.cached_scissor_test
== enable
&&
805 !ignore_cached_state_for_test_
)
807 enable_flags_
.cached_scissor_test
= enable
;
809 case GL_STENCIL_TEST
:
810 if (enable_flags_
.cached_stencil_test
== enable
&&
811 !ignore_cached_state_for_test_
)
813 enable_flags_
.cached_stencil_test
= enable
;
820 EXPECT_CALL(*gl_
, Enable(cap
)).Times(1).RetiresOnSaturation();
822 EXPECT_CALL(*gl_
, Disable(cap
)).Times(1).RetiresOnSaturation();
826 void GLES2DecoderTestBase::SetupExpectationsForApplyingDirtyState(
827 bool framebuffer_is_rgb
,
828 bool framebuffer_has_depth
,
829 bool framebuffer_has_stencil
,
833 GLuint front_stencil_mask
,
834 GLuint back_stencil_mask
,
835 bool stencil_enabled
) {
836 bool color_mask_red
= (color_bits
& 0x1000) != 0;
837 bool color_mask_green
= (color_bits
& 0x0100) != 0;
838 bool color_mask_blue
= (color_bits
& 0x0010) != 0;
839 bool color_mask_alpha
= (color_bits
& 0x0001) && !framebuffer_is_rgb
;
841 SetupExpectationsForColorMask(
842 color_mask_red
, color_mask_green
, color_mask_blue
, color_mask_alpha
);
843 SetupExpectationsForDepthMask(depth_mask
);
844 SetupExpectationsForStencilMask(front_stencil_mask
, back_stencil_mask
);
845 SetupExpectationsForEnableDisable(GL_DEPTH_TEST
,
846 framebuffer_has_depth
&& depth_enabled
);
847 SetupExpectationsForEnableDisable(GL_STENCIL_TEST
,
848 framebuffer_has_stencil
&& stencil_enabled
);
851 void GLES2DecoderTestBase::SetupExpectationsForApplyingDefaultDirtyState() {
852 SetupExpectationsForApplyingDirtyState(false, // Framebuffer is RGB
853 false, // Framebuffer has depth
854 false, // Framebuffer has stencil
855 0x1111, // color bits
857 false, // depth enabled
858 0, // front stencil mask
859 0, // back stencil mask
860 false); // stencil enabled
863 GLES2DecoderTestBase::EnableFlags::EnableFlags()
864 : cached_blend(false),
865 cached_cull_face(false),
866 cached_depth_test(false),
868 cached_polygon_offset_fill(false),
869 cached_sample_alpha_to_coverage(false),
870 cached_sample_coverage(false),
871 cached_scissor_test(false),
872 cached_stencil_test(false) {
875 void GLES2DecoderTestBase::DoBindFramebuffer(
876 GLenum target
, GLuint client_id
, GLuint service_id
) {
877 EXPECT_CALL(*gl_
, BindFramebufferEXT(target
, service_id
))
879 .RetiresOnSaturation();
880 cmds::BindFramebuffer cmd
;
881 cmd
.Init(target
, client_id
);
882 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
885 bool GLES2DecoderTestBase::DoIsFramebuffer(GLuint client_id
) {
886 return IsObjectHelper
<cmds::IsFramebuffer
, cmds::IsFramebuffer::Result
>(
890 void GLES2DecoderTestBase::DoDeleteFramebuffer(
891 GLuint client_id
, GLuint service_id
,
892 bool reset_draw
, GLenum draw_target
, GLuint draw_id
,
893 bool reset_read
, GLenum read_target
, GLuint read_id
) {
895 EXPECT_CALL(*gl_
, BindFramebufferEXT(draw_target
, draw_id
))
897 .RetiresOnSaturation();
900 EXPECT_CALL(*gl_
, BindFramebufferEXT(read_target
, read_id
))
902 .RetiresOnSaturation();
904 EXPECT_CALL(*gl_
, DeleteFramebuffersEXT(1, Pointee(service_id
)))
906 .RetiresOnSaturation();
907 GenHelper
<cmds::DeleteFramebuffersImmediate
>(client_id
);
910 void GLES2DecoderTestBase::DoBindRenderbuffer(
911 GLenum target
, GLuint client_id
, GLuint service_id
) {
912 service_renderbuffer_id_
= service_id
;
913 service_renderbuffer_valid_
= true;
914 EXPECT_CALL(*gl_
, BindRenderbufferEXT(target
, service_id
))
916 .RetiresOnSaturation();
917 cmds::BindRenderbuffer cmd
;
918 cmd
.Init(target
, client_id
);
919 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
922 void GLES2DecoderTestBase::DoRenderbufferStorageMultisampleCHROMIUM(
925 GLenum internal_format
,
929 EXPECT_CALL(*gl_
, GetError())
930 .WillOnce(Return(GL_NO_ERROR
))
931 .RetiresOnSaturation();
933 RenderbufferStorageMultisampleEXT(
934 target
, samples
, gl_format
, width
, height
))
936 .RetiresOnSaturation();
937 EXPECT_CALL(*gl_
, GetError())
938 .WillOnce(Return(GL_NO_ERROR
))
939 .RetiresOnSaturation();
940 cmds::RenderbufferStorageMultisampleCHROMIUM cmd
;
941 cmd
.Init(target
, samples
, internal_format
, width
, height
);
942 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
943 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
946 void GLES2DecoderTestBase::RestoreRenderbufferBindings() {
947 GetDecoder()->RestoreRenderbufferBindings();
948 service_renderbuffer_valid_
= false;
951 void GLES2DecoderTestBase::EnsureRenderbufferBound(bool expect_bind
) {
952 EXPECT_NE(expect_bind
, service_renderbuffer_valid_
);
955 service_renderbuffer_valid_
= true;
957 BindRenderbufferEXT(GL_RENDERBUFFER
, service_renderbuffer_id_
))
959 .RetiresOnSaturation();
961 EXPECT_CALL(*gl_
, BindRenderbufferEXT(_
, _
)).Times(0);
965 bool GLES2DecoderTestBase::DoIsRenderbuffer(GLuint client_id
) {
966 return IsObjectHelper
<cmds::IsRenderbuffer
, cmds::IsRenderbuffer::Result
>(
970 void GLES2DecoderTestBase::DoDeleteRenderbuffer(
971 GLuint client_id
, GLuint service_id
) {
972 EXPECT_CALL(*gl_
, DeleteRenderbuffersEXT(1, Pointee(service_id
)))
974 .RetiresOnSaturation();
975 GenHelper
<cmds::DeleteRenderbuffersImmediate
>(client_id
);
978 void GLES2DecoderTestBase::DoBindTexture(
979 GLenum target
, GLuint client_id
, GLuint service_id
) {
980 EXPECT_CALL(*gl_
, BindTexture(target
, service_id
))
982 .RetiresOnSaturation();
983 cmds::BindTexture cmd
;
984 cmd
.Init(target
, client_id
);
985 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
988 bool GLES2DecoderTestBase::DoIsTexture(GLuint client_id
) {
989 return IsObjectHelper
<cmds::IsTexture
, cmds::IsTexture::Result
>(client_id
);
992 void GLES2DecoderTestBase::DoDeleteTexture(
993 GLuint client_id
, GLuint service_id
) {
994 EXPECT_CALL(*gl_
, DeleteTextures(1, Pointee(service_id
)))
996 .RetiresOnSaturation();
997 GenHelper
<cmds::DeleteTexturesImmediate
>(client_id
);
1000 void GLES2DecoderTestBase::DoTexImage2D(
1001 GLenum target
, GLint level
, GLenum internal_format
,
1002 GLsizei width
, GLsizei height
, GLint border
,
1003 GLenum format
, GLenum type
,
1004 uint32 shared_memory_id
, uint32 shared_memory_offset
) {
1005 EXPECT_CALL(*gl_
, GetError())
1006 .WillOnce(Return(GL_NO_ERROR
))
1007 .RetiresOnSaturation();
1008 EXPECT_CALL(*gl_
, TexImage2D(target
, level
, internal_format
,
1009 width
, height
, border
, format
, type
, _
))
1011 .RetiresOnSaturation();
1012 EXPECT_CALL(*gl_
, GetError())
1013 .WillOnce(Return(GL_NO_ERROR
))
1014 .RetiresOnSaturation();
1015 cmds::TexImage2D cmd
;
1016 cmd
.Init(target
, level
, internal_format
, width
, height
, format
,
1017 type
, shared_memory_id
, shared_memory_offset
);
1018 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1021 void GLES2DecoderTestBase::DoTexImage2DConvertInternalFormat(
1022 GLenum target
, GLint level
, GLenum requested_internal_format
,
1023 GLsizei width
, GLsizei height
, GLint border
,
1024 GLenum format
, GLenum type
,
1025 uint32 shared_memory_id
, uint32 shared_memory_offset
,
1026 GLenum expected_internal_format
) {
1027 EXPECT_CALL(*gl_
, GetError())
1028 .WillOnce(Return(GL_NO_ERROR
))
1029 .RetiresOnSaturation();
1030 EXPECT_CALL(*gl_
, TexImage2D(target
, level
, expected_internal_format
,
1031 width
, height
, border
, format
, type
, _
))
1033 .RetiresOnSaturation();
1034 EXPECT_CALL(*gl_
, GetError())
1035 .WillOnce(Return(GL_NO_ERROR
))
1036 .RetiresOnSaturation();
1037 cmds::TexImage2D cmd
;
1038 cmd
.Init(target
, level
, requested_internal_format
, width
, height
,
1039 format
, type
, shared_memory_id
, shared_memory_offset
);
1040 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1043 void GLES2DecoderTestBase::DoCompressedTexImage2D(
1044 GLenum target
, GLint level
, GLenum format
,
1045 GLsizei width
, GLsizei height
, GLint border
,
1046 GLsizei size
, uint32 bucket_id
) {
1047 EXPECT_CALL(*gl_
, GetError())
1048 .WillOnce(Return(GL_NO_ERROR
))
1049 .RetiresOnSaturation();
1050 EXPECT_CALL(*gl_
, CompressedTexImage2D(
1051 target
, level
, format
, width
, height
, border
, size
, _
))
1053 .RetiresOnSaturation();
1054 EXPECT_CALL(*gl_
, GetError())
1055 .WillOnce(Return(GL_NO_ERROR
))
1056 .RetiresOnSaturation();
1057 CommonDecoder::Bucket
* bucket
= decoder_
->CreateBucket(bucket_id
);
1058 bucket
->SetSize(size
);
1059 cmds::CompressedTexImage2DBucket cmd
;
1061 target
, level
, format
, width
, height
,
1063 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1066 void GLES2DecoderTestBase::DoRenderbufferStorage(
1067 GLenum target
, GLenum internal_format
, GLenum actual_format
,
1068 GLsizei width
, GLsizei height
, GLenum error
) {
1069 EXPECT_CALL(*gl_
, GetError())
1070 .WillOnce(Return(GL_NO_ERROR
))
1071 .RetiresOnSaturation();
1072 EXPECT_CALL(*gl_
, RenderbufferStorageEXT(
1073 target
, actual_format
, width
, height
))
1075 .RetiresOnSaturation();
1076 EXPECT_CALL(*gl_
, GetError())
1077 .WillOnce(Return(error
))
1078 .RetiresOnSaturation();
1079 cmds::RenderbufferStorage cmd
;
1080 cmd
.Init(target
, internal_format
, width
, height
);
1081 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1084 void GLES2DecoderTestBase::DoFramebufferTexture2D(
1085 GLenum target
, GLenum attachment
, GLenum textarget
,
1086 GLuint texture_client_id
, GLuint texture_service_id
, GLint level
,
1088 EXPECT_CALL(*gl_
, GetError())
1089 .WillOnce(Return(GL_NO_ERROR
))
1090 .RetiresOnSaturation();
1091 EXPECT_CALL(*gl_
, FramebufferTexture2DEXT(
1092 target
, attachment
, textarget
, texture_service_id
, level
))
1094 .RetiresOnSaturation();
1095 EXPECT_CALL(*gl_
, GetError())
1096 .WillOnce(Return(error
))
1097 .RetiresOnSaturation();
1098 cmds::FramebufferTexture2D cmd
;
1099 cmd
.Init(target
, attachment
, textarget
, texture_client_id
);
1100 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1103 void GLES2DecoderTestBase::DoFramebufferRenderbuffer(
1106 GLenum renderbuffer_target
,
1107 GLuint renderbuffer_client_id
,
1108 GLuint renderbuffer_service_id
,
1110 EXPECT_CALL(*gl_
, GetError())
1111 .WillOnce(Return(GL_NO_ERROR
))
1112 .RetiresOnSaturation();
1113 EXPECT_CALL(*gl_
, FramebufferRenderbufferEXT(
1114 target
, attachment
, renderbuffer_target
, renderbuffer_service_id
))
1116 .RetiresOnSaturation();
1117 EXPECT_CALL(*gl_
, GetError())
1118 .WillOnce(Return(error
))
1119 .RetiresOnSaturation();
1120 cmds::FramebufferRenderbuffer cmd
;
1121 cmd
.Init(target
, attachment
, renderbuffer_target
, renderbuffer_client_id
);
1122 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1125 void GLES2DecoderTestBase::DoVertexAttribPointer(
1126 GLuint index
, GLint size
, GLenum type
, GLsizei stride
, GLuint offset
) {
1128 VertexAttribPointer(index
, size
, type
, GL_FALSE
, stride
,
1129 BufferOffset(offset
)))
1131 .RetiresOnSaturation();
1132 cmds::VertexAttribPointer cmd
;
1133 cmd
.Init(index
, size
, GL_FLOAT
, GL_FALSE
, stride
, offset
);
1134 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1137 void GLES2DecoderTestBase::DoVertexAttribDivisorANGLE(
1138 GLuint index
, GLuint divisor
) {
1140 VertexAttribDivisorANGLE(index
, divisor
))
1142 .RetiresOnSaturation();
1143 cmds::VertexAttribDivisorANGLE cmd
;
1144 cmd
.Init(index
, divisor
);
1145 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1148 void GLES2DecoderTestBase::AddExpectationsForGenVertexArraysOES(){
1149 if (group_
->feature_info()->feature_flags().native_vertex_array_object
) {
1150 EXPECT_CALL(*gl_
, GenVertexArraysOES(1, _
))
1151 .WillOnce(SetArgumentPointee
<1>(kServiceVertexArrayId
))
1152 .RetiresOnSaturation();
1156 void GLES2DecoderTestBase::AddExpectationsForDeleteVertexArraysOES(){
1157 if (group_
->feature_info()->feature_flags().native_vertex_array_object
) {
1158 EXPECT_CALL(*gl_
, DeleteVertexArraysOES(1, _
))
1160 .RetiresOnSaturation();
1164 void GLES2DecoderTestBase::AddExpectationsForDeleteBoundVertexArraysOES() {
1165 // Expectations are the same as a delete, followed by binding VAO 0.
1166 AddExpectationsForDeleteVertexArraysOES();
1167 AddExpectationsForBindVertexArrayOES();
1170 void GLES2DecoderTestBase::AddExpectationsForBindVertexArrayOES() {
1171 if (group_
->feature_info()->feature_flags().native_vertex_array_object
) {
1172 EXPECT_CALL(*gl_
, BindVertexArrayOES(_
))
1174 .RetiresOnSaturation();
1176 for (uint32 vv
= 0; vv
< group_
->max_vertex_attribs(); ++vv
) {
1177 AddExpectationsForRestoreAttribState(vv
);
1180 EXPECT_CALL(*gl_
, BindBuffer(GL_ELEMENT_ARRAY_BUFFER
, _
))
1182 .RetiresOnSaturation();
1186 void GLES2DecoderTestBase::AddExpectationsForRestoreAttribState(GLuint attrib
) {
1187 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, _
))
1189 .RetiresOnSaturation();
1191 EXPECT_CALL(*gl_
, VertexAttribPointer(attrib
, _
, _
, _
, _
, _
))
1193 .RetiresOnSaturation();
1195 EXPECT_CALL(*gl_
, VertexAttribDivisorANGLE(attrib
, _
))
1196 .Times(testing::AtMost(1))
1197 .RetiresOnSaturation();
1199 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, _
))
1201 .RetiresOnSaturation();
1204 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2
) {
1206 // TODO(bajones): Not sure if I can tell which of these will be called
1207 EXPECT_CALL(*gl_
, EnableVertexAttribArray(attrib
))
1208 .Times(testing::AtMost(1))
1209 .RetiresOnSaturation();
1211 EXPECT_CALL(*gl_
, DisableVertexAttribArray(attrib
))
1212 .Times(testing::AtMost(1))
1213 .RetiresOnSaturation();
1217 // GCC requires these declarations, but MSVC requires they not be present
1218 #ifndef COMPILER_MSVC
1219 const int GLES2DecoderTestBase::kBackBufferWidth
;
1220 const int GLES2DecoderTestBase::kBackBufferHeight
;
1222 const GLint
GLES2DecoderTestBase::kMaxTextureSize
;
1223 const GLint
GLES2DecoderTestBase::kMaxCubeMapTextureSize
;
1224 const GLint
GLES2DecoderTestBase::kNumVertexAttribs
;
1225 const GLint
GLES2DecoderTestBase::kNumTextureUnits
;
1226 const GLint
GLES2DecoderTestBase::kMaxTextureImageUnits
;
1227 const GLint
GLES2DecoderTestBase::kMaxVertexTextureImageUnits
;
1228 const GLint
GLES2DecoderTestBase::kMaxFragmentUniformVectors
;
1229 const GLint
GLES2DecoderTestBase::kMaxVaryingVectors
;
1230 const GLint
GLES2DecoderTestBase::kMaxVertexUniformVectors
;
1231 const GLint
GLES2DecoderTestBase::kMaxViewportWidth
;
1232 const GLint
GLES2DecoderTestBase::kMaxViewportHeight
;
1234 const GLint
GLES2DecoderTestBase::kViewportX
;
1235 const GLint
GLES2DecoderTestBase::kViewportY
;
1236 const GLint
GLES2DecoderTestBase::kViewportWidth
;
1237 const GLint
GLES2DecoderTestBase::kViewportHeight
;
1239 const GLuint
GLES2DecoderTestBase::kServiceAttrib0BufferId
;
1240 const GLuint
GLES2DecoderTestBase::kServiceFixedAttribBufferId
;
1242 const GLuint
GLES2DecoderTestBase::kServiceBufferId
;
1243 const GLuint
GLES2DecoderTestBase::kServiceFramebufferId
;
1244 const GLuint
GLES2DecoderTestBase::kServiceRenderbufferId
;
1245 const GLuint
GLES2DecoderTestBase::kServiceTextureId
;
1246 const GLuint
GLES2DecoderTestBase::kServiceProgramId
;
1247 const GLuint
GLES2DecoderTestBase::kServiceShaderId
;
1248 const GLuint
GLES2DecoderTestBase::kServiceElementBufferId
;
1249 const GLuint
GLES2DecoderTestBase::kServiceQueryId
;
1250 const GLuint
GLES2DecoderTestBase::kServiceVertexArrayId
;
1252 const int32
GLES2DecoderTestBase::kSharedMemoryId
;
1253 const size_t GLES2DecoderTestBase::kSharedBufferSize
;
1254 const uint32
GLES2DecoderTestBase::kSharedMemoryOffset
;
1255 const int32
GLES2DecoderTestBase::kInvalidSharedMemoryId
;
1256 const uint32
GLES2DecoderTestBase::kInvalidSharedMemoryOffset
;
1257 const uint32
GLES2DecoderTestBase::kInitialResult
;
1258 const uint8
GLES2DecoderTestBase::kInitialMemoryValue
;
1260 const uint32
GLES2DecoderTestBase::kNewClientId
;
1261 const uint32
GLES2DecoderTestBase::kNewServiceId
;
1262 const uint32
GLES2DecoderTestBase::kInvalidClientId
;
1264 const GLuint
GLES2DecoderTestBase::kServiceVertexShaderId
;
1265 const GLuint
GLES2DecoderTestBase::kServiceFragmentShaderId
;
1267 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumShaderId
;
1268 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumProgramId
;
1270 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumTextureBufferId
;
1271 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumVertexBufferId
;
1272 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumFBOId
;
1273 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumPositionAttrib
;
1274 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumTexAttrib
;
1275 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumSamplerLocation
;
1277 const GLsizei
GLES2DecoderTestBase::kNumVertices
;
1278 const GLsizei
GLES2DecoderTestBase::kNumIndices
;
1279 const int GLES2DecoderTestBase::kValidIndexRangeStart
;
1280 const int GLES2DecoderTestBase::kValidIndexRangeCount
;
1281 const int GLES2DecoderTestBase::kInvalidIndexRangeStart
;
1282 const int GLES2DecoderTestBase::kInvalidIndexRangeCount
;
1283 const int GLES2DecoderTestBase::kOutOfRangeIndexRangeEnd
;
1284 const GLuint
GLES2DecoderTestBase::kMaxValidIndex
;
1286 const GLint
GLES2DecoderTestBase::kMaxAttribLength
;
1287 const GLint
GLES2DecoderTestBase::kAttrib1Size
;
1288 const GLint
GLES2DecoderTestBase::kAttrib2Size
;
1289 const GLint
GLES2DecoderTestBase::kAttrib3Size
;
1290 const GLint
GLES2DecoderTestBase::kAttrib1Location
;
1291 const GLint
GLES2DecoderTestBase::kAttrib2Location
;
1292 const GLint
GLES2DecoderTestBase::kAttrib3Location
;
1293 const GLenum
GLES2DecoderTestBase::kAttrib1Type
;
1294 const GLenum
GLES2DecoderTestBase::kAttrib2Type
;
1295 const GLenum
GLES2DecoderTestBase::kAttrib3Type
;
1296 const GLint
GLES2DecoderTestBase::kInvalidAttribLocation
;
1297 const GLint
GLES2DecoderTestBase::kBadAttribIndex
;
1299 const GLint
GLES2DecoderTestBase::kMaxUniformLength
;
1300 const GLint
GLES2DecoderTestBase::kUniform1Size
;
1301 const GLint
GLES2DecoderTestBase::kUniform2Size
;
1302 const GLint
GLES2DecoderTestBase::kUniform3Size
;
1303 const GLint
GLES2DecoderTestBase::kUniform1RealLocation
;
1304 const GLint
GLES2DecoderTestBase::kUniform2RealLocation
;
1305 const GLint
GLES2DecoderTestBase::kUniform2ElementRealLocation
;
1306 const GLint
GLES2DecoderTestBase::kUniform3RealLocation
;
1307 const GLint
GLES2DecoderTestBase::kUniform1FakeLocation
;
1308 const GLint
GLES2DecoderTestBase::kUniform2FakeLocation
;
1309 const GLint
GLES2DecoderTestBase::kUniform2ElementFakeLocation
;
1310 const GLint
GLES2DecoderTestBase::kUniform3FakeLocation
;
1311 const GLint
GLES2DecoderTestBase::kUniform1DesiredLocation
;
1312 const GLint
GLES2DecoderTestBase::kUniform2DesiredLocation
;
1313 const GLint
GLES2DecoderTestBase::kUniform3DesiredLocation
;
1314 const GLenum
GLES2DecoderTestBase::kUniform1Type
;
1315 const GLenum
GLES2DecoderTestBase::kUniform2Type
;
1316 const GLenum
GLES2DecoderTestBase::kUniform3Type
;
1317 const GLenum
GLES2DecoderTestBase::kUniformCubemapType
;
1318 const GLint
GLES2DecoderTestBase::kInvalidUniformLocation
;
1319 const GLint
GLES2DecoderTestBase::kBadUniformIndex
;
1323 const char* GLES2DecoderTestBase::kAttrib1Name
= "attrib1";
1324 const char* GLES2DecoderTestBase::kAttrib2Name
= "attrib2";
1325 const char* GLES2DecoderTestBase::kAttrib3Name
= "attrib3";
1326 const char* GLES2DecoderTestBase::kUniform1Name
= "uniform1";
1327 const char* GLES2DecoderTestBase::kUniform2Name
= "uniform2[0]";
1328 const char* GLES2DecoderTestBase::kUniform3Name
= "uniform3[0]";
1330 void GLES2DecoderTestBase::SetupDefaultProgram() {
1332 static AttribInfo attribs
[] = {
1333 { kAttrib1Name
, kAttrib1Size
, kAttrib1Type
, kAttrib1Location
, },
1334 { kAttrib2Name
, kAttrib2Size
, kAttrib2Type
, kAttrib2Location
, },
1335 { kAttrib3Name
, kAttrib3Size
, kAttrib3Type
, kAttrib3Location
, },
1337 static UniformInfo uniforms
[] = {
1338 { kUniform1Name
, kUniform1Size
, kUniform1Type
,
1339 kUniform1FakeLocation
, kUniform1RealLocation
,
1340 kUniform1DesiredLocation
},
1341 { kUniform2Name
, kUniform2Size
, kUniform2Type
,
1342 kUniform2FakeLocation
, kUniform2RealLocation
,
1343 kUniform2DesiredLocation
},
1344 { kUniform3Name
, kUniform3Size
, kUniform3Type
,
1345 kUniform3FakeLocation
, kUniform3RealLocation
,
1346 kUniform3DesiredLocation
},
1348 SetupShader(attribs
, arraysize(attribs
), uniforms
, arraysize(uniforms
),
1349 client_program_id_
, kServiceProgramId
,
1350 client_vertex_shader_id_
, kServiceVertexShaderId
,
1351 client_fragment_shader_id_
, kServiceFragmentShaderId
);
1355 EXPECT_CALL(*gl_
, UseProgram(kServiceProgramId
))
1357 .RetiresOnSaturation();
1358 cmds::UseProgram cmd
;
1359 cmd
.Init(client_program_id_
);
1360 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1364 void GLES2DecoderTestBase::SetupCubemapProgram() {
1366 static AttribInfo attribs
[] = {
1367 { kAttrib1Name
, kAttrib1Size
, kAttrib1Type
, kAttrib1Location
, },
1368 { kAttrib2Name
, kAttrib2Size
, kAttrib2Type
, kAttrib2Location
, },
1369 { kAttrib3Name
, kAttrib3Size
, kAttrib3Type
, kAttrib3Location
, },
1371 static UniformInfo uniforms
[] = {
1372 { kUniform1Name
, kUniform1Size
, kUniformCubemapType
,
1373 kUniform1FakeLocation
, kUniform1RealLocation
,
1374 kUniform1DesiredLocation
, },
1375 { kUniform2Name
, kUniform2Size
, kUniform2Type
,
1376 kUniform2FakeLocation
, kUniform2RealLocation
,
1377 kUniform2DesiredLocation
, },
1378 { kUniform3Name
, kUniform3Size
, kUniform3Type
,
1379 kUniform3FakeLocation
, kUniform3RealLocation
,
1380 kUniform3DesiredLocation
, },
1382 SetupShader(attribs
, arraysize(attribs
), uniforms
, arraysize(uniforms
),
1383 client_program_id_
, kServiceProgramId
,
1384 client_vertex_shader_id_
, kServiceVertexShaderId
,
1385 client_fragment_shader_id_
, kServiceFragmentShaderId
);
1389 EXPECT_CALL(*gl_
, UseProgram(kServiceProgramId
))
1391 .RetiresOnSaturation();
1392 cmds::UseProgram cmd
;
1393 cmd
.Init(client_program_id_
);
1394 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1398 void GLES2DecoderTestBase::SetupSamplerExternalProgram() {
1400 static AttribInfo attribs
[] = {
1401 { kAttrib1Name
, kAttrib1Size
, kAttrib1Type
, kAttrib1Location
, },
1402 { kAttrib2Name
, kAttrib2Size
, kAttrib2Type
, kAttrib2Location
, },
1403 { kAttrib3Name
, kAttrib3Size
, kAttrib3Type
, kAttrib3Location
, },
1405 static UniformInfo uniforms
[] = {
1406 { kUniform1Name
, kUniform1Size
, kUniformSamplerExternalType
,
1407 kUniform1FakeLocation
, kUniform1RealLocation
,
1408 kUniform1DesiredLocation
, },
1409 { kUniform2Name
, kUniform2Size
, kUniform2Type
,
1410 kUniform2FakeLocation
, kUniform2RealLocation
,
1411 kUniform2DesiredLocation
, },
1412 { kUniform3Name
, kUniform3Size
, kUniform3Type
,
1413 kUniform3FakeLocation
, kUniform3RealLocation
,
1414 kUniform3DesiredLocation
, },
1416 SetupShader(attribs
, arraysize(attribs
), uniforms
, arraysize(uniforms
),
1417 client_program_id_
, kServiceProgramId
,
1418 client_vertex_shader_id_
, kServiceVertexShaderId
,
1419 client_fragment_shader_id_
, kServiceFragmentShaderId
);
1423 EXPECT_CALL(*gl_
, UseProgram(kServiceProgramId
))
1425 .RetiresOnSaturation();
1426 cmds::UseProgram cmd
;
1427 cmd
.Init(client_program_id_
);
1428 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1432 void GLES2DecoderWithShaderTestBase::TearDown() {
1433 GLES2DecoderTestBase::TearDown();
1436 void GLES2DecoderTestBase::SetupShader(
1437 GLES2DecoderTestBase::AttribInfo
* attribs
, size_t num_attribs
,
1438 GLES2DecoderTestBase::UniformInfo
* uniforms
, size_t num_uniforms
,
1439 GLuint program_client_id
, GLuint program_service_id
,
1440 GLuint vertex_shader_client_id
, GLuint vertex_shader_service_id
,
1441 GLuint fragment_shader_client_id
, GLuint fragment_shader_service_id
) {
1446 AttachShader(program_service_id
, vertex_shader_service_id
))
1448 .RetiresOnSaturation();
1450 AttachShader(program_service_id
, fragment_shader_service_id
))
1452 .RetiresOnSaturation();
1453 TestHelper::SetupShader(
1454 gl_
.get(), attribs
, num_attribs
, uniforms
, num_uniforms
,
1455 program_service_id
);
1459 GL_VERTEX_SHADER
, vertex_shader_client_id
, vertex_shader_service_id
);
1461 GL_FRAGMENT_SHADER
, fragment_shader_client_id
,
1462 fragment_shader_service_id
);
1464 TestHelper::SetShaderStates(
1465 gl_
.get(), GetShader(vertex_shader_client_id
), true);
1466 TestHelper::SetShaderStates(
1467 gl_
.get(), GetShader(fragment_shader_client_id
), true);
1469 cmds::AttachShader attach_cmd
;
1470 attach_cmd
.Init(program_client_id
, vertex_shader_client_id
);
1471 EXPECT_EQ(error::kNoError
, ExecuteCmd(attach_cmd
));
1473 attach_cmd
.Init(program_client_id
, fragment_shader_client_id
);
1474 EXPECT_EQ(error::kNoError
, ExecuteCmd(attach_cmd
));
1476 cmds::LinkProgram link_cmd
;
1477 link_cmd
.Init(program_client_id
);
1479 EXPECT_EQ(error::kNoError
, ExecuteCmd(link_cmd
));
1482 void GLES2DecoderTestBase::DoEnableDisable(GLenum cap
, bool enable
) {
1483 SetupExpectationsForEnableDisable(cap
, enable
);
1487 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1491 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1495 void GLES2DecoderTestBase::DoEnableVertexAttribArray(GLint index
) {
1496 EXPECT_CALL(*gl_
, EnableVertexAttribArray(index
))
1498 .RetiresOnSaturation();
1499 cmds::EnableVertexAttribArray cmd
;
1501 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1504 void GLES2DecoderTestBase::DoBufferData(GLenum target
, GLsizei size
) {
1505 EXPECT_CALL(*gl_
, GetError())
1506 .WillOnce(Return(GL_NO_ERROR
))
1507 .RetiresOnSaturation();
1508 EXPECT_CALL(*gl_
, BufferData(target
, size
, _
, GL_STREAM_DRAW
))
1510 .RetiresOnSaturation();
1511 EXPECT_CALL(*gl_
, GetError())
1512 .WillOnce(Return(GL_NO_ERROR
))
1513 .RetiresOnSaturation();
1514 cmds::BufferData cmd
;
1515 cmd
.Init(target
, size
, 0, 0, GL_STREAM_DRAW
);
1516 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1519 void GLES2DecoderTestBase::DoBufferSubData(
1520 GLenum target
, GLint offset
, GLsizei size
, const void* data
) {
1521 EXPECT_CALL(*gl_
, BufferSubData(target
, offset
, size
,
1522 shared_memory_address_
))
1524 .RetiresOnSaturation();
1525 memcpy(shared_memory_address_
, data
, size
);
1526 cmds::BufferSubData cmd
;
1527 cmd
.Init(target
, offset
, size
, shared_memory_id_
, shared_memory_offset_
);
1528 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1531 void GLES2DecoderTestBase::SetupVertexBuffer() {
1532 DoEnableVertexAttribArray(1);
1533 DoBindBuffer(GL_ARRAY_BUFFER
, client_buffer_id_
, kServiceBufferId
);
1535 DoBufferData(GL_ARRAY_BUFFER
, kNumVertices
* 2 * sizeof(f
));
1538 void GLES2DecoderTestBase::SetupAllNeededVertexBuffers() {
1539 DoBindBuffer(GL_ARRAY_BUFFER
, client_buffer_id_
, kServiceBufferId
);
1540 DoBufferData(GL_ARRAY_BUFFER
, kNumVertices
* 16 * sizeof(float));
1541 DoEnableVertexAttribArray(0);
1542 DoEnableVertexAttribArray(1);
1543 DoEnableVertexAttribArray(2);
1544 DoVertexAttribPointer(0, 2, GL_FLOAT
, 0, 0);
1545 DoVertexAttribPointer(1, 2, GL_FLOAT
, 0, 0);
1546 DoVertexAttribPointer(2, 2, GL_FLOAT
, 0, 0);
1549 void GLES2DecoderTestBase::SetupIndexBuffer() {
1550 DoBindBuffer(GL_ELEMENT_ARRAY_BUFFER
,
1551 client_element_buffer_id_
,
1552 kServiceElementBufferId
);
1553 static const GLshort indices
[] = {100, 1, 2, 3, 4, 5, 6, 7, 100, 9};
1554 COMPILE_ASSERT(arraysize(indices
) == kNumIndices
, Indices_is_not_10
);
1555 DoBufferData(GL_ELEMENT_ARRAY_BUFFER
, sizeof(indices
));
1556 DoBufferSubData(GL_ELEMENT_ARRAY_BUFFER
, 0, 2, indices
);
1557 DoBufferSubData(GL_ELEMENT_ARRAY_BUFFER
, 2, sizeof(indices
) - 2, &indices
[1]);
1560 void GLES2DecoderTestBase::SetupTexture() {
1561 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
1562 DoTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
1563 kSharedMemoryId
, kSharedMemoryOffset
);
1566 void GLES2DecoderTestBase::DeleteVertexBuffer() {
1567 DoDeleteBuffer(client_buffer_id_
, kServiceBufferId
);
1570 void GLES2DecoderTestBase::DeleteIndexBuffer() {
1571 DoDeleteBuffer(client_element_buffer_id_
, kServiceElementBufferId
);
1574 void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0WithError(
1575 GLsizei num_vertices
, GLuint buffer_id
, GLenum error
) {
1576 if (gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2
) {
1580 EXPECT_CALL(*gl_
, GetError())
1581 .WillOnce(Return(GL_NO_ERROR
))
1582 .WillOnce(Return(error
))
1583 .RetiresOnSaturation();
1584 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, kServiceAttrib0BufferId
))
1586 .RetiresOnSaturation();
1587 EXPECT_CALL(*gl_
, BufferData(GL_ARRAY_BUFFER
,
1588 num_vertices
* sizeof(GLfloat
) * 4,
1589 _
, GL_DYNAMIC_DRAW
))
1591 .RetiresOnSaturation();
1592 if (error
== GL_NO_ERROR
) {
1593 EXPECT_CALL(*gl_
, BufferSubData(
1594 GL_ARRAY_BUFFER
, 0, num_vertices
* sizeof(GLfloat
) * 4, _
))
1596 .RetiresOnSaturation();
1597 EXPECT_CALL(*gl_
, VertexAttribPointer(0, 4, GL_FLOAT
, GL_FALSE
, 0, NULL
))
1599 .RetiresOnSaturation();
1600 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, buffer_id
))
1602 .RetiresOnSaturation();
1606 void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0(
1607 GLsizei num_vertices
, GLuint buffer_id
) {
1608 AddExpectationsForSimulatedAttrib0WithError(
1609 num_vertices
, buffer_id
, GL_NO_ERROR
);
1612 void GLES2DecoderTestBase::SetupMockGLBehaviors() {
1613 ON_CALL(*gl_
, BindVertexArrayOES(_
))
1614 .WillByDefault(Invoke(
1616 &GLES2DecoderTestBase::MockGLStates::OnBindVertexArrayOES
));
1617 ON_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, _
))
1618 .WillByDefault(WithArg
<1>(Invoke(
1620 &GLES2DecoderTestBase::MockGLStates::OnBindArrayBuffer
)));
1621 ON_CALL(*gl_
, VertexAttribPointer(_
, _
, _
, _
, _
, NULL
))
1622 .WillByDefault(InvokeWithoutArgs(
1624 &GLES2DecoderTestBase::MockGLStates::OnVertexAttribNullPointer
));
1627 GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::
1628 MockCommandBufferEngine() {
1630 scoped_ptr
<base::SharedMemory
> shm(new base::SharedMemory());
1631 shm
->CreateAndMapAnonymous(kSharedBufferSize
);
1632 valid_buffer_
= MakeBufferFromSharedMemory(shm
.Pass(), kSharedBufferSize
);
1634 ClearSharedMemory();
1637 GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::
1638 ~MockCommandBufferEngine() {}
1640 scoped_refptr
<gpu::Buffer
>
1641 GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::GetSharedMemoryBuffer(
1643 return shm_id
== kSharedMemoryId
? valid_buffer_
: invalid_buffer_
;
1646 void GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::set_token(
1651 bool GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::SetGetBuffer(
1652 int32
/* transfer_buffer_id */) {
1657 bool GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::SetGetOffset(
1663 int32
GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::GetGetOffset() {
1668 void GLES2DecoderWithShaderTestBase::SetUp() {
1669 GLES2DecoderTestBase::SetUp();
1670 SetupDefaultProgram();
1673 // Include the auto-generated part of this file. We split this because it means
1674 // we can easily edit the non-auto generated parts right here in this file
1675 // instead of having to edit some template or the code generator.
1676 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h"
1678 } // namespace gles2