Go to the documentation of this file.
22 #include "../../SDL_internal.h"
24 #if SDL_VIDEO_DRIVER_RPI
34 #include "../SDL_sysvideo.h"
39 #include "../../events/SDL_mouse_c.h"
40 #include "../../events/SDL_keyboard_c.h"
43 #ifdef SDL_INPUT_LINUXEV
44 #include "../../core/linux/SDL_evdev.h"
69 TV_DISPLAY_STATE_T tvstate;
70 if (vc_tv_get_display_state( &tvstate ) == 0) {
73 HDMI_PROPERTY_PARAM_T property;
74 property.property = HDMI_PROPERTY_PIXEL_CLOCK_TYPE;
75 vc_tv_hdmi_get_property(&property);
76 return property.param1 == HDMI_PIXEL_CLOCK_TYPE_NTSC ?
77 tvstate.display.hdmi.frame_rate * (1000.0f/1001.0f) :
78 tvstate.display.hdmi.frame_rate;
104 device->driverdata = phdata;
110 device->free = RPI_Destroy;
143 device->GL_DefaultProfileConfig = RPI_GLES_DefaultProfileConfig;
165 DISPMANX_MODEINFO_T modeinfo;
166 DISPMANX_DISPLAY_HANDLE_T
handle;
176 if (vc_dispmanx_display_get_info(
handle, &modeinfo) < 0) {
177 vc_dispmanx_display_close(
handle);
183 current_mode.
w = modeinfo.width;
184 current_mode.
h = modeinfo.height;
198 vc_dispmanx_display_close(
handle);
215 AddDispManXDisplay(DISPMANX_ID_MAIN_LCD);
216 AddDispManXDisplay(DISPMANX_ID_FORCE_OTHER);
218 #ifdef SDL_INPUT_LINUXEV
219 if (SDL_EVDEV_Init() < 0) {
232 #ifdef SDL_INPUT_LINUXEV
251 RPI_vsync_callback(DISPMANX_UPDATE_HANDLE_T u,
void *
data)
268 VC_DISPMANX_ALPHA_T dispman_alpha;
269 DISPMANX_UPDATE_HANDLE_T dispman_update;
274 dispman_alpha.flags = DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS;
275 dispman_alpha.opacity = 0xFF;
276 dispman_alpha.mask = 0;
296 dst_rect.width =
window->w;
297 dst_rect.height =
window->h;
301 src_rect.width =
window->w << 16;
302 src_rect.height =
window->h << 16;
309 dispman_update = vc_dispmanx_update_start( 0 );
310 wdata->
dispman_window.element = vc_dispmanx_element_add (dispman_update,
316 DISPMANX_PROTECTION_NONE,
322 vc_dispmanx_update_submit_sync(dispman_update);
324 if (!
_this->egl_data) {
332 return SDL_SetError(
"Could not create GLES window surface");
341 vc_dispmanx_vsync_callback(displaydata->
dispman_display, RPI_vsync_callback, (
void*)wdata);
345 window->driverdata = wdata;
363 if (
data->double_buffer) {
375 #if SDL_VIDEO_OPENGL_EGL
377 SDL_EGL_DestroySurface(
_this,
data->egl_surface);
void RPI_HideWindow(_THIS, SDL_Window *window)
void RPI_SetWindowSize(_THIS, SDL_Window *window)
void RPI_RaiseWindow(_THIS, SDL_Window *window)
SDL_mutex * vsync_cond_mutex
A collection of pixels used in software blitting.
void RPI_GLES_UnloadLibrary(_THIS)
EGLImageKHR EGLint EGLint * handle
GLenum GLuint GLint GLint layer
#define SDL_RPI_VIDEOLAYER
SDL_VideoDisplay * SDL_GetDisplayForWindow(SDL_Window *window)
void RPI_GetDisplayModes(_THIS, SDL_VideoDisplay *display)
void RPI_InitMouse(_THIS)
int RPI_GLES_SwapWindow(_THIS, SDL_Window *window)
#define SDL_GL_LoadLibrary
void SDL_SetKeyboardFocus(SDL_Window *window)
int RPI_GLES_MakeCurrent(_THIS, SDL_Window *window, SDL_GLContext context)
void RPI_SetWindowPosition(_THIS, SDL_Window *window)
SDL_DisplayMode desktop_mode
void SDL_SetMouseFocus(SDL_Window *window)
void RPI_DestroyWindow(_THIS, SDL_Window *window)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
The type used to identify a window.
The structure that defines a display mode.
SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
void RPI_MinimizeWindow(_THIS, SDL_Window *window)
EGL_DISPMANX_WINDOW_T dispman_window
VideoBootStrap RPI_bootstrap
#define SDL_GetHintBoolean
void RPI_PumpEvents(_THIS)
void RPI_VideoQuit(_THIS)
static SDL_VideoDevice * _this
void RPI_GLES_DeleteContext(_THIS, SDL_GLContext context)
#define SDL_MINOR_VERSION
int RPI_GLES_SetSwapInterval(_THIS, int interval)
EGLSurface EGLNativeWindowType * window
int RPI_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode)
DISPMANX_DISPLAY_HANDLE_T dispman_display
int SDL_AddVideoDisplay(const SDL_VideoDisplay *display)
#define SDL_OutOfMemory()
void RPI_SetWindowIcon(_THIS, SDL_Window *window, SDL_Surface *icon)
void RPI_RestoreWindow(_THIS, SDL_Window *window)
int RPI_GLES_LoadLibrary(_THIS, const char *path)
void RPI_ShowWindow(_THIS, SDL_Window *window)
int RPI_CreateWindowFrom(_THIS, SDL_Window *window, const void *data)
EGLNativeDisplayType * display_id
#define SDL_HINT_RPI_VIDEO_LAYER
Tell SDL which Dispmanx layer to use on a Raspberry PI.
void * RPI_GLES_GetProcAddress(_THIS, const char *proc)
#define SDL_HINT_VIDEO_DOUBLE_BUFFER
Tell the video driver that we only want a double buffer.
void RPI_SetWindowGrab(_THIS, SDL_Window *window, SDL_bool grabbed)
SDL_bool RPI_GetWindowWMInfo(_THIS, SDL_Window *window, struct SDL_SysWMinfo *info)
void RPI_SetWindowTitle(_THIS, SDL_Window *window)
SDL_GLContext RPI_GLES_CreateContext(_THIS, SDL_Window *window)
SDL_DisplayMode current_mode
int RPI_GLES_GetSwapInterval(_THIS)
#define SDL_MAJOR_VERSION
static SDL_AudioDeviceID device
int RPI_CreateWindow(_THIS, SDL_Window *window)
@ SDL_PIXELFORMAT_ABGR8888
void RPI_MaximizeWindow(_THIS, SDL_Window *window)