Chromium Code Reviews| 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) |
|
brianderson
2014/05/10 00:47:53
Unrelated changes?
danakj
2014/05/10 15:30:55
Yeh.. The linter complained that size of wasn't a
|
| + 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) { |