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

Side by Side Diff: content/common/gpu/client/gl_helper.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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/common/gpu/client/gl_helper.h" 5 #include "content/common/gpu/client/gl_helper.h"
6 6
7 #include <queue> 7 #include <queue>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 Request(const gfx::Size& size_, 186 Request(const gfx::Size& size_,
187 int32 bytes_per_row_, 187 int32 bytes_per_row_,
188 int32 row_stride_bytes_, 188 int32 row_stride_bytes_,
189 unsigned char* pixels_, 189 unsigned char* pixels_,
190 const base::Callback<void(bool)>& callback_) 190 const base::Callback<void(bool)>& callback_)
191 : size(size_), 191 : size(size_),
192 bytes_per_row(bytes_per_row_), 192 bytes_per_row(bytes_per_row_),
193 row_stride_bytes(row_stride_bytes_), 193 row_stride_bytes(row_stride_bytes_),
194 pixels(pixels_), 194 pixels(pixels_),
195 callback(callback_), 195 callback(callback_),
196 buffer(0) { 196 buffer(0),
197 query(0) {
197 } 198 }
198 199
199 gfx::Size size; 200 gfx::Size size;
200 int bytes_per_row; 201 int bytes_per_row;
201 int row_stride_bytes; 202 int row_stride_bytes;
202 unsigned char* pixels; 203 unsigned char* pixels;
203 base::Callback<void(bool)> callback; 204 base::Callback<void(bool)> callback;
204 GLuint buffer; 205 GLuint buffer;
206 WebKit::WebGLId query;
205 }; 207 };
206 208
207 // A readback pipeline that also converts the data to YUV before 209 // A readback pipeline that also converts the data to YUV before
208 // reading it back. 210 // reading it back.
209 class ReadbackYUVImpl : public ReadbackYUVInterface { 211 class ReadbackYUVImpl : public ReadbackYUVInterface {
210 public: 212 public:
211 ReadbackYUVImpl(WebGraphicsContext3D* context, 213 ReadbackYUVImpl(WebGraphicsContext3D* context,
212 CopyTextureToImpl* copy_impl, 214 CopyTextureToImpl* copy_impl,
213 GLHelperScaling* scaler_impl, 215 GLHelperScaling* scaler_impl,
214 GLHelper::ScalerQuality quality, 216 GLHelper::ScalerQuality quality,
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 request->buffer = context_->createBuffer(); 377 request->buffer = context_->createBuffer();
376 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 378 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
377 request->buffer); 379 request->buffer);
378 context_->bufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 380 context_->bufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
379 4 * dst_size.GetArea(), 381 4 * dst_size.GetArea(),
380 NULL, 382 NULL,
381 GL_STREAM_READ); 383 GL_STREAM_READ);
382 384
383 context_->readPixels(0, 0, dst_size.width(), dst_size.height(), 385 context_->readPixels(0, 0, dst_size.width(), dst_size.height(),
384 GL_RGBA, GL_UNSIGNED_BYTE, NULL); 386 GL_RGBA, GL_UNSIGNED_BYTE, NULL);
387 request->query = context_->createQueryEXT();
388 context_->beginQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM,
389 request->query);
385 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); 390 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
386 cc::SyncPointHelper::SignalSyncPoint( 391 cc::SyncPointHelper::SignalQuery(
387 context_, 392 context_,
388 context_->insertSyncPoint(), 393 request->query,
389 base::Bind(&CopyTextureToImpl::ReadbackDone, AsWeakPtr(), request)); 394 base::Bind(&CopyTextureToImpl::ReadbackDone, AsWeakPtr(), request));
piman 2013/06/17 19:55:06 It is weird that you call signalQuery between begi
hubbe 2013/06/25 20:02:51 Done.
395 context_->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM);
390 } 396 }
391 397
392 398
393 void GLHelper::CopyTextureToImpl::CropScaleReadbackAndCleanTexture( 399 void GLHelper::CopyTextureToImpl::CropScaleReadbackAndCleanTexture(
394 WebGLId src_texture, 400 WebGLId src_texture,
395 const gfx::Size& src_size, 401 const gfx::Size& src_size,
396 const gfx::Rect& src_subrect, 402 const gfx::Rect& src_subrect,
397 const gfx::Size& dst_size, 403 const gfx::Size& dst_size,
398 unsigned char* out, 404 unsigned char* out,
399 const base::Callback<void(bool)>& callback, 405 const base::Callback<void(bool)>& callback,
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 context_->unmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM); 497 context_->unmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM);
492 } 498 }
493 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); 499 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
494 } 500 }
495 501
496 FinishRequest(request, result); 502 FinishRequest(request, result);
497 } 503 }
498 504
499 void GLHelper::CopyTextureToImpl::FinishRequest(Request* request, 505 void GLHelper::CopyTextureToImpl::FinishRequest(Request* request,
500 bool result) { 506 bool result) {
507 TRACE_EVENT0("mirror", "GLHelper::CopyTextureToImpl::FinishRequest");
501 DCHECK(request_queue_.front() == request); 508 DCHECK(request_queue_.front() == request);
502 request_queue_.pop(); 509 request_queue_.pop();
503 request->callback.Run(result); 510 request->callback.Run(result);
504 ScopedFlush flush(context_); 511 ScopedFlush flush(context_);
512 if (request->query != 0) {
513 context_->deleteQueryEXT(request->query);
514 request->query = 0;
515 }
505 if (request->buffer != 0) { 516 if (request->buffer != 0) {
506 context_->deleteBuffer(request->buffer); 517 context_->deleteBuffer(request->buffer);
507 request->buffer = 0; 518 request->buffer = 0;
508 } 519 }
509 delete request; 520 delete request;
510 } 521 }
511 522
512 void GLHelper::CopyTextureToImpl::CancelRequests() { 523 void GLHelper::CopyTextureToImpl::CancelRequests() {
513 while (!request_queue_.empty()) { 524 while (!request_queue_.empty()) {
514 Request* request = request_queue_.front(); 525 Request* request = request_queue_.front();
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
960 quality, 971 quality,
961 src_size, 972 src_size,
962 src_subrect, 973 src_subrect,
963 dst_size, 974 dst_size,
964 dst_subrect, 975 dst_subrect,
965 flip_vertically, 976 flip_vertically,
966 use_mrt); 977 use_mrt);
967 } 978 }
968 979
969 } // namespace content 980 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698