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

Side by Side 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: fix cc_unittests Created 7 years, 5 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/output/gl_renderer.h ('k') | cc/test/test_web_graphics_context_3d.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 The Chromium Authors. All rights reserved. 1 // Copyright 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/output/gl_renderer.h" 5 #include "cc/output/gl_renderer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 2283 matching lines...) Expand 10 before | Expand all | Expand 10 after
2294 } 2294 }
2295 2295
2296 unsigned buffer = context_->createBuffer(); 2296 unsigned buffer = context_->createBuffer();
2297 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 2297 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
2298 buffer)); 2298 buffer));
2299 GLC(context_, context_->bufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 2299 GLC(context_, context_->bufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
2300 4 * window_rect.size().GetArea(), 2300 4 * window_rect.size().GetArea(),
2301 NULL, 2301 NULL,
2302 GL_STREAM_READ)); 2302 GL_STREAM_READ));
2303 2303
2304 WebKit::WebGLId query = 0;
2305 if (is_async) {
2306 query = context_->createQueryEXT();
2307 GLC(context_, context_->beginQueryEXT(
2308 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM,
2309 query));
2310 }
2311
2304 GLC(context_, 2312 GLC(context_,
2305 context_->readPixels(window_rect.x(), 2313 context_->readPixels(window_rect.x(),
2306 window_rect.y(), 2314 window_rect.y(),
2307 window_rect.width(), 2315 window_rect.width(),
2308 window_rect.height(), 2316 window_rect.height(),
2309 GL_RGBA, 2317 GL_RGBA,
2310 GL_UNSIGNED_BYTE, 2318 GL_UNSIGNED_BYTE,
2311 NULL)); 2319 NULL));
2312 2320
2313 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 2321 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
2314 0)); 2322 0));
2315 2323
2316 if (do_workaround) { 2324 if (do_workaround) {
2317 // Clean up. 2325 // Clean up.
2318 GLC(context_, context_->bindFramebuffer(GL_FRAMEBUFFER, 0)); 2326 GLC(context_, context_->bindFramebuffer(GL_FRAMEBUFFER, 0));
2319 GLC(context_, context_->bindTexture(GL_TEXTURE_2D, 0)); 2327 GLC(context_, context_->bindTexture(GL_TEXTURE_2D, 0));
2320 GLC(context_, context_->deleteFramebuffer(temporary_fbo)); 2328 GLC(context_, context_->deleteFramebuffer(temporary_fbo));
2321 GLC(context_, context_->deleteTexture(temporary_texture)); 2329 GLC(context_, context_->deleteTexture(temporary_texture));
2322 } 2330 }
2323 2331
2324 base::Closure finished_callback = 2332 base::Closure finished_callback =
2325 base::Bind(&GLRenderer::FinishedReadback, 2333 base::Bind(&GLRenderer::FinishedReadback,
2326 base::Unretained(this), 2334 base::Unretained(this),
2327 cleanup_callback, 2335 cleanup_callback,
2328 buffer, 2336 buffer,
2337 query,
2329 dest_pixels, 2338 dest_pixels,
2330 window_rect.size()); 2339 window_rect.size());
2331 // Save the finished_callback so it can be cancelled. 2340 // Save the finished_callback so it can be cancelled.
2332 pending_async_read_pixels_.front()->finished_read_pixels_callback.Reset( 2341 pending_async_read_pixels_.front()->finished_read_pixels_callback.Reset(
2333 finished_callback); 2342 finished_callback);
2334 2343
2335 // Save the buffer to verify the callbacks happen in the expected order. 2344 // Save the buffer to verify the callbacks happen in the expected order.
2336 pending_async_read_pixels_.front()->buffer = buffer; 2345 pending_async_read_pixels_.front()->buffer = buffer;
2337 2346
2338 if (is_async) { 2347 if (is_async) {
2339 unsigned sync_point = context_->insertSyncPoint(); 2348 GLC(context_, context_->endQueryEXT(
2340 SyncPointHelper::SignalSyncPoint( 2349 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM));
2350 SyncPointHelper::SignalQuery(
2341 context_, 2351 context_,
2342 sync_point, 2352 query,
2343 finished_callback); 2353 finished_callback);
2344 } else { 2354 } else {
2345 resource_provider_->Finish(); 2355 resource_provider_->Finish();
2346 finished_callback.Run(); 2356 finished_callback.Run();
2347 } 2357 }
2348 2358
2349 EnforceMemoryPolicy(); 2359 EnforceMemoryPolicy();
2350 } 2360 }
2351 2361
2352 void GLRenderer::FinishedReadback( 2362 void GLRenderer::FinishedReadback(
2353 const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback, 2363 const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback,
2354 unsigned source_buffer, 2364 unsigned source_buffer,
2365 unsigned query,
2355 uint8* dest_pixels, 2366 uint8* dest_pixels,
2356 gfx::Size size) { 2367 gfx::Size size) {
2357 DCHECK(!pending_async_read_pixels_.empty()); 2368 DCHECK(!pending_async_read_pixels_.empty());
2358 2369
2370 if (query != 0) {
2371 GLC(context_, context_->deleteQueryEXT(query));
2372 }
2373
2359 PendingAsyncReadPixels* current_read = pending_async_read_pixels_.back(); 2374 PendingAsyncReadPixels* current_read = pending_async_read_pixels_.back();
2360 // Make sure we service the readbacks in order. 2375 // Make sure we service the readbacks in order.
2361 DCHECK_EQ(source_buffer, current_read->buffer); 2376 DCHECK_EQ(source_buffer, current_read->buffer);
2362 2377
2363 uint8* src_pixels = NULL; 2378 uint8* src_pixels = NULL;
2364 2379
2365 if (source_buffer != 0) { 2380 if (source_buffer != 0) {
2366 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 2381 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
2367 source_buffer)); 2382 source_buffer));
2368 src_pixels = static_cast<uint8*>( 2383 src_pixels = static_cast<uint8*>(
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after
3046 std::string unique_context_name = base::StringPrintf( 3061 std::string unique_context_name = base::StringPrintf(
3047 "%s-Offscreen-%p", 3062 "%s-Offscreen-%p",
3048 Settings().compositor_name.c_str(), 3063 Settings().compositor_name.c_str(),
3049 context_); 3064 context_);
3050 resource_provider()->offscreen_context_provider()->Context3d()-> 3065 resource_provider()->offscreen_context_provider()->Context3d()->
3051 pushGroupMarkerEXT(unique_context_name.c_str()); 3066 pushGroupMarkerEXT(unique_context_name.c_str());
3052 } 3067 }
3053 3068
3054 3069
3055 } // namespace cc 3070 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/gl_renderer.h ('k') | cc/test/test_web_graphics_context_3d.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698