ATOM-15659 Add changing StencilState support to DynamicDrawContext (#1009)

This commit is contained in:
Qing Tao
2021-06-02 14:06:04 -07:00
committed by GitHub
parent 177571af0b
commit 7631cdc11e
2 changed files with 27 additions and 35 deletions
@@ -30,25 +30,7 @@ namespace AZ
constexpr const char* PerContextSrgName = "PerContextSrg";
constexpr const char* PerDrawSrgName = "PerDrawSrg";
};
bool CompareTargetBlendState(const RHI::TargetBlendState& firstState, const RHI::TargetBlendState& secondState)
{
return !(firstState.m_enable != secondState.m_enable
|| firstState.m_blendOp != secondState.m_blendOp
|| firstState.m_blendDest != secondState.m_blendDest
|| firstState.m_blendSource != secondState.m_blendSource
|| firstState.m_blendAlphaDest != secondState.m_blendAlphaDest
|| firstState.m_blendAlphaOp != secondState.m_blendAlphaOp
|| firstState.m_blendAlphaSource != secondState.m_blendAlphaSource);
}
bool CompareDepthState(const RHI::DepthState& firstState, const RHI::DepthState& secondState)
{
return !(firstState.m_enable != secondState.m_enable
|| firstState.m_func != secondState.m_func
|| firstState.m_writeMask != secondState.m_writeMask);
}
void DynamicDrawContext::MultiStates::UpdateHash(const DrawStateOptions& drawStateOptions)
{
if (!m_isDirty)
@@ -70,9 +52,19 @@ namespace AZ
seed = TypeHash64(m_depthState.m_writeMask, seed);
}
if (RHI::CheckBitsAny(drawStateOptions, DrawStateOptions::EnableStencil))
if (RHI::CheckBitsAny(drawStateOptions, DrawStateOptions::StencilState))
{
seed = TypeHash64(m_enableStencil, seed);
seed = TypeHash64(m_stencilState.m_enable, seed);
seed = TypeHash64(m_stencilState.m_readMask, seed);
seed = TypeHash64(m_stencilState.m_writeMask, seed);
seed = TypeHash64(m_stencilState.m_frontFace.m_failOp, seed);
seed = TypeHash64(m_stencilState.m_frontFace.m_depthFailOp, seed);
seed = TypeHash64(m_stencilState.m_frontFace.m_passOp, seed);
seed = TypeHash64(m_stencilState.m_frontFace.m_func, seed);
seed = TypeHash64(m_stencilState.m_backFace.m_failOp, seed);
seed = TypeHash64(m_stencilState.m_backFace.m_depthFailOp, seed);
seed = TypeHash64(m_stencilState.m_backFace.m_passOp, seed);
seed = TypeHash64(m_stencilState.m_backFace.m_func, seed);
}
if (RHI::CheckBitsAny(drawStateOptions, DrawStateOptions::FaceCullMode))
@@ -203,7 +195,7 @@ namespace AZ
m_currentStates.m_cullMode = m_pipelineState->ConstDescriptor().m_renderStates.m_rasterState.m_cullMode;
m_currentStates.m_topology = m_pipelineState->ConstDescriptor().m_inputStreamLayout.GetTopology();
m_currentStates.m_depthState = m_pipelineState->ConstDescriptor().m_renderStates.m_depthStencilState.m_depth;
m_currentStates.m_enableStencil = m_pipelineState->ConstDescriptor().m_renderStates.m_depthStencilState.m_stencil.m_enable;
m_currentStates.m_stencilState = m_pipelineState->ConstDescriptor().m_renderStates.m_depthStencilState.m_stencil;
m_currentStates.m_blendState0 = m_pipelineState->ConstDescriptor().m_renderStates.m_blendState.m_targets[0];
m_currentStates.UpdateHash(m_drawStateOptions);
@@ -291,7 +283,7 @@ namespace AZ
{
if (RHI::CheckBitsAny(m_drawStateOptions, DrawStateOptions::DepthState))
{
if (!CompareDepthState(m_currentStates.m_depthState, depthState))
if (!(m_currentStates.m_depthState == depthState))
{
m_currentStates.m_depthState = depthState;
m_currentStates.m_isDirty = true;
@@ -303,19 +295,19 @@ namespace AZ
}
}
void DynamicDrawContext::SetEnableStencil(bool enable)
void DynamicDrawContext::SetStencilState(RHI::StencilState stencilState)
{
if (RHI::CheckBitsAny(m_drawStateOptions, DrawStateOptions::EnableStencil))
if (RHI::CheckBitsAny(m_drawStateOptions, DrawStateOptions::StencilState))
{
if (m_currentStates.m_enableStencil != enable)
if (!(m_currentStates.m_stencilState == stencilState))
{
m_currentStates.m_enableStencil = enable;
m_currentStates.m_stencilState = stencilState;
m_currentStates.m_isDirty = true;
}
}
else
{
AZ_Warning("RHI", false, "Can't set SetEnableStencil if DrawVariation::EnableStencil wasn't enabled");
AZ_Warning("RHI", false, "Can't set SetStencilState if DrawVariation::StencilState wasn't enabled");
}
}
@@ -340,7 +332,7 @@ namespace AZ
{
if (RHI::CheckBitsAny(m_drawStateOptions, DrawStateOptions::BlendMode))
{
if (!CompareTargetBlendState(m_currentStates.m_blendState0, blendState))
if (!(m_currentStates.m_blendState0 == blendState))
{
m_currentStates.m_blendState0 = blendState;
m_currentStates.m_isDirty = true;
@@ -695,9 +687,9 @@ namespace AZ
{
m_pipelineState->RenderStatesOverlay().m_depthStencilState.m_depth = m_currentStates.m_depthState;
}
if (RHI::CheckBitsAny(m_drawStateOptions, DrawStateOptions::EnableStencil))
if (RHI::CheckBitsAny(m_drawStateOptions, DrawStateOptions::StencilState))
{
m_pipelineState->RenderStatesOverlay().m_depthStencilState.m_stencil.m_enable = m_currentStates.m_enableStencil;
m_pipelineState->RenderStatesOverlay().m_depthStencilState.m_stencil = m_currentStates.m_stencilState;
}
if (RHI::CheckBitsAny(m_drawStateOptions, DrawStateOptions::FaceCullMode))
{