// DRM output stuff #pragma once #include #include #include #include #include extern "C" { #include #include #include } #include "rendervulkan.hpp" #include #include #include #include #include #include struct plane { drmModePlane *plane; std::map props; }; struct crtc { drmModeCrtc *crtc; std::map props; }; struct connector { drmModeConnector *connector; std::map props; }; struct fb { uint32_t id; /* Client buffer, if any */ struct wlr_buffer *buf; /* A FB is held if it's being used by steamcompmgr */ bool held; /* Number of page-flips using the FB */ std::atomic< uint32_t > n_refs; }; struct drm_t { int fd; uint64_t cursor_width, cursor_height; bool allow_modifiers; struct wlr_drm_format_set formats; /* only used for atomic: */ struct plane *plane; struct crtc *crtc; struct connector *connector; int crtc_index; int kms_in_fence_fd; int kms_out_fence_fd; const drmModeModeInfo *mode; uint32_t mode_id; uint32_t crtc_id; uint32_t connector_id; uint32_t plane_id; struct wlr_drm_format_set plane_formats; drmModeAtomicReq *req; uint32_t flags; struct liftoff_device *lo_device; struct liftoff_output *lo_output; struct liftoff_layer *lo_layers[ k_nMaxLayers ]; /* FBs in the atomic request, but not yet submitted to KMS */ std::vector < uint32_t > fbids_in_req; /* FBs submitted to KMS, but not yet displayed on screen */ std::vector < uint32_t > fbids_queued; /* FBs currently on screen */ std::vector < uint32_t > fbids_on_screen; std::unordered_map< uint32_t, struct fb > map_fbid_inflightflips; std::mutex free_queue_lock; std::vector< uint32_t > fbid_free_queue; std::mutex flip_lock; std::atomic < uint64_t > flipcount; }; extern struct drm_t g_DRM; extern uint32_t g_nDRMFormat; extern bool g_bUseLayers; extern bool g_bRotated; extern bool g_bDebugLayers; int init_drm(struct drm_t *drm, const char *device); int drm_atomic_commit(struct drm_t *drm, struct Composite_t *pComposite, struct VulkanPipeline_t *pPipeline ); uint32_t drm_fbid_from_dmabuf( struct drm_t *drm, struct wlr_buffer *buf, struct wlr_dmabuf_attributes *dma_buf ); void drm_drop_fbid( struct drm_t *drm, uint32_t fbid ); bool drm_prepare( struct drm_t *drm, const struct Composite_t *pComposite, const struct VulkanPipeline_t *pPipeline );