mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-09-21 20:06:40 +00:00
Batches update and upload passes for model renderers.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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.
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user