| 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..8887feb9c2fc6d663997beb1d6f8ec6a19ba6742 100644
|
| --- a/cc/test/test_gpu_memory_buffer_manager.cc
|
| +++ b/cc/test/test_gpu_memory_buffer_manager.cc
|
| @@ -10,26 +10,82 @@
|
| 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 BufferSizeInBytes(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 +99,17 @@ 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(BufferSizeInBytes(size_, format_)))
|
| return false;
|
| mapped_ = true;
|
| - *data = shared_memory_->memory();
|
| + data[0] = shared_memory_->memory();
|
| + for (size_t i = 0; i < NumberOfPlanesForGpuMemoryBufferFormat(format_) - 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 +120,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 +156,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(BufferSizeInBytes(size, format)))
|
| return nullptr;
|
| return make_scoped_ptr<gfx::GpuMemoryBuffer>(
|
| new GpuMemoryBufferImpl(size, format, shared_memory.Pass()));
|
|
|