Optimize code in draw calls batching for shadow

This commit is contained in:
Wojtek Figat
2026-03-27 17:59:25 +01:00
parent 1bef4d00ad
commit bb2ee7260f

View File

@@ -38,6 +38,13 @@ namespace
static ExtensionsList list;
return list;
}
FORCE_INLINE bool IsSimpleMaterial(const MaterialInfo& info)
{
return EnumHasNoneFlags(info.UsageFlags, MaterialUsageFlags::UseMask | MaterialUsageFlags::UsePositionOffset | MaterialUsageFlags::UseDisplacement) &&
EnumHasNoneFlags(info.FeaturesFlags, MaterialFeaturesFlags::Wireframe) &&
info.BlendMode == MaterialBlendMode::Opaque;
}
}
void ShaderObjectData::Store(const Matrix& worldMatrix, const Matrix& prevWorldMatrix, const Rectangle& lightmapUVsArea, const Float3& geometrySize, float perInstanceRandom, float worldDeterminantSign, float lodDitherFactor)
@@ -1177,13 +1184,7 @@ bool SurfaceDrawCallHandler::CanBatch(const DrawCall& a, const DrawCall& b, Draw
// Batch simple materials during depth-only drawing (when using default vertex shader and no pixel shader)
if (pass == DrawPass::Depth)
{
// TODO: cache those inside material
const MaterialInfo& aInfo = a.Material->GetInfo();
const MaterialInfo& bInfo = b.Material->GetInfo();
constexpr MaterialUsageFlags complexUsageFlags = MaterialUsageFlags::UseMask | MaterialUsageFlags::UsePositionOffset | MaterialUsageFlags::UseDisplacement;
const bool aIsSimple = EnumHasNoneFlags(aInfo.UsageFlags, complexUsageFlags) && aInfo.BlendMode == MaterialBlendMode::Opaque && EnumHasNoneFlags(aInfo.FeaturesFlags, MaterialFeaturesFlags::Wireframe);
const bool bIsSimple = EnumHasNoneFlags(bInfo.UsageFlags, complexUsageFlags) && bInfo.BlendMode == MaterialBlendMode::Opaque && EnumHasNoneFlags(bInfo.FeaturesFlags, MaterialFeaturesFlags::Wireframe);
return aIsSimple && bIsSimple;
return IsSimpleMaterial(a.Material->GetInfo()) && IsSimpleMaterial(b.Material->GetInfo());
}
return false;
}