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)#ifndef GPU_COMMAND_BUFFER_SERVICE_QUERY_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_QUERY_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector>
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/atomicops.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/feature_info.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2Decoder;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FeatureInfo;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class keeps track of the queries and their state
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// As Queries are not shared there is one QueryManager per context.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GPU_EXPORT QueryManager {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class GPU_EXPORT Query : public base::RefCounted<Query> {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Query(
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target() const {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return target_;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsDeleted() const {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return deleted_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsValid() const {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return target() && !IsDeleted();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool pending() const {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return pending_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 shm_id() const {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return shm_id_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 shm_offset() const {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return shm_offset_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns false if shared memory for sync is invalid.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool Begin() = 0;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns false if shared memory for sync is invalid.
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual bool End(base::subtle::Atomic32 submit_count) = 0;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns false if shared memory for sync is invalid.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool Process() = 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void Destroy(bool have_context) = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    void AddCallback(base::Closure callback);
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Query();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QueryManager* manager() const {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return manager_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void MarkAsDeleted() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deleted_ = true;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns false if shared memory for sync is invalid.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool MarkAsCompleted(uint64 result);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    void MarkAsPending(base::subtle::Atomic32 submit_count) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(!pending_);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_ = true;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      submit_count_ = submit_count;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void UnmarkAsPending() {
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK(pending_);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pending_ = false;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns false if shared memory for sync is invalid.
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool AddToPendingQueue(base::subtle::Atomic32 submit_count) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return manager_->AddPendingQuery(this, submit_count);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Returns false if shared memory for sync is invalid.
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool AddToPendingTransferQueue(base::subtle::Atomic32 submit_count) {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return manager_->AddPendingTransferQuery(this, submit_count);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void BeginQueryHelper(GLenum target, GLuint id) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_->BeginQueryHelper(target, id);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void EndQueryHelper(GLenum target) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_->EndQueryHelper(target);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::subtle::Atomic32 submit_count() const { return submit_count_; }
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class QueryManager;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class QueryManagerTest;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class base::RefCounted<Query>;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    void RunCallbacks();
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The manager that owns this Query.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QueryManager* manager_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The type of query.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The shared memory used with this Query.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 shm_id_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 shm_offset_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Count to set process count do when completed.
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::subtle::Atomic32 submit_count_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // True if in the queue.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool pending_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // True if deleted.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool deleted_;
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // List of callbacks to run when result is available.
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::vector<base::Closure> callbacks_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryManager(
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLES2Decoder* decoder,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FeatureInfo* feature_info);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~QueryManager();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must call before destruction.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Destroy(bool have_context);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a Query for the given query.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query* CreateQuery(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLuint client_id, int32 shm_id, uint32 shm_offset);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the query info for the given query.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Query* GetQuery(GLuint client_id);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes a query info for the given query.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveQuery(GLuint client_id);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if any query is pointing to invalid shared memory.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool BeginQuery(Query* query);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if any query is pointing to invalid shared memory.
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool EndQuery(Query* query, base::subtle::Atomic32 submit_count);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Processes pending queries. Returns false if any queries are pointing
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to invalid shared memory.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ProcessPendingQueries();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if there are pending queries.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HavePendingQueries();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Processes pending transfer queries. Returns false if any queries are
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // pointing to invalid shared memory.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ProcessPendingTransferQueries();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if there are pending transfer queries.
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool HavePendingTransferQueries();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2Decoder* decoder() const {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return decoder_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void GenQueries(GLsizei n, const GLuint* queries);
1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool IsValidQuery(GLuint id);
1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartTracking(Query* query);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StopTracking(Query* query);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wrappers for BeginQueryARB and EndQueryARB to hide differences between
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ARB_occlusion_query2 and EXT_occlusion_query_boolean.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BeginQueryHelper(GLenum target, GLuint id);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EndQueryHelper(GLenum target);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds to queue of queries waiting for completion.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if any query is pointing to invalid shared memory.
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool AddPendingQuery(Query* query, base::subtle::Atomic32 submit_count);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adds to queue of transfer queries waiting for completion.
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if any query is pointing to invalid shared memory.
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool AddPendingTransferQuery(Query* query,
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               base::subtle::Atomic32 submit_count);
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes a query from the queue of pending queries.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns false if any query is pointing to invalid shared memory.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RemovePendingQuery(Query* query);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a target used for the underlying GL extension
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used to emulate a query.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum AdjustTargetForEmulation(GLenum target);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to validate shared memory and get GL errors.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2Decoder* decoder_;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool use_arb_occlusion_query2_for_occlusion_query_boolean_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool use_arb_occlusion_query_for_occlusion_query_boolean_;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Counts the number of Queries allocated with 'this' as their manager.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows checking no Query will outlive this.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned query_count_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Info for each query in the system.
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::hash_map<GLuint, scoped_refptr<Query> > QueryMap;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryMap queries_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  typedef base::hash_set<GLuint> GeneratedQueryIds;
2340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GeneratedQueryIds generated_query_ids_;
2350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Queries waiting for completion.
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::deque<scoped_refptr<Query> > QueryQueue;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QueryQueue pending_queries_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Async pixel transfer queries waiting for completion.
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QueryQueue pending_transfer_queries_;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QueryManager);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_SERVICE_QUERY_MANAGER_H_
250