15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/query_manager.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/cmd_buffer_engine.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/service/error_state_mock.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "gpu/command_buffer/service/feature_info.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_service_test.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgumentPointee; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class QueryManagerTest : public GpuServiceTest { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int32 kSharedMemoryId = 401; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kSharedBufferSize = 2048; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32 kSharedMemoryOffset = 132; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int32 kInvalidSharedMemoryId = 402; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32 kInvalidSharedMemoryOffset = kSharedBufferSize + 1; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32 kInitialResult = 0xBDBDBDBDu; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint8 kInitialMemoryValue = 0xBDu; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManagerTest() { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~QueryManagerTest() { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GpuServiceTest::SetUp(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) engine_.reset(new MockCommandBufferEngine()); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_.reset(new MockGLES2Decoder()); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_->set_engine(engine_.get()); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestHelper::SetupFeatureInfoInitExpectations( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.get(), 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GL_EXT_occlusion_query_boolean"); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) feature_info->Initialize(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_.reset(new QueryManager(decoder_.get(), feature_info.get())); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_.reset(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->Destroy(false); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_.reset(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) engine_.reset(); 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GpuServiceTest::TearDown(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager::Query* CreateQuery( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum target, GLuint client_id, int32 shm_id, uint32 shm_offset, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint service_id) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, GenQueriesARB(1, _)) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<1>(service_id)) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return manager_->CreateQuery(target, client_id, shm_id, shm_offset); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void QueueQuery(QueryManager::Query* query, 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GLuint service_id, 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::subtle::Atomic32 submit_count) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, BeginQueryARB(query->target(), service_id)) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, EndQueryARB(query->target())) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->BeginQuery(query)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->EndQuery(query, submit_count)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockGLES2Decoder> decoder_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<QueryManager> manager_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MockCommandBufferEngine : public CommandBufferEngine { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine() { 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch shared_memory->CreateAndMapAnonymous(kSharedBufferSize); 93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch valid_buffer_ = 94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch MakeBufferFromSharedMemory(shared_memory.Pass(), kSharedBufferSize); 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch data_ = static_cast<uint8*>(valid_buffer_->memory()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearSharedMemory(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockCommandBufferEngine() { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual scoped_refptr<gpu::Buffer> GetSharedMemoryBuffer(int32 shm_id) 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch OVERRIDE { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shm_id == kSharedMemoryId ? valid_buffer_ : invalid_buffer_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearSharedMemory() { 108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch memset(data_, kInitialMemoryValue, kSharedBufferSize); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void set_token(int32 token) OVERRIDE { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetGetBuffer(int32 /* transfer_buffer_id */) OVERRIDE { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from CommandBufferEngine. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetGetOffset(int32 offset) OVERRIDE { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from CommandBufferEngine. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int32 GetGetOffset() OVERRIDE { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch uint8* data_; 134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<gpu::Buffer> valid_buffer_; 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<gpu::Buffer> invalid_buffer_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockCommandBufferEngine> engine_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COMPILER_MSVC 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 QueryManagerTest::kSharedMemoryId; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t QueryManagerTest::kSharedBufferSize; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 QueryManagerTest::kSharedMemoryOffset; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 QueryManagerTest::kInvalidSharedMemoryId; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 QueryManagerTest::kInvalidSharedMemoryOffset; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 QueryManagerTest::kInitialResult; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 QueryManagerTest::kInitialMemoryValue; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, Basic) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient2Id = 2; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->HavePendingQueries()); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can create a Query. 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(GL_ANY_SAMPLES_PASSED_EXT, kClient1Id, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, kService1Id)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can get the same Query. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(query.get(), manager_->GetQuery(kClient1Id)); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we get nothing for a non-existent query. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetQuery(kClient2Id) == NULL); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can delete the query. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->RemoveQuery(kClient1Id); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we get nothing for a non-existent query. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetQuery(kClient1Id) == NULL); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check query is deleted 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query->IsDeleted()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->HavePendingQueries()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, Destroy) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(GL_ANY_SAMPLES_PASSED_EXT, kClient1Id, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, kService1Id)); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, DeleteQueriesARB(1, ::testing::Pointee(kService1Id))) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->Destroy(true); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we get nothing for a non-existent query. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetQuery(kClient1Id) == NULL); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check query is deleted 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query->IsDeleted()); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, QueryBasic) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, kService1Id)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query->IsValid()); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query->IsDeleted()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query->pending()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTarget, query->target()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSharedMemoryId, query->shm_id()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSharedMemoryOffset, query->shm_offset()); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingQuery) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::subtle::Atomic32 kSubmitCount = 123; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult = 1; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check nothing happens if there are no pending queries. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, kService1Id)); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup shared memory like client would. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuerySync* sync = decoder_->GetSharedMemoryAs<QuerySync*>( 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync)); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(sync != NULL); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync->Reset(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queue it 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query.get(), kService1Id, kSubmitCount); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query->pending()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->HavePendingQueries()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with return not available. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 1 GL command. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(0)) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query->pending()); 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, sync->process_count); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sync->result); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with return available. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 2 GL commands. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _)) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult)) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query->pending()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSubmitCount, sync->process_count); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kResult, sync->result); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->HavePendingQueries()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with no queries. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect no GL commands/ 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingQueries) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient2Id = 2; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService2Id = 12; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient3Id = 3; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService3Id = 13; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::subtle::Atomic32 kSubmitCount1 = 123; 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::subtle::Atomic32 kSubmitCount2 = 123; 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::subtle::Atomic32 kSubmitCount3 = 123; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult1 = 1; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult2 = 1; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult3 = 1; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup shared memory like client would. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuerySync* sync1 = decoder_->GetSharedMemoryAs<QuerySync*>( 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync1) * 3); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(sync1 != NULL); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuerySync* sync2 = sync1 + 1; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuerySync* sync3 = sync2 + 1; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Queries. 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query1( 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 0, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kService1Id)); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query2( 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient2Id, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 1, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kService2Id)); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query3( 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient3Id, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 2, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kService3Id)); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query1.get() != NULL); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query2.get() != NULL); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query3.get() != NULL); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->HavePendingQueries()); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync1->Reset(); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync2->Reset(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync3->Reset(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queue them 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query1.get(), kService1Id, kSubmitCount1); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query2.get(), kService2Id, kSubmitCount2); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query3.get(), kService3Id, kSubmitCount3); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query1->pending()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query2->pending()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query3->pending()); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->HavePendingQueries()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with return available for first 2 queries. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 4 GL commands. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _)) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult1)) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService2Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService2Id, GL_QUERY_RESULT_EXT, _)) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult2)) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(0)) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query1->pending()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query2->pending()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query3->pending()); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSubmitCount1, sync1->process_count); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSubmitCount2, sync2->process_count); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kResult1, sync1->result); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kResult2, sync2->result); 359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, sync3->process_count); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sync3->result); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->HavePendingQueries()); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with renaming query. No result. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 1 GL commands. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(0)) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query3->pending()); 371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0, sync3->process_count); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sync3->result); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->HavePendingQueries()); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with renaming query. With result. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 2 GL commands. 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_EXT, _)) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult3)) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query3->pending()); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSubmitCount3, sync3->process_count); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kResult3, sync3->result); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->HavePendingQueries()); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingBadSharedMemoryId) { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::subtle::Atomic32 kSubmitCount = 123; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult = 1; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kInvalidSharedMemoryId, kSharedMemoryOffset, kService1Id)); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queue it 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query.get(), kService1Id, kSubmitCount); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with return available. 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 2 GL commands. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _)) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult)) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->ProcessPendingQueries()); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingBadSharedMemoryOffset) { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::subtle::Atomic32 kSubmitCount = 123; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult = 1; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kInvalidSharedMemoryOffset, kService1Id)); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queue it 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query.get(), kService1Id, kSubmitCount); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with return available. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 2 GL commands. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _)) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult)) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->ProcessPendingQueries()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ExitWithPendingQuery) { 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::subtle::Atomic32 kSubmitCount = 123; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, kService1Id)); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queue it 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query.get(), kService1Id, kSubmitCount); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when based on ARB_occlusion_query2 we use GL_ANY_SAMPLES_PASSED_ARB 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ARBOcclusionQuery2) { 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT; 472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::subtle::Atomic32 kSubmitCount = 123; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestHelper::SetupFeatureInfoInitExpectations( 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.get(), 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GL_ARB_occlusion_query2"); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) feature_info->Initialize(); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<QueryManager> manager( 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new QueryManager(decoder_.get(), feature_info.get())); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, GenQueriesARB(1, _)) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<1>(kService1Id)) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager::Query* query = manager->CreateQuery( 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query != NULL); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kService1Id)) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT)) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->BeginQuery(query)); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->EndQuery(query, kSubmitCount)); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->Destroy(false); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when based on ARB_occlusion_query we use GL_SAMPLES_PASSED_ARB 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for GL_ANY_SAMPLES_PASSED_EXT 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ARBOcclusionQuery) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::subtle::Atomic32 kSubmitCount = 123; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestHelper::SetupFeatureInfoInitExpectations( 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.get(), 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GL_ARB_occlusion_query"); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) feature_info->Initialize(); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<QueryManager> manager( 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new QueryManager(decoder_.get(), feature_info.get())); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, GenQueriesARB(1, _)) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<1>(kService1Id)) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager::Query* query = manager->CreateQuery( 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query != NULL); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, BeginQueryARB(GL_SAMPLES_PASSED_ARB, kService1Id)) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, EndQueryARB(GL_SAMPLES_PASSED_ARB)) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->BeginQuery(query)); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->EndQuery(query, kSubmitCount)); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->Destroy(false); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, GetErrorQuery) { 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_GET_ERROR_QUERY_CHROMIUM; 537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::subtle::Atomic32 kSubmitCount = 123; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), ""); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 54158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) feature_info->Initialize(); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<QueryManager> manager( 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new QueryManager(decoder_.get(), feature_info.get())); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager::Query* query = manager->CreateQuery( 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query != NULL); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup shared memory like client would. 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuerySync* sync = decoder_->GetSharedMemoryAs<QuerySync*>( 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync)); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(sync != NULL); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync->Reset(); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->BeginQuery(query)); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockErrorState mock_error_state; 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*decoder_.get(), GetErrorState()) 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillRepeatedly(Return(&mock_error_state)); 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(mock_error_state, GetGLError()) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(GL_INVALID_ENUM)) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->EndQuery(query, kSubmitCount)); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query->pending()); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLuint>(GL_INVALID_ENUM), sync->result); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->Destroy(false); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 576