| OLD | NEW |
| (Empty) |
| 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. | |
| 4 | |
| 5 #include "ui/gl/gl_image_io_surface.h" | |
| 6 | |
| 7 #include "ui/gl/gl_bindings.h" | |
| 8 #include "ui/gl/gl_context.h" | |
| 9 | |
| 10 // Note that this must be included after gl_bindings.h to avoid conflicts. | |
| 11 #include <OpenGL/CGLIOSurface.h> | |
| 12 | |
| 13 namespace gfx { | |
| 14 namespace { | |
| 15 | |
| 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; | |
| 23 } | |
| 24 } | |
| 25 | |
| 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_4444: | |
| 37 case GpuMemoryBuffer::RGBA_8888: | |
| 38 case GpuMemoryBuffer::RGBX_8888: | |
| 39 case GpuMemoryBuffer::YUV_420: | |
| 40 return false; | |
| 41 } | |
| 42 | |
| 43 NOTREACHED(); | |
| 44 return false; | |
| 45 } | |
| 46 | |
| 47 GLenum TextureFormat(GpuMemoryBuffer::Format format) { | |
| 48 switch (format) { | |
| 49 case GpuMemoryBuffer::R_8: | |
| 50 return GL_RED; | |
| 51 case GpuMemoryBuffer::BGRA_8888: | |
| 52 return GL_RGBA; | |
| 53 case GpuMemoryBuffer::ATC: | |
| 54 case GpuMemoryBuffer::ATCIA: | |
| 55 case GpuMemoryBuffer::DXT1: | |
| 56 case GpuMemoryBuffer::DXT5: | |
| 57 case GpuMemoryBuffer::ETC1: | |
| 58 case GpuMemoryBuffer::RGBA_4444: | |
| 59 case GpuMemoryBuffer::RGBA_8888: | |
| 60 case GpuMemoryBuffer::RGBX_8888: | |
| 61 case GpuMemoryBuffer::YUV_420: | |
| 62 NOTREACHED(); | |
| 63 return 0; | |
| 64 } | |
| 65 | |
| 66 NOTREACHED(); | |
| 67 return 0; | |
| 68 } | |
| 69 | |
| 70 GLenum DataFormat(GpuMemoryBuffer::Format format) { | |
| 71 switch (format) { | |
| 72 case GpuMemoryBuffer::R_8: | |
| 73 return GL_RED; | |
| 74 case GpuMemoryBuffer::BGRA_8888: | |
| 75 return GL_BGRA; | |
| 76 case GpuMemoryBuffer::ATC: | |
| 77 case GpuMemoryBuffer::ATCIA: | |
| 78 case GpuMemoryBuffer::DXT1: | |
| 79 case GpuMemoryBuffer::DXT5: | |
| 80 case GpuMemoryBuffer::ETC1: | |
| 81 case GpuMemoryBuffer::RGBA_4444: | |
| 82 case GpuMemoryBuffer::RGBA_8888: | |
| 83 case GpuMemoryBuffer::RGBX_8888: | |
| 84 case GpuMemoryBuffer::YUV_420: | |
| 85 NOTREACHED(); | |
| 86 return 0; | |
| 87 } | |
| 88 | |
| 89 NOTREACHED(); | |
| 90 return 0; | |
| 91 } | |
| 92 | |
| 93 GLenum DataType(GpuMemoryBuffer::Format format) { | |
| 94 switch (format) { | |
| 95 case GpuMemoryBuffer::R_8: | |
| 96 return GL_UNSIGNED_BYTE; | |
| 97 case GpuMemoryBuffer::BGRA_8888: | |
| 98 return GL_UNSIGNED_INT_8_8_8_8_REV; | |
| 99 case GpuMemoryBuffer::ATC: | |
| 100 case GpuMemoryBuffer::ATCIA: | |
| 101 case GpuMemoryBuffer::DXT1: | |
| 102 case GpuMemoryBuffer::DXT5: | |
| 103 case GpuMemoryBuffer::ETC1: | |
| 104 case GpuMemoryBuffer::RGBA_4444: | |
| 105 case GpuMemoryBuffer::RGBA_8888: | |
| 106 case GpuMemoryBuffer::RGBX_8888: | |
| 107 case GpuMemoryBuffer::YUV_420: | |
| 108 NOTREACHED(); | |
| 109 return 0; | |
| 110 } | |
| 111 | |
| 112 NOTREACHED(); | |
| 113 return 0; | |
| 114 } | |
| 115 | |
| 116 } // namespace | |
| 117 | |
| 118 GLImageIOSurface::GLImageIOSurface(const gfx::Size& size, | |
| 119 unsigned internalformat) | |
| 120 : size_(size), | |
| 121 internalformat_(internalformat), | |
| 122 format_(GpuMemoryBuffer::RGBA_8888) { | |
| 123 } | |
| 124 | |
| 125 GLImageIOSurface::~GLImageIOSurface() { | |
| 126 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 127 DCHECK(!io_surface_); | |
| 128 } | |
| 129 | |
| 130 bool GLImageIOSurface::Initialize(IOSurfaceRef io_surface, | |
| 131 GpuMemoryBuffer::Format format) { | |
| 132 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 133 DCHECK(!io_surface_); | |
| 134 | |
| 135 if (!ValidInternalFormat(internalformat_)) { | |
| 136 LOG(ERROR) << "Invalid internalformat: " << internalformat_; | |
| 137 return false; | |
| 138 } | |
| 139 | |
| 140 if (!ValidFormat(format)) { | |
| 141 LOG(ERROR) << "Invalid format: " << format; | |
| 142 return false; | |
| 143 } | |
| 144 | |
| 145 format_ = format; | |
| 146 io_surface_.reset(io_surface, base::scoped_policy::RETAIN); | |
| 147 return true; | |
| 148 } | |
| 149 | |
| 150 void GLImageIOSurface::Destroy(bool have_context) { | |
| 151 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 152 io_surface_.reset(); | |
| 153 } | |
| 154 | |
| 155 gfx::Size GLImageIOSurface::GetSize() { return size_; } | |
| 156 | |
| 157 unsigned GLImageIOSurface::GetInternalFormat() { return internalformat_; } | |
| 158 | |
| 159 bool GLImageIOSurface::BindTexImage(unsigned target) { | |
| 160 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 161 if (target != GL_TEXTURE_RECTANGLE_ARB) { | |
| 162 // This might be supported in the future. For now, perform strict | |
| 163 // validation so we know what's going on. | |
| 164 LOG(ERROR) << "IOSurface requires TEXTURE_RECTANGLE_ARB target"; | |
| 165 return false; | |
| 166 } | |
| 167 | |
| 168 CGLContextObj cgl_context = | |
| 169 static_cast<CGLContextObj>(GLContext::GetCurrent()->GetHandle()); | |
| 170 | |
| 171 DCHECK(io_surface_); | |
| 172 CGLError cgl_error = | |
| 173 CGLTexImageIOSurface2D(cgl_context, target, TextureFormat(format_), | |
| 174 size_.width(), size_.height(), DataFormat(format_), | |
| 175 DataType(format_), io_surface_.get(), 0); | |
| 176 if (cgl_error != kCGLNoError) { | |
| 177 LOG(ERROR) << "Error in CGLTexImageIOSurface2D"; | |
| 178 return false; | |
| 179 } | |
| 180 | |
| 181 return true; | |
| 182 } | |
| 183 | |
| 184 bool GLImageIOSurface::CopyTexSubImage(unsigned target, | |
| 185 const Point& offset, | |
| 186 const Rect& rect) { | |
| 187 return false; | |
| 188 } | |
| 189 | |
| 190 bool GLImageIOSurface::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, | |
| 191 int z_order, | |
| 192 OverlayTransform transform, | |
| 193 const Rect& bounds_rect, | |
| 194 const RectF& crop_rect) { | |
| 195 return false; | |
| 196 } | |
| 197 | |
| 198 } // namespace gfx | |
| OLD | NEW |