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 GLImageIOSurface(gfx::Size size)15GLImageIOSurface::GLImageIOSurface(gfx::Size size) 16 : size_(size) {} 17 ~GLImageIOSurface()18GLImageIOSurface::~GLImageIOSurface() { Destroy(); } 19 Initialize(gfx::GpuMemoryBufferHandle buffer)20bool GLImageIOSurface::Initialize(gfx::GpuMemoryBufferHandle buffer) { 21 io_surface_.reset(IOSurfaceLookup(buffer.io_surface_id)); 22 if (!io_surface_) { 23 LOG(ERROR) << "IOSurface lookup failed"; 24 return false; 25 } 26 27 return true; 28 } 29 GetSize()30gfx::Size GLImageIOSurface::GetSize() { return size_; } 31 BindTexImage(unsigned target)32bool GLImageIOSurface::BindTexImage(unsigned target) { 33 if (target != GL_TEXTURE_RECTANGLE_ARB) { 34 // This might be supported in the future. For now, perform strict 35 // validation so we know what's going on. 36 LOG(ERROR) << "IOSurface requires TEXTURE_RECTANGLE_ARB target"; 37 return false; 38 } 39 40 CGLContextObj cgl_context = 41 static_cast<CGLContextObj>(GLContext::GetCurrent()->GetHandle()); 42 43 DCHECK(io_surface_); 44 CGLError cgl_error = CGLTexImageIOSurface2D(cgl_context, 45 target, 46 GL_RGBA, 47 size_.width(), 48 size_.height(), 49 GL_BGRA, 50 GL_UNSIGNED_INT_8_8_8_8_REV, 51 io_surface_.get(), 52 0); 53 if (cgl_error != kCGLNoError) { 54 LOG(ERROR) << "Error in CGLTexImageIOSurface2D"; 55 return false; 56 } 57 58 return true; 59 } 60 61 } // namespace gfx 62