diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 75430c4be3..3123fe0c26 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -944,7 +944,9 @@ void GLGSRender::flip(int buffer) } m_rtts.invalidated_resources.clear(); - m_rtts.invalidate_surface_cache_data(nullptr); + + if (g_cfg.video.invalidate_surface_cache_every_frame) + m_rtts.invalidate_surface_cache_data(nullptr); } diff --git a/rpcs3/Emu/RSX/GL/GLHelpers.h b/rpcs3/Emu/RSX/GL/GLHelpers.h index edf2348e57..2ababf9054 100644 --- a/rpcs3/Emu/RSX/GL/GLHelpers.h +++ b/rpcs3/Emu/RSX/GL/GLHelpers.h @@ -1137,6 +1137,7 @@ namespace gl uint_10_10_10_2 = GL_UNSIGNED_INT_10_10_10_2, uint_2_10_10_10_rev = GL_UNSIGNED_INT_2_10_10_10_REV, uint_24_8 = GL_UNSIGNED_INT_24_8, + float32z_s8int = GL_DEPTH32F_STENCIL8, sbyte = GL_BYTE, sshort = GL_SHORT, @@ -1189,6 +1190,7 @@ namespace gl depth16 = GL_DEPTH_COMPONENT16, depth_stencil = GL_DEPTH_STENCIL, depth24_stencil8 = GL_DEPTH24_STENCIL8, + depth32f_stencil8 = GL_DEPTH32F_STENCIL8, compressed_rgb_s3tc_dxt1 = GL_COMPRESSED_RGB_S3TC_DXT1_EXT, compressed_rgba_s3tc_dxt1 = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp index c8de82bc3d..4c7502c231 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp @@ -57,7 +57,10 @@ depth_format rsx::internals::surface_depth_format_to_gl(rsx::surface_depth_forma default: LOG_ERROR(RSX, "Surface depth buffer: Unsupported surface depth format (0x%x)", (u32)depth_format); case rsx::surface_depth_format::z24s8: - return{ ::gl::texture::type::uint_24_8, ::gl::texture::format::depth_stencil, ::gl::texture::internal_format::depth24_stencil8 }; + if (g_cfg.video.force_high_precision_z_buffer) + return{ ::gl::texture::type::float32z_s8int, ::gl::texture::format::depth_stencil, ::gl::texture::internal_format::depth32f_stencil8 }; + else + return{ ::gl::texture::type::uint_24_8, ::gl::texture::format::depth_stencil, ::gl::texture::internal_format::depth24_stencil8 }; } } diff --git a/rpcs3/Emu/RSX/VK/VKFormats.cpp b/rpcs3/Emu/RSX/VK/VKFormats.cpp index f16e985c0b..ee4cdef8b3 100644 --- a/rpcs3/Emu/RSX/VK/VKFormats.cpp +++ b/rpcs3/Emu/RSX/VK/VKFormats.cpp @@ -21,6 +21,10 @@ gpu_formats_support get_optimal_tiling_supported_formats(VkPhysicalDevice physic && !!(props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) && !!(props.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT); + //Hide d24_s8 if force high precision z buffer is enabled + if (g_cfg.video.force_high_precision_z_buffer && result.d32_sfloat_s8) + result.d24_unorm_s8 = false; + return result; } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index d08752ba26..270b4ffb77 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1273,9 +1273,11 @@ void VKGSRender::process_swap_request() //m_texture_cache.merge_dirty_textures(m_rtts.invalidated_resources); m_rtts.invalidated_resources.clear(); - m_rtts.invalidate_surface_cache_data(&*m_current_command_buffer); m_texture_cache.flush(); + if (g_cfg.video.invalidate_surface_cache_every_frame) + m_rtts.invalidate_surface_cache_data(&*m_current_command_buffer); + m_buffer_view_to_clean.clear(); m_sampler_to_clean.clear(); m_framebuffer_to_clean.clear(); diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 0d53883454..5a2424ca22 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -309,6 +309,8 @@ struct cfg_root : cfg::node cfg::_bool overlay{this, "Debug overlay"}; cfg::_bool gl_legacy_buffers{this, "Use Legacy OpenGL Buffers (Debug)"}; cfg::_bool use_gpu_texture_scaling{this, "Use GPU texture scaling", true}; + cfg::_bool force_high_precision_z_buffer{this, "Force High Precision Z buffer"}; + cfg::_bool invalidate_surface_cache_every_frame{this, "Invalidate Cache Every Frame", true}; struct node_d3d12 : cfg::node { diff --git a/rpcs3/rpcs3qt/emu_settings.h b/rpcs3/rpcs3qt/emu_settings.h index 790b288e82..ccfecf1eb0 100644 --- a/rpcs3/rpcs3qt/emu_settings.h +++ b/rpcs3/rpcs3qt/emu_settings.h @@ -63,6 +63,8 @@ public: GPUTextureScaling, D3D12Adapter, VulkanAdapter, + ForceHighpZ, + AutoInvalidateCache, // Audio AudioRenderer, @@ -150,6 +152,8 @@ private: { DebugOverlay, { "Video", "Debug overlay"}}, { LegacyBuffers, { "Video", "Use Legacy OpenGL Buffers (Debug)"}}, { GPUTextureScaling,{ "Video", "Use GPU texture scaling"}}, + { ForceHighpZ, { "Video", "Force High Precision Z buffer"}}, + { AutoInvalidateCache, {"Video", "Invalidate Cache Every Frame"}}, { D3D12Adapter, { "Video", "D3D12", "Adapter"}}, { VulkanAdapter, { "Video", "Vulkan", "Adapter"}}, diff --git a/rpcs3/rpcs3qt/graphics_tab.cpp b/rpcs3/rpcs3qt/graphics_tab.cpp index fb0483037d..9fb63d9d14 100644 --- a/rpcs3/rpcs3qt/graphics_tab.cpp +++ b/rpcs3/rpcs3qt/graphics_tab.cpp @@ -235,6 +235,8 @@ graphics_tab::graphics_tab(std::shared_ptr xSettings, Render_Creat QCheckBox *logProg = xemu_settings->CreateEnhancedCheckBox(emu_settings::LogShaderPrograms, this); QCheckBox *vsync = xemu_settings->CreateEnhancedCheckBox(emu_settings::VSync, this); QCheckBox *gpuTextureScaling = xemu_settings->CreateEnhancedCheckBox(emu_settings::GPUTextureScaling, this); + QCheckBox *forceHighpZ = xemu_settings->CreateEnhancedCheckBox(emu_settings::ForceHighpZ, this); + QCheckBox *autoInvalidateCache = xemu_settings->CreateEnhancedCheckBox(emu_settings::AutoInvalidateCache, this); // Combobox Part QHBoxLayout *hbox1 = new QHBoxLayout(); @@ -262,12 +264,14 @@ graphics_tab::graphics_tab(std::shared_ptr xSettings, Render_Creat vbox21->addWidget(dumpDepth); vbox21->addWidget(readDepth); vbox21->addWidget(glLegacyBuffers); + vbox21->addWidget(autoInvalidateCache); QVBoxLayout *vbox22 = new QVBoxLayout(); vbox22->addWidget(debugOutput); vbox22->addWidget(debugOverlay); vbox22->addWidget(logProg); vbox22->addWidget(vsync); vbox22->addWidget(gpuTextureScaling); + vbox22->addWidget(forceHighpZ); hbox2->addLayout(vbox21); hbox2->addLayout(vbox22);