Vulkan Rasterizer: Correct DepthBias/PolygonOffset on Vulkan.

This commit is contained in:
Fernando Sahmkow 2021-09-23 03:14:10 +02:00
parent 7b22d61fb1
commit 60a3980561
6 changed files with 29 additions and 3 deletions

View file

@ -38,6 +38,9 @@ enum : u8 {
Shaders, Shaders,
// Special entries
DepthBiasGlobal,
LastCommonEntry, LastCommonEntry,
}; };

View file

@ -627,9 +627,19 @@ void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs) {
if (!state_tracker.TouchDepthBias()) { if (!state_tracker.TouchDepthBias()) {
return; return;
} }
scheduler.Record([constant = regs.polygon_offset_units, clamp = regs.polygon_offset_clamp, float units = regs.polygon_offset_units / 2.0f;
const bool is_d24 = regs.zeta.format == Tegra::DepthFormat::S8_UINT_Z24_UNORM ||
regs.zeta.format == Tegra::DepthFormat::D24X8_UNORM ||
regs.zeta.format == Tegra::DepthFormat::D24S8_UNORM ||
regs.zeta.format == Tegra::DepthFormat::D24C8_UNORM;
if (is_d24 && !device.SupportsD24DepthBuffer()) {
const double f = static_cast<double>(1ULL << (32 - 24)) / (static_cast<double>(0x1.ep+127));
units = static_cast<float>(static_cast<double>(units) * f);
}
scheduler.Record([constant = units, clamp = regs.polygon_offset_clamp,
factor = regs.polygon_offset_factor](vk::CommandBuffer cmdbuf) { factor = regs.polygon_offset_factor](vk::CommandBuffer cmdbuf) {
cmdbuf.SetDepthBias(constant, clamp, factor / 2.0f); cmdbuf.SetDepthBias(constant, clamp, factor);
}); });
} }

View file

@ -79,7 +79,8 @@ public:
} }
bool TouchDepthBias() { bool TouchDepthBias() {
return Exchange(Dirty::DepthBias, false); return Exchange(Dirty::DepthBias, false) ||
Exchange(VideoCommon::Dirty::DepthBiasGlobal, false);
} }
bool TouchBlendConstants() { bool TouchBlendConstants() {

View file

@ -216,6 +216,7 @@ void TextureCache<P>::UpdateRenderTargets(bool is_clear) {
BindRenderTarget(&render_targets.depth_buffer_id, FindDepthBuffer(is_clear)); BindRenderTarget(&render_targets.depth_buffer_id, FindDepthBuffer(is_clear));
} }
const ImageViewId depth_buffer_id = render_targets.depth_buffer_id; const ImageViewId depth_buffer_id = render_targets.depth_buffer_id;
PrepareImageView(depth_buffer_id, true, is_clear && IsFullClear(depth_buffer_id)); PrepareImageView(depth_buffer_id, true, is_clear && IsFullClear(depth_buffer_id));
for (size_t index = 0; index < NUM_RT; ++index) { for (size_t index = 0; index < NUM_RT; ++index) {
@ -225,6 +226,8 @@ void TextureCache<P>::UpdateRenderTargets(bool is_clear) {
maxwell3d.regs.render_area.width, maxwell3d.regs.render_area.width,
maxwell3d.regs.render_area.height, maxwell3d.regs.render_area.height,
}; };
flags[Dirty::DepthBiasGlobal] = true;
} }
template <class P> template <class P>

View file

@ -618,6 +618,10 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
is_float16_supported = false; is_float16_supported = false;
} }
supports_d24_depth =
IsFormatSupported(VK_FORMAT_D24_UNORM_S8_UINT,
VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT, FormatType::Optimal);
graphics_queue = logical.GetQueue(graphics_family); graphics_queue = logical.GetQueue(graphics_family);
present_queue = logical.GetQueue(present_family); present_queue = logical.GetQueue(present_family);
} }

View file

@ -327,6 +327,10 @@ public:
return sets_per_pool; return sets_per_pool;
} }
bool SupportsD24DepthBuffer() const {
return supports_d24_depth;
}
private: private:
/// Checks if the physical device is suitable. /// Checks if the physical device is suitable.
void CheckSuitability(bool requires_swapchain) const; void CheckSuitability(bool requires_swapchain) const;
@ -419,6 +423,7 @@ private:
bool nv_device_diagnostics_config{}; ///< Support for VK_NV_device_diagnostics_config. bool nv_device_diagnostics_config{}; ///< Support for VK_NV_device_diagnostics_config.
bool has_renderdoc{}; ///< Has RenderDoc attached bool has_renderdoc{}; ///< Has RenderDoc attached
bool has_nsight_graphics{}; ///< Has Nsight Graphics attached bool has_nsight_graphics{}; ///< Has Nsight Graphics attached
bool supports_d24_depth{}; ///< Supports D24 depth buffers.
// Telemetry parameters // Telemetry parameters
std::string vendor_name; ///< Device's driver name. std::string vendor_name; ///< Device's driver name.