diff --git a/src/video_core/rasterizer_accelerated.cpp b/src/video_core/rasterizer_accelerated.cpp index f695d39f0..b6e8bb4fa 100644 --- a/src/video_core/rasterizer_accelerated.cpp +++ b/src/video_core/rasterizer_accelerated.cpp @@ -4,7 +4,6 @@ #include #include "common/alignment.h" -#include "common/settings.h" #include "core/memory.h" #include "video_core/pica_state.h" #include "video_core/rasterizer_accelerated.h" @@ -137,7 +136,6 @@ void RasterizerAccelerated::SyncEntireState() { // Sync uniforms SyncClipPlane(); - SyncVRImmersive(); SyncDepthScale(); SyncDepthOffset(); SyncAlphaTest(); @@ -862,9 +860,4 @@ void RasterizerAccelerated::SyncClipPlane() { } } -void RasterizerAccelerated::SyncVRImmersive() { - vs_uniform_block_data.data.vr_use_immersive_mode = Settings::values.vr_use_immersive_mode.GetValue(); - vs_uniform_block_data.dirty = true; -} - } // namespace VideoCore diff --git a/src/video_core/rasterizer_accelerated.h b/src/video_core/rasterizer_accelerated.h index ffcfb1483..0bef2c537 100644 --- a/src/video_core/rasterizer_accelerated.h +++ b/src/video_core/rasterizer_accelerated.h @@ -103,9 +103,6 @@ class RasterizerAccelerated : public RasterizerInterface { /// Syncs the clip plane state to match the PICA register void SyncClipPlane(); - /// Syncs the VR immersive flag - void SyncVRImmersive(); - protected: /// Structure that keeps tracks of the vertex shader uniform state struct VSUniformBlockData { diff --git a/src/video_core/shader/generator/glsl_shader_gen.cpp b/src/video_core/shader/generator/glsl_shader_gen.cpp index e4c2866ed..0b9acf22f 100644 --- a/src/video_core/shader/generator/glsl_shader_gen.cpp +++ b/src/video_core/shader/generator/glsl_shader_gen.cpp @@ -43,7 +43,6 @@ layout (set = 0, binding = 1, std140) uniform vs_data { #else layout (binding = 1, std140) uniform vs_data { #endif - bool vr_use_immersive_mode; bool enable_clip1; vec4 clip_coef; }; @@ -1682,7 +1681,12 @@ void main() { } )"; - out+= "\ngl_Position = vec4(vtx_pos.x, vtx_pos.y, -vtx_pos.z, vtx_pos.w);\n"; + if (!Settings::values.vr_use_immersive_mode.GetValue()) + { + out+= "\ngl_Position = vec4(vtx_pos.x, vtx_pos.y, -vtx_pos.z, vtx_pos.w);\n"; + } else { + out+= "\ngl_Position = vec4(vtx_pos.x / 3.0, vtx_pos.y / 3.0, -vtx_pos.z, vtx_pos.w);\n"; + } if (use_clip_planes) { out += R"( @@ -1803,7 +1807,14 @@ std::string GenerateVertexShader(const Pica::Shader::ShaderSetup& setup, const P out += " vtx_pos.z = 0.f;\n"; out += " }\n"; - out+= " gl_Position = vec4(vtx_pos.x, vtx_pos.y, -vtx_pos.z, vtx_pos.w);\n"; + if (!Settings::values.vr_use_immersive_mode.GetValue()) + { + out+= " gl_Position = vec4(vtx_pos.x, vtx_pos.y, -vtx_pos.z, vtx_pos.w);\n"; + } + else + { + out+= " gl_Position = vec4(vtx_pos.x / 3.0, vtx_pos.y / 3.0, -vtx_pos.z, vtx_pos.w);\n"; + } if (config.state.use_clip_planes) { out += " gl_ClipDistance[0] = -vtx_pos.z;\n"; // fixed PICA clipping plane z <= 0 @@ -1902,11 +1913,11 @@ struct Vertex { out += " vtx_pos.z = 0.f;\n"; out += " }\n"; - out += " if (vr_use_immersive_mode) {\n"; - out += " gl_Position = vec4(vtx_pos.x / 3.0, vtx_pos.y / 3.0, -vtx_pos.z, vtx_pos.w);\n"; - out += " } else {\n"; - out += " gl_Position = vec4(vtx_pos.x, vtx_pos.y, -vtx_pos.z, vtx_pos.w);\n"; - out += " }\n\n"; + if (!Settings::values.vr_use_immersive_mode.GetValue()) { + out+= " gl_Position = vec4(vtx_pos.x, vtx_pos.y, -vtx_pos.z, vtx_pos.w);\n"; + } else { + out+= " gl_Position = vec4(vtx_pos.x / 3.0, vtx_pos.y / 3.0, -vtx_pos.z, vtx_pos.w);\n"; + } if (state.use_clip_planes) { out += " gl_ClipDistance[0] = -vtx_pos.z;\n"; // fixed PICA clipping plane z <= 0 diff --git a/src/video_core/shader/generator/shader_gen.cpp b/src/video_core/shader/generator/shader_gen.cpp index 2ed7ff006..4b7f056ef 100644 --- a/src/video_core/shader/generator/shader_gen.cpp +++ b/src/video_core/shader/generator/shader_gen.cpp @@ -21,6 +21,8 @@ PicaFSConfig::PicaFSConfig(const Pica::Regs& regs, bool has_fragment_shader_inte ? regs.framebuffer.output_merger.alpha_test.func.Value() : Pica::FramebufferRegs::CompareFunc::Always); + state.vr_use_immersive_mode.Assign(Settings::values.vr_use_immersive_mode.GetValue()); + state.texture0_type.Assign(regs.texturing.texture0.type); state.texture2_use_coord1.Assign(regs.texturing.main_config.texture2_use_coord1 != 0); @@ -268,6 +270,8 @@ void PicaVSConfigState::Init(const Pica::Regs& regs, Pica::Shader::ShaderSetup& if (!use_geometry_shader_) { gs_state.Init(regs, use_clip_planes_); } + + vr_use_immersive_mode = Settings::values.vr_use_immersive_mode.GetValue(); } PicaVSConfig::PicaVSConfig(const Pica::Regs& regs, Pica::Shader::ShaderSetup& setup, diff --git a/src/video_core/shader/generator/shader_gen.h b/src/video_core/shader/generator/shader_gen.h index 8ac1c4c0b..0bc416195 100644 --- a/src/video_core/shader/generator/shader_gen.h +++ b/src/video_core/shader/generator/shader_gen.h @@ -60,6 +60,7 @@ struct PicaFSConfigState { BitField<28, 1, u32> shadow_texture_orthographic; BitField<29, 1, u32> use_fragment_shader_interlock; BitField<30, 1, u32> use_custom_normal_map; + BitField<31, 1, u32> vr_use_immersive_mode; }; union { @@ -216,6 +217,8 @@ struct PicaVSConfigState { PicaGSConfigState gs_state; + bool vr_use_immersive_mode; + }; /** diff --git a/src/video_core/shader/generator/shader_uniforms.h b/src/video_core/shader/generator/shader_uniforms.h index 2ddd8fd32..b37083687 100644 --- a/src/video_core/shader/generator/shader_uniforms.h +++ b/src/video_core/shader/generator/shader_uniforms.h @@ -89,7 +89,6 @@ struct PicaUniformsData { }; struct VSUniformData { - bool vr_use_immersive_mode; bool enable_clip1; alignas(16) Common::Vec4f clip_coef; };