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

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: use webglid where approperiate 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 unified diff | Download patch | Annotate | Revision Log
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 2225 matching lines...) Expand 10 before | Expand all | Expand 10 after
2236 } 2236 }
2237 2237
2238 unsigned buffer = context_->createBuffer(); 2238 unsigned buffer = context_->createBuffer();
2239 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 2239 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
2240 buffer)); 2240 buffer));
2241 GLC(context_, context_->bufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 2241 GLC(context_, context_->bufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
2242 4 * rect.size().GetArea(), 2242 4 * rect.size().GetArea(),
2243 NULL, 2243 NULL,
2244 GL_STREAM_READ)); 2244 GL_STREAM_READ));
2245 2245
2246 WebKit::WebGLId query = 0;
2247 if (is_async) {
2248 query = context_->createQueryEXT();
2249 GLC(context_, context_->beginQueryEXT(
2250 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM,
2251 query));
2252 }
2253
2254
danakj 2013/06/17 18:36:48 nit: a single line of whitespace is sufficient.
hubbe 2013/06/17 19:47:19 Done.
2246 GLC(context_, 2255 GLC(context_,
2247 context_->readPixels(window_rect.x(), 2256 context_->readPixels(window_rect.x(),
2248 window_rect.y(), 2257 window_rect.y(),
2249 window_rect.width(), 2258 window_rect.width(),
2250 window_rect.height(), 2259 window_rect.height(),
2251 GL_RGBA, 2260 GL_RGBA,
2252 GL_UNSIGNED_BYTE, 2261 GL_UNSIGNED_BYTE,
2253 NULL)); 2262 NULL));
2254 2263
2255 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 2264 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
2256 0)); 2265 0));
2257 2266
2258 if (do_workaround) { 2267 if (do_workaround) {
2259 // Clean up. 2268 // Clean up.
2260 GLC(context_, context_->bindFramebuffer(GL_FRAMEBUFFER, 0)); 2269 GLC(context_, context_->bindFramebuffer(GL_FRAMEBUFFER, 0));
2261 GLC(context_, context_->bindTexture(GL_TEXTURE_2D, 0)); 2270 GLC(context_, context_->bindTexture(GL_TEXTURE_2D, 0));
2262 GLC(context_, context_->deleteFramebuffer(temporary_fbo)); 2271 GLC(context_, context_->deleteFramebuffer(temporary_fbo));
2263 GLC(context_, context_->deleteTexture(temporary_texture)); 2272 GLC(context_, context_->deleteTexture(temporary_texture));
2264 } 2273 }
2265 2274
2266 base::Closure finished_callback = 2275 base::Closure finished_callback =
2267 base::Bind(&GLRenderer::FinishedReadback, 2276 base::Bind(&GLRenderer::FinishedReadback,
2268 base::Unretained(this), 2277 base::Unretained(this),
2269 cleanup_callback, 2278 cleanup_callback,
2270 buffer, 2279 buffer,
2280 query,
2271 dest_pixels, 2281 dest_pixels,
2272 rect.size()); 2282 rect.size());
2273 // Save the finished_callback so it can be cancelled. 2283 // Save the finished_callback so it can be cancelled.
2274 pending_async_read_pixels_.front()->finished_read_pixels_callback.Reset( 2284 pending_async_read_pixels_.front()->finished_read_pixels_callback.Reset(
2275 finished_callback); 2285 finished_callback);
2276 2286
2277 // Save the buffer to verify the callbacks happen in the expected order. 2287 // Save the buffer to verify the callbacks happen in the expected order.
2278 pending_async_read_pixels_.front()->buffer = buffer; 2288 pending_async_read_pixels_.front()->buffer = buffer;
2279 2289
2280 if (is_async) { 2290 if (is_async) {
2281 unsigned sync_point = context_->insertSyncPoint(); 2291 SyncPointHelper::SignalQuery(
2282 SyncPointHelper::SignalSyncPoint(
2283 context_, 2292 context_,
2284 sync_point, 2293 query,
2285 finished_callback); 2294 finished_callback);
2295 GLC(context_, context_->endQueryEXT(
2296 GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM));
2286 } else { 2297 } else {
2287 resource_provider_->Finish(); 2298 resource_provider_->Finish();
2288 finished_callback.Run(); 2299 finished_callback.Run();
2289 } 2300 }
2290 2301
2291 EnforceMemoryPolicy(); 2302 EnforceMemoryPolicy();
2292 } 2303 }
2293 2304
2294 void GLRenderer::FinishedReadback( 2305 void GLRenderer::FinishedReadback(
2295 const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback, 2306 const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback,
2296 unsigned source_buffer, 2307 unsigned source_buffer,
2308 unsigned query,
2297 uint8* dest_pixels, 2309 uint8* dest_pixels,
2298 gfx::Size size) { 2310 gfx::Size size) {
2299 DCHECK(!pending_async_read_pixels_.empty()); 2311 DCHECK(!pending_async_read_pixels_.empty());
2300 2312
2313 if (query != 0) {
2314 GLC(context_, context_->deleteQueryEXT(query));
2315 }
2316
2301 PendingAsyncReadPixels* current_read = pending_async_read_pixels_.back(); 2317 PendingAsyncReadPixels* current_read = pending_async_read_pixels_.back();
2302 // Make sure we service the readbacks in order. 2318 // Make sure we service the readbacks in order.
2303 DCHECK_EQ(source_buffer, current_read->buffer); 2319 DCHECK_EQ(source_buffer, current_read->buffer);
2304 2320
2305 uint8* src_pixels = NULL; 2321 uint8* src_pixels = NULL;
2306 2322
2307 if (source_buffer != 0) { 2323 if (source_buffer != 0) {
2308 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 2324 GLC(context_, context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
2309 source_buffer)); 2325 source_buffer));
2310 src_pixels = static_cast<uint8*>( 2326 src_pixels = static_cast<uint8*>(
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after
2972 // The Skia GPU backend requires a stencil buffer. See ReinitializeGrCanvas 2988 // The Skia GPU backend requires a stencil buffer. See ReinitializeGrCanvas
2973 // implementation. 2989 // implementation.
2974 return gr_context_ && context_->getContextAttributes().stencil; 2990 return gr_context_ && context_->getContextAttributes().stencil;
2975 } 2991 }
2976 2992
2977 bool GLRenderer::IsContextLost() { 2993 bool GLRenderer::IsContextLost() {
2978 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); 2994 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR);
2979 } 2995 }
2980 2996
2981 } // namespace cc 2997 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698