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

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

Issue 1431333002: Revert of Re-land: ui: Add custom stride support to GLImageMemory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month 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_ref_counted_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/logging.h" 7 #include "base/logging.h"
8 #include "base/numerics/safe_conversions.h"
9 #include "base/trace_event/trace_event.h" 8 #include "base/trace_event/trace_event.h"
10 #include "ui/gfx/buffer_format_util.h" 9 #include "ui/gfx/buffer_format_util.h"
11 #include "ui/gl/gl_bindings.h" 10 #include "ui/gl/gl_bindings.h"
12 #include "ui/gl/gl_context.h" 11 #include "ui/gl/gl_context.h"
13 #include "ui/gl/gl_version_info.h" 12 #include "ui/gl/gl_version_info.h"
14 13
15 using gfx::BufferFormat; 14 using gfx::BufferFormat;
16 15
17 namespace gl { 16 namespace gl {
18 namespace { 17 namespace {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 case BufferFormat::DXT1: 64 case BufferFormat::DXT1:
66 case BufferFormat::DXT5: 65 case BufferFormat::DXT5:
67 case BufferFormat::ETC1: 66 case BufferFormat::ETC1:
68 return true; 67 return true;
69 case BufferFormat::R_8: 68 case BufferFormat::R_8:
70 case BufferFormat::RGBA_4444: 69 case BufferFormat::RGBA_4444:
71 case BufferFormat::RGBX_8888: 70 case BufferFormat::RGBX_8888:
72 case BufferFormat::RGBA_8888: 71 case BufferFormat::RGBA_8888:
73 case BufferFormat::BGRX_8888: 72 case BufferFormat::BGRX_8888:
74 case BufferFormat::BGRA_8888: 73 case BufferFormat::BGRA_8888:
75 return false;
76 case BufferFormat::YUV_420: 74 case BufferFormat::YUV_420:
77 case BufferFormat::YUV_420_BIPLANAR: 75 case BufferFormat::YUV_420_BIPLANAR:
78 case BufferFormat::UYVY_422: 76 case BufferFormat::UYVY_422:
79 NOTREACHED();
80 return false; 77 return false;
81 } 78 }
82 79
83 NOTREACHED(); 80 NOTREACHED();
84 return false; 81 return false;
85 } 82 }
86 83
87 GLenum TextureFormat(BufferFormat format) { 84 GLenum TextureFormat(BufferFormat format) {
88 switch (format) { 85 switch (format) {
89 case BufferFormat::ATC: 86 case BufferFormat::ATC:
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 return GL_BGRA_EXT; 122 return GL_BGRA_EXT;
126 case BufferFormat::RGBA_4444: 123 case BufferFormat::RGBA_4444:
127 case BufferFormat::RGBA_8888: 124 case BufferFormat::RGBA_8888:
128 case BufferFormat::BGRA_8888: 125 case BufferFormat::BGRA_8888:
129 case BufferFormat::R_8: 126 case BufferFormat::R_8:
130 case BufferFormat::ATC: 127 case BufferFormat::ATC:
131 case BufferFormat::ATCIA: 128 case BufferFormat::ATCIA:
132 case BufferFormat::DXT1: 129 case BufferFormat::DXT1:
133 case BufferFormat::DXT5: 130 case BufferFormat::DXT5:
134 case BufferFormat::ETC1: 131 case BufferFormat::ETC1:
135 return TextureFormat(format);
136 case BufferFormat::YUV_420: 132 case BufferFormat::YUV_420:
137 case BufferFormat::YUV_420_BIPLANAR: 133 case BufferFormat::YUV_420_BIPLANAR:
138 case BufferFormat::UYVY_422: 134 case BufferFormat::UYVY_422:
139 NOTREACHED(); 135 return TextureFormat(format);
140 return 0;
141 } 136 }
142 137
143 NOTREACHED(); 138 NOTREACHED();
144 return 0; 139 return 0;
145 } 140 }
146 141
147 GLenum DataType(BufferFormat format) { 142 GLenum DataType(BufferFormat format) {
148 switch (format) { 143 switch (format) {
149 case BufferFormat::RGBA_4444: 144 case BufferFormat::RGBA_4444:
150 return GL_UNSIGNED_SHORT_4_4_4_4; 145 return GL_UNSIGNED_SHORT_4_4_4_4;
151 case BufferFormat::RGBX_8888: 146 case BufferFormat::RGBX_8888:
152 case BufferFormat::RGBA_8888: 147 case BufferFormat::RGBA_8888:
153 case BufferFormat::BGRX_8888: 148 case BufferFormat::BGRX_8888:
154 case BufferFormat::BGRA_8888: 149 case BufferFormat::BGRA_8888:
155 case BufferFormat::R_8: 150 case BufferFormat::R_8:
156 return GL_UNSIGNED_BYTE; 151 return GL_UNSIGNED_BYTE;
157 case BufferFormat::ATC: 152 case BufferFormat::ATC:
158 case BufferFormat::ATCIA: 153 case BufferFormat::ATCIA:
159 case BufferFormat::DXT1: 154 case BufferFormat::DXT1:
160 case BufferFormat::DXT5:
161 case BufferFormat::ETC1:
162 case BufferFormat::YUV_420:
163 case BufferFormat::YUV_420_BIPLANAR:
164 case BufferFormat::UYVY_422:
165 NOTREACHED();
166 return 0;
167 }
168
169 NOTREACHED();
170 return 0;
171 }
172
173 GLint DataRowLength(size_t stride, BufferFormat format) {
174 switch (format) {
175 case BufferFormat::RGBA_4444:
176 return base::checked_cast<GLint>(stride) / 2;
177 case BufferFormat::RGBX_8888:
178 case BufferFormat::RGBA_8888:
179 case BufferFormat::BGRX_8888:
180 case BufferFormat::BGRA_8888:
181 return base::checked_cast<GLint>(stride) / 4;
182 case BufferFormat::R_8:
183 return base::checked_cast<GLint>(stride);
184 case BufferFormat::ATC:
185 case BufferFormat::ATCIA:
186 case BufferFormat::DXT1:
187 case BufferFormat::DXT5: 155 case BufferFormat::DXT5:
188 case BufferFormat::ETC1: 156 case BufferFormat::ETC1:
189 case BufferFormat::YUV_420: 157 case BufferFormat::YUV_420:
190 case BufferFormat::YUV_420_BIPLANAR: 158 case BufferFormat::YUV_420_BIPLANAR:
191 case BufferFormat::UYVY_422: 159 case BufferFormat::UYVY_422:
192 NOTREACHED(); 160 NOTREACHED();
193 return 0; 161 return 0;
194 } 162 }
195 163
196 NOTREACHED(); 164 NOTREACHED();
197 return 0; 165 return 0;
198 } 166 }
199 167
200 template <typename F> 168 template <typename F>
201 scoped_ptr<uint8_t[]> GLES2RGBData(const gfx::Size& size, 169 scoped_ptr<uint8_t[]> GLES2RGBData(const gfx::Size& size,
202 BufferFormat format, 170 BufferFormat format,
203 size_t stride,
204 const uint8_t* data, 171 const uint8_t* data,
205 F const& data_to_rgb, 172 F const& data_to_rgb,
206 GLenum* data_format, 173 GLenum* data_format,
207 GLenum* data_type, 174 GLenum* data_type) {
208 GLint* data_row_length) {
209 TRACE_EVENT2("gpu", "GLES2RGBData", "width", size.width(), "height", 175 TRACE_EVENT2("gpu", "GLES2RGBData", "width", size.width(), "height",
210 size.height()); 176 size.height());
211 177
212 // Four-byte row alignment as specified by glPixelStorei with argument 178 // Four-byte row alignment as specified by glPixelStorei with argument
213 // GL_UNPACK_ALIGNMENT set to 4. 179 // GL_UNPACK_ALIGNMENT set to 4.
214 size_t gles2_rgb_data_stride = (size.width() * 3 + 3) & ~3; 180 size_t gles2_rgb_data_stride = (size.width() * 3 + 3) & ~3;
215 scoped_ptr<uint8_t[]> gles2_rgb_data( 181 scoped_ptr<uint8_t[]> gles2_rgb_data(
216 new uint8_t[gles2_rgb_data_stride * size.height()]); 182 new uint8_t[gles2_rgb_data_stride * size.height()]);
183 size_t data_stride = RowSizeForBufferFormat(size.width(), format, 0);
217 184
218 for (int y = 0; y < size.height(); ++y) { 185 for (int y = 0; y < size.height(); ++y) {
219 for (int x = 0; x < size.width(); ++x) { 186 for (int x = 0; x < size.width(); ++x) {
220 data_to_rgb(&data[y * stride + x * 4], 187 data_to_rgb(&data[y * data_stride + x * 4],
221 &gles2_rgb_data[y * gles2_rgb_data_stride + x * 3]); 188 &gles2_rgb_data[y * gles2_rgb_data_stride + x * 3]);
222 } 189 }
223 } 190 }
224 191
225 *data_format = GL_RGB; 192 *data_format = GL_RGB;
226 *data_type = GL_UNSIGNED_BYTE; 193 *data_type = GL_UNSIGNED_BYTE;
227 *data_row_length = size.width();
228 return gles2_rgb_data.Pass(); 194 return gles2_rgb_data.Pass();
229 } 195 }
230 196
231 scoped_ptr<uint8_t[]> GLES2Data(const gfx::Size& size, 197 scoped_ptr<uint8_t[]> GLES2Data(const gfx::Size& size,
232 BufferFormat format, 198 BufferFormat format,
233 size_t stride,
234 const uint8_t* data, 199 const uint8_t* data,
235 GLenum* data_format, 200 GLenum* data_format,
236 GLenum* data_type, 201 GLenum* data_type) {
237 GLint* data_row_length) {
238 TRACE_EVENT2("gpu", "GLES2Data", "width", size.width(), "height",
239 size.height());
240
241 switch (format) { 202 switch (format) {
242 case BufferFormat::RGBX_8888: 203 case BufferFormat::RGBX_8888:
243 return GLES2RGBData(size, format, stride, 204 return GLES2RGBData(size, format,
244 data, [](const uint8_t* src, uint8_t* dst) { 205 data, [](const uint8_t* src, uint8_t* dst) {
245 dst[0] = src[0]; 206 dst[0] = src[0];
246 dst[1] = src[1]; 207 dst[1] = src[1];
247 dst[2] = src[2]; 208 dst[2] = src[2];
248 }, data_format, data_type, data_row_length); 209 }, data_format, data_type);
249 case BufferFormat::BGRX_8888: 210 case BufferFormat::BGRX_8888:
250 return GLES2RGBData(size, format, stride, 211 return GLES2RGBData(size, format,
251 data, [](const uint8_t* src, uint8_t* dst) { 212 data, [](const uint8_t* src, uint8_t* dst) {
252 dst[0] = src[2]; 213 dst[0] = src[2];
253 dst[1] = src[1]; 214 dst[1] = src[1];
254 dst[2] = src[0]; 215 dst[2] = src[0];
255 }, data_format, data_type, data_row_length); 216 }, data_format, data_type);
256 case BufferFormat::RGBA_4444: 217 case BufferFormat::RGBA_4444:
257 case BufferFormat::RGBA_8888: 218 case BufferFormat::RGBA_8888:
258 case BufferFormat::BGRA_8888: 219 case BufferFormat::BGRA_8888:
259 case BufferFormat::R_8: { 220 case BufferFormat::R_8:
260 size_t gles2_data_stride =
261 RowSizeForBufferFormat(size.width(), format, 0);
262 if (stride == gles2_data_stride)
263 return nullptr; // No data conversion needed
264
265 scoped_ptr<uint8_t[]> gles2_data(
266 new uint8_t[gles2_data_stride * size.height()]);
267 for (int y = 0; y < size.height(); ++y) {
268 memcpy(&gles2_data[y * gles2_data_stride], &data[y * stride],
269 gles2_data_stride);
270 }
271 *data_row_length = size.width();
272 return gles2_data.Pass();
273 }
274 case BufferFormat::ATC: 221 case BufferFormat::ATC:
275 case BufferFormat::ATCIA: 222 case BufferFormat::ATCIA:
276 case BufferFormat::DXT1: 223 case BufferFormat::DXT1:
277 case BufferFormat::DXT5: 224 case BufferFormat::DXT5:
278 case BufferFormat::ETC1: 225 case BufferFormat::ETC1:
279 return nullptr; // No data conversion needed
280 case BufferFormat::YUV_420: 226 case BufferFormat::YUV_420:
281 case BufferFormat::YUV_420_BIPLANAR: 227 case BufferFormat::YUV_420_BIPLANAR:
282 case BufferFormat::UYVY_422: 228 case BufferFormat::UYVY_422:
283 NOTREACHED(); 229 // No data conversion needed.
284 return nullptr; 230 return nullptr;
285 } 231 }
286 232
287 NOTREACHED(); 233 NOTREACHED();
288 return nullptr; 234 return 0;
289 } 235 }
290 236
291 } // namespace 237 } // namespace
292 238
293 GLImageMemory::GLImageMemory(const gfx::Size& size, unsigned internalformat) 239 GLImageMemory::GLImageMemory(const gfx::Size& size, unsigned internalformat)
294 : size_(size), 240 : size_(size),
295 internalformat_(internalformat), 241 internalformat_(internalformat),
296 memory_(nullptr), 242 memory_(nullptr),
297 format_(BufferFormat::RGBA_8888), 243 format_(BufferFormat::RGBA_8888) {}
298 stride_(0) {}
299 244
300 GLImageMemory::~GLImageMemory() { 245 GLImageMemory::~GLImageMemory() {
301 DCHECK(!memory_); 246 DCHECK(!memory_);
302 } 247 }
303 248
304 bool GLImageMemory::Initialize(const unsigned char* memory, 249 bool GLImageMemory::Initialize(const unsigned char* memory,
305 BufferFormat format, 250 BufferFormat format) {
306 size_t stride) {
307 if (!ValidInternalFormat(internalformat_)) { 251 if (!ValidInternalFormat(internalformat_)) {
308 LOG(ERROR) << "Invalid internalformat: " << internalformat_; 252 LOG(ERROR) << "Invalid internalformat: " << internalformat_;
309 return false; 253 return false;
310 } 254 }
311 255
312 if (!ValidFormat(format)) { 256 if (!ValidFormat(format)) {
313 LOG(ERROR) << "Invalid format: " << static_cast<int>(format); 257 LOG(ERROR) << "Invalid format: " << static_cast<int>(format);
314 return false; 258 return false;
315 } 259 }
316 260
317 if (stride < RowSizeForBufferFormat(size_.width(), format, 0) || stride & 3) {
318 LOG(ERROR) << "Invalid stride: " << stride;
319 return false;
320 }
321
322 DCHECK(memory); 261 DCHECK(memory);
323 DCHECK(!memory_); 262 DCHECK(!memory_);
324 DCHECK(!IsCompressedFormat(format) || size_.width() % 4 == 0); 263 DCHECK(!IsCompressedFormat(format) || size_.width() % 4 == 0);
325 DCHECK(!IsCompressedFormat(format) || size_.height() % 4 == 0); 264 DCHECK(!IsCompressedFormat(format) || size_.height() % 4 == 0);
326 memory_ = memory; 265 memory_ = memory;
327 format_ = format; 266 format_ = format;
328 stride_ = stride;
329 return true; 267 return true;
330 } 268 }
331 269
332 void GLImageMemory::Destroy(bool have_context) { 270 void GLImageMemory::Destroy(bool have_context) {
333 memory_ = nullptr; 271 memory_ = nullptr;
334 } 272 }
335 273
336 gfx::Size GLImageMemory::GetSize() { 274 gfx::Size GLImageMemory::GetSize() {
337 return size_; 275 return size_;
338 } 276 }
(...skipping 13 matching lines...) Expand all
352 // GL_TEXTURE_EXTERNAL_OES is not a supported target. 290 // GL_TEXTURE_EXTERNAL_OES is not a supported target.
353 if (target == GL_TEXTURE_EXTERNAL_OES) 291 if (target == GL_TEXTURE_EXTERNAL_OES)
354 return false; 292 return false;
355 293
356 if (IsCompressedFormat(format_)) { 294 if (IsCompressedFormat(format_)) {
357 glCompressedTexImage2D( 295 glCompressedTexImage2D(
358 target, 0, TextureFormat(format_), size_.width(), size_.height(), 0, 296 target, 0, TextureFormat(format_), size_.width(), size_.height(), 0,
359 static_cast<GLsizei>(BufferSizeForBufferFormat(size_, format_)), 297 static_cast<GLsizei>(BufferSizeForBufferFormat(size_, format_)),
360 memory_); 298 memory_);
361 } else { 299 } else {
300 scoped_ptr<uint8_t[]> gles2_data;
362 GLenum data_format = DataFormat(format_); 301 GLenum data_format = DataFormat(format_);
363 GLenum data_type = DataType(format_); 302 GLenum data_type = DataType(format_);
364 GLint data_row_length = DataRowLength(stride_, format_);
365 scoped_ptr<uint8_t[]> gles2_data;
366 303
367 if (gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es) { 304 if (gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es)
368 gles2_data = GLES2Data(size_, format_, stride_, memory_, &data_format, 305 gles2_data = GLES2Data(size_, format_, memory_, &data_format, &data_type);
369 &data_type, &data_row_length);
370 }
371
372 if (data_row_length != size_.width())
373 glPixelStorei(GL_UNPACK_ROW_LENGTH, data_row_length);
374 306
375 glTexImage2D(target, 0, TextureFormat(format_), size_.width(), 307 glTexImage2D(target, 0, TextureFormat(format_), size_.width(),
376 size_.height(), 0, data_format, data_type, 308 size_.height(), 0, data_format, data_type,
377 gles2_data ? gles2_data.get() : memory_); 309 gles2_data ? gles2_data.get() : memory_);
378
379 if (data_row_length != size_.width())
380 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
381 } 310 }
382 311
383 return true; 312 return true;
384 } 313 }
385 314
386 bool GLImageMemory::CopyTexSubImage(unsigned target, 315 bool GLImageMemory::CopyTexSubImage(unsigned target,
387 const gfx::Point& offset, 316 const gfx::Point& offset,
388 const gfx::Rect& rect) { 317 const gfx::Rect& rect) {
389 TRACE_EVENT2("gpu", "GLImageMemory::CopyTexSubImage", "width", rect.width(), 318 TRACE_EVENT2("gpu", "GLImageMemory::CopyTexSubImage", "width", rect.width(),
390 "height", rect.height()); 319 "height", rect.height());
391 320
392 // GL_TEXTURE_EXTERNAL_OES is not a supported target. 321 // GL_TEXTURE_EXTERNAL_OES is not a supported target.
393 if (target == GL_TEXTURE_EXTERNAL_OES) 322 if (target == GL_TEXTURE_EXTERNAL_OES)
394 return false; 323 return false;
395 324
396 // Sub width is not supported. 325 // Sub width is not supported.
397 if (rect.width() != size_.width()) 326 if (rect.width() != size_.width())
398 return false; 327 return false;
399 328
400 const uint8_t* data = memory_ + rect.y() * stride_; 329 // Height must be a multiple of 4 if compressed.
330 if (IsCompressedFormat(format_) && rect.height() % 4)
331 return false;
332
333 const uint8_t* data =
334 memory_ + rect.y() * RowSizeForBufferFormat(size_.width(), format_, 0);
401 if (IsCompressedFormat(format_)) { 335 if (IsCompressedFormat(format_)) {
402 // Height must be a multiple of 4.
403 if (rect.height() % 4)
404 return false;
405
406 glCompressedTexSubImage2D( 336 glCompressedTexSubImage2D(
407 target, 0, offset.x(), offset.y(), rect.width(), rect.height(), 337 target, 0, offset.x(), offset.y(), rect.width(), rect.height(),
408 DataFormat(format_), 338 DataFormat(format_),
409 static_cast<GLsizei>(BufferSizeForBufferFormat(rect.size(), format_)), 339 static_cast<GLsizei>(BufferSizeForBufferFormat(rect.size(), format_)),
410 data); 340 data);
411 } else { 341 } else {
412 GLenum data_format = DataFormat(format_); 342 GLenum data_format = DataFormat(format_);
413 GLenum data_type = DataType(format_); 343 GLenum data_type = DataType(format_);
414 GLint data_row_length = DataRowLength(stride_, format_);
415 scoped_ptr<uint8_t[]> gles2_data; 344 scoped_ptr<uint8_t[]> gles2_data;
416 345
417 if (gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es) { 346 if (gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es) {
418 gles2_data = GLES2Data(rect.size(), format_, stride_, data, &data_format, 347 gles2_data =
419 &data_type, &data_row_length); 348 GLES2Data(rect.size(), format_, data, &data_format, &data_type);
420 } 349 }
421 350
422 if (data_row_length != rect.width())
423 glPixelStorei(GL_UNPACK_ROW_LENGTH, data_row_length);
424
425 glTexSubImage2D(target, 0, offset.x(), offset.y(), rect.width(), 351 glTexSubImage2D(target, 0, offset.x(), offset.y(), rect.width(),
426 rect.height(), data_format, data_type, 352 rect.height(), data_format, data_type,
427 gles2_data ? gles2_data.get() : data); 353 gles2_data ? gles2_data.get() : data);
428
429 if (data_row_length != rect.width())
430 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
431 } 354 }
432 355
433 return true; 356 return true;
434 } 357 }
435 358
436 bool GLImageMemory::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, 359 bool GLImageMemory::ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
437 int z_order, 360 int z_order,
438 gfx::OverlayTransform transform, 361 gfx::OverlayTransform transform,
439 const gfx::Rect& bounds_rect, 362 const gfx::Rect& bounds_rect,
440 const gfx::RectF& crop_rect) { 363 const gfx::RectF& crop_rect) {
441 return false; 364 return false;
442 } 365 }
443 366
444 // static 367 // static
445 unsigned GLImageMemory::GetInternalFormatForTesting(BufferFormat format) { 368 unsigned GLImageMemory::GetInternalFormatForTesting(BufferFormat format) {
446 DCHECK(ValidFormat(format)); 369 DCHECK(ValidFormat(format));
447 return TextureFormat(format); 370 return TextureFormat(format);
448 } 371 }
449 372
450 } // namespace gl 373 } // namespace gl
OLDNEW
« no previous file with comments | « ui/gl/gl_image_memory.h ('k') | ui/gl/gl_image_ref_counted_memory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698