From e3b92bcfacd4cbc2949f2c16a1fffb6ac2e592c1 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 13 Mar 2021 19:45:00 +0100 Subject: [PATCH] [dxvk] Add conservative rasterization mode to rasterizer state --- src/d3d11/d3d11_context.cpp | 1 + src/d3d11/d3d11_rasterizer.cpp | 1 + src/d3d9/d3d9_device.cpp | 1 + src/dxvk/dxvk_constant_state.h | 1 + src/dxvk/dxvk_context.cpp | 3 ++- src/dxvk/dxvk_graphics.cpp | 24 +++++++++++++++++------- src/dxvk/dxvk_graphics_state.h | 11 +++++++++-- src/dxvk/dxvk_state_cache.cpp | 3 ++- src/dxvk/dxvk_swapchain_blitter.cpp | 1 + src/dxvk/hud/dxvk_hud.cpp | 1 + 10 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 728c599d5..284b63604 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -4264,6 +4264,7 @@ namespace dxvk { pRsState->frontFace = VK_FRONT_FACE_CLOCKWISE; pRsState->depthClipEnable = VK_TRUE; pRsState->depthBiasEnable = VK_FALSE; + pRsState->conservativeMode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT; pRsState->sampleCount = 0; } diff --git a/src/d3d11/d3d11_rasterizer.cpp b/src/d3d11/d3d11_rasterizer.cpp index 54e56ebf6..03f398f42 100644 --- a/src/d3d11/d3d11_rasterizer.cpp +++ b/src/d3d11/d3d11_rasterizer.cpp @@ -35,6 +35,7 @@ namespace dxvk { // we do not need to enable it in case the parameters are both 0. m_state.depthBiasEnable = desc.DepthBias != 0 || desc.SlopeScaledDepthBias != 0.0f; m_state.depthClipEnable = desc.DepthClipEnable; + m_state.conservativeMode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT; m_state.sampleCount = VkSampleCountFlags(desc.ForcedSampleCount); m_depthBias.depthBiasConstant = float(desc.DepthBias); diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp index c04a16a80..e37e852a2 100644 --- a/src/d3d9/d3d9_device.cpp +++ b/src/d3d9/d3d9_device.cpp @@ -5486,6 +5486,7 @@ namespace dxvk { state.depthClipEnable = true; state.frontFace = VK_FRONT_FACE_CLOCKWISE; state.polygonMode = DecodeFillMode(D3DFILLMODE(rs[D3DRS_FILLMODE])); + state.conservativeMode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT; state.sampleCount = 0; EmitCs([ diff --git a/src/dxvk/dxvk_constant_state.h b/src/dxvk/dxvk_constant_state.h index fa17ea63e..b17dd9b52 100644 --- a/src/dxvk/dxvk_constant_state.h +++ b/src/dxvk/dxvk_constant_state.h @@ -103,6 +103,7 @@ namespace dxvk { VkFrontFace frontFace; VkBool32 depthClipEnable; VkBool32 depthBiasEnable; + VkConservativeRasterizationModeEXT conservativeMode; VkSampleCountFlags sampleCount; }; diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index b14c98773..4a1f03eac 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -2358,7 +2358,8 @@ namespace dxvk { rs.cullMode, rs.frontFace, m_state.gp.state.rs.viewportCount(), - rs.sampleCount); + rs.sampleCount, + rs.conservativeMode); m_flags.set(DxvkContextFlag::GpDirtyPipelineState); } diff --git a/src/dxvk/dxvk_graphics.cpp b/src/dxvk/dxvk_graphics.cpp index 820166076..96bdb050d 100644 --- a/src/dxvk/dxvk_graphics.cpp +++ b/src/dxvk/dxvk_graphics.cpp @@ -288,6 +288,13 @@ namespace dxvk { vpInfo.scissorCount = state.rs.viewportCount(); vpInfo.pScissors = nullptr; + VkPipelineRasterizationConservativeStateCreateInfoEXT conservativeInfo; + conservativeInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT; + conservativeInfo.pNext = nullptr; + conservativeInfo.flags = 0; + conservativeInfo.conservativeRasterizationMode = state.rs.conservativeMode(); + conservativeInfo.extraPrimitiveOverestimationSize = 0.0f; + VkPipelineRasterizationStateStreamCreateInfoEXT xfbStreamInfo; xfbStreamInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT; xfbStreamInfo.pNext = nullptr; @@ -302,7 +309,7 @@ namespace dxvk { VkPipelineRasterizationStateCreateInfo rsInfo; rsInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; - rsInfo.pNext = &rsDepthClipInfo; + rsInfo.pNext = nullptr; rsInfo.flags = 0; rsInfo.depthClampEnable = VK_TRUE; rsInfo.rasterizerDiscardEnable = rasterizedStream < 0; @@ -316,12 +323,15 @@ namespace dxvk { rsInfo.lineWidth = 1.0f; if (rasterizedStream > 0) - rsDepthClipInfo.pNext = &xfbStreamInfo; - - if (!m_pipeMgr->m_device->features().extDepthClipEnable.depthClipEnable) { - rsInfo.pNext = rsDepthClipInfo.pNext; - rsInfo.depthClampEnable = !state.rs.depthClipEnable(); - } + xfbStreamInfo.pNext = std::exchange(rsInfo.pNext, &xfbStreamInfo); + + if (conservativeInfo.conservativeRasterizationMode != VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT) + conservativeInfo.pNext = std::exchange(rsInfo.pNext, &conservativeInfo); + + if (m_pipeMgr->m_device->features().extDepthClipEnable.depthClipEnable) + rsDepthClipInfo.pNext = std::exchange(rsInfo.pNext, &rsDepthClipInfo); + else + rsInfo.depthClampEnable = !state.rs.depthClipEnable(); uint32_t sampleMask = state.ms.sampleMask(); diff --git a/src/dxvk/dxvk_graphics_state.h b/src/dxvk/dxvk_graphics_state.h index 5357e0ce9..b10f78355 100644 --- a/src/dxvk/dxvk_graphics_state.h +++ b/src/dxvk/dxvk_graphics_state.h @@ -224,7 +224,8 @@ namespace dxvk { VkCullModeFlags cullMode, VkFrontFace frontFace, uint32_t viewportCount, - VkSampleCountFlags sampleCount) + VkSampleCountFlags sampleCount, + VkConservativeRasterizationModeEXT conservativeMode) : m_depthClipEnable (uint32_t(depthClipEnable)), m_depthBiasEnable (uint32_t(depthBiasEnable)), m_polygonMode (uint32_t(polygonMode)), @@ -232,6 +233,7 @@ namespace dxvk { m_frontFace (uint32_t(frontFace)), m_viewportCount (uint32_t(viewportCount)), m_sampleCount (uint32_t(sampleCount)), + m_conservativeMode(uint32_t(conservativeMode)), m_reserved (0) { } VkBool32 depthClipEnable() const { @@ -262,6 +264,10 @@ namespace dxvk { return VkSampleCountFlags(m_sampleCount); } + VkConservativeRasterizationModeEXT conservativeMode() const { + return VkConservativeRasterizationModeEXT(m_conservativeMode); + } + void setViewportCount(uint32_t viewportCount) { m_viewportCount = viewportCount; } @@ -275,7 +281,8 @@ namespace dxvk { uint32_t m_frontFace : 1; uint32_t m_viewportCount : 5; uint32_t m_sampleCount : 5; - uint32_t m_reserved : 15; + uint32_t m_conservativeMode : 2; + uint32_t m_reserved : 13; }; diff --git a/src/dxvk/dxvk_state_cache.cpp b/src/dxvk/dxvk_state_cache.cpp index 8f34c6bd1..280824127 100644 --- a/src/dxvk/dxvk_state_cache.cpp +++ b/src/dxvk/dxvk_state_cache.cpp @@ -863,7 +863,8 @@ namespace dxvk { in.gpState.rsCullMode, in.gpState.rsFrontFace, in.gpState.rsViewportCount, - in.gpState.rsSampleCount); + in.gpState.rsSampleCount, + VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT); out.gpState.ms = DxvkMsInfo( in.gpState.msSampleCount, diff --git a/src/dxvk/dxvk_swapchain_blitter.cpp b/src/dxvk/dxvk_swapchain_blitter.cpp index baab090e2..df1ce05a9 100644 --- a/src/dxvk/dxvk_swapchain_blitter.cpp +++ b/src/dxvk/dxvk_swapchain_blitter.cpp @@ -102,6 +102,7 @@ namespace dxvk { rsState.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; rsState.depthClipEnable = VK_FALSE; rsState.depthBiasEnable = VK_FALSE; + rsState.conservativeMode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT; rsState.sampleCount = VK_SAMPLE_COUNT_1_BIT; ctx->setRasterizerState(rsState); diff --git a/src/dxvk/hud/dxvk_hud.cpp b/src/dxvk/hud/dxvk_hud.cpp index 335711abf..c4c3b5493 100644 --- a/src/dxvk/hud/dxvk_hud.cpp +++ b/src/dxvk/hud/dxvk_hud.cpp @@ -20,6 +20,7 @@ namespace dxvk::hud { m_rsState.frontFace = VK_FRONT_FACE_CLOCKWISE; m_rsState.depthClipEnable = VK_FALSE; m_rsState.depthBiasEnable = VK_FALSE; + m_rsState.conservativeMode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT; m_rsState.sampleCount = VK_SAMPLE_COUNT_1_BIT; m_blendMode.enableBlending = VK_TRUE;