From 12e55fad62c6f3ede72d40f12f6c442285d75488 Mon Sep 17 00:00:00 2001 From: "hubbe@chromium.org" Date: Tue, 2 Jul 2013 06:49:24 +0000 Subject: Perform glReadPixels with PBOs in the gpu, if PBOs are available. Make GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM wait for readpixel transfers. Add signalQuery to get a callback when the transfer is done. PLEASE NOTE: glMapBuffer does not wait for the readpixels transfer to complete anymore. Nobody is currently relying on that behaviour. Update gl_helper.cc and gl_renderer.cc to use queries. BUG=249925 Review URL: https://chromiumcodereview.appspot.com/16831004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@209625 0039d316-1c4b-4281-b951-d872f2087c98 --- gpu/command_buffer/service/query_manager.cc | 59 ++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) (limited to '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 e66478a..6d2f84a 100644 --- a/gpu/command_buffer/service/query_manager.cc +++ b/gpu/command_buffer/service/query_manager.cc @@ -223,9 +223,8 @@ bool AsyncPixelTransfersCompletedQuery::End(uint32 submit_count) { // on the current thread. manager()->decoder()->GetAsyncPixelTransferManager()->AsyncNotifyCompletion( mem_params, - base::Bind(AsyncPixelTransfersCompletedQuery::MarkAsCompletedThreadSafe, + base::Bind(&AsyncPixelTransfersCompletedQuery::MarkAsCompletedThreadSafe, submit_count)); - return AddToPendingTransferQueue(submit_count); } @@ -254,6 +253,58 @@ void AsyncPixelTransfersCompletedQuery::Destroy(bool /* have_context */) { AsyncPixelTransfersCompletedQuery::~AsyncPixelTransfersCompletedQuery() { } +class AsyncReadPixelsCompletedQuery + : public QueryManager::Query, + public base::SupportsWeakPtr { + public: + AsyncReadPixelsCompletedQuery( + QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); + + virtual bool Begin() OVERRIDE; + virtual bool End(uint32 submit_count) OVERRIDE; + virtual bool Process() OVERRIDE; + virtual void Destroy(bool have_context) OVERRIDE; + + protected: + void Complete(); + virtual ~AsyncReadPixelsCompletedQuery(); +}; + +AsyncReadPixelsCompletedQuery::AsyncReadPixelsCompletedQuery( + QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) + : Query(manager, target, shm_id, shm_offset) { +} + +bool AsyncReadPixelsCompletedQuery::Begin() { + return true; +} + +bool AsyncReadPixelsCompletedQuery::End(uint32 submit_count) { + manager()->decoder()->WaitForReadPixels( + base::Bind(&AsyncReadPixelsCompletedQuery::Complete, + AsWeakPtr())); + + return AddToPendingTransferQueue(submit_count); +} + +void AsyncReadPixelsCompletedQuery::Complete() { + MarkAsCompleted(1); +} + +bool AsyncReadPixelsCompletedQuery::Process() { + return !pending(); +} + +void AsyncReadPixelsCompletedQuery::Destroy(bool /* have_context */) { + if (!IsDeleted()) { + MarkAsDeleted(); + } +} + +AsyncReadPixelsCompletedQuery::~AsyncReadPixelsCompletedQuery() { +} + + class GetErrorQuery : public QueryManager::Query { public: GetErrorQuery( @@ -345,6 +396,10 @@ QueryManager::Query* QueryManager::CreateQuery( query = new AsyncPixelTransfersCompletedQuery( this, target, shm_id, shm_offset); break; + case GL_ASYNC_READ_PIXELS_COMPLETED_CHROMIUM: + query = new AsyncReadPixelsCompletedQuery( + this, target, shm_id, shm_offset); + break; case GL_GET_ERROR_QUERY_CHROMIUM: query = new GetErrorQuery(this, target, shm_id, shm_offset); break; -- cgit v1.1