#ifndef UI_OZONE_PLATFORM_DRM_GPU_DRM_DEVICE_H_
#define UI_OZONE_PLATFORM_DRM_GPU_DRM_DEVICE_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <vector>
#include "base/files/file_path.h"
#include "base/functional/callback.h"
#include "base/memory/ref_counted.h"
#include "base/time/time.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"
#include "ui/ozone/platform/drm/common/drm_wrapper.h"
#include "ui/ozone/platform/drm/common/scoped_drm_types.h"
#include "ui/ozone/platform/drm/gpu/page_flip_request.h"
namespace ui {
class HardwareDisplayPlaneManager;
class GbmDevice;
class DrmDevice : public DrmWrapper,
public base::RefCountedThreadSafe<DrmDevice> {
public:
using PageFlipCallback =
base::OnceCallback<void(unsigned int ,
base::TimeTicks )>;
DrmDevice(const base::FilePath& device_path,
base::ScopedFD fd,
bool is_primary_device,
std::unique_ptr<GbmDevice> gbm_device);
DrmDevice(const DrmDevice&) = delete;
DrmDevice& operator=(const DrmDevice&) = delete;
bool Initialize() override;
bool SetCrtc(uint32_t crtc_id,
uint32_t framebuffer,
std::vector<uint32_t> connectors,
const drmModeModeInfo& mode) override;
virtual bool PageFlip(uint32_t crtc_id,
uint32_t framebuffer,
scoped_refptr<PageFlipRequest> page_flip_request);
virtual bool CommitProperties(
drmModeAtomicReq* properties,
uint32_t flags,
uint32_t crtc_count,
scoped_refptr<PageFlipRequest> page_flip_request);
void WriteIntoTrace(perfetto::TracedDictionary dict) const override;
display::DrmFormatsAndModifiers GetFormatsAndModifiersForCrtc(
uint32_t crtc_id) const override;
virtual int modeset_sequence_id() const;
HardwareDisplayPlaneManager* plane_manager() { return plane_manager_.get(); }
const HardwareDisplayPlaneManager* plane_manager() const {
return plane_manager_.get();
}
GbmDevice* gbm_device() const { return gbm_.get(); }
protected:
friend class base::RefCountedThreadSafe<DrmDevice>;
~DrmDevice() override;
std::unique_ptr<HardwareDisplayPlaneManager> plane_manager_;
private:
class IOWatcher;
class PageFlipManager;
int modeset_sequence_id_ = 0;
std::unique_ptr<PageFlipManager> page_flip_manager_;
std::unique_ptr<IOWatcher> watcher_;
const std::unique_ptr<GbmDevice> gbm_;
};
}
#endif