blob: bb3bb45ac2781df3d2bd9fc0d57f7ff9ad7da182 [file] [log] [blame]
// 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.
#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DRM_H_
#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DRM_H_
#include <wayland-drm-client-protocol.h>
#include <vector>
#include "base/files/scoped_file.h"
#include "base/memory/raw_ptr.h"
#include "ui/ozone/platform/wayland/common/wayland_object.h"
#include "ui/ozone/platform/wayland/common/wayland_util.h"
struct wl_drm;
namespace gfx {
enum class BufferFormat : uint8_t;
class Size;
} // namespace gfx
namespace ui {
class WaylandConnection;
// Wrapper around |wl_drm| Wayland factory, which creates
// |wl_buffer|s backed by dmabuf prime file descriptors.
class WaylandDrm : public wl::GlobalObjectRegistrar<WaylandDrm> {
public:
static constexpr char kInterfaceName[] = "wl_drm";
static void Instantiate(WaylandConnection* connection,
wl_registry* registry,
uint32_t name,
const std::string& interface,
uint32_t version);
WaylandDrm(wl_drm* drm, WaylandConnection* connection);
WaylandDrm(const WaylandDrm&) = delete;
WaylandDrm& operator=(const WaylandDrm&) = delete;
~WaylandDrm();
// Says if can create dmabuf based wl_buffers.
bool SupportsDrmPrime() const;
// Requests to create a wl_buffer backed by the dmabuf prime |fd| descriptor.
// The result is sent back via the |callback|. If buffer creation failed,
// nullptr is sent back via the callback. Otherwise, a pointer to the
// |wl_buffer| is sent.
void CreateBuffer(const base::ScopedFD& fd,
const gfx::Size& size,
const std::vector<uint32_t>& strides,
const std::vector<uint32_t>& offsets,
const std::vector<uint64_t>& modifiers,
uint32_t format,
uint32_t planes_count,
wl::OnRequestBufferCallback callback);
// Returns supported buffer formats received from the Wayland compositor.
wl::BufferFormatsWithModifiersMap supported_buffer_formats() const {
return supported_buffer_formats_;
}
// Says if a new buffer can be created immediately.
bool CanCreateBufferImmed() const;
private:
// Resets the |wl_drm| and prints the error.
void HandleDrmFailure(const std::string& error);
// Receives supported |fourcc_format| from either ::Format call.
void AddSupportedFourCCFormat(uint32_t fourcc_format);
// Authenticates the drm device passed in the |drm_device_path|.
void Authenticate(const char* drm_device_path);
// Completes the drm device authentication.
void DrmDeviceAuthenticated(wl_drm* wl_drm);
// Checks the capabilities of the drm device.
void HandleCapabilities(uint32_t value);
// wl_drm_listener callbacks:
static void OnDevice(void* data, wl_drm* drm, const char* drm_device_path);
static void OnFormat(void* data, wl_drm* drm, uint32_t format);
static void OnAuthenticated(void* data, wl_drm* drm);
static void OnCapabilities(void* data, wl_drm* drm, uint32_t value);
// Holds pointer to the wl_drm Wayland factory.
wl::Object<wl_drm> wl_drm_;
// Non-owned.
const raw_ptr<WaylandConnection> connection_;
// Holds supported DRM formats translated to gfx::BufferFormat. Note that
// |wl_drm| neither announces modifiers nor allows to create buffers with
// modifiers. Thus, they are always empty.
wl::BufferFormatsWithModifiersMap supported_buffer_formats_;
// Says if the drm device passed by the Wayland compositor authenticates this
// client.
bool authenticated_ = false;
};
} // namespace ui
#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_DRM_H_