query_manager_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/feature_info.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgumentPointee; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QueryManagerTest : public testing::Test { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int32 kSharedMemoryId = 401; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kSharedBufferSize = 2048; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32 kSharedMemoryOffset = 132; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int32 kInvalidSharedMemoryId = 402; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32 kInvalidSharedMemoryOffset = kSharedBufferSize + 1; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32 kInitialResult = 0xBDBDBDBDu; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint8 kInitialMemoryValue = 0xBDu; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManagerTest() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~QueryManagerTest() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::gfx::GLInterface::SetGLInterface(gl_.get()); 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()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (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(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::gfx::GLInterface::SetGLInterface(NULL); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.reset(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager::Query* CreateQuery( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum target, GLuint client_id, int32 shm_id, uint32 shm_offset, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint service_id) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, GenQueriesARB(1, _)) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<1>(service_id)) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return manager_->CreateQuery(target, client_id, shm_id, shm_offset); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void QueueQuery( 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager::Query* query, GLuint service_id, uint32 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) // Use StrictMock to make 100% sure we know how GL will be called. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockGLES2Decoder> decoder_; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<QueryManager> manager_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MockCommandBufferEngine : public CommandBufferEngine { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine() { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_.reset(new int8[kSharedBufferSize]); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearSharedMemory(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid_buffer_.ptr = data_.get(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid_buffer_.size = kSharedBufferSize; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockCommandBufferEngine() { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual gpu::Buffer GetSharedMemoryBuffer(int32 shm_id) OVERRIDE { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shm_id == kSharedMemoryId ? valid_buffer_ : invalid_buffer_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearSharedMemory() { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(data_.get(), kInitialMemoryValue, kSharedBufferSize); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void set_token(int32 token) OVERRIDE { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetGetBuffer(int32 /* transfer_buffer_id */) OVERRIDE { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from CommandBufferEngine. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetGetOffset(int32 offset) OVERRIDE { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from CommandBufferEngine. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int32 GetGetOffset() OVERRIDE { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(false); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<int8[]> data_; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu::Buffer valid_buffer_; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu::Buffer invalid_buffer_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockCommandBufferEngine> engine_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COMPILER_MSVC 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 QueryManagerTest::kSharedMemoryId; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t QueryManagerTest::kSharedBufferSize; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 QueryManagerTest::kSharedMemoryOffset; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 QueryManagerTest::kInvalidSharedMemoryId; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 QueryManagerTest::kInvalidSharedMemoryOffset; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 QueryManagerTest::kInitialResult; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint8 QueryManagerTest::kInitialMemoryValue; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, Basic) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient2Id = 2; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->HavePendingQueries()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can create a Query. 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(GL_ANY_SAMPLES_PASSED_EXT, kClient1Id, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, kService1Id)); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can get the same Query. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(query.get(), manager_->GetQuery(kClient1Id)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we get nothing for a non-existent query. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetQuery(kClient2Id) == NULL); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can delete the query. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->RemoveQuery(kClient1Id); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we get nothing for a non-existent query. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetQuery(kClient1Id) == NULL); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check query is deleted 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query->IsDeleted()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->HavePendingQueries()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, Destroy) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(GL_ANY_SAMPLES_PASSED_EXT, kClient1Id, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, kService1Id)); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, DeleteQueriesARB(1, ::testing::Pointee(kService1Id))) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->Destroy(true); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we get nothing for a non-existent query. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetQuery(kClient1Id) == NULL); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check query is deleted 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query->IsDeleted()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, QueryBasic) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, kService1Id)); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query->IsValid()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query->IsDeleted()); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query->pending()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTarget, query->target()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSharedMemoryId, query->shm_id()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSharedMemoryOffset, query->shm_offset()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingQuery) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSubmitCount = 123; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult = 1; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check nothing happens if there are no pending queries. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, kService1Id)); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup shared memory like client would. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuerySync* sync = decoder_->GetSharedMemoryAs<QuerySync*>( 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync)); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(sync != NULL); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync->Reset(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queue it 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query.get(), kService1Id, kSubmitCount); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query->pending()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->HavePendingQueries()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with return not available. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 1 GL command. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(0)) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query->pending()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sync->process_count); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sync->result); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with return available. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 2 GL commands. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _)) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult)) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query->pending()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSubmitCount, sync->process_count); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kResult, sync->result); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->HavePendingQueries()); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with no queries. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect no GL commands/ 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingQueries) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient2Id = 2; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService2Id = 12; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient3Id = 3; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService3Id = 13; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSubmitCount1 = 123; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSubmitCount2 = 123; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSubmitCount3 = 123; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult1 = 1; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult2 = 1; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult3 = 1; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup shared memory like client would. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuerySync* sync1 = decoder_->GetSharedMemoryAs<QuerySync*>( 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync1) * 3); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(sync1 != NULL); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuerySync* sync2 = sync1 + 1; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuerySync* sync3 = sync2 + 1; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Queries. 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query1( 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 0, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kService1Id)); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query2( 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient2Id, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 1, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kService2Id)); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query3( 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient3Id, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset + sizeof(*sync1) * 2, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kService3Id)); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query1.get() != NULL); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query2.get() != NULL); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query3.get() != NULL); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->HavePendingQueries()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync1->Reset(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync2->Reset(); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync3->Reset(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queue them 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query1.get(), kService1Id, kSubmitCount1); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query2.get(), kService2Id, kSubmitCount2); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query3.get(), kService3Id, kSubmitCount3); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query1->pending()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query2->pending()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query3->pending()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->HavePendingQueries()); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with return available for first 2 queries. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 4 GL commands. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InSequence s; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _)) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult1)) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService2Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService2Id, GL_QUERY_RESULT_EXT, _)) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult2)) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(0)) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query1->pending()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query2->pending()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query3->pending()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSubmitCount1, sync1->process_count); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSubmitCount2, sync2->process_count); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kResult1, sync1->result); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kResult2, sync2->result); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sync3->process_count); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sync3->result); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->HavePendingQueries()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with renaming query. No result. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 1 GL commands. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(0)) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(query3->pending()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sync3->process_count); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, sync3->result); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->HavePendingQueries()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with renaming query. With result. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 2 GL commands. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService3Id, GL_QUERY_RESULT_EXT, _)) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult3)) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->ProcessPendingQueries()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query3->pending()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSubmitCount3, sync3->process_count); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kResult3, sync3->result); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->HavePendingQueries()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingBadSharedMemoryId) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSubmitCount = 123; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult = 1; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kInvalidSharedMemoryId, kSharedMemoryOffset, kService1Id)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queue it 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query.get(), kService1Id, kSubmitCount); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with return available. 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 2 GL commands. 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _)) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult)) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->ProcessPendingQueries()); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ProcessPendingBadSharedMemoryOffset) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSubmitCount = 123; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kResult = 1; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kInvalidSharedMemoryOffset, kService1Id)); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queue it 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query.get(), kService1Id, kSubmitCount); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Process with return available. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expect 2 GL commands. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(1)) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetQueryObjectuivARB(kService1Id, GL_QUERY_RESULT_EXT, _)) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<2>(kResult)) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(manager_->ProcessPendingQueries()); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ExitWithPendingQuery) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSubmitCount = 123; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Query. 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<QueryManager::Query> query( 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateQuery(kTarget, kClient1Id, 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, kService1Id)); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query.get() != NULL); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queue it 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueueQuery(query.get(), kService1Id, kSubmitCount); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when based on ARB_occlusion_query2 we use GL_ANY_SAMPLES_PASSED_ARB 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ARBOcclusionQuery2) { 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSubmitCount = 123; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestHelper::SetupFeatureInfoInitExpectations( 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.get(), 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GL_ARB_occlusion_query2"); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) feature_info->Initialize("*"); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<QueryManager> manager( 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new QueryManager(decoder_.get(), feature_info.get())); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, GenQueriesARB(1, _)) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<1>(kService1Id)) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager::Query* query = manager->CreateQuery( 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query != NULL); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kService1Id)) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT)) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->BeginQuery(query)); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->EndQuery(query, kSubmitCount)); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->Destroy(false); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when based on ARB_occlusion_query we use GL_SAMPLES_PASSED_ARB 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for GL_ANY_SAMPLES_PASSED_EXT 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, ARBOcclusionQuery) { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSubmitCount = 123; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestHelper::SetupFeatureInfoInitExpectations( 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.get(), 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "GL_ARB_occlusion_query"); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) feature_info->Initialize("*"); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<QueryManager> manager( 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new QueryManager(decoder_.get(), feature_info.get())); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, GenQueriesARB(1, _)) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgumentPointee<1>(kService1Id)) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager::Query* query = manager->CreateQuery( 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query != NULL); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, BeginQueryARB(GL_SAMPLES_PASSED_ARB, kService1Id)) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, EndQueryARB(GL_SAMPLES_PASSED_ARB)) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->BeginQuery(query)); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->EndQuery(query, kSubmitCount)); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->Destroy(false); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QueryManagerTest, GetErrorQuery) { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kTarget = GL_GET_ERROR_QUERY_CHROMIUM; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSubmitCount = 123; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), ""); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) feature_info->Initialize("*"); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<QueryManager> manager( 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new QueryManager(decoder_.get(), feature_info.get())); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager::Query* query = manager->CreateQuery( 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTarget, kClient1Id, kSharedMemoryId, kSharedMemoryOffset); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(query != NULL); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup shared memory like client would. 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuerySync* sync = decoder_->GetSharedMemoryAs<QuerySync*>( 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSharedMemoryId, kSharedMemoryOffset, sizeof(*sync)); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(sync != NULL); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync->Reset(); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->BeginQuery(query)); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockErrorState mock_error_state; 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*decoder_.get(), GetErrorState()) 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillRepeatedly(Return(&mock_error_state)); 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(mock_error_state, GetGLError()) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Return(GL_INVALID_ENUM)) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager->EndQuery(query, kSubmitCount)); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(query->pending()); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<GLuint>(GL_INVALID_ENUM), sync->result); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->Destroy(false); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575