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