mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-01-31 14:52:11 +01:00
[dxvk] Add conservative rasterization mode to rasterizer state
This commit is contained in:
parent
a77c80f08a
commit
e3b92bcfac
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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([
|
||||
|
@ -103,6 +103,7 @@ namespace dxvk {
|
||||
VkFrontFace frontFace;
|
||||
VkBool32 depthClipEnable;
|
||||
VkBool32 depthBiasEnable;
|
||||
VkConservativeRasterizationModeEXT conservativeMode;
|
||||
VkSampleCountFlags sampleCount;
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user