Add pvr gles/gles2 context support

This commit is contained in:
Ivan Epifanov 2021-08-16 19:08:12 +03:00 committed by Sam Lantinga
parent ff85d4fbe5
commit 134dd46819
8 changed files with 193 additions and 7 deletions

View file

@ -425,6 +425,7 @@ set_option(SDL_TEST "Build the test directory" OFF)
if(VITA) if(VITA)
set_option(VIDEO_VITA_PIB "Build with PSVita piglet gles2 support" OFF) set_option(VIDEO_VITA_PIB "Build with PSVita piglet gles2 support" OFF)
set_option(VIDEO_VITA_PVR "Build with PSVita PVR gles/gles2 support" OFF)
endif() endif()
# General source files # General source files
@ -2205,6 +2206,29 @@ elseif(VITA)
endif() endif()
endif() endif()
if(VIDEO_VITA_PVR)
check_include_file(gpu_es4/psp2_pvr_hint.h HAVE_PVR_H)
if(HAVE_PVR_H)
add_definitions("-D__psp2__")
set(SDL_VIDEO_OPENGL_EGL 1)
set(HAVE_VIDEO_OPENGLES TRUE)
set(SDL_VIDEO_OPENGL_ES 1)
set(SDL_VIDEO_RENDER_OGL_ES 1)
set(SDL_VIDEO_OPENGL_ES2 1)
set(SDL_VIDEO_RENDER_OGL_ES2 1)
list(APPEND EXTRA_LIBS
libgpu_es4_ext_stub_weak
libIMGEGL_stub_weak
)
set(HAVE_VIDEO_VITA_PVR ON)
set(SDL_VIDEO_VITA_PVR 1)
else()
set(HAVE_VIDEO_VITA_PVR OFF)
endif()
endif()
set(SDL_VIDEO_RENDER_VITA_GXM 1) set(SDL_VIDEO_RENDER_VITA_GXM 1)
list(APPEND EXTRA_LIBS list(APPEND EXTRA_LIBS

View file

@ -481,6 +481,7 @@
#cmakedefine SDL_IPHONE_LAUNCHSCREEN @SDL_IPHONE_LAUNCHSCREEN@ #cmakedefine SDL_IPHONE_LAUNCHSCREEN @SDL_IPHONE_LAUNCHSCREEN@
#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@
#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

@ -26,6 +26,10 @@
*/ */
#if !defined(_MSC_VER) && !defined(__ANDROID__) #if !defined(_MSC_VER) && !defined(__ANDROID__)
#if defined(__vita__) || defined(__psp2__)
#include <psp2/types.h>
#endif
#include <EGL/egl.h> #include <EGL/egl.h>
#include <EGL/eglext.h> #include <EGL/eglext.h>

View file

@ -107,7 +107,7 @@
#define EGL_PLATFORM_DEVICE_EXT 0x0 #define EGL_PLATFORM_DEVICE_EXT 0x0
#endif #endif
#ifdef SDL_VIDEO_STATIC_ANGLE #if defined(SDL_VIDEO_STATIC_ANGLE) || defined(SDL_VIDEO_DRIVER_VITA)
#define LOAD_FUNC(NAME) \ #define LOAD_FUNC(NAME) \
_this->egl_data->NAME = (void *)NAME; _this->egl_data->NAME = (void *)NAME;
#else #else
@ -123,7 +123,6 @@ if (!_this->egl_data->NAME) \
#define LOAD_FUNC_EGLEXT(NAME) \ #define LOAD_FUNC_EGLEXT(NAME) \
_this->egl_data->NAME = _this->egl_data->eglGetProcAddress(#NAME); _this->egl_data->NAME = _this->egl_data->eglGetProcAddress(#NAME);
static const char * SDL_EGL_GetErrorName(EGLint eglErrorCode) static const char * SDL_EGL_GetErrorName(EGLint eglErrorCode)
{ {
#define SDL_EGL_ERROR_TRANSLATE(e) case e: return #e; #define SDL_EGL_ERROR_TRANSLATE(e) case e: return #e;
@ -245,7 +244,7 @@ SDL_EGL_GetProcAddress(_THIS, const char *proc)
retval = _this->egl_data->eglGetProcAddress(proc); retval = _this->egl_data->eglGetProcAddress(proc);
} }
#ifndef __EMSCRIPTEN__ /* LoadFunction isn't needed on Emscripten and will call dlsym(), causing other problems. */ #if !defined(__EMSCRIPTEN__) && !defined(SDL_VIDEO_DRIVER_VITA) /* LoadFunction isn't needed on Emscripten and will call dlsym(), causing other problems. */
/* Try SDL_LoadFunction() first for EGL <= 1.4, or as a fallback for >= 1.5. */ /* Try SDL_LoadFunction() first for EGL <= 1.4, or as a fallback for >= 1.5. */
if (!retval) { if (!retval) {
static char procname[64]; static char procname[64];
@ -344,7 +343,7 @@ SDL_EGL_LoadLibraryOnly(_THIS, const char *egl_path)
} }
#endif #endif
#ifndef SDL_VIDEO_STATIC_ANGLE #if !defined(SDL_VIDEO_STATIC_ANGLE) && !defined(SDL_VIDEO_DRIVER_VITA)
/* A funny thing, loading EGL.so first does not work on the Raspberry, so we load libGL* first */ /* A funny thing, loading EGL.so first does not work on the Raspberry, so we load libGL* first */
path = SDL_getenv("SDL_VIDEO_GL_DRIVER"); path = SDL_getenv("SDL_VIDEO_GL_DRIVER");
if (path != NULL) { if (path != NULL) {
@ -430,6 +429,9 @@ SDL_EGL_LoadLibraryOnly(_THIS, const char *egl_path)
#endif #endif
_this->egl_data->dll_handle = dll_handle; _this->egl_data->dll_handle = dll_handle;
#if SDL_VIDEO_DRIVER_VITA
_this->egl_data->egl_dll_handle = egl_dll_handle;
#endif
/* Load new function pointers */ /* Load new function pointers */
LOAD_FUNC(eglGetDisplay); LOAD_FUNC(eglGetDisplay);
@ -498,6 +500,7 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa
_this->egl_data->egl_display = EGL_NO_DISPLAY; _this->egl_data->egl_display = EGL_NO_DISPLAY;
#if !defined(__WINRT__) #if !defined(__WINRT__)
#if !defined(SDL_VIDEO_DRIVER_VITA)
if (platform) { if (platform) {
/* EGL 1.5 allows querying for client version with EGL_NO_DISPLAY /* EGL 1.5 allows querying for client version with EGL_NO_DISPLAY
* -- * --
@ -522,6 +525,7 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa
} }
} }
} }
#endif
/* Try the implementation-specific eglGetDisplay even if eglGetPlatformDisplay fails */ /* Try the implementation-specific eglGetDisplay even if eglGetPlatformDisplay fails */
if (_this->egl_data->egl_display == EGL_NO_DISPLAY) { if (_this->egl_data->egl_display == EGL_NO_DISPLAY) {
_this->egl_data->egl_display = _this->egl_data->eglGetDisplay(native_display); _this->egl_data->egl_display = _this->egl_data->eglGetDisplay(native_display);

View file

@ -0,0 +1,95 @@
/*
Simple DirectMedia Layer
Copyright (C) 1997-2020 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_vitagl_pvr_c.h"
#define MAX_PATH 256 // vita limits are somehow wrong
int
VITA_GL_LoadLibrary(_THIS, const char *path)
{
PVRSRV_PSP2_APPHINT hint;
char* override = SDL_getenv("VITA_MODULE_PATH");
char* default_path = "app0:module/";
char target_path[MAX_PATH];
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_GL_CreateContext(_THIS, SDL_Window * window)
{
return SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
}
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);
}
}
int
VITA_GL_SwapWindow(_THIS, SDL_Window * window)
{
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-2020 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_vitagl_c_h_
#define SDL_vitagl_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);
#endif /* SDL_vitagl_c_h_ */
/* vi: set ts=4 sw=4 expandtab: */

View file

@ -38,9 +38,19 @@
#include "SDL_vitakeyboard.h" #include "SDL_vitakeyboard.h"
#include "SDL_vitamouse_c.h" #include "SDL_vitamouse_c.h"
#include "SDL_vitaframebuffer.h" #include "SDL_vitaframebuffer.h"
#if SDL_VIDEO_VITA_PIB
#include "SDL_vitagl_c.h" #if defined(SDL_VIDEO_VITA_PIB)
#include "SDL_vitagl_c.h"
#elif defined(SDL_VIDEO_VITA_PVR)
#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 #endif
#include <psp2/ime_dialog.h> #include <psp2/ime_dialog.h>
SDL_Window *Vita_Window; SDL_Window *Vita_Window;
@ -130,7 +140,7 @@ VITA_Create()
device->DestroyWindowFramebuffer = VITA_DestroyWindowFramebuffer; device->DestroyWindowFramebuffer = VITA_DestroyWindowFramebuffer;
*/ */
#if SDL_VIDEO_VITA_PIB #if defined(SDL_VIDEO_VITA_PIB) || defined(SDL_VIDEO_VITA_PVR)
device->GL_LoadLibrary = VITA_GL_LoadLibrary; device->GL_LoadLibrary = VITA_GL_LoadLibrary;
device->GL_GetProcAddress = VITA_GL_GetProcAddress; device->GL_GetProcAddress = VITA_GL_GetProcAddress;
device->GL_UnloadLibrary = VITA_GL_UnloadLibrary; device->GL_UnloadLibrary = VITA_GL_UnloadLibrary;
@ -232,6 +242,16 @@ VITA_CreateWindow(_THIS, SDL_Window * window)
Vita_Window = window; Vita_Window = window;
#if defined(SDL_VIDEO_VITA_PVR)
if ((window->flags & SDL_WINDOW_OPENGL) != 0) {
wdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) 0);
if (wdata->egl_surface == EGL_NO_SURFACE) {
return SDL_SetError("Could not create GLES window surface");
}
}
#endif
// fix input, we need to find a better way // fix input, we need to find a better way
SDL_SetKeyboardFocus(window); SDL_SetKeyboardFocus(window);

View file

@ -24,6 +24,7 @@
#include "../../SDL_internal.h" #include "../../SDL_internal.h"
#include "../SDL_sysvideo.h" #include "../SDL_sysvideo.h"
#include "../SDL_egl_c.h"
#include <psp2/types.h> #include <psp2/types.h>
#include <psp2/display.h> #include <psp2/display.h>
@ -51,6 +52,8 @@ typedef struct SDL_WindowData
SDL_bool uses_gles; SDL_bool uses_gles;
SceUID buffer_uid; SceUID buffer_uid;
void* buffer; void* buffer;
EGLSurface egl_surface;
EGLContext egl_context;
} SDL_WindowData; } SDL_WindowData;