Index: services/ui/public/cpp/mojo_gpu_memory_buffer_manager.cc |
diff --git a/services/ui/public/cpp/mojo_gpu_memory_buffer_manager.cc b/services/ui/public/cpp/mojo_gpu_memory_buffer_manager.cc |
index 342670b1f499efa0be663afe2770642a8451ec4b..81b5620d7bc213fb1886251dda83f112af64c5e4 100644 |
--- a/services/ui/public/cpp/mojo_gpu_memory_buffer_manager.cc |
+++ b/services/ui/public/cpp/mojo_gpu_memory_buffer_manager.cc |
@@ -4,22 +4,69 @@ |
#include "services/ui/public/cpp/mojo_gpu_memory_buffer_manager.h" |
+#include "base/bind.h" |
#include "base/logging.h" |
-#include "services/ui/public/cpp/mojo_gpu_memory_buffer.h" |
+#include "base/memory/ptr_util.h" |
+#include "base/memory/shared_memory.h" |
+#include "gpu/ipc/client/gpu_memory_buffer_impl.h" |
+#include "mojo/public/cpp/system/buffer.h" |
+#include "mojo/public/cpp/system/platform_handle.h" |
+#include "ui/gfx/buffer_format_util.h" |
namespace ui { |
-MojoGpuMemoryBufferManager::MojoGpuMemoryBufferManager() {} |
+MojoGpuMemoryBufferManager::MojoGpuMemoryBufferManager() |
+ : weak_ptr_factory_(this) {} |
MojoGpuMemoryBufferManager::~MojoGpuMemoryBufferManager() {} |
+void MojoGpuMemoryBufferManager::DeletedGpuMemoryBuffer( |
+ gfx::GpuMemoryBufferId id, |
+ const gpu::SyncToken& sync_token) { |
+} |
+ |
std::unique_ptr<gfx::GpuMemoryBuffer> |
MojoGpuMemoryBufferManager::AllocateGpuMemoryBuffer( |
const gfx::Size& size, |
gfx::BufferFormat format, |
gfx::BufferUsage usage, |
gpu::SurfaceHandle surface_handle) { |
- return MojoGpuMemoryBufferImpl::Create(size, format, usage); |
+ // TODO(sad): Get the memory buffer handle from GpuService. |
+ size_t bytes = gfx::BufferSizeForBufferFormat(size, format); |
+ |
+ mojo::ScopedSharedBufferHandle handle = |
+ mojo::SharedBufferHandle::Create(bytes); |
+ if (!handle.is_valid()) |
+ return nullptr; |
+ |
+ base::SharedMemoryHandle shm_handle; |
+ size_t shared_memory_size; |
+ bool readonly; |
+ MojoResult result = mojo::UnwrapSharedMemoryHandle( |
+ std::move(handle), &shm_handle, &shared_memory_size, &readonly); |
+ if (result != MOJO_RESULT_OK) |
+ return nullptr; |
+ DCHECK_EQ(shared_memory_size, bytes); |
+ |
+ const int stride = base::checked_cast<int>( |
+ gfx::RowSizeForBufferFormat(size.width(), format, 0)); |
+ |
+ gfx::GpuMemoryBufferHandle gmb_handle; |
+ gmb_handle.type = gfx::SHARED_MEMORY_BUFFER; |
+ gmb_handle.id = gfx::GpuMemoryBufferId(++counter_); |
+ gmb_handle.handle = shm_handle; |
+ gmb_handle.offset = 0; |
+ gmb_handle.stride = stride; |
+ |
+ std::unique_ptr<gpu::GpuMemoryBufferImpl> buffer( |
+ gpu::GpuMemoryBufferImpl::CreateFromHandle( |
+ gmb_handle, size, format, usage, |
+ base::Bind(&MojoGpuMemoryBufferManager::DeletedGpuMemoryBuffer, |
+ weak_ptr_factory_.GetWeakPtr(), gmb_handle.id))); |
+ if (!buffer) |
+ return nullptr; |
+ |
+ return std::move(buffer); |
} |
std::unique_ptr<gfx::GpuMemoryBuffer> |
@@ -27,20 +74,21 @@ MojoGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle( |
const gfx::GpuMemoryBufferHandle& handle, |
const gfx::Size& size, |
gfx::BufferFormat format) { |
- const gfx::BufferUsage usage = gfx::BufferUsage::GPU_READ; |
- return MojoGpuMemoryBufferImpl::CreateFromHandle(handle, size, format, usage); |
+ NOTIMPLEMENTED(); |
+ return nullptr; |
} |
gfx::GpuMemoryBuffer* |
MojoGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( |
ClientBuffer buffer) { |
- return MojoGpuMemoryBufferImpl::FromClientBuffer(buffer); |
+ return gpu::GpuMemoryBufferImpl::FromClientBuffer(buffer); |
} |
void MojoGpuMemoryBufferManager::SetDestructionSyncToken( |
gfx::GpuMemoryBuffer* buffer, |
const gpu::SyncToken& sync_token) { |
- NOTIMPLEMENTED(); |
+ static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token( |
+ sync_token); |
} |
} // namespace ui |