Skip to content

Commit

Permalink
PBR_Renderer: added GetJointsDataSize and GetJointsBufferSize helper …
Browse files Browse the repository at this point in the history
…functions
  • Loading branch information
TheMostDiligent committed Sep 21, 2024
1 parent 87d2988 commit 24e5324
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 6 deletions.
4 changes: 4 additions & 0 deletions PBR/interface/PBR_Renderer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,10 @@ class PBR_Renderer
static void* WriteSkinningData(void* pDst, const WriteSkinningDataAttribs& Attribs, bool PackMatrixRowMajor, Uint32 MaxJointCount, bool UseSkinPreTransform);
void* WriteSkinningData(void* pDst, const WriteSkinningDataAttribs& Attribs);

static Uint32 GetJointsDataSize(Uint32 MaxJointCount, bool UseSkinPreTransform, bool UsePrevFrameTransforms);
Uint32 GetJointsDataSize(Uint32 JointCount, PSO_FLAGS PSOFlags) const;
Uint32 GetJointsBufferSize() const;

protected:
ShaderMacroHelper DefineMacros(const PSOKey& Key) const;

Expand Down
37 changes: 31 additions & 6 deletions PBR/src/PBR_Renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,21 @@ static void ClearCubemap(IDeviceContext* pCtx, ITexture* pCubemap)
});
}

Uint32 PBR_Renderer::GetJointsDataSize(Uint32 MaxJointCount, bool UseSkinPreTransform, bool UsePrevFrameTransforms)
{
return sizeof(float4x4) * (MaxJointCount + (UseSkinPreTransform ? 1 : 0)) * (UsePrevFrameTransforms ? 2 : 1);
}

Uint32 PBR_Renderer::GetJointsDataSize(Uint32 JointCount, PSO_FLAGS PSOFlags) const
{
return GetJointsDataSize(JointCount, m_Settings.UseSkinPreTransform, (PSOFlags & PSO_FLAG_COMPUTE_MOTION_VECTORS) != 0);
}

Uint32 PBR_Renderer::GetJointsBufferSize() const
{
return GetJointsDataSize(m_Settings.MaxJointCount, m_Settings.UseSkinPreTransform, true);
}

PBR_Renderer::PBR_Renderer(IRenderDevice* pDevice,
IRenderStateCache* pStateCache,
IDeviceContext* pCtx,
Expand Down Expand Up @@ -414,10 +429,10 @@ PBR_Renderer::PBR_Renderer(IRenderDevice* pDevice,
m_Settings.MaxJointCount = MaxJointCount;
}

const size_t JointsBufferSize = sizeof(float4x4) * (m_Settings.MaxJointCount + (m_Settings.UseSkinPreTransform ? 1 : 0)) * 2; // Current and previous transforms
const Uint32 JointsBufferSize = GetJointsBufferSize();
if (!m_JointsBuffer)
{
CreateUniformBuffer(pDevice, static_cast<Uint32>(JointsBufferSize), "PBR joint transforms", &m_JointsBuffer);
CreateUniformBuffer(pDevice, JointsBufferSize, "PBR joint transforms", &m_JointsBuffer);
}
else
{
Expand Down Expand Up @@ -835,7 +850,10 @@ void PBR_Renderer::InitCommonSRBVars(IShaderResourceBinding* pSRB,
if (auto* pVar = pSRB->GetVariableByName(SHADER_TYPE_VERTEX, "cbJointTransforms"))
{
if (pVar->Get() == nullptr)
pVar->Set(m_JointsBuffer);
{
const Uint32 JointsBufferSize = GetJointsBufferSize();
pVar->SetBufferRange(m_JointsBuffer, 0, JointsBufferSize);
}
}
}

Expand Down Expand Up @@ -1948,7 +1966,11 @@ Uint32 PBR_Renderer::GetPRBFrameAttribsSize() const
return GetPRBFrameAttribsSize(m_Settings.MaxLightCount, m_Settings.MaxShadowCastingLightCount);
}

void* PBR_Renderer::WriteSkinningData(void* _pDst, const WriteSkinningDataAttribs& Attribs, bool PackMatrixRowMajor, Uint32 MaxJointCount, bool UseSkinPreTransform)
void* PBR_Renderer::WriteSkinningData(void* _pDst,
const WriteSkinningDataAttribs& Attribs,
bool PackMatrixRowMajor,
Uint32 MaxJointCount,
bool UseSkinPreTransform)
{
Uint32 JointCount = Attribs.JointCount;
if (JointCount > MaxJointCount)
Expand All @@ -1959,6 +1981,7 @@ void* PBR_Renderer::WriteSkinningData(void* _pDst, const WriteSkinningDataAttrib

float4x4* pDst = static_cast<float4x4*>(_pDst);

const bool UsePrevFrameTransforms = (Attribs.PSOFlags & PBR_Renderer::PSO_FLAG_COMPUTE_MOTION_VECTORS) != 0;
if (UseSkinPreTransform)
{
static const float4x4 Identity = float4x4::Identity();
Expand All @@ -1967,7 +1990,7 @@ void* PBR_Renderer::WriteSkinningData(void* _pDst, const WriteSkinningDataAttrib
const float4x4& PreTransform = Attribs.PreTransform != nullptr ? *Attribs.PreTransform : Identity;
WriteShaderMatrix(pDst++, PreTransform, !PackMatrixRowMajor);

if (Attribs.PSOFlags & PBR_Renderer::PSO_FLAG_COMPUTE_MOTION_VECTORS)
if (UsePrevFrameTransforms)
{
// g_Skin.PrevPreTransform
const float4x4& PrevPreTransform = Attribs.PrevPreTransform != nullptr ? *Attribs.PrevPreTransform : Identity;
Expand All @@ -1986,7 +2009,7 @@ void* PBR_Renderer::WriteSkinningData(void* _pDst, const WriteSkinningDataAttrib
}
pDst += JointCount;

if (Attribs.PSOFlags & PBR_Renderer::PSO_FLAG_COMPUTE_MOTION_VECTORS)
if (UsePrevFrameTransforms)
{
if (Attribs.PrevJointMatrices != nullptr)
{
Expand All @@ -2000,6 +2023,8 @@ void* PBR_Renderer::WriteSkinningData(void* _pDst, const WriteSkinningDataAttrib
pDst += JointCount;
}

VERIFY_EXPR(static_cast<Uint32>(pDst - static_cast<float4x4*>(_pDst)) * sizeof(float4x4) == GetJointsDataSize(JointCount, UseSkinPreTransform, UsePrevFrameTransforms));

return pDst;
}

Expand Down

0 comments on commit 24e5324

Please sign in to comment.