OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/mojo/buffer_types_struct_traits.h" | 5 #include "ui/gfx/mojo/buffer_types_struct_traits.h" |
6 | 6 |
7 #include "mojo/public/cpp/system/platform_handle.h" | 7 #include "mojo/public/cpp/system/platform_handle.h" |
8 | 8 |
9 namespace mojo { | 9 namespace mojo { |
10 | 10 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 return false; | 53 return false; |
54 constexpr bool auto_close = true; | 54 constexpr bool auto_close = true; |
55 out->fds.push_back(base::FileDescriptor(platform_file, auto_close)); | 55 out->fds.push_back(base::FileDescriptor(platform_file, auto_close)); |
56 } | 56 } |
57 return data.ReadPlanes(&out->planes); | 57 return data.ReadPlanes(&out->planes); |
58 #else | 58 #else |
59 return false; | 59 return false; |
60 #endif | 60 #endif |
61 } | 61 } |
62 | 62 |
63 mojo::ScopedHandle StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView, | 63 mojo::ScopedSharedBufferHandle |
64 gfx::GpuMemoryBufferHandle>:: | 64 StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView, |
| 65 gfx::GpuMemoryBufferHandle>:: |
65 shared_memory_handle(const gfx::GpuMemoryBufferHandle& handle) { | 66 shared_memory_handle(const gfx::GpuMemoryBufferHandle& handle) { |
66 if (handle.type != gfx::SHARED_MEMORY_BUFFER) | 67 if (handle.type != gfx::SHARED_MEMORY_BUFFER) |
67 return mojo::ScopedHandle(); | 68 return mojo::ScopedSharedBufferHandle(); |
68 #if defined(OS_MACOSX) | 69 return mojo::WrapSharedMemoryHandle(handle.handle, handle.handle.GetSize(), |
69 base::SharedMemoryHandle shm_handle = handle.handle; | 70 false); |
70 size_t num_bytes = 0; | |
71 if (!shm_handle.GetSize(&num_bytes)) | |
72 return mojo::ScopedHandle(); | |
73 mojo::ScopedSharedBufferHandle scoped_handle = | |
74 mojo::WrapSharedMemoryHandle(shm_handle, num_bytes, false); | |
75 mojo::Handle mojo_handle = scoped_handle.release(); | |
76 return mojo::MakeScopedHandle(mojo_handle); | |
77 #else // defined(OS_MACOSX) | |
78 base::PlatformFile platform_file = handle.handle.GetHandle(); | |
79 return mojo::WrapPlatformFile(platform_file); | |
80 #endif // defined(OS_MACOSX) | |
81 } | 71 } |
82 | 72 |
83 const gfx::NativePixmapHandle& | 73 const gfx::NativePixmapHandle& |
84 StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView, | 74 StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView, |
85 gfx::GpuMemoryBufferHandle>:: | 75 gfx::GpuMemoryBufferHandle>:: |
86 native_pixmap_handle(const gfx::GpuMemoryBufferHandle& handle) { | 76 native_pixmap_handle(const gfx::GpuMemoryBufferHandle& handle) { |
87 #if defined(OS_LINUX) | 77 #if defined(OS_LINUX) |
88 return handle.native_pixmap_handle; | 78 return handle.native_pixmap_handle; |
89 #else | 79 #else |
90 static gfx::NativePixmapHandle pixmap_handle; | 80 static gfx::NativePixmapHandle pixmap_handle; |
(...skipping 14 matching lines...) Expand all Loading... |
105 } | 95 } |
106 | 96 |
107 bool StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView, | 97 bool StructTraits<gfx::mojom::GpuMemoryBufferHandleDataView, |
108 gfx::GpuMemoryBufferHandle>:: | 98 gfx::GpuMemoryBufferHandle>:: |
109 Read(gfx::mojom::GpuMemoryBufferHandleDataView data, | 99 Read(gfx::mojom::GpuMemoryBufferHandleDataView data, |
110 gfx::GpuMemoryBufferHandle* out) { | 100 gfx::GpuMemoryBufferHandle* out) { |
111 if (!data.ReadType(&out->type) || !data.ReadId(&out->id)) | 101 if (!data.ReadType(&out->type) || !data.ReadId(&out->id)) |
112 return false; | 102 return false; |
113 | 103 |
114 if (out->type == gfx::SHARED_MEMORY_BUFFER) { | 104 if (out->type == gfx::SHARED_MEMORY_BUFFER) { |
115 mojo::ScopedHandle handle = data.TakeSharedMemoryHandle(); | 105 mojo::ScopedSharedBufferHandle handle = data.TakeSharedMemoryHandle(); |
116 if (handle.is_valid()) { | 106 if (handle.is_valid()) { |
117 #if defined(OS_MACOSX) | |
118 mojo::Handle mojo_handle = handle.release(); | |
119 mojo::ScopedSharedBufferHandle buffer_handle = | |
120 mojo::MakeScopedHandle(mojo::SharedBufferHandle(mojo_handle.value())); | |
121 MojoResult unwrap_result = mojo::UnwrapSharedMemoryHandle( | 107 MojoResult unwrap_result = mojo::UnwrapSharedMemoryHandle( |
122 std::move(buffer_handle), &out->handle, nullptr, nullptr); | 108 std::move(handle), &out->handle, nullptr, nullptr); |
123 if (unwrap_result != MOJO_RESULT_OK) | 109 if (unwrap_result != MOJO_RESULT_OK) |
124 return false; | 110 return false; |
125 #else // defined(OS_MACOSX) | |
126 base::PlatformFile platform_file; | |
127 MojoResult unwrap_result = | |
128 mojo::UnwrapPlatformFile(std::move(handle), &platform_file); | |
129 if (unwrap_result != MOJO_RESULT_OK) | |
130 return false; | |
131 // TODO(rockot): Pass GUIDs through Mojo. https://crbug.com/713763. | |
132 // TODO(erikchen): During serialization, the SharedMemoryHandle is | |
133 // decomposed on Linux into a file_descriptor. The serialization path | |
134 // should be changed to serialize a Mojo shared buffer instead. | |
135 // https://crbug.com/713763. | |
136 base::UnguessableToken guid = base::UnguessableToken::Create(); | |
137 #if defined(OS_WIN) | |
138 out->handle = base::SharedMemoryHandle(platform_file, guid); | |
139 #else | |
140 out->handle = base::SharedMemoryHandle( | |
141 base::FileDescriptor(platform_file, true), guid); | |
142 #endif | |
143 #endif // defined(OS_MACOSX) | |
144 } | 111 } |
145 | 112 |
146 out->offset = data.offset(); | 113 out->offset = data.offset(); |
147 out->stride = data.stride(); | 114 out->stride = data.stride(); |
148 } | 115 } |
149 #if defined(OS_LINUX) | 116 #if defined(OS_LINUX) |
150 if (out->type == gfx::NATIVE_PIXMAP && | 117 if (out->type == gfx::NATIVE_PIXMAP && |
151 !data.ReadNativePixmapHandle(&out->native_pixmap_handle)) | 118 !data.ReadNativePixmapHandle(&out->native_pixmap_handle)) |
152 return false; | 119 return false; |
153 #endif | 120 #endif |
154 #if defined(OS_MACOSX) && !defined(OS_IOS) | 121 #if defined(OS_MACOSX) && !defined(OS_IOS) |
155 if (out->type == gfx::IO_SURFACE_BUFFER) { | 122 if (out->type == gfx::IO_SURFACE_BUFFER) { |
156 mach_port_t mach_port; | 123 mach_port_t mach_port; |
157 MojoResult unwrap_result = | 124 MojoResult unwrap_result = |
158 mojo::UnwrapMachPort(data.TakeMachPort(), &mach_port); | 125 mojo::UnwrapMachPort(data.TakeMachPort(), &mach_port); |
159 if (unwrap_result != MOJO_RESULT_OK) | 126 if (unwrap_result != MOJO_RESULT_OK) |
160 return false; | 127 return false; |
161 out->mach_port.reset(mach_port); | 128 out->mach_port.reset(mach_port); |
162 } | 129 } |
163 #endif | 130 #endif |
164 return true; | 131 return true; |
165 } | 132 } |
166 | 133 |
167 } // namespace mojo | 134 } // namespace mojo |
OLD | NEW |