1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/ozone/platform/wayland/host/wayland_shm_buffer.h"
#include "base/logging.h"
#include "base/memory/platform_shared_memory_region.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "ui/gfx/geometry/skia_conversions.h"
#include "ui/ozone/platform/wayland/host/wayland_buffer_factory.h"
#include "ui/ozone/platform/wayland/host/wayland_connection.h"
namespace ui {
WaylandShmBuffer::WaylandShmBuffer(WaylandBufferFactory* buffer_factory,
const gfx::Size& size)
: size_(size) {
Initialize(buffer_factory);
}
WaylandShmBuffer::~WaylandShmBuffer() = default;
WaylandShmBuffer::WaylandShmBuffer(WaylandShmBuffer&& buffer) = default;
WaylandShmBuffer& WaylandShmBuffer::operator=(WaylandShmBuffer&& buffer) =
default;
void WaylandShmBuffer::Initialize(WaylandBufferFactory* buffer_factory) {
DCHECK(buffer_factory);
SkImageInfo info = SkImageInfo::MakeN32Premul(size_.width(), size_.height());
int stride = info.minRowBytes();
size_t buffer_size = info.computeByteSize(stride);
if (buffer_size == SIZE_MAX)
return;
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));
base::subtle::ScopedFDPair fd_pair =
platform_shared_memory.PassPlatformHandle();
buffer_ = buffer_factory->CreateShmBuffer(std::move(fd_pair.fd), buffer_size,
size_);
if (!buffer_) {
shared_memory_mapping_ = base::WritableSharedMemoryMapping();
return;
}
stride_ = stride;
}
uint8_t* WaylandShmBuffer::GetMemory() {
if (!IsValid() || !shared_memory_mapping_.IsValid())
return nullptr;
return shared_memory_mapping_.GetMemoryAs<uint8_t>();
}
} // namespace ui
|