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

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

Issue 793693003: Tile Compression (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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
« no previous file with comments | « ui/gl/gl_image_memory.h ('k') | ui/gl/gl_image_shared_memory.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
(...skipping 12 matching lines...) Expand all
23 return true; 23 return true;
24 default: 24 default:
25 return false; 25 return false;
26 } 26 }
27 } 27 }
28 28
29 bool ValidFormat(gfx::GpuMemoryBuffer::Format format) { 29 bool ValidFormat(gfx::GpuMemoryBuffer::Format format) {
30 switch (format) { 30 switch (format) {
31 case gfx::GpuMemoryBuffer::RGBA_8888: 31 case gfx::GpuMemoryBuffer::RGBA_8888:
32 case gfx::GpuMemoryBuffer::BGRA_8888: 32 case gfx::GpuMemoryBuffer::BGRA_8888:
33 case gfx::GpuMemoryBuffer::ATC:
34 case gfx::GpuMemoryBuffer::ATCIA:
35 case gfx::GpuMemoryBuffer::DXT1:
36 case gfx::GpuMemoryBuffer::DXT5:
37 case gfx::GpuMemoryBuffer::ETC1:
33 return true; 38 return true;
34 case gfx::GpuMemoryBuffer::RGBX_8888: 39 case gfx::GpuMemoryBuffer::RGBX_8888:
35 return false; 40 return false;
36 } 41 }
37 42
38 NOTREACHED(); 43 NOTREACHED();
39 return false; 44 return false;
40 } 45 }
41 46
47 bool CompressedFormat(gfx::GpuMemoryBuffer::Format format) {
48 switch (format) {
49 case gfx::GpuMemoryBuffer::ATC:
50 case gfx::GpuMemoryBuffer::ATCIA:
51 case gfx::GpuMemoryBuffer::DXT1:
52 case gfx::GpuMemoryBuffer::DXT5:
53 case gfx::GpuMemoryBuffer::ETC1:
54 return true;
55 case gfx::GpuMemoryBuffer::RGBA_8888:
56 case gfx::GpuMemoryBuffer::BGRA_8888:
57 case gfx::GpuMemoryBuffer::RGBX_8888:
58 return false;
59 }
60
61 NOTREACHED();
62 return false;
63 }
64
42 GLenum TextureFormat(gfx::GpuMemoryBuffer::Format format) { 65 GLenum TextureFormat(gfx::GpuMemoryBuffer::Format format) {
43 switch (format) { 66 switch (format) {
44 case gfx::GpuMemoryBuffer::RGBA_8888: 67 case gfx::GpuMemoryBuffer::RGBA_8888:
45 return GL_RGBA; 68 return GL_RGBA;
46 case gfx::GpuMemoryBuffer::BGRA_8888: 69 case gfx::GpuMemoryBuffer::BGRA_8888:
47 return GL_BGRA_EXT; 70 return GL_BGRA_EXT;
48 case gfx::GpuMemoryBuffer::RGBX_8888: 71 case gfx::GpuMemoryBuffer::RGBX_8888:
49 NOTREACHED(); 72 NOTREACHED();
50 return 0; 73 return 0;
74 case gfx::GpuMemoryBuffer::ATC:
75 return GL_ATC_RGB_AMD;
76 case gfx::GpuMemoryBuffer::ATCIA:
77 return GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD;
78 case gfx::GpuMemoryBuffer::DXT1:
79 return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
80 case gfx::GpuMemoryBuffer::DXT5:
81 return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
82 case gfx::GpuMemoryBuffer::ETC1:
83 return GL_ETC1_RGB8_OES;
51 } 84 }
52 85
53 NOTREACHED(); 86 NOTREACHED();
54 return 0; 87 return 0;
55 } 88 }
56 89
57 GLenum DataFormat(gfx::GpuMemoryBuffer::Format format) { 90 GLenum DataFormat(gfx::GpuMemoryBuffer::Format format) {
58 return TextureFormat(format); 91 return TextureFormat(format);
59 } 92 }
60 93
61 GLenum DataType(gfx::GpuMemoryBuffer::Format format) { 94 GLenum DataType(gfx::GpuMemoryBuffer::Format format) {
62 switch (format) { 95 switch (format) {
63 case gfx::GpuMemoryBuffer::RGBA_8888: 96 case gfx::GpuMemoryBuffer::RGBA_8888:
64 case gfx::GpuMemoryBuffer::BGRA_8888: 97 case gfx::GpuMemoryBuffer::BGRA_8888:
65 return GL_UNSIGNED_BYTE; 98 return GL_UNSIGNED_BYTE;
66 case gfx::GpuMemoryBuffer::RGBX_8888: 99 case gfx::GpuMemoryBuffer::RGBX_8888:
100 case gfx::GpuMemoryBuffer::ATC:
101 case gfx::GpuMemoryBuffer::ATCIA:
102 case gfx::GpuMemoryBuffer::DXT1:
103 case gfx::GpuMemoryBuffer::DXT5:
104 case gfx::GpuMemoryBuffer::ETC1:
67 NOTREACHED(); 105 NOTREACHED();
68 return 0; 106 return 0;
69 } 107 }
70 108
71 NOTREACHED(); 109 NOTREACHED();
72 return 0; 110 return 0;
73 } 111 }
74 112
75 } // namespace 113 } // namespace
76 114
(...skipping 16 matching lines...) Expand all
93 131
94 GLImageMemory::~GLImageMemory() { 132 GLImageMemory::~GLImageMemory() {
95 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \ 133 #if defined(OS_WIN) || defined(USE_X11) || defined(OS_ANDROID) || \
96 defined(USE_OZONE) 134 defined(USE_OZONE)
97 DCHECK_EQ(EGL_NO_IMAGE_KHR, egl_image_); 135 DCHECK_EQ(EGL_NO_IMAGE_KHR, egl_image_);
98 DCHECK_EQ(0u, egl_texture_id_); 136 DCHECK_EQ(0u, egl_texture_id_);
99 #endif 137 #endif
100 } 138 }
101 139
102 // static 140 // static
103 size_t GLImageMemory::BytesPerPixel(gfx::GpuMemoryBuffer::Format format) { 141 size_t GLImageMemory::BitsPerPixel(gfx::GpuMemoryBuffer::Format format) {
104 switch (format) { 142 switch (format) {
105 case gfx::GpuMemoryBuffer::RGBA_8888: 143 case gfx::GpuMemoryBuffer::RGBA_8888:
106 case gfx::GpuMemoryBuffer::BGRA_8888: 144 case gfx::GpuMemoryBuffer::BGRA_8888:
107 return 4; 145 return 32;
108 case gfx::GpuMemoryBuffer::RGBX_8888: 146 case gfx::GpuMemoryBuffer::RGBX_8888:
109 NOTREACHED(); 147 NOTREACHED();
110 return 0; 148 return 0;
149 case gfx::GpuMemoryBuffer::ATCIA:
150 case gfx::GpuMemoryBuffer::DXT5:
151 return 8;
152 case gfx::GpuMemoryBuffer::ATC:
153 case gfx::GpuMemoryBuffer::DXT1:
154 case gfx::GpuMemoryBuffer::ETC1:
155 return 4;
111 } 156 }
112 157
113 NOTREACHED(); 158 NOTREACHED();
114 return 0; 159 return 0;
115 } 160 }
116 161
117 bool GLImageMemory::Initialize(const unsigned char* memory, 162 bool GLImageMemory::Initialize(const unsigned char* memory,
118 gfx::GpuMemoryBuffer::Format format) { 163 gfx::GpuMemoryBuffer::Format format) {
119 if (!ValidInternalFormat(internalformat_)) { 164 if (!ValidInternalFormat(internalformat_)) {
120 LOG(ERROR) << "Invalid internalformat: " << internalformat_; 165 LOG(ERROR) << "Invalid internalformat: " << internalformat_;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 } 217 }
173 218
174 bool GLImageMemory::CopyTexImage(unsigned target) { 219 bool GLImageMemory::CopyTexImage(unsigned target) {
175 TRACE_EVENT0("gpu", "GLImageMemory::CopyTexImage"); 220 TRACE_EVENT0("gpu", "GLImageMemory::CopyTexImage");
176 221
177 // GL_TEXTURE_EXTERNAL_OES is not a supported CopyTexImage target. 222 // GL_TEXTURE_EXTERNAL_OES is not a supported CopyTexImage target.
178 if (target == GL_TEXTURE_EXTERNAL_OES) 223 if (target == GL_TEXTURE_EXTERNAL_OES)
179 return false; 224 return false;
180 225
181 DCHECK(memory_); 226 DCHECK(memory_);
182 glTexSubImage2D(target, 0, // level 227
183 0, // x 228 if (CompressedFormat(format_)) {
184 0, // y 229 glCompressedTexSubImage2D(target,
185 size_.width(), size_.height(), DataFormat(format_), 230 0, // mip level
186 DataType(format_), memory_); 231 0, // x-offset
232 0, // y-offset
233 size_.width(), size_.height(),
234 DataFormat(format_), MemoryBytes(format_),
235 memory_);
236 } else {
237 glTexSubImage2D(target, 0, // level
238 0, // x
239 0, // y
240 size_.width(), size_.height(), DataFormat(format_),
241 DataType(format_), memory_);
242 }
187 243
188 return true; 244 return true;
189 } 245 }
190 246
191 void GLImageMemory::WillUseTexImage() { 247 void GLImageMemory::WillUseTexImage() {
192 DCHECK(!in_use_); 248 DCHECK(!in_use_);
193 in_use_ = true; 249 in_use_ = true;
194 250
195 if (!need_do_bind_tex_image_) 251 if (!need_do_bind_tex_image_)
196 return; 252 return;
(...skipping 28 matching lines...) Expand all
225 if (egl_image_ == EGL_NO_IMAGE_KHR) { 281 if (egl_image_ == EGL_NO_IMAGE_KHR) {
226 DCHECK_EQ(0u, egl_texture_id_); 282 DCHECK_EQ(0u, egl_texture_id_);
227 glGenTextures(1, &egl_texture_id_); 283 glGenTextures(1, &egl_texture_id_);
228 284
229 { 285 {
230 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_); 286 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_);
231 287
232 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 288 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
233 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 289 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
234 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 290 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
235 glTexImage2D(GL_TEXTURE_2D, 291
236 0, // mip level 292 if (CompressedFormat(format_)) {
237 TextureFormat(format_), 293 glCompressedTexImage2D(GL_TEXTURE_2D,
238 size_.width(), 294 0, // mip level
239 size_.height(), 295 TextureFormat(format_), size_.width(),
240 0, // border 296 size_.height(),
241 DataFormat(format_), 297 0, // border
242 DataType(format_), 298 MemoryBytes(format_), memory_);
243 memory_); 299 } else {
300 glTexImage2D(GL_TEXTURE_2D,
301 0, // mip level
302 TextureFormat(format_), size_.width(), size_.height(),
303 0, // border
304 DataFormat(format_), DataType(format_), memory_);
305 }
244 } 306 }
245 307
246 EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; 308 EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};
247 // Need to pass current EGL rendering context to eglCreateImageKHR for 309 // Need to pass current EGL rendering context to eglCreateImageKHR for
248 // target type EGL_GL_TEXTURE_2D_KHR. 310 // target type EGL_GL_TEXTURE_2D_KHR.
249 egl_image_ = 311 egl_image_ =
250 eglCreateImageKHR(GLSurfaceEGL::GetHardwareDisplay(), 312 eglCreateImageKHR(GLSurfaceEGL::GetHardwareDisplay(),
251 eglGetCurrentContext(), 313 eglGetCurrentContext(),
252 EGL_GL_TEXTURE_2D_KHR, 314 EGL_GL_TEXTURE_2D_KHR,
253 reinterpret_cast<EGLClientBuffer>(egl_texture_id_), 315 reinterpret_cast<EGLClientBuffer>(egl_texture_id_),
254 attrs); 316 attrs);
255 DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_) 317 DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_)
256 << "Error creating EGLImage: " << eglGetError(); 318 << "Error creating EGLImage: " << eglGetError();
257 } else { 319 } else {
258 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_); 320 ScopedTextureBinder texture_binder(GL_TEXTURE_2D, egl_texture_id_);
259 321
260 glTexSubImage2D(GL_TEXTURE_2D, 322 if (CompressedFormat(format_)) {
261 0, // mip level 323 glCompressedTexSubImage2D(GL_TEXTURE_2D,
262 0, // x-offset 324 0, // mip level
263 0, // y-offset 325 0, // x-offset
264 size_.width(), 326 0, // y-offset
265 size_.height(), 327 size_.width(), size_.height(),
266 DataFormat(format_), 328 DataFormat(format_), MemoryBytes(format_),
267 DataType(format_), 329 memory_);
268 memory_); 330 } else {
331 glTexSubImage2D(GL_TEXTURE_2D,
332 0, // mip level
333 0, // x-offset
334 0, // y-offset
335 size_.width(), size_.height(), DataFormat(format_),
336 DataType(format_), memory_);
337 }
269 } 338 }
270 339
271 glEGLImageTargetTexture2DOES(target, egl_image_); 340 glEGLImageTargetTexture2DOES(target, egl_image_);
272 DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); 341 DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
273 return; 342 return;
274 } 343 }
275 #endif 344 #endif
276 345
277 DCHECK_NE(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), target); 346 DCHECK_NE(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), target);
278 glTexImage2D(target, 347
279 0, // mip level 348 if (CompressedFormat(format_)) {
280 TextureFormat(format_), 349 glCompressedTexImage2D(target,
281 size_.width(), 350 0, // mip level
282 size_.height(), 351 TextureFormat(format_), size_.width(),
283 0, // border 352 size_.height(),
284 DataFormat(format_), 353 0, // border
285 DataType(format_), 354 MemoryBytes(format_), memory_);
286 memory_); 355 } else {
356 glTexImage2D(target,
357 0, // mip level
358 TextureFormat(format_), size_.width(), size_.height(),
359 0, // border
360 DataFormat(format_), DataType(format_), memory_);
361 }
362 }
363
364 size_t GLImageMemory::MemoryBytes(gfx::GpuMemoryBuffer::Format format) {
365 return BitsPerPixel(format_) * size_.width() * size_.height() / 8;
287 } 366 }
288 367
289 } // namespace gfx 368 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gl/gl_image_memory.h ('k') | ui/gl/gl_image_shared_memory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698