diff options
author | hubbe@chromium.org <hubbe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-02 06:49:24 +0000 |
---|---|---|
committer | hubbe@chromium.org <hubbe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-02 06:49:24 +0000 |
commit | 12e55fad62c6f3ede72d40f12f6c442285d75488 (patch) | |
tree | a6f2051752a9191aeca308d313bc300f60a0585f /gpu/command_buffer/service/query_manager.cc | |
parent | 3192f8cf402ca91e92e4067ec8e972f2e2e4c869 (diff) | |
download | chromium_src-12e55fad62c6f3ede72d40f12f6c442285d75488.zip chromium_src-12e55fad62c6f3ede72d40f12f6c442285d75488.tar.gz chromium_src-12e55fad62c6f3ede72d40f12f6c442285d75488.tar.bz2 |
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
Diffstat (limited to 'gpu/command_buffer/service/query_manager.cc')
-rw-r--r-- | gpu/command_buffer/service/query_manager.cc | 59 |
1 files changed, 57 insertions, 2 deletions
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<AsyncReadPixelsCompletedQuery> { + 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; |