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

Unified Diff: services/ui/ws/gpu_service_proxy.cc

Issue 2479043002: mus: Get the gpu memory buffer from the window server. (Closed)
Patch Set: . Created 4 years, 1 month 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
« no previous file with comments | « services/ui/ws/gpu_service_proxy.h ('k') | ui/gfx/mojo/buffer_types_traits.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/ui/ws/gpu_service_proxy.cc
diff --git a/services/ui/ws/gpu_service_proxy.cc b/services/ui/ws/gpu_service_proxy.cc
index 2beb73c57504d3c05764bf59c4b9b2074e96147a..6d3b126bafbd28dae0334a4e66a9f1bd56544e55 100644
--- a/services/ui/ws/gpu_service_proxy.cc
+++ b/services/ui/ws/gpu_service_proxy.cc
@@ -9,9 +9,13 @@
#include "base/run_loop.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gpu/ipc/client/gpu_channel_host.h"
+#include "gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.h"
+#include "mojo/public/cpp/system/buffer.h"
+#include "mojo/public/cpp/system/platform_handle.h"
#include "services/service_manager/public/cpp/connection.h"
#include "services/ui/ws/gpu_service_proxy_delegate.h"
#include "services/ui/ws/mus_gpu_memory_buffer_manager.h"
+#include "ui/gfx/buffer_format_util.h"
namespace ui {
namespace ws {
@@ -98,14 +102,54 @@ void GpuServiceProxy::CreateGpuMemoryBuffer(
const gfx::Size& size,
gfx::BufferFormat format,
gfx::BufferUsage usage,
- uint64_t surface_id,
const mojom::GpuService::CreateGpuMemoryBufferCallback& callback) {
- NOTIMPLEMENTED();
+ // TODO(sad): Check to see if native gpu memory buffer can be used first.
+ if (!gpu::GpuMemoryBufferImplSharedMemory::IsUsageSupported(usage) ||
+ !gpu::GpuMemoryBufferImplSharedMemory::IsSizeValidForFormat(size,
+ format)) {
+ callback.Run(gfx::GpuMemoryBufferHandle());
+ return;
+ }
+
+ size_t bytes = 0;
+ if (!gfx::BufferSizeForBufferFormatChecked(size, format, &bytes)) {
+ callback.Run(gfx::GpuMemoryBufferHandle());
+ return;
+ }
+
+ mojo::ScopedSharedBufferHandle mojo_handle =
+ mojo::SharedBufferHandle::Create(bytes);
+ if (!mojo_handle.is_valid()) {
+ callback.Run(gfx::GpuMemoryBufferHandle());
+ return;
+ }
+
+ base::SharedMemoryHandle shm_handle;
+ size_t shm_size;
+ bool readonly;
+ MojoResult result = mojo::UnwrapSharedMemoryHandle(
+ std::move(mojo_handle), &shm_handle, &shm_size, &readonly);
+ if (result != MOJO_RESULT_OK) {
+ callback.Run(gfx::GpuMemoryBufferHandle());
+ return;
+ }
+ DCHECK_EQ(shm_size, bytes);
+ DCHECK(!readonly);
+ 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 = id;
+ gmb_handle.handle = shm_handle;
+ gmb_handle.offset = 0;
+ gmb_handle.stride = stride;
+ callback.Run(gmb_handle);
}
void GpuServiceProxy::DestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id,
const gpu::SyncToken& sync_token) {
reveman 2016/11/08 19:46:45 fyi: this sync_token is only needed for macos and
- NOTIMPLEMENTED();
+ // NOTIMPLEMENTED();
}
bool GpuServiceProxy::IsMainThread() {
« no previous file with comments | « services/ui/ws/gpu_service_proxy.h ('k') | ui/gfx/mojo/buffer_types_traits.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698