Implement nacl_irt_memory for non-sfi mode.
[chromium-blink-merge.git] / ui / gl / gl_image_shm.cc
blob076b1fcb79379acb8e21d8fa2481d645500e4179
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.
5 #include "ui/gl/gl_image_shm.h"
7 #include "base/debug/trace_event.h"
8 #include "base/process/process_handle.h"
9 #include "ui/gl/gl_bindings.h"
11 namespace gfx {
13 namespace {
15 bool ValidFormat(unsigned internalformat) {
16 switch (internalformat) {
17 case GL_BGRA8_EXT:
18 case GL_RGBA8_OES:
19 return true;
20 default:
21 return false;
25 GLenum TextureFormat(unsigned internalformat) {
26 switch (internalformat) {
27 case GL_BGRA8_EXT:
28 return GL_BGRA_EXT;
29 case GL_RGBA8_OES:
30 return GL_RGBA;
31 default:
32 NOTREACHED();
33 return 0;
37 GLenum DataFormat(unsigned internalformat) {
38 return TextureFormat(internalformat);
41 GLenum DataType(unsigned internalformat) {
42 switch (internalformat) {
43 case GL_BGRA8_EXT:
44 case GL_RGBA8_OES:
45 return GL_UNSIGNED_BYTE;
46 default:
47 NOTREACHED();
48 return 0;
52 GLenum BytesPerPixel(unsigned internalformat) {
53 switch (internalformat) {
54 case GL_BGRA8_EXT:
55 case GL_RGBA8_OES:
56 return 4;
57 default:
58 NOTREACHED();
59 return 0;
63 } // namespace
65 GLImageShm::GLImageShm(gfx::Size size, unsigned internalformat)
66 : size_(size),
67 internalformat_(internalformat) {
70 GLImageShm::~GLImageShm() {
71 Destroy();
74 bool GLImageShm::Initialize(gfx::GpuMemoryBufferHandle buffer) {
75 if (!ValidFormat(internalformat_)) {
76 DVLOG(0) << "Invalid format: " << internalformat_;
77 return false;
80 if (!base::SharedMemory::IsHandleValid(buffer.handle))
81 return false;
83 base::SharedMemory shared_memory(buffer.handle, true);
85 // Duplicate the handle.
86 base::SharedMemoryHandle duped_shared_memory_handle;
87 if (!shared_memory.ShareToProcess(base::GetCurrentProcessHandle(),
88 &duped_shared_memory_handle)) {
89 DVLOG(0) << "Failed to duplicate shared memory handle.";
90 return false;
93 shared_memory_.reset(
94 new base::SharedMemory(duped_shared_memory_handle, true));
95 return true;
98 void GLImageShm::Destroy() {
101 gfx::Size GLImageShm::GetSize() {
102 return size_;
105 bool GLImageShm::BindTexImage(unsigned target) {
106 TRACE_EVENT0("gpu", "GLImageShm::BindTexImage");
107 DCHECK(shared_memory_);
108 DCHECK(ValidFormat(internalformat_));
110 size_t size = size_.GetArea() * BytesPerPixel(internalformat_);
111 DCHECK(!shared_memory_->memory());
112 if (!shared_memory_->Map(size)) {
113 DVLOG(0) << "Failed to map shared memory.";
114 return false;
117 DCHECK(shared_memory_->memory());
118 glTexImage2D(target,
119 0, // mip level
120 TextureFormat(internalformat_),
121 size_.width(),
122 size_.height(),
123 0, // border
124 DataFormat(internalformat_),
125 DataType(internalformat_),
126 shared_memory_->memory());
128 shared_memory_->Unmap();
129 return true;
132 void GLImageShm::ReleaseTexImage(unsigned target) {
135 void GLImageShm::WillUseTexImage() {
138 void GLImageShm::DidUseTexImage() {
141 } // namespace gfx