Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 132 uint32 sync_point) { | 132 uint32 sync_point) { |
| 133 return helper_->ConsumeMailboxToTexture(mailbox, sync_point); | 133 return helper_->ConsumeMailboxToTexture(mailbox, sync_point); |
| 134 } | 134 } |
| 135 | 135 |
| 136 void CropScaleReadbackAndCleanTexture( | 136 void CropScaleReadbackAndCleanTexture( |
| 137 WebGLId src_texture, | 137 WebGLId src_texture, |
| 138 const gfx::Size& src_size, | 138 const gfx::Size& src_size, |
| 139 const gfx::Rect& src_subrect, | 139 const gfx::Rect& src_subrect, |
| 140 const gfx::Size& dst_size, | 140 const gfx::Size& dst_size, |
| 141 unsigned char* out, | 141 unsigned char* out, |
| 142 bool readback_config_rgb565, | |
| 142 const base::Callback<void(bool)>& callback, | 143 const base::Callback<void(bool)>& callback, |
| 143 GLHelper::ScalerQuality quality); | 144 GLHelper::ScalerQuality quality); |
| 144 | 145 |
| 146 WebGLId CopyTo565Texture(const gfx::Size& dst_size); | |
| 147 | |
| 145 void ReadbackTextureSync(WebGLId texture, | 148 void ReadbackTextureSync(WebGLId texture, |
| 146 const gfx::Rect& src_rect, | 149 const gfx::Rect& src_rect, |
| 147 unsigned char* out); | 150 unsigned char* out); |
| 148 | 151 |
| 149 // Reads back bytes from the currently bound frame buffer. | 152 // Reads back bytes from the currently bound frame buffer. |
| 150 // Note that dst_size is specified in bytes, not pixels. | 153 // Note that dst_size is specified in bytes, not pixels. |
| 151 void ReadbackAsync( | 154 void ReadbackAsync( |
| 152 const gfx::Size& dst_size, | 155 const gfx::Size& dst_size, |
| 153 int32 bytes_per_row, // generally dst_size.width() * 4 | 156 int32 bytes_per_row, // generally dst_size.width() * 4 |
| 154 int32 row_stride_bytes, // generally dst_size.width() * 4 | 157 int32 row_stride_bytes, // generally dst_size.width() * 4 |
| 155 unsigned char* out, | 158 unsigned char* out, |
| 159 bool readback_config_rgb565, | |
| 160 int readback_factor, | |
| 156 const base::Callback<void(bool)>& callback); | 161 const base::Callback<void(bool)>& callback); |
| 157 | 162 |
| 158 void ReadbackPlane(TextureFrameBufferPair* source, | 163 void ReadbackPlane(TextureFrameBufferPair* source, |
| 159 const scoped_refptr<media::VideoFrame>& target, | 164 const scoped_refptr<media::VideoFrame>& target, |
| 160 int plane, | 165 int plane, |
| 161 int size_shift, | 166 int size_shift, |
| 162 const gfx::Rect& dst_subrect, | 167 const gfx::Rect& dst_subrect, |
| 163 const base::Callback<void(bool)>& callback); | 168 const base::Callback<void(bool)>& callback); |
| 164 | 169 |
| 165 blink::WebGLId CopyAndScaleTexture(WebGLId texture, | 170 blink::WebGLId CopyAndScaleTexture(WebGLId texture, |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 301 // |src_size| is the size of |src_texture|. | 306 // |src_size| is the size of |src_texture|. |
| 302 WebGLId ScaleTexture(WebGLId src_texture, | 307 WebGLId ScaleTexture(WebGLId src_texture, |
| 303 const gfx::Size& src_size, | 308 const gfx::Size& src_size, |
| 304 const gfx::Rect& src_subrect, | 309 const gfx::Rect& src_subrect, |
| 305 const gfx::Size& dst_size, | 310 const gfx::Size& dst_size, |
| 306 bool vertically_flip_texture, | 311 bool vertically_flip_texture, |
| 307 bool swizzle, | 312 bool swizzle, |
| 308 GLHelper::ScalerQuality quality); | 313 GLHelper::ScalerQuality quality); |
| 309 | 314 |
| 310 static void nullcallback(bool success) {} | 315 static void nullcallback(bool success) {} |
| 311 void ReadbackDone(Request *request); | 316 void ReadbackDone(Request *request,int readback_factor); |
| 312 void FinishRequest(Request* request, bool result); | 317 void FinishRequest(Request* request, bool result); |
| 313 void CancelRequests(); | 318 void CancelRequests(); |
| 314 | 319 |
| 315 static const float kRGBtoYColorWeights[]; | 320 static const float kRGBtoYColorWeights[]; |
| 316 static const float kRGBtoUColorWeights[]; | 321 static const float kRGBtoUColorWeights[]; |
| 317 static const float kRGBtoVColorWeights[]; | 322 static const float kRGBtoVColorWeights[]; |
| 318 | 323 |
| 319 WebGraphicsContext3D* context_; | 324 WebGraphicsContext3D* context_; |
| 320 gpu::ContextSupport* context_support_; | 325 gpu::ContextSupport* context_support_; |
| 321 GLHelper* helper_; | 326 GLHelper* helper_; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 365 ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(context_, dst_texture); | 370 ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(context_, dst_texture); |
| 366 context_->texImage2D(GL_TEXTURE_2D, | 371 context_->texImage2D(GL_TEXTURE_2D, |
| 367 0, | 372 0, |
| 368 GL_RGBA, | 373 GL_RGBA, |
| 369 dst_size.width(), | 374 dst_size.width(), |
| 370 dst_size.height(), | 375 dst_size.height(), |
| 371 0, | 376 0, |
| 372 GL_RGBA, | 377 GL_RGBA, |
| 373 GL_UNSIGNED_BYTE, | 378 GL_UNSIGNED_BYTE, |
| 374 NULL); | 379 NULL); |
| 375 } | 380 } |
| 376 scaler->Scale(src_texture, dst_texture); | 381 scaler->Scale(src_texture, dst_texture); |
| 377 return dst_texture; | 382 return dst_texture; |
| 378 } | 383 } |
| 379 | 384 |
| 380 void GLHelper::CopyTextureToImpl::ReadbackAsync( | 385 void GLHelper::CopyTextureToImpl::ReadbackAsync( |
| 381 const gfx::Size& dst_size, | 386 const gfx::Size& dst_size, |
| 382 int32 bytes_per_row, | 387 int32 bytes_per_row, |
| 383 int32 row_stride_bytes, | 388 int32 row_stride_bytes, |
| 384 unsigned char* out, | 389 unsigned char* out, |
| 390 bool readback_config_rgb565, | |
| 391 int readback_factor, | |
|
hubbe
2013/12/26 21:41:49
readback_factor is redundant and not well named.
J
| |
| 385 const base::Callback<void(bool)>& callback) { | 392 const base::Callback<void(bool)>& callback) { |
| 386 Request* request = new Request(dst_size, | 393 Request* request = new Request(dst_size, |
| 387 bytes_per_row, | 394 bytes_per_row, |
| 388 row_stride_bytes, | 395 row_stride_bytes, |
| 389 out, | 396 out, |
| 390 callback); | 397 callback); |
| 391 request_queue_.push(request); | 398 request_queue_.push(request); |
| 392 request->buffer = context_->createBuffer(); | 399 request->buffer = context_->createBuffer(); |
| 393 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, | 400 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, |
| 394 request->buffer); | 401 request->buffer); |
| 395 context_->bufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, | 402 context_->bufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, |
| 396 4 * dst_size.GetArea(), | 403 readback_factor * dst_size.GetArea(), |
| 397 NULL, | 404 NULL, |
| 398 GL_STREAM_READ); | 405 GL_STREAM_READ); |
| 399 | 406 |
| 400 request->query = context_->createQueryEXT(); | 407 request->query = context_->createQueryEXT(); |
| 401 context_->beginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, | 408 context_->beginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, |
| 402 request->query); | 409 request->query); |
| 403 context_->readPixels(0, 0, dst_size.width(), dst_size.height(), | 410 if(readback_config_rgb565){ |
| 411 context_->readPixels(0, 0, dst_size.width(), dst_size.height(), | |
| 412 GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL); | |
| 413 }else{ | |
| 414 context_->readPixels(0, 0, dst_size.width(), dst_size.height(), | |
| 404 GL_RGBA, GL_UNSIGNED_BYTE, NULL); | 415 GL_RGBA, GL_UNSIGNED_BYTE, NULL); |
| 416 } | |
| 405 context_->endQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM); | 417 context_->endQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM); |
| 406 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); | 418 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 407 context_support_->SignalQuery( | 419 context_support_->SignalQuery( |
| 408 request->query, | 420 request->query, |
| 409 base::Bind(&CopyTextureToImpl::ReadbackDone, AsWeakPtr(), request)); | 421 base::Bind(&CopyTextureToImpl::ReadbackDone, AsWeakPtr(), |
| 422 request, readback_factor)); | |
| 410 } | 423 } |
| 411 | 424 WebGLId GLHelper::CopyTextureToImpl::CopyTo565Texture(const gfx::Size& dst_size) |
| 412 | 425 { |
| 426 //Using copy to texture | |
|
hubbe
2013/12/26 21:41:49
Nit: Space after //
| |
| 427 WebGLId dst_rgb_565_texture = context_->createTexture(); | |
| 428 { | |
| 429 ScopedTextureBinder<GL_TEXTURE_2D> rgb_texture_binder(context_, | |
| 430 dst_rgb_565_texture); | |
| 431 context_->texImage2D(GL_TEXTURE_2D, | |
| 432 0, | |
| 433 GL_RGB, | |
| 434 dst_size.width(), | |
| 435 dst_size.height(), | |
| 436 0, | |
| 437 GL_RGB, | |
| 438 GL_UNSIGNED_SHORT_5_6_5, | |
| 439 NULL); | |
| 440 context_->copyTexSubImage2D(GL_TEXTURE_2D, 0, | |
| 441 0, 0, | |
| 442 0, 0, | |
| 443 dst_size.width(), dst_size.height()); | |
| 444 } | |
| 445 return dst_rgb_565_texture; | |
| 446 } | |
| 413 void GLHelper::CopyTextureToImpl::CropScaleReadbackAndCleanTexture( | 447 void GLHelper::CopyTextureToImpl::CropScaleReadbackAndCleanTexture( |
| 414 WebGLId src_texture, | 448 WebGLId src_texture, |
| 415 const gfx::Size& src_size, | 449 const gfx::Size& src_size, |
| 416 const gfx::Rect& src_subrect, | 450 const gfx::Rect& src_subrect, |
| 417 const gfx::Size& dst_size, | 451 const gfx::Size& dst_size, |
| 418 unsigned char* out, | 452 unsigned char* out, |
| 453 bool readback_config_rgb565, | |
| 419 const base::Callback<void(bool)>& callback, | 454 const base::Callback<void(bool)>& callback, |
| 420 GLHelper::ScalerQuality quality) { | 455 GLHelper::ScalerQuality quality) { |
| 421 WebGLId texture = ScaleTexture(src_texture, | 456 WebGLId texture = ScaleTexture(src_texture, |
| 422 src_size, | 457 src_size, |
| 423 src_subrect, | 458 src_subrect, |
| 424 dst_size, | 459 dst_size, |
| 425 true, | 460 true, |
| 426 #if (SK_R32_SHIFT == 16) && !SK_B32_SHIFT | 461 #if (SK_R32_SHIFT == 16) && !SK_B32_SHIFT |
| 427 true, | 462 true, |
| 428 #else | 463 #else |
| 429 false, | 464 false, |
| 430 #endif | 465 #endif |
| 431 quality); | 466 quality); |
| 432 ScopedFramebuffer dst_framebuffer(context_, context_->createFramebuffer()); | 467 ScopedFramebuffer dst_framebuffer(context_, context_->createFramebuffer()); |
| 433 ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(context_, | 468 ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(context_, |
| 434 dst_framebuffer); | 469 dst_framebuffer); |
| 435 ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(context_, texture); | 470 ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(context_, texture); |
| 436 context_->framebufferTexture2D(GL_FRAMEBUFFER, | 471 context_->framebufferTexture2D(GL_FRAMEBUFFER, |
| 437 GL_COLOR_ATTACHMENT0, | 472 GL_COLOR_ATTACHMENT0, |
| 438 GL_TEXTURE_2D, | 473 GL_TEXTURE_2D, |
| 439 texture, | 474 texture, |
| 440 0); | 475 0); |
| 476 int readback_factor = 0; | |
|
hubbe
2013/12/26 21:41:49
readback_factor -> bytes_per_pixel
| |
| 477 if(readback_config_rgb565){ | |
| 478 readback_factor = 2; | |
| 479 }else{ | |
| 480 readback_factor = 4; | |
| 481 } | |
| 482 WebGLId dst_rgb_565_texture = 0; | |
| 483 if(readback_config_rgb565){ | |
| 484 dst_rgb_565_texture = CopyTo565Texture(dst_size); | |
|
hubbe
2013/12/26 21:41:49
It would (probably) be faster to have the scaler w
| |
| 485 ScopedTextureBinder<GL_TEXTURE_2D> rgb_texture_binder(context_, | |
| 486 dst_rgb_565_texture); | |
| 487 context_->framebufferTexture2D(GL_FRAMEBUFFER, | |
| 488 GL_COLOR_ATTACHMENT0, | |
| 489 GL_TEXTURE_2D, | |
| 490 dst_rgb_565_texture, | |
| 491 0); | |
| 492 //Check format of read after binding with fbo. | |
|
hubbe
2013/12/26 21:41:49
Space after //
| |
| 493 int ext_format, ext_type; | |
| 494 context_->getIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &ext_format); | |
| 495 context_->getIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &ext_type); | |
| 496 if((ext_format != GL_RGB) || (ext_type != GL_UNSIGNED_SHORT_5_6_5)){ | |
|
hubbe
2013/12/26 21:41:49
This is the wrong place to detect this.
This detec
| |
| 497 LOG(ERROR)<<"Readbackformat rgb565 not supported"; | |
|
hubbe
2013/12/26 21:41:49
NIT: space around <<
| |
| 498 context_->deleteTexture(texture); | |
| 499 context_->deleteTexture(dst_rgb_565_texture); | |
| 500 callback.Run(false); | |
| 501 return; | |
| 502 } | |
| 503 } | |
| 441 ReadbackAsync(dst_size, | 504 ReadbackAsync(dst_size, |
| 442 dst_size.width() * 4, | 505 dst_size.width() * readback_factor, |
| 443 dst_size.width() * 4, | 506 dst_size.width() * readback_factor, |
| 444 out, | 507 out, |
| 508 readback_config_rgb565, | |
| 509 readback_factor, | |
| 445 callback); | 510 callback); |
| 446 context_->deleteTexture(texture); | 511 context_->deleteTexture(texture); |
| 512 if(readback_config_rgb565){ | |
| 513 context_->deleteTexture(dst_rgb_565_texture); | |
| 514 } | |
| 447 } | 515 } |
| 448 | 516 |
| 449 void GLHelper::CopyTextureToImpl::ReadbackTextureSync( | 517 void GLHelper::CopyTextureToImpl::ReadbackTextureSync( |
| 450 WebGLId texture, | 518 WebGLId texture, |
| 451 const gfx::Rect& src_rect, | 519 const gfx::Rect& src_rect, |
| 452 unsigned char* out) { | 520 unsigned char* out) { |
| 453 ScopedFramebuffer dst_framebuffer(context_, context_->createFramebuffer()); | 521 ScopedFramebuffer dst_framebuffer(context_, context_->createFramebuffer()); |
| 454 ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(context_, | 522 ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(context_, |
| 455 dst_framebuffer); | 523 dst_framebuffer); |
| 456 ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(context_, texture); | 524 ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(context_, texture); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 476 GLHelper::ScalerQuality quality) { | 544 GLHelper::ScalerQuality quality) { |
| 477 return ScaleTexture(src_texture, | 545 return ScaleTexture(src_texture, |
| 478 src_size, | 546 src_size, |
| 479 gfx::Rect(src_size), | 547 gfx::Rect(src_size), |
| 480 dst_size, | 548 dst_size, |
| 481 vertically_flip_texture, | 549 vertically_flip_texture, |
| 482 false, | 550 false, |
| 483 quality); | 551 quality); |
| 484 } | 552 } |
| 485 | 553 |
| 486 void GLHelper::CopyTextureToImpl::ReadbackDone(Request* finished_request) { | 554 void GLHelper::CopyTextureToImpl::ReadbackDone(Request* finished_request, |
| 555 int read_factor) { | |
| 487 TRACE_EVENT0("mirror", | 556 TRACE_EVENT0("mirror", |
| 488 "GLHelper::CopyTextureToImpl::CheckReadbackFramebufferComplete"); | 557 "GLHelper::CopyTextureToImpl::CheckReadbackFramebufferComplete"); |
| 489 finished_request->done = true; | 558 finished_request->done = true; |
| 490 | 559 |
| 491 // We process transfer requests in the order they were received, regardless | 560 // We process transfer requests in the order they were received, regardless |
| 492 // of the order we get the callbacks in. | 561 // of the order we get the callbacks in. |
| 493 while (!request_queue_.empty()) { | 562 while (!request_queue_.empty()) { |
| 494 Request* request = request_queue_.front(); | 563 Request* request = request_queue_.front(); |
| 495 if (!request->done) { | 564 if (!request->done) { |
| 496 break; | 565 break; |
| 497 } | 566 } |
| 498 | 567 |
| 499 bool result = false; | 568 bool result = false; |
| 500 if (request->buffer != 0) { | 569 if (request->buffer != 0) { |
| 501 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, | 570 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, |
| 502 request->buffer); | 571 request->buffer); |
| 503 unsigned char* data = static_cast<unsigned char *>( | 572 unsigned char* data = static_cast<unsigned char *>( |
| 504 context_->mapBufferCHROMIUM( | 573 context_->mapBufferCHROMIUM( |
| 505 GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, GL_READ_ONLY)); | 574 GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, GL_READ_ONLY)); |
| 506 if (data) { | 575 if (data) { |
| 507 result = true; | 576 result = true; |
| 508 if (request->bytes_per_row == request->size.width() * 4 && | 577 if (request->bytes_per_row == request->size.width() * read_factor && |
| 509 request->bytes_per_row == request->row_stride_bytes) { | 578 request->bytes_per_row == request->row_stride_bytes) { |
| 510 memcpy(request->pixels, data, request->size.GetArea() * 4); | 579 memcpy(request->pixels, data, request->size.GetArea() * read_factor); |
| 511 } else { | 580 } else { |
| 512 unsigned char* out = request->pixels; | 581 unsigned char* out = request->pixels; |
| 513 for (int y = 0; y < request->size.height(); y++) { | 582 for (int y = 0; y < request->size.height(); y++) { |
| 514 memcpy(out, data, request->bytes_per_row); | 583 memcpy(out, data, request->bytes_per_row); |
| 515 out += request->row_stride_bytes; | 584 out += request->row_stride_bytes; |
| 516 data += request->size.width() * 4; | 585 data += request->size.width() * read_factor; |
| 517 } | 586 } |
| 518 } | 587 } |
| 519 context_->unmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM); | 588 context_->unmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM); |
| 520 } | 589 } |
| 521 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); | 590 context_->bindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0); |
| 522 } | 591 } |
| 523 | 592 |
| 524 FinishRequest(request, result); | 593 FinishRequest(request, result); |
| 525 } | 594 } |
| 526 } | 595 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 558 | 627 |
| 559 GLHelper::~GLHelper() { | 628 GLHelper::~GLHelper() { |
| 560 } | 629 } |
| 561 | 630 |
| 562 void GLHelper::CropScaleReadbackAndCleanTexture( | 631 void GLHelper::CropScaleReadbackAndCleanTexture( |
| 563 WebGLId src_texture, | 632 WebGLId src_texture, |
| 564 const gfx::Size& src_size, | 633 const gfx::Size& src_size, |
| 565 const gfx::Rect& src_subrect, | 634 const gfx::Rect& src_subrect, |
| 566 const gfx::Size& dst_size, | 635 const gfx::Size& dst_size, |
| 567 unsigned char* out, | 636 unsigned char* out, |
| 637 bool readback_config_rgb565, | |
| 568 const base::Callback<void(bool)>& callback) { | 638 const base::Callback<void(bool)>& callback) { |
| 569 InitCopyTextToImpl(); | 639 InitCopyTextToImpl(); |
| 570 copy_texture_to_impl_->CropScaleReadbackAndCleanTexture( | 640 copy_texture_to_impl_->CropScaleReadbackAndCleanTexture( |
| 571 src_texture, | 641 src_texture, |
| 572 src_size, | 642 src_size, |
| 573 src_subrect, | 643 src_subrect, |
| 574 dst_size, | 644 dst_size, |
| 575 out, | 645 out, |
| 646 readback_config_rgb565, | |
| 576 callback, | 647 callback, |
| 577 GLHelper::SCALER_QUALITY_FAST); | 648 GLHelper::SCALER_QUALITY_FAST); |
| 578 } | 649 } |
| 579 | 650 |
| 580 void GLHelper::CropScaleReadbackAndCleanMailbox( | 651 void GLHelper::CropScaleReadbackAndCleanMailbox( |
| 581 const gpu::Mailbox& src_mailbox, | 652 const gpu::Mailbox& src_mailbox, |
| 582 uint32 sync_point, | 653 uint32 sync_point, |
| 583 const gfx::Size& src_size, | 654 const gfx::Size& src_size, |
| 584 const gfx::Rect& src_subrect, | 655 const gfx::Rect& src_subrect, |
| 585 const gfx::Size& dst_size, | 656 const gfx::Size& dst_size, |
| 586 unsigned char* out, | 657 unsigned char* out, |
| 658 bool readback_config_rgb565, | |
| 587 const base::Callback<void(bool)>& callback) { | 659 const base::Callback<void(bool)>& callback) { |
| 588 WebGLId mailbox_texture = ConsumeMailboxToTexture(src_mailbox, sync_point); | 660 WebGLId mailbox_texture = ConsumeMailboxToTexture(src_mailbox, sync_point); |
| 589 CropScaleReadbackAndCleanTexture( | 661 CropScaleReadbackAndCleanTexture( |
| 590 mailbox_texture, src_size, src_subrect, dst_size, out, callback); | 662 mailbox_texture, src_size, src_subrect, dst_size, out, |
| 663 readback_config_rgb565, | |
| 664 callback); | |
| 591 context_->deleteTexture(mailbox_texture); | 665 context_->deleteTexture(mailbox_texture); |
| 592 } | 666 } |
| 593 | 667 |
| 594 void GLHelper::ReadbackTextureSync(blink::WebGLId texture, | 668 void GLHelper::ReadbackTextureSync(blink::WebGLId texture, |
| 595 const gfx::Rect& src_rect, | 669 const gfx::Rect& src_rect, |
| 596 unsigned char* out) { | 670 unsigned char* out) { |
| 597 InitCopyTextToImpl(); | 671 InitCopyTextToImpl(); |
| 598 copy_texture_to_impl_->ReadbackTextureSync(texture, | 672 copy_texture_to_impl_->ReadbackTextureSync(texture, |
| 599 src_rect, | 673 src_rect, |
| 600 out); | 674 out); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 766 const gfx::Rect& dst_subrect, | 840 const gfx::Rect& dst_subrect, |
| 767 const base::Callback<void(bool)>& callback) { | 841 const base::Callback<void(bool)>& callback) { |
| 768 context_->bindFramebuffer(GL_FRAMEBUFFER, source->framebuffer()); | 842 context_->bindFramebuffer(GL_FRAMEBUFFER, source->framebuffer()); |
| 769 size_t offset = target->stride(plane) * (dst_subrect.y() >> size_shift) + | 843 size_t offset = target->stride(plane) * (dst_subrect.y() >> size_shift) + |
| 770 (dst_subrect.x() >> size_shift); | 844 (dst_subrect.x() >> size_shift); |
| 771 ReadbackAsync( | 845 ReadbackAsync( |
| 772 source->size(), | 846 source->size(), |
| 773 dst_subrect.width() >> size_shift, | 847 dst_subrect.width() >> size_shift, |
| 774 target->stride(plane), | 848 target->stride(plane), |
| 775 target->data(plane) + offset, | 849 target->data(plane) + offset, |
| 850 false, | |
| 851 4, | |
| 776 callback); | 852 callback); |
| 777 } | 853 } |
| 778 | 854 |
| 779 const float GLHelper::CopyTextureToImpl::kRGBtoYColorWeights[] = { | 855 const float GLHelper::CopyTextureToImpl::kRGBtoYColorWeights[] = { |
| 780 0.257f, 0.504f, 0.098f, 0.0625f | 856 0.257f, 0.504f, 0.098f, 0.0625f |
| 781 }; | 857 }; |
| 782 const float GLHelper::CopyTextureToImpl::kRGBtoUColorWeights[] = { | 858 const float GLHelper::CopyTextureToImpl::kRGBtoUColorWeights[] = { |
| 783 -0.148f, -0.291f, 0.439f, 0.5f | 859 -0.148f, -0.291f, 0.439f, 0.5f |
| 784 }; | 860 }; |
| 785 const float GLHelper::CopyTextureToImpl::kRGBtoVColorWeights[] = { | 861 const float GLHelper::CopyTextureToImpl::kRGBtoVColorWeights[] = { |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1084 quality, | 1160 quality, |
| 1085 src_size, | 1161 src_size, |
| 1086 src_subrect, | 1162 src_subrect, |
| 1087 dst_size, | 1163 dst_size, |
| 1088 dst_subrect, | 1164 dst_subrect, |
| 1089 flip_vertically, | 1165 flip_vertically, |
| 1090 use_mrt); | 1166 use_mrt); |
| 1091 } | 1167 } |
| 1092 | 1168 |
| 1093 } // namespace content | 1169 } // namespace content |
| OLD | NEW |