Commit 457e0a28 authored by Tanmoy Mollik's avatar Tanmoy Mollik Committed by Commit Bot

Convert wayland buffer to the new shared memory API.

This CL replaces the deprecated base::SharedMemoryHandle in wayland
buffer with base::UnsafeSharedMemoryRegion.

Bug: 947464
Change-Id: I00bbe0fa75144bff346b6bb156bdcb29abf4c4be
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1569129Reviewed-by: default avatarJochen Eisinger <jochen@chromium.org>
Reviewed-by: default avatarMaksim Sisov <msisov@igalia.com>
Reviewed-by: default avatarAntonio Gomes <tonikitoo@igalia.com>
Reviewed-by: default avatarAlex Ilin <alexilin@chromium.org>
Commit-Queue: Tanmoy Mollik <triploblastic@google.com>
Cr-Commit-Position: refs/heads/master@{#654817}
parent 0214e8ab
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include "base/command_line.h" #include "base/command_line.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/memory/platform_shared_memory_region.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkCanvas.h"
...@@ -742,11 +744,18 @@ std::unique_ptr<ClientBase::Buffer> ClientBase::CreateBuffer( ...@@ -742,11 +744,18 @@ std::unique_ptr<ClientBase::Buffer> ClientBase::CreateBuffer(
buffer = std::make_unique<Buffer>(); buffer = std::make_unique<Buffer>();
size_t stride = size.width() * kBytesPerPixel; size_t stride = size.width() * kBytesPerPixel;
buffer->shared_memory.reset(new base::SharedMemory()); base::UnsafeSharedMemoryRegion shared_memory_region =
buffer->shared_memory->CreateAndMapAnonymous(stride * size.height()); base::UnsafeSharedMemoryRegion::Create(stride * size.height());
buffer->shared_memory_mapping = shared_memory_region.Map();
base::subtle::PlatformSharedMemoryRegion platform_shared_memory =
base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
std::move(shared_memory_region));
// wl_shm_create_pool takes ownership of the file descriptor being passed.
buffer->shm_pool.reset(wl_shm_create_pool( buffer->shm_pool.reset(wl_shm_create_pool(
globals_.shm.get(), buffer->shared_memory->handle().GetHandle(), globals_.shm.get(),
buffer->shared_memory->requested_size())); platform_shared_memory.PassPlatformHandle().fd.release(),
buffer->shared_memory_mapping.size()));
buffer->buffer.reset(static_cast<wl_buffer*>( buffer->buffer.reset(static_cast<wl_buffer*>(
wl_shm_pool_create_buffer(buffer->shm_pool.get(), 0, size.width(), wl_shm_pool_create_buffer(buffer->shm_pool.get(), 0, size.width(),
...@@ -759,7 +768,7 @@ std::unique_ptr<ClientBase::Buffer> ClientBase::CreateBuffer( ...@@ -759,7 +768,7 @@ std::unique_ptr<ClientBase::Buffer> ClientBase::CreateBuffer(
buffer->sk_surface = SkSurface::MakeRasterDirect( buffer->sk_surface = SkSurface::MakeRasterDirect(
SkImageInfo::Make(size.width(), size.height(), kColorType, SkImageInfo::Make(size.width(), size.height(), kColorType,
kOpaque_SkAlphaType), kOpaque_SkAlphaType),
static_cast<uint8_t*>(buffer->shared_memory->memory()), stride); buffer->shared_memory_mapping.GetMemoryAs<uint8_t>(), stride);
DCHECK(buffer->sk_surface); DCHECK(buffer->sk_surface);
} }
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "base/memory/shared_memory.h" #include "base/memory/shared_memory_mapping.h"
#include "components/exo/wayland/clients/client_helper.h" #include "components/exo/wayland/clients/client_helper.h"
#include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkRefCnt.h" #include "third_party/skia/include/core/SkRefCnt.h"
...@@ -99,8 +99,8 @@ class ClientBase { ...@@ -99,8 +99,8 @@ class ClientBase {
#endif // defined(USE_VULKAN) #endif // defined(USE_VULKAN)
#endif // defined(USE_GBM) #endif // defined(USE_GBM)
std::unique_ptr<zwp_linux_buffer_params_v1> params; std::unique_ptr<zwp_linux_buffer_params_v1> params;
std::unique_ptr<base::SharedMemory> shared_memory;
std::unique_ptr<wl_shm_pool> shm_pool; std::unique_ptr<wl_shm_pool> shm_pool;
base::WritableSharedMemoryMapping shared_memory_mapping;
sk_sp<SkSurface> sk_surface; sk_sp<SkSurface> sk_surface;
}; };
......
...@@ -177,12 +177,19 @@ void WaylandKeyboardDelegate::SendLayout(const xkb_rule_names* names) { ...@@ -177,12 +177,19 @@ void WaylandKeyboardDelegate::SendLayout(const xkb_rule_names* names) {
xkb_keymap_get_as_string(xkb_keymap_.get(), XKB_KEYMAP_FORMAT_TEXT_V1)); xkb_keymap_get_as_string(xkb_keymap_.get(), XKB_KEYMAP_FORMAT_TEXT_V1));
DCHECK(keymap_string.get()); DCHECK(keymap_string.get());
size_t keymap_size = strlen(keymap_string.get()) + 1; size_t keymap_size = strlen(keymap_string.get()) + 1;
base::SharedMemory shared_keymap;
bool rv = shared_keymap.CreateAndMapAnonymous(keymap_size); base::UnsafeSharedMemoryRegion shared_keymap_region =
DCHECK(rv); base::UnsafeSharedMemoryRegion::Create(keymap_size);
base::WritableSharedMemoryMapping shared_keymap = shared_keymap_region.Map();
base::subtle::PlatformSharedMemoryRegion platform_shared_keymap =
base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
std::move(shared_keymap_region));
DCHECK(shared_keymap.IsValid());
memcpy(shared_keymap.memory(), keymap_string.get(), keymap_size); memcpy(shared_keymap.memory(), keymap_string.get(), keymap_size);
wl_keyboard_send_keymap(keyboard_resource_, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1, wl_keyboard_send_keymap(
shared_keymap.handle().GetHandle(), keymap_size); keyboard_resource_, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
platform_shared_keymap.PassPlatformHandle().fd.release(), keymap_size);
wl_client_flush(client()); wl_client_flush(client());
} }
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include "base/memory/shared_memory.h"
#include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/skia_util.h" #include "ui/gfx/skia_util.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h" #include "ui/ozone/platform/wayland/common/wayland_util.h"
......
...@@ -18,7 +18,9 @@ ...@@ -18,7 +18,9 @@
#if BUILDFLAG(USE_XKBCOMMON) #if BUILDFLAG(USE_XKBCOMMON)
#include "base/memory/free_deleter.h" #include "base/memory/free_deleter.h"
#include "base/memory/shared_memory.h" #include "base/memory/platform_shared_memory_region.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "ui/events/keycodes/scoped_xkb.h" // nogncheck #include "ui/events/keycodes/scoped_xkb.h" // nogncheck
#endif #endif
...@@ -53,13 +55,20 @@ class WaylandKeyboardTest : public WaylandTest { ...@@ -53,13 +55,20 @@ class WaylandKeyboardTest : public WaylandTest {
xkb_keymap_get_as_string(xkb_keymap_.get(), XKB_KEYMAP_FORMAT_TEXT_V1)); xkb_keymap_get_as_string(xkb_keymap_.get(), XKB_KEYMAP_FORMAT_TEXT_V1));
DCHECK(keymap_string.get()); DCHECK(keymap_string.get());
size_t keymap_size = strlen(keymap_string.get()) + 1; size_t keymap_size = strlen(keymap_string.get()) + 1;
base::SharedMemory shared_keymap;
bool rv = shared_keymap.CreateAndMapAnonymous(keymap_size); base::UnsafeSharedMemoryRegion shared_keymap_region =
DCHECK(rv); base::UnsafeSharedMemoryRegion::Create(keymap_size);
base::WritableSharedMemoryMapping shared_keymap =
shared_keymap_region.Map();
base::subtle::PlatformSharedMemoryRegion platform_shared_keymap =
base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
std::move(shared_keymap_region));
DCHECK(shared_keymap.IsValid());
memcpy(shared_keymap.memory(), keymap_string.get(), keymap_size); memcpy(shared_keymap.memory(), keymap_string.get(), keymap_size);
wl_keyboard_send_keymap(keyboard_->resource(), wl_keyboard_send_keymap(
WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1, keyboard_->resource(), WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
shared_keymap.handle().GetHandle(), keymap_size); platform_shared_keymap.PassPlatformHandle().fd.release(), keymap_size);
#endif #endif
} }
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "ui/ozone/platform/wayland/host/wayland_shm_buffer.h" #include "ui/ozone/platform/wayland/host/wayland_shm_buffer.h"
#include "base/memory/platform_shared_memory_region.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "ui/gfx/skia_util.h" #include "ui/gfx/skia_util.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h" #include "ui/ozone/platform/wayland/host/wayland_connection.h"
...@@ -16,7 +18,7 @@ const uint32_t kShmFormat = WL_SHM_FORMAT_ARGB8888; ...@@ -16,7 +18,7 @@ const uint32_t kShmFormat = WL_SHM_FORMAT_ARGB8888;
namespace ui { namespace ui {
WaylandShmBuffer::WaylandShmBuffer(wl_shm* shm, const gfx::Size& size) WaylandShmBuffer::WaylandShmBuffer(wl_shm* shm, const gfx::Size& size)
: size_(size), shared_memory_(std::make_unique<base::SharedMemory>()) { : size_(size) {
Initialize(shm); Initialize(shm);
} }
...@@ -35,19 +37,25 @@ void WaylandShmBuffer::Initialize(wl_shm* shm) { ...@@ -35,19 +37,25 @@ void WaylandShmBuffer::Initialize(wl_shm* shm) {
if (buffer_size == SIZE_MAX) if (buffer_size == SIZE_MAX)
return; return;
if (!shared_memory_->CreateAndMapAnonymous(buffer_size)) { base::UnsafeSharedMemoryRegion shared_memory_region =
base::UnsafeSharedMemoryRegion::Create(buffer_size);
shared_memory_mapping_ = shared_memory_region.Map();
if (!shared_memory_mapping_.IsValid()) {
PLOG(ERROR) << "Create and mmap failed."; PLOG(ERROR) << "Create and mmap failed.";
return; return;
} }
base::subtle::PlatformSharedMemoryRegion platform_shared_memory =
base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
std::move(shared_memory_region));
auto handle = shared_memory_->handle().GetHandle(); wl::Object<wl_shm_pool> pool(wl_shm_create_pool(
wl::Object<wl_shm_pool> pool(wl_shm_create_pool(shm, handle, buffer_size)); shm, platform_shared_memory.PassPlatformHandle().fd.release(),
buffer_size));
auto* new_buffer = wl_shm_pool_create_buffer( auto* new_buffer = wl_shm_pool_create_buffer(
pool.get(), 0, size_.width(), size_.height(), stride, kShmFormat); pool.get(), 0, size_.width(), size_.height(), stride, kShmFormat);
if (!new_buffer) { if (!new_buffer) {
shared_memory_->Unmap(); shared_memory_mapping_ = base::WritableSharedMemoryMapping();
shared_memory_->Close();
return; return;
} }
...@@ -56,9 +64,9 @@ void WaylandShmBuffer::Initialize(wl_shm* shm) { ...@@ -56,9 +64,9 @@ void WaylandShmBuffer::Initialize(wl_shm* shm) {
} }
uint8_t* WaylandShmBuffer::GetMemory() const { uint8_t* WaylandShmBuffer::GetMemory() const {
if (!IsValid() || !shared_memory_) if (!IsValid() || !shared_memory_mapping_.IsValid())
return nullptr; return nullptr;
return static_cast<uint8_t*>(shared_memory_->memory()); return shared_memory_mapping_.GetMemoryAs<uint8_t>();
} }
} // namespace ui } // namespace ui
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
#include <memory> #include <memory>
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/shared_memory.h" #include "base/memory/shared_memory_mapping.h"
#include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/core/SkSurface.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
...@@ -54,7 +54,7 @@ class WaylandShmBuffer { ...@@ -54,7 +54,7 @@ class WaylandShmBuffer {
gfx::Size size_; gfx::Size size_;
int stride_; int stride_;
wl::Object<wl_buffer> buffer_; wl::Object<wl_buffer> buffer_;
std::unique_ptr<base::SharedMemory> shared_memory_ = nullptr; base::WritableSharedMemoryMapping shared_memory_mapping_;
DISALLOW_COPY_AND_ASSIGN(WaylandShmBuffer); DISALLOW_COPY_AND_ASSIGN(WaylandShmBuffer);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment