diff --git a/source/renderer/CPUSkinnedModelRenderer.cpp b/source/renderer/CPUSkinnedModelRenderer.cpp index 248841e592..625c70a817 100644 --- a/source/renderer/CPUSkinnedModelRenderer.cpp +++ b/source/renderer/CPUSkinnedModelRenderer.cpp @@ -198,17 +198,8 @@ void CPUSkinnedModelVertexRenderer::UpdateModelsData(Renderer::Backend::IDeviceC { for (CModel* model : models) { - CModelRData* rdata = static_cast(model->GetRenderData()); - UpdateModelData(model, rdata, rdata->m_UpdateFlags); - } -} - -// Fill in and upload dynamic vertex array -void CPUSkinnedModelVertexRenderer::UpdateModelData(CModel* model, CModelRData* data, int updateflags) -{ - if (updateflags & RENDERDATA_UPDATE_VERTICES) - { - ModelRData* modelRData = static_cast(data); + CModelRData* rdata{static_cast(model->GetRenderData())}; + ModelRData* modelRData{static_cast(rdata)}; // build vertices VertexArrayIterator Position = modelRData->m_Position.GetIterator(); diff --git a/source/renderer/CPUSkinnedModelRenderer.h b/source/renderer/CPUSkinnedModelRenderer.h index 038115cf14..ac3df563e7 100644 --- a/source/renderer/CPUSkinnedModelRenderer.h +++ b/source/renderer/CPUSkinnedModelRenderer.h @@ -62,9 +62,6 @@ public: void PrepareForRendering(std::span models); protected: - void UpdateModelData( - CModel* model, CModelRData* data, int updateflags); - void UploadModelData( Renderer::Backend::IDeviceCommandContext* deviceCommandContext, CModel* model, CModelRData* data); diff --git a/source/renderer/GPUSkinnedModelRenderer.cpp b/source/renderer/GPUSkinnedModelRenderer.cpp index c0a80d1e53..8d20c07f99 100644 --- a/source/renderer/GPUSkinnedModelRenderer.cpp +++ b/source/renderer/GPUSkinnedModelRenderer.cpp @@ -423,34 +423,31 @@ void GPUSkinnedModelModelRenderer::UpdateModelData( ModelDefRData* modelDefRData{static_cast(modelDef->GetRenderData(m.get()))}; ModelRData* modelRData{static_cast(data)}; - if (updateflags & RENDERDATA_UPDATE_VERTICES) - { - constexpr uint32_t threadGroupWorkRegionDim{64}; - const uint32_t vertexCount{static_cast(modelRData->m_PositionHandle->m_Count)}; - const uint32_t dispatchGroupCountX{DivideRoundUp(vertexCount, threadGroupWorkRegionDim)}; + constexpr uint32_t threadGroupWorkRegionDim{64}; + const uint32_t vertexCount{static_cast(modelRData->m_PositionHandle->m_Count)}; + const uint32_t dispatchGroupCountX{DivideRoundUp(vertexCount, threadGroupWorkRegionDim)}; - // Bind matrices for current animation state. - // Add 1 to NumBones because of the special 'root' bone. - deviceCommandContext->SetUniform( - shaderProgram->GetBindingSlot(str_skinBlendMatrices), - std::span( - model->GetAnimatedBoneMatrices()[0]._data, - model->GetAnimatedBoneMatrices()[0].AsFloatArray().size() * (modelDef->GetNumBones() + 1))); + // Bind matrices for current animation state. + // Add 1 to NumBones because of the special 'root' bone. + deviceCommandContext->SetUniform( + shaderProgram->GetBindingSlot(str_skinBlendMatrices), + std::span( + model->GetAnimatedBoneMatrices()[0]._data, + model->GetAnimatedBoneMatrices()[0].AsFloatArray().size() * (modelDef->GetNumBones() + 1))); - ENSURE(modelRData->m_PositionHandle->m_Count == modelRData->m_NormalTangentHandle->m_Count); - deviceCommandContext->SetUniform(shaderProgram->GetBindingSlot(str_vertexCount), - static_cast(vertexCount)); - deviceCommandContext->SetUniform(shaderProgram->GetBindingSlot(str_offset), - static_cast(modelDefRData->m_Array.GetOffset()), - static_cast(modelDefRData->m_BlendArray.GetOffset()), - static_cast(modelRData->m_PositionHandle->m_Index), - static_cast(modelRData->m_NormalTangentHandle->m_Index)); - deviceCommandContext->SetStorageBuffer(shaderProgram->GetBindingSlot(str_InputVertices), modelDefRData->m_Array.GetBuffer()); - deviceCommandContext->SetStorageBuffer(shaderProgram->GetBindingSlot(str_SkinData), modelDefRData->m_BlendArray.GetBuffer()); - deviceCommandContext->SetStorageBuffer(shaderProgram->GetBindingSlot(str_OutputPositions), modelRData->m_PositionHandle->m_Owner->GetBuffer()); - deviceCommandContext->SetStorageBuffer(shaderProgram->GetBindingSlot(str_OutputNormalsTangents), modelRData->m_NormalTangentHandle->m_Owner->GetBuffer()); - deviceCommandContext->Dispatch(dispatchGroupCountX, 1, 1); - } + ENSURE(modelRData->m_PositionHandle->m_Count == modelRData->m_NormalTangentHandle->m_Count); + deviceCommandContext->SetUniform(shaderProgram->GetBindingSlot(str_vertexCount), + static_cast(vertexCount)); + deviceCommandContext->SetUniform(shaderProgram->GetBindingSlot(str_offset), + static_cast(modelDefRData->m_Array.GetOffset()), + static_cast(modelDefRData->m_BlendArray.GetOffset()), + static_cast(modelRData->m_PositionHandle->m_Index), + static_cast(modelRData->m_NormalTangentHandle->m_Index)); + deviceCommandContext->SetStorageBuffer(shaderProgram->GetBindingSlot(str_InputVertices), modelDefRData->m_Array.GetBuffer()); + deviceCommandContext->SetStorageBuffer(shaderProgram->GetBindingSlot(str_SkinData), modelDefRData->m_BlendArray.GetBuffer()); + deviceCommandContext->SetStorageBuffer(shaderProgram->GetBindingSlot(str_OutputPositions), modelRData->m_PositionHandle->m_Owner->GetBuffer()); + deviceCommandContext->SetStorageBuffer(shaderProgram->GetBindingSlot(str_OutputNormalsTangents), modelRData->m_NormalTangentHandle->m_Owner->GetBuffer()); + deviceCommandContext->Dispatch(dispatchGroupCountX, 1, 1); } void GPUSkinnedModelModelRenderer::UploadModelsData(Renderer::Backend::IDeviceCommandContext*, diff --git a/source/renderer/SceneRenderer.cpp b/source/renderer/SceneRenderer.cpp index 1fd393964f..bd26226a13 100644 --- a/source/renderer/SceneRenderer.cpp +++ b/source/renderer/SceneRenderer.cpp @@ -139,6 +139,8 @@ public: Submissions TransparentSkinned; Submissions TransparentUnskinned; + std::vector uniqueSkinnedSubmissionsForUpdate; + ModelRenderer modelRenderer; InstancingModelRenderer VertexInstancingShader; @@ -168,12 +170,7 @@ public: Model.GPUSkinningEnabled ? static_cast(*Model.VertexGPUSkinningShader) : static_cast(Model.VertexCPUSkinningShader)}; - - for (int cullGroup{0}; cullGroup < CSceneRenderer::CULL_MAX; ++cullGroup) - { - modelVertexSkinningRenderer.UploadModelsData(deviceCommandContext, Model.OpaqueSkinned.submissions[cullGroup]); - modelVertexSkinningRenderer.UploadModelsData(deviceCommandContext, Model.TransparentSkinned.submissions[cullGroup]); - } + modelVertexSkinningRenderer.UploadModelsData(deviceCommandContext, Model.uniqueSkinnedSubmissionsForUpdate); for (int cullGroup{0}; cullGroup < CSceneRenderer::CULL_MAX; ++cullGroup) { @@ -201,10 +198,12 @@ public: for (int cullGroup{0}; cullGroup < CSceneRenderer::CULL_MAX; ++cullGroup) { - PrepareModels(deviceCommandContext, modelVertexSkinningRenderer, Model.OpaqueSkinned.submissions[cullGroup]); - PrepareModels(deviceCommandContext, modelVertexSkinningRenderer, Model.TransparentSkinned.submissions[cullGroup]); + PrepareModels(modelVertexSkinningRenderer, Model.OpaqueSkinned.submissions[cullGroup]); + PrepareModels(modelVertexSkinningRenderer, Model.TransparentSkinned.submissions[cullGroup]); } + modelVertexSkinningRenderer.UpdateModelsData(deviceCommandContext, Model.uniqueSkinnedSubmissionsForUpdate); + // See CPUSkinnedModelVertexRenderer::PrepareForRendering comment. if (!Model.GPUSkinningEnabled) { @@ -215,30 +214,24 @@ public: } } - for (int cullGroup{0}; cullGroup < CSceneRenderer::CULL_MAX; ++cullGroup) - { - PrepareModels(deviceCommandContext, Model.VertexInstancingShader, Model.OpaqueUnskinned.submissions[cullGroup]); - PrepareModels(deviceCommandContext, Model.VertexInstancingShader, Model.TransparentUnskinned.submissions[cullGroup]); - } + // We don't need to update unskinned models. } void PrepareModels( - Renderer::Backend::IDeviceCommandContext* deviceCommandContext, ModelVertexRenderer& modelVertexRenderer, std::span submissions) + ModelVertexRenderer& modelVertexRenderer, std::span submissions) { for (CModel* model : submissions) { model->ValidatePosition(); - CModelRData* rdata = static_cast(model->GetRenderData()); + CModelRData* rdata{static_cast(model->GetRenderData())}; ENSURE(rdata->GetKey() == &modelVertexRenderer); - } - modelVertexRenderer.UpdateModelsData(deviceCommandContext, submissions); - - for (CModel* model : submissions) - { - CModelRData* rdata = static_cast(model->GetRenderData()); - rdata->m_UpdateFlags = 0; + if (rdata->m_UpdateFlags & RENDERDATA_UPDATE_VERTICES) + { + Model.uniqueSkinnedSubmissionsForUpdate.emplace_back(model); + rdata->m_UpdateFlags = 0; + } } } @@ -1010,6 +1003,7 @@ void CSceneRenderer::EndFrame() m->Model.OpaqueUnskinned.submissions[cullGroup].clear(); m->Model.TransparentUnskinned.submissions[cullGroup].clear(); } + m->Model.uniqueSkinnedSubmissionsForUpdate.clear(); } void CSceneRenderer::DisplayFrustum(Renderer::Backend::IDeviceCommandContext& deviceCommandContext)