Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / gl / gl_image_surface_texture.cc
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
10 namespace gfx {
11
12 GLImageSurfaceTexture::GLImageSurfaceTexture(const gfx::Size& size)
13     : size_(size), texture_id_(0) {
14 }
15
16 GLImageSurfaceTexture::~GLImageSurfaceTexture() {
17   DCHECK(!surface_texture_.get());
18   DCHECK_EQ(0, texture_id_);
19 }
20
21 bool GLImageSurfaceTexture::Initialize(SurfaceTexture* surface_texture) {
22   DCHECK(!surface_texture_.get());
23   surface_texture_ = surface_texture;
24   return true;
25 }
26
27 void GLImageSurfaceTexture::Destroy(bool have_context) {
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_.get());
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 bool GLImageSurfaceTexture::CopyTexImage(unsigned target) {
76   return false;
77 }
78
79 bool GLImageSurfaceTexture::ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
80                                                  int z_order,
81                                                  OverlayTransform transform,
82                                                  const Rect& bounds_rect,
83                                                  const RectF& crop_rect) {
84   return false;
85 }
86
87 }  // namespace gfx