ATOM-15659 Add changing StencilState support to DynamicDrawContext (#1009)
This commit is contained in:
@@ -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))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user