// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "cc/test/test_gpu_memory_buffer_manager.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "ui/gfx/buffer_format_util.h" #include "ui/gfx/gpu_memory_buffer.h" namespace cc { namespace { class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { public: GpuMemoryBufferImpl(const gfx::Size& size, gfx::BufferFormat format, scoped_ptr shared_memory) : size_(size), format_(format), shared_memory_(shared_memory.Pass()), mapped_(false) {} // Overridden from gfx::GpuMemoryBuffer: bool Map(void** data) override { DCHECK(!mapped_); if (!shared_memory_->Map(gfx::BufferSizeForBufferFormat(size_, format_))) return false; mapped_ = true; size_t offset = 0; int num_planes = static_cast(gfx::NumberOfPlanesForBufferFormat(format_)); for (int i = 0; i < num_planes; ++i) { data[i] = reinterpret_cast(shared_memory_->memory()) + offset; offset += gfx::RowSizeForBufferFormat(size_.width(), format_, i) * (size_.height() / gfx::SubsamplingFactorForBufferFormat(format_, i)); } return true; } void Unmap() override { DCHECK(mapped_); shared_memory_->Unmap(); mapped_ = false; } gfx::Size GetSize() const override { return size_; } gfx::BufferFormat GetFormat() const override { return format_; } void GetStride(int* stride) const override { int num_planes = static_cast(gfx::NumberOfPlanesForBufferFormat(format_)); for (int i = 0; i < num_planes; ++i) stride[i] = base::checked_cast( gfx::RowSizeForBufferFormat(size_.width(), format_, i)); } gfx::GpuMemoryBufferId GetId() const override { NOTREACHED(); return gfx::GpuMemoryBufferId(0); } gfx::GpuMemoryBufferHandle GetHandle() const override { gfx::GpuMemoryBufferHandle handle; handle.type = gfx::SHARED_MEMORY_BUFFER; handle.handle = shared_memory_->handle(); return handle; } ClientBuffer AsClientBuffer() override { return reinterpret_cast(this); } private: const gfx::Size size_; gfx::BufferFormat format_; scoped_ptr shared_memory_; bool mapped_; }; } // namespace TestGpuMemoryBufferManager::TestGpuMemoryBufferManager() { } TestGpuMemoryBufferManager::~TestGpuMemoryBufferManager() { } scoped_ptr TestGpuMemoryBufferManager::AllocateGpuMemoryBuffer(const gfx::Size& size, gfx::BufferFormat format, gfx::BufferUsage usage) { scoped_ptr shared_memory(new base::SharedMemory); const size_t buffer_size = gfx::BufferSizeForBufferFormat(size, format); if (!shared_memory->CreateAnonymous(buffer_size)) return nullptr; return make_scoped_ptr( new GpuMemoryBufferImpl(size, format, shared_memory.Pass())); } scoped_ptr TestGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle( const gfx::GpuMemoryBufferHandle& handle, const gfx::Size& size, gfx::BufferFormat format) { NOTREACHED(); return nullptr; } gfx::GpuMemoryBuffer* TestGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( ClientBuffer buffer) { return reinterpret_cast(buffer); } void TestGpuMemoryBufferManager::SetDestructionSyncPoint( gfx::GpuMemoryBuffer* buffer, uint32 sync_point) { } } // namespace cc