Index: content/common/gpu/media/android_deferred_rendering_backing_strategy.cc |
diff --git a/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc b/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc |
index e3d59d7386ba6309c18ebbdecab2faa4c2608fd1..4948139a33027107faa12b33fb23cfa1810f8c27 100644 |
--- a/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc |
+++ b/content/common/gpu/media/android_deferred_rendering_backing_strategy.cc |
@@ -100,7 +100,23 @@ AndroidDeferredRenderingBackingStrategy::GetSurfaceTexture() const { |
} |
uint32_t AndroidDeferredRenderingBackingStrategy::GetTextureTarget() const { |
- return GL_TEXTURE_EXTERNAL_OES; |
+ // If we're using a surface texture, then we need an external texture target |
+ // to sample from it. If not, then we'll use 2D transparent textures to draw |
+ // a transparent hole through which to see the SurfaceView. This is normally |
+ // needed only for the devtools inspector, since the overlay mechanism handles |
+ // it otherwise. |
+ return surface_texture_ ? GL_TEXTURE_EXTERNAL_OES : GL_TEXTURE_2D; |
+} |
+ |
+gfx::Size AndroidDeferredRenderingBackingStrategy::GetPictureBufferSize() |
+ const { |
+ // For SurfaceView, request a 1x1 2D texture to reduce memory during |
+ // initialization. For SurfaceTexture, allocate a picture buffer that is the |
+ // actual frame size. Note that it will be an external texture anyway, so it |
+ // doesn't allocate an image of that size. However, it's still important to |
+ // get the coded size right, so that VideoLayerImpl doesn't try to scale the |
+ // texture when building the quad for it. |
+ return surface_texture_ ? state_provider_->GetSize() : gfx::Size(1, 1); |
} |
AVDACodecImage* AndroidDeferredRenderingBackingStrategy::GetImageForPicture( |
@@ -178,13 +194,29 @@ void AndroidDeferredRenderingBackingStrategy::UseCodecBufferForPictureBuffer( |
} |
void AndroidDeferredRenderingBackingStrategy::AssignOnePictureBuffer( |
- const media::PictureBuffer& picture_buffer) { |
+ const media::PictureBuffer& picture_buffer, |
+ bool have_context) { |
// Attach a GLImage to each texture that will use the surface texture. |
// We use a refptr here in case SetImageForPicture fails. |
scoped_refptr<gpu::gles2::GLStreamTextureImage> gl_image = |
new AVDACodecImage(shared_state_, media_codec_, |
state_provider_->GetGlDecoder(), surface_texture_); |
SetImageForPicture(picture_buffer, gl_image); |
+ |
+ if (!surface_texture_ && have_context) { |
+ // To make devtools work, we're using a 2D texture. Make it transparent, |
+ // so that it draws a hole for the SV to show through. This is only |
+ // because devtools draws and reads back, which skips overlay processing. |
+ // It's unclear why devtools renders twice -- once normally, and once |
+ // including a readback layer. The result is that the device screen |
+ // flashes as we alternately draw the overlay hole and this texture, |
+ // unless we make the texture transparent. |
+ static const uint8_t rgba[] = {0, 0, 0, 0}; |
+ const gfx::Size size(1, 1); |
+ glBindTexture(GL_TEXTURE_2D, picture_buffer.texture_id()); |
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.width(), size.height(), 0, |
+ GL_RGBA, GL_UNSIGNED_BYTE, rgba); |
+ } |
} |
void AndroidDeferredRenderingBackingStrategy::ReleaseCodecBufferForPicture( |