diff options
author | dcastagna <dcastagna@chromium.org> | 2015-04-08 13:52:56 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-08 20:53:26 +0000 |
commit | 51f60b27d0a7c8f1d39674fec24f73e9b55f04e6 (patch) | |
tree | 6f0d74c878e12c750fc01f5168234ea8b1f7fa0b | |
parent | 1abe5b4643edb113d9ce3ac58c69d40967d74cc5 (diff) | |
download | chromium_src-51f60b27d0a7c8f1d39674fec24f73e9b55f04e6.zip chromium_src-51f60b27d0a7c8f1d39674fec24f73e9b55f04e6.tar.gz chromium_src-51f60b27d0a7c8f1d39674fec24f73e9b55f04e6.tar.bz2 |
Add R_8 GPU memory buffers format.
GpuMemoryBuffer::Format::R_8 should be used to represent textures with
only one channel, the associated image should have GL_R8/GL_R8_EXT
as internal format.
With this CL the only implementation of GpuMemoryBuffer that supports
R_8 is GLImageMemory, it expects a 4 bytes row alignment (4 is the
default value for GL_PACK_ALIGNMENT).
BUG=
Review URL: https://codereview.chromium.org/1051503003
Cr-Commit-Position: refs/heads/master@{#324281}
17 files changed, 94 insertions, 33 deletions
diff --git a/cc/test/test_gpu_memory_buffer_manager.cc b/cc/test/test_gpu_memory_buffer_manager.cc index 8887feb..a3cd357 100644 --- a/cc/test/test_gpu_memory_buffer_manager.cc +++ b/cc/test/test_gpu_memory_buffer_manager.cc @@ -18,6 +18,7 @@ size_t NumberOfPlanesForGpuMemoryBufferFormat( case gfx::GpuMemoryBuffer::Format::DXT1: case gfx::GpuMemoryBuffer::Format::DXT5: case gfx::GpuMemoryBuffer::Format::ETC1: + case gfx::GpuMemoryBuffer::Format::R_8: case gfx::GpuMemoryBuffer::Format::RGBA_8888: case gfx::GpuMemoryBuffer::Format::RGBX_8888: case gfx::GpuMemoryBuffer::Format::BGRA_8888: @@ -36,6 +37,7 @@ size_t SubsamplingFactor(gfx::GpuMemoryBuffer::Format format, int plane) { case gfx::GpuMemoryBuffer::DXT1: case gfx::GpuMemoryBuffer::DXT5: case gfx::GpuMemoryBuffer::ETC1: + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::RGBX_8888: case gfx::GpuMemoryBuffer::BGRA_8888: @@ -64,6 +66,8 @@ size_t StrideInBytes(size_t width, DCHECK_EQ(plane, 0); DCHECK_EQ(width % 2, 0U); return width / 2; + case gfx::GpuMemoryBuffer::R_8: + return (width + 3) & ~0x3; case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::RGBX_8888: case gfx::GpuMemoryBuffer::BGRA_8888: diff --git a/content/common/gpu/client/gpu_memory_buffer_impl.cc b/content/common/gpu/client/gpu_memory_buffer_impl.cc index b8284ec..53b9b29 100644 --- a/content/common/gpu/client/gpu_memory_buffer_impl.cc +++ b/content/common/gpu/client/gpu_memory_buffer_impl.cc @@ -85,6 +85,7 @@ size_t GpuMemoryBufferImpl::NumberOfPlanesForGpuMemoryBufferFormat( case DXT1: case DXT5: case ETC1: + case R_8: case RGBA_8888: case RGBX_8888: case BGRA_8888: @@ -101,6 +102,7 @@ bool GpuMemoryBufferImpl::StrideInBytes(size_t width, Format format, int plane, size_t* stride_in_bytes) { + base::CheckedNumeric<size_t> checked_stride = width; switch (format) { case ATCIA: case DXT5: @@ -111,26 +113,29 @@ bool GpuMemoryBufferImpl::StrideInBytes(size_t width, case DXT1: case ETC1: DCHECK_EQ(plane, 0); - DCHECK_EQ(width % 2, 0U); + DCHECK_EQ(width % 2, 0u); *stride_in_bytes = width / 2; return true; - case RGBA_8888: + case R_8: + checked_stride += 3; + if (!checked_stride.IsValid()) + return false; + *stride_in_bytes = checked_stride.ValueOrDie() & ~0x3; + return true; case RGBX_8888: - case BGRA_8888: { - base::CheckedNumeric<size_t> s = width; - DCHECK_EQ(plane, 0); - s *= 4; - if (!s.IsValid()) + case RGBA_8888: + case BGRA_8888: + checked_stride *= 4; + if (!checked_stride.IsValid()) return false; - *stride_in_bytes = s.ValueOrDie(); + *stride_in_bytes = checked_stride.ValueOrDie(); return true; - } - case YUV_420: { + case YUV_420: DCHECK_EQ(width % 2, 0u); *stride_in_bytes = width / SubsamplingFactor(format, plane); return true; - } } + NOTREACHED(); return false; } @@ -145,6 +150,7 @@ size_t GpuMemoryBufferImpl::SubsamplingFactor( case DXT1: case DXT5: case ETC1: + case R_8: case RGBA_8888: case RGBX_8888: case BGRA_8888: diff --git a/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc b/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc index 9155205..41696c6 100644 --- a/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc +++ b/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc @@ -127,6 +127,7 @@ bool GpuMemoryBufferImplSharedMemory::IsFormatSupported(Format format) { case DXT1: case DXT5: case ETC1: + case R_8: case RGBA_8888: case BGRA_8888: case YUV_420: @@ -152,6 +153,7 @@ bool GpuMemoryBufferImplSharedMemory::IsSizeValidForFormat( // Compressed images must have a width and height that's evenly divisible // by the block size. return size.width() % 4 == 0 && size.height() % 4 == 0; + case R_8: case RGBA_8888: case BGRA_8888: case RGBX_8888: diff --git a/content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc b/content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc index 8ed95a9..7a0831d 100644 --- a/content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc +++ b/content/common/gpu/client/gpu_memory_buffer_impl_surface_texture.cc @@ -21,6 +21,7 @@ int WindowFormat(gfx::GpuMemoryBuffer::Format format) { case gfx::GpuMemoryBuffer::DXT1: case gfx::GpuMemoryBuffer::DXT5: case gfx::GpuMemoryBuffer::ETC1: + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBX_8888: case gfx::GpuMemoryBuffer::BGRA_8888: case gfx::GpuMemoryBuffer::YUV_420: diff --git a/content/common/gpu/gpu_memory_buffer_factory_io_surface.cc b/content/common/gpu/gpu_memory_buffer_factory_io_surface.cc index 2737a4d..574b4f6 100644 --- a/content/common/gpu/gpu_memory_buffer_factory_io_surface.cc +++ b/content/common/gpu/gpu_memory_buffer_factory_io_surface.cc @@ -36,6 +36,7 @@ int32 BytesPerPixel(gfx::GpuMemoryBuffer::Format format) { case gfx::GpuMemoryBuffer::DXT1: case gfx::GpuMemoryBuffer::DXT5: case gfx::GpuMemoryBuffer::ETC1: + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::RGBX_8888: case gfx::GpuMemoryBuffer::YUV_420: @@ -56,6 +57,7 @@ int32 PixelFormat(gfx::GpuMemoryBuffer::Format format) { case gfx::GpuMemoryBuffer::DXT1: case gfx::GpuMemoryBuffer::DXT5: case gfx::GpuMemoryBuffer::ETC1: + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::RGBX_8888: case gfx::GpuMemoryBuffer::YUV_420: diff --git a/content/common/gpu/gpu_memory_buffer_factory_shared_memory.cc b/content/common/gpu/gpu_memory_buffer_factory_shared_memory.cc index 992decd..4c8f0e9 100644 --- a/content/common/gpu/gpu_memory_buffer_factory_shared_memory.cc +++ b/content/common/gpu/gpu_memory_buffer_factory_shared_memory.cc @@ -23,10 +23,10 @@ void GpuMemoryBufferFactorySharedMemory:: GetSupportedGpuMemoryBufferConfigurations( std::vector<Configuration>* configurations) { const Configuration supported_configurations[] = { - { gfx::GpuMemoryBuffer::RGBA_8888, gfx::GpuMemoryBuffer::MAP }, - { gfx::GpuMemoryBuffer::BGRA_8888, gfx::GpuMemoryBuffer::MAP }, - { gfx::GpuMemoryBuffer::YUV_420, gfx::GpuMemoryBuffer::MAP } - }; + {gfx::GpuMemoryBuffer::R_8, gfx::GpuMemoryBuffer::MAP}, + {gfx::GpuMemoryBuffer::RGBA_8888, gfx::GpuMemoryBuffer::MAP}, + {gfx::GpuMemoryBuffer::BGRA_8888, gfx::GpuMemoryBuffer::MAP}, + {gfx::GpuMemoryBuffer::YUV_420, gfx::GpuMemoryBuffer::MAP}}; configurations->assign( supported_configurations, supported_configurations + arraysize(supported_configurations)); diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_image.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_image.txt index 645a3f4..e0ba066 100644 --- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_image.txt +++ b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_image.txt @@ -15,6 +15,7 @@ Dependencies OpenGL ES 2.0 is required. EXT_texture_format_BGRA8888 affects the definition of this extension. + ARB_texture_rg affects the definition of this extension. Overview @@ -45,7 +46,7 @@ New Procedures and Functions INVALID_VALUE is generated if <width> or <height> is nonpositive. INVALID_ENUM is generated if <internalformat> is not one of - RGB, RGBA or GL_BGRA_EXT. + R8, RGB, RGBA or BGRA_EXT. void DestroyImageCHROMIUM(GLuint image_id) @@ -56,7 +57,12 @@ New Procedures and Functions Dependencies on EXT_texture_format_BGRA8888 If EXT_texture_format_BGRA8888 is not supported: - * delete any reference to the GL_BGRA_EXT format. + * delete any reference to the BGRA_EXT format. + +Dependencies on ARB_texture_rg + + If ARB_texture_rg is not supported: + * delete any reference to the R8 format. Errors @@ -71,4 +77,5 @@ Revision History 5/9/2013 Documented the extension 4/30/2014 Moved usage flag to creation function. 10/7/2014 Remove map/unmap API. - 4/6/2015 Add GL_BGRA_EXT format. + 4/6/2015 Add BGRA_EXT format. + 2/7/2015 Add R8 format. diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc index c93017c..1327826 100644 --- a/gpu/command_buffer/client/gles2_implementation.cc +++ b/gpu/command_buffer/client/gles2_implementation.cc @@ -4829,6 +4829,7 @@ namespace { bool ValidImageFormat(GLenum internalformat) { switch (internalformat) { + case GL_R8: case GL_RGB: case GL_RGBA: case GL_BGRA_EXT: diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index dcbdb8f..5003ea8 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc @@ -1070,7 +1070,9 @@ void FeatureInfo::InitializeFeatures() { validators_.texture_format.AddValue(GL_RED_EXT); validators_.texture_format.AddValue(GL_RG_EXT); validators_.texture_internal_format.AddValue(GL_RED_EXT); + validators_.texture_internal_format.AddValue(GL_R8_EXT); validators_.texture_internal_format.AddValue(GL_RG_EXT); + validators_.texture_internal_format.AddValue(GL_RG8_EXT); validators_.read_pixel_format.AddValue(GL_RED_EXT); validators_.read_pixel_format.AddValue(GL_RG_EXT); validators_.render_buffer_format.AddValue(GL_R8_EXT); diff --git a/gpu/command_buffer/service/image_factory.cc b/gpu/command_buffer/service/image_factory.cc index f09cfb8..74994ff 100644 --- a/gpu/command_buffer/service/image_factory.cc +++ b/gpu/command_buffer/service/image_factory.cc @@ -19,6 +19,8 @@ ImageFactory::~ImageFactory() { gfx::GpuMemoryBuffer::Format ImageFactory::ImageFormatToGpuMemoryBufferFormat( unsigned internalformat) { switch (internalformat) { + case GL_R8: + return gfx::GpuMemoryBuffer::R_8; case GL_RGB: return gfx::GpuMemoryBuffer::RGBX_8888; case GL_RGBA: @@ -78,6 +80,8 @@ bool ImageFactory::IsGpuMemoryBufferFormatSupported( return capabilities.texture_format_dxt5; case gfx::GpuMemoryBuffer::ETC1: return capabilities.texture_format_etc1; + case gfx::GpuMemoryBuffer::R_8: + return capabilities.texture_rg; case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::RGBX_8888: case gfx::GpuMemoryBuffer::YUV_420: @@ -101,6 +105,7 @@ bool ImageFactory::IsImageSizeValidForGpuMemoryBufferFormat( // Compressed images must have a width and height that's evenly divisible // by the block size. return size.width() % 4 == 0 && size.height() % 4 == 0; + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::BGRA_8888: case gfx::GpuMemoryBuffer::RGBX_8888: diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc index 65986f8..71a6532 100644 --- a/gpu/command_buffer/service/in_process_command_buffer.cc +++ b/gpu/command_buffer/service/in_process_command_buffer.cc @@ -713,6 +713,8 @@ int32 InProcessCommandBuffer::CreateImage(ClientBuffer buffer, int32 new_id = next_image_id_.GetNext(); + DCHECK(gpu::ImageFactory::IsGpuMemoryBufferFormatSupported( + gpu_memory_buffer->GetFormat(), capabilities_)); DCHECK(gpu::ImageFactory::IsImageFormatCompatibleWithGpuMemoryBufferFormat( internalformat, gpu_memory_buffer->GetFormat())); diff --git a/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc b/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc index 9368da5..51b3640 100644 --- a/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc +++ b/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc @@ -80,6 +80,9 @@ SHADER( std::vector<uint8> GetTexturePixel(const gfx::GpuMemoryBuffer::Format format) { std::vector<uint8> pixel; switch (format) { + case gfx::GpuMemoryBuffer::R_8: + pixel.push_back(255u); + return pixel; case gfx::GpuMemoryBuffer::RGBA_8888: pixel.push_back(255u); pixel.push_back(0u); @@ -111,6 +114,7 @@ std::vector<uint8> GetFramebufferPixel( const gfx::GpuMemoryBuffer::Format format) { std::vector<uint8> pixel; switch (format) { + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::BGRA_8888: pixel.push_back(255u); @@ -135,6 +139,8 @@ std::vector<uint8> GetFramebufferPixel( GLenum InternalFormat(gfx::GpuMemoryBuffer::Format format) { switch (format) { + case gfx::GpuMemoryBuffer::R_8: + return GL_R8; case gfx::GpuMemoryBuffer::RGBA_8888: return GL_RGBA; case gfx::GpuMemoryBuffer::BGRA_8888: @@ -158,6 +164,9 @@ GLenum InternalFormat(gfx::GpuMemoryBuffer::Format format) { // An end to end test that tests the whole GpuMemoryBuffer lifecycle. TEST_P(GpuMemoryBufferTest, Lifecycle) { + ASSERT_TRUE((GetParam() != gfx::GpuMemoryBuffer::R_8) || + gl_.GetCapabilities().texture_rg); + GLuint texture_id = 0; glGenTextures(1, &texture_id); ASSERT_NE(0u, texture_id); @@ -243,7 +252,8 @@ TEST_P(GpuMemoryBufferTest, Lifecycle) { INSTANTIATE_TEST_CASE_P(GpuMemoryBufferTests, GpuMemoryBufferTest, - ::testing::Values(gfx::GpuMemoryBuffer::RGBA_8888, + ::testing::Values(gfx::GpuMemoryBuffer::R_8, + gfx::GpuMemoryBuffer::RGBA_8888, gfx::GpuMemoryBuffer::BGRA_8888)); } // namespace gles2 diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc index 3a3d7e9..2b6d06d 100644 --- a/gpu/command_buffer/tests/gl_manager.cc +++ b/gpu/command_buffer/tests/gl_manager.cc @@ -46,6 +46,7 @@ size_t NumberOfPlanesForGpuMemoryBufferFormat( case gfx::GpuMemoryBuffer::Format::DXT1: case gfx::GpuMemoryBuffer::Format::DXT5: case gfx::GpuMemoryBuffer::Format::ETC1: + case gfx::GpuMemoryBuffer::Format::R_8: case gfx::GpuMemoryBuffer::Format::RGBA_8888: case gfx::GpuMemoryBuffer::Format::RGBX_8888: case gfx::GpuMemoryBuffer::Format::BGRA_8888: @@ -64,6 +65,7 @@ size_t SubsamplingFactor(gfx::GpuMemoryBuffer::Format format, int plane) { case gfx::GpuMemoryBuffer::DXT1: case gfx::GpuMemoryBuffer::DXT5: case gfx::GpuMemoryBuffer::ETC1: + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::RGBX_8888: case gfx::GpuMemoryBuffer::BGRA_8888: @@ -92,6 +94,8 @@ size_t StrideInBytes(size_t width, DCHECK_EQ(plane, 0); DCHECK_EQ(width % 2, 0U); return width / 2; + case gfx::GpuMemoryBuffer::R_8: + return (width + 3) & ~0x3; case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::BGRA_8888: DCHECK_EQ(plane, 0); diff --git a/ui/gfx/gpu_memory_buffer.h b/ui/gfx/gpu_memory_buffer.h index 6383a13..5b1d47e 100644 --- a/ui/gfx/gpu_memory_buffer.h +++ b/ui/gfx/gpu_memory_buffer.h @@ -48,6 +48,7 @@ class GFX_EXPORT GpuMemoryBuffer { DXT1, DXT5, ETC1, + R_8, RGBA_8888, RGBX_8888, BGRA_8888, diff --git a/ui/gl/gl_image_linux_dma_buffer.cc b/ui/gl/gl_image_linux_dma_buffer.cc index 080c9b5..ff18f8f 100644 --- a/ui/gl/gl_image_linux_dma_buffer.cc +++ b/ui/gl/gl_image_linux_dma_buffer.cc @@ -37,6 +37,7 @@ bool ValidFormat(unsigned internalformat, gfx::GpuMemoryBuffer::Format format) { case gfx::GpuMemoryBuffer::DXT1: case gfx::GpuMemoryBuffer::DXT5: case gfx::GpuMemoryBuffer::ETC1: + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::BGRA_8888: case gfx::GpuMemoryBuffer::YUV_420: @@ -53,6 +54,7 @@ bool ValidFormat(unsigned internalformat, gfx::GpuMemoryBuffer::Format format) { case gfx::GpuMemoryBuffer::DXT1: case gfx::GpuMemoryBuffer::DXT5: case gfx::GpuMemoryBuffer::ETC1: + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBX_8888: case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::YUV_420: @@ -60,6 +62,8 @@ bool ValidFormat(unsigned internalformat, gfx::GpuMemoryBuffer::Format format) { } NOTREACHED(); return false; + case GL_R8: + return false; default: return false; } @@ -76,6 +80,7 @@ EGLint FourCC(gfx::GpuMemoryBuffer::Format format) { case gfx::GpuMemoryBuffer::DXT1: case gfx::GpuMemoryBuffer::DXT5: case gfx::GpuMemoryBuffer::ETC1: + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::YUV_420: NOTREACHED(); diff --git a/ui/gl/gl_image_memory.cc b/ui/gl/gl_image_memory.cc index ff9c97e..908ce7e 100644 --- a/ui/gl/gl_image_memory.cc +++ b/ui/gl/gl_image_memory.cc @@ -19,6 +19,7 @@ namespace { bool ValidInternalFormat(unsigned internalformat) { switch (internalformat) { + case GL_R8: case GL_RGBA: case GL_BGRA_EXT: return true; @@ -34,6 +35,7 @@ bool ValidFormat(gfx::GpuMemoryBuffer::Format format) { case gfx::GpuMemoryBuffer::DXT1: case gfx::GpuMemoryBuffer::DXT5: case gfx::GpuMemoryBuffer::ETC1: + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::BGRA_8888: return true; @@ -55,6 +57,7 @@ bool IsCompressedFormat(gfx::GpuMemoryBuffer::Format format) { case gfx::GpuMemoryBuffer::ETC1: case gfx::GpuMemoryBuffer::YUV_420: return true; + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::BGRA_8888: case gfx::GpuMemoryBuffer::RGBX_8888: @@ -77,6 +80,8 @@ GLenum TextureFormat(gfx::GpuMemoryBuffer::Format format) { return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; case gfx::GpuMemoryBuffer::ETC1: return GL_ETC1_RGB8_OES; + case gfx::GpuMemoryBuffer::R_8: + return GL_RED; case gfx::GpuMemoryBuffer::RGBA_8888: return GL_RGBA; case gfx::GpuMemoryBuffer::BGRA_8888: @@ -99,6 +104,7 @@ GLenum DataType(gfx::GpuMemoryBuffer::Format format) { switch (format) { case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::BGRA_8888: + case gfx::GpuMemoryBuffer::R_8: return GL_UNSIGNED_BYTE; case gfx::GpuMemoryBuffer::ATC: case gfx::GpuMemoryBuffer::ATCIA: @@ -155,27 +161,30 @@ GLImageMemory::~GLImageMemory() { bool GLImageMemory::StrideInBytes(size_t width, gfx::GpuMemoryBuffer::Format format, size_t* stride_in_bytes) { - base::CheckedNumeric<size_t> s = width; + base::CheckedNumeric<size_t> checked_stride = width; switch (format) { + case gfx::GpuMemoryBuffer::ATCIA: + case gfx::GpuMemoryBuffer::DXT5: + *stride_in_bytes = width; + return true; case gfx::GpuMemoryBuffer::ATC: case gfx::GpuMemoryBuffer::DXT1: case gfx::GpuMemoryBuffer::ETC1: - DCHECK_EQ(width % 2, 0U); - s /= 2; - if (!s.IsValid()) - return false; - *stride_in_bytes = s.ValueOrDie(); + DCHECK_EQ(width % 2, 0u); + *stride_in_bytes = width / 2; return true; - case gfx::GpuMemoryBuffer::ATCIA: - case gfx::GpuMemoryBuffer::DXT5: - *stride_in_bytes = width; + case gfx::GpuMemoryBuffer::R_8: + checked_stride += 3; + if (!checked_stride.IsValid()) + return false; + *stride_in_bytes = checked_stride.ValueOrDie() & ~0x3; return true; case gfx::GpuMemoryBuffer::RGBA_8888: case gfx::GpuMemoryBuffer::BGRA_8888: - s *= 4; - if (!s.IsValid()) + checked_stride *= 4; + if (!checked_stride.IsValid()) return false; - *stride_in_bytes = s.ValueOrDie(); + *stride_in_bytes = checked_stride.ValueOrDie(); return true; case gfx::GpuMemoryBuffer::RGBX_8888: case gfx::GpuMemoryBuffer::YUV_420: @@ -358,8 +367,7 @@ void GLImageMemory::DoBindTexImage(unsigned target) { 0, // y-offset size_.width(), size_.height(), DataFormat(format_), - SizeInBytes(size_, format_), - memory_); + SizeInBytes(size_, format_), memory_); } else { glTexSubImage2D(GL_TEXTURE_2D, 0, // mip level diff --git a/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.cc b/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.cc index 145b3e6..9fdc293 100644 --- a/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.cc +++ b/ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.cc @@ -95,6 +95,7 @@ SurfaceFactoryOzone::BufferFormat GetOzoneFormatFor( case gfx::GpuMemoryBuffer::DXT1: case gfx::GpuMemoryBuffer::DXT5: case gfx::GpuMemoryBuffer::ETC1: + case gfx::GpuMemoryBuffer::R_8: case gfx::GpuMemoryBuffer::BGRA_8888: case gfx::GpuMemoryBuffer::YUV_420: NOTREACHED(); |