23 #include "../../SDL_internal.h"
25 #if SDL_VIDEO_DRIVER_KMSDRM && SDL_VIDEO_OPENGL_EGL
32 #ifndef EGL_PLATFORM_GBM_MESA
33 #define EGL_PLATFORM_GBM_MESA 0x31D7
36 #ifndef EGL_SYNC_NATIVE_FENCE_ANDROID
37 #define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144
40 #ifndef EGL_SYNC_NATIVE_FENCE_FD_ANDROID
41 #define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145
44 #ifndef EGL_NO_NATIVE_FENCE_FD_ANDROID
45 #define EGL_NO_NATIVE_FENCE_FD_ANDROID -1
51 KMSDRM_GLES_DefaultProfileConfig(
_THIS,
int *
mask,
int *major,
int *minor)
55 #if SDL_VIDEO_DRIVER_RPI
82 SDL_EGL_CreateContext_impl(KMSDRM)
85 if (!
_this->egl_data) {
89 if (interval == 0 || interval == 1) {
90 _this->egl_data->egl_swapinterval = interval;
92 return SDL_SetError(
"Only swap intervals of 0 or 1 are supported");
102 #define VOID2U64(x) ((uint64_t)(unsigned long)(x))
148 return SDL_EGL_SetError(
"Failed to swap EGL buffers",
"eglSwapBuffers");
174 windata->
next_bo = KMSDRM_gbm_surface_lock_front_buffer(windata->
gs);
180 return SDL_SetError(
"Failed to get a new framebuffer from BO");
227 dispdata->
atomic_flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
229 KMSDRM_drmModeCreatePropertyBlob(viddata->
drm_fd, &dispdata->
mode,
sizeof(dispdata->
mode), &blob_id);
241 return SDL_SetError(
"Failed to issue atomic commit on pageflip");
247 KMSDRM_gbm_surface_release_buffer(windata->
gs, windata->
bo);
297 return SDL_EGL_SetError(
"Failed to swap EGL buffers",
"eglSwapBuffers");
302 windata->
next_bo = KMSDRM_gbm_surface_lock_front_buffer(windata->
gs);
308 return SDL_SetError(
"Failed to get a new framebuffer BO");
329 dispdata->
atomic_flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
331 KMSDRM_drmModeCreatePropertyBlob(viddata->
drm_fd, &dispdata->
mode,
sizeof(dispdata->
mode), &blob_id);
345 KMSDRM_gbm_surface_release_buffer(windata->
gs, windata->
bo);
362 (!SDL_EGL_HasExtension(
_this, SDL_EGL_DISPLAY_EXTENSION,
"EGL_ANDROID_native_fence_sync")) )
364 windata->
swap_window = KMSDRM_GLES_SwapWindowDoubleBuffered;
366 windata->
swap_window = KMSDRM_GLES_SwapWindowFenced;
377 SDL_EGL_MakeCurrent_impl(KMSDRM)
#define SDL_GetHintBoolean
#define SDL_HINT_VIDEO_DOUBLE_BUFFER
Tell the video driver that we only want a double buffer.
int KMSDRM_GLES_SetSwapInterval(_THIS, int interval)
int KMSDRM_GLES_LoadLibrary(_THIS, const char *path)
int drm_atomic_commit(_THIS, SDL_bool blocking)
int add_crtc_property(drmModeAtomicReq *req, struct crtc *crtc, const char *name, uint64_t value)
void drm_atomic_set_plane_props(struct KMSDRM_PlaneInfo *info)
void KMSDRM_GLES_UnloadLibrary(_THIS)
int add_plane_property(drmModeAtomicReq *req, struct plane *plane, const char *name, uint64_t value)
int add_connector_property(drmModeAtomicReq *req, struct connector *connector, const char *name, uint64_t value)
KMSDRM_FBInfo * KMSDRM_FBFromBO(_THIS, struct gbm_bo *bo)
int KMSDRM_GLES_SwapWindow(_THIS, SDL_Window *window)
GLsizei const GLchar *const * path
SDL_VideoDisplay * SDL_GetDisplayForWindow(SDL_Window *window)
static SDL_VideoDevice * _this
@ SDL_GL_CONTEXT_PROFILE_ES
#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID
#define EGL_PLATFORM_GBM_MESA
EGLSurface EGLNativeWindowType * window
EGLenum const EGLAttribKHR * attrib_list
#define EGL_NO_NATIVE_FENCE_FD_ANDROID
#define EGL_SYNC_NATIVE_FENCE_ANDROID
drmModeAtomicReq * atomic_req
int(* swap_window)(_THIS, SDL_Window *window)
The type used to identify a window.