MCPcopy Create free account
hub / github.com/DiligentGraphics/DiligentFX / ConvertToFilterable

Method ConvertToFilterable

Components/src/ShadowMapManager.cpp:530–594  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

528}
529
530void ShadowMapManager::ConvertToFilterable(IDeviceContext* pCtx, const ShadowMapAttribs& ShadowAttribs)
531{
532 if (m_ShadowMode == SHADOW_MODE_VSM || m_ShadowMode == SHADOW_MODE_EVSM2 || m_ShadowMode == SHADOW_MODE_EVSM4)
533 {
534 auto& Tech = m_ConversionTech[m_ShadowMode];
535 const auto& ShadowMapDesc = m_pShadowMapSRV->GetTexture()->GetDesc();
536 VERIFY(static_cast<int>(ShadowMapDesc.ArraySize) == ShadowAttribs.iNumCascades, "Inconsistent number of cascades");
537 const auto& FilterableSMDesc = m_pFilterableShadowMapSRV->GetTexture()->GetDesc();
538 VERIFY(ShadowAttribs.bIs32BitEVSM == (FilterableSMDesc.Format == TEX_FORMAT_RGBA32_FLOAT || FilterableSMDesc.Format == TEX_FORMAT_RG32_FLOAT),
539 "Incorrect 32-bit VSM flag");
540 (void)FilterableSMDesc;
541
542 int iFilterRadius = (ShadowAttribs.iFixedFilterSize - 1) / 2;
543 bool bSkipBlur = ShadowAttribs.iFixedFilterSize == 2;
544 for (Uint32 i = 0; i < ShadowMapDesc.ArraySize; ++i)
545 {
546 ITextureView* pRTVs[] = {bSkipBlur ? m_pFilterableShadowMapRTVs[i] : m_pIntermediateRTV};
547 pCtx->SetRenderTargets(1, pRTVs, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
548 {
549 struct ConversionAttribs //
550 {
551 int iCascade;
552 float fHorzFilterRadius;
553 float fVertFilterRadius;
554 float fEVSMPositiveExponent;
555
556 float fEVSMNegativeExponent;
557 int Is32BitEVSM;
558 };
559 MapHelper<ConversionAttribs> pAttribs(pCtx, m_pConversionAttribsBuffer, MAP_WRITE, MAP_FLAG_DISCARD);
560 pAttribs->iCascade = i;
561 if (ShadowAttribs.iFixedFilterSize > 0)
562 {
563 pAttribs->fHorzFilterRadius = static_cast<float>(iFilterRadius);
564 pAttribs->fVertFilterRadius = static_cast<float>(iFilterRadius);
565 }
566 else
567 {
568 const auto& Cascade = ShadowAttribs.Cascades[i];
569 float fNDCtoUVScale = 0.5f;
570 float fFilterWidth = ShadowAttribs.fFilterWorldSize * Cascade.f4LightSpaceScale.x * fNDCtoUVScale;
571 float fFilterHeight = ShadowAttribs.fFilterWorldSize * Cascade.f4LightSpaceScale.y * fNDCtoUVScale;
572 pAttribs->fHorzFilterRadius = fFilterWidth / 2.f * static_cast<float>(ShadowMapDesc.Width);
573 pAttribs->fVertFilterRadius = fFilterHeight / 2.f * static_cast<float>(ShadowMapDesc.Height);
574 }
575 pAttribs->fEVSMPositiveExponent = ShadowAttribs.fEVSMPositiveExponent;
576 pAttribs->fEVSMNegativeExponent = ShadowAttribs.fEVSMNegativeExponent;
577 pAttribs->Is32BitEVSM = ShadowAttribs.bIs32BitEVSM;
578 }
579 pCtx->SetPipelineState(Tech.PSO);
580 pCtx->CommitShaderResources(Tech.SRB, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
581 DrawAttribs drawAttribs{3, DRAW_FLAG_VERIFY_ALL};
582 pCtx->Draw(drawAttribs);
583
584 if (!bSkipBlur)
585 {
586 pRTVs[0] = m_pFilterableShadowMapRTVs[i];
587 pCtx->SetRenderTargets(1, pRTVs, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);

Callers

nothing calls this directly

Calls 2

SetPipelineStateMethod · 0.80
CommitShaderResourcesMethod · 0.80

Tested by

no test coverage detected