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" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/memory/shared_memory.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/numerics/safe_math.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/synchronization/lock.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/command_buffer/service/async_pixel_transfer_manager.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/service/error_state.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/feature_info.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h" 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/gl/gl_fence.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass AsyncPixelTransferCompletionObserverImpl 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : public AsyncPixelTransferCompletionObserver { 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AsyncPixelTransferCompletionObserverImpl(base::subtle::Atomic32 submit_count) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : submit_count_(submit_count), cancelled_(false) {} 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void Cancel() { 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::AutoLock locked(lock_); 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cancelled_ = true; 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void DidComplete(const AsyncMemoryParams& mem_params) OVERRIDE { 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::AutoLock locked(lock_); 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!cancelled_) { 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(mem_params.buffer().get()); 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void* data = mem_params.GetDataAddress(); 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch QuerySync* sync = static_cast<QuerySync*>(data); 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::subtle::Release_Store(&sync->process_count, submit_count_); 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~AsyncPixelTransferCompletionObserverImpl() {} 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::subtle::Atomic32 submit_count_; 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Lock lock_; 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool cancelled_; 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferCompletionObserverImpl); 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass AsyncPixelTransfersCompletedQuery 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : public QueryManager::Query, 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public base::SupportsWeakPtr<AsyncPixelTransfersCompletedQuery> { 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AsyncPixelTransfersCompletedQuery( 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual bool Begin() OVERRIDE; 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual bool Process() OVERRIDE; 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void Destroy(bool have_context) OVERRIDE; 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected: 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~AsyncPixelTransfersCompletedQuery(); 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<AsyncPixelTransferCompletionObserverImpl> observer_; 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochAsyncPixelTransfersCompletedQuery::AsyncPixelTransfersCompletedQuery( 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : Query(manager, target, shm_id, shm_offset) { 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AsyncPixelTransfersCompletedQuery::Begin() { 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool AsyncPixelTransfersCompletedQuery::End( 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::subtle::Atomic32 submit_count) { 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Get the real shared memory since it might need to be duped to prevent 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // use-after-free of the memory. 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<Buffer> buffer = 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch manager()->decoder()->GetSharedMemoryBuffer(shm_id()); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!buffer.get()) 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AsyncMemoryParams mem_params(buffer, shm_offset(), sizeof(QuerySync)); 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!mem_params.GetDataAddress()) 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch observer_ = new AsyncPixelTransferCompletionObserverImpl(submit_count); 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Ask AsyncPixelTransferDelegate to run completion callback after all 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // previous async transfers are done. No guarantee that callback is run 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // on the current thread. 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci manager()->decoder()->GetAsyncPixelTransferManager()->AsyncNotifyCompletion( 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mem_params, observer_.get()); 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return AddToPendingTransferQueue(submit_count); 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AsyncPixelTransfersCompletedQuery::Process() { 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>( 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch shm_id(), shm_offset(), sizeof(*sync)); 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!sync) 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Check if completion callback has been run. sync->process_count atomicity 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // is guaranteed as this is already used to notify client of a completed 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // query. 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (base::subtle::Acquire_Load(&sync->process_count) != submit_count()) 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UnmarkAsPending(); 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AsyncPixelTransfersCompletedQuery::Destroy(bool /* have_context */) { 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!IsDeleted()) { 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MarkAsDeleted(); 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochAsyncPixelTransfersCompletedQuery::~AsyncPixelTransfersCompletedQuery() { 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (observer_.get()) 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch observer_->Cancel(); 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AllSamplesPassedQuery : public QueryManager::Query { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AllSamplesPassedQuery( 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint service_id); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Begin() OVERRIDE; 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Process() OVERRIDE; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Destroy(bool have_context) OVERRIDE; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AllSamplesPassedQuery(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Service side query id. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint service_id_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AllSamplesPassedQuery::AllSamplesPassedQuery( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint service_id) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Query(manager, target, shm_id, shm_offset), 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_id_(service_id) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AllSamplesPassedQuery::Begin() { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BeginQueryHelper(target(), service_id_); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool AllSamplesPassedQuery::End(base::subtle::Atomic32 submit_count) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EndQueryHelper(target()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return AddToPendingQueue(submit_count); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AllSamplesPassedQuery::Process() { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint available = 0; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetQueryObjectuivARB( 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!available) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint result = 0; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGetQueryObjectuivARB( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_id_, GL_QUERY_RESULT_EXT, &result); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MarkAsCompleted(result != 0); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AllSamplesPassedQuery::Destroy(bool have_context) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (have_context && !IsDeleted()) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glDeleteQueriesARB(1, &service_id_); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MarkAsDeleted(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AllSamplesPassedQuery::~AllSamplesPassedQuery() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandsIssuedQuery : public QueryManager::Query { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandsIssuedQuery( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Begin() OVERRIDE; 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Process() OVERRIDE; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Destroy(bool have_context) OVERRIDE; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CommandsIssuedQuery(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks begin_time_; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CommandsIssuedQuery::CommandsIssuedQuery( 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Query(manager, target, shm_id, shm_offset) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CommandsIssuedQuery::Begin() { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) begin_time_ = base::TimeTicks::HighResNow(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool CommandsIssuedQuery::End(base::subtle::Atomic32 submit_count) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta elapsed = base::TimeTicks::HighResNow() - begin_time_; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MarkAsPending(submit_count); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MarkAsCompleted(elapsed.InMicroseconds()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CommandsIssuedQuery::Process() { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CommandsIssuedQuery::Destroy(bool /* have_context */) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsDeleted()) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MarkAsDeleted(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CommandsIssuedQuery::~CommandsIssuedQuery() { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandLatencyQuery : public QueryManager::Query { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLatencyQuery( 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Begin() OVERRIDE; 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Process() OVERRIDE; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Destroy(bool have_context) OVERRIDE; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CommandLatencyQuery(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CommandLatencyQuery::CommandLatencyQuery( 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Query(manager, target, shm_id, shm_offset) { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CommandLatencyQuery::Begin() { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool CommandLatencyQuery::End(base::subtle::Atomic32 submit_count) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta now = base::TimeTicks::HighResNow() - base::TimeTicks(); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MarkAsPending(submit_count); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MarkAsCompleted(now.InMicroseconds()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CommandLatencyQuery::Process() { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CommandLatencyQuery::Destroy(bool /* have_context */) { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsDeleted()) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MarkAsDeleted(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CommandLatencyQuery::~CommandLatencyQuery() { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 286a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 287a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass AsyncReadPixelsCompletedQuery 288a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch : public QueryManager::Query, 289a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch public base::SupportsWeakPtr<AsyncReadPixelsCompletedQuery> { 290a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch public: 291a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch AsyncReadPixelsCompletedQuery( 292a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 293a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 294a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch virtual bool Begin() OVERRIDE; 295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; 296a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch virtual bool Process() OVERRIDE; 297a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch virtual void Destroy(bool have_context) OVERRIDE; 298a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 299a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch protected: 300a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch void Complete(); 301a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch virtual ~AsyncReadPixelsCompletedQuery(); 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool completed_; 305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool complete_result_; 306a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}; 307a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 308a3f7b4e666c476898878fa745f637129375cd889Ben MurdochAsyncReadPixelsCompletedQuery::AsyncReadPixelsCompletedQuery( 309a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : Query(manager, target, shm_id, shm_offset), 311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) completed_(false), 312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) complete_result_(false) { 313a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 314a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 315a3f7b4e666c476898878fa745f637129375cd889Ben Murdochbool AsyncReadPixelsCompletedQuery::Begin() { 316a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return true; 317a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 318a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool AsyncReadPixelsCompletedQuery::End(base::subtle::Atomic32 submit_count) { 320a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!AddToPendingQueue(submit_count)) { 321a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return false; 322a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 323a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch manager()->decoder()->WaitForReadPixels( 324a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::Bind(&AsyncReadPixelsCompletedQuery::Complete, 325a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch AsWeakPtr())); 326a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return Process(); 328a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 329a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 330a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid AsyncReadPixelsCompletedQuery::Complete() { 331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) completed_ = true; 332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) complete_result_ = MarkAsCompleted(1); 333a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 334a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 335a3f7b4e666c476898878fa745f637129375cd889Ben Murdochbool AsyncReadPixelsCompletedQuery::Process() { 336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return !completed_ || complete_result_; 337a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 338a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 339a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid AsyncReadPixelsCompletedQuery::Destroy(bool /* have_context */) { 340a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!IsDeleted()) { 341a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch MarkAsDeleted(); 342a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 343a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 344a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 345a3f7b4e666c476898878fa745f637129375cd889Ben MurdochAsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() { 346a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 347a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 348a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GetErrorQuery : public QueryManager::Query { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetErrorQuery( 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Begin() OVERRIDE; 355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Process() OVERRIDE; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Destroy(bool have_context) OVERRIDE; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~GetErrorQuery(); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GetErrorQuery::GetErrorQuery( 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Query(manager, target, shm_id, shm_offset) { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetErrorQuery::Begin() { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool GetErrorQuery::End(base::subtle::Atomic32 submit_count) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MarkAsPending(submit_count); 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return MarkAsCompleted(manager()->decoder()->GetErrorState()->GetGLError()); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetErrorQuery::Process() { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetErrorQuery::Destroy(bool /* have_context */) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsDeleted()) { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MarkAsDeleted(); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GetErrorQuery::~GetErrorQuery() { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass CommandsCompletedQuery : public QueryManager::Query { 3940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public: 3950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CommandsCompletedQuery(QueryManager* manager, 3960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLenum target, 3970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int32 shm_id, 3980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch uint32 shm_offset); 3990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Overridden from QueryManager::Query: 4010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool Begin() OVERRIDE; 4020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; 4030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool Process() OVERRIDE; 4040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void Destroy(bool have_context) OVERRIDE; 4050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected: 4070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual ~CommandsCompletedQuery(); 4080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private: 4100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<gfx::GLFence> fence_; 4110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 4120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4130529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochCommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, 4140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLenum target, 4150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int32 shm_id, 4160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch uint32 shm_offset) 4170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : Query(manager, target, shm_id, shm_offset) {} 4180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool CommandsCompletedQuery::Begin() { return true; } 4200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) { 4220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch fence_.reset(gfx::GLFence::Create()); 4230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DCHECK(fence_); 4240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return AddToPendingQueue(submit_count); 4250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 4260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool CommandsCompletedQuery::Process() { 4280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (fence_ && !fence_->HasCompleted()) 4290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return true; 4300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return MarkAsCompleted(0); 4310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 4320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid CommandsCompletedQuery::Destroy(bool have_context) { 4340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (have_context && !IsDeleted()) { 4350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch fence_.reset(); 4360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch MarkAsDeleted(); 4370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 4380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 4390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4400529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochCommandsCompletedQuery::~CommandsCompletedQuery() {} 4410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QueryManager::QueryManager( 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLES2Decoder* decoder, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FeatureInfo* feature_info) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : decoder_(decoder), 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_arb_occlusion_query2_for_occlusion_query_boolean_( 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) feature_info->feature_flags( 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ).use_arb_occlusion_query2_for_occlusion_query_boolean), 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_arb_occlusion_query_for_occlusion_query_boolean_( 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) feature_info->feature_flags( 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ).use_arb_occlusion_query_for_occlusion_query_boolean), 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) query_count_(0) { 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!(use_arb_occlusion_query_for_occlusion_query_boolean_ && 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_arb_occlusion_query2_for_occlusion_query_boolean_)); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QueryManager::~QueryManager() { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(queries_.empty()); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this triggers, that means something is keeping a reference to 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a Query belonging to this. 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_EQ(query_count_, 0u); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QueryManager::Destroy(bool have_context) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_queries_.clear(); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_transfer_queries_.clear(); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!queries_.empty()) { 469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Query* query = queries_.begin()->second.get(); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) query->Destroy(have_context); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) queries_.erase(queries_.begin()); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QueryManager::Query* QueryManager::CreateQuery( 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum target, GLuint client_id, int32 shm_id, uint32 shm_offset) { 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Query> query; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (target) { 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GL_COMMANDS_ISSUED_CHROMIUM: 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) query = new CommandsIssuedQuery(this, target, shm_id, shm_offset); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GL_LATENCY_QUERY_CHROMIUM: 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) query = new CommandLatencyQuery(this, target, shm_id, shm_offset); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 485424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM: 486424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Currently async pixel transfer delegates only support uploads. 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) query = new AsyncPixelTransfersCompletedQuery( 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, target, shm_id, shm_offset); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 490424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM: 491a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch query = new AsyncReadPixelsCompletedQuery( 492a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch this, target, shm_id, shm_offset); 493a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch break; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GL_GET_ERROR_QUERY_CHROMIUM: 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) query = new GetErrorQuery(this, target, shm_id, shm_offset); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case GL_COMMANDS_COMPLETED_CHROMIUM: 4980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch query = new CommandsCompletedQuery(this, target, shm_id, shm_offset); 4990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint service_id = 0; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glGenQueriesARB(1, &service_id); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(0u, service_id); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) query = new AllSamplesPassedQuery( 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, target, shm_id, shm_offset, service_id); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::pair<QueryMap::iterator, bool> result = 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) queries_.insert(std::make_pair(client_id, query)); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(result.second); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return query.get(); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid QueryManager::GenQueries(GLsizei n, const GLuint* queries) { 5160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DCHECK_GE(n, 0); 5170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (GLsizei i = 0; i < n; ++i) { 5180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generated_query_ids_.insert(queries[i]); 5190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 5200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 5210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 5220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool QueryManager::IsValidQuery(GLuint id) { 5230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GeneratedQueryIds::iterator it = generated_query_ids_.find(id); 5240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return it != generated_query_ids_.end(); 5250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 5260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QueryManager::Query* QueryManager::GetQuery( 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint client_id) { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryMap::iterator it = queries_.find(client_id); 530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return it != queries_.end() ? it->second.get() : NULL; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QueryManager::RemoveQuery(GLuint client_id) { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryMap::iterator it = queries_.find(client_id); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != queries_.end()) { 536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Query* query = it->second.get(); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemovePendingQuery(query); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) query->MarkAsDeleted(); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) queries_.erase(it); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch generated_query_ids_.erase(client_id); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QueryManager::StartTracking(QueryManager::Query* /* query */) { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++query_count_; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QueryManager::StopTracking(QueryManager::Query* /* query */) { 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --query_count_; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLenum QueryManager::AdjustTargetForEmulation(GLenum target) { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (target) { 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT: 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GL_ANY_SAMPLES_PASSED_EXT: 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (use_arb_occlusion_query2_for_occlusion_query_boolean_) { 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ARB_occlusion_query2 does not have a 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // target. 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target = GL_ANY_SAMPLES_PASSED_EXT; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (use_arb_occlusion_query_for_occlusion_query_boolean_) { 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ARB_occlusion_query does not have a 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GL_ANY_SAMPLES_PASSED_EXT 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // target. 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target = GL_SAMPLES_PASSED_ARB; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QueryManager::BeginQueryHelper(GLenum target, GLuint id) { 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target = AdjustTargetForEmulation(target); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glBeginQueryARB(target, id); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QueryManager::EndQueryHelper(GLenum target) { 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target = AdjustTargetForEmulation(target); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glEndQueryARB(target); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QueryManager::Query::Query( 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : manager_(manager), 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target), 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shm_id_(shm_id), 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shm_offset_(shm_offset), 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) submit_count_(0), 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_(false), 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) deleted_(false) { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(manager); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->StartTracking(this); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid QueryManager::Query::RunCallbacks() { 598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (size_t i = 0; i < callbacks_.size(); i++) { 599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callbacks_[i].Run(); 600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callbacks_.clear(); 602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid QueryManager::Query::AddCallback(base::Closure callback) { 605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (pending_) { 606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callbacks_.push_back(callback); 607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback.Run(); 609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QueryManager::Query::~Query() { 613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The query is getting deleted, either by the client or 614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // because the context was lost. Call any outstanding 615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // callbacks to avoid leaks. 616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RunCallbacks(); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (manager_) { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->StopTracking(this); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_ = NULL; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool QueryManager::Query::MarkAsCompleted(uint64 result) { 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(pending_); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuerySync* sync = manager_->decoder_->GetSharedMemoryAs<QuerySync*>( 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shm_id_, shm_offset_, sizeof(*sync)); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sync) { 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_ = false; 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync->result = result; 633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::subtle::Release_Store(&sync->process_count, submit_count_); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool QueryManager::ProcessPendingQueries() { 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!pending_queries_.empty()) { 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Query* query = pending_queries_.front().get(); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!query->Process()) { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (query->pending()) { 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch query->RunCallbacks(); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_queries_.pop_front(); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool QueryManager::HavePendingQueries() { 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !pending_queries_.empty(); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool QueryManager::ProcessPendingTransferQueries() { 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (!pending_transfer_queries_.empty()) { 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Query* query = pending_transfer_queries_.front().get(); 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!query->Process()) { 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (query->pending()) { 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch query->RunCallbacks(); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_transfer_queries_.pop_front(); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool QueryManager::HavePendingTransferQueries() { 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !pending_transfer_queries_.empty(); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool QueryManager::AddPendingQuery(Query* query, 679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::subtle::Atomic32 submit_count) { 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(query); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!query->IsDeleted()); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!RemovePendingQuery(query)) { 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) query->MarkAsPending(submit_count); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_queries_.push_back(query); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool QueryManager::AddPendingTransferQuery( 691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Query* query, 692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::subtle::Atomic32 submit_count) { 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(query); 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!query->IsDeleted()); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!RemovePendingQuery(query)) { 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) query->MarkAsPending(submit_count); 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_transfer_queries_.push_back(query); 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool QueryManager::RemovePendingQuery(Query* query) { 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(query); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (query->pending()) { 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(gman): Speed this up if this is a common operation. This would only 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // happen if you do being/end begin/end on the same query without waiting 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the first one to finish. 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (QueryQueue::iterator it = pending_queries_.begin(); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != pending_queries_.end(); ++it) { 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->get() == query) { 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_queries_.erase(it); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (QueryQueue::iterator it = pending_transfer_queries_.begin(); 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it != pending_transfer_queries_.end(); ++it) { 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it->get() == query) { 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_transfer_queries_.erase(it); 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!query->MarkAsCompleted(0)) { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool QueryManager::BeginQuery(Query* query) { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(query); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!RemovePendingQuery(query)) { 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return query->Begin(); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(query); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!RemovePendingQuery(query)) { 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return query->End(submit_count); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 748