Index: content/renderer/media/renderer_gpu_video_accelerator_factories.cc |
diff --git a/content/renderer/media/renderer_gpu_video_accelerator_factories.cc b/content/renderer/media/renderer_gpu_video_accelerator_factories.cc |
index d90123e78ae6a878151bdcc2d0f8fe90cc3d770e..40d4eb65b82e13db1b7278039693f5e445a9bb27 100644 |
--- a/content/renderer/media/renderer_gpu_video_accelerator_factories.cc |
+++ b/content/renderer/media/renderer_gpu_video_accelerator_factories.cc |
@@ -10,6 +10,7 @@ |
#include "base/bind.h" |
#include "content/child/child_thread.h" |
#include "content/common/gpu/client/context_provider_command_buffer.h" |
+#include "content/common/gpu/client/gl_helper.h" |
#include "content/common/gpu/client/gpu_channel_host.h" |
#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" |
#include "content/renderer/render_thread_impl.h" |
@@ -64,11 +65,24 @@ RendererGpuVideoAcceleratorFactories::GetContext3d() { |
if (context_provider_->IsContextLost()) { |
context_provider_->VerifyContexts(); |
context_provider_ = NULL; |
+ gl_helper_.reset(NULL); |
return NULL; |
} |
return context_provider_->WebContext3D(); |
} |
+GLHelper* RendererGpuVideoAcceleratorFactories::GetGLHelper() { |
+ if (!GetContext3d()) |
+ return NULL; |
+ |
+ if (gl_helper_.get() == NULL) { |
+ gl_helper_.reset(new GLHelper(GetContext3d()->GetImplementation(), |
+ GetContext3d()->GetContextSupport())); |
+ } |
+ |
+ return gl_helper_.get(); |
+} |
+ |
scoped_ptr<media::VideoDecodeAccelerator> |
RendererGpuVideoAcceleratorFactories::CreateVideoDecodeAccelerator() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
@@ -178,59 +192,29 @@ void RendererGpuVideoAcceleratorFactories::ReadPixels( |
const SkBitmap& pixels) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
+ GLHelper* gl_helper = GetGLHelper(); |
WebGraphicsContext3DCommandBufferImpl* context = GetContext3d(); |
- if (!context) |
- return; |
- gpu::gles2::GLES2Implementation* gles2 = context->GetImplementation(); |
+ if (!gl_helper || !context) |
+ return; |
+ // Copy texture from texture_id to tmp_texture as texture might be external |
+ // (GL_TEXTURE_EXTERNAL_OES) |
GLuint tmp_texture; |
- gles2->GenTextures(1, &tmp_texture); |
- gles2->BindTexture(GL_TEXTURE_2D, tmp_texture); |
- gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
- gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
- gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
- gles2->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
+ tmp_texture = gl_helper->CreateTexture(); |
context->copyTextureCHROMIUM( |
GL_TEXTURE_2D, texture_id, tmp_texture, 0, GL_RGBA, GL_UNSIGNED_BYTE); |
- GLuint fb; |
- gles2->GenFramebuffers(1, &fb); |
- gles2->BindFramebuffer(GL_FRAMEBUFFER, fb); |
- gles2->FramebufferTexture2D( |
- GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tmp_texture, 0); |
- gles2->PixelStorei(GL_PACK_ALIGNMENT, 4); |
- |
-#if SK_B32_SHIFT == 0 && SK_G32_SHIFT == 8 && SK_R32_SHIFT == 16 && \ |
- SK_A32_SHIFT == 24 |
- GLenum skia_format = GL_BGRA_EXT; |
- GLenum read_format = GL_BGRA_EXT; |
- GLint supported_format = 0; |
- GLint supported_type = 0; |
- gles2->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &supported_format); |
- gles2->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &supported_type); |
- if (supported_format != GL_BGRA_EXT || supported_type != GL_UNSIGNED_BYTE) { |
- read_format = GL_RGBA; |
- } |
-#elif SK_R32_SHIFT == 0 && SK_G32_SHIFT == 8 && SK_B32_SHIFT == 16 && \ |
- SK_A32_SHIFT == 24 |
- GLenum skia_format = GL_RGBA; |
- GLenum read_format = GL_RGBA; |
-#else |
-#error Unexpected Skia ARGB_8888 layout! |
-#endif |
- gles2->ReadPixels(visible_rect.x(), |
- visible_rect.y(), |
- visible_rect.width(), |
- visible_rect.height(), |
- read_format, |
- GL_UNSIGNED_BYTE, |
- pixels.pixelRef()->pixels()); |
- gles2->DeleteFramebuffers(1, &fb); |
- gles2->DeleteTextures(1, &tmp_texture); |
- |
- if (skia_format != read_format) { |
- DCHECK(read_format == GL_RGBA); |
+ unsigned char* pixel_data = |
+ static_cast<unsigned char*>(pixels.pixelRef()->pixels()); |
+ |
+ if (gl_helper->IsReadbackConfigSupported(pixels.colorType())) { |
+ gl_helper->ReadbackTextureSync( |
+ tmp_texture, visible_rect, pixel_data, pixels.colorType()); |
+ } else if (pixels.colorType() == kN32_SkColorType) { |
+ gl_helper->ReadbackTextureSync( |
+ tmp_texture, visible_rect, pixel_data, kRGBA_8888_SkColorType); |
+ |
int pixel_count = visible_rect.width() * visible_rect.height(); |
uint32_t* pixels_ptr = static_cast<uint32_t*>(pixels.pixelRef()->pixels()); |
for (int i = 0; i < pixel_count; ++i) { |
@@ -243,9 +227,11 @@ void RendererGpuVideoAcceleratorFactories::ReadPixels( |
(b << SK_B32_SHIFT) | |
(a << SK_A32_SHIFT); |
} |
+ } else { |
+ NOTREACHED(); |
} |
- DCHECK_EQ(gles2->GetError(), static_cast<GLenum>(GL_NO_ERROR)); |
+ gl_helper->DeleteTexture(tmp_texture); |
} |
base::SharedMemory* RendererGpuVideoAcceleratorFactories::CreateSharedMemory( |