1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-02 19:24:12 +01:00

[dxvk] Introduce extra pipeline state

Provides extra state that will be passed in via spec constants.
Whether or not this state is used is determined by the shaders.
This commit is contained in:
Philip Rebohle 2019-03-31 22:34:03 +02:00
parent 18d2905bf7
commit 70510bab9a
8 changed files with 39 additions and 3 deletions

View File

@ -180,4 +180,16 @@ namespace dxvk {
std::array<DxvkVertexBinding, DxvkLimits::MaxNumVertexBindings> bindings;
};
/**
* \brief Extra state
*
* Additional state that will be passed to
* the graphics pipeline as specialization
* constants.
*/
struct DxvkExtraState {
VkCompareOp alphaCompareOp;
};
}

View File

@ -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) {

View File

@ -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
*

View File

@ -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;

View File

@ -92,7 +92,8 @@ namespace dxvk {
VkSampleCountFlags msSampleCount;
uint32_t msSampleMask;
VkBool32 msEnableAlphaToCoverage;
VkBool32 msEnableAlphaToOne;
VkCompareOp xsAlphaCompareOp;
VkBool32 dsEnableDepthTest;
VkBool32 dsEnableDepthWrite;

View File

@ -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,
};

View File

@ -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);

View File

@ -18,6 +18,8 @@ namespace dxvk {
*/
struct DxvkSpecConstantData {
uint32_t rasterizerSampleCount;
VkBool32 alphaTestEnable;
VkCompareOp alphaCompareOp;
uint32_t outputMappings[MaxNumRenderTargets * 4];
VkBool32 activeBindings[MaxNumActiveBindings];
};