Chromium Code Reviews| 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..a9a4c0e5a6eac9ad2380e820bb2feaf0c782aa58 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,57 @@ 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::CreateWithoutFlush()); |
|
no sievers
2014/04/15 23:53:37
Make sure piman@ is ok with this being used here :
piman
2014/04/16 00:32:03
The client only forces a shallow flush, because th
reveman
2014/04/16 01:28:47
Ah, looked like QueryTracker::Query::CheckResultsA
|
| + DCHECK(fence_); |
|
piman
2014/04/16 00:32:03
gfx::GLFence::Create (with or without flush) will
reveman
2014/04/16 01:28:47
Got it.
|
| + 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 +496,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); |