| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- /*
- Simple DirectMedia Layer
- Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- */
- #include "SDL_internal.h"
- #ifndef SDL_egl_h_
- #define SDL_egl_h_
- #ifdef SDL_VIDEO_OPENGL_EGL
- #include <SDL3/SDL_egl.h>
- #include "SDL_sysvideo.h"
- #define SDL_EGL_MAX_DEVICES 8
- // For systems that don't define these
- typedef intptr_t EGLAttrib;
- typedef void *EGLDeviceEXT;
- typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETDISPLAYPROC) (EGLNativeDisplayType display_id);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLINITIALIZEPROC) (EGLDisplay dpy, EGLint *major, EGLint *minor);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLTERMINATEPROC) (EGLDisplay dpy);
- typedef __eglMustCastToProperFunctionPointerType (EGLAPIENTRYP PFNEGLGETPROCADDRESSPROC) (const char *procname);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLCHOOSECONFIGPROC) (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
- typedef EGLContext (EGLAPIENTRYP PFNEGLCREATECONTEXTPROC) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx);
- typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERSURFACEPROC) (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
- typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLMAKECURRENTPROC) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPINTERVALPROC) (EGLDisplay dpy, EGLint interval);
- typedef const char *(EGLAPIENTRYP PFNEGLQUERYSTRINGPROC) (EGLDisplay dpy, EGLint name);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGATTRIBPROC) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITNATIVEPROC) (EGLint engine);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITGLPROC) (void);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDAPIPROC) (EGLenum api);
- typedef EGLint (EGLAPIENTRYP PFNEGLGETERRORPROC) (void);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICESEXTPROC) (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices);
- typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYPROC) (EGLenum platform, void *native_display, const EGLAttrib *attrib_list);
- typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void *native_display, const EGLint *attrib_list);
- typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
- typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync);
- typedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync);
- typedef EGLint (EGLAPIENTRYP PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags);
- typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
- typedef struct SDL_EGL_VideoData
- {
- SDL_SharedObject *opengl_dll_handle;
- SDL_SharedObject *egl_dll_handle;
- EGLDisplay egl_display;
- EGLConfig egl_config;
- int egl_swapinterval;
- int egl_surfacetype;
- int egl_version_major, egl_version_minor;
- EGLint egl_required_visual_id;
- bool is_offscreen; // whether EGL display was offscreen
- EGLenum apitype; // EGL_OPENGL_ES_API, EGL_OPENGL_API, etc
- PFNEGLGETDISPLAYPROC eglGetDisplay;
- PFNEGLINITIALIZEPROC eglInitialize;
- PFNEGLTERMINATEPROC eglTerminate;
- PFNEGLGETPROCADDRESSPROC eglGetProcAddress;
- PFNEGLCHOOSECONFIGPROC eglChooseConfig;
- PFNEGLCREATECONTEXTPROC eglCreateContext;
- PFNEGLDESTROYCONTEXTPROC eglDestroyContext;
- PFNEGLCREATEPBUFFERSURFACEPROC eglCreatePbufferSurface;
- PFNEGLCREATEWINDOWSURFACEPROC eglCreateWindowSurface;
- PFNEGLDESTROYSURFACEPROC eglDestroySurface;
- PFNEGLMAKECURRENTPROC eglMakeCurrent;
- PFNEGLSWAPBUFFERSPROC eglSwapBuffers;
- PFNEGLSWAPINTERVALPROC eglSwapInterval;
- PFNEGLQUERYSTRINGPROC eglQueryString;
- PFNEGLGETCONFIGATTRIBPROC eglGetConfigAttrib;
- PFNEGLWAITNATIVEPROC eglWaitNative;
- PFNEGLWAITGLPROC eglWaitGL;
- PFNEGLBINDAPIPROC eglBindAPI;
- PFNEGLGETERRORPROC eglGetError;
- PFNEGLQUERYDEVICESEXTPROC eglQueryDevicesEXT;
- PFNEGLGETPLATFORMDISPLAYPROC eglGetPlatformDisplay;
- PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT;
- // Atomic functions
- PFNEGLCREATESYNCKHRPROC eglCreateSyncKHR;
- PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR;
- PFNEGLDUPNATIVEFENCEFDANDROIDPROC eglDupNativeFenceFDANDROID;
- PFNEGLWAITSYNCKHRPROC eglWaitSyncKHR;
- PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR;
- // Atomic functions end
- } SDL_EGL_VideoData;
- // OpenGLES functions
- typedef enum SDL_EGL_ExtensionType
- {
- SDL_EGL_DISPLAY_EXTENSION,
- SDL_EGL_CLIENT_EXTENSION
- } SDL_EGL_ExtensionType;
- extern bool SDL_EGL_HasExtension(SDL_VideoDevice *_this, SDL_EGL_ExtensionType type, const char *ext);
- extern bool SDL_EGL_GetAttribute(SDL_VideoDevice *_this, SDL_GLAttr attrib, int *value);
- /* SDL_EGL_LoadLibrary can get a display for a specific platform (EGL_PLATFORM_*)
- * or, if 0 is passed, let the implementation decide.
- */
- extern bool SDL_EGL_LoadLibraryOnly(SDL_VideoDevice *_this, const char *path);
- extern bool SDL_EGL_LoadLibrary(SDL_VideoDevice *_this, const char *path, NativeDisplayType native_display, EGLenum platform);
- extern SDL_FunctionPointer SDL_EGL_GetProcAddressInternal(SDL_VideoDevice *_this, const char *proc);
- extern void SDL_EGL_UnloadLibrary(SDL_VideoDevice *_this);
- extern void SDL_EGL_SetRequiredVisualId(SDL_VideoDevice *_this, int visual_id);
- extern bool SDL_EGL_ChooseConfig(SDL_VideoDevice *_this);
- extern bool SDL_EGL_SetSwapInterval(SDL_VideoDevice *_this, int interval);
- extern bool SDL_EGL_GetSwapInterval(SDL_VideoDevice *_this, int *interval);
- extern bool SDL_EGL_DestroyContext(SDL_VideoDevice *_this, SDL_GLContext context);
- extern EGLSurface SDL_EGL_CreateSurface(SDL_VideoDevice *_this, SDL_Window *window, NativeWindowType nw);
- extern void SDL_EGL_DestroySurface(SDL_VideoDevice *_this, EGLSurface egl_surface);
- extern EGLSurface SDL_EGL_CreateOffscreenSurface(SDL_VideoDevice *_this, int width, int height);
- // Assumes that LoadLibraryOnly() has succeeded
- extern bool SDL_EGL_InitializeOffscreen(SDL_VideoDevice *_this, int device);
- // These need to be wrapped to get the surface for the window by the platform GLES implementation
- extern SDL_GLContext SDL_EGL_CreateContext(SDL_VideoDevice *_this, EGLSurface egl_surface);
- extern bool SDL_EGL_MakeCurrent(SDL_VideoDevice *_this, EGLSurface egl_surface, SDL_GLContext context);
- extern bool SDL_EGL_SwapBuffers(SDL_VideoDevice *_this, EGLSurface egl_surface);
- // SDL Error-reporting
- extern bool SDL_EGL_SetErrorEx(const char *message, const char *eglFunctionName, EGLint eglErrorCode);
- #define SDL_EGL_SetError(message, eglFunctionName) SDL_EGL_SetErrorEx(message, eglFunctionName, _this->egl_data->eglGetError())
- // A few of useful macros
- #define SDL_EGL_SwapWindow_impl(BACKEND) \
- bool BACKEND##_GLES_SwapWindow(SDL_VideoDevice *_this, SDL_Window *window) \
- { \
- return SDL_EGL_SwapBuffers(_this, window->internal->egl_surface); \
- }
- #define SDL_EGL_MakeCurrent_impl(BACKEND) \
- bool BACKEND##_GLES_MakeCurrent(SDL_VideoDevice *_this, SDL_Window *window, SDL_GLContext context) \
- { \
- return SDL_EGL_MakeCurrent(_this, window ? window->internal->egl_surface : EGL_NO_SURFACE, context); \
- }
- #define SDL_EGL_CreateContext_impl(BACKEND) \
- SDL_GLContext BACKEND##_GLES_CreateContext(SDL_VideoDevice *_this, SDL_Window *window) \
- { \
- return SDL_EGL_CreateContext(_this, window->internal->egl_surface); \
- }
- #endif // SDL_VIDEO_OPENGL_EGL
- #endif // SDL_egl_h_
|