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>
16 bool ValidInternalFormat(unsigned internalformat
) {
17 switch (internalformat
) {
26 bool ValidFormat(GpuMemoryBuffer::Format format
) {
28 case GpuMemoryBuffer::R_8
:
29 case GpuMemoryBuffer::BGRA_8888
:
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
:
46 GLenum
TextureFormat(GpuMemoryBuffer::Format format
) {
48 case GpuMemoryBuffer::R_8
:
50 case GpuMemoryBuffer::BGRA_8888
:
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
:
68 GLenum
DataFormat(GpuMemoryBuffer::Format format
) {
70 case GpuMemoryBuffer::R_8
:
72 case GpuMemoryBuffer::BGRA_8888
:
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
:
90 GLenum
DataType(GpuMemoryBuffer::Format 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
:
114 GLImageIOSurface::GLImageIOSurface(const gfx::Size
& size
,
115 unsigned internalformat
)
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_
;
136 if (!ValidFormat(format
)) {
137 LOG(ERROR
) << "Invalid format: " << format
;
142 io_surface_
.reset(io_surface
, base::scoped_policy::RETAIN
);
146 void GLImageIOSurface::Destroy(bool have_context
) {
147 DCHECK(thread_checker_
.CalledOnValidThread());
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";
162 CGLContextObj cgl_context
=
163 static_cast<CGLContextObj
>(GLContext::GetCurrent()->GetHandle());
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";
178 bool GLImageIOSurface::CopyTexImage(unsigned target
) {
182 bool GLImageIOSurface::ScheduleOverlayPlane(gfx::AcceleratedWidget widget
,
184 OverlayTransform transform
,
185 const Rect
& bounds_rect
,
186 const RectF
& crop_rect
) {