Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Unified Diff: cc/test/test_gpu_memory_buffer_manager.cc

Issue 1062853002: Add gfx::GpuMemoryBuffer::YUV_420 and GpuMemoryBufferImplSharedMemory support (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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()));
« no previous file with comments | « no previous file | content/common/gpu/client/gpu_memory_buffer_impl.h » ('j') | content/common/gpu/client/gpu_memory_buffer_impl.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698