| Index: content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc
|
| 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 3d3aee965a3d5aaa526538d9b1aff7d6923e1d24..cf6e20d86109d757bc3d41da000c296d12e8ae71 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
|
| @@ -36,18 +36,12 @@ scoped_ptr<GpuMemoryBufferImpl> GpuMemoryBufferImplSharedMemory::Create(
|
| gfx::GpuMemoryBufferId id,
|
| const gfx::Size& size,
|
| Format format) {
|
| - scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory());
|
| -
|
| - size_t stride_in_bytes = 0;
|
| - if (!StrideInBytes(size.width(), format, &stride_in_bytes))
|
| - return scoped_ptr<GpuMemoryBufferImpl>();
|
| -
|
| - base::CheckedNumeric<size_t> size_in_bytes = stride_in_bytes;
|
| - size_in_bytes *= size.height();
|
| - if (!size_in_bytes.IsValid())
|
| + size_t buffer_size = 0u;
|
| + if (!BufferSizeInBytes(size, format, &buffer_size))
|
| return scoped_ptr<GpuMemoryBufferImpl>();
|
|
|
| - if (!shared_memory->CreateAndMapAnonymous(size_in_bytes.ValueOrDie()))
|
| + scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory());
|
| + if (!shared_memory->CreateAndMapAnonymous(buffer_size))
|
| return scoped_ptr<GpuMemoryBufferImpl>();
|
|
|
| return make_scoped_ptr(new GpuMemoryBufferImplSharedMemory(
|
| @@ -61,17 +55,12 @@ GpuMemoryBufferImplSharedMemory::AllocateForChildProcess(
|
| const gfx::Size& size,
|
| Format format,
|
| base::ProcessHandle child_process) {
|
| - size_t stride_in_bytes = 0;
|
| - if (!StrideInBytes(size.width(), format, &stride_in_bytes))
|
| - return gfx::GpuMemoryBufferHandle();
|
| -
|
| - base::CheckedNumeric<int> buffer_size = stride_in_bytes;
|
| - buffer_size *= size.height();
|
| - if (!buffer_size.IsValid())
|
| + size_t buffer_size = 0u;
|
| + if (!BufferSizeInBytes(size, format, &buffer_size))
|
| return gfx::GpuMemoryBufferHandle();
|
|
|
| base::SharedMemory shared_memory;
|
| - if (!shared_memory.CreateAnonymous(buffer_size.ValueOrDie()))
|
| + if (!shared_memory.CreateAnonymous(buffer_size))
|
| return gfx::GpuMemoryBufferHandle();
|
|
|
| gfx::GpuMemoryBufferHandle handle;
|
| @@ -91,18 +80,13 @@ GpuMemoryBufferImplSharedMemory::CreateFromHandle(
|
| if (!base::SharedMemory::IsHandleValid(handle.handle))
|
| return scoped_ptr<GpuMemoryBufferImpl>();
|
|
|
| - size_t stride_in_bytes = 0;
|
| - if (!StrideInBytes(size.width(), format, &stride_in_bytes))
|
| - return scoped_ptr<GpuMemoryBufferImpl>();
|
| -
|
| - base::CheckedNumeric<size_t> size_in_bytes = stride_in_bytes;
|
| - size_in_bytes *= size.height();
|
| - if (!size_in_bytes.IsValid())
|
| + size_t buffer_size = 0u;
|
| + if (!BufferSizeInBytes(size, format, &buffer_size))
|
| return scoped_ptr<GpuMemoryBufferImpl>();
|
|
|
| scoped_ptr<base::SharedMemory> shared_memory(
|
| new base::SharedMemory(handle.handle, false));
|
| - if (!shared_memory->Map(size_in_bytes.ValueOrDie()))
|
| + if (!shared_memory->Map(buffer_size))
|
| return scoped_ptr<GpuMemoryBufferImpl>();
|
|
|
| return make_scoped_ptr<GpuMemoryBufferImpl>(
|
| @@ -124,6 +108,7 @@ bool GpuMemoryBufferImplSharedMemory::IsFormatSupported(Format format) {
|
| case ETC1:
|
| case RGBA_8888:
|
| case BGRA_8888:
|
| + case YUV_420:
|
| return true;
|
| case RGBX_8888:
|
| return false;
|
| @@ -150,6 +135,15 @@ bool GpuMemoryBufferImplSharedMemory::IsSizeValidForFormat(
|
| case BGRA_8888:
|
| case RGBX_8888:
|
| return true;
|
| + case YUV_420: {
|
| + for (size_t i = 0; i < NumberOfPlanesForGpuMemoryBufferFormat(format);
|
| + ++i) {
|
| + size_t factor = SubsamplingFactor(format, i);
|
| + if (size.width() % factor || size.height() % factor)
|
| + return false;
|
| + }
|
| + return true;
|
| + }
|
| }
|
|
|
| NOTREACHED();
|
| @@ -158,8 +152,19 @@ bool GpuMemoryBufferImplSharedMemory::IsSizeValidForFormat(
|
|
|
| bool GpuMemoryBufferImplSharedMemory::Map(void** data) {
|
| DCHECK(!mapped_);
|
| + data[0] = shared_memory_->memory();
|
| + // Map the other planes if they exist.
|
| + for (size_t i = 0; i < NumberOfPlanesForGpuMemoryBufferFormat(format_) - 1;
|
| + ++i) {
|
| + size_t stride_in_bytes = 0;
|
| + bool valid_stride =
|
| + StrideInBytes(size_.width(), format_, i, &stride_in_bytes);
|
| + DCHECK(valid_stride);
|
| + data[i + 1] =
|
| + reinterpret_cast<uint8*>(data[i]) +
|
| + stride_in_bytes * (size_.height() / SubsamplingFactor(format_, i));
|
| + }
|
| mapped_ = true;
|
| - *data = shared_memory_->memory();
|
| return true;
|
| }
|
|
|
| @@ -169,10 +174,13 @@ void GpuMemoryBufferImplSharedMemory::Unmap() {
|
| }
|
|
|
| void GpuMemoryBufferImplSharedMemory::GetStride(uint32* stride) const {
|
| - size_t stride_in_bytes = 0;
|
| - bool valid_stride = StrideInBytes(size_.width(), format_, &stride_in_bytes);
|
| - DCHECK(valid_stride);
|
| - *stride = stride_in_bytes;
|
| + for (size_t i = 0; i < NumberOfPlanesForGpuMemoryBufferFormat(format_); ++i) {
|
| + size_t stride_in_bytes = 0;
|
| + bool valid_stride =
|
| + StrideInBytes(size_.width(), format_, i, &stride_in_bytes);
|
| + DCHECK(valid_stride);
|
| + stride[i] = stride_in_bytes;
|
| + }
|
| }
|
|
|
| gfx::GpuMemoryBufferHandle GpuMemoryBufferImplSharedMemory::GetHandle() const {
|
|
|