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

[dxvk] Use packed depth-stencil state

This commit is contained in:
Philip Rebohle 2019-10-07 12:54:22 +02:00
parent a933bec72c
commit 079b480602
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 130 additions and 25 deletions

View File

@ -2223,8 +2223,8 @@ namespace dxvk {
m_flags.set(DxvkContextFlag::GpDirtyDepthBounds);
}
if (m_state.gp.state.dsEnableDepthBoundsTest != depthBounds.enableDepthBounds) {
m_state.gp.state.dsEnableDepthBoundsTest = depthBounds.enableDepthBounds;
if (m_state.gp.state.ds.enableDepthBoundsTest() != depthBounds.enableDepthBounds) {
m_state.gp.state.ds.setEnableDepthBoundsTest(depthBounds.enableDepthBounds);
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
}
}
@ -2305,12 +2305,15 @@ namespace dxvk {
void DxvkContext::setDepthStencilState(const DxvkDepthStencilState& ds) {
m_state.gp.state.dsEnableDepthTest = ds.enableDepthTest;
m_state.gp.state.dsEnableDepthWrite = ds.enableDepthWrite;
m_state.gp.state.dsEnableStencilTest = ds.enableStencilTest;
m_state.gp.state.dsDepthCompareOp = ds.depthCompareOp;
m_state.gp.state.dsStencilOpFront = ds.stencilOpFront;
m_state.gp.state.dsStencilOpBack = ds.stencilOpBack;
m_state.gp.state.ds = DxvkDsInfo(
ds.enableDepthTest,
ds.enableDepthWrite,
m_state.gp.state.ds.enableDepthBoundsTest(),
ds.enableStencilTest,
ds.depthCompareOp);
m_state.gp.state.dsFront = DxvkDsStencilOp(ds.stencilOpFront);
m_state.gp.state.dsBack = DxvkDsStencilOp(ds.stencilOpBack);
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
}

View File

@ -358,13 +358,13 @@ namespace dxvk {
dsInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
dsInfo.pNext = nullptr;
dsInfo.flags = 0;
dsInfo.depthTestEnable = state.dsEnableDepthTest;
dsInfo.depthWriteEnable = state.dsEnableDepthWrite && !util::isDepthReadOnlyLayout(passFormat.depth.layout);
dsInfo.depthCompareOp = state.dsDepthCompareOp;
dsInfo.depthBoundsTestEnable = state.dsEnableDepthBoundsTest;
dsInfo.stencilTestEnable = state.dsEnableStencilTest;
dsInfo.front = state.dsStencilOpFront;
dsInfo.back = state.dsStencilOpBack;
dsInfo.depthTestEnable = state.ds.enableDepthTest();
dsInfo.depthWriteEnable = state.ds.enableDepthWrite() && !util::isDepthReadOnlyLayout(passFormat.depth.layout);
dsInfo.depthCompareOp = state.ds.depthCompareOp();
dsInfo.depthBoundsTestEnable = state.ds.enableDepthBoundsTest();
dsInfo.stencilTestEnable = state.ds.enableStencilTest();
dsInfo.front = state.dsFront.state();
dsInfo.back = state.dsBack.state();
dsInfo.minDepthBounds = 0.0f;
dsInfo.maxDepthBounds = 1.0f;

View File

@ -329,6 +329,113 @@ namespace dxvk {
};
/**
* \brief Packed depth-stencil metadata
*
* Stores some flags and the depth-compare op in
* two bytes. Stencil ops are stored separately.
*/
class DxvkDsInfo {
public:
DxvkDsInfo() = default;
DxvkDsInfo(
VkBool32 enableDepthTest,
VkBool32 enableDepthWrite,
VkBool32 enableDepthBoundsTest,
VkBool32 enableStencilTest,
VkCompareOp depthCompareOp)
: m_enableDepthTest (uint16_t(enableDepthTest)),
m_enableDepthWrite (uint16_t(enableDepthWrite)),
m_enableDepthBoundsTest (uint16_t(enableDepthBoundsTest)),
m_enableStencilTest (uint16_t(enableStencilTest)),
m_depthCompareOp (uint16_t(depthCompareOp)),
m_reserved (0) { }
VkBool32 enableDepthTest() const {
return VkBool32(m_enableDepthTest);
}
VkBool32 enableDepthWrite() const {
return VkBool32(m_enableDepthWrite);
}
VkBool32 enableDepthBoundsTest() const {
return VkBool32(m_enableDepthBoundsTest);
}
VkBool32 enableStencilTest() const {
return VkBool32(m_enableStencilTest);
}
VkCompareOp depthCompareOp() const {
return VkCompareOp(m_depthCompareOp);
}
void setEnableDepthBoundsTest(VkBool32 enableDepthBoundsTest) {
m_enableDepthBoundsTest = VkBool32(enableDepthBoundsTest);
}
private:
uint16_t m_enableDepthTest : 1;
uint16_t m_enableDepthWrite : 1;
uint16_t m_enableDepthBoundsTest : 1;
uint16_t m_enableStencilTest : 1;
uint16_t m_depthCompareOp : 3;
uint16_t m_reserved : 9;
};
/**
* \brief Packed stencil op
*
* Stores various stencil op parameters
* for one single face in four bytes.
*/
class DxvkDsStencilOp {
public:
DxvkDsStencilOp() = default;
DxvkDsStencilOp(VkStencilOpState state)
: m_failOp (uint32_t(state.failOp)),
m_passOp (uint32_t(state.passOp)),
m_depthFailOp (uint32_t(state.depthFailOp)),
m_compareOp (uint32_t(state.compareOp)),
m_reserved (0),
m_compareMask (uint32_t(state.compareMask)),
m_writeMask (uint32_t(state.writeMask)) { }
VkStencilOpState state() const {
VkStencilOpState result;
result.failOp = VkStencilOp(m_failOp);
result.passOp = VkStencilOp(m_passOp);
result.depthFailOp = VkStencilOp(m_depthFailOp);
result.compareOp = VkCompareOp(m_compareOp);
result.compareMask = m_compareMask;
result.writeMask = m_writeMask;
result.reference = 0;
return result;
}
private:
uint32_t m_failOp : 3;
uint32_t m_passOp : 3;
uint32_t m_depthFailOp : 3;
uint32_t m_compareOp : 3;
uint32_t m_reserved : 4;
uint32_t m_compareMask : 8;
uint32_t m_writeMask : 8;
};
/**
* \brief Packed graphics pipeline state
*
@ -359,7 +466,7 @@ namespace dxvk {
}
bool useDynamicStencilRef() const {
return dsEnableStencilTest;
return ds.enableStencilTest();
}
bool useDynamicDepthBias() const {
@ -367,7 +474,7 @@ namespace dxvk {
}
bool useDynamicDepthBounds() const {
return dsEnableDepthBoundsTest;
return ds.enableDepthBoundsTest();
}
bool useDynamicBlendConstants() const {
@ -389,14 +496,7 @@ namespace dxvk {
DxvkIlInfo il;
DxvkRsInfo rs;
DxvkMsInfo ms;
VkBool32 dsEnableDepthTest;
VkBool32 dsEnableDepthWrite;
VkBool32 dsEnableDepthBoundsTest;
VkBool32 dsEnableStencilTest;
VkCompareOp dsDepthCompareOp;
VkStencilOpState dsStencilOpFront;
VkStencilOpState dsStencilOpBack;
DxvkDsInfo ds;
VkBool32 omEnableLogicOp;
VkLogicOp omLogicOp;
@ -405,6 +505,8 @@ namespace dxvk {
uint32_t scSpecConstants[MaxNumSpecConstants];
DxvkDsStencilOp dsFront;
DxvkDsStencilOp dsBack;
DxvkIlAttribute ilAttributes [DxvkLimits::MaxNumVertexAttributes];
DxvkIlBinding ilBindings [DxvkLimits::MaxNumVertexBindings];
};