| Index: ui/gl/gl_image_io_surface.cc
|
| diff --git a/ui/gl/gl_image_io_surface.cc b/ui/gl/gl_image_io_surface.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..49e203af9604d0d7d7acbffaa39b469bbd9e1b83
|
| --- /dev/null
|
| +++ b/ui/gl/gl_image_io_surface.cc
|
| @@ -0,0 +1,85 @@
|
| +// Copyright (c) 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"
|
| +#include "ui/gl/io_surface_support_mac.h"
|
| +
|
| +namespace gfx {
|
| +
|
| +GLImageIOSurface::GLImageIOSurface(gfx::Size size) : size_(size) {
|
| +}
|
| +
|
| +GLImageIOSurface::~GLImageIOSurface() {
|
| + Destroy();
|
| +}
|
| +
|
| +bool GLImageIOSurface::Initialize(gfx::GpuMemoryBufferHandle buffer) {
|
| + IOSurfaceSupport* io_surface_support = IOSurfaceSupport::Initialize();
|
| + if (!io_surface_support) {
|
| + LOG(ERROR) << "IOSurfaces only supported on 10.6.";
|
| + return false;
|
| + }
|
| +
|
| + io_surface_.reset(io_surface_support->IOSurfaceLookup(buffer.io_surface_id));
|
| + if (!io_surface_) {
|
| + LOG(ERROR) << "IOSurface lookup failed";
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void GLImageIOSurface::Destroy() {
|
| +}
|
| +
|
| +gfx::Size GLImageIOSurface::GetSize() {
|
| + return size_;
|
| +}
|
| +
|
| +bool GLImageIOSurface::BindTexImage(unsigned target) {
|
| + IOSurfaceSupport* io_surface_support = IOSurfaceSupport::Initialize();
|
| + DCHECK(io_surface_support);
|
| +
|
| + 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 = io_surface_support->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;
|
| +}
|
| +
|
| +void GLImageIOSurface::ReleaseTexImage(unsigned target) {
|
| +}
|
| +
|
| +void GLImageIOSurface::WillUseTexImage() {
|
| +}
|
| +
|
| +void GLImageIOSurface::DidUseTexImage() {
|
| +}
|
| +
|
| +} // namespace gfx
|
|
|