From 8c542a35918bc7f0418b68d2b4a23fa5d99c8fa2 Mon Sep 17 00:00:00 2001 From: Jaylon Gowie Date: Tue, 29 Mar 2022 19:08:56 -0500 Subject: [PATCH] Desktop OpenGL 1.X/2.X PSVita Support --- CMakeLists.txt | 11 ++ include/SDL_config.h.cmake | 1 + src/render/opengl/SDL_render_gl.c | 7 ++ src/video/SDL_egl.c | 4 +- src/video/vita/SDL_vitagl_pvr.c | 65 ++++++++--- src/video/vita/SDL_vitagl_pvr_c.h | 9 +- .../vita/{SDL_vitagl.c => SDL_vitagles.c} | 24 ++-- .../vita/{SDL_vitagl_c.h => SDL_vitagles_c.h} | 24 ++-- src/video/vita/SDL_vitagles_pvr.c | 103 ++++++++++++++++++ src/video/vita/SDL_vitagles_pvr_c.h | 35 ++++++ src/video/vita/SDL_vitavideo.c | 57 +++++++--- src/video/vita/SDL_vitavideo.h | 21 ++-- 12 files changed, 290 insertions(+), 71 deletions(-) rename src/video/vita/{SDL_vitagl.c => SDL_vitagles.c} (91%) rename src/video/vita/{SDL_vitagl_c.h => SDL_vitagles_c.h} (67%) create mode 100644 src/video/vita/SDL_vitagles_pvr.c create mode 100644 src/video/vita/SDL_vitagles_pvr_c.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 88a2d29d2..6ca97b7c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2321,6 +2321,7 @@ elseif(VITA) check_include_file(gpu_es4/psp2_pvr_hint.h HAVE_PVR_H) if(HAVE_PVR_H) target_compile_definitions(sdl-build-options INTERFACE "-D__psp2__") + check_include_file(gl4esinit.h HAVE_GL4ES_H) set(SDL_VIDEO_OPENGL_EGL 1) set(HAVE_OPENGLES TRUE) set(SDL_VIDEO_OPENGL_ES 1) @@ -2332,8 +2333,18 @@ elseif(VITA) libgpu_es4_ext_stub_weak libIMGEGL_stub_weak ) + set(HAVE_VITA_PVR ON) set(SDL_VIDEO_VITA_PVR 1) + + if(HAVE_GL4ES_H) + set(HAVE_OPENGL TRUE) + set(SDL_VIDEO_OPENGL 1) + set(SDL_VIDEO_RENDER_OGL 1) + list(APPEND EXTRA_LIBS libGL_stub) + set(SDL_VIDEO_VITA_PVR_OGL 1) + endif() + else() set(HAVE_VITA_PVR OFF) endif() diff --git a/include/SDL_config.h.cmake b/include/SDL_config.h.cmake index 9a1bf6758..f82b0a205 100644 --- a/include/SDL_config.h.cmake +++ b/include/SDL_config.h.cmake @@ -520,6 +520,7 @@ #cmakedefine SDL_VIDEO_VITA_PIB @SDL_VIDEO_VITA_PIB@ #cmakedefine SDL_VIDEO_VITA_PVR @SDL_VIDEO_VITA_PVR@ +#cmakedefine SDL_VIDEO_VITA_PVR_OGL @SDL_VIDEO_VITA_PVR_OGL@ #if !defined(__WIN32__) && !defined(__WINRT__) # if !defined(_STDINT_H_) && !defined(_STDINT_H) && !defined(HAVE_STDINT_H) && !defined(_HAVE_STDINT_H) diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c index b5df73ace..89d21241a 100644 --- a/src/render/opengl/SDL_render_gl.c +++ b/src/render/opengl/SDL_render_gl.c @@ -30,6 +30,11 @@ #include #endif +#ifdef __psp2__ +#include +#include +#endif + /* To prevent unnecessary window recreation, * these should match the defaults selected in SDL_GL_ResetAttributes */ @@ -1733,6 +1738,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags) SDL_GL_GetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, &major); SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor); +#ifndef __psp2__ window_flags = SDL_GetWindowFlags(window); if (!(window_flags & SDL_WINDOW_OPENGL) || profile_mask == SDL_GL_CONTEXT_PROFILE_ES || major != RENDERER_CONTEXT_MAJOR || minor != RENDERER_CONTEXT_MINOR) { @@ -1746,6 +1752,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags) goto error; } } +#endif renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer)); if (!renderer) { diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c index 924b3fd44..b8993a34a 100644 --- a/src/video/SDL_egl.c +++ b/src/video/SDL_egl.c @@ -99,7 +99,7 @@ #define DEFAULT_OGL_ES "libGLESv1_CM.so.1" #endif /* SDL_VIDEO_DRIVER_RPI */ -#if SDL_VIDEO_OPENGL +#if SDL_VIDEO_OPENGL && !SDL_VIDEO_VITA_PVR_OGL #include "SDL_opengl.h" #endif @@ -1062,7 +1062,7 @@ SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface) if (SDL_GL_ExtensionSupported("GL_OES_surfaceless_context")) { _this->gl_allow_no_surface = SDL_TRUE; } -#if SDL_VIDEO_OPENGL +#if SDL_VIDEO_OPENGL && !defined(SDL_VIDEO_DRIVER_VITA) } else { /* Desktop OpenGL supports it by default from version 3.0 on. */ void (APIENTRY * glGetIntegervFunc) (GLenum pname, GLint * params); diff --git a/src/video/vita/SDL_vitagl_pvr.c b/src/video/vita/SDL_vitagl_pvr.c index 3b7fb7477..5415d1371 100644 --- a/src/video/vita/SDL_vitagl_pvr.c +++ b/src/video/vita/SDL_vitagl_pvr.c @@ -20,11 +20,12 @@ */ #include "../../SDL_internal.h" -#if SDL_VIDEO_DRIVER_VITA && SDL_VIDEO_VITA_PVR +#if SDL_VIDEO_DRIVER_VITA && SDL_VIDEO_VITA_PVR && SDL_VIDEO_VITA_PVR_OGL #include #include #include #include +#include #include "SDL_error.h" #include "SDL_log.h" @@ -34,6 +35,16 @@ #define MAX_PATH 256 // vita limits are somehow wrong +/* Defaults */ +int FB_WIDTH = 960; +int FB_HEIGHT = 544; + +void getFBSize(int *width, int *height) +{ + *width = FB_WIDTH; + *height = FB_HEIGHT; +} + int VITA_GL_LoadLibrary(_THIS, const char *path) { @@ -53,6 +64,9 @@ VITA_GL_LoadLibrary(_THIS, const char *path) sceKernelLoadStartModule("vs0:sys/external/libfios2.suprx", 0, NULL, 0, NULL, NULL); sceKernelLoadStartModule("vs0:sys/external/libc.suprx", 0, NULL, 0, NULL, NULL); + SDL_snprintf(target_path, MAX_PATH, "%s/%s", default_path, "libGL.suprx"); + sceKernelLoadStartModule(target_path, 0, NULL, 0, NULL, NULL); + SDL_snprintf(target_path, MAX_PATH, "%s/%s", default_path, "libgpu_es4_ext.suprx"); sceKernelLoadStartModule(target_path, 0, NULL, 0, NULL, NULL); @@ -74,30 +88,45 @@ VITA_GL_LoadLibrary(_THIS, const char *path) SDL_GLContext VITA_GL_CreateContext(_THIS, SDL_Window * window) { - return SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface); -} + char gl_version[3]; + SDL_GLContext context = NULL; + int temp_major = _this->gl_config.major_version; + int temp_minor = _this->gl_config.minor_version; + int temp_profile = _this->gl_config.profile_mask; -int -VITA_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) -{ - if (window && context) { - return SDL_EGL_MakeCurrent(_this, ((SDL_WindowData *) window->driverdata)->egl_surface, context); - } else { - return SDL_EGL_MakeCurrent(_this, NULL, NULL); + /* Set version to 2.1 and PROFILE to ES */ + _this->gl_config.major_version = 2; + _this->gl_config.minor_version = 1; + _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES; + + context = SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface); + + if (context != NULL) + { + FB_WIDTH = window->w; + FB_HEIGHT = window->h; + set_getprocaddress((void *(*)(const char *))eglGetProcAddress); + set_getmainfbsize(getFBSize); + SDL_snprintf(gl_version, 3, "%d%d", temp_major, temp_minor); + gl4es_setenv("LIBGL_NOTEXRECT", "1", 1); /* Currently broken in driver */ + gl4es_setenv("LIBGL_GL", gl_version, 1); + initialize_gl4es(); } + + /* Restore gl_config */ + _this->gl_config.major_version = temp_major; + _this->gl_config.minor_version = temp_minor; + _this->gl_config.profile_mask = temp_profile; + + return context; } -int -VITA_GL_SwapWindow(_THIS, SDL_Window * window) +void * +VITA_GL_GetProcAddress(_THIS, const char *proc) { - SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; - if (videodata->ime_active) { - sceImeUpdate(); - } - return SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface); + return gl4es_GetProcAddress(proc); } - #endif /* SDL_VIDEO_DRIVER_VITA && SDL_VIDEO_VITA_PVR */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/vita/SDL_vitagl_pvr_c.h b/src/video/vita/SDL_vitagl_pvr_c.h index 670eaebb0..2329d472b 100644 --- a/src/video/vita/SDL_vitagl_pvr_c.h +++ b/src/video/vita/SDL_vitagl_pvr_c.h @@ -19,17 +19,16 @@ 3. This notice may not be removed or altered from any source distribution. */ -#ifndef SDL_vitagl_c_h_ -#define SDL_vitagl_c_h_ +#ifndef SDL_vitagl_pvr_c_h_ +#define SDL_vitagl_pvr_c_h_ #include "SDL_vitavideo.h" -extern int VITA_GL_MakeCurrent(_THIS,SDL_Window * window, SDL_GLContext context); -extern int VITA_GL_SwapWindow(_THIS, SDL_Window * window); extern SDL_GLContext VITA_GL_CreateContext(_THIS, SDL_Window * window); extern int VITA_GL_LoadLibrary(_THIS, const char *path); +extern void *VITA_GL_GetProcAddress(_THIS, const char *proc); -#endif /* SDL_vitagl_c_h_ */ +#endif /* SDL_vitagl_pvr_c_h_ */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/vita/SDL_vitagl.c b/src/video/vita/SDL_vitagles.c similarity index 91% rename from src/video/vita/SDL_vitagl.c rename to src/video/vita/SDL_vitagles.c index f65022865..18ca7d57b 100644 --- a/src/video/vita/SDL_vitagl.c +++ b/src/video/vita/SDL_vitagles.c @@ -27,7 +27,7 @@ #include "SDL_error.h" #include "SDL_log.h" #include "SDL_vitavideo.h" -#include "SDL_vitagl_c.h" +#include "SDL_vitagles_c.h" /*****************************************************************************/ /* SDL OpenGL/OpenGL ES functions */ @@ -45,7 +45,7 @@ } while (0) void -VITA_GL_KeyboardCallback(ScePigletPreSwapData *data) +VITA_GLES_KeyboardCallback(ScePigletPreSwapData *data) { SceCommonDialogUpdateParam commonDialogParam; SDL_zero(commonDialogParam); @@ -62,20 +62,20 @@ VITA_GL_KeyboardCallback(ScePigletPreSwapData *data) } int -VITA_GL_LoadLibrary(_THIS, const char *path) +VITA_GLES_LoadLibrary(_THIS, const char *path) { pibInit(PIB_SHACCCG | PIB_GET_PROC_ADDR_CORE); return 0; } void * -VITA_GL_GetProcAddress(_THIS, const char *proc) +VITA_GLES_GetProcAddress(_THIS, const char *proc) { return eglGetProcAddress(proc); } void -VITA_GL_UnloadLibrary(_THIS) +VITA_GLES_UnloadLibrary(_THIS) { eglTerminate(_this->gl_data->display); } @@ -84,7 +84,7 @@ static EGLint width = 960; static EGLint height = 544; SDL_GLContext -VITA_GL_CreateContext(_THIS, SDL_Window * window) +VITA_GLES_CreateContext(_THIS, SDL_Window * window) { SDL_WindowData *wdata = (SDL_WindowData *) window->driverdata; @@ -159,13 +159,13 @@ VITA_GL_CreateContext(_THIS, SDL_Window * window) _this->gl_data->surface = surface; preSwapCallback = (PFNEGLPIGLETVITASETPRESWAPCALLBACKSCEPROC) eglGetProcAddress("eglPigletVitaSetPreSwapCallbackSCE"); - preSwapCallback(VITA_GL_KeyboardCallback); + preSwapCallback(VITA_GLES_KeyboardCallback); return context; } int -VITA_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) +VITA_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) { if (!eglMakeCurrent(_this->gl_data->display, _this->gl_data->surface, _this->gl_data->surface, _this->gl_data->context)) @@ -176,7 +176,7 @@ VITA_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) } int -VITA_GL_SetSwapInterval(_THIS, int interval) +VITA_GLES_SetSwapInterval(_THIS, int interval) { EGLBoolean status; status = eglSwapInterval(_this->gl_data->display, interval); @@ -190,13 +190,13 @@ VITA_GL_SetSwapInterval(_THIS, int interval) } int -VITA_GL_GetSwapInterval(_THIS) +VITA_GLES_GetSwapInterval(_THIS) { return _this->gl_data->swapinterval; } int -VITA_GL_SwapWindow(_THIS, SDL_Window * window) +VITA_GLES_SwapWindow(_THIS, SDL_Window * window) { if (!eglSwapBuffers(_this->gl_data->display, _this->gl_data->surface)) { return SDL_SetError("eglSwapBuffers() failed"); @@ -205,7 +205,7 @@ VITA_GL_SwapWindow(_THIS, SDL_Window * window) } void -VITA_GL_DeleteContext(_THIS, SDL_GLContext context) +VITA_GLES_DeleteContext(_THIS, SDL_GLContext context) { SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata; EGLBoolean status; diff --git a/src/video/vita/SDL_vitagl_c.h b/src/video/vita/SDL_vitagles_c.h similarity index 67% rename from src/video/vita/SDL_vitagl_c.h rename to src/video/vita/SDL_vitagles_c.h index 272653d70..10fd8533a 100644 --- a/src/video/vita/SDL_vitagl_c.h +++ b/src/video/vita/SDL_vitagles_c.h @@ -19,8 +19,8 @@ 3. This notice may not be removed or altered from any source distribution. */ -#ifndef SDL_vitagl_c_h_ -#define SDL_vitagl_c_h_ +#ifndef SDL_vitagles_c_h_ +#define SDL_vitagles_c_h_ #include @@ -39,19 +39,19 @@ typedef struct SDL_GLDriverData { uint32_t swapinterval; }SDL_GLDriverData; -extern void * VITA_GL_GetProcAddress(_THIS, const char *proc); -extern int VITA_GL_MakeCurrent(_THIS,SDL_Window * window, SDL_GLContext context); -extern void VITA_GL_SwapBuffers(_THIS); +extern void * VITA_GLES_GetProcAddress(_THIS, const char *proc); +extern int VITA_GLES_MakeCurrent(_THIS,SDL_Window * window, SDL_GLContext context); +extern void VITA_GLES_SwapBuffers(_THIS); -extern int VITA_GL_SwapWindow(_THIS, SDL_Window * window); -extern SDL_GLContext VITA_GL_CreateContext(_THIS, SDL_Window * window); +extern int VITA_GLES_SwapWindow(_THIS, SDL_Window * window); +extern SDL_GLContext VITA_GLES_CreateContext(_THIS, SDL_Window * window); -extern int VITA_GL_LoadLibrary(_THIS, const char *path); -extern void VITA_GL_UnloadLibrary(_THIS); -extern int VITA_GL_SetSwapInterval(_THIS, int interval); -extern int VITA_GL_GetSwapInterval(_THIS); +extern int VITA_GLES_LoadLibrary(_THIS, const char *path); +extern void VITA_GLES_UnloadLibrary(_THIS); +extern int VITA_GLES_SetSwapInterval(_THIS, int interval); +extern int VITA_GLES_GetSwapInterval(_THIS); -#endif /* SDL_vitagl_c_h_ */ +#endif /* SDL_vitagles_c_h_ */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/vita/SDL_vitagles_pvr.c b/src/video/vita/SDL_vitagles_pvr.c new file mode 100644 index 000000000..bb06d2946 --- /dev/null +++ b/src/video/vita/SDL_vitagles_pvr.c @@ -0,0 +1,103 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 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" + +#if SDL_VIDEO_DRIVER_VITA && SDL_VIDEO_VITA_PVR +#include +#include +#include +#include + +#include "SDL_error.h" +#include "SDL_log.h" +#include "SDL_vitavideo.h" +#include "../SDL_egl_c.h" +#include "SDL_vitagles_pvr_c.h" + +#define MAX_PATH 256 // vita limits are somehow wrong + +int +VITA_GLES_LoadLibrary(_THIS, const char *path) +{ + PVRSRV_PSP2_APPHINT hint; + char* override = SDL_getenv("VITA_MODULE_PATH"); + char* skip_init = SDL_getenv("VITA_PVR_SKIP_INIT"); + char* default_path = "app0:module"; + char target_path[MAX_PATH]; + + if (skip_init == NULL) // we don't care about actual value + { + if (override != NULL) + { + default_path = override; + } + + sceKernelLoadStartModule("vs0:sys/external/libfios2.suprx", 0, NULL, 0, NULL, NULL); + sceKernelLoadStartModule("vs0:sys/external/libc.suprx", 0, NULL, 0, NULL, NULL); + + SDL_snprintf(target_path, MAX_PATH, "%s/%s", default_path, "libgpu_es4_ext.suprx"); + sceKernelLoadStartModule(target_path, 0, NULL, 0, NULL, NULL); + + SDL_snprintf(target_path, MAX_PATH, "%s/%s", default_path, "libIMGEGL.suprx"); + sceKernelLoadStartModule(target_path, 0, NULL, 0, NULL, NULL); + + PVRSRVInitializeAppHint(&hint); + + SDL_snprintf(hint.szGLES1, MAX_PATH, "%s/%s", default_path, "libGLESv1_CM.suprx"); + SDL_snprintf(hint.szGLES2, MAX_PATH, "%s/%s", default_path, "libGLESv2.suprx"); + SDL_snprintf(hint.szWindowSystem, MAX_PATH, "%s/%s", default_path, "libpvrPSP2_WSEGL.suprx"); + + PVRSRVCreateVirtualAppHint(&hint); + } + + return SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) 0, 0); +} + +SDL_GLContext +VITA_GLES_CreateContext(_THIS, SDL_Window * window) +{ + return SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface); +} + +int +VITA_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) +{ + if (window && context) { + return SDL_EGL_MakeCurrent(_this, ((SDL_WindowData *) window->driverdata)->egl_surface, context); + } else { + return SDL_EGL_MakeCurrent(_this, NULL, NULL); + } +} + +int +VITA_GLES_SwapWindow(_THIS, SDL_Window * window) +{ + SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; + if (videodata->ime_active) { + sceImeUpdate(); + } + return SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface); +} + + +#endif /* SDL_VIDEO_DRIVER_VITA && SDL_VIDEO_VITA_PVR */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/vita/SDL_vitagles_pvr_c.h b/src/video/vita/SDL_vitagles_pvr_c.h new file mode 100644 index 000000000..c3a13c436 --- /dev/null +++ b/src/video/vita/SDL_vitagles_pvr_c.h @@ -0,0 +1,35 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2022 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. +*/ + +#ifndef SDL_vitagles_pvr_c_h_ +#define SDL_vitagles_pvr_c_h_ + +#include "SDL_vitavideo.h" + +extern int VITA_GLES_MakeCurrent(_THIS,SDL_Window * window, SDL_GLContext context); +extern int VITA_GLES_SwapWindow(_THIS, SDL_Window * window); +extern SDL_GLContext VITA_GLES_CreateContext(_THIS, SDL_Window * window); +extern int VITA_GLES_LoadLibrary(_THIS, const char *path); + + +#endif /* SDL_vitagles_pvr_c_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/vita/SDL_vitavideo.c b/src/video/vita/SDL_vitavideo.c index 778a87073..0a7e5d4ce 100644 --- a/src/video/vita/SDL_vitavideo.c +++ b/src/video/vita/SDL_vitavideo.c @@ -41,15 +41,17 @@ #include "SDL_vitaframebuffer.h" #if defined(SDL_VIDEO_VITA_PIB) - #include "SDL_vitagl_c.h" + #include "SDL_vitagles_c.h" #elif defined(SDL_VIDEO_VITA_PVR) + #include "SDL_vitagles_pvr_c.h" +#if defined(SDL_VIDEO_VITA_PVR_OGL) #include "SDL_vitagl_pvr_c.h" - #include "../SDL_egl_c.h" - #define VITA_GL_GetProcAddress SDL_EGL_GetProcAddress - #define VITA_GL_UnloadLibrary SDL_EGL_UnloadLibrary - #define VITA_GL_SetSwapInterval SDL_EGL_SetSwapInterval - #define VITA_GL_GetSwapInterval SDL_EGL_GetSwapInterval - #define VITA_GL_DeleteContext SDL_EGL_DeleteContext +#endif + #define VITA_GLES_GetProcAddress SDL_EGL_GetProcAddress + #define VITA_GLES_UnloadLibrary SDL_EGL_UnloadLibrary + #define VITA_GLES_SetSwapInterval SDL_EGL_SetSwapInterval + #define VITA_GLES_GetSwapInterval SDL_EGL_GetSwapInterval + #define VITA_GLES_DeleteContext SDL_EGL_DeleteContext #endif SDL_Window *Vita_Window; @@ -140,15 +142,22 @@ VITA_Create() */ #if defined(SDL_VIDEO_VITA_PIB) || defined(SDL_VIDEO_VITA_PVR) +if(SDL_getenv("VITA_PVR_OGL") != NULL) { device->GL_LoadLibrary = VITA_GL_LoadLibrary; - device->GL_GetProcAddress = VITA_GL_GetProcAddress; - device->GL_UnloadLibrary = VITA_GL_UnloadLibrary; device->GL_CreateContext = VITA_GL_CreateContext; - device->GL_MakeCurrent = VITA_GL_MakeCurrent; - device->GL_SetSwapInterval = VITA_GL_SetSwapInterval; - device->GL_GetSwapInterval = VITA_GL_GetSwapInterval; - device->GL_SwapWindow = VITA_GL_SwapWindow; - device->GL_DeleteContext = VITA_GL_DeleteContext; + device->GL_GetProcAddress = VITA_GL_GetProcAddress; +} +else { + device->GL_LoadLibrary = VITA_GLES_LoadLibrary; + device->GL_CreateContext = VITA_GLES_CreateContext; + device->GL_GetProcAddress = VITA_GLES_GetProcAddress; +} + device->GL_UnloadLibrary = VITA_GLES_UnloadLibrary; + device->GL_MakeCurrent = VITA_GLES_MakeCurrent; + device->GL_SetSwapInterval = VITA_GLES_SetSwapInterval; + device->GL_GetSwapInterval = VITA_GLES_GetSwapInterval; + device->GL_SwapWindow = VITA_GLES_SwapWindow; + device->GL_DeleteContext = VITA_GLES_DeleteContext; #endif device->HasScreenKeyboardSupport = VITA_HasScreenKeyboardSupport; @@ -245,6 +254,9 @@ VITA_CreateWindow(_THIS, SDL_Window * window) SDL_WindowData *wdata; #if defined(SDL_VIDEO_VITA_PVR) Psp2NativeWindow win; + int temp_major = 2; + int temp_minor = 1; + int temp_profile = 0; #endif /* Allocate window internal data */ @@ -282,11 +294,26 @@ VITA_CreateWindow(_THIS, SDL_Window * window) win.windowSize = PSP2_WINDOW_960X544; } if ((window->flags & SDL_WINDOW_OPENGL) != 0) { - wdata->egl_surface = SDL_EGL_CreateSurface(_this, &win); + if(SDL_getenv("VITA_PVR_OGL") != NULL) { + /* Set version to 2.1 and PROFILE to ES */ + temp_major = _this->gl_config.major_version; + temp_minor = _this->gl_config.minor_version; + temp_profile = _this->gl_config.profile_mask; + _this->gl_config.major_version = 2; + _this->gl_config.minor_version = 1; + _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES; + } + wdata->egl_surface = SDL_EGL_CreateSurface(_this, &win); if (wdata->egl_surface == EGL_NO_SURFACE) { return SDL_SetError("Could not create GLES window surface"); } + if(SDL_getenv("VITA_PVR_OGL") != NULL) { + /* Revert */ + _this->gl_config.major_version = temp_major; + _this->gl_config.minor_version = temp_minor; + _this->gl_config.profile_mask = temp_profile; + } } #endif diff --git a/src/video/vita/SDL_vitavideo.h b/src/video/vita/SDL_vitavideo.h index 04488dde3..9fdf7e69c 100644 --- a/src/video/vita/SDL_vitavideo.h +++ b/src/video/vita/SDL_vitavideo.h @@ -90,16 +90,23 @@ SDL_bool VITA_GetWindowWMInfo(_THIS, SDL_Window * window, struct SDL_SysWMinfo *info); #if SDL_VIDEO_DRIVER_VITA +#if defined(SDL_VIDEO_VITA_PVR_OGL) /* OpenGL functions */ int VITA_GL_LoadLibrary(_THIS, const char *path); -void *VITA_GL_GetProcAddress(_THIS, const char *proc); -void VITA_GL_UnloadLibrary(_THIS); SDL_GLContext VITA_GL_CreateContext(_THIS, SDL_Window * window); -int VITA_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); -int VITA_GL_SetSwapInterval(_THIS, int interval); -int VITA_GL_GetSwapInterval(_THIS); -int VITA_GL_SwapWindow(_THIS, SDL_Window * window); -void VITA_GL_DeleteContext(_THIS, SDL_GLContext context); +void *VITA_GL_GetProcAddress(_THIS, const char *proc); +#endif + +/* OpenGLES functions */ +int VITA_GLES_LoadLibrary(_THIS, const char *path); +void *VITA_GLES_GetProcAddress(_THIS, const char *proc); +void VITA_GLES_UnloadLibrary(_THIS); +SDL_GLContext VITA_GLES_CreateContext(_THIS, SDL_Window * window); +int VITA_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); +int VITA_GLES_SetSwapInterval(_THIS, int interval); +int VITA_GLES_GetSwapInterval(_THIS); +int VITA_GLES_SwapWindow(_THIS, SDL_Window * window); +void VITA_GLES_DeleteContext(_THIS, SDL_GLContext context); #endif /* VITA on screen keyboard */