| Index: content/common/gpu/client/gl_helper.cc
|
| diff --git a/content/common/gpu/client/gl_helper.cc b/content/common/gpu/client/gl_helper.cc
|
| index 5a36836a54d892d2a9f6c3b242f588f7a5c452cd..8fe6b737a0f101fb90664b520a5ac3281d603fe8 100644
|
| --- a/content/common/gpu/client/gl_helper.cc
|
| +++ b/content/common/gpu/client/gl_helper.cc
|
| @@ -15,6 +15,7 @@
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/strings/string_util.h"
|
| #include "base/time/time.h"
|
| +#include "content/common/gpu/client/gl_helper_readback_support.h"
|
| #include "content/common/gpu/client/gl_helper_scaling.h"
|
| #include "gpu/GLES2/gl2extchromium.h"
|
| #include "gpu/command_buffer/client/context_support.h"
|
| @@ -178,6 +179,8 @@ class GLHelper::CopyTextureToImpl
|
| // 0 if GL_EXT_draw_buffers is not available.
|
| GLint MaxDrawBuffers() const { return max_draw_buffers_; }
|
|
|
| + bool IsReadbackConfigSupported(SkBitmap::Config bitmap_config);
|
| +
|
| private:
|
| // A single request to CropScaleReadbackAndCleanTexture.
|
| // The main thread can cancel the request, before it's handled by the helper
|
| @@ -341,15 +344,11 @@ GLuint GLHelper::CopyTextureToImpl::ScaleTexture(
|
| const gfx::Size& dst_size,
|
| bool vertically_flip_texture,
|
| bool swizzle,
|
| - SkBitmap::Config config,
|
| + SkBitmap::Config bitmap_config,
|
| GLHelper::ScalerQuality quality) {
|
| -
|
| - bool format_support = ((config == SkBitmap::kRGB_565_Config) ||
|
| - (config == SkBitmap::kARGB_8888_Config));
|
| - if (!format_support) {
|
| - DCHECK(format_support);
|
| + if (!IsReadbackConfigSupported(bitmap_config))
|
| return 0;
|
| - }
|
| +
|
| scoped_ptr<ScalerInterface> scaler(
|
| helper_->CreateScaler(quality,
|
| src_size,
|
| @@ -364,7 +363,7 @@ GLuint GLHelper::CopyTextureToImpl::ScaleTexture(
|
| gl_->GenTextures(1, &dst_texture);
|
| {
|
| ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, dst_texture);
|
| - switch (config) {
|
| + switch (bitmap_config) {
|
| case SkBitmap::kARGB_8888_Config:
|
| // Do nothing params already set.
|
| break;
|
| @@ -395,12 +394,9 @@ void GLHelper::CopyTextureToImpl::ReadbackAsync(
|
| int32 bytes_per_row,
|
| int32 row_stride_bytes,
|
| unsigned char* out,
|
| - const SkBitmap::Config config,
|
| + const SkBitmap::Config bitmap_config,
|
| const base::Callback<void(bool)>& callback) {
|
| - bool format_support = ((config == SkBitmap::kRGB_565_Config) ||
|
| - (config == SkBitmap::kARGB_8888_Config));
|
| - if (!format_support) {
|
| - DCHECK(format_support);
|
| + if (!IsReadbackConfigSupported(bitmap_config)) {
|
| callback.Run(false);
|
| return;
|
| }
|
| @@ -413,7 +409,7 @@ void GLHelper::CopyTextureToImpl::ReadbackAsync(
|
| GLenum format = GL_RGBA, type = GL_UNSIGNED_BYTE;
|
| int bytes_per_pixel = 4;
|
|
|
| - switch (config) {
|
| + switch (bitmap_config) {
|
| case SkBitmap::kARGB_8888_Config:
|
| // Do nothing params already set.
|
| break;
|
| @@ -459,10 +455,7 @@ void GLHelper::CopyTextureToImpl::CropScaleReadbackAndCleanTexture(
|
| const SkBitmap::Config bitmap_config,
|
| const base::Callback<void(bool)>& callback,
|
| GLHelper::ScalerQuality quality) {
|
| - bool format_support = ((bitmap_config == SkBitmap::kRGB_565_Config) ||
|
| - (bitmap_config == SkBitmap::kARGB_8888_Config));
|
| - if (!format_support) {
|
| - DCHECK(format_support);
|
| + if (!IsReadbackConfigSupported(bitmap_config)) {
|
| callback.Run(false);
|
| return;
|
| }
|
| @@ -509,24 +502,25 @@ void GLHelper::CopyTextureToImpl::CropScaleReadbackAndCleanTexture(
|
| gl_->DeleteTextures(1, &texture);
|
| }
|
|
|
| -void GLHelper::CopyTextureToImpl::ReadbackTextureSync(GLuint texture,
|
| - const gfx::Rect& src_rect,
|
| - unsigned char* out,
|
| - SkBitmap::Config config) {
|
| - DCHECK((config == SkBitmap::kRGB_565_Config) ||
|
| - (config == SkBitmap::kARGB_8888_Config));
|
| +void GLHelper::CopyTextureToImpl::ReadbackTextureSync(
|
| + GLuint texture,
|
| + const gfx::Rect& src_rect,
|
| + unsigned char* out,
|
| + SkBitmap::Config bitmap_config) {
|
| + if (!IsReadbackConfigSupported(bitmap_config))
|
| + return;
|
| +
|
| ScopedFramebuffer dst_framebuffer(gl_);
|
| ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(gl_,
|
| dst_framebuffer);
|
| ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture);
|
| gl_->FramebufferTexture2D(
|
| GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
|
| - GLenum format = (config == SkBitmap::kRGB_565_Config) ?
|
| - GL_RGB :
|
| - GL_RGBA;
|
| - GLenum type = (config == SkBitmap::kRGB_565_Config) ?
|
| - GL_UNSIGNED_SHORT_5_6_5 :
|
| - GL_UNSIGNED_BYTE;
|
| + GLenum format =
|
| + (bitmap_config == SkBitmap::kRGB_565_Config) ? GL_RGB : GL_RGBA;
|
| + GLenum type = (bitmap_config == SkBitmap::kRGB_565_Config)
|
| + ? GL_UNSIGNED_SHORT_5_6_5
|
| + : GL_UNSIGNED_BYTE;
|
| gl_->ReadPixels(src_rect.x(),
|
| src_rect.y(),
|
| src_rect.width(),
|
| @@ -540,15 +534,11 @@ void GLHelper::CopyTextureToImpl::ReadbackTextureAsync(
|
| GLuint texture,
|
| const gfx::Size& dst_size,
|
| unsigned char* out,
|
| - SkBitmap::Config config,
|
| + SkBitmap::Config bitmap_config,
|
| const base::Callback<void(bool)>& callback) {
|
| - // Only ARGB888 and RGB565 supported as of now.
|
| - bool format_support = ((config == SkBitmap::kRGB_565_Config) ||
|
| - (config == SkBitmap::kARGB_8888_Config));
|
| - if (!format_support) {
|
| - DCHECK(format_support);
|
| + if (!IsReadbackConfigSupported(bitmap_config))
|
| return;
|
| - }
|
| +
|
| ScopedFramebuffer dst_framebuffer(gl_);
|
| ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(gl_,
|
| dst_framebuffer);
|
| @@ -558,12 +548,12 @@ void GLHelper::CopyTextureToImpl::ReadbackTextureAsync(
|
| GL_TEXTURE_2D,
|
| texture,
|
| 0);
|
| - int bytes_per_pixel = (config == SkBitmap::kRGB_565_Config) ? 2 : 4;
|
| + int bytes_per_pixel = (bitmap_config == SkBitmap::kRGB_565_Config) ? 2 : 4;
|
| ReadbackAsync(dst_size,
|
| dst_size.width() * bytes_per_pixel,
|
| dst_size.width() * bytes_per_pixel,
|
| out,
|
| - config,
|
| + bitmap_config,
|
| callback);
|
| }
|
|
|
| @@ -583,6 +573,15 @@ GLuint GLHelper::CopyTextureToImpl::CopyAndScaleTexture(
|
| quality);
|
| }
|
|
|
| +bool GLHelper::CopyTextureToImpl::IsReadbackConfigSupported(
|
| + SkBitmap::Config bitmap_config) {
|
| + if (!helper_) {
|
| + DCHECK(helper_);
|
| + return false;
|
| + }
|
| + return helper_->IsReadbackConfigSupported(bitmap_config);
|
| +}
|
| +
|
| void GLHelper::CopyTextureToImpl::ReadbackDone(Request* finished_request,
|
| int bytes_per_pixel) {
|
| TRACE_EVENT0("mirror",
|
| @@ -651,8 +650,7 @@ void GLHelper::CopyTextureToImpl::CancelRequests() {
|
| GLHelper::GLHelper(GLES2Interface* gl, gpu::ContextSupport* context_support)
|
| : gl_(gl),
|
| context_support_(context_support),
|
| - initialized_565_format_check_(false),
|
| - support_565_format_(false) {}
|
| + readback_support_(new GLHelperReadbackSupport(gl)) {}
|
|
|
| GLHelper::~GLHelper() {}
|
|
|
| @@ -875,46 +873,6 @@ void GLHelper::CopyTextureFullImage(GLuint texture, const gfx::Size& size) {
|
| GL_TEXTURE_2D, 0, GL_RGB, 0, 0, size.width(), size.height(), 0);
|
| }
|
|
|
| -bool GLHelper::CanUseRgb565Readback() {
|
| - if(initialized_565_format_check_){
|
| - return support_565_format_;
|
| - }
|
| - const int kTestSize = 64;
|
| - GLuint dst_texture = 0u;
|
| - gl_->GenTextures(1, &dst_texture);
|
| - ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, dst_texture);
|
| - gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
| - gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
| - gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
| - gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
| - gl_->TexImage2D(GL_TEXTURE_2D,
|
| - 0,
|
| - GL_RGB,
|
| - kTestSize,
|
| - kTestSize,
|
| - 0,
|
| - GL_RGB,
|
| - GL_UNSIGNED_SHORT_5_6_5,
|
| - NULL);
|
| - ScopedFramebuffer dst_framebuffer(gl_);
|
| - ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(gl_,
|
| - dst_framebuffer);
|
| - gl_->FramebufferTexture2D(GL_FRAMEBUFFER,
|
| - GL_COLOR_ATTACHMENT0,
|
| - GL_TEXTURE_2D,
|
| - dst_texture,
|
| - 0);
|
| - GLint ext_format = 0, ext_type = 0;
|
| - gl_->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &ext_format);
|
| - gl_->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &ext_type);
|
| - gl_->DeleteTextures(1, &dst_texture);
|
| - if ((ext_format == GL_RGB) && (ext_type == GL_UNSIGNED_SHORT_5_6_5)) {
|
| - support_565_format_ = true;
|
| - }
|
| - initialized_565_format_check_ = true;
|
| - return support_565_format_;
|
| -}
|
| -
|
| void GLHelper::CopyTextureToImpl::ReadbackPlane(
|
| TextureFrameBufferPair* source,
|
| const scoped_refptr<media::VideoFrame>& target,
|
| @@ -1190,6 +1148,11 @@ void GLHelper::CopyTextureToImpl::ReadbackYUV_MRT::ReadbackYUV(
|
| media::LetterboxYUV(target, dst_subrect_);
|
| }
|
|
|
| +bool GLHelper::IsReadbackConfigSupported(SkBitmap::Config texture_format) {
|
| + DCHECK(readback_support_.get());
|
| + return readback_support_.get()->IsReadbackConfigSupported(texture_format);
|
| +}
|
| +
|
| ReadbackYUVInterface* GLHelper::CopyTextureToImpl::CreateReadbackPipelineYUV(
|
| GLHelper::ScalerQuality quality,
|
| const gfx::Size& src_size,
|
|
|