| Index: ui/gl/gl_image_memory.cc
|
| diff --git a/ui/gl/gl_image_memory.cc b/ui/gl/gl_image_memory.cc
|
| index dfd3d2cb95c3b55df7c515411551d08f3fb4c72f..d79a753fb846dc1eac767ab691bc7b3009a55c50 100644
|
| --- a/ui/gl/gl_image_memory.cc
|
| +++ b/ui/gl/gl_image_memory.cc
|
| @@ -70,7 +70,10 @@ int BytesPerPixel(unsigned internalformat) {
|
| GLImageMemory::GLImageMemory(const gfx::Size& size, unsigned internalformat)
|
| : memory_(NULL),
|
| size_(size),
|
| - internalformat_(internalformat)
|
| + internalformat_(internalformat),
|
| + in_use_(false),
|
| + target_(0),
|
| + need_do_bind_tex_image_(false)
|
| #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
|
| defined(USE_OZONE)
|
| ,
|
| @@ -122,7 +125,80 @@ gfx::Size GLImageMemory::GetSize() {
|
| }
|
|
|
| bool GLImageMemory::BindTexImage(unsigned target) {
|
| - TRACE_EVENT0("gpu", "GLImageMemory::BindTexImage");
|
| + if (target_ && target_ != target) {
|
| + LOG(ERROR) << "GLImage can only be bound to one target";
|
| + return false;
|
| + }
|
| + target_ = target;
|
| +
|
| + // Defer DoBindTexImage if not currently in use.
|
| + if (!in_use_) {
|
| + need_do_bind_tex_image_ = true;
|
| + return true;
|
| + }
|
| +
|
| + DoBindTexImage(target);
|
| + return true;
|
| +}
|
| +
|
| +bool GLImageMemory::CopyTexImage(unsigned target) {
|
| + TRACE_EVENT0("gpu", "GLImageMemory::CopyTexImage");
|
| +
|
| + // GL_TEXTURE_EXTERNAL_OES is not a supported CopyTexImage target.
|
| + if (target == GL_TEXTURE_EXTERNAL_OES)
|
| + return false;
|
| +
|
| + DCHECK(memory_);
|
| + glTexImage2D(target,
|
| + 0, // mip level
|
| + TextureFormat(internalformat_),
|
| + size_.width(),
|
| + size_.height(),
|
| + 0, // border
|
| + DataFormat(internalformat_),
|
| + DataType(internalformat_),
|
| + memory_);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void GLImageMemory::WillUseTexImage() {
|
| + DCHECK(!in_use_);
|
| + in_use_ = true;
|
| +
|
| + if (!need_do_bind_tex_image_)
|
| + return;
|
| +
|
| + DCHECK(target_);
|
| + DoBindTexImage(target_);
|
| +}
|
| +
|
| +void GLImageMemory::DidUseTexImage() {
|
| + DCHECK(in_use_);
|
| + in_use_ = false;
|
| +}
|
| +
|
| +bool GLImageMemory::ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
|
| + int z_order,
|
| + OverlayTransform transform,
|
| + const Rect& bounds_rect,
|
| + const RectF& crop_rect) {
|
| + return false;
|
| +}
|
| +
|
| +bool GLImageMemory::HasValidFormat() const {
|
| + return ValidFormat(internalformat_);
|
| +}
|
| +
|
| +size_t GLImageMemory::Bytes() const {
|
| + return size_.GetArea() * BytesPerPixel(internalformat_);
|
| +}
|
| +
|
| +void GLImageMemory::DoBindTexImage(unsigned target) {
|
| + TRACE_EVENT0("gpu", "GLImageMemory::DoBindTexImage");
|
| +
|
| + DCHECK(need_do_bind_tex_image_);
|
| + need_do_bind_tex_image_ = false;
|
|
|
| DCHECK(memory_);
|
| #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
|
| @@ -176,8 +252,7 @@ bool GLImageMemory::BindTexImage(unsigned target) {
|
|
|
| glEGLImageTargetTexture2DOES(target, egl_image_);
|
| DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
|
| -
|
| - return true;
|
| + return;
|
| }
|
| #endif
|
|
|
| @@ -191,24 +266,6 @@ bool GLImageMemory::BindTexImage(unsigned target) {
|
| DataFormat(internalformat_),
|
| DataType(internalformat_),
|
| memory_);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool GLImageMemory::HasValidFormat() const {
|
| - return ValidFormat(internalformat_);
|
| -}
|
| -
|
| -size_t GLImageMemory::Bytes() const {
|
| - return size_.GetArea() * BytesPerPixel(internalformat_);
|
| -}
|
| -
|
| -bool GLImageMemory::ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
|
| - int z_order,
|
| - OverlayTransform transform,
|
| - const Rect& bounds_rect,
|
| - const RectF& crop_rect) {
|
| - return false;
|
| }
|
|
|
| } // namespace gfx
|
|
|