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..3efcfd58a3c207739d24ed024f59de8232ab4cb8 |
--- /dev/null |
+++ b/ui/gl/gl_image_io_surface.cc |
@@ -0,0 +1,79 @@ |
+// 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) |
+ : io_surface_support_(IOSurfaceSupport::Initialize()), |
+ size_(size) { |
+ CHECK(io_surface_support_); |
+} |
+ |
+GLImageIOSurface::~GLImageIOSurface() { |
+ Destroy(); |
+} |
+ |
+bool GLImageIOSurface::Initialize(gfx::GpuMemoryBufferHandle buffer) { |
+ 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) { |
+ 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 |