Index: gpu/command_buffer/service/query_manager.cc |
diff --git a/gpu/command_buffer/service/query_manager.cc b/gpu/command_buffer/service/query_manager.cc |
index 9f1d3a7169c31b5c1ee640b07f6c08a71623b18b..30c036ed98d02dc0b211b5b999b7611bfd2b2a9b 100644 |
--- a/gpu/command_buffer/service/query_manager.cc |
+++ b/gpu/command_buffer/service/query_manager.cc |
@@ -16,6 +16,7 @@ |
#include "gpu/command_buffer/service/error_state.h" |
#include "gpu/command_buffer/service/feature_info.h" |
#include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
+#include "ui/gl/gl_fence.h" |
namespace gpu { |
namespace gles2 { |
@@ -389,6 +390,55 @@ void GetErrorQuery::Destroy(bool /* have_context */) { |
GetErrorQuery::~GetErrorQuery() { |
} |
+class CommandsCompletedQuery : public QueryManager::Query { |
+ public: |
+ CommandsCompletedQuery(QueryManager* manager, |
+ GLenum target, |
+ int32 shm_id, |
+ uint32 shm_offset); |
+ |
+ // Overridden from QueryManager::Query: |
+ virtual bool Begin() OVERRIDE; |
+ virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; |
+ virtual bool Process() OVERRIDE; |
+ virtual void Destroy(bool have_context) OVERRIDE; |
+ |
+ protected: |
+ virtual ~CommandsCompletedQuery(); |
+ |
+ private: |
+ scoped_ptr<gfx::GLFence> fence_; |
+}; |
+ |
+CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, |
+ GLenum target, |
+ int32 shm_id, |
+ uint32 shm_offset) |
+ : Query(manager, target, shm_id, shm_offset) {} |
+ |
+bool CommandsCompletedQuery::Begin() { return true; } |
+ |
+bool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) { |
+ fence_.reset(gfx::GLFence::Create()); |
+ DCHECK(fence_); |
+ return AddToPendingQueue(submit_count); |
+} |
+ |
+bool CommandsCompletedQuery::Process() { |
+ if (fence_ && !fence_->HasCompleted()) |
+ return true; |
+ return MarkAsCompleted(0); |
+} |
+ |
+void CommandsCompletedQuery::Destroy(bool have_context) { |
+ if (have_context && !IsDeleted()) { |
+ fence_.reset(); |
+ MarkAsDeleted(); |
+ } |
+} |
+ |
+CommandsCompletedQuery::~CommandsCompletedQuery() {} |
+ |
QueryManager::QueryManager( |
GLES2Decoder* decoder, |
FeatureInfo* feature_info) |
@@ -444,6 +494,9 @@ QueryManager::Query* QueryManager::CreateQuery( |
case GL_GET_ERROR_QUERY_CHROMIUM: |
query = new GetErrorQuery(this, target, shm_id, shm_offset); |
break; |
+ case GL_COMMANDS_COMPLETED_CHROMIUM: |
+ query = new CommandsCompletedQuery(this, target, shm_id, shm_offset); |
+ break; |
default: { |
GLuint service_id = 0; |
glGenQueriesARB(1, &service_id); |