Index: gpu/command_buffer/service/stream_texture_manager_in_process_android.cc |
diff --git a/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc b/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc |
index e7e3a1f55a5ceaa00d71782631dc2104dfeb1510..40908a8cccc07f2aa427dc37175e15c91e48471d 100644 |
--- a/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc |
+++ b/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc |
@@ -19,7 +19,9 @@ namespace { |
// Simply wraps a SurfaceTexture reference as a GLImage. |
class GLImageImpl : public gfx::GLImage { |
public: |
- GLImageImpl(const scoped_refptr<gfx::SurfaceTexture>& surface_texture, |
+ GLImageImpl(uint32 texture_id, |
+ gles2::TextureManager* texture_manager, |
+ const scoped_refptr<gfx::SurfaceTexture>& surface_texture, |
const base::Closure& release_callback); |
// implement gfx::GLImage |
@@ -28,13 +30,10 @@ class GLImageImpl : public gfx::GLImage { |
unsigned GetInternalFormat() override; |
bool BindTexImage(unsigned target) override; |
void ReleaseTexImage(unsigned target) override; |
+ bool CopyTexImage(unsigned target) override; |
bool CopyTexSubImage(unsigned target, |
const gfx::Point& offset, |
const gfx::Rect& rect) override; |
- void WillUseTexImage() override; |
- void DidUseTexImage() override {} |
- void WillModifyTexImage() override {} |
- void DidModifyTexImage() override {} |
bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget, |
int z_order, |
gfx::OverlayTransform transform, |
@@ -47,6 +46,8 @@ class GLImageImpl : public gfx::GLImage { |
private: |
~GLImageImpl() override; |
+ uint32 texture_id_; |
+ gles2::TextureManager* texture_manager_; |
scoped_refptr<gfx::SurfaceTexture> surface_texture_; |
base::Closure release_callback_; |
@@ -54,9 +55,14 @@ class GLImageImpl : public gfx::GLImage { |
}; |
GLImageImpl::GLImageImpl( |
+ uint32 texture_id, |
+ gles2::TextureManager* texture_manager, |
const scoped_refptr<gfx::SurfaceTexture>& surface_texture, |
const base::Closure& release_callback) |
- : surface_texture_(surface_texture), release_callback_(release_callback) {} |
+ : texture_id_(texture_id), |
+ texture_manager_(texture_manager), |
+ surface_texture_(surface_texture), |
+ release_callback_(release_callback) {} |
GLImageImpl::~GLImageImpl() { |
release_callback_.Run(); |
@@ -83,16 +89,39 @@ void GLImageImpl::ReleaseTexImage(unsigned target) { |
NOTREACHED(); |
} |
+bool GLImageImpl::CopyTexImage(unsigned target) { |
+ if (target != GL_TEXTURE_EXTERNAL_OES) |
+ return false; |
+ |
+ GLint texture_id; |
+ glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texture_id); |
+ DCHECK(texture_id); |
+ |
+ // The following code only works if we're being asked to copy into |
+ // |texture_id_|. Copying into a different texture is not supported. |
+ if (static_cast<unsigned>(texture_id) != texture_id_) |
+ return false; |
+ |
+ surface_texture_->UpdateTexImage(); |
+ |
+ gles2::Texture* texture = |
+ texture_manager_->GetTextureForServiceId(texture_id_); |
+ if (texture) { |
+ // By setting image state to UNBOUND instead of COPIED we ensure that |
+ // CopyTexImage() is called each time the surface texture is used for |
+ // drawing. |
+ texture->SetLevelImage(GL_TEXTURE_EXTERNAL_OES, 0, this, |
+ gles2::Texture::UNBOUND); |
+ } |
+ return true; |
+} |
+ |
bool GLImageImpl::CopyTexSubImage(unsigned target, |
const gfx::Point& offset, |
const gfx::Rect& rect) { |
return false; |
} |
-void GLImageImpl::WillUseTexImage() { |
- surface_texture_->UpdateTexImage(); |
-} |
- |
bool GLImageImpl::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, |
int z_order, |
gfx::OverlayTransform transform, |
@@ -139,16 +168,17 @@ GLuint StreamTextureManagerInProcess::CreateStreamTexture( |
base::Closure release_callback = |
base::Bind(&StreamTextureManagerInProcess::OnReleaseStreamTexture, |
weak_factory_.GetWeakPtr(), stream_id); |
- scoped_refptr<gfx::GLImage> gl_image(new GLImageImpl(surface_texture, |
- release_callback)); |
+ scoped_refptr<gfx::GLImage> gl_image( |
+ new GLImageImpl(texture->service_id(), texture_manager, surface_texture, |
+ release_callback)); |
gfx::Size size = gl_image->GetSize(); |
texture_manager->SetTarget(texture, GL_TEXTURE_EXTERNAL_OES); |
texture_manager->SetLevelInfo(texture, GL_TEXTURE_EXTERNAL_OES, 0, GL_RGBA, |
size.width(), size.height(), 1, 0, GL_RGBA, |
GL_UNSIGNED_BYTE, gfx::Rect(size)); |
- texture_manager->SetLevelImage( |
- texture, GL_TEXTURE_EXTERNAL_OES, 0, gl_image.get()); |
+ texture_manager->SetLevelImage(texture, GL_TEXTURE_EXTERNAL_OES, 0, |
+ gl_image.get(), gles2::Texture::UNBOUND); |
{ |
base::AutoLock lock(map_lock_); |