From 69bde2b13b90babdfcc54b7207d8be0d76da5fb7 Mon Sep 17 00:00:00 2001 From: emufan Date: Sun, 19 Jun 2022 00:09:02 +0300 Subject: [PATCH] renderer_vulkan: Fix culling related issues --- .../renderer_vulkan/vk_rasterizer.cpp | 7 ++++--- .../renderer_vulkan/vk_shader_gen.cpp | 17 +++++------------ src/video_core/renderer_vulkan/vk_state.cpp | 6 +++--- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 64e7bec51..80ab1d5a3 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -293,7 +293,8 @@ bool RasterizerVulkan::Draw(bool accelerate, bool is_indexed) { // Sync the viewport vk::Viewport viewport{0, 0, static_cast(viewport_rect_unscaled.GetWidth() * res_scale), - static_cast(viewport_rect_unscaled.GetHeight() * res_scale)}; + static_cast(viewport_rect_unscaled.GetHeight() * res_scale), + 0.f, 1.f}; state.SetViewport(viewport); if (uniform_block_data.data.framebuffer_scale != res_scale) { @@ -1146,12 +1147,12 @@ void RasterizerVulkan::SyncCullMode() { break; case Pica::RasterizerRegs::CullMode::KeepClockWise: - state.SetCullMode(vk::CullModeFlagBits::eBack); + state.SetCullMode(vk::CullModeFlagBits::eFront); state.SetFrontFace(vk::FrontFace::eClockwise); break; case Pica::RasterizerRegs::CullMode::KeepCounterClockWise: - state.SetCullMode(vk::CullModeFlagBits::eBack); + state.SetCullMode(vk::CullModeFlagBits::eFront); state.SetFrontFace(vk::FrontFace::eCounterClockwise); break; diff --git a/src/video_core/renderer_vulkan/vk_shader_gen.cpp b/src/video_core/renderer_vulkan/vk_shader_gen.cpp index 5d5c75f3a..c92851b70 100644 --- a/src/video_core/renderer_vulkan/vk_shader_gen.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_gen.cpp @@ -1275,8 +1275,6 @@ std::string GenerateFragmentShader(const PicaFSConfig& config) { out += R"( #version 450 - #extension GL_ARB_shader_image_load_store : enable - #extension GL_ARB_shader_image_size : enable #define ALLOW_SHADOW 0 )"; out += "#extension GL_ARB_separate_shader_objects : enable\n"; @@ -1284,9 +1282,7 @@ std::string GenerateFragmentShader(const PicaFSConfig& config) { out += GetVertexInterfaceDeclaration(false, true); out += R"( - #ifndef CITRA_GLES in vec4 gl_FragCoord; - #endif // CITRA_GLES layout (location = 0) out vec4 color; @@ -1539,7 +1535,6 @@ vec4 secondary_fragment_color = vec4(0.0); // do our own transformation according to PICA specification. out += "float z_over_w = 2.0 * gl_FragCoord.z - 1.0;\n" "float depth = z_over_w * depth_scale + depth_offset;\n"; - //out += "if (gl_FragCoord.z == 0) { color = vec4(1.0, 0.0, 0.0, 1.0); return; }\n"; if (state.depthmap_enable == RasterizerRegs::DepthBuffering::WBuffering) { out += "depth /= gl_FragCoord.w;\n"; } @@ -1657,13 +1652,11 @@ void main() { normquat = vert_normquat; view = vert_view; - // Convert OpenGL [-1, 1] to Vulkan [0, 1] - vec4 position = vert_position; - position.z = (position.z + 1) * 0.5; - - gl_Position = position; - gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0 - gl_ClipDistance[1] = dot(clip_coef, vert_position); + gl_Position = vert_position; + gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0; + //gl_Position.y = -gl_Position.y; + //gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0 + //gl_ClipDistance[1] = dot(clip_coef, vert_position); } )"; diff --git a/src/video_core/renderer_vulkan/vk_state.cpp b/src/video_core/renderer_vulkan/vk_state.cpp index 2acd8c1ad..ac4edeccf 100644 --- a/src/video_core/renderer_vulkan/vk_state.cpp +++ b/src/video_core/renderer_vulkan/vk_state.cpp @@ -95,9 +95,9 @@ VulkanState::VulkanState(const std::shared_ptr& swapchain) : swapch // Create texture sampler auto props = g_vk_instace->GetPhysicalDevice().getProperties(); vk::SamplerCreateInfo sampler_info{ - {}, vk::Filter::eNearest, - vk::Filter::eNearest, - vk::SamplerMipmapMode::eNearest, + {}, vk::Filter::eLinear, + vk::Filter::eLinear, + vk::SamplerMipmapMode::eLinear, vk::SamplerAddressMode::eClampToEdge, vk::SamplerAddressMode::eClampToEdge, vk::SamplerAddressMode::eClampToEdge,