#ifndef UI_OZONE_PLATFORM_DRM_GPU_DRM_FRAMEBUFFER_H_
#define UI_OZONE_PLATFORM_DRM_GPU_DRM_FRAMEBUFFER_H_
#include <drm_fourcc.h>
#include <stdint.h>
#include <vector>
#include "base/memory/ref_counted.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/geometry/size.h"
namespace ui {
class DrmDevice;
class GbmBuffer;
class DrmFramebuffer : public base::RefCountedThreadSafe<DrmFramebuffer> {
public:
struct AddFramebufferParams {
AddFramebufferParams();
AddFramebufferParams(const AddFramebufferParams& other);
~AddFramebufferParams();
uint32_t flags = 0;
uint32_t format = DRM_FORMAT_XRGB8888;
uint64_t modifier = DRM_FORMAT_MOD_INVALID;
std::vector<uint64_t> preferred_modifiers;
bool is_original_buffer = true;
uint32_t width = 0;
uint32_t height = 0;
size_t num_planes = 0;
uint32_t handles[4] = {};
uint32_t strides[4] = {};
uint32_t offsets[4] = {};
};
static scoped_refptr<DrmFramebuffer> AddFramebuffer(
scoped_refptr<DrmDevice> drm_device,
AddFramebufferParams params);
static scoped_refptr<DrmFramebuffer> AddFramebuffer(
scoped_refptr<DrmDevice> drm_device,
const GbmBuffer* buffer,
const gfx::Size& framebuffer_size,
std::vector<uint64_t> preferred_modifiers = std::vector<uint64_t>(),
bool is_original_buffer = true);
DrmFramebuffer(scoped_refptr<DrmDevice> drm_device,
uint32_t framebuffer_id,
uint32_t framebuffer_pixel_format,
uint32_t opaque_framebuffer_id,
uint32_t opaque_framebuffer_pixel_format,
uint64_t format_modifier,
std::vector<uint64_t> preferred_modifiers,
const gfx::Size& size,
bool is_original_buffer);
uint32_t framebuffer_id() const { return framebuffer_id_; }
uint32_t opaque_framebuffer_id() const {
return opaque_framebuffer_id_ ? opaque_framebuffer_id_ : framebuffer_id_;
}
uint32_t framebuffer_pixel_format() const {
return framebuffer_pixel_format_;
}
uint32_t is_original_buffer() const { return is_original_buffer_; }
uint32_t opaque_framebuffer_pixel_format() const {
return opaque_framebuffer_pixel_format_;
}
uint64_t format_modifier() const { return format_modifier_; }
const std::vector<uint64_t>& preferred_modifiers() const {
return preferred_modifiers_;
}
gfx::Size size() const { return size_; }
const scoped_refptr<DrmDevice>& drm_device() const { return drm_device_; }
int modeset_sequence_id_at_allocation() const {
return modeset_sequence_id_at_allocation_;
}
private:
~DrmFramebuffer();
const scoped_refptr<DrmDevice> drm_device_;
const uint32_t framebuffer_id_;
const uint32_t framebuffer_pixel_format_;
const uint32_t opaque_framebuffer_id_;
const uint32_t opaque_framebuffer_pixel_format_;
const uint64_t format_modifier_;
bool is_original_buffer_ = true;
const std::vector<uint64_t> preferred_modifiers_;
const gfx::Size size_;
const int modeset_sequence_id_at_allocation_ = 0;
friend class base::RefCountedThreadSafe<DrmFramebuffer>;
};
}
#endif