Added an OpenVR video driver (thanks @cnlohr!)

This commit is contained in:
Sam Lantinga
2024-10-17 19:38:04 -07:00
parent 569691797d
commit e81e917c5e
10 changed files with 5060 additions and 0 deletions

View File

@@ -521,6 +521,7 @@ extern VideoBootStrap Emscripten_bootstrap;
extern VideoBootStrap OFFSCREEN_bootstrap;
extern VideoBootStrap NGAGE_bootstrap;
extern VideoBootStrap QNX_bootstrap;
extern VideoBootStrap OPENVR_bootstrap;
// Use SDL_OnVideoThread() sparingly, to avoid regressions in use cases that currently happen to work
extern bool SDL_OnVideoThread(void);

View File

@@ -139,6 +139,9 @@ static VideoBootStrap *bootstrap[] = {
#ifdef SDL_INPUT_LINUXEV
&DUMMY_evdev_bootstrap,
#endif
#endif
#ifdef SDL_VIDEO_DRIVER_OPENVR
&OPENVR_bootstrap,
#endif
NULL
};
@@ -2339,6 +2342,10 @@ SDL_Window *SDL_CreateWindowWithProperties(SDL_PropertiesID props)
flags |= SDL_DefaultGraphicsBackends(_this);
}
#if defined(SDL_VIDEO_OPENGL) && defined(SDL_VIDEO_DRIVER_OPENVR)
flags |= SDL_WINDOW_OPENGL;
#endif
if (flags & SDL_WINDOW_OPENGL) {
if (!_this->GL_CreateContext) {
SDL_ContextNotSupported("OpenGL");

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,109 @@
#ifndef _SDL_OPENVRVIDEO_H
#define _SDL_OPENVRVIDEO_H
#ifdef SDL_VIDEO_DRIVER_WINDOWS
#ifdef EXTERN_C
#undef EXTERN_C
#endif
#define GL_APIENTRY
#define GL_APICALL
#endif
// OpenVR has a LOT of unused variables that GCC will freak out on.
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
#endif
#include "openvr_capi.h"
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif
#include <stdint.h>
#ifndef SDL_VIDEO_DRIVER_WINDOWS
#include <GLES3/gl3.h>
#include <GLES3/gl32.h>
#include <EGL/egl.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLES2/gl2ext.h>
#endif
typedef struct SDL_WindowData
{
#ifdef SDL_VIDEO_DRIVER_WINDOWS
SDL_Window *window;
HWND hwnd;
HWND parent;
HDC hdc;
HDC mdc;
#else
int dummy;
#endif
} SDL_WindowData;
typedef struct SDL_VideoData {
void * openVRLIB;
intptr_t vrtoken;
intptr_t (*FN_VR_InitInternal)( EVRInitError *peError, EVRApplicationType eType );
const char *(*FN_VR_GetVRInitErrorAsEnglishDescription)( EVRInitError error );
intptr_t (*FN_VR_GetGenericInterface)( const char *pchInterfaceVersion, EVRInitError *peError );
int is_buffer_rendering;
unsigned int overlaytexture;
unsigned int fbo, rbo;
int saved_texture_state;
struct VR_IVRSystem_FnTable *oSystem;
struct VR_IVROverlay_FnTable *oOverlay;
struct VR_IVRInput_FnTable * oInput;
VROverlayHandle_t overlayID, thumbID, cursorID;
char * sOverlayName;
VRActionSetHandle_t input_action_set;
VRActionHandle_t * input_action_handles_buttons;
int input_action_handles_buttons_count;
VRActionHandle_t * input_action_handles_axes;
int input_action_handles_axes_count;
VRActionHandle_t input_action_handles_haptics[2];
bool bKeyboardShown;
bool bHasShownOverlay;
int targw, targh;
int last_targw, last_targh;
int swap_interval;
bool bDidCreateOverlay;
bool renderdoc_debugmarker_frame_end;
bool bIconOverridden;
SDL_Window * window;
SDL_Joystick *virtual_joystick;
#ifdef SDL_VIDEO_DRIVER_WINDOWS
HDC hdc;
HGLRC hglrc;
#else
EGLDisplay eglDpy;
EGLContext eglCtx;
#endif
} SDL_VideoData;
typedef struct SDL_DisplayData
{
int dummy;
} SDL_DisplayData;
#endif

File diff suppressed because it is too large Load Diff