Chromium Code Reviews| Index: cc/test/test_gpu_memory_buffer_manager.cc |
| diff --git a/cc/test/test_gpu_memory_buffer_manager.cc b/cc/test/test_gpu_memory_buffer_manager.cc |
| index b43cd76c58098572ff97f4cc3959976072ca3db1..6e75ef8f736f6ebd0d30d4c1c975edcca0684f22 100644 |
| --- a/cc/test/test_gpu_memory_buffer_manager.cc |
| +++ b/cc/test/test_gpu_memory_buffer_manager.cc |
| @@ -5,31 +5,88 @@ |
| #include "cc/test/test_gpu_memory_buffer_manager.h" |
| #include "base/logging.h" |
| +#include "base/memory/scoped_vector.h" |
|
reveman
2015/04/07 19:03:24
nit: you don't need this anymore
emircan
2015/04/07 20:08:12
Done.
|
| #include "ui/gfx/gpu_memory_buffer.h" |
| namespace cc { |
| namespace { |
| -size_t StrideInBytes(size_t width, gfx::GpuMemoryBuffer::Format format) { |
| +size_t NumberOfPlanesForGpuMemoryBufferFormat( |
| + gfx::GpuMemoryBuffer::Format format) { |
| + 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: |
| + return 1; |
| + case gfx::GpuMemoryBuffer::Format::YUV_420: |
| + return 3; |
| + } |
| + NOTREACHED(); |
| + return 0; |
| +} |
| + |
| +size_t SubsamplingFactor(gfx::GpuMemoryBuffer::Format format, int plane) { |
| + switch (format) { |
| + case gfx::GpuMemoryBuffer::ATC: |
| + 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; |
| + 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; |
| +} |
| + |
| +size_t StrideInBytes(size_t width, |
| + gfx::GpuMemoryBuffer::Format format, |
| + int plane) { |
| switch (format) { |
| case gfx::GpuMemoryBuffer::ATCIA: |
| case gfx::GpuMemoryBuffer::DXT5: |
| + DCHECK_EQ(plane, 0); |
| return width; |
| case gfx::GpuMemoryBuffer::ATC: |
| case gfx::GpuMemoryBuffer::DXT1: |
| case gfx::GpuMemoryBuffer::ETC1: |
| + DCHECK_EQ(plane, 0); |
| DCHECK_EQ(width % 2, 0U); |
| return width / 2; |
| case gfx::GpuMemoryBuffer::RGBA_8888: |
| case gfx::GpuMemoryBuffer::RGBX_8888: |
| case gfx::GpuMemoryBuffer::BGRA_8888: |
| + DCHECK_EQ(plane, 0); |
| return width * 4; |
| + case gfx::GpuMemoryBuffer::YUV_420: |
| + return width / SubsamplingFactor(format, plane); |
| } |
| - |
| NOTREACHED(); |
| return 0; |
| } |
| +size_t TotalBufferSizeInBytes(const gfx::Size& size, |
| + gfx::GpuMemoryBuffer::Format format) { |
| + size_t size_in_bytes = 0u; |
| + for (size_t i = 0; i < NumberOfPlanesForGpuMemoryBufferFormat(format); ++i) { |
| + size_in_bytes += StrideInBytes(size.width(), format, i) * |
| + (size.height() / SubsamplingFactor(format, i)); |
| + } |
| + return size_in_bytes; |
| +} |
| + |
| class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { |
| public: |
| GpuMemoryBufferImpl(const gfx::Size& size, |
| @@ -43,11 +100,20 @@ class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { |
| // Overridden from gfx::GpuMemoryBuffer: |
| bool Map(void** data) override { |
| DCHECK(!mapped_); |
| - if (!shared_memory_->Map(StrideInBytes(size_.width(), format_) * |
| - size_.height())) |
| + if (!shared_memory_->Map(TotalBufferSizeInBytes(size_, format_))) |
| return false; |
| mapped_ = true; |
| - *data = shared_memory_->memory(); |
| + data[0] = shared_memory_->memory(); |
| + |
| + size_t num_planes = NumberOfPlanesForGpuMemoryBufferFormat(format_); |
| + if (num_planes > 1) { |
|
reveman
2015/04/07 19:03:24
nit: this if statement is not necessary, the for l
emircan
2015/04/07 20:08:12
For sure. Sorry for missing that, left from my ear
|
| + for (size_t i = 0; i < num_planes - 1; ++i) { |
| + size_t offset = StrideInBytes(size_.width(), format_, i) * |
| + (size_.height() / SubsamplingFactor(format_, i)); |
| + data[i + 1] = reinterpret_cast<uint8*>(data[i]) + offset; |
| + } |
| + } |
| + |
| return true; |
| } |
| void Unmap() override { |
| @@ -58,7 +124,10 @@ class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { |
| bool IsMapped() const override { return mapped_; } |
| Format GetFormat() const override { return format_; } |
| void GetStride(uint32* stride) const override { |
| - *stride = StrideInBytes(size_.width(), format_); |
| + for (size_t i = 0; i < NumberOfPlanesForGpuMemoryBufferFormat(format_); |
| + ++i) { |
| + stride[i] = StrideInBytes(size_.width(), format_, i); |
| + } |
| } |
| gfx::GpuMemoryBufferHandle GetHandle() const override { |
| gfx::GpuMemoryBufferHandle handle; |
| @@ -91,8 +160,7 @@ TestGpuMemoryBufferManager::AllocateGpuMemoryBuffer( |
| gfx::GpuMemoryBuffer::Format format, |
| gfx::GpuMemoryBuffer::Usage usage) { |
| scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory); |
| - if (!shared_memory->CreateAnonymous(StrideInBytes(size.width(), format) * |
| - size.height())) |
| + if (!shared_memory->CreateAnonymous(TotalBufferSizeInBytes(size, format))) |
| return nullptr; |
| return make_scoped_ptr<gfx::GpuMemoryBuffer>( |
| new GpuMemoryBufferImpl(size, format, shared_memory.Pass())); |