Files
ppsspp/Common/VR/VRBase.h

149 lines
3.7 KiB
C
Raw Permalink Normal View History

2022-07-24 13:25:17 +02:00
#pragma once
2022-07-08 14:44:20 +02:00
#ifdef ANDROID
2022-08-16 17:39:54 +02:00
#include <android/log.h>
#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, "OpenXR", __VA_ARGS__);
#define ALOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "OpenXR", __VA_ARGS__);
#else
#include <cstdio>
2022-08-16 17:39:54 +02:00
#define ALOGE(...) printf(__VA_ARGS__)
#define ALOGV(...) printf(__VA_ARGS__)
#endif
#include "Common/VR/OpenXRLoader.h"
2022-09-14 19:53:55 +02:00
#define _USE_MATH_DEFINES
#include <cmath>
2022-11-07 16:28:41 +01:00
#include <cassert>
2022-11-07 17:36:46 +01:00
#if defined(_DEBUG) && (defined(XR_USE_GRAPHICS_API_OPENGL) || defined(XR_USE_GRAPHICS_API_OPENGL_ES))
2022-11-07 23:04:45 +01:00
void GLCheckErrors(const char* file, int line);
2022-08-16 17:39:54 +02:00
#define GL(func) func; GLCheckErrors(__FILE__ , __LINE__);
#else
#define GL(func) func;
#endif
#if defined(_DEBUG)
static void OXR_CheckErrors(XrInstance instance, XrResult result, const char* function, bool failOnError) {
if (XR_FAILED(result)) {
char errorBuffer[XR_MAX_RESULT_STRING_SIZE];
xrResultToString(instance, result, errorBuffer);
if (failOnError) {
ALOGE("OpenXR error: %s: %s\n", function, errorBuffer);
} else {
ALOGV("OpenXR error: %s: %s\n", function, errorBuffer);
}
}
}
#define OXR(func) OXR_CheckErrors(VR_GetEngine()->appState.Instance, func, #func, true);
#else
#define OXR(func) func;
#endif
#define DECL_PFN(pfn) PFN_##pfn pfn = nullptr
#define INIT_PFN(pfn) OXR(xrGetInstanceProcAddr(engine->appState.Instance, #pfn, (PFN_xrVoidFunction*)(&pfn)))
enum { ovrMaxLayerCount = 3 };
2022-08-16 17:39:54 +02:00
enum { ovrMaxNumEyes = 2 };
typedef union {
XrCompositionLayerProjection Projection;
XrCompositionLayerCylinderKHR Cylinder;
XrCompositionLayerPassthroughFB Passthrough;
2022-08-16 17:39:54 +02:00
} ovrCompositorLayer_Union;
typedef struct {
XrSwapchain Handle;
uint32_t Width;
uint32_t Height;
} ovrSwapChain;
typedef struct {
int Width;
int Height;
uint32_t TextureSwapChainLength;
uint32_t TextureSwapChainIndex;
ovrSwapChain ColorSwapChain;
ovrSwapChain DepthSwapChain;
2022-09-14 19:53:55 +02:00
void* ColorSwapChainImage;
void* DepthSwapChainImage;
2022-09-14 19:53:55 +02:00
unsigned int* GLFrameBuffers;
VkFramebuffer* VKFrameBuffers;
VkImageView* VKColorImages;
VkImageView* VKDepthImages;
2022-09-14 19:53:55 +02:00
bool Acquired;
2022-09-14 19:53:55 +02:00
XrGraphicsBindingVulkanKHR* VKContext;
2022-08-16 17:39:54 +02:00
} ovrFramebuffer;
typedef struct {
bool Multiview;
ovrFramebuffer FrameBuffer[ovrMaxNumEyes];
2022-08-16 17:39:54 +02:00
} ovrRenderer;
typedef struct {
int Focused;
XrInstance Instance;
XrSession Session;
XrViewConfigurationProperties ViewportConfig;
XrViewConfigurationView ViewConfigurationView[ovrMaxNumEyes];
XrSystemId SystemId;
XrSpace HeadSpace;
XrSpace StageSpace;
XrSpace FakeStageSpace;
XrSpace CurrentSpace;
int SessionActive;
int SwapInterval;
// These threads will be marked as performance threads.
int MainThreadTid;
int RenderThreadTid;
ovrCompositorLayer_Union Layers[ovrMaxLayerCount];
int LayerCount;
ovrRenderer Renderer;
} ovrApp;
#ifdef ANDROID
2022-08-16 17:39:54 +02:00
typedef struct {
JavaVM* Vm;
jobject ActivityObject;
JNIEnv* Env;
} ovrJava;
#endif
2022-08-16 17:39:54 +02:00
typedef struct {
uint64_t frameIndex;
ovrApp appState;
2022-11-06 14:35:28 +01:00
XrTime predictedDisplayTime;
2022-09-14 19:53:55 +02:00
XrGraphicsBindingVulkanKHR graphicsBindingVulkan;
2022-08-16 17:39:54 +02:00
} engine_t;
2022-07-08 14:44:20 +02:00
2022-11-04 14:22:42 +01:00
enum VRPlatformFlag {
VR_PLATFORM_CONTROLLER_PICO,
VR_PLATFORM_CONTROLLER_QUEST,
VR_PLATFORM_EXTENSION_FOVEATION,
VR_PLATFORM_EXTENSION_INSTANCE,
VR_PLATFORM_EXTENSION_PASSTHROUGH,
VR_PLATFORM_EXTENSION_PERFORMANCE,
2022-11-04 14:22:42 +01:00
VR_PLATFORM_RENDERER_VULKAN,
VR_PLATFORM_TRACKING_FLOOR,
VR_PLATFORM_MAX
};
2022-11-06 11:32:42 +01:00
void VR_Init( void* system, const char* name, int version );
2022-07-08 14:44:20 +02:00
void VR_Destroy( engine_t* engine );
2022-09-14 19:53:55 +02:00
void VR_EnterVR( engine_t* engine, XrGraphicsBindingVulkanKHR* graphicsBindingVulkan );
2022-07-08 14:44:20 +02:00
void VR_LeaveVR( engine_t* engine );
engine_t* VR_GetEngine( void );
2022-11-06 14:37:56 +01:00
bool VR_GetPlatformFlag(VRPlatformFlag flag);
2022-11-04 14:22:42 +01:00
void VR_SetPlatformFLag(VRPlatformFlag flag, bool value);
2022-08-16 17:39:54 +02:00
void ovrApp_Clear(ovrApp* app);
void ovrApp_Destroy(ovrApp* app);
int ovrApp_HandleXrEvents(ovrApp* app);