mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
SDL: Move EGL init code into SDLGLGraphicsContext.
It should really be cleaned up, but I'm not sure if EGL_Open can be moved later and don't currently have a setup to test, so I'm just cargo culting.
This commit is contained in:
parent
78a41980df
commit
a7023ac542
3 changed files with 138 additions and 133 deletions
|
@ -6,8 +6,143 @@
|
|||
#include "gfx_es2/gpu_features.h"
|
||||
#include "thin3d/thin3d_create.h"
|
||||
|
||||
#if defined(USING_EGL)
|
||||
#include "EGL/egl.h"
|
||||
#endif
|
||||
|
||||
class GLRenderManager;
|
||||
|
||||
#if defined(USING_EGL)
|
||||
|
||||
// TODO: Move these into the class.
|
||||
static EGLDisplay g_eglDisplay = NULL;
|
||||
static EGLContext g_eglContext = NULL;
|
||||
static EGLSurface g_eglSurface = NULL;
|
||||
#ifdef USING_FBDEV
|
||||
static EGLNativeDisplayType g_Display = NULL;
|
||||
#else
|
||||
static Display* g_Display = NULL;
|
||||
#endif
|
||||
static NativeWindowType g_Window = (NativeWindowType)NULL;
|
||||
|
||||
int8_t CheckEGLErrors(const std::string& file, uint16_t line) {
|
||||
EGLenum error;
|
||||
std::string errortext;
|
||||
|
||||
error = eglGetError();
|
||||
switch (error)
|
||||
{
|
||||
case EGL_SUCCESS: case 0: return 0;
|
||||
case EGL_NOT_INITIALIZED: errortext = "EGL_NOT_INITIALIZED"; break;
|
||||
case EGL_BAD_ACCESS: errortext = "EGL_BAD_ACCESS"; break;
|
||||
case EGL_BAD_ALLOC: errortext = "EGL_BAD_ALLOC"; break;
|
||||
case EGL_BAD_ATTRIBUTE: errortext = "EGL_BAD_ATTRIBUTE"; break;
|
||||
case EGL_BAD_CONTEXT: errortext = "EGL_BAD_CONTEXT"; break;
|
||||
case EGL_BAD_CONFIG: errortext = "EGL_BAD_CONFIG"; break;
|
||||
case EGL_BAD_CURRENT_SURFACE: errortext = "EGL_BAD_CURRENT_SURFACE"; break;
|
||||
case EGL_BAD_DISPLAY: errortext = "EGL_BAD_DISPLAY"; break;
|
||||
case EGL_BAD_SURFACE: errortext = "EGL_BAD_SURFACE"; break;
|
||||
case EGL_BAD_MATCH: errortext = "EGL_BAD_MATCH"; break;
|
||||
case EGL_BAD_PARAMETER: errortext = "EGL_BAD_PARAMETER"; break;
|
||||
case EGL_BAD_NATIVE_PIXMAP: errortext = "EGL_BAD_NATIVE_PIXMAP"; break;
|
||||
case EGL_BAD_NATIVE_WINDOW: errortext = "EGL_BAD_NATIVE_WINDOW"; break;
|
||||
default: errortext = "unknown"; break;
|
||||
}
|
||||
printf( "ERROR: EGL Error detected in file %s at line %d: %s (0x%X)\n", file.c_str(), line, errortext.c_str(), error );
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define EGL_ERROR(str, check) { \
|
||||
if (check) CheckEGLErrors( __FILE__, __LINE__ ); \
|
||||
printf("EGL ERROR: " str "\n"); \
|
||||
return 1; \
|
||||
}
|
||||
|
||||
int8_t EGL_Open() {
|
||||
#ifdef USING_FBDEV
|
||||
g_Display = ((EGLNativeDisplayType)0);
|
||||
#else
|
||||
if ((g_Display = XOpenDisplay(NULL)) == NULL)
|
||||
EGL_ERROR("Unable to get display!", false);
|
||||
#endif
|
||||
if ((g_eglDisplay = eglGetDisplay((NativeDisplayType)g_Display)) == EGL_NO_DISPLAY)
|
||||
EGL_ERROR("Unable to create EGL display.", true);
|
||||
if (eglInitialize(g_eglDisplay, NULL, NULL) != EGL_TRUE)
|
||||
EGL_ERROR("Unable to initialize EGL display.", true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t EGL_Init() {
|
||||
EGLConfig g_eglConfig;
|
||||
EGLint g_numConfigs = 0;
|
||||
EGLint attrib_list[]= {
|
||||
// TODO: Should cycle through fallbacks, like on Android
|
||||
#ifdef USING_FBDEV
|
||||
EGL_RED_SIZE, 5,
|
||||
EGL_GREEN_SIZE, 6,
|
||||
EGL_BLUE_SIZE, 5,
|
||||
#endif
|
||||
EGL_DEPTH_SIZE, 16,
|
||||
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||
#ifdef USING_GLES2
|
||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
||||
#else
|
||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
|
||||
#endif
|
||||
EGL_SAMPLE_BUFFERS, 0,
|
||||
EGL_SAMPLES, 0,
|
||||
EGL_NONE};
|
||||
|
||||
const EGLint attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
|
||||
|
||||
EGLBoolean result = eglChooseConfig(g_eglDisplay, attrib_list, &g_eglConfig, 1, &g_numConfigs);
|
||||
if (result != EGL_TRUE || g_numConfigs == 0) EGL_ERROR("Unable to query for available configs.", true);
|
||||
|
||||
g_eglContext = eglCreateContext(g_eglDisplay, g_eglConfig, NULL, attributes );
|
||||
if (g_eglContext == EGL_NO_CONTEXT) EGL_ERROR("Unable to create GLES context!", true);
|
||||
|
||||
#if !defined(USING_FBDEV) && !defined(__APPLE__)
|
||||
//Get the SDL window handle
|
||||
SDL_SysWMinfo sysInfo; //Will hold our Window information
|
||||
SDL_VERSION(&sysInfo.version); //Set SDL version
|
||||
g_Window = (NativeWindowType)sysInfo.info.x11.window;
|
||||
#else
|
||||
g_Window = (NativeWindowType)NULL;
|
||||
#endif
|
||||
g_eglSurface = eglCreateWindowSurface(g_eglDisplay, g_eglConfig, g_Window, 0);
|
||||
if (g_eglSurface == EGL_NO_SURFACE)
|
||||
EGL_ERROR("Unable to create EGL surface!", true);
|
||||
|
||||
if (eglMakeCurrent(g_eglDisplay, g_eglSurface, g_eglSurface, g_eglContext) != EGL_TRUE)
|
||||
EGL_ERROR("Unable to make GLES context current.", true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void EGL_Close() {
|
||||
if (g_eglDisplay != NULL) {
|
||||
eglMakeCurrent(g_eglDisplay, NULL, NULL, EGL_NO_CONTEXT);
|
||||
if (g_eglContext != NULL) {
|
||||
eglDestroyContext(g_eglDisplay, g_eglContext);
|
||||
}
|
||||
if (g_eglSurface != NULL) {
|
||||
eglDestroySurface(g_eglDisplay, g_eglSurface);
|
||||
}
|
||||
eglTerminate(g_eglDisplay);
|
||||
g_eglDisplay = NULL;
|
||||
}
|
||||
if (g_Display != NULL) {
|
||||
#if !defined(USING_FBDEV)
|
||||
XCloseDisplay(g_Display);
|
||||
#endif
|
||||
g_Display = NULL;
|
||||
}
|
||||
g_eglSurface = NULL;
|
||||
g_eglContext = NULL;
|
||||
}
|
||||
|
||||
#endif // USING_EGL
|
||||
|
||||
// Returns 0 on success.
|
||||
int SDLGLGraphicsContext::Init(SDL_Window *&window, int x, int y, int mode, std::string *error_message) {
|
||||
struct GLVersionPair {
|
||||
|
|
|
@ -7,6 +7,9 @@
|
|||
#include "gfx/gl_common.h"
|
||||
#include "Common/GraphicsContext.h"
|
||||
|
||||
// TODO: Move this to a better place.
|
||||
void EGL_Open();
|
||||
|
||||
class SDLGLGraphicsContext : public DummyGraphicsContext {
|
||||
public:
|
||||
SDLGLGraphicsContext() {
|
||||
|
|
133
SDL/SDLMain.cpp
133
SDL/SDLMain.cpp
|
@ -48,10 +48,6 @@ SDLJoystick *joystick = NULL;
|
|||
#include <X11/Xlib-xcb.h>
|
||||
#endif
|
||||
|
||||
#if defined(USING_EGL)
|
||||
#include "EGL/egl.h"
|
||||
#endif
|
||||
|
||||
#include "Core/System.h"
|
||||
#include "Core/Core.h"
|
||||
#include "Core/Config.h"
|
||||
|
@ -70,135 +66,6 @@ static int g_QuitRequested = 0;
|
|||
static int g_DesktopWidth = 0;
|
||||
static int g_DesktopHeight = 0;
|
||||
|
||||
#if defined(USING_EGL)
|
||||
|
||||
static EGLDisplay g_eglDisplay = NULL;
|
||||
static EGLContext g_eglContext = NULL;
|
||||
static EGLSurface g_eglSurface = NULL;
|
||||
#ifdef USING_FBDEV
|
||||
static EGLNativeDisplayType g_Display = NULL;
|
||||
#else
|
||||
static Display* g_Display = NULL;
|
||||
#endif
|
||||
static NativeWindowType g_Window = (NativeWindowType)NULL;
|
||||
|
||||
int8_t CheckEGLErrors(const std::string& file, uint16_t line) {
|
||||
EGLenum error;
|
||||
std::string errortext;
|
||||
|
||||
error = eglGetError();
|
||||
switch (error)
|
||||
{
|
||||
case EGL_SUCCESS: case 0: return 0;
|
||||
case EGL_NOT_INITIALIZED: errortext = "EGL_NOT_INITIALIZED"; break;
|
||||
case EGL_BAD_ACCESS: errortext = "EGL_BAD_ACCESS"; break;
|
||||
case EGL_BAD_ALLOC: errortext = "EGL_BAD_ALLOC"; break;
|
||||
case EGL_BAD_ATTRIBUTE: errortext = "EGL_BAD_ATTRIBUTE"; break;
|
||||
case EGL_BAD_CONTEXT: errortext = "EGL_BAD_CONTEXT"; break;
|
||||
case EGL_BAD_CONFIG: errortext = "EGL_BAD_CONFIG"; break;
|
||||
case EGL_BAD_CURRENT_SURFACE: errortext = "EGL_BAD_CURRENT_SURFACE"; break;
|
||||
case EGL_BAD_DISPLAY: errortext = "EGL_BAD_DISPLAY"; break;
|
||||
case EGL_BAD_SURFACE: errortext = "EGL_BAD_SURFACE"; break;
|
||||
case EGL_BAD_MATCH: errortext = "EGL_BAD_MATCH"; break;
|
||||
case EGL_BAD_PARAMETER: errortext = "EGL_BAD_PARAMETER"; break;
|
||||
case EGL_BAD_NATIVE_PIXMAP: errortext = "EGL_BAD_NATIVE_PIXMAP"; break;
|
||||
case EGL_BAD_NATIVE_WINDOW: errortext = "EGL_BAD_NATIVE_WINDOW"; break;
|
||||
default: errortext = "unknown"; break;
|
||||
}
|
||||
printf( "ERROR: EGL Error detected in file %s at line %d: %s (0x%X)\n", file.c_str(), line, errortext.c_str(), error );
|
||||
return 1;
|
||||
}
|
||||
#define EGL_ERROR(str, check) { \
|
||||
if (check) CheckEGLErrors( __FILE__, __LINE__ ); \
|
||||
printf("EGL ERROR: " str "\n"); \
|
||||
return 1; \
|
||||
}
|
||||
|
||||
int8_t EGL_Open() {
|
||||
#ifdef USING_FBDEV
|
||||
g_Display = ((EGLNativeDisplayType)0);
|
||||
#else
|
||||
if ((g_Display = XOpenDisplay(NULL)) == NULL)
|
||||
EGL_ERROR("Unable to get display!", false);
|
||||
#endif
|
||||
if ((g_eglDisplay = eglGetDisplay((NativeDisplayType)g_Display)) == EGL_NO_DISPLAY)
|
||||
EGL_ERROR("Unable to create EGL display.", true);
|
||||
if (eglInitialize(g_eglDisplay, NULL, NULL) != EGL_TRUE)
|
||||
EGL_ERROR("Unable to initialize EGL display.", true);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int8_t EGL_Init() {
|
||||
EGLConfig g_eglConfig;
|
||||
EGLint g_numConfigs = 0;
|
||||
EGLint attrib_list[]= {
|
||||
// TODO: Should cycle through fallbacks, like on Android
|
||||
#ifdef USING_FBDEV
|
||||
EGL_RED_SIZE, 5,
|
||||
EGL_GREEN_SIZE, 6,
|
||||
EGL_BLUE_SIZE, 5,
|
||||
#endif
|
||||
EGL_DEPTH_SIZE, 16,
|
||||
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||
#ifdef USING_GLES2
|
||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
||||
#else
|
||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
|
||||
#endif
|
||||
EGL_SAMPLE_BUFFERS, 0,
|
||||
EGL_SAMPLES, 0,
|
||||
EGL_NONE};
|
||||
|
||||
const EGLint attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
|
||||
|
||||
EGLBoolean result = eglChooseConfig(g_eglDisplay, attrib_list, &g_eglConfig, 1, &g_numConfigs);
|
||||
if (result != EGL_TRUE || g_numConfigs == 0) EGL_ERROR("Unable to query for available configs.", true);
|
||||
|
||||
g_eglContext = eglCreateContext(g_eglDisplay, g_eglConfig, NULL, attributes );
|
||||
if (g_eglContext == EGL_NO_CONTEXT) EGL_ERROR("Unable to create GLES context!", true);
|
||||
|
||||
#if !defined(USING_FBDEV) && !defined(__APPLE__)
|
||||
//Get the SDL window handle
|
||||
SDL_SysWMinfo sysInfo; //Will hold our Window information
|
||||
SDL_VERSION(&sysInfo.version); //Set SDL version
|
||||
g_Window = (NativeWindowType)sysInfo.info.x11.window;
|
||||
#else
|
||||
g_Window = (NativeWindowType)NULL;
|
||||
#endif
|
||||
g_eglSurface = eglCreateWindowSurface(g_eglDisplay, g_eglConfig, g_Window, 0);
|
||||
if (g_eglSurface == EGL_NO_SURFACE)
|
||||
EGL_ERROR("Unable to create EGL surface!", true);
|
||||
|
||||
if (eglMakeCurrent(g_eglDisplay, g_eglSurface, g_eglSurface, g_eglContext) != EGL_TRUE)
|
||||
EGL_ERROR("Unable to make GLES context current.", true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void EGL_Close() {
|
||||
if (g_eglDisplay != NULL) {
|
||||
eglMakeCurrent(g_eglDisplay, NULL, NULL, EGL_NO_CONTEXT);
|
||||
if (g_eglContext != NULL) {
|
||||
eglDestroyContext(g_eglDisplay, g_eglContext);
|
||||
}
|
||||
if (g_eglSurface != NULL) {
|
||||
eglDestroySurface(g_eglDisplay, g_eglSurface);
|
||||
}
|
||||
eglTerminate(g_eglDisplay);
|
||||
g_eglDisplay = NULL;
|
||||
}
|
||||
if (g_Display != NULL) {
|
||||
#if !defined(USING_FBDEV)
|
||||
XCloseDisplay(g_Display);
|
||||
#endif
|
||||
g_Display = NULL;
|
||||
}
|
||||
g_eglSurface = NULL;
|
||||
g_eglContext = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int getDisplayNumber(void) {
|
||||
int displayNumber = 0;
|
||||
char * displayNumberStr;
|
||||
|
|
Loading…
Add table
Reference in a new issue