c5c94a6be6
(SDL_SetError(), SDL_OutOfMemory(), SDL_Unsupported(), SDL_InvalidParam()) Update prototype to forward errors to generic layer, for the functions: MoveCursor, WarpMouse, GL_DeleteContext, GetDisplayModes. Check invalid parameter in SDL_SetTextInputRect() generic layer.
171 lines
9 KiB
C
171 lines
9 KiB
C
/*
|
|
Simple DirectMedia Layer
|
|
Copyright (C) 1997-2023 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_
|
|
|
|
#if 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
|
|
{
|
|
void *opengl_dll_handle, *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;
|
|
SDL_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 SDL_bool SDL_EGL_HasExtension(_THIS, SDL_EGL_ExtensionType type, const char *ext);
|
|
|
|
extern int SDL_EGL_GetAttribute(_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 int SDL_EGL_LoadLibraryOnly(_THIS, const char *path);
|
|
extern int SDL_EGL_LoadLibrary(_THIS, const char *path, NativeDisplayType native_display, EGLenum platform);
|
|
extern SDL_FunctionPointer SDL_EGL_GetProcAddressInternal(_THIS, const char *proc);
|
|
extern void SDL_EGL_UnloadLibrary(_THIS);
|
|
extern void SDL_EGL_SetRequiredVisualId(_THIS, int visual_id);
|
|
extern int SDL_EGL_ChooseConfig(_THIS);
|
|
extern int SDL_EGL_SetSwapInterval(_THIS, int interval);
|
|
extern int SDL_EGL_GetSwapInterval(_THIS, int *interval);
|
|
extern int SDL_EGL_DeleteContext(_THIS, SDL_GLContext context);
|
|
extern EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw);
|
|
extern void SDL_EGL_DestroySurface(_THIS, EGLSurface egl_surface);
|
|
|
|
extern EGLSurface SDL_EGL_CreateOffscreenSurface(_THIS, int width, int height);
|
|
/* Assumes that LoadLibraryOnly() has succeeded */
|
|
extern int SDL_EGL_InitializeOffscreen(_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(_THIS, EGLSurface egl_surface);
|
|
extern int SDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context);
|
|
extern int SDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface);
|
|
|
|
/* SDL Error-reporting */
|
|
extern int 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) \
|
|
int BACKEND##_GLES_SwapWindow(_THIS, SDL_Window *window) \
|
|
{ \
|
|
return SDL_EGL_SwapBuffers(_this, window->driverdata->egl_surface); \
|
|
}
|
|
|
|
#define SDL_EGL_MakeCurrent_impl(BACKEND) \
|
|
int BACKEND##_GLES_MakeCurrent(_THIS, SDL_Window *window, SDL_GLContext context) \
|
|
{ \
|
|
return SDL_EGL_MakeCurrent(_this, window ? window->driverdata->egl_surface : EGL_NO_SURFACE, context); \
|
|
}
|
|
|
|
#define SDL_EGL_CreateContext_impl(BACKEND) \
|
|
SDL_GLContext BACKEND##_GLES_CreateContext(_THIS, SDL_Window *window) \
|
|
{ \
|
|
return SDL_EGL_CreateContext(_this, window->driverdata->egl_surface); \
|
|
}
|
|
|
|
#endif /* SDL_VIDEO_OPENGL_EGL */
|
|
|
|
#endif /* SDL_egl_h_ */
|