Desktop OpenGL 1.X/2.X PSVita Support

main
Jaylon Gowie 2022-03-29 19:08:56 -05:00 committed by Ryan C. Gordon
parent 2c04df8d65
commit 8c542a3591
12 changed files with 290 additions and 71 deletions

View File

@ -2321,6 +2321,7 @@ elseif(VITA)
check_include_file(gpu_es4/psp2_pvr_hint.h HAVE_PVR_H) check_include_file(gpu_es4/psp2_pvr_hint.h HAVE_PVR_H)
if(HAVE_PVR_H) if(HAVE_PVR_H)
target_compile_definitions(sdl-build-options INTERFACE "-D__psp2__") target_compile_definitions(sdl-build-options INTERFACE "-D__psp2__")
check_include_file(gl4esinit.h HAVE_GL4ES_H)
set(SDL_VIDEO_OPENGL_EGL 1) set(SDL_VIDEO_OPENGL_EGL 1)
set(HAVE_OPENGLES TRUE) set(HAVE_OPENGLES TRUE)
set(SDL_VIDEO_OPENGL_ES 1) set(SDL_VIDEO_OPENGL_ES 1)
@ -2332,8 +2333,18 @@ elseif(VITA)
libgpu_es4_ext_stub_weak libgpu_es4_ext_stub_weak
libIMGEGL_stub_weak libIMGEGL_stub_weak
) )
set(HAVE_VITA_PVR ON) set(HAVE_VITA_PVR ON)
set(SDL_VIDEO_VITA_PVR 1) 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() else()
set(HAVE_VITA_PVR OFF) set(HAVE_VITA_PVR OFF)
endif() endif()

View File

@ -520,6 +520,7 @@
#cmakedefine SDL_VIDEO_VITA_PIB @SDL_VIDEO_VITA_PIB@ #cmakedefine SDL_VIDEO_VITA_PIB @SDL_VIDEO_VITA_PIB@
#cmakedefine SDL_VIDEO_VITA_PVR @SDL_VIDEO_VITA_PVR@ #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(__WIN32__) && !defined(__WINRT__)
# if !defined(_STDINT_H_) && !defined(_STDINT_H) && !defined(HAVE_STDINT_H) && !defined(_HAVE_STDINT_H) # if !defined(_STDINT_H_) && !defined(_STDINT_H) && !defined(HAVE_STDINT_H) && !defined(_HAVE_STDINT_H)

View File

@ -30,6 +30,11 @@
#include <OpenGL/OpenGL.h> #include <OpenGL/OpenGL.h>
#endif #endif
#ifdef __psp2__
#include <GL/gl.h>
#include <GL/glext.h>
#endif
/* To prevent unnecessary window recreation, /* To prevent unnecessary window recreation,
* these should match the defaults selected in SDL_GL_ResetAttributes * 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_MAJOR_VERSION, &major);
SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor); SDL_GL_GetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, &minor);
#ifndef __psp2__
window_flags = SDL_GetWindowFlags(window); window_flags = SDL_GetWindowFlags(window);
if (!(window_flags & SDL_WINDOW_OPENGL) || if (!(window_flags & SDL_WINDOW_OPENGL) ||
profile_mask == SDL_GL_CONTEXT_PROFILE_ES || major != RENDERER_CONTEXT_MAJOR || minor != RENDERER_CONTEXT_MINOR) { 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; goto error;
} }
} }
#endif
renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer)); renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));
if (!renderer) { if (!renderer) {

View File

@ -99,7 +99,7 @@
#define DEFAULT_OGL_ES "libGLESv1_CM.so.1" #define DEFAULT_OGL_ES "libGLESv1_CM.so.1"
#endif /* SDL_VIDEO_DRIVER_RPI */ #endif /* SDL_VIDEO_DRIVER_RPI */
#if SDL_VIDEO_OPENGL #if SDL_VIDEO_OPENGL && !SDL_VIDEO_VITA_PVR_OGL
#include "SDL_opengl.h" #include "SDL_opengl.h"
#endif #endif
@ -1062,7 +1062,7 @@ SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface)
if (SDL_GL_ExtensionSupported("GL_OES_surfaceless_context")) { if (SDL_GL_ExtensionSupported("GL_OES_surfaceless_context")) {
_this->gl_allow_no_surface = SDL_TRUE; _this->gl_allow_no_surface = SDL_TRUE;
} }
#if SDL_VIDEO_OPENGL #if SDL_VIDEO_OPENGL && !defined(SDL_VIDEO_DRIVER_VITA)
} else { } else {
/* Desktop OpenGL supports it by default from version 3.0 on. */ /* Desktop OpenGL supports it by default from version 3.0 on. */
void (APIENTRY * glGetIntegervFunc) (GLenum pname, GLint * params); void (APIENTRY * glGetIntegervFunc) (GLenum pname, GLint * params);

View File

@ -20,11 +20,12 @@
*/ */
#include "../../SDL_internal.h" #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 <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <psp2/kernel/modulemgr.h> #include <psp2/kernel/modulemgr.h>
#include <gpu_es4/psp2_pvr_hint.h> #include <gpu_es4/psp2_pvr_hint.h>
#include <gl4esinit.h>
#include "SDL_error.h" #include "SDL_error.h"
#include "SDL_log.h" #include "SDL_log.h"
@ -34,6 +35,16 @@
#define MAX_PATH 256 // vita limits are somehow wrong #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 int
VITA_GL_LoadLibrary(_THIS, const char *path) 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/libfios2.suprx", 0, NULL, 0, NULL, NULL);
sceKernelLoadStartModule("vs0:sys/external/libc.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"); SDL_snprintf(target_path, MAX_PATH, "%s/%s", default_path, "libgpu_es4_ext.suprx");
sceKernelLoadStartModule(target_path, 0, NULL, 0, NULL, NULL); sceKernelLoadStartModule(target_path, 0, NULL, 0, NULL, NULL);
@ -74,29 +88,44 @@ VITA_GL_LoadLibrary(_THIS, const char *path)
SDL_GLContext SDL_GLContext
VITA_GL_CreateContext(_THIS, SDL_Window * window) 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 /* Set version to 2.1 and PROFILE to ES */
VITA_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) _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)
{ {
if (window && context) { FB_WIDTH = window->w;
return SDL_EGL_MakeCurrent(_this, ((SDL_WindowData *) window->driverdata)->egl_surface, context); FB_HEIGHT = window->h;
} else { set_getprocaddress((void *(*)(const char *))eglGetProcAddress);
return SDL_EGL_MakeCurrent(_this, NULL, NULL); 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();
} }
int /* Restore gl_config */
VITA_GL_SwapWindow(_THIS, SDL_Window * window) _this->gl_config.major_version = temp_major;
_this->gl_config.minor_version = temp_minor;
_this->gl_config.profile_mask = temp_profile;
return context;
}
void *
VITA_GL_GetProcAddress(_THIS, const char *proc)
{ {
SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; return gl4es_GetProcAddress(proc);
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 */ #endif /* SDL_VIDEO_DRIVER_VITA && SDL_VIDEO_VITA_PVR */

View File

@ -19,17 +19,16 @@
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef SDL_vitagl_c_h_ #ifndef SDL_vitagl_pvr_c_h_
#define SDL_vitagl_c_h_ #define SDL_vitagl_pvr_c_h_
#include "SDL_vitavideo.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 SDL_GLContext VITA_GL_CreateContext(_THIS, SDL_Window * window);
extern int VITA_GL_LoadLibrary(_THIS, const char *path); 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: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -27,7 +27,7 @@
#include "SDL_error.h" #include "SDL_error.h"
#include "SDL_log.h" #include "SDL_log.h"
#include "SDL_vitavideo.h" #include "SDL_vitavideo.h"
#include "SDL_vitagl_c.h" #include "SDL_vitagles_c.h"
/*****************************************************************************/ /*****************************************************************************/
/* SDL OpenGL/OpenGL ES functions */ /* SDL OpenGL/OpenGL ES functions */
@ -45,7 +45,7 @@
} while (0) } while (0)
void void
VITA_GL_KeyboardCallback(ScePigletPreSwapData *data) VITA_GLES_KeyboardCallback(ScePigletPreSwapData *data)
{ {
SceCommonDialogUpdateParam commonDialogParam; SceCommonDialogUpdateParam commonDialogParam;
SDL_zero(commonDialogParam); SDL_zero(commonDialogParam);
@ -62,20 +62,20 @@ VITA_GL_KeyboardCallback(ScePigletPreSwapData *data)
} }
int int
VITA_GL_LoadLibrary(_THIS, const char *path) VITA_GLES_LoadLibrary(_THIS, const char *path)
{ {
pibInit(PIB_SHACCCG | PIB_GET_PROC_ADDR_CORE); pibInit(PIB_SHACCCG | PIB_GET_PROC_ADDR_CORE);
return 0; return 0;
} }
void * void *
VITA_GL_GetProcAddress(_THIS, const char *proc) VITA_GLES_GetProcAddress(_THIS, const char *proc)
{ {
return eglGetProcAddress(proc); return eglGetProcAddress(proc);
} }
void void
VITA_GL_UnloadLibrary(_THIS) VITA_GLES_UnloadLibrary(_THIS)
{ {
eglTerminate(_this->gl_data->display); eglTerminate(_this->gl_data->display);
} }
@ -84,7 +84,7 @@ static EGLint width = 960;
static EGLint height = 544; static EGLint height = 544;
SDL_GLContext SDL_GLContext
VITA_GL_CreateContext(_THIS, SDL_Window * window) VITA_GLES_CreateContext(_THIS, SDL_Window * window)
{ {
SDL_WindowData *wdata = (SDL_WindowData *) window->driverdata; SDL_WindowData *wdata = (SDL_WindowData *) window->driverdata;
@ -159,13 +159,13 @@ VITA_GL_CreateContext(_THIS, SDL_Window * window)
_this->gl_data->surface = surface; _this->gl_data->surface = surface;
preSwapCallback = (PFNEGLPIGLETVITASETPRESWAPCALLBACKSCEPROC) eglGetProcAddress("eglPigletVitaSetPreSwapCallbackSCE"); preSwapCallback = (PFNEGLPIGLETVITASETPRESWAPCALLBACKSCEPROC) eglGetProcAddress("eglPigletVitaSetPreSwapCallbackSCE");
preSwapCallback(VITA_GL_KeyboardCallback); preSwapCallback(VITA_GLES_KeyboardCallback);
return context; return context;
} }
int 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, if (!eglMakeCurrent(_this->gl_data->display, _this->gl_data->surface,
_this->gl_data->surface, _this->gl_data->context)) _this->gl_data->surface, _this->gl_data->context))
@ -176,7 +176,7 @@ VITA_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
} }
int int
VITA_GL_SetSwapInterval(_THIS, int interval) VITA_GLES_SetSwapInterval(_THIS, int interval)
{ {
EGLBoolean status; EGLBoolean status;
status = eglSwapInterval(_this->gl_data->display, interval); status = eglSwapInterval(_this->gl_data->display, interval);
@ -190,13 +190,13 @@ VITA_GL_SetSwapInterval(_THIS, int interval)
} }
int int
VITA_GL_GetSwapInterval(_THIS) VITA_GLES_GetSwapInterval(_THIS)
{ {
return _this->gl_data->swapinterval; return _this->gl_data->swapinterval;
} }
int 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)) { if (!eglSwapBuffers(_this->gl_data->display, _this->gl_data->surface)) {
return SDL_SetError("eglSwapBuffers() failed"); return SDL_SetError("eglSwapBuffers() failed");
@ -205,7 +205,7 @@ VITA_GL_SwapWindow(_THIS, SDL_Window * window)
} }
void void
VITA_GL_DeleteContext(_THIS, SDL_GLContext context) VITA_GLES_DeleteContext(_THIS, SDL_GLContext context)
{ {
SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata; SDL_VideoData *phdata = (SDL_VideoData *) _this->driverdata;
EGLBoolean status; EGLBoolean status;

View File

@ -19,8 +19,8 @@
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
#ifndef SDL_vitagl_c_h_ #ifndef SDL_vitagles_c_h_
#define SDL_vitagl_c_h_ #define SDL_vitagles_c_h_
#include <pib.h> #include <pib.h>
@ -39,19 +39,19 @@ typedef struct SDL_GLDriverData {
uint32_t swapinterval; uint32_t swapinterval;
}SDL_GLDriverData; }SDL_GLDriverData;
extern void * VITA_GL_GetProcAddress(_THIS, const char *proc); extern void * VITA_GLES_GetProcAddress(_THIS, const char *proc);
extern int VITA_GL_MakeCurrent(_THIS,SDL_Window * window, SDL_GLContext context); extern int VITA_GLES_MakeCurrent(_THIS,SDL_Window * window, SDL_GLContext context);
extern void VITA_GL_SwapBuffers(_THIS); extern void VITA_GLES_SwapBuffers(_THIS);
extern int VITA_GL_SwapWindow(_THIS, SDL_Window * window); extern int VITA_GLES_SwapWindow(_THIS, SDL_Window * window);
extern SDL_GLContext VITA_GL_CreateContext(_THIS, SDL_Window * window); extern SDL_GLContext VITA_GLES_CreateContext(_THIS, SDL_Window * window);
extern int VITA_GL_LoadLibrary(_THIS, const char *path); extern int VITA_GLES_LoadLibrary(_THIS, const char *path);
extern void VITA_GL_UnloadLibrary(_THIS); extern void VITA_GLES_UnloadLibrary(_THIS);
extern int VITA_GL_SetSwapInterval(_THIS, int interval); extern int VITA_GLES_SetSwapInterval(_THIS, int interval);
extern int VITA_GL_GetSwapInterval(_THIS); extern int VITA_GLES_GetSwapInterval(_THIS);
#endif /* SDL_vitagl_c_h_ */ #endif /* SDL_vitagles_c_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -0,0 +1,103 @@
/*
Simple DirectMedia Layer
Copyright (C) 1997-2022 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"
#if SDL_VIDEO_DRIVER_VITA && SDL_VIDEO_VITA_PVR
#include <stdlib.h>
#include <string.h>
#include <psp2/kernel/modulemgr.h>
#include <gpu_es4/psp2_pvr_hint.h>
#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: */

View File

@ -0,0 +1,35 @@
/*
Simple DirectMedia Layer
Copyright (C) 1997-2022 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.
*/
#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: */

View File

@ -41,15 +41,17 @@
#include "SDL_vitaframebuffer.h" #include "SDL_vitaframebuffer.h"
#if defined(SDL_VIDEO_VITA_PIB) #if defined(SDL_VIDEO_VITA_PIB)
#include "SDL_vitagl_c.h" #include "SDL_vitagles_c.h"
#elif defined(SDL_VIDEO_VITA_PVR) #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_vitagl_pvr_c.h"
#include "../SDL_egl_c.h" #endif
#define VITA_GL_GetProcAddress SDL_EGL_GetProcAddress #define VITA_GLES_GetProcAddress SDL_EGL_GetProcAddress
#define VITA_GL_UnloadLibrary SDL_EGL_UnloadLibrary #define VITA_GLES_UnloadLibrary SDL_EGL_UnloadLibrary
#define VITA_GL_SetSwapInterval SDL_EGL_SetSwapInterval #define VITA_GLES_SetSwapInterval SDL_EGL_SetSwapInterval
#define VITA_GL_GetSwapInterval SDL_EGL_GetSwapInterval #define VITA_GLES_GetSwapInterval SDL_EGL_GetSwapInterval
#define VITA_GL_DeleteContext SDL_EGL_DeleteContext #define VITA_GLES_DeleteContext SDL_EGL_DeleteContext
#endif #endif
SDL_Window *Vita_Window; SDL_Window *Vita_Window;
@ -140,15 +142,22 @@ VITA_Create()
*/ */
#if defined(SDL_VIDEO_VITA_PIB) || defined(SDL_VIDEO_VITA_PVR) #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_LoadLibrary = VITA_GL_LoadLibrary;
device->GL_GetProcAddress = VITA_GL_GetProcAddress;
device->GL_UnloadLibrary = VITA_GL_UnloadLibrary;
device->GL_CreateContext = VITA_GL_CreateContext; device->GL_CreateContext = VITA_GL_CreateContext;
device->GL_MakeCurrent = VITA_GL_MakeCurrent; device->GL_GetProcAddress = VITA_GL_GetProcAddress;
device->GL_SetSwapInterval = VITA_GL_SetSwapInterval; }
device->GL_GetSwapInterval = VITA_GL_GetSwapInterval; else {
device->GL_SwapWindow = VITA_GL_SwapWindow; device->GL_LoadLibrary = VITA_GLES_LoadLibrary;
device->GL_DeleteContext = VITA_GL_DeleteContext; 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 #endif
device->HasScreenKeyboardSupport = VITA_HasScreenKeyboardSupport; device->HasScreenKeyboardSupport = VITA_HasScreenKeyboardSupport;
@ -245,6 +254,9 @@ VITA_CreateWindow(_THIS, SDL_Window * window)
SDL_WindowData *wdata; SDL_WindowData *wdata;
#if defined(SDL_VIDEO_VITA_PVR) #if defined(SDL_VIDEO_VITA_PVR)
Psp2NativeWindow win; Psp2NativeWindow win;
int temp_major = 2;
int temp_minor = 1;
int temp_profile = 0;
#endif #endif
/* Allocate window internal data */ /* Allocate window internal data */
@ -282,11 +294,26 @@ VITA_CreateWindow(_THIS, SDL_Window * window)
win.windowSize = PSP2_WINDOW_960X544; win.windowSize = PSP2_WINDOW_960X544;
} }
if ((window->flags & SDL_WINDOW_OPENGL) != 0) { 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) { if (wdata->egl_surface == EGL_NO_SURFACE) {
return SDL_SetError("Could not create GLES window 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 #endif

View File

@ -90,16 +90,23 @@ SDL_bool VITA_GetWindowWMInfo(_THIS, SDL_Window * window,
struct SDL_SysWMinfo *info); struct SDL_SysWMinfo *info);
#if SDL_VIDEO_DRIVER_VITA #if SDL_VIDEO_DRIVER_VITA
#if defined(SDL_VIDEO_VITA_PVR_OGL)
/* OpenGL functions */ /* OpenGL functions */
int VITA_GL_LoadLibrary(_THIS, const char *path); 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); SDL_GLContext VITA_GL_CreateContext(_THIS, SDL_Window * window);
int VITA_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context); void *VITA_GL_GetProcAddress(_THIS, const char *proc);
int VITA_GL_SetSwapInterval(_THIS, int interval); #endif
int VITA_GL_GetSwapInterval(_THIS);
int VITA_GL_SwapWindow(_THIS, SDL_Window * window); /* OpenGLES functions */
void VITA_GL_DeleteContext(_THIS, SDL_GLContext context); 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 #endif
/* VITA on screen keyboard */ /* VITA on screen keyboard */