Index: content/common/gpu/client/gpu_memory_buffer_impl.cc |
diff --git a/content/common/gpu/client/gpu_memory_buffer_impl.cc b/content/common/gpu/client/gpu_memory_buffer_impl.cc |
index 208261dd0831e940f8f858b63a4169888c706db8..799c0d6058825f2dce32194c68ccba0b69184129 100644 |
--- a/content/common/gpu/client/gpu_memory_buffer_impl.cc |
+++ b/content/common/gpu/client/gpu_memory_buffer_impl.cc |
@@ -77,57 +77,108 @@ GpuMemoryBufferImpl* GpuMemoryBufferImpl::FromClientBuffer( |
} |
// static |
+size_t GpuMemoryBufferImpl::NumberOfPlanesForGpuMemoryBufferFormat( |
+ gfx::GpuMemoryBuffer::Format format) { |
reveman
2015/04/07 20:33:44
nit: remove gfx::GpuMemoryBuffer:: prefix if possi
emircan
2015/04/07 21:28:45
Done.
|
+ switch (format) { |
+ case gfx::GpuMemoryBuffer::Format::ATC: |
reveman
2015/04/07 20:33:44
nit: remove gfx::GpuMemoryBuffer::Format:: prefix
emircan
2015/04/07 21:28:45
Done.
|
+ case gfx::GpuMemoryBuffer::Format::ATCIA: |
+ case gfx::GpuMemoryBuffer::Format::DXT1: |
+ case gfx::GpuMemoryBuffer::Format::DXT5: |
+ case gfx::GpuMemoryBuffer::Format::ETC1: |
+ case gfx::GpuMemoryBuffer::Format::RGBA_8888: |
+ case gfx::GpuMemoryBuffer::Format::RGBX_8888: |
+ case gfx::GpuMemoryBuffer::Format::BGRA_8888: |
+ return 1; |
+ case gfx::GpuMemoryBuffer::Format::YUV_420: |
+ return 3; |
+ } |
+ NOTREACHED(); |
+ return 0; |
+} |
+ |
+// static |
bool GpuMemoryBufferImpl::StrideInBytes(size_t width, |
Format format, |
+ int plane, |
size_t* stride_in_bytes) { |
- base::CheckedNumeric<size_t> s = width; |
switch (format) { |
case ATCIA: |
case DXT5: |
+ DCHECK_EQ(plane, 0); |
*stride_in_bytes = width; |
return true; |
case ATC: |
case DXT1: |
case ETC1: |
+ DCHECK_EQ(plane, 0); |
DCHECK_EQ(width % 2, 0U); |
- s /= 2; |
- if (!s.IsValid()) |
- return false; |
- |
- *stride_in_bytes = s.ValueOrDie(); |
+ *stride_in_bytes = width / 2; |
return true; |
case RGBA_8888: |
case RGBX_8888: |
- case BGRA_8888: |
+ case BGRA_8888: { |
+ base::CheckedNumeric<size_t> s = width; |
+ DCHECK_EQ(plane, 0); |
s *= 4; |
if (!s.IsValid()) |
return false; |
- |
*stride_in_bytes = s.ValueOrDie(); |
return true; |
+ } |
+ case YUV_420: { |
+ DCHECK_EQ(width % 2, 0u); |
+ *stride_in_bytes = width / SubsamplingFactor(format, plane); |
+ return true; |
+ } |
} |
- |
NOTREACHED(); |
return false; |
} |
// static |
-size_t GpuMemoryBufferImpl::NumberOfPlanesForGpuMemoryBufferFormat( |
- gfx::GpuMemoryBuffer::Format format) { |
+size_t GpuMemoryBufferImpl::SubsamplingFactor( |
+ gfx::GpuMemoryBuffer::Format format, |
reveman
2015/04/07 20:33:44
nit: remove gfx::GpuMemoryBuffer:: prefix if possi
emircan
2015/04/07 21:28:45
Done.
|
+ int plane) { |
switch (format) { |
- case gfx::GpuMemoryBuffer::Format::ATC: |
- case gfx::GpuMemoryBuffer::Format::ATCIA: |
- case gfx::GpuMemoryBuffer::Format::DXT1: |
- case gfx::GpuMemoryBuffer::Format::DXT5: |
- case gfx::GpuMemoryBuffer::Format::ETC1: |
- case gfx::GpuMemoryBuffer::Format::RGBA_8888: |
- case gfx::GpuMemoryBuffer::Format::RGBX_8888: |
- case gfx::GpuMemoryBuffer::Format::BGRA_8888: |
+ case gfx::GpuMemoryBuffer::ATC: |
reveman
2015/04/07 20:33:44
nit: remove gfx::GpuMemoryBuffer::Format:: prefix
emircan
2015/04/07 21:28:45
Done.
|
+ case gfx::GpuMemoryBuffer::ATCIA: |
+ case gfx::GpuMemoryBuffer::DXT1: |
+ case gfx::GpuMemoryBuffer::DXT5: |
+ case gfx::GpuMemoryBuffer::ETC1: |
+ case gfx::GpuMemoryBuffer::RGBA_8888: |
+ case gfx::GpuMemoryBuffer::RGBX_8888: |
+ case gfx::GpuMemoryBuffer::BGRA_8888: |
return 1; |
- default: |
- NOTREACHED(); |
- return 0; |
+ case gfx::GpuMemoryBuffer::YUV_420: { |
+ static size_t factor[] = {1, 2, 2}; |
+ DCHECK_LT(static_cast<size_t>(plane), arraysize(factor)); |
+ return factor[plane]; |
+ } |
+ } |
+ NOTREACHED(); |
+ return 0; |
+} |
+ |
+// static |
+bool GpuMemoryBufferImpl::BufferSizeInBytes( |
+ const gfx::Size& size, |
+ gfx::GpuMemoryBuffer::Format format, |
reveman
2015/04/07 20:33:44
nit: remove gfx::GpuMemoryBuffer:: prefix if possi
emircan
2015/04/07 21:28:45
Done.
|
+ size_t* total_size_in_bytes) { |
reveman
2015/04/07 20:33:44
nit: s/total_size_in_bytes/size_in_bytes/
emircan
2015/04/07 21:28:45
Done.
|
+ base::CheckedNumeric<size_t> size_in_bytes = 0u; |
reveman
2015/04/07 20:33:44
nit: s/size_in_bytes/checked_size_in_bytes/
emircan
2015/04/07 21:28:45
Done.
|
+ for (size_t i = 0; i < NumberOfPlanesForGpuMemoryBufferFormat(format); ++i) { |
+ size_t stride_in_bytes = 0; |
+ if (!StrideInBytes(size.width(), format, i, &stride_in_bytes)) |
+ return false; |
+ base::CheckedNumeric<size_t> plane_size = |
reveman
2015/04/07 20:33:44
nit: s/plane_size/checked_plane_size_in_bytes/
emircan
2015/04/07 21:28:45
Done.
|
+ stride_in_bytes * (size.height() / SubsamplingFactor(format, i)); |
reveman
2015/04/07 20:33:44
This can still overflow. For CheckedNumeric to wor
emircan
2015/04/07 21:28:45
Done.
|
+ if (!plane_size.IsValid()) |
+ return false; |
+ size_in_bytes += plane_size.ValueOrDie(); |
+ if (!size_in_bytes.IsValid()) |
+ return false; |
} |
+ *total_size_in_bytes = size_in_bytes.ValueOrDie(); |
+ return true; |
} |
gfx::GpuMemoryBuffer::Format GpuMemoryBufferImpl::GetFormat() const { |