22 #include "../../SDL_internal.h" 24 #if SDL_VIDEO_DRIVER_KMSDRM 27 #include "../SDL_sysvideo.h" 31 #include "../../events/SDL_mouse_c.h" 32 #include "../../events/SDL_keyboard_c.h" 34 #ifdef SDL_INPUT_LINUXEV 35 #include "../../core/linux/SDL_evdev.h" 45 #define KMSDRM_DRI_CARD_0 "/dev/dri/card0" 48 KMSDRM_Available(
void)
52 int drm_fd = open(KMSDRM_DRI_CARD_0, O_RDWR | O_CLOEXEC);
55 drmModeRes *resources = KMSDRM_drmModeGetResources(drm_fd);
56 if (resources !=
NULL) {
58 KMSDRM_drmModeFreeResources(resources);
81 KMSDRM_Create(
int devindex)
86 if (devindex < 0 || devindex > 99) {
87 SDL_SetError(
"devindex (%d) must be between 0 and 99.\n", devindex);
117 device->
free = KMSDRM_Destroy;
139 #if SDL_VIDEO_OPENGL_EGL 165 "KMS/DRM Video Driver",
172 KMSDRM_FBDestroyCallback(
struct gbm_bo *bo,
void *
data)
176 if (fb_info && fb_info->
drm_fd > 0 && fb_info->
fb_id != 0) {
177 KMSDRM_drmModeRmFB(fb_info->
drm_fd, fb_info->
fb_id);
193 if (fb_info !=
NULL) {
200 if (fb_info ==
NULL) {
206 w = KMSDRM_gbm_bo_get_width(bo);
207 h = KMSDRM_gbm_bo_get_height(bo);
208 stride = KMSDRM_gbm_bo_get_stride(bo);
209 handle = KMSDRM_gbm_bo_get_handle(bo).u32;
211 ret = KMSDRM_drmModeAddFB(vdata->
drm_fd, w, h, 24, 32, stride, handle, &fb_info->
fb_id);
219 KMSDRM_gbm_bo_set_user_data(bo, fb_info, KMSDRM_FBDestroyCallback);
229 if (poll(&vdata->
drm_pollfd, 1, timeout) < 0) {
234 if (vdata->
drm_pollfd.revents & (POLLHUP | POLLERR)) {
252 KMSDRM_FlipHandler(
int fd,
unsigned int frame,
unsigned int sec,
unsigned int usec,
void *data)
269 drmModeRes *resources =
NULL;
270 drmModeConnector *connector =
NULL;
271 drmModeEncoder *encoder =
NULL;
285 if (devname ==
NULL) {
290 vdata->
drm_fd = open(devname, O_RDWR | O_CLOEXEC);
299 vdata->
gbm = KMSDRM_gbm_create_device(vdata->
drm_fd);
306 resources = KMSDRM_drmModeGetResources(vdata->
drm_fd);
312 for (i = 0; i < resources->count_connectors; i++) {
313 connector = KMSDRM_drmModeGetConnector(vdata->
drm_fd, resources->connectors[i]);
314 if (connector ==
NULL)
317 if (connector->connection == DRM_MODE_CONNECTED &&
318 connector->count_modes > 0) {
320 connector->connector_id, connector->count_modes);
325 KMSDRM_drmModeFreeConnector(connector);
329 if (i == resources->count_connectors) {
330 ret =
SDL_SetError(
"No currently active connector found.");
334 for (i = 0; i < resources->count_encoders; i++) {
335 encoder = KMSDRM_drmModeGetEncoder(vdata->
drm_fd, resources->encoders[i]);
340 if (encoder->encoder_id == connector->encoder_id) {
346 KMSDRM_drmModeFreeEncoder(encoder);
350 if (i == resources->count_encoders) {
363 data->
crtc_id = encoder->crtc_id;
365 vdata->
crtc_id = encoder->crtc_id;
393 vdata->
drm_evctx.version = DRM_EVENT_CONTEXT_VERSION;
394 vdata->
drm_evctx.page_flip_handler = KMSDRM_FlipHandler;
396 #ifdef SDL_INPUT_LINUXEV 404 KMSDRM_drmModeFreeEncoder(encoder);
405 if (connector !=
NULL)
406 KMSDRM_drmModeFreeConnector(connector);
407 if (resources !=
NULL)
408 KMSDRM_drmModeFreeResources(resources);
418 KMSDRM_gbm_device_destroy(vdata->
gbm);
444 if(KMSDRM_drmModeSetCrtc(vdata->
drm_fd, crtc->crtc_id, crtc->buffer_id,
454 KMSDRM_gbm_device_destroy(vdata->
gbm);
462 #ifdef SDL_INPUT_LINUXEV 486 Uint32 surface_fmt, surface_flags;
505 surface_fmt = GBM_FORMAT_XRGB8888;
506 surface_flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING;
508 if (!KMSDRM_gbm_device_is_format_supported(vdata->
gbm, surface_fmt, surface_flags)) {
511 wdata->
gs = KMSDRM_gbm_surface_create(vdata->
gbm, window->
w, window->
h, surface_fmt, surface_flags);
513 #if SDL_VIDEO_OPENGL_EGL 514 if (!
_this->egl_data) {
551 #if SDL_VIDEO_OPENGL_EGL 556 KMSDRM_gbm_surface_destroy(wdata->
gs);
570 KMSDRM_gbm_surface_release_buffer(data->
gs, data->
next_bo);
574 KMSDRM_gbm_surface_release_buffer(data->
gs, data->
current_bo);
577 #if SDL_VIDEO_OPENGL_EGL 584 KMSDRM_gbm_surface_destroy(data->
gs);
653 SDL_SetError(
"application not compiled with SDL %d.%d\n",
int KMSDRM_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
int KMSDRM_GLES_GetSwapInterval(_THIS)
#define SDL_MINOR_VERSION
void SDL_KMSDRM_UnloadSymbols(void)
void KMSDRM_SetWindowSize(_THIS, SDL_Window *window)
void(* RestoreWindow)(_THIS, SDL_Window *window)
void * KMSDRM_GLES_GetProcAddress(_THIS, const char *proc)
SDL_bool waiting_for_flip
void SDL_SetKeyboardFocus(SDL_Window *window)
VideoBootStrap KMSDRM_bootstrap
struct gbm_bo * current_bo
#define SDL_MAJOR_VERSION
void KMSDRM_InitMouse(_THIS)
void KMSDRM_MaximizeWindow(_THIS, SDL_Window *window)
GLfloat GLfloat GLfloat GLfloat h
A collection of pixels used in software blitting.
int(* GL_SetSwapInterval)(_THIS, int interval)
void(* ShowWindow)(_THIS, SDL_Window *window)
The structure that defines a display mode.
int KMSDRM_CreateWindowFrom(_THIS, SDL_Window *window, const void *data)
int SDL_KMSDRM_LoadSymbols(void)
void(* SetWindowSize)(_THIS, SDL_Window *window)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
int KMSDRM_GLES_SetSwapInterval(_THIS, int interval)
int KMSDRM_GLES_LoadLibrary(_THIS, const char *path)
void SDL_SetMouseFocus(SDL_Window *window)
void KMSDRM_GLES_UnloadLibrary(_THIS)
#define SDL_GL_LoadLibrary
SDL_GLContext KMSDRM_GLES_CreateContext(_THIS, SDL_Window *window)
int SDL_AddVideoDisplay(const SDL_VideoDisplay *display)
int KMSDRM_CreateWindow(_THIS, SDL_Window *window)
int(* GL_LoadLibrary)(_THIS, const char *path)
int(* SetDisplayMode)(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
#define SDL_GetHintBoolean
static SDL_VideoDevice * _this
void(* HideWindow)(_THIS, SDL_Window *window)
static SDL_AudioDeviceID device
#define SDL_GL_UnloadLibrary
void KMSDRM_SetWindowGrab(_THIS, SDL_Window *window, SDL_bool grabbed)
void(* RaiseWindow)(_THIS, SDL_Window *window)
SDL_bool(* GetWindowWMInfo)(_THIS, SDL_Window *window, struct SDL_SysWMinfo *info)
SDL_GLContext(* GL_CreateContext)(_THIS, SDL_Window *window)
EGLImageKHR EGLint EGLint * handle
void KMSDRM_PumpEvents(_THIS)
int KMSDRM_VideoInit(_THIS)
int(* GL_MakeCurrent)(_THIS, SDL_Window *window, SDL_GLContext context)
int KMSDRM_GLES_MakeCurrent(_THIS, SDL_Window *window, SDL_GLContext context)
SDL_DisplayMode current_mode
GLubyte GLubyte GLubyte GLubyte w
void(* DestroyWindow)(_THIS, SDL_Window *window)
void(* SetWindowIcon)(_THIS, SDL_Window *window, SDL_Surface *icon)
drmEventContext drm_evctx
void KMSDRM_RestoreWindow(_THIS, SDL_Window *window)
void KMSDRM_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon)
void KMSDRM_HideWindow(_THIS, SDL_Window *window)
void(* GL_UnloadLibrary)(_THIS)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
void(* GetDisplayModes)(_THIS, SDL_VideoDisplay *display)
SDL_bool KMSDRM_GetWindowWMInfo(_THIS, SDL_Window *window, struct SDL_SysWMinfo *info)
SDL_bool KMSDRM_WaitPageFlip(_THIS, SDL_WindowData *wdata, int timeout)
int(* CreateSDLWindow)(_THIS, SDL_Window *window)
#define SDL_OutOfMemory()
SDL_DisplayMode desktop_mode
void KMSDRM_SetWindowPosition(_THIS, SDL_Window *window)
void KMSDRM_RaiseWindow(_THIS, SDL_Window *window)
SDL_VideoDisplay * SDL_GetDisplayForWindow(SDL_Window *window)
EGLSurface EGLNativeWindowType * window
void KMSDRM_GLES_DeleteContext(_THIS, SDL_GLContext context)
void(* SetWindowPosition)(_THIS, SDL_Window *window)
int(* GL_SwapWindow)(_THIS, SDL_Window *window)
#define SDL_HINT_VIDEO_DOUBLE_BUFFER
Tell the video driver that we only want a double buffer.
The type used to identify a window.
GLbitfield GLuint64 timeout
void(* MinimizeWindow)(_THIS, SDL_Window *window)
void KMSDRM_MinimizeWindow(_THIS, SDL_Window *window)
void KMSDRM_SetWindowTitle(_THIS, SDL_Window *window)
void KMSDRM_GetDisplayModes(_THIS, SDL_VideoDisplay *display)
SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
int(* CreateSDLWindowFrom)(_THIS, SDL_Window *window, const void *data)
struct SDL_VideoDevice::@34 gl_config
KMSDRM_FBInfo * KMSDRM_FBFromBO(_THIS, struct gbm_bo *bo)
void(* GL_DeleteContext)(_THIS, SDL_GLContext context)
void(* SetWindowTitle)(_THIS, SDL_Window *window)
int KMSDRM_GLES_SwapWindow(_THIS, SDL_Window *window)
void KMSDRM_ShowWindow(_THIS, SDL_Window *window)
int(* GL_GetSwapInterval)(_THIS)
void(* MaximizeWindow)(_THIS, SDL_Window *window)
void KMSDRM_VideoQuit(_THIS)
static void cleanup(void)
void(* SetWindowGrab)(_THIS, SDL_Window *window, SDL_bool grabbed)
void *(* GL_GetProcAddress)(_THIS, const char *proc)
void KMSDRM_DestroyWindow(_THIS, SDL_Window *window)
void(* PumpEvents)(_THIS)