diff options
Diffstat (limited to 'chromium/gpu/command_buffer/client/query_tracker.h')
-rw-r--r-- | chromium/gpu/command_buffer/client/query_tracker.h | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/chromium/gpu/command_buffer/client/query_tracker.h b/chromium/gpu/command_buffer/client/query_tracker.h new file mode 100644 index 00000000000..81861c997a9 --- /dev/null +++ b/chromium/gpu/command_buffer/client/query_tracker.h @@ -0,0 +1,177 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GPU_COMMAND_BUFFER_CLIENT_QUERY_TRACKER_H_ +#define GPU_COMMAND_BUFFER_CLIENT_QUERY_TRACKER_H_ + +#include <GLES2/gl2.h> + +#include <deque> +#include <list> + +#include "gles2_impl_export.h" +#include "gpu/command_buffer/client/hash_tables.h" +#include "gpu/command_buffer/common/gles2_cmd_format.h" + +namespace gpu { + +class CommandBufferHelper; +class MappedMemoryManager; + +namespace gles2 { + +class GLES2Implementation; + +// Manages buckets of QuerySync instances in mapped memory. +class GLES2_IMPL_EXPORT QuerySyncManager { + public: + static const size_t kSyncsPerBucket = 4096; + + struct Bucket { + explicit Bucket(QuerySync* sync_mem) + : syncs(sync_mem), + used_query_count(0) { + } + QuerySync* syncs; + unsigned used_query_count; + }; + struct QueryInfo { + QueryInfo(Bucket* bucket, int32 id, uint32 offset, QuerySync* sync_mem) + : bucket(bucket), + shm_id(id), + shm_offset(offset), + sync(sync_mem) { + } + + QueryInfo() + : bucket(NULL), + shm_id(0), + shm_offset(0), + sync(NULL) { + } + + Bucket* bucket; + int32 shm_id; + uint32 shm_offset; + QuerySync* sync; + }; + + explicit QuerySyncManager(MappedMemoryManager* manager); + ~QuerySyncManager(); + + bool Alloc(QueryInfo* info); + void Free(const QueryInfo& sync); + void Shrink(); + + private: + MappedMemoryManager* mapped_memory_; + std::deque<Bucket*> buckets_; + std::deque<QueryInfo> free_queries_; + + DISALLOW_COPY_AND_ASSIGN(QuerySyncManager); +}; + +// Tracks queries for client side of command buffer. +class GLES2_IMPL_EXPORT QueryTracker { + public: + class GLES2_IMPL_EXPORT Query { + public: + enum State { + kUninitialized, // never used + kActive, // between begin - end + kPending, // not yet complete + kComplete // completed + }; + + Query(GLuint id, GLenum target, const QuerySyncManager::QueryInfo& info); + + GLenum target() const { + return target_; + } + + GLenum id() const { + return id_; + } + + int32 shm_id() const { + return info_.shm_id; + } + + uint32 shm_offset() const { + return info_.shm_offset; + } + + void MarkAsActive() { + state_ = kActive; + ++submit_count_; + } + + void MarkAsPending(int32 token) { + token_ = token; + state_ = kPending; + flushed_ = false; + } + + uint32 submit_count() const { + return submit_count_; + } + + int32 token() const { + return token_; + } + + bool NeverUsed() const { + return state_ == kUninitialized; + } + + bool Pending() const { + return state_ == kPending; + } + + bool CheckResultsAvailable(CommandBufferHelper* helper); + + uint32 GetResult() const; + + void Begin(GLES2Implementation* gl); + void End(GLES2Implementation* gl); + + private: + friend class QueryTracker; + friend class QueryTrackerTest; + + GLuint id_; + GLenum target_; + QuerySyncManager::QueryInfo info_; + State state_; + uint32 submit_count_; + int32 token_; + bool flushed_; + uint64 client_begin_time_us_; // Only used for latency query target. + uint32 result_; + }; + + QueryTracker(MappedMemoryManager* manager); + ~QueryTracker(); + + Query* CreateQuery(GLuint id, GLenum target); + Query* GetQuery(GLuint id); + void RemoveQuery(GLuint id); + void Shrink(); + void FreeCompletedQueries(); + + private: + typedef gpu::hash_map<GLuint, Query*> QueryMap; + typedef std::list<Query*> QueryList; + + QueryMap queries_; + QueryList removed_queries_; + QuerySyncManager query_sync_manager_; + + DISALLOW_COPY_AND_ASSIGN(QueryTracker); +}; + +} // namespace gles2 +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_CLIENT_QUERY_TRACKER_H_ |