Make launcherSearchProvider API white-listed on stable and public on dev.
[chromium-blink-merge.git] / ui / gl / gl_image_io_surface.cc
blobabea7779368e9166eca8550b8054188276099289
1 // Copyright 2013 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.
5 #include "ui/gl/gl_image_io_surface.h"
7 #include "ui/gl/gl_bindings.h"
8 #include "ui/gl/gl_context.h"
10 // Note that this must be included after gl_bindings.h to avoid conflicts.
11 #include <OpenGL/CGLIOSurface.h>
13 namespace gfx {
14 namespace {
16 bool ValidInternalFormat(unsigned internalformat) {
17 switch (internalformat) {
18 case GL_R8:
19 case GL_BGRA_EXT:
20 return true;
21 default:
22 return false;
26 bool ValidFormat(GpuMemoryBuffer::Format format) {
27 switch (format) {
28 case GpuMemoryBuffer::R_8:
29 case GpuMemoryBuffer::BGRA_8888:
30 return true;
31 case GpuMemoryBuffer::ATC:
32 case GpuMemoryBuffer::ATCIA:
33 case GpuMemoryBuffer::DXT1:
34 case GpuMemoryBuffer::DXT5:
35 case GpuMemoryBuffer::ETC1:
36 case GpuMemoryBuffer::RGBA_8888:
37 case GpuMemoryBuffer::RGBX_8888:
38 case GpuMemoryBuffer::YUV_420:
39 return false;
42 NOTREACHED();
43 return false;
46 GLenum TextureFormat(GpuMemoryBuffer::Format format) {
47 switch (format) {
48 case GpuMemoryBuffer::R_8:
49 return GL_RED;
50 case GpuMemoryBuffer::BGRA_8888:
51 return GL_RGBA;
52 case GpuMemoryBuffer::ATC:
53 case GpuMemoryBuffer::ATCIA:
54 case GpuMemoryBuffer::DXT1:
55 case GpuMemoryBuffer::DXT5:
56 case GpuMemoryBuffer::ETC1:
57 case GpuMemoryBuffer::RGBA_8888:
58 case GpuMemoryBuffer::RGBX_8888:
59 case GpuMemoryBuffer::YUV_420:
60 NOTREACHED();
61 return 0;
64 NOTREACHED();
65 return 0;
68 GLenum DataFormat(GpuMemoryBuffer::Format format) {
69 switch (format) {
70 case GpuMemoryBuffer::R_8:
71 return GL_RED;
72 case GpuMemoryBuffer::BGRA_8888:
73 return GL_BGRA;
74 case GpuMemoryBuffer::ATC:
75 case GpuMemoryBuffer::ATCIA:
76 case GpuMemoryBuffer::DXT1:
77 case GpuMemoryBuffer::DXT5:
78 case GpuMemoryBuffer::ETC1:
79 case GpuMemoryBuffer::RGBA_8888:
80 case GpuMemoryBuffer::RGBX_8888:
81 case GpuMemoryBuffer::YUV_420:
82 NOTREACHED();
83 return 0;
86 NOTREACHED();
87 return 0;
90 GLenum DataType(GpuMemoryBuffer::Format format) {
91 switch (format) {
92 case GpuMemoryBuffer::R_8:
93 return GL_UNSIGNED_BYTE;
94 case GpuMemoryBuffer::BGRA_8888:
95 return GL_UNSIGNED_INT_8_8_8_8_REV;
96 case GpuMemoryBuffer::ATC:
97 case GpuMemoryBuffer::ATCIA:
98 case GpuMemoryBuffer::DXT1:
99 case GpuMemoryBuffer::DXT5:
100 case GpuMemoryBuffer::ETC1:
101 case GpuMemoryBuffer::RGBA_8888:
102 case GpuMemoryBuffer::RGBX_8888:
103 case GpuMemoryBuffer::YUV_420:
104 NOTREACHED();
105 return 0;
108 NOTREACHED();
109 return 0;
112 } // namespace
114 GLImageIOSurface::GLImageIOSurface(const gfx::Size& size,
115 unsigned internalformat)
116 : size_(size),
117 internalformat_(internalformat),
118 format_(GpuMemoryBuffer::RGBA_8888) {
121 GLImageIOSurface::~GLImageIOSurface() {
122 DCHECK(thread_checker_.CalledOnValidThread());
123 DCHECK(!io_surface_);
126 bool GLImageIOSurface::Initialize(IOSurfaceRef io_surface,
127 GpuMemoryBuffer::Format format) {
128 DCHECK(thread_checker_.CalledOnValidThread());
129 DCHECK(!io_surface_);
131 if (!ValidInternalFormat(internalformat_)) {
132 LOG(ERROR) << "Invalid internalformat: " << internalformat_;
133 return false;
136 if (!ValidFormat(format)) {
137 LOG(ERROR) << "Invalid format: " << format;
138 return false;
141 format_ = format;
142 io_surface_.reset(io_surface, base::scoped_policy::RETAIN);
143 return true;
146 void GLImageIOSurface::Destroy(bool have_context) {
147 DCHECK(thread_checker_.CalledOnValidThread());
148 io_surface_.reset();
151 gfx::Size GLImageIOSurface::GetSize() { return size_; }
153 bool GLImageIOSurface::BindTexImage(unsigned target) {
154 DCHECK(thread_checker_.CalledOnValidThread());
155 if (target != GL_TEXTURE_RECTANGLE_ARB) {
156 // This might be supported in the future. For now, perform strict
157 // validation so we know what's going on.
158 LOG(ERROR) << "IOSurface requires TEXTURE_RECTANGLE_ARB target";
159 return false;
162 CGLContextObj cgl_context =
163 static_cast<CGLContextObj>(GLContext::GetCurrent()->GetHandle());
165 DCHECK(io_surface_);
166 CGLError cgl_error =
167 CGLTexImageIOSurface2D(cgl_context, target, TextureFormat(format_),
168 size_.width(), size_.height(), DataFormat(format_),
169 DataType(format_), io_surface_.get(), 0);
170 if (cgl_error != kCGLNoError) {
171 LOG(ERROR) << "Error in CGLTexImageIOSurface2D";
172 return false;
175 return true;
178 bool GLImageIOSurface::CopyTexImage(unsigned target) {
179 return false;
182 bool GLImageIOSurface::ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
183 int z_order,
184 OverlayTransform transform,
185 const Rect& bounds_rect,
186 const RectF& crop_rect) {
187 return false;
190 } // namespace gfx