summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/query_manager.cc
diff options
context:
space:
mode:
authorhubbe@chromium.org <hubbe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-02 06:49:24 +0000
committerhubbe@chromium.org <hubbe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-02 06:49:24 +0000
commit12e55fad62c6f3ede72d40f12f6c442285d75488 (patch)
treea6f2051752a9191aeca308d313bc300f60a0585f /gpu/command_buffer/service/query_manager.cc
parent3192f8cf402ca91e92e4067ec8e972f2e2e4c869 (diff)
downloadchromium_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.cc59
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;