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
@@ -43,7 +43,7 @@ namespace AZ
{
PrimitiveType = AZ_BIT(0),
DepthState = AZ_BIT(1),
EnableStencil = AZ_BIT(2),
StencilState = AZ_BIT(2),
FaceCullMode = AZ_BIT(3),
BlendMode = AZ_BIT(4)
};
@@ -110,8 +110,8 @@ namespace AZ
//! Set DepthState if DrawStateOptions::DepthState option is enabled
void SetDepthState(RHI::DepthState depthState);
//! Enable/disable stencil if DrawStateOptions::EnableStencil option is enabled
void SetEnableStencil(bool enable);
//! Set StencilState if DrawStateOptions::StencilState option is enabled
void SetStencilState(RHI::StencilState stencilState);
//! Set CullMode if DrawStateOptions::FaceCullMode option is enabled
void SetCullMode(RHI::CullMode cullMode);
//! Set TargetBlendState for target 0 if DrawStateOptions::BlendMode option is enabled
@@ -188,7 +188,7 @@ namespace AZ
// states available for change
RHI::CullMode m_cullMode;
RHI::DepthState m_depthState;
bool m_enableStencil;
RHI::StencilState m_stencilState;
RHI::PrimitiveTopology m_topology;
RHI::TargetBlendState m_blendState0;
@@ -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))
{