Index: ui/gl/gl_image_shm.cc |
diff --git a/ui/gl/gl_image_shm.cc b/ui/gl/gl_image_shm.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..835fb7ac64d05e974520b45c041c09e3d675ee97 |
--- /dev/null |
+++ b/ui/gl/gl_image_shm.cc |
@@ -0,0 +1,76 @@ |
+// 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_shm.h" |
+ |
+#include "base/debug/trace_event.h" |
+#include "base/process_util.h" |
+#include "ui/gl/gl_bindings.h" |
+ |
+namespace gfx { |
+ |
+GLImageShm::GLImageShm(gfx::Size size) : size_(size) { |
+} |
+ |
+GLImageShm::~GLImageShm() { |
+ Destroy(); |
+} |
+ |
+bool GLImageShm::Initialize(gfx::GpuMemoryBufferHandle buffer) { |
+ if (!base::SharedMemory::IsHandleValid(buffer.handle)) |
+ return false; |
+ |
+ base::SharedMemory shared_memory(buffer.handle, true); |
+ |
+ // Duplicate the handle. |
+ base::SharedMemoryHandle duped_shared_memory_handle; |
+ if (!shared_memory.ShareToProcess(base::GetCurrentProcessHandle(), |
+ &duped_shared_memory_handle)) { |
+ DVLOG(0) << "Failed to duplicate shared memory handle."; |
+ return false; |
+ } |
+ |
+ shared_memory_.reset( |
+ new base::SharedMemory(duped_shared_memory_handle, true)); |
+ return true; |
+} |
+ |
+bool GLImageShm::BindTexImage() { |
+ TRACE_EVENT0("gpu", "GLImageShm::BindTexImage"); |
+ DCHECK(shared_memory_); |
+ |
+ const int kBytesPerPixel = 4; |
+ size_t size = size_.GetArea() * kBytesPerPixel; |
+ DCHECK(!shared_memory_->memory()); |
+ if (!shared_memory_->Map(size)) { |
+ DVLOG(0) << "Failed to map shared memory."; |
+ return false; |
+ } |
+ |
+ DCHECK(shared_memory_->memory()); |
+ glTexImage2D(GL_TEXTURE_2D, |
+ 0, // mip level |
+ GL_RGBA8_OES, |
+ size_.width(), |
+ size_.height(), |
+ 0, // border |
+ GL_BGRA, |
+ GL_UNSIGNED_BYTE, |
+ shared_memory_->memory()); |
+ |
+ shared_memory_->Unmap(); |
+ return true; |
+} |
+ |
+gfx::Size GLImageShm::GetSize() { |
+ return size_; |
+} |
+ |
+void GLImageShm::Destroy() { |
+} |
+ |
+void GLImageShm::ReleaseTexImage() { |
+} |
+ |
+} // namespace gfx |