Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Unified Diff: cc/output/gl_renderer.cc

Issue 16831004: Perform glReadPixels with PBOs in the gpu, if PBOs are available. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed (some) comments, added new query type Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/output/gl_renderer.cc
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index d9729d33ce41e7e517e27e9928a9f1d8577789dd..80d2ea63b432c05743a39b9370c3142ac2a3737d 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -296,7 +296,8 @@ void GLRenderer::ClearFramebuffer(DrawingFrame* frame) {
}
void GLRenderer::BeginDrawingFrame(DrawingFrame* frame) {
- // FIXME: Remove this once backbuffer is automatically recreated on first use
+ // TODO(hubbe): Remove this once backbuffer is automatically recreated
+ // on first use.
EnsureBackbuffer();
if (client_->DeviceViewport().IsEmpty())
@@ -586,22 +587,22 @@ scoped_ptr<ScopedResource> GLRenderer::DrawBackgroundFilters(
//
// Pixel copies in this algorithm occur at steps 2, 3, 4, and 5.
- // FIXME: When this algorithm changes, update
+ // TODO(hubbe): When this algorithm changes, update
// LayerTreeHost::PrioritizeTextures() accordingly.
FilterOperations filters =
RenderSurfaceFilters::Optimize(quad->background_filters);
DCHECK(!filters.IsEmpty());
- // FIXME: We only allow background filters on an opaque render surface because
- // other surfaces may contain translucent pixels, and the contents behind
- // those translucent pixels wouldn't have the filter applied.
+ // TODO(hubbe): We only allow background filters on an opaque render surface
+ // because other surfaces may contain translucent pixels, and the contents
+ // behind those translucent pixels wouldn't have the filter applied.
if (frame->current_render_pass->has_transparent_background)
return scoped_ptr<ScopedResource>();
DCHECK(!frame->current_texture);
- // FIXME: Do a single readback for both the surface and replica and cache the
- // filtered results (once filter textures are not reused).
+ // TODO(hubbe): Do a single readback for both the surface and replica and
+ // cache the filtered results (once filter textures are not reused).
gfx::Rect window_rect = gfx::ToEnclosingRect(MathUtil::MapClippedRect(
contents_device_transform, SharedGeometryQuad().BoundingBox()));
@@ -722,8 +723,8 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame,
SetBlendEnabled(true);
}
- // FIXME: Cache this value so that we don't have to do it for both the surface
- // and its replica. Apply filters to the contents texture.
+ // TODO(hubbe): Cache this value so that we don't have to do it for both the
+ // surface and its replica. Apply filters to the contents texture.
SkBitmap filter_bitmap;
SkScalar color_matrix[20];
bool use_color_matrix = false;
@@ -794,8 +795,9 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame,
mask_texture_id = mask_resource_lock->texture_id();
}
- // FIXME: use the background_texture and blend the background in with this
- // draw instead of having a separate copy of the background texture.
+ // TODO(hubbe): use the background_texture and blend the background
+ // in with this draw instead of having a separate copy of the background
+ // texture.
scoped_ptr<ResourceProvider::ScopedReadLockGL> contents_resource_lock;
if (filter_bitmap.getTexture()) {
@@ -2310,6 +2312,14 @@ void GLRenderer::DoGetFramebufferPixels(
NULL,
GL_STREAM_READ));
+ WebKit::WebGLId query = 0;
+ if (is_async) {
+ query = context_->createQueryEXT();
+ GLC(context_, context_->beginQueryEXT(
+ GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM,
+ query));
+ }
+
GLC(context_,
context_->readPixels(window_rect.x(),
window_rect.y(),
@@ -2335,6 +2345,7 @@ void GLRenderer::DoGetFramebufferPixels(
base::Unretained(this),
cleanup_callback,
buffer,
+ query,
dest_pixels,
window_rect.size());
// Save the finished_callback so it can be cancelled.
@@ -2345,10 +2356,11 @@ void GLRenderer::DoGetFramebufferPixels(
pending_async_read_pixels_.front()->buffer = buffer;
if (is_async) {
- unsigned sync_point = context_->insertSyncPoint();
- SyncPointHelper::SignalSyncPoint(
+ GLC(context_, context_->endQueryEXT(
+ GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM));
+ SyncPointHelper::SignalQuery(
context_,
- sync_point,
+ query,
finished_callback);
} else {
resource_provider_->Finish();
@@ -2361,10 +2373,15 @@ void GLRenderer::DoGetFramebufferPixels(
void GLRenderer::FinishedReadback(
const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback,
unsigned source_buffer,
+ unsigned query,
uint8* dest_pixels,
gfx::Size size) {
DCHECK(!pending_async_read_pixels_.empty());
+ if (query != 0) {
+ GLC(context_, context_->deleteQueryEXT(query));
+ }
+
PendingAsyncReadPixels* current_read = pending_async_read_pixels_.back();
// Make sure we service the readbacks in order.
DCHECK_EQ(source_buffer, current_read->buffer);

Powered by Google App Engine
This is Rietveld 408576698