Chromium Code Reviews| Index: gpu/command_buffer/tests/gl_manager.cc |
| diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc |
| index 67bdbb890cb86a3ded64789f0aeda0d1818661f2..3f953dfc3e5174615d2e95fa990273766a6d02e7 100644 |
| --- a/gpu/command_buffer/tests/gl_manager.cc |
| +++ b/gpu/command_buffer/tests/gl_manager.cc |
| @@ -38,28 +38,85 @@ |
| namespace gpu { |
| 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::BGRA_8888: |
| + DCHECK_EQ(plane, 0); |
| return width * 4; |
| case gfx::GpuMemoryBuffer::RGBX_8888: |
| NOTREACHED(); |
| return 0; |
| + 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(base::RefCountedBytes* bytes, |
| @@ -73,15 +130,26 @@ class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { |
| // Overridden from gfx::GpuMemoryBuffer: |
| bool Map(void** data) override { |
| + data[0] = &bytes_->data().front(); |
| + size_t num_planes = NumberOfPlanesForGpuMemoryBufferFormat(format_); |
| + if (num_planes > 1) { |
|
reveman
2015/04/07 19:03:25
nit: this if statement is not necessary, the for l
|
| + 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; |
| + } |
| + } |
| mapped_ = true; |
| - *data = &bytes_->data().front(); |
| return true; |
| } |
| void Unmap() override { mapped_ = false; } |
| 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 { |
| NOTREACHED(); |
| @@ -143,8 +211,7 @@ GLManager::~GLManager() { |
| scoped_ptr<gfx::GpuMemoryBuffer> GLManager::CreateGpuMemoryBuffer( |
| const gfx::Size& size, |
| gfx::GpuMemoryBuffer::Format format) { |
| - std::vector<unsigned char> data( |
| - StrideInBytes(size.width(), format) * size.height(), 0); |
| + std::vector<unsigned char> data(TotalBufferSizeInBytes(size, format), 0); |
| scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes(data)); |
| return make_scoped_ptr<gfx::GpuMemoryBuffer>( |
| new GpuMemoryBufferImpl(bytes.get(), size, format)); |