Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1166)

Side by Side Diff: ui/gl/gl_image_memory.cc

Issue 634083002: gpu: Compositor management of GpuMemoryBuffer instances. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@cc-pre-chromium-image-refactor
Patch Set: mac build fix Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/gl/gl_image_memory.h" 5 #include "ui/gl/gl_image_memory.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "ui/gl/gl_bindings.h" 9 #include "ui/gl/gl_bindings.h"
10 #include "ui/gl/scoped_binders.h" 10 #include "ui/gl/scoped_binders.h"
11 11
12 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \ 12 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
13 defined(USE_OZONE) 13 defined(USE_OZONE)
14 #include "ui/gl/gl_surface_egl.h" 14 #include "ui/gl/gl_surface_egl.h"
15 #endif 15 #endif
16 16
17 namespace gfx { 17 namespace gfx {
18 namespace { 18 namespace {
19 19
20 bool ValidFormat(unsigned internalformat) { 20 bool ValidInternalFormat(unsigned internalformat) {
21 switch (internalformat) { 21 switch (internalformat) {
22 case GL_BGRA8_EXT: 22 case GL_RGBA:
23 case GL_RGBA8_OES:
24 return true; 23 return true;
25 default: 24 default:
26 return false; 25 return false;
27 } 26 }
28 } 27 }
29 28
30 GLenum TextureFormat(unsigned internalformat) { 29 GLenum TextureFormat(gfx::GpuMemoryBuffer::Format format) {
31 switch (internalformat) { 30 switch (format) {
32 case GL_BGRA8_EXT: 31 case gfx::GpuMemoryBuffer::RGBA_8888:
32 return GL_RGBA;
33 case gfx::GpuMemoryBuffer::BGRA_8888:
33 return GL_BGRA_EXT; 34 return GL_BGRA_EXT;
34 case GL_RGBA8_OES: 35 case gfx::GpuMemoryBuffer::RGBX_8888:
piman 2014/10/09 21:33:02 I may have missed it (this patch is big), but what
reveman 2014/10/10 02:20:16 Nice catch. GpuMemoryBufferImplSharedMemory will n
35 return GL_RGBA; 36 break;
36 default:
37 NOTREACHED();
38 return 0;
39 } 37 }
38
39 NOTREACHED();
40 return 0;
40 } 41 }
41 42
42 GLenum DataFormat(unsigned internalformat) { 43 GLenum DataFormat(gfx::GpuMemoryBuffer::Format format) {
43 return TextureFormat(internalformat); 44 return TextureFormat(format);
44 } 45 }
45 46
46 GLenum DataType(unsigned internalformat) { 47 GLenum DataType(gfx::GpuMemoryBuffer::Format format) {
47 switch (internalformat) { 48 switch (format) {
48 case GL_BGRA8_EXT: 49 case gfx::GpuMemoryBuffer::RGBA_8888:
49 case GL_RGBA8_OES: 50 case gfx::GpuMemoryBuffer::BGRA_8888:
50 return GL_UNSIGNED_BYTE; 51 return GL_UNSIGNED_BYTE;
51 default: 52 case gfx::GpuMemoryBuffer::RGBX_8888:
52 NOTREACHED(); 53 break;
53 return 0;
54 } 54 }
55 }
56 55
57 int BytesPerPixel(unsigned internalformat) { 56 NOTREACHED();
58 switch (internalformat) { 57 return 0;
59 case GL_BGRA8_EXT:
60 case GL_RGBA8_OES:
61 return 4;
62 default:
63 NOTREACHED();
64 return 0;
65 }
66 } 58 }
67 59
68 } // namespace 60 } // namespace
69 61
70 GLImageMemory::GLImageMemory(const gfx::Size& size, unsigned internalformat) 62 GLImageMemory::GLImageMemory(const gfx::Size& size, unsigned internalformat)
71 : memory_(NULL), 63 : size_(size),
72 size_(size),
73 internalformat_(internalformat), 64 internalformat_(internalformat),
65 memory_(NULL),
66 format_(gfx::GpuMemoryBuffer::RGBA_8888),
74 in_use_(false), 67 in_use_(false),
75 target_(0), 68 target_(0),
76 need_do_bind_tex_image_(false) 69 need_do_bind_tex_image_(false)
77 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \ 70 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
78 defined(USE_OZONE) 71 defined(USE_OZONE)
79 , 72 ,
80 egl_texture_id_(0u), 73 egl_texture_id_(0u),
81 egl_image_(EGL_NO_IMAGE_KHR) 74 egl_image_(EGL_NO_IMAGE_KHR)
82 #endif 75 #endif
83 { 76 {
84 } 77 }
85 78
86 GLImageMemory::~GLImageMemory() { 79 GLImageMemory::~GLImageMemory() {
87 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \ 80 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
88 defined(USE_OZONE) 81 defined(USE_OZONE)
89 DCHECK_EQ(EGL_NO_IMAGE_KHR, egl_image_); 82 DCHECK_EQ(EGL_NO_IMAGE_KHR, egl_image_);
90 DCHECK_EQ(0u, egl_texture_id_); 83 DCHECK_EQ(0u, egl_texture_id_);
91 #endif 84 #endif
92 } 85 }
93 86
94 bool GLImageMemory::Initialize(const unsigned char* memory) { 87 // static
95 if (!ValidFormat(internalformat_)) { 88 size_t GLImageMemory::BytesPerPixel(gfx::GpuMemoryBuffer::Format format) {
96 DVLOG(0) << "Invalid format: " << internalformat_; 89 switch (format) {
90 case gfx::GpuMemoryBuffer::RGBA_8888:
91 case gfx::GpuMemoryBuffer::BGRA_8888:
92 return 4;
93 case gfx::GpuMemoryBuffer::RGBX_8888:
94 break;
95 }
96
97 NOTREACHED();
98 return 0;
99 }
100
101 bool GLImageMemory::Initialize(const unsigned char* memory,
102 gfx::GpuMemoryBuffer::Format format) {
103 if (!ValidInternalFormat(internalformat_)) {
104 DVLOG(0) << "Invalid internalformat: " << internalformat_;
97 return false; 105 return false;
98 } 106 }
99 107
100 DCHECK(memory); 108 DCHECK(memory);
101 DCHECK(!memory_); 109 DCHECK(!memory_);
102 memory_ = memory; 110 memory_ = memory;
111 format_ = format;
103 return true; 112 return true;
104 } 113 }
105 114
106 void GLImageMemory::Destroy(bool have_context) { 115 void GLImageMemory::Destroy(bool have_context) {
107 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \ 116 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
108 defined(USE_OZONE) 117 defined(USE_OZONE)
109 if (egl_image_ != EGL_NO_IMAGE_KHR) { 118 if (egl_image_ != EGL_NO_IMAGE_KHR) {
110 eglDestroyImageKHR(GLSurfaceEGL::GetHardwareDisplay(), egl_image_); 119 eglDestroyImageKHR(GLSurfaceEGL::GetHardwareDisplay(), egl_image_);
111 egl_image_ = EGL_NO_IMAGE_KHR; 120 egl_image_ = EGL_NO_IMAGE_KHR;
112 } 121 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 bool GLImageMemory::CopyTexImage(unsigned target) { 153 bool GLImageMemory::CopyTexImage(unsigned target) {
145 TRACE_EVENT0("gpu", "GLImageMemory::CopyTexImage"); 154 TRACE_EVENT0("gpu", "GLImageMemory::CopyTexImage");
146 155
147 // GL_TEXTURE_EXTERNAL_OES is not a supported CopyTexImage target. 156 // GL_TEXTURE_EXTERNAL_OES is not a supported CopyTexImage target.
148 if (target == GL_TEXTURE_EXTERNAL_OES) 157 if (target == GL_TEXTURE_EXTERNAL_OES)
149 return false; 158 return false;
150 159
151 DCHECK(memory_); 160 DCHECK(memory_);
152 glTexImage2D(target, 161 glTexImage2D(target,
153 0, // mip level 162 0, // mip level
154 TextureFormat(internalformat_), 163 TextureFormat(format_),
155 size_.width(), 164 size_.width(),
156 size_.height(), 165 size_.height(),
157 0, // border 166 0, // border
158 DataFormat(internalformat_), 167 DataFormat(format_),
159 DataType(internalformat_), 168 DataType(format_),
160 memory_); 169 memory_);
161 170
162 return true; 171 return true;
163 } 172 }
164 173
165 void GLImageMemory::WillUseTexImage() { 174 void GLImageMemory::WillUseTexImage() {
166 DCHECK(!in_use_); 175 DCHECK(!in_use_);
167 in_use_ = true; 176 in_use_ = true;
168 177
169 if (!need_do_bind_tex_image_) 178 if (!need_do_bind_tex_image_)
170 return; 179 return;
171 180
172 DCHECK(target_); 181 DCHECK(target_);
173 DoBindTexImage(target_); 182 DoBindTexImage(target_);
174 } 183 }
175 184
176 void GLImageMemory::DidUseTexImage() { 185 void GLImageMemory::DidUseTexImage() {
177 DCHECK(in_use_); 186 DCHECK(in_use_);
178 in_use_ = false; 187 in_use_ = false;
179 } 188 }
180 189
181 bool GLImageMemory::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, 190 bool GLImageMemory::ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
182 int z_order, 191 int z_order,
183 OverlayTransform transform, 192 OverlayTransform transform,
184 const Rect& bounds_rect, 193 const Rect& bounds_rect,
185 const RectF& crop_rect) { 194 const RectF& crop_rect) {
186 return false; 195 return false;
187 } 196 }
188 197
189 bool GLImageMemory::HasValidFormat() const {
190 return ValidFormat(internalformat_);
191 }
192
193 size_t GLImageMemory::Bytes() const {
194 return size_.GetArea() * BytesPerPixel(internalformat_);
195 }
196
197 void GLImageMemory::DoBindTexImage(unsigned target) { 198 void GLImageMemory::DoBindTexImage(unsigned target) {
198 TRACE_EVENT0("gpu", "GLImageMemory::DoBindTexImage"); 199 TRACE_EVENT0("gpu", "GLImageMemory::DoBindTexImage");
199 200
200 DCHECK(need_do_bind_tex_image_); 201 DCHECK(need_do_bind_tex_image_);
201 need_do_bind_tex_image_ = false; 202 need_do_bind_tex_image_ = false;
202 203
203 DCHECK(memory_); 204 DCHECK(memory_);
204 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \ 205 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
205 defined(USE_OZONE) 206 defined(USE_OZONE)
206 if (target == GL_TEXTURE_EXTERNAL_OES) { 207 if (target == GL_TEXTURE_EXTERNAL_OES) {
207 if (egl_image_ == EGL_NO_IMAGE_KHR) { 208 if (egl_image_ == EGL_NO_IMAGE_KHR) {
208 DCHECK_EQ(0u, egl_texture_id_); 209 DCHECK_EQ(0u, egl_texture_id_);
209 glGenTextures(1, &egl_texture_id_); 210 glGenTextures(1, &egl_texture_id_);
210 211
211 { 212 {
212 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_); 213 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_);
213 214
214 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 215 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
215 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 216 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
216 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 217 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
217 glTexImage2D(GL_TEXTURE_2D, 218 glTexImage2D(GL_TEXTURE_2D,
218 0, // mip level 219 0, // mip level
219 TextureFormat(internalformat_), 220 TextureFormat(format_),
220 size_.width(), 221 size_.width(),
221 size_.height(), 222 size_.height(),
222 0, // border 223 0, // border
223 DataFormat(internalformat_), 224 DataFormat(format_),
224 DataType(internalformat_), 225 DataType(format_),
225 memory_); 226 memory_);
226 } 227 }
227 228
228 EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; 229 EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
229 // Need to pass current EGL rendering context to eglCreateImageKHR for 230 // Need to pass current EGL rendering context to eglCreateImageKHR for
230 // target type EGL_GL_TEXTURE_2D_KHR. 231 // target type EGL_GL_TEXTURE_2D_KHR.
231 egl_image_ = 232 egl_image_ =
232 eglCreateImageKHR(GLSurfaceEGL::GetHardwareDisplay(), 233 eglCreateImageKHR(GLSurfaceEGL::GetHardwareDisplay(),
233 eglGetCurrentContext(), 234 eglGetCurrentContext(),
234 EGL_GL_TEXTURE_2D_KHR, 235 EGL_GL_TEXTURE_2D_KHR,
235 reinterpret_cast<EGLClientBuffer>(egl_texture_id_), 236 reinterpret_cast<EGLClientBuffer>(egl_texture_id_),
236 attrs); 237 attrs);
237 DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_) 238 DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_)
238 << "Error creating EGLImage: " << eglGetError(); 239 << "Error creating EGLImage: " << eglGetError();
239 } else { 240 } else {
240 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_); 241 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_);
241 242
242 glTexSubImage2D(GL_TEXTURE_2D, 243 glTexSubImage2D(GL_TEXTURE_2D,
243 0, // mip level 244 0, // mip level
244 0, // x-offset 245 0, // x-offset
245 0, // y-offset 246 0, // y-offset
246 size_.width(), 247 size_.width(),
247 size_.height(), 248 size_.height(),
248 DataFormat(internalformat_), 249 DataFormat(format_),
249 DataType(internalformat_), 250 DataType(format_),
250 memory_); 251 memory_);
251 } 252 }
252 253
253 glEGLImageTargetTexture2DOES(target, egl_image_); 254 glEGLImageTargetTexture2DOES(target, egl_image_);
254 DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 255 DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
255 return; 256 return;
256 } 257 }
257 #endif 258 #endif
258 259
259 DCHECK_NE(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), target); 260 DCHECK_NE(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), target);
260 glTexImage2D(target, 261 glTexImage2D(target,
261 0, // mip level 262 0, // mip level
262 TextureFormat(internalformat_), 263 TextureFormat(format_),
263 size_.width(), 264 size_.width(),
264 size_.height(), 265 size_.height(),
265 0, // border 266 0, // border
266 DataFormat(internalformat_), 267 DataFormat(format_),
267 DataType(internalformat_), 268 DataType(format_),
268 memory_); 269 memory_);
269 } 270 }
270 271
271 } // namespace gfx 272 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698