// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ui/gl/gl_image_io_surface.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_context.h" // Note that this must be included after gl_bindings.h to avoid conflicts. #include <OpenGL/CGLIOSurface.h> namespace gfx { GLImageIOSurface::GLImageIOSurface(gfx::Size size) : size_(size) {} GLImageIOSurface::~GLImageIOSurface() { Destroy(); } bool GLImageIOSurface::Initialize(gfx::GpuMemoryBufferHandle buffer) { io_surface_.reset(IOSurfaceLookup(buffer.io_surface_id)); if (!io_surface_) { LOG(ERROR) << "IOSurface lookup failed"; return false; } return true; } gfx::Size GLImageIOSurface::GetSize() { return size_; } bool GLImageIOSurface::BindTexImage(unsigned target) { if (target != GL_TEXTURE_RECTANGLE_ARB) { // This might be supported in the future. For now, perform strict // validation so we know what's going on. LOG(ERROR) << "IOSurface requires TEXTURE_RECTANGLE_ARB target"; return false; } CGLContextObj cgl_context = static_cast<CGLContextObj>(GLContext::GetCurrent()->GetHandle()); DCHECK(io_surface_); CGLError cgl_error = CGLTexImageIOSurface2D(cgl_context, target, GL_RGBA, size_.width(), size_.height(), GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, io_surface_.get(), 0); if (cgl_error != kCGLNoError) { LOG(ERROR) << "Error in CGLTexImageIOSurface2D"; return false; } return true; } } // namespace gfx