From 5a079a2d114f96d4847d1ee305d5b7c16eeec50e Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Sat, 27 Dec 2025 12:03:39 -0800 Subject: Initial commit --- contrib/SDL-3.2.8/src/video/SDL_egl_c.h | 171 ++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 contrib/SDL-3.2.8/src/video/SDL_egl_c.h (limited to 'contrib/SDL-3.2.8/src/video/SDL_egl_c.h') diff --git a/contrib/SDL-3.2.8/src/video/SDL_egl_c.h b/contrib/SDL-3.2.8/src/video/SDL_egl_c.h new file mode 100644 index 0000000..24dd392 --- /dev/null +++ b/contrib/SDL-3.2.8/src/video/SDL_egl_c.h @@ -0,0 +1,171 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + 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 + +#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_ -- cgit v1.2.3