diff --git a/src/dxvk/dxvk_constant_state.h b/src/dxvk/dxvk_constant_state.h index 4466cbdf4..715864f7d 100644 --- a/src/dxvk/dxvk_constant_state.h +++ b/src/dxvk/dxvk_constant_state.h @@ -180,4 +180,16 @@ namespace dxvk { std::array bindings; }; + + /** + * \brief Extra state + * + * Additional state that will be passed to + * the graphics pipeline as specialization + * constants. + */ + struct DxvkExtraState { + VkCompareOp alphaCompareOp; + }; + } \ No newline at end of file diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index d9e7cce71..84f406739 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -2031,6 +2031,14 @@ namespace dxvk { } + void DxvkContext::setExtraState( + const DxvkExtraState& xs) { + m_state.gp.state.xsAlphaCompareOp = xs.alphaCompareOp; + + m_flags.set(DxvkContextFlag::GpDirtyPipelineState); + } + + void DxvkContext::setPredicate( const DxvkBufferSlice& predicate, VkConditionalRenderingFlagsEXT flags) { diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index c374e9f2f..7ae2168ac 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -813,6 +813,13 @@ namespace dxvk { uint32_t attachment, const DxvkBlendMode& blendMode); + /** + * \brief Sets extra pipeline state + * \param [in] xs New state object + */ + void setExtraState( + const DxvkExtraState& xs); + /** * \brief Sets predicate * diff --git a/src/dxvk/dxvk_graphics.cpp b/src/dxvk/dxvk_graphics.cpp index 7b5891a75..0dca58fc8 100644 --- a/src/dxvk/dxvk_graphics.cpp +++ b/src/dxvk/dxvk_graphics.cpp @@ -204,6 +204,8 @@ namespace dxvk { // Set up some specialization constants DxvkSpecConstantData specData; specData.rasterizerSampleCount = uint32_t(sampleCount); + specData.alphaTestEnable = state.xsAlphaCompareOp != VK_COMPARE_OP_ALWAYS; + specData.alphaCompareOp = state.xsAlphaCompareOp; for (uint32_t i = 0; i < MaxNumActiveBindings; i++) specData.activeBindings[i] = state.bsBindingMask.isBound(i) ? VK_TRUE : VK_FALSE; @@ -353,7 +355,7 @@ namespace dxvk { msInfo.minSampleShading = m_common.msSampleShadingFactor; msInfo.pSampleMask = &state.msSampleMask; msInfo.alphaToCoverageEnable = state.msEnableAlphaToCoverage; - msInfo.alphaToOneEnable = state.msEnableAlphaToOne; + msInfo.alphaToOneEnable = VK_FALSE; VkPipelineDepthStencilStateCreateInfo dsInfo; dsInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; diff --git a/src/dxvk/dxvk_graphics.h b/src/dxvk/dxvk_graphics.h index f30683b56..628aa77c2 100644 --- a/src/dxvk/dxvk_graphics.h +++ b/src/dxvk/dxvk_graphics.h @@ -92,7 +92,8 @@ namespace dxvk { VkSampleCountFlags msSampleCount; uint32_t msSampleMask; VkBool32 msEnableAlphaToCoverage; - VkBool32 msEnableAlphaToOne; + + VkCompareOp xsAlphaCompareOp; VkBool32 dsEnableDepthTest; VkBool32 dsEnableDepthWrite; diff --git a/src/dxvk/dxvk_shader.h b/src/dxvk/dxvk_shader.h index de9bb6557..6ea46e76e 100644 --- a/src/dxvk/dxvk_shader.h +++ b/src/dxvk/dxvk_shader.h @@ -30,10 +30,12 @@ namespace dxvk { // Specialization constants for pipeline state SpecConstantRangeStart = ColorComponentMappings + MaxNumRenderTargets * 4, RasterizerSampleCount = SpecConstantRangeStart + 0, + AlphaTestEnable, + AlphaCompareOp, /// Lowest and highest known spec constant IDs SpecConstantIdMin = RasterizerSampleCount, - SpecConstantIdMax = RasterizerSampleCount, + SpecConstantIdMax = AlphaCompareOp, }; diff --git a/src/dxvk/dxvk_spec_const.cpp b/src/dxvk/dxvk_spec_const.cpp index e1c69e2a2..8af30a692 100644 --- a/src/dxvk/dxvk_spec_const.cpp +++ b/src/dxvk/dxvk_spec_const.cpp @@ -11,6 +11,8 @@ namespace dxvk { DxvkSpecConstantMap::DxvkSpecConstantMap() { SET_CONSTANT_ENTRY(DxvkSpecConstantId::RasterizerSampleCount, rasterizerSampleCount); + SET_CONSTANT_ENTRY(DxvkSpecConstantId::AlphaTestEnable, alphaTestEnable); + SET_CONSTANT_ENTRY(DxvkSpecConstantId::AlphaCompareOp, alphaCompareOp); for (uint32_t i = 0; i < MaxNumActiveBindings; i++) this->setBindingEntry(i); diff --git a/src/dxvk/dxvk_spec_const.h b/src/dxvk/dxvk_spec_const.h index e851e8911..016264ace 100644 --- a/src/dxvk/dxvk_spec_const.h +++ b/src/dxvk/dxvk_spec_const.h @@ -18,6 +18,8 @@ namespace dxvk { */ struct DxvkSpecConstantData { uint32_t rasterizerSampleCount; + VkBool32 alphaTestEnable; + VkCompareOp alphaCompareOp; uint32_t outputMappings[MaxNumRenderTargets * 4]; VkBool32 activeBindings[MaxNumActiveBindings]; };