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

Unified Diff: content/common/gpu/client/gl_helper.cc

Issue 412453002: GLHelper: Address inconsistent mapping of SkColorType to GL format (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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 side-by-side diff with in-line comments
Download patch
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 d172c560278a6dc40d0bdcd589a7bb64a7d6cef1..779879342c1ae917ee5f76fdb87680880c78305c 100644
--- a/content/common/gpu/client/gl_helper.cc
+++ b/content/common/gpu/client/gl_helper.cc
@@ -162,8 +162,9 @@ class GLHelper::CopyTextureToImpl
int32 bytes_per_row, // generally dst_size.width() * 4
int32 row_stride_bytes, // generally dst_size.width() * 4
unsigned char* out,
- const SkColorType color_type,
- ReadbackSwizzle swizzle,
+ GLenum format,
+ GLenum type,
+ int32 bytes_per_pixel,
const base::Callback<void(bool)>& callback);
void ReadbackPlane(TextureFrameBufferPair* source,
@@ -171,7 +172,6 @@ class GLHelper::CopyTextureToImpl
int plane,
int size_shift,
const gfx::Rect& dst_subrect,
- ReadbackSwizzle swizzle,
const base::Callback<void(bool)>& callback);
GLuint CopyAndScaleTexture(GLuint texture,
@@ -193,8 +193,11 @@ class GLHelper::CopyTextureToImpl
// 0 if GL_EXT_draw_buffers is not available.
GLint MaxDrawBuffers() const { return max_draw_buffers_; }
- bool IsReadbackConfigSupported(SkColorType color_type);
-
+ FormatSupport ReadbackConfig(SkColorType color_type,
piman 2014/07/22 19:57:55 nit: naming... GetReadbackConfig ?
robert.bradford 2014/07/23 16:58:45 Done.
+ const bool& can_swizzle,
piman 2014/07/22 19:57:54 use bool instead of const bool&
robert.bradford 2014/07/23 16:58:44 Done.
+ GLint& format,
piman 2014/07/22 19:57:55 non-const references are forbidden by style guide.
robert.bradford 2014/07/23 16:58:44 Done.
+ GLint& type,
piman 2014/07/22 19:57:54 GLenum
robert.bradford 2014/07/23 16:58:45 Done.
+ int32& bytes_per_pixel);
piman 2014/07/22 19:57:55 nit: size_t instead of int32.
robert.bradford 2014/07/23 16:58:45 Done.
private:
// A single request to CropScaleReadbackAndCleanTexture.
// The main thread can cancel the request, before it's handled by the helper
@@ -364,25 +367,16 @@ GLuint GLHelper::CopyTextureToImpl::ScaleTexture(
bool swizzle,
SkColorType color_type,
GLHelper::ScalerQuality quality) {
- if (!IsReadbackConfigSupported(color_type))
- return 0;
-
- scoped_ptr<ScalerInterface> scaler(
- helper_->CreateScaler(quality,
- src_size,
- src_subrect,
- dst_size,
- vertically_flip_texture,
- swizzle));
GLuint dst_texture = 0u;
- // Start with ARGB8888 params as any other format which is not
- // supported is already asserted above.
- GLenum format = GL_RGBA , type = GL_UNSIGNED_BYTE;
gl_->GenTextures(1, &dst_texture);
{
+ GLenum format = GL_RGBA , type = GL_UNSIGNED_BYTE;
piman 2014/07/22 19:57:54 nit: no space before ,
robert.bradford 2014/07/23 16:58:44 Done.
ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, dst_texture);
switch (color_type) {
- case kN32_SkColorType:
+ // For creating the scaled texture the layout should be GL_RGBA
+ // independent of any desired readback layout
piman 2014/07/22 19:57:55 I don't understand this comment. Does it only appl
robert.bradford 2014/07/23 16:58:45 This is the initialisation of the texture for the
+ case kRGBA_8888_SkColorType:
+ case kBGRA_8888_SkColorType:
// Do nothing params already set.
break;
case kRGB_565_SkColorType:
@@ -390,8 +384,7 @@ GLuint GLHelper::CopyTextureToImpl::ScaleTexture(
type = GL_UNSIGNED_SHORT_5_6_5;
break;
default:
- NOTREACHED();
- break;
+ return 0;
}
gl_->TexImage2D(GL_TEXTURE_2D,
0,
@@ -403,6 +396,13 @@ GLuint GLHelper::CopyTextureToImpl::ScaleTexture(
type,
NULL);
}
+ scoped_ptr<ScalerInterface> scaler(
+ helper_->CreateScaler(quality,
+ src_size,
+ src_subrect,
+ dst_size,
+ vertically_flip_texture,
+ swizzle));
scaler->Scale(src_texture, dst_texture);
return dst_texture;
}
@@ -412,36 +412,15 @@ void GLHelper::CopyTextureToImpl::ReadbackAsync(
int32 bytes_per_row,
int32 row_stride_bytes,
unsigned char* out,
- const SkColorType color_type,
- ReadbackSwizzle swizzle,
+ GLenum format,
+ GLenum type,
+ int32 bytes_per_pixel,
piman 2014/07/22 19:57:54 size_t
robert.bradford 2014/07/23 16:58:44 Done.
const base::Callback<void(bool)>& callback) {
- if (!IsReadbackConfigSupported(color_type)) {
- callback.Run(false);
- return;
- }
Request* request =
new Request(dst_size, bytes_per_row, row_stride_bytes, out, callback);
request_queue_.push(request);
request->buffer = 0u;
- // Start with ARGB8888 params as any other format which is not
- // supported is already asserted above.
- GLenum format = GL_RGBA, type = GL_UNSIGNED_BYTE;
- int bytes_per_pixel = 4;
-
- switch (color_type) {
- case kN32_SkColorType:
- if (swizzle == kSwizzleBGRA)
- format = GL_BGRA_EXT;
- break;
- case kRGB_565_SkColorType:
- format = GL_RGB;
- type = GL_UNSIGNED_SHORT_5_6_5;
- bytes_per_pixel = 2;
- break;
- default:
- NOTREACHED();
- break;
- }
+
gl_->GenBuffers(1, &request->buffer);
gl_->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, request->buffer);
gl_->BufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
@@ -475,20 +454,23 @@ void GLHelper::CopyTextureToImpl::CropScaleReadbackAndCleanTexture(
const SkColorType color_type,
const base::Callback<void(bool)>& callback,
GLHelper::ScalerQuality quality) {
- if (!IsReadbackConfigSupported(color_type)) {
+ GLint format, type, bytes_per_pixel;
+ FormatSupport supported = ReadbackConfig(color_type,
+ true,
+ format,
+ type,
+ bytes_per_pixel);
+ if (supported == kReadbackNotSupported) {
callback.Run(false);
return;
}
+
GLuint texture = ScaleTexture(src_texture,
src_size,
src_subrect,
dst_size,
true,
-#if (SK_R32_SHIFT == 16) && !SK_B32_SHIFT
- true,
-#else
- false,
-#endif
+ (supported == kReadbackSwizzle ? true : false),
piman 2014/07/22 19:57:55 ? true : false unneeded. (supported == kReadbackSw
robert.bradford 2014/07/23 16:58:45 Done.
color_type,
quality);
DCHECK(texture);
@@ -501,24 +483,13 @@ void GLHelper::CopyTextureToImpl::CropScaleReadbackAndCleanTexture(
GL_TEXTURE_2D,
texture,
0);
- int bytes_per_pixel = 4;
- switch (color_type) {
- case kN32_SkColorType:
- // Do nothing params already set.
- break;
- case kRGB_565_SkColorType:
- bytes_per_pixel = 2;
- break;
- default:
- NOTREACHED();
- break;
- }
ReadbackAsync(dst_size,
dst_size.width() * bytes_per_pixel,
dst_size.width() * bytes_per_pixel,
out,
- color_type,
- kSwizzleNone,
+ format,
+ type,
+ bytes_per_pixel,
callback);
gl_->DeleteTextures(1, &texture);
}
@@ -528,8 +499,15 @@ void GLHelper::CopyTextureToImpl::ReadbackTextureSync(
const gfx::Rect& src_rect,
unsigned char* out,
SkColorType color_type) {
- if (!IsReadbackConfigSupported(color_type))
+ GLint format, type, bytes_per_pixel;
+ FormatSupport supported = ReadbackConfig(color_type,
+ false,
+ format,
+ type,
+ bytes_per_pixel);
+ if (supported == kReadbackNotSupported) {
return;
+ }
ScopedFramebuffer dst_framebuffer(gl_);
ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(gl_,
@@ -537,11 +515,6 @@ void GLHelper::CopyTextureToImpl::ReadbackTextureSync(
ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture);
gl_->FramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
- GLenum format =
- (color_type == kRGB_565_SkColorType) ? GL_RGB : GL_RGBA;
- GLenum type = (color_type == kRGB_565_SkColorType)
- ? GL_UNSIGNED_SHORT_5_6_5
- : GL_UNSIGNED_BYTE;
gl_->ReadPixels(src_rect.x(),
src_rect.y(),
src_rect.width(),
@@ -557,8 +530,16 @@ void GLHelper::CopyTextureToImpl::ReadbackTextureAsync(
unsigned char* out,
SkColorType color_type,
const base::Callback<void(bool)>& callback) {
- if (!IsReadbackConfigSupported(color_type))
+ GLint format, type, bytes_per_pixel;
+ FormatSupport supported = ReadbackConfig(color_type,
+ false,
+ format,
+ type,
+ bytes_per_pixel);
+ if (supported == kReadbackNotSupported) {
+ callback.Run(false);
return;
+ }
ScopedFramebuffer dst_framebuffer(gl_);
ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(gl_,
@@ -569,13 +550,13 @@ void GLHelper::CopyTextureToImpl::ReadbackTextureAsync(
GL_TEXTURE_2D,
texture,
0);
- int bytes_per_pixel = (color_type == kRGB_565_SkColorType) ? 2 : 4;
ReadbackAsync(dst_size,
dst_size.width() * bytes_per_pixel,
dst_size.width() * bytes_per_pixel,
out,
- color_type,
- kSwizzleNone,
+ format,
+ type,
+ bytes_per_pixel,
callback);
}
@@ -591,19 +572,10 @@ GLuint GLHelper::CopyTextureToImpl::CopyAndScaleTexture(
dst_size,
vertically_flip_texture,
false,
- kN32_SkColorType,
+ kRGBA_8888_SkColorType, // GL_RGBA
piman 2014/07/22 19:57:54 nit: 2 spaces before //
robert.bradford 2014/07/23 16:58:45 Done.
quality);
}
-bool GLHelper::CopyTextureToImpl::IsReadbackConfigSupported(
- SkColorType color_type) {
- if (!helper_) {
- DCHECK(helper_);
- return false;
- }
- return helper_->IsReadbackConfigSupported(color_type);
-}
-
void GLHelper::CopyTextureToImpl::ReadbackDone(Request* finished_request,
int bytes_per_pixel) {
TRACE_EVENT0("mirror",
@@ -669,6 +641,21 @@ void GLHelper::CopyTextureToImpl::CancelRequests() {
}
}
+
+FormatSupport GLHelper::CopyTextureToImpl::ReadbackConfig(
+ SkColorType color_type,
+ const bool& can_swizzle,
+ GLint& format,
+ GLint& type,
+ int32& bytes_per_pixel) {
+ return helper_->readback_support_->ReadbackConfig(
+ color_type,
+ can_swizzle,
+ format,
+ type,
+ bytes_per_pixel);
+}
+
GLHelper::GLHelper(GLES2Interface* gl, gpu::ContextSupport* context_support)
: gl_(gl),
context_support_(context_support),
@@ -906,17 +893,24 @@ void GLHelper::CopyTextureToImpl::ReadbackPlane(
int plane,
int size_shift,
const gfx::Rect& dst_subrect,
- ReadbackSwizzle swizzle,
const base::Callback<void(bool)>& callback) {
gl_->BindFramebuffer(GL_FRAMEBUFFER, source->framebuffer());
size_t offset = target->stride(plane) * (dst_subrect.y() >> size_shift) +
(dst_subrect.x() >> size_shift);
+ GLint format, type, bytes_per_pixel;
+ // Pass true in for swizzle to match earlier call
piman 2014/07/22 19:57:55 What does this comment mean?
robert.bradford 2014/07/23 16:58:45 By adopting your proposed solution in the YUVReadb
+ ReadbackConfig(kRGBA_8888_SkColorType,
+ true,
+ format,
+ type,
+ bytes_per_pixel);
ReadbackAsync(source->size(),
dst_subrect.width() >> size_shift,
target->stride(plane),
target->data(plane) + offset,
- kN32_SkColorType,
- swizzle,
+ format,
+ type,
+ bytes_per_pixel,
callback);
}
@@ -1033,14 +1027,12 @@ void GLHelper::CopyTextureToImpl::ReadbackYUVImpl::ReadbackYUV(
media::VideoFrame::kYPlane,
0,
dst_subrect_,
- swizzle_,
piman 2014/07/22 19:57:54 I would prefer if we didn't query ReadbackConfig t
robert.bradford 2014/07/23 16:58:45 I implemented option 1. here.
base::Bind(&nullcallback));
copy_impl_->ReadbackPlane(u_.texture_and_framebuffer(),
target,
media::VideoFrame::kUPlane,
1,
dst_subrect_,
- swizzle_,
base::Bind(&nullcallback));
copy_impl_->ReadbackPlane(
v_.texture_and_framebuffer(),
@@ -1048,7 +1040,6 @@ void GLHelper::CopyTextureToImpl::ReadbackYUVImpl::ReadbackYUV(
media::VideoFrame::kVPlane,
1,
dst_subrect_,
- swizzle_,
base::Bind(&CallbackKeepingVideoFrameAlive, target, callback));
gl_->BindFramebuffer(GL_FRAMEBUFFER, 0);
media::LetterboxYUV(target, dst_subrect_);
@@ -1171,14 +1162,12 @@ void GLHelper::CopyTextureToImpl::ReadbackYUV_MRT::ReadbackYUV(
media::VideoFrame::kYPlane,
0,
dst_subrect_,
- swizzle_,
base::Bind(&nullcallback));
copy_impl_->ReadbackPlane(&u_,
target,
media::VideoFrame::kUPlane,
1,
dst_subrect_,
- swizzle_,
base::Bind(&nullcallback));
copy_impl_->ReadbackPlane(
&v_,
@@ -1186,15 +1175,21 @@ void GLHelper::CopyTextureToImpl::ReadbackYUV_MRT::ReadbackYUV(
media::VideoFrame::kVPlane,
1,
dst_subrect_,
- swizzle_,
base::Bind(&CallbackKeepingVideoFrameAlive, target, callback));
gl_->BindFramebuffer(GL_FRAMEBUFFER, 0);
media::LetterboxYUV(target, dst_subrect_);
}
-bool GLHelper::IsReadbackConfigSupported(SkColorType texture_format) {
+bool GLHelper::IsReadbackConfigSupported(SkColorType color_type) {
DCHECK(readback_support_.get());
- return readback_support_.get()->IsReadbackConfigSupported(texture_format);
+ GLint format, type, bytes_per_pixel;
+ FormatSupport support = readback_support_->ReadbackConfig(color_type,
+ false,
+ format,
+ type,
+ bytes_per_pixel);
+
+ return (support == kReadbackSupported);
}
ReadbackYUVInterface* GLHelper::CopyTextureToImpl::CreateReadbackPipelineYUV(
@@ -1206,15 +1201,20 @@ ReadbackYUVInterface* GLHelper::CopyTextureToImpl::CreateReadbackPipelineYUV(
bool flip_vertically,
bool use_mrt) {
helper_->InitScalerImpl();
- // Query preferred format for glReadPixels, if is is GL_BGRA then use that
- // and trigger the appropriate swizzle in the YUV shaders.
- GLint format = 0, type = 0;
+ // Just query if the best readback configuration needs a swizzle In
+ // ReadbackPlane() we make the same request but use the format and type
+ // returned
+ GLint format, type, bytes_per_pixel;
+ FormatSupport supported = ReadbackConfig(kRGBA_8888_SkColorType,
+ true,
+ format,
+ type,
+ bytes_per_pixel);
+
ReadbackSwizzle swizzle = kSwizzleNone;
- helper_->readback_support_.get()->GetAdditionalFormat(GL_RGBA,
- GL_UNSIGNED_BYTE,
- &format, &type);
- if (format == GL_BGRA_EXT && type == GL_UNSIGNED_BYTE)
+ if (supported == kReadbackSwizzle)
swizzle = kSwizzleBGRA;
+
if (max_draw_buffers_ >= 2 && use_mrt) {
return new ReadbackYUV_MRT(gl_,
this,

Powered by Google App Engine
This is Rietveld 408576698