OpenXR - Sonic rivals rendering fix

This commit is contained in:
Lubos 2024-08-27 08:22:58 +02:00
parent 7fab80200a
commit abeeeb1cbf
4 changed files with 11 additions and 6 deletions

View file

@ -527,7 +527,7 @@ bool StartVRRender() {
// VR flags
bool vrIncompatibleGame = PSP_CoreParameter().compat.vrCompat().ForceFlatScreen;
bool vrMode = (g_Config.bEnableVR || g_Config.bEnableImmersiveVR) && !vrIncompatibleGame;
bool vrMode = (g_Config.bEnableVR || IsImmersiveVRMode()) && !vrIncompatibleGame;
bool vrScene = !vrFlatForced && (g_Config.bManualForceVR || (vr3DGeometryCount > 15));
bool vrStereo = !PSP_CoreParameter().compat.vrCompat().ForceMono && g_Config.bEnableStereo;
@ -558,7 +558,7 @@ bool StartVRRender() {
M[10] = -1;
M[11] = -1;
M[14] = -(nearZ + nearZ);
if (g_Config.bEnableImmersiveVR) {
if (IsImmersiveVRMode()) {
M[0] /= 2.0f;
}
memcpy(vrMatrix[VR_PROJECTION_MATRIX], M, sizeof(float) * 16);
@ -567,7 +567,7 @@ bool StartVRRender() {
VR_SetConfigFloat(VR_CONFIG_CANVAS_ASPECT, 480.0f / 272.0f);
if (vrMode && vrScene && (appMode == VR_GAME_MODE)) {
VR_SetConfig(VR_CONFIG_MODE, vrStereo ? VR_MODE_STEREO_6DOF : VR_MODE_MONO_6DOF);
VR_SetConfig(VR_CONFIG_REPROJECTION, g_Config.bEnableImmersiveVR ? 0 : 1);
VR_SetConfig(VR_CONFIG_REPROJECTION, IsImmersiveVRMode() ? 0 : 1);
vrFlatGame = false;
} else if (appMode == VR_GAME_MODE) {
VR_SetConfig(VR_CONFIG_MODE, vrStereo ? VR_MODE_STEREO_SCREEN : VR_MODE_MONO_SCREEN);
@ -632,6 +632,10 @@ bool IsGameVRScene() {
return (appMode == VR_GAME_MODE) || (appMode == VR_DIALOG_MODE);
}
bool IsImmersiveVRMode() {
return g_Config.bEnableImmersiveVR && !PSP_CoreParameter().compat.vrCompat().IdentityViewHack;
}
bool Is2DVRObject(float* projMatrix, bool ortho) {
// Quick analyze if the object is in 2D

View file

@ -56,6 +56,7 @@ bool IsPassthroughSupported();
bool IsFlatVRGame();
bool IsFlatVRScene();
bool IsGameVRScene();
bool IsImmersiveVRMode();
bool Is2DVRObject(float* projMatrix, bool ortho);
void UpdateVRParams(float* projMatrix);
void UpdateVRProjection(float* projMatrix, float* output);

View file

@ -1664,13 +1664,13 @@ void FramebufferManagerCommon::CopyDisplayToOutput(bool reallyDirty) {
//clip the VR framebuffer to keep the aspect ratio
if (IsVREnabled() && !IsFlatVRGame() && !IsGameVRScene()) {
float aspect = 272.0f / 480.0f * (g_Config.bEnableImmersiveVR ? 2.0f : 1.0f);
float aspect = 272.0f / 480.0f * (IsImmersiveVRMode() ? 2.0f : 1.0f);
float clipY = 272.0f * (1.0f - aspect) / 2.0f;
v0 = (clipY + offsetY) / (float)vfb->bufferHeight;
v1 = (272.0f - clipY + offsetY) / (float)vfb->bufferHeight;
//zoom inside
float zoom = g_Config.bEnableImmersiveVR ? 0.4f : 0.1f;
float zoom = IsImmersiveVRMode() ? 0.4f : 0.1f;
u0 += zoom / aspect;
u1 -= zoom / aspect;
v0 += zoom;

View file

@ -412,7 +412,7 @@ void LinkedShader::UpdateUniforms(const ShaderID &vsid, bool useBufferedRenderin
// Set HUD mode
if (gstate_c.Use(GPU_USE_VIRTUAL_REALITY)) {
if (GuessVRDrawingHUD(is2D, flatScreen)) {
float aspect = 480.0f / 272.0f * (g_Config.bEnableImmersiveVR ? 0.5f : 1.0f);
float aspect = 480.0f / 272.0f * (IsImmersiveVRMode() ? 0.5f : 1.0f);
render_->SetUniformF1(&u_scaleX, g_Config.fHeadUpDisplayScale * aspect);
render_->SetUniformF1(&u_scaleY, g_Config.fHeadUpDisplayScale);
} else {