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 @@
#include "base/command_line.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/stringprintf.h"
#include "third_party/skia/include/core/SkCanvas.h"
......@@ -742,11 +744,18 @@ std::unique_ptr<ClientBase::Buffer> ClientBase::CreateBuffer(
buffer = std::make_unique<Buffer>();
size_t stride = size.width() * kBytesPerPixel;
buffer->shared_memory.reset(new base::SharedMemory());
buffer->shared_memory->CreateAndMapAnonymous(stride * size.height());
base::UnsafeSharedMemoryRegion shared_memory_region =
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(
globals_.shm.get(), buffer->shared_memory->handle().GetHandle(),
buffer->shared_memory->requested_size()));
globals_.shm.get(),
platform_shared_memory.PassPlatformHandle().fd.release(),
buffer->shared_memory_mapping.size()));
buffer->buffer.reset(static_cast<wl_buffer*>(
wl_shm_pool_create_buffer(buffer->shm_pool.get(), 0, size.width(),
......@@ -759,7 +768,7 @@ std::unique_ptr<ClientBase::Buffer> ClientBase::CreateBuffer(
buffer->sk_surface = SkSurface::MakeRasterDirect(
SkImageInfo::Make(size.width(), size.height(), kColorType,
kOpaque_SkAlphaType),
static_cast<uint8_t*>(buffer->shared_memory->memory()), stride);
buffer->shared_memory_mapping.GetMemoryAs<uint8_t>(), stride);
DCHECK(buffer->sk_surface);
}
......
......@@ -9,7 +9,7 @@
#include <string>
#include <vector>
#include "base/memory/shared_memory.h"
#include "base/memory/shared_memory_mapping.h"
#include "components/exo/wayland/clients/client_helper.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkRefCnt.h"
......@@ -99,8 +99,8 @@ class ClientBase {
#endif // defined(USE_VULKAN)
#endif // defined(USE_GBM)
std::unique_ptr<zwp_linux_buffer_params_v1> params;
std::unique_ptr<base::SharedMemory> shared_memory;
std::unique_ptr<wl_shm_pool> shm_pool;
base::WritableSharedMemoryMapping shared_memory_mapping;
sk_sp<SkSurface> sk_surface;
};
......
......@@ -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));
DCHECK(keymap_string.get());
size_t keymap_size = strlen(keymap_string.get()) + 1;
base::SharedMemory shared_keymap;
bool rv = shared_keymap.CreateAndMapAnonymous(keymap_size);
DCHECK(rv);
base::UnsafeSharedMemoryRegion shared_keymap_region =
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);
wl_keyboard_send_keymap(keyboard_resource_, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
shared_keymap.handle().GetHandle(), keymap_size);
wl_keyboard_send_keymap(
keyboard_resource_, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
platform_shared_keymap.PassPlatformHandle().fd.release(), keymap_size);
wl_client_flush(client());
}
......
......@@ -7,7 +7,6 @@
#include <memory>
#include <vector>
#include "base/memory/shared_memory.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/skia_util.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
......
......@@ -18,7 +18,9 @@
#if BUILDFLAG(USE_XKBCOMMON)
#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
#endif
......@@ -53,13 +55,20 @@ class WaylandKeyboardTest : public WaylandTest {
xkb_keymap_get_as_string(xkb_keymap_.get(), XKB_KEYMAP_FORMAT_TEXT_V1));
DCHECK(keymap_string.get());
size_t keymap_size = strlen(keymap_string.get()) + 1;
base::SharedMemory shared_keymap;
bool rv = shared_keymap.CreateAndMapAnonymous(keymap_size);
DCHECK(rv);
base::UnsafeSharedMemoryRegion shared_keymap_region =
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);
wl_keyboard_send_keymap(keyboard_->resource(),
WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
shared_keymap.handle().GetHandle(), keymap_size);
wl_keyboard_send_keymap(
keyboard_->resource(), WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
platform_shared_keymap.PassPlatformHandle().fd.release(), keymap_size);
#endif
}
......
......@@ -4,6 +4,8 @@
#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/ozone/platform/wayland/host/wayland_connection.h"
......@@ -16,7 +18,7 @@ const uint32_t kShmFormat = WL_SHM_FORMAT_ARGB8888;
namespace ui {
WaylandShmBuffer::WaylandShmBuffer(wl_shm* shm, const gfx::Size& size)
: size_(size), shared_memory_(std::make_unique<base::SharedMemory>()) {
: size_(size) {
Initialize(shm);
}
......@@ -35,19 +37,25 @@ void WaylandShmBuffer::Initialize(wl_shm* shm) {
if (buffer_size == SIZE_MAX)
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.";
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(shm, handle, buffer_size));
wl::Object<wl_shm_pool> pool(wl_shm_create_pool(
shm, platform_shared_memory.PassPlatformHandle().fd.release(),
buffer_size));
auto* new_buffer = wl_shm_pool_create_buffer(
pool.get(), 0, size_.width(), size_.height(), stride, kShmFormat);
if (!new_buffer) {
shared_memory_->Unmap();
shared_memory_->Close();
shared_memory_mapping_ = base::WritableSharedMemoryMapping();
return;
}
......@@ -56,9 +64,9 @@ void WaylandShmBuffer::Initialize(wl_shm* shm) {
}
uint8_t* WaylandShmBuffer::GetMemory() const {
if (!IsValid() || !shared_memory_)
if (!IsValid() || !shared_memory_mapping_.IsValid())
return nullptr;
return static_cast<uint8_t*>(shared_memory_->memory());
return shared_memory_mapping_.GetMemoryAs<uint8_t>();
}
} // namespace ui
......@@ -10,7 +10,7 @@
#include <memory>
#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/SkSurface.h"
#include "ui/gfx/geometry/size.h"
......@@ -54,7 +54,7 @@ class WaylandShmBuffer {
gfx::Size size_;
int stride_;
wl::Object<wl_buffer> buffer_;
std::unique_ptr<base::SharedMemory> shared_memory_ = nullptr;
base::WritableSharedMemoryMapping shared_memory_mapping_;
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