Home | History | Annotate | Download | only in gl
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/gl/gl_image_surface_texture.h"
      6 
      7 #include "base/debug/trace_event.h"
      8 #include "ui/gl/android/surface_texture.h"
      9 #include "ui/gl/android/surface_texture_tracker.h"
     10 
     11 namespace gfx {
     12 
     13 GLImageSurfaceTexture::GLImageSurfaceTexture(gfx::Size size)
     14     : size_(size), texture_id_(0) {}
     15 
     16 GLImageSurfaceTexture::~GLImageSurfaceTexture() { Destroy(); }
     17 
     18 bool GLImageSurfaceTexture::Initialize(gfx::GpuMemoryBufferHandle buffer) {
     19   DCHECK(!surface_texture_);
     20   surface_texture_ =
     21       SurfaceTextureTracker::GetInstance()->AcquireSurfaceTexture(
     22           buffer.surface_texture_id.primary_id,
     23           buffer.surface_texture_id.secondary_id);
     24   return !!surface_texture_;
     25 }
     26 
     27 void GLImageSurfaceTexture::Destroy() {
     28   surface_texture_ = NULL;
     29   texture_id_ = 0;
     30 }
     31 
     32 gfx::Size GLImageSurfaceTexture::GetSize() { return size_; }
     33 
     34 bool GLImageSurfaceTexture::BindTexImage(unsigned target) {
     35   TRACE_EVENT0("gpu", "GLImageSurfaceTexture::BindTexImage");
     36 
     37   if (target != GL_TEXTURE_EXTERNAL_OES) {
     38     LOG(ERROR)
     39         << "Surface texture can only be bound to TEXTURE_EXTERNAL_OES target";
     40     return false;
     41   }
     42 
     43   GLint texture_id;
     44   glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texture_id);
     45   DCHECK(texture_id);
     46 
     47   if (texture_id_ && texture_id_ != texture_id) {
     48     LOG(ERROR) << "Surface texture can only be bound to one texture ID";
     49     return false;
     50   }
     51 
     52   DCHECK(surface_texture_);
     53   if (texture_id != texture_id_) {
     54     // Note: Surface textures used as gpu memory buffers are created with an
     55     // initial dummy texture id of 0. We need to call DetachFromGLContext() here
     56     // to detach from the dummy texture before we can attach to a real texture
     57     // id. DetachFromGLContext() will delete the texture for the current
     58     // attachment point so it's important that this is never called when
     59     // attached to a real texture id. Detaching from the dummy texture id should
     60     // not cause any problems as the GL should silently ignore 0 when passed to
     61     // glDeleteTextures.
     62     DCHECK_EQ(0, texture_id_);
     63     surface_texture_->DetachFromGLContext();
     64 
     65     // This will attach the surface texture to the texture currently bound to
     66     // GL_TEXTURE_EXTERNAL_OES target.
     67     surface_texture_->AttachToGLContext();
     68     texture_id_ = texture_id;
     69   }
     70 
     71   surface_texture_->UpdateTexImage();
     72   return true;
     73 }
     74 
     75 }  // namespace gfx
     76