diff options
Diffstat (limited to 'video/out/drm_common.h')
-rw-r--r-- | video/out/drm_common.h | 122 |
1 files changed, 70 insertions, 52 deletions
diff --git a/video/out/drm_common.h b/video/out/drm_common.h index aa08312ad2..9418b3f31e 100644 --- a/video/out/drm_common.h +++ b/video/out/drm_common.h @@ -21,73 +21,91 @@ #include <stdbool.h> #include <xf86drm.h> #include <xf86drmMode.h> -#include "options/m_option.h" -#include "drm_atomic.h" +#include "vo.h" -#define DRM_OPTS_FORMAT_XRGB8888 0 -#define DRM_OPTS_FORMAT_XRGB2101010 1 +enum { + DRM_OPTS_FORMAT_XRGB8888, + DRM_OPTS_FORMAT_XRGB2101010, + DRM_OPTS_FORMAT_XBGR8888, + DRM_OPTS_FORMAT_XBGR2101010, + DRM_OPTS_FORMAT_YUYV, +}; -struct kms { - struct mp_log *log; +struct framebuffer { int fd; - drmModeConnector *connector; - drmModeEncoder *encoder; - struct drm_mode mode; - uint32_t crtc_id; - int card_no; - struct drm_atomic_context *atomic_context; + uint32_t width; + uint32_t height; + uint32_t stride; + uint32_t size; + uint32_t handle; + uint8_t *map; + uint32_t id; }; -struct vt_switcher { - int tty_fd; - struct mp_log *log; - void (*handlers[2])(void*); - void *handler_data[2]; +struct drm_mode { + drmModeModeInfo mode; + uint32_t blob_id; }; struct drm_opts { - char *drm_connector_spec; - char *drm_mode_spec; + char *device_path; + char *connector_spec; + char *mode_spec; int drm_atomic; - int drm_draw_plane; - int drm_drmprime_video_plane; + int draw_plane; + int drmprime_video_plane; int drm_format; - struct m_geometry drm_draw_surface_size; + struct m_geometry draw_surface_size; + int vrr_enabled; }; -struct drm_vsync_tuple { - uint64_t ust; - unsigned int msc; - unsigned int sbc; +struct vt_switcher { + int tty_fd; + struct mp_log *log; + void (*handlers[2])(void*); + void *handler_data[2]; }; -struct drm_pflip_cb_closure { - struct drm_vsync_tuple *frame_vsync; // vsync tuple when the frame that just flipped was queued - struct drm_vsync_tuple *vsync; // vsync tuple of the latest page flip. drm_pflip_cb updates this - struct vo_vsync_info *vsync_info; // where the drm_pflip_cb routine writes its output - bool *waiting_for_flip; // drm_pflip_cb writes false here before returning - struct mp_log *log; // Needed to print error messages that shame bad drivers +struct vo_drm_state { + drmModeConnector *connector; + drmModeEncoder *encoder; + drmEventContext ev; + + struct drm_atomic_context *atomic_context; + struct drm_mode mode; + struct drm_opts *opts; + struct framebuffer *fb; + struct mp_log *log; + struct mp_present *present; + struct vo *vo; + struct vt_switcher vt_switcher; + + bool active; + bool paused; + bool still; + bool vt_switcher_active; + bool waiting_for_flip; + + char *card_path; + int card_no; + int fd; + + uint32_t crtc_id; + uint32_t height; + uint32_t width; }; -bool vt_switcher_init(struct vt_switcher *s, struct mp_log *log); -void vt_switcher_destroy(struct vt_switcher *s); -void vt_switcher_poll(struct vt_switcher *s, int timeout_ms); -void vt_switcher_interrupt_poll(struct vt_switcher *s); - -void vt_switcher_acquire(struct vt_switcher *s, void (*handler)(void*), - void *user_data); -void vt_switcher_release(struct vt_switcher *s, void (*handler)(void*), - void *user_data); - -struct kms *kms_create(struct mp_log *log, const char *connector_spec, - const char *mode_spec, - int draw_plane, int drmprime_video_plane, - bool use_atomic); -void kms_destroy(struct kms *kms); -double kms_get_display_fps(const struct kms *kms); - -// DRM Page Flip callback -void drm_pflip_cb(int fd, unsigned int msc, unsigned int sec, - unsigned int usec, void *data); +bool vo_drm_init(struct vo *vo); +int vo_drm_control(struct vo *vo, int *events, int request, void *arg); + +double vo_drm_get_display_fps(struct vo_drm_state *drm); +void vo_drm_set_monitor_par(struct vo *vo); +void vo_drm_uninit(struct vo *vo); +void vo_drm_wait_events(struct vo *vo, int64_t until_time_ns); +void vo_drm_wait_on_flip(struct vo_drm_state *drm); +void vo_drm_wakeup(struct vo *vo); + +bool vo_drm_acquire_crtc(struct vo_drm_state *drm); +void vo_drm_release_crtc(struct vo_drm_state *drm); #endif |