| Index: ui/gl/gl_image_memory.cc
|
| diff --git a/ui/gl/gl_image_memory.cc b/ui/gl/gl_image_memory.cc
|
| index 3bdf596144679c517ce8e9e2dcd9abc636ddbef7..03391ba2a60493cc964ca83c0c4aff89b1aebcb2 100644
|
| --- a/ui/gl/gl_image_memory.cc
|
| +++ b/ui/gl/gl_image_memory.cc
|
| @@ -5,7 +5,6 @@
|
| #include "ui/gl/gl_image_memory.h"
|
|
|
| #include "base/logging.h"
|
| -#include "base/numerics/safe_conversions.h"
|
| #include "base/trace_event/trace_event.h"
|
| #include "ui/gfx/buffer_format_util.h"
|
| #include "ui/gl/gl_bindings.h"
|
| @@ -72,11 +71,9 @@
|
| case BufferFormat::RGBA_8888:
|
| case BufferFormat::BGRX_8888:
|
| case BufferFormat::BGRA_8888:
|
| - return false;
|
| - case BufferFormat::YUV_420:
|
| - case BufferFormat::YUV_420_BIPLANAR:
|
| - case BufferFormat::UYVY_422:
|
| - NOTREACHED();
|
| + case BufferFormat::YUV_420:
|
| + case BufferFormat::YUV_420_BIPLANAR:
|
| + case BufferFormat::UYVY_422:
|
| return false;
|
| }
|
|
|
| @@ -132,12 +129,10 @@
|
| case BufferFormat::DXT1:
|
| case BufferFormat::DXT5:
|
| case BufferFormat::ETC1:
|
| + case BufferFormat::YUV_420:
|
| + case BufferFormat::YUV_420_BIPLANAR:
|
| + case BufferFormat::UYVY_422:
|
| return TextureFormat(format);
|
| - case BufferFormat::YUV_420:
|
| - case BufferFormat::YUV_420_BIPLANAR:
|
| - case BufferFormat::UYVY_422:
|
| - NOTREACHED();
|
| - return 0;
|
| }
|
|
|
| NOTREACHED();
|
| @@ -154,33 +149,6 @@
|
| case BufferFormat::BGRA_8888:
|
| case BufferFormat::R_8:
|
| return GL_UNSIGNED_BYTE;
|
| - case BufferFormat::ATC:
|
| - case BufferFormat::ATCIA:
|
| - case BufferFormat::DXT1:
|
| - case BufferFormat::DXT5:
|
| - case BufferFormat::ETC1:
|
| - case BufferFormat::YUV_420:
|
| - case BufferFormat::YUV_420_BIPLANAR:
|
| - case BufferFormat::UYVY_422:
|
| - NOTREACHED();
|
| - return 0;
|
| - }
|
| -
|
| - NOTREACHED();
|
| - return 0;
|
| -}
|
| -
|
| -GLint DataRowLength(size_t stride, BufferFormat format) {
|
| - switch (format) {
|
| - case BufferFormat::RGBA_4444:
|
| - return base::checked_cast<GLint>(stride) / 2;
|
| - case BufferFormat::RGBX_8888:
|
| - case BufferFormat::RGBA_8888:
|
| - case BufferFormat::BGRX_8888:
|
| - case BufferFormat::BGRA_8888:
|
| - return base::checked_cast<GLint>(stride) / 4;
|
| - case BufferFormat::R_8:
|
| - return base::checked_cast<GLint>(stride);
|
| case BufferFormat::ATC:
|
| case BufferFormat::ATCIA:
|
| case BufferFormat::DXT1:
|
| @@ -200,12 +168,10 @@
|
| template <typename F>
|
| scoped_ptr<uint8_t[]> GLES2RGBData(const gfx::Size& size,
|
| BufferFormat format,
|
| - size_t stride,
|
| const uint8_t* data,
|
| F const& data_to_rgb,
|
| GLenum* data_format,
|
| - GLenum* data_type,
|
| - GLint* data_row_length) {
|
| + GLenum* data_type) {
|
| TRACE_EVENT2("gpu", "GLES2RGBData", "width", size.width(), "height",
|
| size.height());
|
|
|
| @@ -214,78 +180,58 @@
|
| size_t gles2_rgb_data_stride = (size.width() * 3 + 3) & ~3;
|
| scoped_ptr<uint8_t[]> gles2_rgb_data(
|
| new uint8_t[gles2_rgb_data_stride * size.height()]);
|
| + size_t data_stride = RowSizeForBufferFormat(size.width(), format, 0);
|
|
|
| for (int y = 0; y < size.height(); ++y) {
|
| for (int x = 0; x < size.width(); ++x) {
|
| - data_to_rgb(&data[y * stride + x * 4],
|
| + data_to_rgb(&data[y * data_stride + x * 4],
|
| &gles2_rgb_data[y * gles2_rgb_data_stride + x * 3]);
|
| }
|
| }
|
|
|
| *data_format = GL_RGB;
|
| *data_type = GL_UNSIGNED_BYTE;
|
| - *data_row_length = size.width();
|
| return gles2_rgb_data.Pass();
|
| }
|
|
|
| scoped_ptr<uint8_t[]> GLES2Data(const gfx::Size& size,
|
| BufferFormat format,
|
| - size_t stride,
|
| const uint8_t* data,
|
| GLenum* data_format,
|
| - GLenum* data_type,
|
| - GLint* data_row_length) {
|
| - TRACE_EVENT2("gpu", "GLES2Data", "width", size.width(), "height",
|
| - size.height());
|
| -
|
| - switch (format) {
|
| - case BufferFormat::RGBX_8888:
|
| - return GLES2RGBData(size, format, stride,
|
| + GLenum* data_type) {
|
| + switch (format) {
|
| + case BufferFormat::RGBX_8888:
|
| + return GLES2RGBData(size, format,
|
| data, [](const uint8_t* src, uint8_t* dst) {
|
| dst[0] = src[0];
|
| dst[1] = src[1];
|
| dst[2] = src[2];
|
| - }, data_format, data_type, data_row_length);
|
| - case BufferFormat::BGRX_8888:
|
| - return GLES2RGBData(size, format, stride,
|
| + }, data_format, data_type);
|
| + case BufferFormat::BGRX_8888:
|
| + return GLES2RGBData(size, format,
|
| data, [](const uint8_t* src, uint8_t* dst) {
|
| dst[0] = src[2];
|
| dst[1] = src[1];
|
| dst[2] = src[0];
|
| - }, data_format, data_type, data_row_length);
|
| - case BufferFormat::RGBA_4444:
|
| - case BufferFormat::RGBA_8888:
|
| - case BufferFormat::BGRA_8888:
|
| - case BufferFormat::R_8: {
|
| - size_t gles2_data_stride =
|
| - RowSizeForBufferFormat(size.width(), format, 0);
|
| - if (stride == gles2_data_stride)
|
| - return nullptr; // No data conversion needed
|
| -
|
| - scoped_ptr<uint8_t[]> gles2_data(
|
| - new uint8_t[gles2_data_stride * size.height()]);
|
| - for (int y = 0; y < size.height(); ++y) {
|
| - memcpy(&gles2_data[y * gles2_data_stride], &data[y * stride],
|
| - gles2_data_stride);
|
| - }
|
| - *data_row_length = size.width();
|
| - return gles2_data.Pass();
|
| - }
|
| - case BufferFormat::ATC:
|
| - case BufferFormat::ATCIA:
|
| - case BufferFormat::DXT1:
|
| - case BufferFormat::DXT5:
|
| - case BufferFormat::ETC1:
|
| - return nullptr; // No data conversion needed
|
| - case BufferFormat::YUV_420:
|
| - case BufferFormat::YUV_420_BIPLANAR:
|
| - case BufferFormat::UYVY_422:
|
| - NOTREACHED();
|
| + }, data_format, data_type);
|
| + case BufferFormat::RGBA_4444:
|
| + case BufferFormat::RGBA_8888:
|
| + case BufferFormat::BGRA_8888:
|
| + case BufferFormat::R_8:
|
| + case BufferFormat::ATC:
|
| + case BufferFormat::ATCIA:
|
| + case BufferFormat::DXT1:
|
| + case BufferFormat::DXT5:
|
| + case BufferFormat::ETC1:
|
| + case BufferFormat::YUV_420:
|
| + case BufferFormat::YUV_420_BIPLANAR:
|
| + case BufferFormat::UYVY_422:
|
| + // No data conversion needed.
|
| return nullptr;
|
| }
|
|
|
| NOTREACHED();
|
| - return nullptr;
|
| + return 0;
|
| }
|
|
|
| } // namespace
|
| @@ -294,16 +240,14 @@
|
| : size_(size),
|
| internalformat_(internalformat),
|
| memory_(nullptr),
|
| - format_(BufferFormat::RGBA_8888),
|
| - stride_(0) {}
|
| + format_(BufferFormat::RGBA_8888) {}
|
|
|
| GLImageMemory::~GLImageMemory() {
|
| DCHECK(!memory_);
|
| }
|
|
|
| bool GLImageMemory::Initialize(const unsigned char* memory,
|
| - BufferFormat format,
|
| - size_t stride) {
|
| + BufferFormat format) {
|
| if (!ValidInternalFormat(internalformat_)) {
|
| LOG(ERROR) << "Invalid internalformat: " << internalformat_;
|
| return false;
|
| @@ -311,11 +255,6 @@
|
|
|
| if (!ValidFormat(format)) {
|
| LOG(ERROR) << "Invalid format: " << static_cast<int>(format);
|
| - return false;
|
| - }
|
| -
|
| - if (stride < RowSizeForBufferFormat(size_.width(), format, 0) || stride & 3) {
|
| - LOG(ERROR) << "Invalid stride: " << stride;
|
| return false;
|
| }
|
|
|
| @@ -325,7 +264,6 @@
|
| DCHECK(!IsCompressedFormat(format) || size_.height() % 4 == 0);
|
| memory_ = memory;
|
| format_ = format;
|
| - stride_ = stride;
|
| return true;
|
| }
|
|
|
| @@ -359,25 +297,16 @@
|
| static_cast<GLsizei>(BufferSizeForBufferFormat(size_, format_)),
|
| memory_);
|
| } else {
|
| + scoped_ptr<uint8_t[]> gles2_data;
|
| GLenum data_format = DataFormat(format_);
|
| GLenum data_type = DataType(format_);
|
| - GLint data_row_length = DataRowLength(stride_, format_);
|
| - scoped_ptr<uint8_t[]> gles2_data;
|
| -
|
| - if (gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es) {
|
| - gles2_data = GLES2Data(size_, format_, stride_, memory_, &data_format,
|
| - &data_type, &data_row_length);
|
| - }
|
| -
|
| - if (data_row_length != size_.width())
|
| - glPixelStorei(GL_UNPACK_ROW_LENGTH, data_row_length);
|
| +
|
| + if (gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es)
|
| + gles2_data = GLES2Data(size_, format_, memory_, &data_format, &data_type);
|
|
|
| glTexImage2D(target, 0, TextureFormat(format_), size_.width(),
|
| size_.height(), 0, data_format, data_type,
|
| gles2_data ? gles2_data.get() : memory_);
|
| -
|
| - if (data_row_length != size_.width())
|
| - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
| }
|
|
|
| return true;
|
| @@ -397,12 +326,13 @@
|
| if (rect.width() != size_.width())
|
| return false;
|
|
|
| - const uint8_t* data = memory_ + rect.y() * stride_;
|
| + // Height must be a multiple of 4 if compressed.
|
| + if (IsCompressedFormat(format_) && rect.height() % 4)
|
| + return false;
|
| +
|
| + const uint8_t* data =
|
| + memory_ + rect.y() * RowSizeForBufferFormat(size_.width(), format_, 0);
|
| if (IsCompressedFormat(format_)) {
|
| - // Height must be a multiple of 4.
|
| - if (rect.height() % 4)
|
| - return false;
|
| -
|
| glCompressedTexSubImage2D(
|
| target, 0, offset.x(), offset.y(), rect.width(), rect.height(),
|
| DataFormat(format_),
|
| @@ -411,23 +341,16 @@
|
| } else {
|
| GLenum data_format = DataFormat(format_);
|
| GLenum data_type = DataType(format_);
|
| - GLint data_row_length = DataRowLength(stride_, format_);
|
| scoped_ptr<uint8_t[]> gles2_data;
|
|
|
| if (gfx::GLContext::GetCurrent()->GetVersionInfo()->is_es) {
|
| - gles2_data = GLES2Data(rect.size(), format_, stride_, data, &data_format,
|
| - &data_type, &data_row_length);
|
| + gles2_data =
|
| + GLES2Data(rect.size(), format_, data, &data_format, &data_type);
|
| }
|
| -
|
| - if (data_row_length != rect.width())
|
| - glPixelStorei(GL_UNPACK_ROW_LENGTH, data_row_length);
|
|
|
| glTexSubImage2D(target, 0, offset.x(), offset.y(), rect.width(),
|
| rect.height(), data_format, data_type,
|
| gles2_data ? gles2_data.get() : data);
|
| -
|
| - if (data_row_length != rect.width())
|
| - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
| }
|
|
|
| return true;
|
|
|