Batches update and upload passes for model renderers.

This commit is contained in:
Vladislav Belov
2024-11-06 15:41:19 +01:00
parent 6a630ced93
commit 9094c3adb0
8 changed files with 76 additions and 35 deletions
@@ -188,6 +188,17 @@ CModelRData* CPUSkinnedModelVertexRenderer::CreateModelData(const void* key, CMo
return modelRData;
}
void CPUSkinnedModelVertexRenderer::UpdateModelsData(
Renderer::Backend::IDeviceCommandContext* UNUSED(deviceCommandContext),
PS::span<CModel*> models)
{
for (CModel* model : models)
{
CModelRData* rdata = static_cast<CModelRData*>(model->GetRenderData());
UpdateModelData(model, rdata, rdata->m_UpdateFlags);
}
}
// Fill in and upload dynamic vertex array
void CPUSkinnedModelVertexRenderer::UpdateModelData(CModel* model, CModelRData* data, int updateflags)
{
@@ -208,6 +219,17 @@ void CPUSkinnedModelVertexRenderer::UpdateModelData(CModel* model, CModelRData*
modelRData->m_Array.PrepareForRendering();
}
void CPUSkinnedModelVertexRenderer::UploadModelsData(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
PS::span<CModel*> models)
{
for (CModel* model : models)
{
CModelRData* rdata = static_cast<CModelRData*>(model->GetRenderData());
UploadModelData(deviceCommandContext, model, rdata);
}
}
void CPUSkinnedModelVertexRenderer::UploadModelData(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
CModel* model, CModelRData* data)
+14 -4
View File
@@ -35,11 +35,14 @@ public:
~CPUSkinnedModelVertexRenderer();
CModelRData* CreateModelData(const void* key, CModel* model) override;
void UpdateModelData(CModel* model, CModelRData* data, int updateflags) override;
void UploadModelData(
void UpdateModelsData(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
CModel* model, CModelRData* data) override;
PS::span<CModel*> models) override;
void UploadModelsData(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
PS::span<CModel*> models) override;
void PrepareModelDef(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
const CModelDef& def) override;
@@ -48,6 +51,13 @@ public:
Renderer::Backend::IShaderProgram* shader, CModel* model, CModelRData* data) override;
protected:
void UpdateModelData(
CModel* model, CModelRData* data, int updateflags);
void UploadModelData(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
CModel* model, CModelRData* data);
struct Internals;
std::unique_ptr<Internals> m;
};
+5 -4
View File
@@ -334,15 +334,16 @@ CModelRData* InstancingModelRenderer::CreateModelData(const void* key, CModel* m
return new CModelRData(key);
}
void InstancingModelRenderer::UpdateModelData(CModel* UNUSED(model), CModelRData* UNUSED(data), int UNUSED(updateflags))
void InstancingModelRenderer::UpdateModelsData(
Renderer::Backend::IDeviceCommandContext* UNUSED(deviceCommandContext),
PS::span<CModel*> UNUSED(models))
{
// We have no per-CModel data
}
void InstancingModelRenderer::UploadModelData(
void InstancingModelRenderer::UploadModelsData(
Renderer::Backend::IDeviceCommandContext* UNUSED(deviceCommandContext),
CModel* UNUSED(model), CModelRData* UNUSED(data))
PS::span<CModel*> UNUSED(models))
{
// Data uploaded once during creation as we don't update it dynamically.
}
+7 -4
View File
@@ -40,11 +40,14 @@ public:
// Implementations
CModelRData* CreateModelData(const void* key, CModel* model) override;
void UpdateModelData(CModel* model, CModelRData* data, int updateflags) override;
void UploadModelData(
void UpdateModelsData(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
CModel* model, CModelRData* data) override;
PS::span<CModel*> models) override;
void UploadModelsData(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
PS::span<CModel*> models) override;
void PrepareModelDef(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
const CModelDef& def) override;
+9 -9
View File
@@ -229,7 +229,8 @@ void ShaderModelRenderer::Submit(int cullGroup, CModel* model)
// Call update for all submitted models and enter the rendering phase
void ShaderModelRenderer::PrepareModels()
void ShaderModelRenderer::PrepareModels(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext)
{
for (int cullGroup = 0; cullGroup < CSceneRenderer::CULL_MAX; ++cullGroup)
{
@@ -239,8 +240,13 @@ void ShaderModelRenderer::PrepareModels()
CModelRData* rdata = static_cast<CModelRData*>(model->GetRenderData());
ENSURE(rdata->GetKey() == m->vertexRenderer.get());
}
m->vertexRenderer->UpdateModelData(model, rdata, rdata->m_UpdateFlags);
m->vertexRenderer->UpdateModelsData(deviceCommandContext, m->submissions[cullGroup]);
for (CModel* model : m->submissions[cullGroup])
{
CModelRData* rdata = static_cast<CModelRData*>(model->GetRenderData());
rdata->m_UpdateFlags = 0;
}
}
@@ -251,13 +257,7 @@ void ShaderModelRenderer::UploadModels(
{
for (int cullGroup = 0; cullGroup < CSceneRenderer::CULL_MAX; ++cullGroup)
{
for (CModel* model : m->submissions[cullGroup])
{
CModelRData* rdata = static_cast<CModelRData*>(model->GetRenderData());
ENSURE(rdata->GetKey() == m->vertexRenderer.get());
m->vertexRenderer->UploadModelData(deviceCommandContext, model, rdata);
}
m->vertexRenderer->UploadModelsData(deviceCommandContext, m->submissions[cullGroup]);
}
}
+4 -2
View File
@@ -133,7 +133,8 @@ public:
* Must be called before any rendering calls and after all models
* for this frame have been submitted.
*/
virtual void PrepareModels() = 0;
virtual void PrepareModels(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext) = 0;
/**
* Upload renderer data for all previously submitted models to backend.
@@ -271,7 +272,8 @@ public:
// Batching implementations
void Submit(int cullGroup, CModel* model) override;
void PrepareModels() override;
void PrepareModels(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext) override;
void UploadModels(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext) override;
void EndFrame() override;
+11 -8
View File
@@ -25,6 +25,7 @@
#include "graphics/MeshManager.h"
#include "graphics/ShaderProgramPtr.h"
#include "ps/containers/Span.h"
#include "renderer/backend/IDeviceCommandContext.h"
#include "renderer/backend/IShaderProgram.h"
@@ -78,13 +79,12 @@ public:
* perform software vertex transforms and potentially other per-frame
* calculations.
*
* @param model The model.
* @param data Private data as returned by CreateModelData.
* @param updateflags Flags indicating which data has changed during
* the frame. The value is the same as the value of the model's
* CRenderData::m_UpdateFlags.
* @param deviceCommandContext context for backend commands (f.e. uploading).
* @param models models.
*/
virtual void UpdateModelData(CModel* model, CModelRData* data, int updateflags) = 0;
virtual void UpdateModelsData(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
PS::span<CModel*> models) = 0;
/**
* Upload per-model data to backend.
@@ -94,10 +94,13 @@ public:
*
* ModelVertexRenderer implementations should use this function to
* upload all needed data to backend.
*
* @param deviceCommandContext context for backend commands (f.e. uploading).
* @param models models.
*/
virtual void UploadModelData(
virtual void UploadModelsData(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
CModel* model, CModelRData* data) = 0;
PS::span<CModel*> models) = 0;
/**
* PrepareModelDef: Setup backend state for rendering of models that
+4 -4
View File
@@ -789,12 +789,12 @@ void CSceneRenderer::PrepareSubmissions(
// Prepare model renderers
{
PROFILE3("prepare models");
m->Model.NormalSkinned->PrepareModels();
m->Model.TranspSkinned->PrepareModels();
m->Model.NormalSkinned->PrepareModels(deviceCommandContext);
m->Model.TranspSkinned->PrepareModels(deviceCommandContext);
if (m->Model.NormalUnskinned != m->Model.NormalSkinned)
m->Model.NormalUnskinned->PrepareModels();
m->Model.NormalUnskinned->PrepareModels(deviceCommandContext);
if (m->Model.TranspUnskinned != m->Model.TranspSkinned)
m->Model.TranspUnskinned->PrepareModels();
m->Model.TranspUnskinned->PrepareModels(deviceCommandContext);
}
m->terrainRenderer.PrepareForRendering();