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/common/value_state.h"
16 #include "gpu/command_buffer/service/cmd_buffer_engine.h"
17 #include "gpu/command_buffer/service/context_group.h"
18 #include "gpu/command_buffer/service/logger.h"
19 #include "gpu/command_buffer/service/mailbox_manager.h"
20 #include "gpu/command_buffer/service/program_manager.h"
21 #include "gpu/command_buffer/service/test_helper.h"
22 #include "gpu/command_buffer/service/vertex_attrib_manager.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24 #include "ui/gl/gl_implementation.h"
25 #include "ui/gl/gl_mock.h"
26 #include "ui/gl/test/gl_surface_test_support.h"
28 using ::gfx::MockGLInterface
;
30 using ::testing::AnyNumber
;
31 using ::testing::DoAll
;
32 using ::testing::InSequence
;
33 using ::testing::Invoke
;
34 using ::testing::InvokeWithoutArgs
;
35 using ::testing::MatcherCast
;
36 using ::testing::Pointee
;
37 using ::testing::Return
;
38 using ::testing::SetArrayArgument
;
39 using ::testing::SetArgPointee
;
40 using ::testing::SetArgumentPointee
;
41 using ::testing::StrEq
;
42 using ::testing::StrictMock
;
43 using ::testing::WithArg
;
47 void NormalizeInitState(gpu::gles2::GLES2DecoderTestBase::InitState
* init
) {
49 const char* kVAOExtensions
[] = {
50 "GL_OES_vertex_array_object",
51 "GL_ARB_vertex_array_object",
52 "GL_APPLE_vertex_array_object"
54 bool contains_vao_extension
= false;
55 for (size_t ii
= 0; ii
< arraysize(kVAOExtensions
); ++ii
) {
56 if (init
->extensions
.find(kVAOExtensions
[ii
]) != std::string::npos
) {
57 contains_vao_extension
= true;
62 if (init
->use_native_vao
) {
63 if (contains_vao_extension
)
65 if (!init
->extensions
.empty())
66 init
->extensions
+= " ";
67 if (base::StartsWith(init
->gl_version
, "opengl es",
68 base::CompareCase::INSENSITIVE_ASCII
)) {
69 init
->extensions
+= kVAOExtensions
[0];
71 #if !defined(OS_MACOSX)
72 init
->extensions
+= kVAOExtensions
[1];
74 init
->extensions
+= kVAOExtensions
[2];
78 // Make sure we don't set up an invalid InitState.
79 CHECK(!contains_vao_extension
);
82 if (!init
->extensions
.empty())
83 init
->extensions
+= " ";
84 init
->extensions
+= "GL_EXT_framebuffer_object ";
87 const uint32 kMaxColorAttachments
= 16;
88 const uint32 kMaxDrawBuffers
= 16;
90 } // namespace Anonymous
95 GLES2DecoderTestBase::GLES2DecoderTestBase()
98 memory_tracker_(NULL
),
99 client_buffer_id_(100),
100 client_framebuffer_id_(101),
101 client_program_id_(102),
102 client_renderbuffer_id_(103),
103 client_sampler_id_(104),
104 client_shader_id_(105),
105 client_texture_id_(106),
106 client_element_buffer_id_(107),
107 client_vertex_shader_id_(121),
108 client_fragment_shader_id_(122),
109 client_query_id_(123),
110 client_vertexarray_id_(124),
111 client_valuebuffer_id_(125),
112 client_transformfeedback_id_(126),
113 client_sync_id_(127),
114 service_renderbuffer_id_(0),
115 service_renderbuffer_valid_(false),
116 ignore_cached_state_for_test_(GetParam()),
117 cached_color_mask_red_(true),
118 cached_color_mask_green_(true),
119 cached_color_mask_blue_(true),
120 cached_color_mask_alpha_(true),
121 cached_depth_mask_(true),
122 cached_stencil_front_mask_(static_cast<GLuint
>(-1)),
123 cached_stencil_back_mask_(static_cast<GLuint
>(-1)) {
124 memset(immediate_buffer_
, 0xEE, sizeof(immediate_buffer_
));
127 GLES2DecoderTestBase::~GLES2DecoderTestBase() {}
129 void GLES2DecoderTestBase::SetUp() {
131 // Autogenerated tests do not overwrite version or extension string,
132 // so we have to pick something that supports everything here.
133 init
.gl_version
= "4.4";
134 init
.extensions
+= " GL_ARB_compatibility";
135 init
.has_alpha
= true;
136 init
.has_depth
= true;
137 init
.request_alpha
= true;
138 init
.request_depth
= true;
139 init
.bind_generates_resource
= true;
143 void GLES2DecoderTestBase::AddExpectationsForVertexAttribManager() {
144 for (GLint ii
= 0; ii
< kNumVertexAttribs
; ++ii
) {
145 EXPECT_CALL(*gl_
, VertexAttrib4f(ii
, 0.0f
, 0.0f
, 0.0f
, 1.0f
))
147 .RetiresOnSaturation();
151 GLES2DecoderTestBase::InitState::InitState()
152 : extensions("GL_EXT_framebuffer_object"),
157 request_alpha(false),
158 request_depth(false),
159 request_stencil(false),
160 bind_generates_resource(false),
161 lose_context_when_out_of_memory(false),
162 use_native_vao(true),
166 void GLES2DecoderTestBase::InitDecoder(const InitState
& init
) {
167 InitDecoderWithCommandLine(init
, NULL
);
170 void GLES2DecoderTestBase::InitDecoderWithCommandLine(
171 const InitState
& init
,
172 const base::CommandLine
* command_line
) {
173 InitState normalized_init
= init
;
174 NormalizeInitState(&normalized_init
);
175 // For easier substring/extension matching
176 DCHECK(normalized_init
.extensions
.empty() ||
177 *normalized_init
.extensions
.rbegin() == ' ');
178 gfx::SetGLGetProcAddressProc(gfx::MockGLInterface::GetGLProcAddress
);
179 gfx::GLSurfaceTestSupport::InitializeOneOffWithMockBindings();
181 gl_
.reset(new StrictMock
<MockGLInterface
>());
182 ::gfx::MockGLInterface::SetGLInterface(gl_
.get());
184 SetupMockGLBehaviors();
186 scoped_refptr
<FeatureInfo
> feature_info
;
188 feature_info
= new FeatureInfo(*command_line
);
189 group_
= scoped_refptr
<ContextGroup
>(
190 new ContextGroup(NULL
, memory_tracker_
, new ShaderTranslatorCache
,
191 new FramebufferCompletenessCache
, feature_info
.get(),
192 new SubscriptionRefSet
, new ValueStateMap
,
193 normalized_init
.bind_generates_resource
));
194 bool use_default_textures
= normalized_init
.bind_generates_resource
;
198 surface_
= new gfx::GLSurfaceStub
;
199 surface_
->SetSize(gfx::Size(kBackBufferWidth
, kBackBufferHeight
));
201 // Context needs to be created before initializing ContextGroup, which will
202 // in turn initialize FeatureInfo, which needs a context to determine
203 // extension support.
204 context_
= new StrictMock
<GLContextMock
>();
205 context_
->AddExtensionsString(normalized_init
.extensions
.c_str());
206 context_
->SetGLVersionString(normalized_init
.gl_version
.c_str());
208 context_
->GLContextStubWithExtensions::MakeCurrent(surface_
.get());
209 gfx::GLSurfaceTestSupport::InitializeDynamicMockBindings(context_
.get());
211 TestHelper::SetupContextGroupInitExpectations(
213 DisallowedFeatures(),
214 normalized_init
.extensions
.c_str(),
215 normalized_init
.gl_version
.c_str(),
216 normalized_init
.bind_generates_resource
);
218 // We initialize the ContextGroup with a MockGLES2Decoder so that
219 // we can use the ContextGroup to figure out how the real GLES2Decoder
220 // will initialize itself.
221 mock_decoder_
.reset(new MockGLES2Decoder());
223 // Install FakeDoCommands handler so we can use individual DoCommand()
225 EXPECT_CALL(*mock_decoder_
, DoCommands(_
, _
, _
, _
)).WillRepeatedly(
226 Invoke(mock_decoder_
.get(), &MockGLES2Decoder::FakeDoCommands
));
229 EXPECT_TRUE(group_
->Initialize(
231 ContextGroup::GetContextType(init
.webgl_version
),
232 DisallowedFeatures()));
234 if (init
.webgl_version
== 2) {
235 EXPECT_CALL(*gl_
, GetIntegerv(GL_MAX_COLOR_ATTACHMENTS
, _
))
236 .WillOnce(SetArgumentPointee
<1>(kMaxColorAttachments
))
237 .RetiresOnSaturation();
238 EXPECT_CALL(*gl_
, GetIntegerv(GL_MAX_DRAW_BUFFERS
, _
))
239 .WillOnce(SetArgumentPointee
<1>(kMaxDrawBuffers
))
240 .RetiresOnSaturation();
243 if (group_
->feature_info()->feature_flags().native_vertex_array_object
) {
244 EXPECT_CALL(*gl_
, GenVertexArraysOES(1, _
))
245 .WillOnce(SetArgumentPointee
<1>(kServiceVertexArrayId
))
246 .RetiresOnSaturation();
247 EXPECT_CALL(*gl_
, BindVertexArrayOES(_
)).Times(1).RetiresOnSaturation();
250 if (group_
->feature_info()->workarounds().init_vertex_attributes
)
251 AddExpectationsForVertexAttribManager();
253 AddExpectationsForBindVertexArrayOES();
255 EXPECT_CALL(*gl_
, EnableVertexAttribArray(0))
257 .RetiresOnSaturation();
258 static GLuint attrib_0_id
[] = {
259 kServiceAttrib0BufferId
,
261 static GLuint fixed_attrib_buffer_id
[] = {
262 kServiceFixedAttribBufferId
,
264 EXPECT_CALL(*gl_
, GenBuffersARB(arraysize(attrib_0_id
), _
))
265 .WillOnce(SetArrayArgument
<1>(attrib_0_id
,
266 attrib_0_id
+ arraysize(attrib_0_id
)))
267 .RetiresOnSaturation();
268 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, kServiceAttrib0BufferId
))
270 .RetiresOnSaturation();
271 EXPECT_CALL(*gl_
, VertexAttribPointer(0, 1, GL_FLOAT
, GL_FALSE
, 0, NULL
))
273 .RetiresOnSaturation();
274 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, 0))
276 .RetiresOnSaturation();
277 EXPECT_CALL(*gl_
, GenBuffersARB(arraysize(fixed_attrib_buffer_id
), _
))
278 .WillOnce(SetArrayArgument
<1>(
279 fixed_attrib_buffer_id
,
280 fixed_attrib_buffer_id
+ arraysize(fixed_attrib_buffer_id
)))
281 .RetiresOnSaturation();
283 for (GLint tt
= 0; tt
< TestHelper::kNumTextureUnits
; ++tt
) {
284 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
+ tt
))
286 .RetiresOnSaturation();
287 if (group_
->feature_info()->feature_flags().oes_egl_image_external
) {
289 BindTexture(GL_TEXTURE_EXTERNAL_OES
,
291 ? TestHelper::kServiceDefaultExternalTextureId
294 .RetiresOnSaturation();
296 if (group_
->feature_info()->feature_flags().arb_texture_rectangle
) {
299 BindTexture(GL_TEXTURE_RECTANGLE_ARB
,
301 ? TestHelper::kServiceDefaultRectangleTextureId
304 .RetiresOnSaturation();
307 BindTexture(GL_TEXTURE_CUBE_MAP
,
309 ? TestHelper::kServiceDefaultTextureCubemapId
312 .RetiresOnSaturation();
317 use_default_textures
? TestHelper::kServiceDefaultTexture2dId
: 0))
319 .RetiresOnSaturation();
321 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
))
323 .RetiresOnSaturation();
325 EXPECT_CALL(*gl_
, BindFramebufferEXT(GL_FRAMEBUFFER
, 0))
327 .RetiresOnSaturation();
328 EXPECT_CALL(*gl_
, GetIntegerv(GL_ALPHA_BITS
, _
))
329 .WillOnce(SetArgumentPointee
<1>(normalized_init
.has_alpha
? 8 : 0))
330 .RetiresOnSaturation();
331 EXPECT_CALL(*gl_
, GetIntegerv(GL_DEPTH_BITS
, _
))
332 .WillOnce(SetArgumentPointee
<1>(normalized_init
.has_depth
? 24 : 0))
333 .RetiresOnSaturation();
334 EXPECT_CALL(*gl_
, GetIntegerv(GL_STENCIL_BITS
, _
))
335 .WillOnce(SetArgumentPointee
<1>(normalized_init
.has_stencil
? 8 : 0))
336 .RetiresOnSaturation();
338 if (!group_
->feature_info()->gl_version_info().BehavesLikeGLES()) {
339 EXPECT_CALL(*gl_
, Enable(GL_VERTEX_PROGRAM_POINT_SIZE
))
341 .RetiresOnSaturation();
343 EXPECT_CALL(*gl_
, Enable(GL_POINT_SPRITE
))
345 .RetiresOnSaturation();
348 static GLint max_viewport_dims
[] = {
352 EXPECT_CALL(*gl_
, GetIntegerv(GL_MAX_VIEWPORT_DIMS
, _
))
353 .WillOnce(SetArrayArgument
<1>(
354 max_viewport_dims
, max_viewport_dims
+ arraysize(max_viewport_dims
)))
355 .RetiresOnSaturation();
357 SetupInitCapabilitiesExpectations(group_
->feature_info()->IsES3Capable());
358 SetupInitStateExpectations();
360 EXPECT_CALL(*gl_
, ActiveTexture(GL_TEXTURE0
))
362 .RetiresOnSaturation();
364 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, 0))
366 .RetiresOnSaturation();
367 EXPECT_CALL(*gl_
, BindBuffer(GL_ELEMENT_ARRAY_BUFFER
, 0))
369 .RetiresOnSaturation();
370 EXPECT_CALL(*gl_
, BindFramebufferEXT(GL_FRAMEBUFFER
, 0))
372 .RetiresOnSaturation();
373 EXPECT_CALL(*gl_
, BindRenderbufferEXT(GL_RENDERBUFFER
, 0))
375 .RetiresOnSaturation();
377 // TODO(boliu): Remove OS_ANDROID once crbug.com/259023 is fixed and the
378 // workaround has been reverted.
379 #if !defined(OS_ANDROID)
380 if (normalized_init
.has_alpha
&& !normalized_init
.request_alpha
) {
381 EXPECT_CALL(*gl_
, ClearColor(0, 0, 0, 1)).Times(1).RetiresOnSaturation();
384 EXPECT_CALL(*gl_
, Clear(
385 GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
| GL_STENCIL_BUFFER_BIT
))
387 .RetiresOnSaturation();
389 if (normalized_init
.has_alpha
&& !normalized_init
.request_alpha
) {
390 EXPECT_CALL(*gl_
, ClearColor(0, 0, 0, 0)).Times(1).RetiresOnSaturation();
394 engine_
.reset(new StrictMock
<MockCommandBufferEngine
>());
395 scoped_refptr
<gpu::Buffer
> buffer
=
396 engine_
->GetSharedMemoryBuffer(kSharedMemoryId
);
397 shared_memory_offset_
= kSharedMemoryOffset
;
398 shared_memory_address_
=
399 reinterpret_cast<int8
*>(buffer
->memory()) + shared_memory_offset_
;
400 shared_memory_id_
= kSharedMemoryId
;
401 shared_memory_base_
= buffer
->memory();
403 static const int32 kLoseContextWhenOutOfMemory
= 0x10002;
404 static const int32 kWebGLVersion
= 0x10003;
406 int32 attributes
[] = {
408 normalized_init
.request_alpha
? 8 : 0,
410 normalized_init
.request_depth
? 24 : 0,
412 normalized_init
.request_stencil
? 8 : 0,
413 kLoseContextWhenOutOfMemory
,
414 normalized_init
.lose_context_when_out_of_memory
? 1 : 0,
418 std::vector
<int32
> attribs(attributes
, attributes
+ arraysize(attributes
));
420 decoder_
.reset(GLES2Decoder::Create(group_
.get()));
421 decoder_
->SetIgnoreCachedStateForTest(ignore_cached_state_for_test_
);
422 decoder_
->GetLogger()->set_log_synthesized_gl_errors(false);
423 decoder_
->Initialize(surface_
,
427 DisallowedFeatures(),
429 EXPECT_CALL(*context_
, MakeCurrent(surface_
.get())).WillOnce(Return(true));
430 if (context_
->WasAllocatedUsingRobustnessExtension()) {
431 EXPECT_CALL(*gl_
, GetGraphicsResetStatusARB())
432 .WillOnce(Return(GL_NO_ERROR
));
434 decoder_
->MakeCurrent();
435 decoder_
->set_engine(engine_
.get());
436 decoder_
->BeginDecoding();
438 EXPECT_CALL(*gl_
, GenBuffersARB(_
, _
))
439 .WillOnce(SetArgumentPointee
<1>(kServiceBufferId
))
440 .RetiresOnSaturation();
441 GenHelper
<cmds::GenBuffersImmediate
>(client_buffer_id_
);
442 EXPECT_CALL(*gl_
, GenFramebuffersEXT(_
, _
))
443 .WillOnce(SetArgumentPointee
<1>(kServiceFramebufferId
))
444 .RetiresOnSaturation();
445 GenHelper
<cmds::GenFramebuffersImmediate
>(client_framebuffer_id_
);
446 EXPECT_CALL(*gl_
, GenRenderbuffersEXT(_
, _
))
447 .WillOnce(SetArgumentPointee
<1>(kServiceRenderbufferId
))
448 .RetiresOnSaturation();
449 GenHelper
<cmds::GenRenderbuffersImmediate
>(client_renderbuffer_id_
);
450 EXPECT_CALL(*gl_
, GenTextures(_
, _
))
451 .WillOnce(SetArgumentPointee
<1>(kServiceTextureId
))
452 .RetiresOnSaturation();
453 GenHelper
<cmds::GenTexturesImmediate
>(client_texture_id_
);
454 EXPECT_CALL(*gl_
, GenBuffersARB(_
, _
))
455 .WillOnce(SetArgumentPointee
<1>(kServiceElementBufferId
))
456 .RetiresOnSaturation();
457 GenHelper
<cmds::GenBuffersImmediate
>(client_element_buffer_id_
);
459 DoCreateProgram(client_program_id_
, kServiceProgramId
);
460 DoCreateShader(GL_VERTEX_SHADER
, client_shader_id_
, kServiceShaderId
);
463 bool reset_unsafe_es3_apis_enabled
= false;
464 if (!decoder_
->unsafe_es3_apis_enabled()) {
465 decoder_
->set_unsafe_es3_apis_enabled(true);
466 reset_unsafe_es3_apis_enabled
= true;
469 const gfx::GLVersionInfo
* version
= context_
->GetVersionInfo();
470 if (version
->IsAtLeastGL(3, 3) || version
->IsAtLeastGLES(3, 0)) {
471 EXPECT_CALL(*gl_
, GenSamplers(_
, _
))
472 .WillOnce(SetArgumentPointee
<1>(kServiceSamplerId
))
473 .RetiresOnSaturation();
474 GenHelper
<cmds::GenSamplersImmediate
>(client_sampler_id_
);
476 if (version
->IsAtLeastGL(4, 0) || version
->IsAtLeastGLES(3, 0)) {
477 EXPECT_CALL(*gl_
, GenTransformFeedbacks(_
, _
))
478 .WillOnce(SetArgumentPointee
<1>(kServiceTransformFeedbackId
))
479 .RetiresOnSaturation();
480 GenHelper
<cmds::GenTransformFeedbacksImmediate
>(
481 client_transformfeedback_id_
);
484 if (init
.extensions
.find("GL_ARB_sync ") != std::string::npos
||
485 version
->IsAtLeastGL(3, 2) || version
->IsAtLeastGLES(3, 0)) {
486 DoFenceSync(client_sync_id_
, kServiceSyncId
);
489 if (reset_unsafe_es3_apis_enabled
) {
490 decoder_
->set_unsafe_es3_apis_enabled(false);
493 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
496 void GLES2DecoderTestBase::ResetDecoder() {
499 // All Tests should have read all their GLErrors before getting here.
500 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
502 EXPECT_CALL(*gl_
, DeleteBuffersARB(1, _
))
504 .RetiresOnSaturation();
505 if (group_
->feature_info()->feature_flags().native_vertex_array_object
) {
506 EXPECT_CALL(*gl_
, DeleteVertexArraysOES(1, Pointee(kServiceVertexArrayId
)))
508 .RetiresOnSaturation();
511 decoder_
->EndDecoding();
512 decoder_
->Destroy(true);
514 group_
->Destroy(mock_decoder_
.get(), false);
516 ::gfx::MockGLInterface::SetGLInterface(NULL
);
518 gfx::ClearGLBindings();
521 void GLES2DecoderTestBase::TearDown() {
525 void GLES2DecoderTestBase::ExpectEnableDisable(GLenum cap
, bool enable
) {
527 EXPECT_CALL(*gl_
, Enable(cap
))
529 .RetiresOnSaturation();
531 EXPECT_CALL(*gl_
, Disable(cap
))
533 .RetiresOnSaturation();
538 GLint
GLES2DecoderTestBase::GetGLError() {
539 EXPECT_CALL(*gl_
, GetError())
540 .WillOnce(Return(GL_NO_ERROR
))
541 .RetiresOnSaturation();
543 cmd
.Init(shared_memory_id_
, shared_memory_offset_
);
544 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
545 return static_cast<GLint
>(*GetSharedMemoryAs
<GLenum
*>());
548 void GLES2DecoderTestBase::DoCreateShader(
549 GLenum shader_type
, GLuint client_id
, GLuint service_id
) {
550 EXPECT_CALL(*gl_
, CreateShader(shader_type
))
552 .WillOnce(Return(service_id
))
553 .RetiresOnSaturation();
554 cmds::CreateShader cmd
;
555 cmd
.Init(shader_type
, client_id
);
556 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
559 bool GLES2DecoderTestBase::DoIsShader(GLuint client_id
) {
560 return IsObjectHelper
<cmds::IsShader
, cmds::IsShader::Result
>(client_id
);
563 void GLES2DecoderTestBase::DoDeleteShader(
564 GLuint client_id
, GLuint service_id
) {
565 EXPECT_CALL(*gl_
, DeleteShader(service_id
))
567 .RetiresOnSaturation();
568 cmds::DeleteShader cmd
;
570 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
573 void GLES2DecoderTestBase::DoCreateProgram(
574 GLuint client_id
, GLuint service_id
) {
575 EXPECT_CALL(*gl_
, CreateProgram())
577 .WillOnce(Return(service_id
))
578 .RetiresOnSaturation();
579 cmds::CreateProgram cmd
;
581 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
584 bool GLES2DecoderTestBase::DoIsProgram(GLuint client_id
) {
585 return IsObjectHelper
<cmds::IsProgram
, cmds::IsProgram::Result
>(client_id
);
588 void GLES2DecoderTestBase::DoDeleteProgram(
589 GLuint client_id
, GLuint
/* service_id */) {
590 cmds::DeleteProgram cmd
;
592 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
595 void GLES2DecoderTestBase::DoFenceSync(
596 GLuint client_id
, GLuint service_id
) {
597 EXPECT_CALL(*gl_
, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE
, 0))
599 .WillOnce(Return(reinterpret_cast<GLsync
>(service_id
)))
600 .RetiresOnSaturation();
603 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
606 void GLES2DecoderTestBase::SetBucketData(
607 uint32_t bucket_id
, const void* data
, uint32_t data_size
) {
608 DCHECK(data
|| data_size
== 0);
609 cmd::SetBucketSize cmd1
;
610 cmd1
.Init(bucket_id
, data_size
);
611 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
613 memcpy(shared_memory_address_
, data
, data_size
);
614 cmd::SetBucketData cmd2
;
615 cmd2
.Init(bucket_id
, 0, data_size
, kSharedMemoryId
, kSharedMemoryOffset
);
616 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
621 void GLES2DecoderTestBase::SetBucketAsCString(
622 uint32 bucket_id
, const char* str
) {
623 SetBucketData(bucket_id
, str
, str
? (strlen(str
) + 1) : 0);
626 void GLES2DecoderTestBase::SetBucketAsCStrings(
627 uint32 bucket_id
, GLsizei count
, const char** str
,
628 GLsizei count_in_header
, char str_end
) {
629 uint32_t header_size
= sizeof(GLint
) * (count
+ 1);
630 uint32_t total_size
= header_size
;
631 scoped_ptr
<GLint
[]> header(new GLint
[count
+ 1]);
632 header
[0] = static_cast<GLint
>(count_in_header
);
633 for (GLsizei ii
= 0; ii
< count
; ++ii
) {
634 header
[ii
+ 1] = str
&& str
[ii
] ? strlen(str
[ii
]) : 0;
635 total_size
+= header
[ii
+ 1] + 1;
637 cmd::SetBucketSize cmd1
;
638 cmd1
.Init(bucket_id
, total_size
);
639 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd1
));
640 memcpy(shared_memory_address_
, header
.get(), header_size
);
641 uint32_t offset
= header_size
;
642 for (GLsizei ii
= 0; ii
< count
; ++ii
) {
643 if (str
&& str
[ii
]) {
644 size_t str_len
= strlen(str
[ii
]);
645 memcpy(reinterpret_cast<char*>(shared_memory_address_
) + offset
,
649 memcpy(reinterpret_cast<char*>(shared_memory_address_
) + offset
,
653 cmd::SetBucketData cmd2
;
654 cmd2
.Init(bucket_id
, 0, total_size
, kSharedMemoryId
, kSharedMemoryOffset
);
655 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd2
));
659 void GLES2DecoderTestBase::SetupClearTextureExpectations(GLuint service_id
,
660 GLuint old_service_id
,
664 GLenum internal_format
,
671 EXPECT_CALL(*gl_
, BindTexture(bind_target
, service_id
))
673 .RetiresOnSaturation();
674 EXPECT_CALL(*gl_
, TexSubImage2D(target
, level
, xoffset
, yoffset
, width
,
675 height
, format
, type
, _
))
677 .RetiresOnSaturation();
678 EXPECT_CALL(*gl_
, BindTexture(bind_target
, old_service_id
))
680 .RetiresOnSaturation();
683 void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearing(
686 GLclampf restore_red
,
687 GLclampf restore_green
,
688 GLclampf restore_blue
,
689 GLclampf restore_alpha
,
690 GLuint restore_stencil
,
691 GLclampf restore_depth
,
692 bool restore_scissor_test
,
693 GLint restore_scissor_x
,
694 GLint restore_scissor_y
,
695 GLsizei restore_scissor_width
,
696 GLsizei restore_scissor_height
) {
697 SetupExpectationsForFramebufferClearingMulti(
698 0, 0, target
, clear_bits
, restore_red
, restore_green
, restore_blue
,
699 restore_alpha
, restore_stencil
, restore_depth
, restore_scissor_test
,
700 restore_scissor_x
, restore_scissor_y
, restore_scissor_width
,
701 restore_scissor_height
);
704 void GLES2DecoderTestBase::SetupExpectationsForRestoreClearState(
705 GLclampf restore_red
,
706 GLclampf restore_green
,
707 GLclampf restore_blue
,
708 GLclampf restore_alpha
,
709 GLuint restore_stencil
,
710 GLclampf restore_depth
,
711 bool restore_scissor_test
,
712 GLint restore_scissor_x
,
713 GLint restore_scissor_y
,
714 GLsizei restore_scissor_width
,
715 GLsizei restore_scissor_height
) {
716 EXPECT_CALL(*gl_
, ClearColor(
717 restore_red
, restore_green
, restore_blue
, restore_alpha
))
719 .RetiresOnSaturation();
720 EXPECT_CALL(*gl_
, ClearStencil(restore_stencil
))
722 .RetiresOnSaturation();
723 EXPECT_CALL(*gl_
, ClearDepth(restore_depth
))
725 .RetiresOnSaturation();
726 SetupExpectationsForEnableDisable(GL_SCISSOR_TEST
, restore_scissor_test
);
727 EXPECT_CALL(*gl_
, Scissor(restore_scissor_x
, restore_scissor_y
,
728 restore_scissor_width
, restore_scissor_height
))
730 .RetiresOnSaturation();
733 void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearingMulti(
734 GLuint read_framebuffer_service_id
,
735 GLuint draw_framebuffer_service_id
,
738 GLclampf restore_red
,
739 GLclampf restore_green
,
740 GLclampf restore_blue
,
741 GLclampf restore_alpha
,
742 GLuint restore_stencil
,
743 GLclampf restore_depth
,
744 bool restore_scissor_test
,
745 GLint restore_scissor_x
,
746 GLint restore_scissor_y
,
747 GLsizei restore_scissor_width
,
748 GLsizei restore_scissor_height
) {
749 // TODO(gman): Figure out why InSequence stopped working.
750 // InSequence sequence;
751 EXPECT_CALL(*gl_
, CheckFramebufferStatusEXT(target
))
752 .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE
))
753 .RetiresOnSaturation();
754 if (target
== GL_READ_FRAMEBUFFER_EXT
) {
755 EXPECT_CALL(*gl_
, BindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT
, 0))
757 .RetiresOnSaturation();
758 EXPECT_CALL(*gl_
, BindFramebufferEXT(
759 GL_DRAW_FRAMEBUFFER_EXT
, read_framebuffer_service_id
))
761 .RetiresOnSaturation();
763 if ((clear_bits
& GL_COLOR_BUFFER_BIT
) != 0) {
764 EXPECT_CALL(*gl_
, ClearColor(0.0f
, 0.0f
, 0.0f
, 0.0f
))
766 .RetiresOnSaturation();
767 SetupExpectationsForColorMask(true, true, true, true);
769 if ((clear_bits
& GL_STENCIL_BUFFER_BIT
) != 0) {
770 EXPECT_CALL(*gl_
, ClearStencil(0))
772 .RetiresOnSaturation();
773 EXPECT_CALL(*gl_
, StencilMask(static_cast<GLuint
>(-1)))
775 .RetiresOnSaturation();
777 if ((clear_bits
& GL_DEPTH_BUFFER_BIT
) != 0) {
778 EXPECT_CALL(*gl_
, ClearDepth(1.0f
))
780 .RetiresOnSaturation();
781 SetupExpectationsForDepthMask(true);
783 SetupExpectationsForEnableDisable(GL_SCISSOR_TEST
, false);
784 EXPECT_CALL(*gl_
, Clear(clear_bits
))
786 .RetiresOnSaturation();
787 SetupExpectationsForRestoreClearState(
788 restore_red
, restore_green
, restore_blue
, restore_alpha
, restore_stencil
,
789 restore_depth
, restore_scissor_test
, restore_scissor_x
, restore_scissor_y
,
790 restore_scissor_width
, restore_scissor_height
);
791 if (target
== GL_READ_FRAMEBUFFER_EXT
) {
792 EXPECT_CALL(*gl_
, BindFramebufferEXT(
793 GL_READ_FRAMEBUFFER_EXT
, read_framebuffer_service_id
))
795 .RetiresOnSaturation();
796 EXPECT_CALL(*gl_
, BindFramebufferEXT(
797 GL_DRAW_FRAMEBUFFER_EXT
, draw_framebuffer_service_id
))
799 .RetiresOnSaturation();
803 void GLES2DecoderTestBase::SetupShaderForUniform(GLenum uniform_type
) {
804 static AttribInfo attribs
[] = {
805 { "foo", 1, GL_FLOAT
, 1, },
806 { "goo", 1, GL_FLOAT
, 2, },
808 UniformInfo uniforms
[] = {
809 { "bar", 1, uniform_type
, 0, 2, -1, },
810 { "car", 4, uniform_type
, 1, 1, -1, },
812 const GLuint kClientVertexShaderId
= 5001;
813 const GLuint kServiceVertexShaderId
= 6001;
814 const GLuint kClientFragmentShaderId
= 5002;
815 const GLuint kServiceFragmentShaderId
= 6002;
816 SetupShader(attribs
, arraysize(attribs
), uniforms
, arraysize(uniforms
),
817 client_program_id_
, kServiceProgramId
,
818 kClientVertexShaderId
, kServiceVertexShaderId
,
819 kClientFragmentShaderId
, kServiceFragmentShaderId
);
821 EXPECT_CALL(*gl_
, UseProgram(kServiceProgramId
))
823 .RetiresOnSaturation();
824 cmds::UseProgram cmd
;
825 cmd
.Init(client_program_id_
);
826 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
829 void GLES2DecoderTestBase::DoBindBuffer(
830 GLenum target
, GLuint client_id
, GLuint service_id
) {
831 EXPECT_CALL(*gl_
, BindBuffer(target
, service_id
))
833 .RetiresOnSaturation();
834 cmds::BindBuffer cmd
;
835 cmd
.Init(target
, client_id
);
836 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
839 bool GLES2DecoderTestBase::DoIsBuffer(GLuint client_id
) {
840 return IsObjectHelper
<cmds::IsBuffer
, cmds::IsBuffer::Result
>(client_id
);
843 void GLES2DecoderTestBase::DoDeleteBuffer(
844 GLuint client_id
, GLuint service_id
) {
845 EXPECT_CALL(*gl_
, DeleteBuffersARB(1, Pointee(service_id
)))
847 .RetiresOnSaturation();
848 GenHelper
<cmds::DeleteBuffersImmediate
>(client_id
);
851 void GLES2DecoderTestBase::SetupExpectationsForColorMask(bool red
,
855 if (ignore_cached_state_for_test_
|| cached_color_mask_red_
!= red
||
856 cached_color_mask_green_
!= green
|| cached_color_mask_blue_
!= blue
||
857 cached_color_mask_alpha_
!= alpha
) {
858 cached_color_mask_red_
= red
;
859 cached_color_mask_green_
= green
;
860 cached_color_mask_blue_
= blue
;
861 cached_color_mask_alpha_
= alpha
;
862 EXPECT_CALL(*gl_
, ColorMask(red
, green
, blue
, alpha
))
864 .RetiresOnSaturation();
868 void GLES2DecoderTestBase::SetupExpectationsForDepthMask(bool mask
) {
869 if (ignore_cached_state_for_test_
|| cached_depth_mask_
!= mask
) {
870 cached_depth_mask_
= mask
;
871 EXPECT_CALL(*gl_
, DepthMask(mask
)).Times(1).RetiresOnSaturation();
875 void GLES2DecoderTestBase::SetupExpectationsForStencilMask(GLuint front_mask
,
877 if (ignore_cached_state_for_test_
||
878 cached_stencil_front_mask_
!= front_mask
) {
879 cached_stencil_front_mask_
= front_mask
;
880 EXPECT_CALL(*gl_
, StencilMaskSeparate(GL_FRONT
, front_mask
))
882 .RetiresOnSaturation();
885 if (ignore_cached_state_for_test_
||
886 cached_stencil_back_mask_
!= back_mask
) {
887 cached_stencil_back_mask_
= back_mask
;
888 EXPECT_CALL(*gl_
, StencilMaskSeparate(GL_BACK
, back_mask
))
890 .RetiresOnSaturation();
894 void GLES2DecoderTestBase::SetupExpectationsForEnableDisable(GLenum cap
,
898 if (enable_flags_
.cached_blend
== enable
&&
899 !ignore_cached_state_for_test_
)
901 enable_flags_
.cached_blend
= enable
;
904 if (enable_flags_
.cached_cull_face
== enable
&&
905 !ignore_cached_state_for_test_
)
907 enable_flags_
.cached_cull_face
= enable
;
910 if (enable_flags_
.cached_depth_test
== enable
&&
911 !ignore_cached_state_for_test_
)
913 enable_flags_
.cached_depth_test
= enable
;
916 if (enable_flags_
.cached_dither
== enable
&&
917 !ignore_cached_state_for_test_
)
919 enable_flags_
.cached_dither
= enable
;
921 case GL_POLYGON_OFFSET_FILL
:
922 if (enable_flags_
.cached_polygon_offset_fill
== enable
&&
923 !ignore_cached_state_for_test_
)
925 enable_flags_
.cached_polygon_offset_fill
= enable
;
927 case GL_SAMPLE_ALPHA_TO_COVERAGE
:
928 if (enable_flags_
.cached_sample_alpha_to_coverage
== enable
&&
929 !ignore_cached_state_for_test_
)
931 enable_flags_
.cached_sample_alpha_to_coverage
= enable
;
933 case GL_SAMPLE_COVERAGE
:
934 if (enable_flags_
.cached_sample_coverage
== enable
&&
935 !ignore_cached_state_for_test_
)
937 enable_flags_
.cached_sample_coverage
= enable
;
939 case GL_SCISSOR_TEST
:
940 if (enable_flags_
.cached_scissor_test
== enable
&&
941 !ignore_cached_state_for_test_
)
943 enable_flags_
.cached_scissor_test
= enable
;
945 case GL_STENCIL_TEST
:
946 if (enable_flags_
.cached_stencil_test
== enable
&&
947 !ignore_cached_state_for_test_
)
949 enable_flags_
.cached_stencil_test
= enable
;
956 EXPECT_CALL(*gl_
, Enable(cap
)).Times(1).RetiresOnSaturation();
958 EXPECT_CALL(*gl_
, Disable(cap
)).Times(1).RetiresOnSaturation();
962 void GLES2DecoderTestBase::SetupExpectationsForApplyingDirtyState(
963 bool framebuffer_is_rgb
,
964 bool framebuffer_has_depth
,
965 bool framebuffer_has_stencil
,
969 GLuint front_stencil_mask
,
970 GLuint back_stencil_mask
,
971 bool stencil_enabled
) {
972 bool color_mask_red
= (color_bits
& 0x1000) != 0;
973 bool color_mask_green
= (color_bits
& 0x0100) != 0;
974 bool color_mask_blue
= (color_bits
& 0x0010) != 0;
975 bool color_mask_alpha
= (color_bits
& 0x0001) && !framebuffer_is_rgb
;
977 SetupExpectationsForColorMask(
978 color_mask_red
, color_mask_green
, color_mask_blue
, color_mask_alpha
);
979 SetupExpectationsForDepthMask(depth_mask
);
980 SetupExpectationsForStencilMask(front_stencil_mask
, back_stencil_mask
);
981 SetupExpectationsForEnableDisable(GL_DEPTH_TEST
,
982 framebuffer_has_depth
&& depth_enabled
);
983 SetupExpectationsForEnableDisable(GL_STENCIL_TEST
,
984 framebuffer_has_stencil
&& stencil_enabled
);
987 void GLES2DecoderTestBase::SetupExpectationsForApplyingDefaultDirtyState() {
988 SetupExpectationsForApplyingDirtyState(false, // Framebuffer is RGB
989 false, // Framebuffer has depth
990 false, // Framebuffer has stencil
991 0x1111, // color bits
993 false, // depth enabled
994 0, // front stencil mask
995 0, // back stencil mask
996 false); // stencil enabled
999 GLES2DecoderTestBase::EnableFlags::EnableFlags()
1000 : cached_blend(false),
1001 cached_cull_face(false),
1002 cached_depth_test(false),
1003 cached_dither(true),
1004 cached_polygon_offset_fill(false),
1005 cached_sample_alpha_to_coverage(false),
1006 cached_sample_coverage(false),
1007 cached_scissor_test(false),
1008 cached_stencil_test(false) {
1011 void GLES2DecoderTestBase::DoBindFramebuffer(
1012 GLenum target
, GLuint client_id
, GLuint service_id
) {
1013 EXPECT_CALL(*gl_
, BindFramebufferEXT(target
, service_id
))
1015 .RetiresOnSaturation();
1016 cmds::BindFramebuffer cmd
;
1017 cmd
.Init(target
, client_id
);
1018 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1021 bool GLES2DecoderTestBase::DoIsFramebuffer(GLuint client_id
) {
1022 return IsObjectHelper
<cmds::IsFramebuffer
, cmds::IsFramebuffer::Result
>(
1026 void GLES2DecoderTestBase::DoDeleteFramebuffer(
1027 GLuint client_id
, GLuint service_id
,
1028 bool reset_draw
, GLenum draw_target
, GLuint draw_id
,
1029 bool reset_read
, GLenum read_target
, GLuint read_id
) {
1031 EXPECT_CALL(*gl_
, BindFramebufferEXT(draw_target
, draw_id
))
1033 .RetiresOnSaturation();
1036 EXPECT_CALL(*gl_
, BindFramebufferEXT(read_target
, read_id
))
1038 .RetiresOnSaturation();
1040 EXPECT_CALL(*gl_
, DeleteFramebuffersEXT(1, Pointee(service_id
)))
1042 .RetiresOnSaturation();
1043 GenHelper
<cmds::DeleteFramebuffersImmediate
>(client_id
);
1046 void GLES2DecoderTestBase::DoBindRenderbuffer(
1047 GLenum target
, GLuint client_id
, GLuint service_id
) {
1048 service_renderbuffer_id_
= service_id
;
1049 service_renderbuffer_valid_
= true;
1050 EXPECT_CALL(*gl_
, BindRenderbufferEXT(target
, service_id
))
1052 .RetiresOnSaturation();
1053 cmds::BindRenderbuffer cmd
;
1054 cmd
.Init(target
, client_id
);
1055 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1058 void GLES2DecoderTestBase::DoRenderbufferStorageMultisampleCHROMIUM(
1061 GLenum internal_format
,
1065 EXPECT_CALL(*gl_
, GetError())
1066 .WillOnce(Return(GL_NO_ERROR
))
1067 .RetiresOnSaturation();
1069 RenderbufferStorageMultisampleEXT(
1070 target
, samples
, gl_format
, width
, height
))
1072 .RetiresOnSaturation();
1073 EXPECT_CALL(*gl_
, GetError())
1074 .WillOnce(Return(GL_NO_ERROR
))
1075 .RetiresOnSaturation();
1076 cmds::RenderbufferStorageMultisampleCHROMIUM cmd
;
1077 cmd
.Init(target
, samples
, internal_format
, width
, height
);
1078 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1079 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1082 void GLES2DecoderTestBase::RestoreRenderbufferBindings() {
1083 GetDecoder()->RestoreRenderbufferBindings();
1084 service_renderbuffer_valid_
= false;
1087 void GLES2DecoderTestBase::EnsureRenderbufferBound(bool expect_bind
) {
1088 EXPECT_NE(expect_bind
, service_renderbuffer_valid_
);
1091 service_renderbuffer_valid_
= true;
1093 BindRenderbufferEXT(GL_RENDERBUFFER
, service_renderbuffer_id_
))
1095 .RetiresOnSaturation();
1097 EXPECT_CALL(*gl_
, BindRenderbufferEXT(_
, _
)).Times(0);
1101 bool GLES2DecoderTestBase::DoIsRenderbuffer(GLuint client_id
) {
1102 return IsObjectHelper
<cmds::IsRenderbuffer
, cmds::IsRenderbuffer::Result
>(
1106 void GLES2DecoderTestBase::DoDeleteRenderbuffer(
1107 GLuint client_id
, GLuint service_id
) {
1108 EXPECT_CALL(*gl_
, DeleteRenderbuffersEXT(1, Pointee(service_id
)))
1110 .RetiresOnSaturation();
1111 GenHelper
<cmds::DeleteRenderbuffersImmediate
>(client_id
);
1114 void GLES2DecoderTestBase::DoBindTexture(
1115 GLenum target
, GLuint client_id
, GLuint service_id
) {
1116 EXPECT_CALL(*gl_
, BindTexture(target
, service_id
))
1118 .RetiresOnSaturation();
1119 cmds::BindTexture cmd
;
1120 cmd
.Init(target
, client_id
);
1121 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1124 bool GLES2DecoderTestBase::DoIsTexture(GLuint client_id
) {
1125 return IsObjectHelper
<cmds::IsTexture
, cmds::IsTexture::Result
>(client_id
);
1128 void GLES2DecoderTestBase::DoDeleteTexture(
1129 GLuint client_id
, GLuint service_id
) {
1134 // Calling DoDeleteTexture will unbind the texture from any texture units
1135 // it's currently bound to.
1136 EXPECT_CALL(*gl_
, BindTexture(_
, 0))
1137 .Times(AnyNumber());
1139 EXPECT_CALL(*gl_
, DeleteTextures(1, Pointee(service_id
)))
1141 .RetiresOnSaturation();
1143 GenHelper
<cmds::DeleteTexturesImmediate
>(client_id
);
1147 void GLES2DecoderTestBase::DoBindTexImage2DCHROMIUM(GLenum target
,
1149 cmds::BindTexImage2DCHROMIUM bind_tex_image_2d_cmd
;
1150 bind_tex_image_2d_cmd
.Init(target
, image_id
);
1151 EXPECT_CALL(*gl_
, GetError())
1152 .WillOnce(Return(GL_NO_ERROR
))
1153 .WillOnce(Return(GL_NO_ERROR
))
1154 .RetiresOnSaturation();
1155 EXPECT_EQ(error::kNoError
, ExecuteCmd(bind_tex_image_2d_cmd
));
1156 EXPECT_EQ(GL_NO_ERROR
, GetGLError());
1159 void GLES2DecoderTestBase::DoTexImage2D(
1160 GLenum target
, GLint level
, GLenum internal_format
,
1161 GLsizei width
, GLsizei height
, GLint border
,
1162 GLenum format
, GLenum type
,
1163 uint32 shared_memory_id
, uint32 shared_memory_offset
) {
1164 EXPECT_CALL(*gl_
, GetError())
1165 .WillOnce(Return(GL_NO_ERROR
))
1166 .RetiresOnSaturation();
1167 EXPECT_CALL(*gl_
, TexImage2D(target
, level
, internal_format
,
1168 width
, height
, border
, format
, type
, _
))
1170 .RetiresOnSaturation();
1171 EXPECT_CALL(*gl_
, GetError())
1172 .WillOnce(Return(GL_NO_ERROR
))
1173 .RetiresOnSaturation();
1174 cmds::TexImage2D cmd
;
1175 cmd
.Init(target
, level
, internal_format
, width
, height
, format
,
1176 type
, shared_memory_id
, shared_memory_offset
);
1177 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1180 void GLES2DecoderTestBase::DoTexImage2DConvertInternalFormat(
1181 GLenum target
, GLint level
, GLenum requested_internal_format
,
1182 GLsizei width
, GLsizei height
, GLint border
,
1183 GLenum format
, GLenum type
,
1184 uint32 shared_memory_id
, uint32 shared_memory_offset
,
1185 GLenum expected_internal_format
) {
1186 EXPECT_CALL(*gl_
, GetError())
1187 .WillOnce(Return(GL_NO_ERROR
))
1188 .RetiresOnSaturation();
1189 EXPECT_CALL(*gl_
, TexImage2D(target
, level
, expected_internal_format
,
1190 width
, height
, border
, format
, type
, _
))
1192 .RetiresOnSaturation();
1193 EXPECT_CALL(*gl_
, GetError())
1194 .WillOnce(Return(GL_NO_ERROR
))
1195 .RetiresOnSaturation();
1196 cmds::TexImage2D cmd
;
1197 cmd
.Init(target
, level
, requested_internal_format
, width
, height
,
1198 format
, type
, shared_memory_id
, shared_memory_offset
);
1199 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1202 void GLES2DecoderTestBase::DoCompressedTexImage2D(
1203 GLenum target
, GLint level
, GLenum format
,
1204 GLsizei width
, GLsizei height
, GLint border
,
1205 GLsizei size
, uint32 bucket_id
) {
1206 EXPECT_CALL(*gl_
, GetError())
1207 .WillOnce(Return(GL_NO_ERROR
))
1208 .RetiresOnSaturation();
1209 EXPECT_CALL(*gl_
, CompressedTexImage2D(
1210 target
, level
, format
, width
, height
, border
, size
, _
))
1212 .RetiresOnSaturation();
1213 EXPECT_CALL(*gl_
, GetError())
1214 .WillOnce(Return(GL_NO_ERROR
))
1215 .RetiresOnSaturation();
1216 CommonDecoder::Bucket
* bucket
= decoder_
->CreateBucket(bucket_id
);
1217 bucket
->SetSize(size
);
1218 cmds::CompressedTexImage2DBucket cmd
;
1220 target
, level
, format
, width
, height
,
1222 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1225 void GLES2DecoderTestBase::DoRenderbufferStorage(
1226 GLenum target
, GLenum internal_format
, GLenum actual_format
,
1227 GLsizei width
, GLsizei height
, GLenum error
) {
1228 EXPECT_CALL(*gl_
, GetError())
1229 .WillOnce(Return(GL_NO_ERROR
))
1230 .RetiresOnSaturation();
1231 EXPECT_CALL(*gl_
, RenderbufferStorageEXT(
1232 target
, actual_format
, width
, height
))
1234 .RetiresOnSaturation();
1235 EXPECT_CALL(*gl_
, GetError())
1236 .WillOnce(Return(error
))
1237 .RetiresOnSaturation();
1238 cmds::RenderbufferStorage cmd
;
1239 cmd
.Init(target
, internal_format
, width
, height
);
1240 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1243 void GLES2DecoderTestBase::DoFramebufferTexture2D(
1244 GLenum target
, GLenum attachment
, GLenum textarget
,
1245 GLuint texture_client_id
, GLuint texture_service_id
, GLint level
,
1247 EXPECT_CALL(*gl_
, GetError())
1248 .WillOnce(Return(GL_NO_ERROR
))
1249 .RetiresOnSaturation();
1250 EXPECT_CALL(*gl_
, FramebufferTexture2DEXT(
1251 target
, attachment
, textarget
, texture_service_id
, level
))
1253 .RetiresOnSaturation();
1254 EXPECT_CALL(*gl_
, GetError())
1255 .WillOnce(Return(error
))
1256 .RetiresOnSaturation();
1257 cmds::FramebufferTexture2D cmd
;
1258 cmd
.Init(target
, attachment
, textarget
, texture_client_id
);
1259 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1262 void GLES2DecoderTestBase::DoFramebufferRenderbuffer(
1265 GLenum renderbuffer_target
,
1266 GLuint renderbuffer_client_id
,
1267 GLuint renderbuffer_service_id
,
1269 EXPECT_CALL(*gl_
, GetError())
1270 .WillOnce(Return(GL_NO_ERROR
))
1271 .RetiresOnSaturation();
1272 EXPECT_CALL(*gl_
, FramebufferRenderbufferEXT(
1273 target
, attachment
, renderbuffer_target
, renderbuffer_service_id
))
1275 .RetiresOnSaturation();
1276 EXPECT_CALL(*gl_
, GetError())
1277 .WillOnce(Return(error
))
1278 .RetiresOnSaturation();
1279 cmds::FramebufferRenderbuffer cmd
;
1280 cmd
.Init(target
, attachment
, renderbuffer_target
, renderbuffer_client_id
);
1281 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1284 void GLES2DecoderTestBase::DoVertexAttribPointer(
1285 GLuint index
, GLint size
, GLenum type
, GLsizei stride
, GLuint offset
) {
1287 VertexAttribPointer(index
, size
, type
, GL_FALSE
, stride
,
1288 BufferOffset(offset
)))
1290 .RetiresOnSaturation();
1291 cmds::VertexAttribPointer cmd
;
1292 cmd
.Init(index
, size
, GL_FLOAT
, GL_FALSE
, stride
, offset
);
1293 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1296 void GLES2DecoderTestBase::DoVertexAttribDivisorANGLE(
1297 GLuint index
, GLuint divisor
) {
1299 VertexAttribDivisorANGLE(index
, divisor
))
1301 .RetiresOnSaturation();
1302 cmds::VertexAttribDivisorANGLE cmd
;
1303 cmd
.Init(index
, divisor
);
1304 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1307 void GLES2DecoderTestBase::AddExpectationsForGenVertexArraysOES(){
1308 if (group_
->feature_info()->feature_flags().native_vertex_array_object
) {
1309 EXPECT_CALL(*gl_
, GenVertexArraysOES(1, _
))
1310 .WillOnce(SetArgumentPointee
<1>(kServiceVertexArrayId
))
1311 .RetiresOnSaturation();
1315 void GLES2DecoderTestBase::AddExpectationsForDeleteVertexArraysOES(){
1316 if (group_
->feature_info()->feature_flags().native_vertex_array_object
) {
1317 EXPECT_CALL(*gl_
, DeleteVertexArraysOES(1, _
))
1319 .RetiresOnSaturation();
1323 void GLES2DecoderTestBase::AddExpectationsForDeleteBoundVertexArraysOES() {
1324 // Expectations are the same as a delete, followed by binding VAO 0.
1325 AddExpectationsForDeleteVertexArraysOES();
1326 AddExpectationsForBindVertexArrayOES();
1329 void GLES2DecoderTestBase::AddExpectationsForBindVertexArrayOES() {
1330 if (group_
->feature_info()->feature_flags().native_vertex_array_object
) {
1331 EXPECT_CALL(*gl_
, BindVertexArrayOES(_
))
1333 .RetiresOnSaturation();
1335 for (uint32 vv
= 0; vv
< group_
->max_vertex_attribs(); ++vv
) {
1336 AddExpectationsForRestoreAttribState(vv
);
1339 EXPECT_CALL(*gl_
, BindBuffer(GL_ELEMENT_ARRAY_BUFFER
, _
))
1341 .RetiresOnSaturation();
1345 void GLES2DecoderTestBase::AddExpectationsForRestoreAttribState(GLuint attrib
) {
1346 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, _
))
1348 .RetiresOnSaturation();
1350 EXPECT_CALL(*gl_
, VertexAttribPointer(attrib
, _
, _
, _
, _
, _
))
1352 .RetiresOnSaturation();
1354 EXPECT_CALL(*gl_
, VertexAttribDivisorANGLE(attrib
, _
))
1355 .Times(testing::AtMost(1))
1356 .RetiresOnSaturation();
1358 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, _
))
1360 .RetiresOnSaturation();
1363 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2
) {
1365 // TODO(bajones): Not sure if I can tell which of these will be called
1366 EXPECT_CALL(*gl_
, EnableVertexAttribArray(attrib
))
1367 .Times(testing::AtMost(1))
1368 .RetiresOnSaturation();
1370 EXPECT_CALL(*gl_
, DisableVertexAttribArray(attrib
))
1371 .Times(testing::AtMost(1))
1372 .RetiresOnSaturation();
1376 // GCC requires these declarations, but MSVC requires they not be present
1377 #ifndef COMPILER_MSVC
1378 const int GLES2DecoderTestBase::kBackBufferWidth
;
1379 const int GLES2DecoderTestBase::kBackBufferHeight
;
1381 const GLint
GLES2DecoderTestBase::kMaxTextureSize
;
1382 const GLint
GLES2DecoderTestBase::kMaxCubeMapTextureSize
;
1383 const GLint
GLES2DecoderTestBase::kNumVertexAttribs
;
1384 const GLint
GLES2DecoderTestBase::kNumTextureUnits
;
1385 const GLint
GLES2DecoderTestBase::kMaxTextureImageUnits
;
1386 const GLint
GLES2DecoderTestBase::kMaxVertexTextureImageUnits
;
1387 const GLint
GLES2DecoderTestBase::kMaxFragmentUniformVectors
;
1388 const GLint
GLES2DecoderTestBase::kMaxVaryingVectors
;
1389 const GLint
GLES2DecoderTestBase::kMaxVertexUniformVectors
;
1390 const GLint
GLES2DecoderTestBase::kMaxViewportWidth
;
1391 const GLint
GLES2DecoderTestBase::kMaxViewportHeight
;
1393 const GLint
GLES2DecoderTestBase::kViewportX
;
1394 const GLint
GLES2DecoderTestBase::kViewportY
;
1395 const GLint
GLES2DecoderTestBase::kViewportWidth
;
1396 const GLint
GLES2DecoderTestBase::kViewportHeight
;
1398 const GLuint
GLES2DecoderTestBase::kServiceAttrib0BufferId
;
1399 const GLuint
GLES2DecoderTestBase::kServiceFixedAttribBufferId
;
1401 const GLuint
GLES2DecoderTestBase::kServiceBufferId
;
1402 const GLuint
GLES2DecoderTestBase::kServiceFramebufferId
;
1403 const GLuint
GLES2DecoderTestBase::kServiceRenderbufferId
;
1404 const GLuint
GLES2DecoderTestBase::kServiceSamplerId
;
1405 const GLuint
GLES2DecoderTestBase::kServiceTextureId
;
1406 const GLuint
GLES2DecoderTestBase::kServiceProgramId
;
1407 const GLuint
GLES2DecoderTestBase::kServiceShaderId
;
1408 const GLuint
GLES2DecoderTestBase::kServiceElementBufferId
;
1409 const GLuint
GLES2DecoderTestBase::kServiceQueryId
;
1410 const GLuint
GLES2DecoderTestBase::kServiceVertexArrayId
;
1411 const GLuint
GLES2DecoderTestBase::kServiceTransformFeedbackId
;
1412 const GLuint
GLES2DecoderTestBase::kServiceSyncId
;
1414 const int32
GLES2DecoderTestBase::kSharedMemoryId
;
1415 const size_t GLES2DecoderTestBase::kSharedBufferSize
;
1416 const uint32
GLES2DecoderTestBase::kSharedMemoryOffset
;
1417 const int32
GLES2DecoderTestBase::kInvalidSharedMemoryId
;
1418 const uint32
GLES2DecoderTestBase::kInvalidSharedMemoryOffset
;
1419 const uint32
GLES2DecoderTestBase::kInitialResult
;
1420 const uint8
GLES2DecoderTestBase::kInitialMemoryValue
;
1422 const uint32
GLES2DecoderTestBase::kNewClientId
;
1423 const uint32
GLES2DecoderTestBase::kNewServiceId
;
1424 const uint32
GLES2DecoderTestBase::kInvalidClientId
;
1426 const GLuint
GLES2DecoderTestBase::kServiceVertexShaderId
;
1427 const GLuint
GLES2DecoderTestBase::kServiceFragmentShaderId
;
1429 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumShaderId
;
1430 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumProgramId
;
1432 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumTextureBufferId
;
1433 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumVertexBufferId
;
1434 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumFBOId
;
1435 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumPositionAttrib
;
1436 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumTexAttrib
;
1437 const GLuint
GLES2DecoderTestBase::kServiceCopyTextureChromiumSamplerLocation
;
1439 const GLsizei
GLES2DecoderTestBase::kNumVertices
;
1440 const GLsizei
GLES2DecoderTestBase::kNumIndices
;
1441 const int GLES2DecoderTestBase::kValidIndexRangeStart
;
1442 const int GLES2DecoderTestBase::kValidIndexRangeCount
;
1443 const int GLES2DecoderTestBase::kInvalidIndexRangeStart
;
1444 const int GLES2DecoderTestBase::kInvalidIndexRangeCount
;
1445 const int GLES2DecoderTestBase::kOutOfRangeIndexRangeEnd
;
1446 const GLuint
GLES2DecoderTestBase::kMaxValidIndex
;
1448 const GLint
GLES2DecoderTestBase::kMaxAttribLength
;
1449 const GLint
GLES2DecoderTestBase::kAttrib1Size
;
1450 const GLint
GLES2DecoderTestBase::kAttrib2Size
;
1451 const GLint
GLES2DecoderTestBase::kAttrib3Size
;
1452 const GLint
GLES2DecoderTestBase::kAttrib1Location
;
1453 const GLint
GLES2DecoderTestBase::kAttrib2Location
;
1454 const GLint
GLES2DecoderTestBase::kAttrib3Location
;
1455 const GLenum
GLES2DecoderTestBase::kAttrib1Type
;
1456 const GLenum
GLES2DecoderTestBase::kAttrib2Type
;
1457 const GLenum
GLES2DecoderTestBase::kAttrib3Type
;
1458 const GLint
GLES2DecoderTestBase::kInvalidAttribLocation
;
1459 const GLint
GLES2DecoderTestBase::kBadAttribIndex
;
1461 const GLint
GLES2DecoderTestBase::kMaxUniformLength
;
1462 const GLint
GLES2DecoderTestBase::kUniform1Size
;
1463 const GLint
GLES2DecoderTestBase::kUniform2Size
;
1464 const GLint
GLES2DecoderTestBase::kUniform3Size
;
1465 const GLint
GLES2DecoderTestBase::kUniform4Size
;
1466 const GLint
GLES2DecoderTestBase::kUniform5Size
;
1467 const GLint
GLES2DecoderTestBase::kUniform6Size
;
1468 const GLint
GLES2DecoderTestBase::kUniform7Size
;
1469 const GLint
GLES2DecoderTestBase::kUniform1RealLocation
;
1470 const GLint
GLES2DecoderTestBase::kUniform2RealLocation
;
1471 const GLint
GLES2DecoderTestBase::kUniform2ElementRealLocation
;
1472 const GLint
GLES2DecoderTestBase::kUniform3RealLocation
;
1473 const GLint
GLES2DecoderTestBase::kUniform4RealLocation
;
1474 const GLint
GLES2DecoderTestBase::kUniform5RealLocation
;
1475 const GLint
GLES2DecoderTestBase::kUniform6RealLocation
;
1476 const GLint
GLES2DecoderTestBase::kUniform7RealLocation
;
1477 const GLint
GLES2DecoderTestBase::kUniform1FakeLocation
;
1478 const GLint
GLES2DecoderTestBase::kUniform2FakeLocation
;
1479 const GLint
GLES2DecoderTestBase::kUniform2ElementFakeLocation
;
1480 const GLint
GLES2DecoderTestBase::kUniform3FakeLocation
;
1481 const GLint
GLES2DecoderTestBase::kUniform4FakeLocation
;
1482 const GLint
GLES2DecoderTestBase::kUniform5FakeLocation
;
1483 const GLint
GLES2DecoderTestBase::kUniform6FakeLocation
;
1484 const GLint
GLES2DecoderTestBase::kUniform7FakeLocation
;
1485 const GLint
GLES2DecoderTestBase::kUniform1DesiredLocation
;
1486 const GLint
GLES2DecoderTestBase::kUniform2DesiredLocation
;
1487 const GLint
GLES2DecoderTestBase::kUniform3DesiredLocation
;
1488 const GLint
GLES2DecoderTestBase::kUniform4DesiredLocation
;
1489 const GLint
GLES2DecoderTestBase::kUniform5DesiredLocation
;
1490 const GLint
GLES2DecoderTestBase::kUniform6DesiredLocation
;
1491 const GLint
GLES2DecoderTestBase::kUniform7DesiredLocation
;
1492 const GLenum
GLES2DecoderTestBase::kUniform1Type
;
1493 const GLenum
GLES2DecoderTestBase::kUniform2Type
;
1494 const GLenum
GLES2DecoderTestBase::kUniform3Type
;
1495 const GLenum
GLES2DecoderTestBase::kUniform4Type
;
1496 const GLenum
GLES2DecoderTestBase::kUniform5Type
;
1497 const GLenum
GLES2DecoderTestBase::kUniform6Type
;
1498 const GLenum
GLES2DecoderTestBase::kUniform7Type
;
1499 const GLenum
GLES2DecoderTestBase::kUniformCubemapType
;
1500 const GLint
GLES2DecoderTestBase::kInvalidUniformLocation
;
1501 const GLint
GLES2DecoderTestBase::kBadUniformIndex
;
1505 const char* GLES2DecoderTestBase::kAttrib1Name
= "attrib1";
1506 const char* GLES2DecoderTestBase::kAttrib2Name
= "attrib2";
1507 const char* GLES2DecoderTestBase::kAttrib3Name
= "attrib3";
1508 const char* GLES2DecoderTestBase::kUniform1Name
= "uniform1";
1509 const char* GLES2DecoderTestBase::kUniform2Name
= "uniform2[0]";
1510 const char* GLES2DecoderTestBase::kUniform3Name
= "uniform3[0]";
1511 const char* GLES2DecoderTestBase::kUniform4Name
= "uniform4";
1512 const char* GLES2DecoderTestBase::kUniform5Name
= "uniform5";
1513 const char* GLES2DecoderTestBase::kUniform6Name
= "uniform6";
1514 const char* GLES2DecoderTestBase::kUniform7Name
= "uniform7";
1516 void GLES2DecoderTestBase::SetupDefaultProgram() {
1518 static AttribInfo attribs
[] = {
1519 { kAttrib1Name
, kAttrib1Size
, kAttrib1Type
, kAttrib1Location
, },
1520 { kAttrib2Name
, kAttrib2Size
, kAttrib2Type
, kAttrib2Location
, },
1521 { kAttrib3Name
, kAttrib3Size
, kAttrib3Type
, kAttrib3Location
, },
1523 static UniformInfo uniforms
[] = {
1524 { kUniform1Name
, kUniform1Size
, kUniform1Type
,
1525 kUniform1FakeLocation
, kUniform1RealLocation
,
1526 kUniform1DesiredLocation
},
1527 { kUniform2Name
, kUniform2Size
, kUniform2Type
,
1528 kUniform2FakeLocation
, kUniform2RealLocation
,
1529 kUniform2DesiredLocation
},
1530 { kUniform3Name
, kUniform3Size
, kUniform3Type
,
1531 kUniform3FakeLocation
, kUniform3RealLocation
,
1532 kUniform3DesiredLocation
},
1533 { kUniform4Name
, kUniform4Size
, kUniform4Type
,
1534 kUniform4FakeLocation
, kUniform4RealLocation
,
1535 kUniform4DesiredLocation
},
1536 { kUniform5Name
, kUniform5Size
, kUniform5Type
,
1537 kUniform5FakeLocation
, kUniform5RealLocation
,
1538 kUniform5DesiredLocation
},
1539 { kUniform6Name
, kUniform6Size
, kUniform6Type
,
1540 kUniform6FakeLocation
, kUniform6RealLocation
,
1541 kUniform6DesiredLocation
},
1542 { kUniform7Name
, kUniform7Size
, kUniform7Type
,
1543 kUniform7FakeLocation
, kUniform7RealLocation
,
1544 kUniform7DesiredLocation
},
1546 SetupShader(attribs
, arraysize(attribs
), uniforms
, arraysize(uniforms
),
1547 client_program_id_
, kServiceProgramId
,
1548 client_vertex_shader_id_
, kServiceVertexShaderId
,
1549 client_fragment_shader_id_
, kServiceFragmentShaderId
);
1553 EXPECT_CALL(*gl_
, UseProgram(kServiceProgramId
))
1555 .RetiresOnSaturation();
1556 cmds::UseProgram cmd
;
1557 cmd
.Init(client_program_id_
);
1558 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1562 void GLES2DecoderTestBase::SetupCubemapProgram() {
1564 static AttribInfo attribs
[] = {
1565 { kAttrib1Name
, kAttrib1Size
, kAttrib1Type
, kAttrib1Location
, },
1566 { kAttrib2Name
, kAttrib2Size
, kAttrib2Type
, kAttrib2Location
, },
1567 { kAttrib3Name
, kAttrib3Size
, kAttrib3Type
, kAttrib3Location
, },
1569 static UniformInfo uniforms
[] = {
1570 { kUniform1Name
, kUniform1Size
, kUniformCubemapType
,
1571 kUniform1FakeLocation
, kUniform1RealLocation
,
1572 kUniform1DesiredLocation
, },
1573 { kUniform2Name
, kUniform2Size
, kUniform2Type
,
1574 kUniform2FakeLocation
, kUniform2RealLocation
,
1575 kUniform2DesiredLocation
, },
1576 { kUniform3Name
, kUniform3Size
, kUniform3Type
,
1577 kUniform3FakeLocation
, kUniform3RealLocation
,
1578 kUniform3DesiredLocation
, },
1579 { kUniform4Name
, kUniform4Size
, kUniform4Type
,
1580 kUniform4FakeLocation
, kUniform4RealLocation
,
1581 kUniform4DesiredLocation
, },
1582 { kUniform5Name
, kUniform5Size
, kUniform5Type
,
1583 kUniform5FakeLocation
, kUniform5RealLocation
,
1584 kUniform5DesiredLocation
},
1585 { kUniform6Name
, kUniform6Size
, kUniform6Type
,
1586 kUniform6FakeLocation
, kUniform6RealLocation
,
1587 kUniform6DesiredLocation
},
1588 { kUniform7Name
, kUniform7Size
, kUniform7Type
,
1589 kUniform7FakeLocation
, kUniform7RealLocation
,
1590 kUniform7DesiredLocation
},
1592 SetupShader(attribs
, arraysize(attribs
), uniforms
, arraysize(uniforms
),
1593 client_program_id_
, kServiceProgramId
,
1594 client_vertex_shader_id_
, kServiceVertexShaderId
,
1595 client_fragment_shader_id_
, kServiceFragmentShaderId
);
1599 EXPECT_CALL(*gl_
, UseProgram(kServiceProgramId
))
1601 .RetiresOnSaturation();
1602 cmds::UseProgram cmd
;
1603 cmd
.Init(client_program_id_
);
1604 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1608 void GLES2DecoderTestBase::SetupSamplerExternalProgram() {
1610 static AttribInfo attribs
[] = {
1611 { kAttrib1Name
, kAttrib1Size
, kAttrib1Type
, kAttrib1Location
, },
1612 { kAttrib2Name
, kAttrib2Size
, kAttrib2Type
, kAttrib2Location
, },
1613 { kAttrib3Name
, kAttrib3Size
, kAttrib3Type
, kAttrib3Location
, },
1615 static UniformInfo uniforms
[] = {
1616 { kUniform1Name
, kUniform1Size
, kUniformSamplerExternalType
,
1617 kUniform1FakeLocation
, kUniform1RealLocation
,
1618 kUniform1DesiredLocation
, },
1619 { kUniform2Name
, kUniform2Size
, kUniform2Type
,
1620 kUniform2FakeLocation
, kUniform2RealLocation
,
1621 kUniform2DesiredLocation
, },
1622 { kUniform3Name
, kUniform3Size
, kUniform3Type
,
1623 kUniform3FakeLocation
, kUniform3RealLocation
,
1624 kUniform3DesiredLocation
, },
1625 { kUniform4Name
, kUniform4Size
, kUniform4Type
,
1626 kUniform4FakeLocation
, kUniform4RealLocation
,
1627 kUniform4DesiredLocation
, },
1628 { kUniform5Name
, kUniform5Size
, kUniform5Type
,
1629 kUniform5FakeLocation
, kUniform5RealLocation
,
1630 kUniform5DesiredLocation
},
1631 { kUniform6Name
, kUniform6Size
, kUniform6Type
,
1632 kUniform6FakeLocation
, kUniform6RealLocation
,
1633 kUniform6DesiredLocation
},
1634 { kUniform7Name
, kUniform7Size
, kUniform7Type
,
1635 kUniform7FakeLocation
, kUniform7RealLocation
,
1636 kUniform7DesiredLocation
},
1638 SetupShader(attribs
, arraysize(attribs
), uniforms
, arraysize(uniforms
),
1639 client_program_id_
, kServiceProgramId
,
1640 client_vertex_shader_id_
, kServiceVertexShaderId
,
1641 client_fragment_shader_id_
, kServiceFragmentShaderId
);
1645 EXPECT_CALL(*gl_
, UseProgram(kServiceProgramId
))
1647 .RetiresOnSaturation();
1648 cmds::UseProgram cmd
;
1649 cmd
.Init(client_program_id_
);
1650 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1654 void GLES2DecoderWithShaderTestBase::TearDown() {
1655 GLES2DecoderTestBase::TearDown();
1658 void GLES2DecoderTestBase::SetupShader(
1659 GLES2DecoderTestBase::AttribInfo
* attribs
, size_t num_attribs
,
1660 GLES2DecoderTestBase::UniformInfo
* uniforms
, size_t num_uniforms
,
1661 GLuint program_client_id
, GLuint program_service_id
,
1662 GLuint vertex_shader_client_id
, GLuint vertex_shader_service_id
,
1663 GLuint fragment_shader_client_id
, GLuint fragment_shader_service_id
) {
1668 AttachShader(program_service_id
, vertex_shader_service_id
))
1670 .RetiresOnSaturation();
1672 AttachShader(program_service_id
, fragment_shader_service_id
))
1674 .RetiresOnSaturation();
1675 TestHelper::SetupShader(
1676 gl_
.get(), attribs
, num_attribs
, uniforms
, num_uniforms
,
1677 program_service_id
);
1681 GL_VERTEX_SHADER
, vertex_shader_client_id
, vertex_shader_service_id
);
1683 GL_FRAGMENT_SHADER
, fragment_shader_client_id
,
1684 fragment_shader_service_id
);
1686 TestHelper::SetShaderStates(
1687 gl_
.get(), GetShader(vertex_shader_client_id
), true);
1688 TestHelper::SetShaderStates(
1689 gl_
.get(), GetShader(fragment_shader_client_id
), true);
1691 cmds::AttachShader attach_cmd
;
1692 attach_cmd
.Init(program_client_id
, vertex_shader_client_id
);
1693 EXPECT_EQ(error::kNoError
, ExecuteCmd(attach_cmd
));
1695 attach_cmd
.Init(program_client_id
, fragment_shader_client_id
);
1696 EXPECT_EQ(error::kNoError
, ExecuteCmd(attach_cmd
));
1698 cmds::LinkProgram link_cmd
;
1699 link_cmd
.Init(program_client_id
);
1701 EXPECT_EQ(error::kNoError
, ExecuteCmd(link_cmd
));
1704 void GLES2DecoderTestBase::DoEnableDisable(GLenum cap
, bool enable
) {
1705 SetupExpectationsForEnableDisable(cap
, enable
);
1709 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1713 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1717 void GLES2DecoderTestBase::DoEnableVertexAttribArray(GLint index
) {
1718 EXPECT_CALL(*gl_
, EnableVertexAttribArray(index
))
1720 .RetiresOnSaturation();
1721 cmds::EnableVertexAttribArray cmd
;
1723 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1726 void GLES2DecoderTestBase::DoBufferData(GLenum target
, GLsizei size
) {
1727 EXPECT_CALL(*gl_
, GetError())
1728 .WillOnce(Return(GL_NO_ERROR
))
1729 .RetiresOnSaturation();
1730 EXPECT_CALL(*gl_
, BufferData(target
, size
, _
, GL_STREAM_DRAW
))
1732 .RetiresOnSaturation();
1733 EXPECT_CALL(*gl_
, GetError())
1734 .WillOnce(Return(GL_NO_ERROR
))
1735 .RetiresOnSaturation();
1736 cmds::BufferData cmd
;
1737 cmd
.Init(target
, size
, 0, 0, GL_STREAM_DRAW
);
1738 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1741 void GLES2DecoderTestBase::DoBufferSubData(
1742 GLenum target
, GLint offset
, GLsizei size
, const void* data
) {
1743 EXPECT_CALL(*gl_
, BufferSubData(target
, offset
, size
,
1744 shared_memory_address_
))
1746 .RetiresOnSaturation();
1747 memcpy(shared_memory_address_
, data
, size
);
1748 cmds::BufferSubData cmd
;
1749 cmd
.Init(target
, offset
, size
, shared_memory_id_
, shared_memory_offset_
);
1750 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1753 void GLES2DecoderTestBase::DoScissor(GLint x
,
1757 EXPECT_CALL(*gl_
, Scissor(x
, y
, width
, height
))
1759 .RetiresOnSaturation();
1761 cmd
.Init(x
, y
, width
, height
);
1762 EXPECT_EQ(error::kNoError
, ExecuteCmd(cmd
));
1765 void GLES2DecoderTestBase::SetupVertexBuffer() {
1766 DoEnableVertexAttribArray(1);
1767 DoBindBuffer(GL_ARRAY_BUFFER
, client_buffer_id_
, kServiceBufferId
);
1768 DoBufferData(GL_ARRAY_BUFFER
, kNumVertices
* 2 * sizeof(GLfloat
));
1771 void GLES2DecoderTestBase::SetupAllNeededVertexBuffers() {
1772 DoBindBuffer(GL_ARRAY_BUFFER
, client_buffer_id_
, kServiceBufferId
);
1773 DoBufferData(GL_ARRAY_BUFFER
, kNumVertices
* 16 * sizeof(float));
1774 DoEnableVertexAttribArray(0);
1775 DoEnableVertexAttribArray(1);
1776 DoEnableVertexAttribArray(2);
1777 DoVertexAttribPointer(0, 2, GL_FLOAT
, 0, 0);
1778 DoVertexAttribPointer(1, 2, GL_FLOAT
, 0, 0);
1779 DoVertexAttribPointer(2, 2, GL_FLOAT
, 0, 0);
1782 void GLES2DecoderTestBase::SetupIndexBuffer() {
1783 DoBindBuffer(GL_ELEMENT_ARRAY_BUFFER
,
1784 client_element_buffer_id_
,
1785 kServiceElementBufferId
);
1786 static const GLshort indices
[] = {100, 1, 2, 3, 4, 5, 6, 7, 100, 9};
1787 static_assert(arraysize(indices
) == kNumIndices
,
1788 "indices should have kNumIndices elements");
1789 DoBufferData(GL_ELEMENT_ARRAY_BUFFER
, sizeof(indices
));
1790 DoBufferSubData(GL_ELEMENT_ARRAY_BUFFER
, 0, 2, indices
);
1791 DoBufferSubData(GL_ELEMENT_ARRAY_BUFFER
, 2, sizeof(indices
) - 2, &indices
[1]);
1794 void GLES2DecoderTestBase::SetupTexture() {
1795 DoBindTexture(GL_TEXTURE_2D
, client_texture_id_
, kServiceTextureId
);
1796 DoTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, 1, 1, 0, GL_RGBA
, GL_UNSIGNED_BYTE
,
1797 kSharedMemoryId
, kSharedMemoryOffset
);
1800 void GLES2DecoderTestBase::DeleteVertexBuffer() {
1801 DoDeleteBuffer(client_buffer_id_
, kServiceBufferId
);
1804 void GLES2DecoderTestBase::DeleteIndexBuffer() {
1805 DoDeleteBuffer(client_element_buffer_id_
, kServiceElementBufferId
);
1808 void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0WithError(
1809 GLsizei num_vertices
, GLuint buffer_id
, GLenum error
) {
1810 if (group_
->feature_info()->gl_version_info().BehavesLikeGLES()) {
1814 EXPECT_CALL(*gl_
, GetError())
1815 .WillOnce(Return(GL_NO_ERROR
))
1816 .WillOnce(Return(error
))
1817 .RetiresOnSaturation();
1818 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, kServiceAttrib0BufferId
))
1820 .RetiresOnSaturation();
1821 EXPECT_CALL(*gl_
, BufferData(GL_ARRAY_BUFFER
,
1822 num_vertices
* sizeof(GLfloat
) * 4,
1823 _
, GL_DYNAMIC_DRAW
))
1825 .RetiresOnSaturation();
1826 if (error
== GL_NO_ERROR
) {
1827 EXPECT_CALL(*gl_
, BufferSubData(
1828 GL_ARRAY_BUFFER
, 0, num_vertices
* sizeof(GLfloat
) * 4, _
))
1830 .RetiresOnSaturation();
1831 EXPECT_CALL(*gl_
, VertexAttribPointer(0, 4, GL_FLOAT
, GL_FALSE
, 0, NULL
))
1833 .RetiresOnSaturation();
1834 EXPECT_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, buffer_id
))
1836 .RetiresOnSaturation();
1840 void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0(
1841 GLsizei num_vertices
, GLuint buffer_id
) {
1842 AddExpectationsForSimulatedAttrib0WithError(
1843 num_vertices
, buffer_id
, GL_NO_ERROR
);
1846 void GLES2DecoderTestBase::SetupMockGLBehaviors() {
1847 ON_CALL(*gl_
, BindVertexArrayOES(_
))
1848 .WillByDefault(Invoke(
1850 &GLES2DecoderTestBase::MockGLStates::OnBindVertexArrayOES
));
1851 ON_CALL(*gl_
, BindBuffer(GL_ARRAY_BUFFER
, _
))
1852 .WillByDefault(WithArg
<1>(Invoke(
1854 &GLES2DecoderTestBase::MockGLStates::OnBindArrayBuffer
)));
1855 ON_CALL(*gl_
, VertexAttribPointer(_
, _
, _
, _
, _
, NULL
))
1856 .WillByDefault(InvokeWithoutArgs(
1858 &GLES2DecoderTestBase::MockGLStates::OnVertexAttribNullPointer
));
1861 GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::
1862 MockCommandBufferEngine() {
1864 scoped_ptr
<base::SharedMemory
> shm(new base::SharedMemory());
1865 shm
->CreateAndMapAnonymous(kSharedBufferSize
);
1866 valid_buffer_
= MakeBufferFromSharedMemory(shm
.Pass(), kSharedBufferSize
);
1868 ClearSharedMemory();
1871 GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::
1872 ~MockCommandBufferEngine() {}
1874 scoped_refptr
<gpu::Buffer
>
1875 GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::GetSharedMemoryBuffer(
1877 return shm_id
== kSharedMemoryId
? valid_buffer_
: invalid_buffer_
;
1880 void GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::set_token(
1885 bool GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::SetGetBuffer(
1886 int32
/* transfer_buffer_id */) {
1891 bool GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::SetGetOffset(
1897 int32
GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::GetGetOffset() {
1902 void GLES2DecoderWithShaderTestBase::SetUp() {
1903 GLES2DecoderTestBase::SetUp();
1904 SetupDefaultProgram();
1907 // Include the auto-generated part of this file. We split this because it means
1908 // we can easily edit the non-auto generated parts right here in this file
1909 // instead of having to edit some template or the code generator.
1910 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h"
1912 } // namespace gles2