| Index: cc/output/gl_renderer.cc
|
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
|
| index 8e60f944d4f6f23cf033f15f2f7c619473fe99cf..a1c91fbc62966f30840c620ec96bc4fabbc1bd20 100644
|
| --- a/cc/output/gl_renderer.cc
|
| +++ b/cc/output/gl_renderer.cc
|
| @@ -1958,11 +1958,9 @@ void GLRenderer::FlushTextureQuadCache() {
|
| DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(gl_));
|
| GLC(gl_, gl_->BindTexture(GL_TEXTURE_2D, locked_quad.texture_id()));
|
|
|
| - COMPILE_ASSERT(sizeof(Float4) == 4 * sizeof(float), // NOLINT(runtime/sizeof)
|
| + COMPILE_ASSERT(sizeof(Float4) == 4 * sizeof(float), struct_is_densely_packed);
|
| + COMPILE_ASSERT(sizeof(Float16) == 16 * sizeof(float),
|
| struct_is_densely_packed);
|
| - COMPILE_ASSERT(
|
| - sizeof(Float16) == 16 * sizeof(float), // NOLINT(runtime/sizeof)
|
| - struct_is_densely_packed);
|
|
|
| // Upload the tranforms for both points and uvs.
|
| GLC(gl_,
|
| @@ -2339,24 +2337,6 @@ void GLRenderer::EnsureBackbuffer() {
|
| is_backbuffer_discarded_ = false;
|
| }
|
|
|
| -void GLRenderer::GetFramebufferPixels(void* pixels, const gfx::Rect& rect) {
|
| - if (!pixels || rect.IsEmpty())
|
| - return;
|
| -
|
| - // This function assumes that it is reading the root frame buffer.
|
| - DCHECK(!current_framebuffer_lock_);
|
| -
|
| - scoped_ptr<PendingAsyncReadPixels> pending_read(new PendingAsyncReadPixels);
|
| - pending_async_read_pixels_.insert(pending_async_read_pixels_.begin(),
|
| - pending_read.Pass());
|
| -
|
| - // This is a syncronous call since the callback is null.
|
| - gfx::Rect window_rect = MoveFromDrawToWindowSpace(rect);
|
| - DoGetFramebufferPixels(static_cast<uint8*>(pixels),
|
| - window_rect,
|
| - AsyncGetFramebufferPixelsCleanupCallback());
|
| -}
|
| -
|
| void GLRenderer::GetFramebufferPixelsAsync(
|
| const gfx::Rect& rect,
|
| scoped_ptr<CopyOutputRequest> request) {
|
| @@ -2367,6 +2347,10 @@ void GLRenderer::GetFramebufferPixelsAsync(
|
| return;
|
|
|
| gfx::Rect window_rect = MoveFromDrawToWindowSpace(rect);
|
| + DCHECK_GE(window_rect.x(), 0);
|
| + DCHECK_GE(window_rect.y(), 0);
|
| + DCHECK_LE(window_rect.right(), current_surface_size_.width());
|
| + DCHECK_LE(window_rect.bottom(), current_surface_size_.height());
|
|
|
| if (!request->force_bitmap_result()) {
|
| bool own_mailbox = !request->has_texture_mailbox();
|
| @@ -2424,40 +2408,11 @@ void GLRenderer::GetFramebufferPixelsAsync(
|
|
|
| DCHECK(request->force_bitmap_result());
|
|
|
| - scoped_ptr<SkBitmap> bitmap(new SkBitmap);
|
| - bitmap->allocN32Pixels(window_rect.width(), window_rect.height());
|
| -
|
| - scoped_ptr<SkAutoLockPixels> lock(new SkAutoLockPixels(*bitmap));
|
| -
|
| - // Save a pointer to the pixels, the bitmap is owned by the cleanup_callback.
|
| - uint8* pixels = static_cast<uint8*>(bitmap->getPixels());
|
| -
|
| - AsyncGetFramebufferPixelsCleanupCallback cleanup_callback =
|
| - base::Bind(&GLRenderer::PassOnSkBitmap,
|
| - base::Unretained(this),
|
| - base::Passed(&bitmap),
|
| - base::Passed(&lock));
|
| -
|
| scoped_ptr<PendingAsyncReadPixels> pending_read(new PendingAsyncReadPixels);
|
| pending_read->copy_request = request.Pass();
|
| pending_async_read_pixels_.insert(pending_async_read_pixels_.begin(),
|
| pending_read.Pass());
|
|
|
| - // This is an asyncronous call since the callback is not null.
|
| - DoGetFramebufferPixels(pixels, window_rect, cleanup_callback);
|
| -}
|
| -
|
| -void GLRenderer::DoGetFramebufferPixels(
|
| - uint8* dest_pixels,
|
| - const gfx::Rect& window_rect,
|
| - const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback) {
|
| - DCHECK_GE(window_rect.x(), 0);
|
| - DCHECK_GE(window_rect.y(), 0);
|
| - DCHECK_LE(window_rect.right(), current_surface_size_.width());
|
| - DCHECK_LE(window_rect.bottom(), current_surface_size_.height());
|
| -
|
| - bool is_async = !cleanup_callback.is_null();
|
| -
|
| bool do_workaround = NeedsIOSurfaceReadbackWorkaround();
|
|
|
| unsigned temporary_texture = 0;
|
| @@ -2508,10 +2463,8 @@ void GLRenderer::DoGetFramebufferPixels(
|
| GL_STREAM_READ));
|
|
|
| GLuint query = 0;
|
| - if (is_async) {
|
| - gl_->GenQueriesEXT(1, &query);
|
| - GLC(gl_, gl_->BeginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, query));
|
| - }
|
| + gl_->GenQueriesEXT(1, &query);
|
| + GLC(gl_, gl_->BeginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, query));
|
|
|
| GLC(gl_,
|
| gl_->ReadPixels(window_rect.x(),
|
| @@ -2534,10 +2487,8 @@ void GLRenderer::DoGetFramebufferPixels(
|
|
|
| base::Closure finished_callback = base::Bind(&GLRenderer::FinishedReadback,
|
| base::Unretained(this),
|
| - cleanup_callback,
|
| buffer,
|
| query,
|
| - dest_pixels,
|
| window_rect.size());
|
| // Save the finished_callback so it can be cancelled.
|
| pending_async_read_pixels_.front()->finished_read_pixels_callback.Reset(
|
| @@ -2549,23 +2500,15 @@ void GLRenderer::DoGetFramebufferPixels(
|
| // Save the buffer to verify the callbacks happen in the expected order.
|
| pending_async_read_pixels_.front()->buffer = buffer;
|
|
|
| - if (is_async) {
|
| - GLC(gl_, gl_->EndQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM));
|
| - context_support_->SignalQuery(query, cancelable_callback);
|
| - } else {
|
| - resource_provider_->Finish();
|
| - finished_callback.Run();
|
| - }
|
| + GLC(gl_, gl_->EndQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM));
|
| + context_support_->SignalQuery(query, cancelable_callback);
|
|
|
| EnforceMemoryPolicy();
|
| }
|
|
|
| -void GLRenderer::FinishedReadback(
|
| - const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback,
|
| - unsigned source_buffer,
|
| - unsigned query,
|
| - uint8* dest_pixels,
|
| - const gfx::Size& size) {
|
| +void GLRenderer::FinishedReadback(unsigned source_buffer,
|
| + unsigned query,
|
| + const gfx::Size& size) {
|
| DCHECK(!pending_async_read_pixels_.empty());
|
|
|
| if (query != 0) {
|
| @@ -2577,6 +2520,7 @@ void GLRenderer::FinishedReadback(
|
| DCHECK_EQ(source_buffer, current_read->buffer);
|
|
|
| uint8* src_pixels = NULL;
|
| + scoped_ptr<SkBitmap> bitmap;
|
|
|
| if (source_buffer != 0) {
|
| GLC(gl_,
|
| @@ -2585,6 +2529,11 @@ void GLRenderer::FinishedReadback(
|
| GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, GL_READ_ONLY));
|
|
|
| if (src_pixels) {
|
| + bitmap.reset(new SkBitmap);
|
| + bitmap->allocN32Pixels(size.width(), size.height());
|
| + scoped_ptr<SkAutoLockPixels> lock(new SkAutoLockPixels(*bitmap));
|
| + uint8* dest_pixels = static_cast<uint8*>(bitmap->getPixels());
|
| +
|
| size_t row_bytes = size.width() * 4;
|
| int num_rows = size.height();
|
| size_t total_bytes = num_rows * row_bytes;
|
| @@ -2611,25 +2560,11 @@ void GLRenderer::FinishedReadback(
|
| GLC(gl_, gl_->DeleteBuffers(1, &source_buffer));
|
| }
|
|
|
| - // TODO(danakj): This can go away when synchronous readback is no more and its
|
| - // contents can just move here.
|
| - if (!cleanup_callback.is_null())
|
| - cleanup_callback.Run(current_read->copy_request.Pass(), src_pixels != NULL);
|
| -
|
| + if (bitmap)
|
| + current_read->copy_request->SendBitmapResult(bitmap.Pass());
|
| pending_async_read_pixels_.pop_back();
|
| }
|
|
|
| -void GLRenderer::PassOnSkBitmap(scoped_ptr<SkBitmap> bitmap,
|
| - scoped_ptr<SkAutoLockPixels> lock,
|
| - scoped_ptr<CopyOutputRequest> request,
|
| - bool success) {
|
| - DCHECK(request->force_bitmap_result());
|
| -
|
| - lock.reset();
|
| - if (success)
|
| - request->SendBitmapResult(bitmap.Pass());
|
| -}
|
| -
|
| void GLRenderer::GetFramebufferTexture(unsigned texture_id,
|
| ResourceFormat texture_format,
|
| const gfx::Rect& window_rect) {
|
|
|