src/video/SDL_egl_c.h
author Sam Lantinga <slouken@libsdl.org>
Wed, 02 Aug 2017 10:22:48 -0700
changeset 11175 cbc6a8a5b701
parent 10740 bb53965b659d
child 11677 aed6a9ff3c99
permissions -rw-r--r--
Fixed bug 3690 - SDL2 KMS/DRM render context support

Manuel

The attached patch adds support for KMS/DRM context graphics.

It builds with no problem on X86_64 GNU/Linux systems, provided the needed libraries are present, and on ARM GNU/Linux systems that have KMS/DRM support and a GLES2 implementation.
Tested on Raspberry Pi: KMS/DRM is what the Raspberry Pi will use as default in the near future, once the propietary DispmanX API by Broadcom is overtaken by open graphics stack, it's possible to boot current Raspbian system in KMS mode by adding "dtoverlay=vc4-kms-v3d" to config.txt on Raspbian's boot partition.
X86 systems use KMS right away in every current GNU/Linux system.

Simple build instructions:

$./autogen.sh
$./configure --enable-video-kmsdrm
$make
gabomdq@8021
     1
/*
gabomdq@8021
     2
  Simple DirectMedia Layer
slouken@10737
     3
  Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
gabomdq@8021
     4
gabomdq@8021
     5
  This software is provided 'as-is', without any express or implied
gabomdq@8021
     6
  warranty.  In no event will the authors be held liable for any damages
gabomdq@8021
     7
  arising from the use of this software.
gabomdq@8021
     8
gabomdq@8021
     9
  Permission is granted to anyone to use this software for any purpose,
gabomdq@8021
    10
  including commercial applications, and to alter it and redistribute it
gabomdq@8021
    11
  freely, subject to the following restrictions:
gabomdq@8021
    12
gabomdq@8021
    13
  1. The origin of this software must not be misrepresented; you must not
gabomdq@8021
    14
     claim that you wrote the original software. If you use this software
gabomdq@8021
    15
     in a product, an acknowledgment in the product documentation would be
gabomdq@8021
    16
     appreciated but is not required.
gabomdq@8021
    17
  2. Altered source versions must be plainly marked as such, and must not be
gabomdq@8021
    18
     misrepresented as being the original software.
gabomdq@8021
    19
  3. This notice may not be removed or altered from any source distribution.
gabomdq@8021
    20
*/
icculus@8093
    21
#include "../SDL_internal.h"
gabomdq@8021
    22
slouken@10638
    23
#ifndef SDL_egl_h_
slouken@10638
    24
#define SDL_egl_h_
gabomdq@8021
    25
gabomdq@8021
    26
#if SDL_VIDEO_OPENGL_EGL
gabomdq@8021
    27
gabomdq@8021
    28
#include "SDL_egl.h"
gabomdq@8021
    29
gabomdq@8021
    30
#include "SDL_sysvideo.h"
gabomdq@8021
    31
gabomdq@8021
    32
typedef struct SDL_EGL_VideoData
gabomdq@8021
    33
{
gabomdq@8021
    34
    void *egl_dll_handle, *dll_handle;
gabomdq@8021
    35
    EGLDisplay egl_display;
gabomdq@8021
    36
    EGLConfig egl_config;
gabomdq@8021
    37
    int egl_swapinterval;
gabomdq@8021
    38
    
gabomdq@8021
    39
    EGLDisplay(EGLAPIENTRY *eglGetDisplay) (NativeDisplayType display);
slouken@11175
    40
    EGLDisplay(EGLAPIENTRY *eglGetPlatformDisplay) (EGLenum platform,
slouken@11175
    41
                                void *native_display,
slouken@11175
    42
                                const EGLint *attrib_list);
slouken@11175
    43
    EGLDisplay(EGLAPIENTRY *eglGetPlatformDisplayEXT) (EGLenum platform,
slouken@11175
    44
                                void *native_display,
slouken@11175
    45
                                const EGLint *attrib_list);
gabomdq@8021
    46
    EGLBoolean(EGLAPIENTRY *eglInitialize) (EGLDisplay dpy, EGLint * major,
gabomdq@8021
    47
                                EGLint * minor);
gabomdq@8021
    48
    EGLBoolean(EGLAPIENTRY  *eglTerminate) (EGLDisplay dpy);
gabomdq@8021
    49
    
gabomdq@8021
    50
    void *(EGLAPIENTRY *eglGetProcAddress) (const char * procName);
gabomdq@8021
    51
    
gabomdq@8021
    52
    EGLBoolean(EGLAPIENTRY *eglChooseConfig) (EGLDisplay dpy,
gabomdq@8021
    53
                                  const EGLint * attrib_list,
gabomdq@8021
    54
                                  EGLConfig * configs,
gabomdq@8021
    55
                                  EGLint config_size, EGLint * num_config);
gabomdq@8021
    56
    
gabomdq@8021
    57
    EGLContext(EGLAPIENTRY *eglCreateContext) (EGLDisplay dpy,
gabomdq@8021
    58
                                   EGLConfig config,
gabomdq@8021
    59
                                   EGLContext share_list,
gabomdq@8021
    60
                                   const EGLint * attrib_list);
gabomdq@8021
    61
    
gabomdq@8021
    62
    EGLBoolean(EGLAPIENTRY *eglDestroyContext) (EGLDisplay dpy, EGLContext ctx);
gabomdq@8021
    63
    
gabomdq@8021
    64
    EGLSurface(EGLAPIENTRY *eglCreateWindowSurface) (EGLDisplay dpy,
gabomdq@8021
    65
                                         EGLConfig config,
gabomdq@8021
    66
                                         NativeWindowType window,
gabomdq@8021
    67
                                         const EGLint * attrib_list);
gabomdq@8021
    68
    EGLBoolean(EGLAPIENTRY *eglDestroySurface) (EGLDisplay dpy, EGLSurface surface);
gabomdq@8021
    69
    
gabomdq@8021
    70
    EGLBoolean(EGLAPIENTRY *eglMakeCurrent) (EGLDisplay dpy, EGLSurface draw,
gabomdq@8021
    71
                                 EGLSurface read, EGLContext ctx);
gabomdq@8021
    72
    
gabomdq@8021
    73
    EGLBoolean(EGLAPIENTRY *eglSwapBuffers) (EGLDisplay dpy, EGLSurface draw);
gabomdq@8021
    74
    
gabomdq@8021
    75
    EGLBoolean(EGLAPIENTRY *eglSwapInterval) (EGLDisplay dpy, EGLint interval);
gabomdq@8021
    76
    
gabomdq@8021
    77
    const char *(EGLAPIENTRY *eglQueryString) (EGLDisplay dpy, EGLint name);
gabomdq@8021
    78
    
gabomdq@8021
    79
    EGLBoolean(EGLAPIENTRY  *eglGetConfigAttrib) (EGLDisplay dpy, EGLConfig config,
gabomdq@8021
    80
                                     EGLint attribute, EGLint * value);
gabomdq@8021
    81
    
gabomdq@8021
    82
    EGLBoolean(EGLAPIENTRY *eglWaitNative) (EGLint  engine);
gabomdq@8021
    83
gabomdq@8021
    84
    EGLBoolean(EGLAPIENTRY *eglWaitGL)(void);
gabomdq@8062
    85
    
gabomdq@8062
    86
    EGLBoolean(EGLAPIENTRY *eglBindAPI)(EGLenum);
gabomdq@8062
    87
dludwig@10740
    88
    EGLint(EGLAPIENTRY *eglGetError)(void);
dludwig@10740
    89
gabomdq@8021
    90
} SDL_EGL_VideoData;
gabomdq@8021
    91
gabomdq@8021
    92
/* OpenGLES functions */
gabomdq@8021
    93
extern int SDL_EGL_GetAttribute(_THIS, SDL_GLattr attrib, int *value);
slouken@11175
    94
/* SDL_EGL_LoadLibrary can get a display for a specific platform (EGL_PLATFORM_*)
slouken@11175
    95
 * or, if 0 is passed, let the implementation decide.
slouken@11175
    96
 */
slouken@11175
    97
extern int SDL_EGL_LoadLibrary(_THIS, const char *path, NativeDisplayType native_display, EGLenum platform);
gabomdq@8021
    98
extern void *SDL_EGL_GetProcAddress(_THIS, const char *proc);
gabomdq@8021
    99
extern void SDL_EGL_UnloadLibrary(_THIS);
gabomdq@8021
   100
extern int SDL_EGL_ChooseConfig(_THIS);
gabomdq@8021
   101
extern int SDL_EGL_SetSwapInterval(_THIS, int interval);
gabomdq@8021
   102
extern int SDL_EGL_GetSwapInterval(_THIS);
gabomdq@8021
   103
extern void SDL_EGL_DeleteContext(_THIS, SDL_GLContext context);
gabomdq@8021
   104
extern EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw);
gabomdq@8021
   105
extern void SDL_EGL_DestroySurface(_THIS, EGLSurface egl_surface);
gabomdq@8021
   106
gabomdq@8021
   107
/* These need to be wrapped to get the surface for the window by the platform GLES implementation */
gabomdq@8021
   108
extern SDL_GLContext SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface);
gabomdq@8021
   109
extern int SDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context);
slouken@10690
   110
extern int SDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface);
gabomdq@8021
   111
dludwig@10740
   112
/* SDL Error-reporting */
dludwig@10740
   113
extern int SDL_EGL_SetErrorEx(const char * message, const char * eglFunctionName, EGLint eglErrorCode);
dludwig@10740
   114
#define SDL_EGL_SetError(message, eglFunctionName) SDL_EGL_SetErrorEx(message, eglFunctionName, _this->egl_data->eglGetError())
dludwig@10740
   115
gabomdq@8021
   116
/* A few of useful macros */
gabomdq@8021
   117
slouken@10690
   118
#define SDL_EGL_SwapWindow_impl(BACKEND) int \
gabomdq@8021
   119
BACKEND ## _GLES_SwapWindow(_THIS, SDL_Window * window) \
gabomdq@8021
   120
{\
slouken@10690
   121
    return SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\
gabomdq@8021
   122
}
gabomdq@8021
   123
gabomdq@8021
   124
#define SDL_EGL_MakeCurrent_impl(BACKEND) int \
gabomdq@8021
   125
BACKEND ## _GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) \
gabomdq@8021
   126
{\
gabomdq@8021
   127
    if (window && context) { \
gabomdq@8021
   128
        return SDL_EGL_MakeCurrent(_this, ((SDL_WindowData *) window->driverdata)->egl_surface, context); \
gabomdq@8021
   129
    }\
gabomdq@8021
   130
    else {\
gabomdq@8021
   131
        return SDL_EGL_MakeCurrent(_this, NULL, NULL);\
gabomdq@8021
   132
    }\
gabomdq@8021
   133
}
gabomdq@8021
   134
gabomdq@8021
   135
#define SDL_EGL_CreateContext_impl(BACKEND) SDL_GLContext \
gabomdq@8021
   136
BACKEND ## _GLES_CreateContext(_THIS, SDL_Window * window) \
gabomdq@8021
   137
{\
gabomdq@8021
   138
    return SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\
gabomdq@8021
   139
}
gabomdq@8021
   140
gabomdq@8021
   141
#endif /* SDL_VIDEO_OPENGL_EGL */
gabomdq@8021
   142
slouken@10638
   143
#endif /* SDL_egl_h_ */
gabomdq@8021
   144
gabomdq@8021
   145
/* vi: set ts=4 sw=4 expandtab: */