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/query_manager.h"
6 #include "gpu/command_buffer/common/gles2_cmd_format.h"
7 #include "gpu/command_buffer/service/cmd_buffer_engine.h"
8 #include "gpu/command_buffer/service/error_state_mock.h"
9 #include "gpu/command_buffer/service/feature_info.h"
10 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
11 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
12 #include "gpu/command_buffer/service/gpu_service_test.h"
13 #include "gpu/command_buffer/service/test_helper.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "ui/gl/gl_mock.h"
18 using ::testing::InSequence
;
19 using ::testing::Return
;
20 using ::testing::SetArgumentPointee
;
25 class QueryManagerTest
: public GpuServiceTest
{
27 static const int32 kSharedMemoryId
= 401;
28 static const size_t kSharedBufferSize
= 2048;
29 static const uint32 kSharedMemoryOffset
= 132;
30 static const int32 kInvalidSharedMemoryId
= 402;
31 static const uint32 kInvalidSharedMemoryOffset
= kSharedBufferSize
+ 1;
32 static const uint32 kInitialResult
= 0xBDBDBDBDu
;
33 static const uint8 kInitialMemoryValue
= 0xBDu
;
37 virtual ~QueryManagerTest() {
41 virtual void SetUp() {
42 GpuServiceTest::SetUp();
43 engine_
.reset(new MockCommandBufferEngine());
44 decoder_
.reset(new MockGLES2Decoder());
45 decoder_
->set_engine(engine_
.get());
46 TestHelper::SetupFeatureInfoInitExpectations(
48 "GL_EXT_occlusion_query_boolean");
49 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
50 feature_info
->Initialize();
51 manager_
.reset(new QueryManager(decoder_
.get(), feature_info
.get()));
54 virtual void TearDown() {
56 manager_
->Destroy(false);
59 GpuServiceTest::TearDown();
62 QueryManager::Query
* CreateQuery(
63 GLenum target
, GLuint client_id
, int32 shm_id
, uint32 shm_offset
,
65 EXPECT_CALL(*gl_
, GenQueriesARB(1, _
))
66 .WillOnce(SetArgumentPointee
<1>(service_id
))
67 .RetiresOnSaturation();
68 return manager_
->CreateQuery(target
, client_id
, shm_id
, shm_offset
);
71 void QueueQuery(QueryManager::Query
* query
,
73 base::subtle::Atomic32 submit_count
) {
74 EXPECT_CALL(*gl_
, BeginQueryARB(query
->target(), service_id
))
76 .RetiresOnSaturation();
77 EXPECT_CALL(*gl_
, EndQueryARB(query
->target()))
79 .RetiresOnSaturation();
80 EXPECT_TRUE(manager_
->BeginQuery(query
));
81 EXPECT_TRUE(manager_
->EndQuery(query
, submit_count
));
84 scoped_ptr
<MockGLES2Decoder
> decoder_
;
85 scoped_ptr
<QueryManager
> manager_
;
88 class MockCommandBufferEngine
: public CommandBufferEngine
{
90 MockCommandBufferEngine() {
91 scoped_ptr
<base::SharedMemory
> shared_memory(new base::SharedMemory());
92 shared_memory
->CreateAndMapAnonymous(kSharedBufferSize
);
94 MakeBufferFromSharedMemory(shared_memory
.Pass(), kSharedBufferSize
);
95 data_
= static_cast<uint8
*>(valid_buffer_
->memory());
99 virtual ~MockCommandBufferEngine() {
102 virtual scoped_refptr
<gpu::Buffer
> GetSharedMemoryBuffer(int32 shm_id
)
104 return shm_id
== kSharedMemoryId
? valid_buffer_
: invalid_buffer_
;
107 void ClearSharedMemory() {
108 memset(data_
, kInitialMemoryValue
, kSharedBufferSize
);
111 virtual void set_token(int32 token
) OVERRIDE
{
115 virtual bool SetGetBuffer(int32
/* transfer_buffer_id */) OVERRIDE
{
120 // Overridden from CommandBufferEngine.
121 virtual bool SetGetOffset(int32 offset
) OVERRIDE
{
126 // Overridden from CommandBufferEngine.
127 virtual int32
GetGetOffset() OVERRIDE
{
134 scoped_refptr
<gpu::Buffer
> valid_buffer_
;
135 scoped_refptr
<gpu::Buffer
> invalid_buffer_
;
138 scoped_ptr
<MockCommandBufferEngine
> engine_
;
141 // GCC requires these declarations, but MSVC requires they not be present
142 #ifndef COMPILER_MSVC
143 const int32
QueryManagerTest::kSharedMemoryId
;
144 const size_t QueryManagerTest::kSharedBufferSize
;
145 const uint32
QueryManagerTest::kSharedMemoryOffset
;
146 const int32
QueryManagerTest::kInvalidSharedMemoryId
;
147 const uint32
QueryManagerTest::kInvalidSharedMemoryOffset
;
148 const uint32
QueryManagerTest::kInitialResult
;
149 const uint8
QueryManagerTest::kInitialMemoryValue
;
152 TEST_F(QueryManagerTest
, Basic
) {
153 const GLuint kClient1Id
= 1;
154 const GLuint kService1Id
= 11;
155 const GLuint kClient2Id
= 2;
157 EXPECT_FALSE(manager_
->HavePendingQueries());
158 // Check we can create a Query.
159 scoped_refptr
<QueryManager::Query
> query(
160 CreateQuery(GL_ANY_SAMPLES_PASSED_EXT
, kClient1Id
,
161 kSharedMemoryId
, kSharedMemoryOffset
, kService1Id
));
162 ASSERT_TRUE(query
.get() != NULL
);
163 // Check we can get the same Query.
164 EXPECT_EQ(query
.get(), manager_
->GetQuery(kClient1Id
));
165 // Check we get nothing for a non-existent query.
166 EXPECT_TRUE(manager_
->GetQuery(kClient2Id
) == NULL
);
167 // Check we can delete the query.
168 manager_
->RemoveQuery(kClient1Id
);
169 // Check we get nothing for a non-existent query.
170 EXPECT_TRUE(manager_
->GetQuery(kClient1Id
) == NULL
);
171 // Check query is deleted
172 EXPECT_TRUE(query
->IsDeleted());
173 EXPECT_FALSE(manager_
->HavePendingQueries());
176 TEST_F(QueryManagerTest
, Destroy
) {
177 const GLuint kClient1Id
= 1;
178 const GLuint kService1Id
= 11;
181 scoped_refptr
<QueryManager::Query
> query(
182 CreateQuery(GL_ANY_SAMPLES_PASSED_EXT
, kClient1Id
,
183 kSharedMemoryId
, kSharedMemoryOffset
, kService1Id
));
184 ASSERT_TRUE(query
.get() != NULL
);
185 EXPECT_CALL(*gl_
, DeleteQueriesARB(1, ::testing::Pointee(kService1Id
)))
187 .RetiresOnSaturation();
188 manager_
->Destroy(true);
189 // Check we get nothing for a non-existent query.
190 EXPECT_TRUE(manager_
->GetQuery(kClient1Id
) == NULL
);
191 // Check query is deleted
192 EXPECT_TRUE(query
->IsDeleted());
195 TEST_F(QueryManagerTest
, QueryBasic
) {
196 const GLuint kClient1Id
= 1;
197 const GLuint kService1Id
= 11;
198 const GLenum kTarget
= GL_ANY_SAMPLES_PASSED_EXT
;
201 scoped_refptr
<QueryManager::Query
> query(
202 CreateQuery(kTarget
, kClient1Id
,
203 kSharedMemoryId
, kSharedMemoryOffset
, kService1Id
));
204 ASSERT_TRUE(query
.get() != NULL
);
206 EXPECT_TRUE(query
->IsValid());
207 EXPECT_FALSE(query
->IsDeleted());
208 EXPECT_FALSE(query
->pending());
209 EXPECT_EQ(kTarget
, query
->target());
210 EXPECT_EQ(kSharedMemoryId
, query
->shm_id());
211 EXPECT_EQ(kSharedMemoryOffset
, query
->shm_offset());
214 TEST_F(QueryManagerTest
, ProcessPendingQuery
) {
215 const GLuint kClient1Id
= 1;
216 const GLuint kService1Id
= 11;
217 const GLenum kTarget
= GL_ANY_SAMPLES_PASSED_EXT
;
218 const base::subtle::Atomic32 kSubmitCount
= 123;
219 const GLuint kResult
= 1;
221 // Check nothing happens if there are no pending queries.
222 EXPECT_TRUE(manager_
->ProcessPendingQueries());
225 scoped_refptr
<QueryManager::Query
> query(
226 CreateQuery(kTarget
, kClient1Id
,
227 kSharedMemoryId
, kSharedMemoryOffset
, kService1Id
));
228 ASSERT_TRUE(query
.get() != NULL
);
230 // Setup shared memory like client would.
231 QuerySync
* sync
= decoder_
->GetSharedMemoryAs
<QuerySync
*>(
232 kSharedMemoryId
, kSharedMemoryOffset
, sizeof(*sync
));
233 ASSERT_TRUE(sync
!= NULL
);
237 QueueQuery(query
.get(), kService1Id
, kSubmitCount
);
238 EXPECT_TRUE(query
->pending());
239 EXPECT_TRUE(manager_
->HavePendingQueries());
241 // Process with return not available.
242 // Expect 1 GL command.
244 GetQueryObjectuivARB(kService1Id
, GL_QUERY_RESULT_AVAILABLE_EXT
, _
))
245 .WillOnce(SetArgumentPointee
<2>(0))
246 .RetiresOnSaturation();
247 EXPECT_TRUE(manager_
->ProcessPendingQueries());
248 EXPECT_TRUE(query
->pending());
249 EXPECT_EQ(0, sync
->process_count
);
250 EXPECT_EQ(0u, sync
->result
);
252 // Process with return available.
253 // Expect 2 GL commands.
255 GetQueryObjectuivARB(kService1Id
, GL_QUERY_RESULT_AVAILABLE_EXT
, _
))
256 .WillOnce(SetArgumentPointee
<2>(1))
257 .RetiresOnSaturation();
259 GetQueryObjectuivARB(kService1Id
, GL_QUERY_RESULT_EXT
, _
))
260 .WillOnce(SetArgumentPointee
<2>(kResult
))
261 .RetiresOnSaturation();
262 EXPECT_TRUE(manager_
->ProcessPendingQueries());
263 EXPECT_FALSE(query
->pending());
264 EXPECT_EQ(kSubmitCount
, sync
->process_count
);
265 EXPECT_EQ(kResult
, sync
->result
);
266 EXPECT_FALSE(manager_
->HavePendingQueries());
268 // Process with no queries.
269 // Expect no GL commands/
270 EXPECT_TRUE(manager_
->ProcessPendingQueries());
273 TEST_F(QueryManagerTest
, ProcessPendingQueries
) {
274 const GLuint kClient1Id
= 1;
275 const GLuint kService1Id
= 11;
276 const GLuint kClient2Id
= 2;
277 const GLuint kService2Id
= 12;
278 const GLuint kClient3Id
= 3;
279 const GLuint kService3Id
= 13;
280 const GLenum kTarget
= GL_ANY_SAMPLES_PASSED_EXT
;
281 const base::subtle::Atomic32 kSubmitCount1
= 123;
282 const base::subtle::Atomic32 kSubmitCount2
= 123;
283 const base::subtle::Atomic32 kSubmitCount3
= 123;
284 const GLuint kResult1
= 1;
285 const GLuint kResult2
= 1;
286 const GLuint kResult3
= 1;
288 // Setup shared memory like client would.
289 QuerySync
* sync1
= decoder_
->GetSharedMemoryAs
<QuerySync
*>(
290 kSharedMemoryId
, kSharedMemoryOffset
, sizeof(*sync1
) * 3);
291 ASSERT_TRUE(sync1
!= NULL
);
292 QuerySync
* sync2
= sync1
+ 1;
293 QuerySync
* sync3
= sync2
+ 1;
296 scoped_refptr
<QueryManager::Query
> query1(
297 CreateQuery(kTarget
, kClient1Id
,
298 kSharedMemoryId
, kSharedMemoryOffset
+ sizeof(*sync1
) * 0,
300 scoped_refptr
<QueryManager::Query
> query2(
301 CreateQuery(kTarget
, kClient2Id
,
302 kSharedMemoryId
, kSharedMemoryOffset
+ sizeof(*sync1
) * 1,
304 scoped_refptr
<QueryManager::Query
> query3(
305 CreateQuery(kTarget
, kClient3Id
,
306 kSharedMemoryId
, kSharedMemoryOffset
+ sizeof(*sync1
) * 2,
308 ASSERT_TRUE(query1
.get() != NULL
);
309 ASSERT_TRUE(query2
.get() != NULL
);
310 ASSERT_TRUE(query3
.get() != NULL
);
311 EXPECT_FALSE(manager_
->HavePendingQueries());
318 QueueQuery(query1
.get(), kService1Id
, kSubmitCount1
);
319 QueueQuery(query2
.get(), kService2Id
, kSubmitCount2
);
320 QueueQuery(query3
.get(), kService3Id
, kSubmitCount3
);
321 EXPECT_TRUE(query1
->pending());
322 EXPECT_TRUE(query2
->pending());
323 EXPECT_TRUE(query3
->pending());
324 EXPECT_TRUE(manager_
->HavePendingQueries());
326 // Process with return available for first 2 queries.
327 // Expect 4 GL commands.
331 GetQueryObjectuivARB(kService1Id
, GL_QUERY_RESULT_AVAILABLE_EXT
, _
))
332 .WillOnce(SetArgumentPointee
<2>(1))
333 .RetiresOnSaturation();
335 GetQueryObjectuivARB(kService1Id
, GL_QUERY_RESULT_EXT
, _
))
336 .WillOnce(SetArgumentPointee
<2>(kResult1
))
337 .RetiresOnSaturation();
339 GetQueryObjectuivARB(kService2Id
, GL_QUERY_RESULT_AVAILABLE_EXT
, _
))
340 .WillOnce(SetArgumentPointee
<2>(1))
341 .RetiresOnSaturation();
343 GetQueryObjectuivARB(kService2Id
, GL_QUERY_RESULT_EXT
, _
))
344 .WillOnce(SetArgumentPointee
<2>(kResult2
))
345 .RetiresOnSaturation();
347 GetQueryObjectuivARB(kService3Id
, GL_QUERY_RESULT_AVAILABLE_EXT
, _
))
348 .WillOnce(SetArgumentPointee
<2>(0))
349 .RetiresOnSaturation();
350 EXPECT_TRUE(manager_
->ProcessPendingQueries());
352 EXPECT_FALSE(query1
->pending());
353 EXPECT_FALSE(query2
->pending());
354 EXPECT_TRUE(query3
->pending());
355 EXPECT_EQ(kSubmitCount1
, sync1
->process_count
);
356 EXPECT_EQ(kSubmitCount2
, sync2
->process_count
);
357 EXPECT_EQ(kResult1
, sync1
->result
);
358 EXPECT_EQ(kResult2
, sync2
->result
);
359 EXPECT_EQ(0, sync3
->process_count
);
360 EXPECT_EQ(0u, sync3
->result
);
361 EXPECT_TRUE(manager_
->HavePendingQueries());
363 // Process with renaming query. No result.
364 // Expect 1 GL commands.
366 GetQueryObjectuivARB(kService3Id
, GL_QUERY_RESULT_AVAILABLE_EXT
, _
))
367 .WillOnce(SetArgumentPointee
<2>(0))
368 .RetiresOnSaturation();
369 EXPECT_TRUE(manager_
->ProcessPendingQueries());
370 EXPECT_TRUE(query3
->pending());
371 EXPECT_EQ(0, sync3
->process_count
);
372 EXPECT_EQ(0u, sync3
->result
);
373 EXPECT_TRUE(manager_
->HavePendingQueries());
375 // Process with renaming query. With result.
376 // Expect 2 GL commands.
378 GetQueryObjectuivARB(kService3Id
, GL_QUERY_RESULT_AVAILABLE_EXT
, _
))
379 .WillOnce(SetArgumentPointee
<2>(1))
380 .RetiresOnSaturation();
382 GetQueryObjectuivARB(kService3Id
, GL_QUERY_RESULT_EXT
, _
))
383 .WillOnce(SetArgumentPointee
<2>(kResult3
))
384 .RetiresOnSaturation();
385 EXPECT_TRUE(manager_
->ProcessPendingQueries());
386 EXPECT_FALSE(query3
->pending());
387 EXPECT_EQ(kSubmitCount3
, sync3
->process_count
);
388 EXPECT_EQ(kResult3
, sync3
->result
);
389 EXPECT_FALSE(manager_
->HavePendingQueries());
392 TEST_F(QueryManagerTest
, ProcessPendingBadSharedMemoryId
) {
393 const GLuint kClient1Id
= 1;
394 const GLuint kService1Id
= 11;
395 const GLenum kTarget
= GL_ANY_SAMPLES_PASSED_EXT
;
396 const base::subtle::Atomic32 kSubmitCount
= 123;
397 const GLuint kResult
= 1;
400 scoped_refptr
<QueryManager::Query
> query(
401 CreateQuery(kTarget
, kClient1Id
,
402 kInvalidSharedMemoryId
, kSharedMemoryOffset
, kService1Id
));
403 ASSERT_TRUE(query
.get() != NULL
);
406 QueueQuery(query
.get(), kService1Id
, kSubmitCount
);
408 // Process with return available.
409 // Expect 2 GL commands.
411 GetQueryObjectuivARB(kService1Id
, GL_QUERY_RESULT_AVAILABLE_EXT
, _
))
412 .WillOnce(SetArgumentPointee
<2>(1))
413 .RetiresOnSaturation();
415 GetQueryObjectuivARB(kService1Id
, GL_QUERY_RESULT_EXT
, _
))
416 .WillOnce(SetArgumentPointee
<2>(kResult
))
417 .RetiresOnSaturation();
418 EXPECT_FALSE(manager_
->ProcessPendingQueries());
421 TEST_F(QueryManagerTest
, ProcessPendingBadSharedMemoryOffset
) {
422 const GLuint kClient1Id
= 1;
423 const GLuint kService1Id
= 11;
424 const GLenum kTarget
= GL_ANY_SAMPLES_PASSED_EXT
;
425 const base::subtle::Atomic32 kSubmitCount
= 123;
426 const GLuint kResult
= 1;
429 scoped_refptr
<QueryManager::Query
> query(
430 CreateQuery(kTarget
, kClient1Id
,
431 kSharedMemoryId
, kInvalidSharedMemoryOffset
, kService1Id
));
432 ASSERT_TRUE(query
.get() != NULL
);
435 QueueQuery(query
.get(), kService1Id
, kSubmitCount
);
437 // Process with return available.
438 // Expect 2 GL commands.
440 GetQueryObjectuivARB(kService1Id
, GL_QUERY_RESULT_AVAILABLE_EXT
, _
))
441 .WillOnce(SetArgumentPointee
<2>(1))
442 .RetiresOnSaturation();
444 GetQueryObjectuivARB(kService1Id
, GL_QUERY_RESULT_EXT
, _
))
445 .WillOnce(SetArgumentPointee
<2>(kResult
))
446 .RetiresOnSaturation();
447 EXPECT_FALSE(manager_
->ProcessPendingQueries());
450 TEST_F(QueryManagerTest
, ExitWithPendingQuery
) {
451 const GLuint kClient1Id
= 1;
452 const GLuint kService1Id
= 11;
453 const GLenum kTarget
= GL_ANY_SAMPLES_PASSED_EXT
;
454 const base::subtle::Atomic32 kSubmitCount
= 123;
457 scoped_refptr
<QueryManager::Query
> query(
458 CreateQuery(kTarget
, kClient1Id
,
459 kSharedMemoryId
, kSharedMemoryOffset
, kService1Id
));
460 ASSERT_TRUE(query
.get() != NULL
);
463 QueueQuery(query
.get(), kService1Id
, kSubmitCount
);
466 // Test that when based on ARB_occlusion_query2 we use GL_ANY_SAMPLES_PASSED_ARB
467 // for GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT
468 TEST_F(QueryManagerTest
, ARBOcclusionQuery2
) {
469 const GLuint kClient1Id
= 1;
470 const GLuint kService1Id
= 11;
471 const GLenum kTarget
= GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT
;
472 const base::subtle::Atomic32 kSubmitCount
= 123;
474 TestHelper::SetupFeatureInfoInitExpectations(
476 "GL_ARB_occlusion_query2");
477 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
478 feature_info
->Initialize();
479 scoped_ptr
<QueryManager
> manager(
480 new QueryManager(decoder_
.get(), feature_info
.get()));
482 EXPECT_CALL(*gl_
, GenQueriesARB(1, _
))
483 .WillOnce(SetArgumentPointee
<1>(kService1Id
))
484 .RetiresOnSaturation();
485 QueryManager::Query
* query
= manager
->CreateQuery(
486 kTarget
, kClient1Id
, kSharedMemoryId
, kSharedMemoryOffset
);
487 ASSERT_TRUE(query
!= NULL
);
489 EXPECT_CALL(*gl_
, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT
, kService1Id
))
491 .RetiresOnSaturation();
492 EXPECT_CALL(*gl_
, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT
))
494 .RetiresOnSaturation();
495 EXPECT_TRUE(manager
->BeginQuery(query
));
496 EXPECT_TRUE(manager
->EndQuery(query
, kSubmitCount
));
497 manager
->Destroy(false);
500 // Test that when based on ARB_occlusion_query we use GL_SAMPLES_PASSED_ARB
501 // for GL_ANY_SAMPLES_PASSED_EXT
502 TEST_F(QueryManagerTest
, ARBOcclusionQuery
) {
503 const GLuint kClient1Id
= 1;
504 const GLuint kService1Id
= 11;
505 const GLenum kTarget
= GL_ANY_SAMPLES_PASSED_EXT
;
506 const base::subtle::Atomic32 kSubmitCount
= 123;
508 TestHelper::SetupFeatureInfoInitExpectations(
510 "GL_ARB_occlusion_query");
511 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
512 feature_info
->Initialize();
513 scoped_ptr
<QueryManager
> manager(
514 new QueryManager(decoder_
.get(), feature_info
.get()));
516 EXPECT_CALL(*gl_
, GenQueriesARB(1, _
))
517 .WillOnce(SetArgumentPointee
<1>(kService1Id
))
518 .RetiresOnSaturation();
519 QueryManager::Query
* query
= manager
->CreateQuery(
520 kTarget
, kClient1Id
, kSharedMemoryId
, kSharedMemoryOffset
);
521 ASSERT_TRUE(query
!= NULL
);
523 EXPECT_CALL(*gl_
, BeginQueryARB(GL_SAMPLES_PASSED_ARB
, kService1Id
))
525 .RetiresOnSaturation();
526 EXPECT_CALL(*gl_
, EndQueryARB(GL_SAMPLES_PASSED_ARB
))
528 .RetiresOnSaturation();
529 EXPECT_TRUE(manager
->BeginQuery(query
));
530 EXPECT_TRUE(manager
->EndQuery(query
, kSubmitCount
));
531 manager
->Destroy(false);
534 TEST_F(QueryManagerTest
, GetErrorQuery
) {
535 const GLuint kClient1Id
= 1;
536 const GLenum kTarget
= GL_GET_ERROR_QUERY_CHROMIUM
;
537 const base::subtle::Atomic32 kSubmitCount
= 123;
539 TestHelper::SetupFeatureInfoInitExpectations(gl_
.get(), "");
540 scoped_refptr
<FeatureInfo
> feature_info(new FeatureInfo());
541 feature_info
->Initialize();
542 scoped_ptr
<QueryManager
> manager(
543 new QueryManager(decoder_
.get(), feature_info
.get()));
545 QueryManager::Query
* query
= manager
->CreateQuery(
546 kTarget
, kClient1Id
, kSharedMemoryId
, kSharedMemoryOffset
);
547 ASSERT_TRUE(query
!= NULL
);
549 // Setup shared memory like client would.
550 QuerySync
* sync
= decoder_
->GetSharedMemoryAs
<QuerySync
*>(
551 kSharedMemoryId
, kSharedMemoryOffset
, sizeof(*sync
));
552 ASSERT_TRUE(sync
!= NULL
);
555 EXPECT_TRUE(manager
->BeginQuery(query
));
557 MockErrorState mock_error_state
;
558 EXPECT_CALL(*decoder_
.get(), GetErrorState())
559 .WillRepeatedly(Return(&mock_error_state
));
560 EXPECT_CALL(mock_error_state
, GetGLError())
561 .WillOnce(Return(GL_INVALID_ENUM
))
562 .RetiresOnSaturation();
564 EXPECT_TRUE(manager
->EndQuery(query
, kSubmitCount
));
565 EXPECT_FALSE(query
->pending());
567 EXPECT_EQ(static_cast<GLuint
>(GL_INVALID_ENUM
), sync
->result
);
569 manager
->Destroy(false);