Optimize material shaders binding by caching time param once per draw pass
This commit is contained in:
@@ -3,7 +3,6 @@
|
||||
#include "DecalMaterialShader.h"
|
||||
#include "MaterialParams.h"
|
||||
#include "Engine/Core/Math/OrientedBoundingBox.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
#include "Engine/Graphics/GPUDevice.h"
|
||||
#include "Engine/Graphics/Shaders/GPUShader.h"
|
||||
#include "Engine/Graphics/RenderBuffers.h"
|
||||
@@ -64,7 +63,7 @@ void DecalMaterialShader::Bind(BindParameters& params)
|
||||
materialData->ViewPos = view.Position;
|
||||
materialData->ViewFar = view.Far;
|
||||
materialData->ViewDir = view.Direction;
|
||||
materialData->TimeParam = Time::Draw.UnscaledTime.GetTotalSeconds();
|
||||
materialData->TimeParam = params.TimeParam;
|
||||
materialData->ViewInfo = view.ViewInfo;
|
||||
materialData->ScreenSize = view.ScreenSize;
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include "Engine/Graphics/GPUDevice.h"
|
||||
#include "Engine/Graphics/Shaders/GPUShader.h"
|
||||
#include "Engine/Graphics/GPULimits.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
#include "Engine/Graphics/RenderTask.h"
|
||||
|
||||
PACK_STRUCT(struct DeferredMaterialShaderData {
|
||||
@@ -89,7 +88,7 @@ void DeferredMaterialShader::Bind(BindParameters& params)
|
||||
materialData->ViewPos = view.Position;
|
||||
materialData->ViewFar = view.Far;
|
||||
materialData->ViewDir = view.Direction;
|
||||
materialData->TimeParam = Time::Draw.UnscaledTime.GetTotalSeconds();
|
||||
materialData->TimeParam = params.TimeParam;
|
||||
materialData->ViewInfo = view.ViewInfo;
|
||||
materialData->ScreenSize = view.ScreenSize;
|
||||
const float scaleX = Vector3(drawCall.World.M11, drawCall.World.M12, drawCall.World.M13).Length();
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#include "Engine/Graphics/GPUDevice.h"
|
||||
#include "Engine/Graphics/Shaders/GPUShader.h"
|
||||
#include "Engine/Graphics/GPULimits.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
#include "Engine/Graphics/RenderTask.h"
|
||||
|
||||
PACK_STRUCT(struct DeformableMaterialShaderData {
|
||||
@@ -76,7 +75,7 @@ void DeformableMaterialShader::Bind(BindParameters& params)
|
||||
materialData->ViewPos = view.Position;
|
||||
materialData->ViewFar = view.Far;
|
||||
materialData->ViewDir = view.Direction;
|
||||
materialData->TimeParam = Time::Draw.UnscaledTime.GetTotalSeconds();
|
||||
materialData->TimeParam = params.TimeParam;
|
||||
materialData->ViewInfo = view.ViewInfo;
|
||||
materialData->ScreenSize = view.ScreenSize;
|
||||
materialData->WorldDeterminantSign = drawCall.WorldDeterminantSign;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#include "ForwardMaterialShader.h"
|
||||
#include "MaterialShaderFeatures.h"
|
||||
#include "MaterialParams.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
#include "Engine/Graphics/GPUDevice.h"
|
||||
#include "Engine/Graphics/GPULimits.h"
|
||||
#include "Engine/Graphics/RenderView.h"
|
||||
@@ -95,7 +94,7 @@ void ForwardMaterialShader::Bind(BindParameters& params)
|
||||
materialData->ViewPos = view.Position;
|
||||
materialData->ViewFar = view.Far;
|
||||
materialData->ViewDir = view.Direction;
|
||||
materialData->TimeParam = Time::Draw.UnscaledTime.GetTotalSeconds();
|
||||
materialData->TimeParam = params.TimeParam;
|
||||
materialData->ViewInfo = view.ViewInfo;
|
||||
materialData->ScreenSize = view.ScreenSize;
|
||||
const float scaleX = Vector3(drawCall.World.M11, drawCall.World.M12, drawCall.World.M13).Length();
|
||||
|
||||
@@ -2,10 +2,8 @@
|
||||
|
||||
#include "GUIMaterialShader.h"
|
||||
#include "MaterialParams.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
#include "Engine/Core/Math/Viewport.h"
|
||||
#include "Engine/Graphics/GPUDevice.h"
|
||||
#include "Engine/Graphics/RenderTask.h"
|
||||
#include "Engine/Graphics/Shaders/GPUShader.h"
|
||||
#include "Engine/Graphics/RenderView.h"
|
||||
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
|
||||
@@ -53,7 +51,7 @@ void GUIMaterialShader::Bind(BindParameters& params)
|
||||
materialData->ViewPos = Vector3::Zero;
|
||||
materialData->ViewFar = 0.0f;
|
||||
materialData->ViewDir = Vector3::Forward;
|
||||
materialData->TimeParam = Time::Draw.UnscaledTime.GetTotalSeconds();
|
||||
materialData->TimeParam = params.TimeParam;
|
||||
materialData->ViewInfo = Vector4::Zero;
|
||||
auto& viewport = Render2D::GetViewport();
|
||||
materialData->ScreenSize = Vector4(viewport.Width, viewport.Height, 1.0f / viewport.Width, 1.0f / viewport.Height);
|
||||
|
||||
@@ -139,35 +139,16 @@ public:
|
||||
int32 DrawCallsCount;
|
||||
MaterialParamsLink* ParamsLink = nullptr;
|
||||
void* CustomData = nullptr;
|
||||
float TimeParam;
|
||||
|
||||
/// <summary>
|
||||
/// The input scene color. It's optional and used in forward/postFx rendering.
|
||||
/// </summary>
|
||||
GPUTextureView* Input = nullptr;
|
||||
|
||||
BindParameters(::GPUContext* context, const ::RenderContext& renderContext)
|
||||
: GPUContext(context)
|
||||
, RenderContext(renderContext)
|
||||
, FirstDrawCall(nullptr)
|
||||
, DrawCallsCount(0)
|
||||
{
|
||||
}
|
||||
|
||||
BindParameters(::GPUContext* context, const ::RenderContext& renderContext, const DrawCall& drawCall)
|
||||
: GPUContext(context)
|
||||
, RenderContext(renderContext)
|
||||
, FirstDrawCall(&drawCall)
|
||||
, DrawCallsCount(1)
|
||||
{
|
||||
}
|
||||
|
||||
BindParameters(::GPUContext* context, const ::RenderContext& renderContext, const DrawCall* firstDrawCall, int32 drawCallsCount)
|
||||
: GPUContext(context)
|
||||
, RenderContext(renderContext)
|
||||
, FirstDrawCall(firstDrawCall)
|
||||
, DrawCallsCount(drawCallsCount)
|
||||
{
|
||||
}
|
||||
BindParameters(::GPUContext* context, const ::RenderContext& renderContext);
|
||||
BindParameters(::GPUContext* context, const ::RenderContext& renderContext, const DrawCall& drawCall);
|
||||
BindParameters(::GPUContext* context, const ::RenderContext& renderContext, const DrawCall* firstDrawCall, int32 drawCallsCount);
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "Engine/Graphics/GPUDevice.h"
|
||||
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
|
||||
#include "Engine/Graphics/Shaders/GPUShader.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
#include "DecalMaterialShader.h"
|
||||
#include "PostFxMaterialShader.h"
|
||||
#include "ForwardMaterialShader.h"
|
||||
@@ -17,6 +18,33 @@
|
||||
#include "DeformableMaterialShader.h"
|
||||
#include "VolumeParticleMaterialShader.h"
|
||||
|
||||
IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderContext& renderContext)
|
||||
: GPUContext(context)
|
||||
, RenderContext(renderContext)
|
||||
, FirstDrawCall(nullptr)
|
||||
, DrawCallsCount(0)
|
||||
, TimeParam(Time::Draw.UnscaledTime.GetTotalSeconds())
|
||||
{
|
||||
}
|
||||
|
||||
IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderContext& renderContext, const DrawCall& drawCall)
|
||||
: GPUContext(context)
|
||||
, RenderContext(renderContext)
|
||||
, FirstDrawCall(&drawCall)
|
||||
, DrawCallsCount(1)
|
||||
, TimeParam(Time::Draw.UnscaledTime.GetTotalSeconds())
|
||||
{
|
||||
}
|
||||
|
||||
IMaterial::BindParameters::BindParameters(::GPUContext* context, const ::RenderContext& renderContext, const DrawCall* firstDrawCall, int32 drawCallsCount)
|
||||
: GPUContext(context)
|
||||
, RenderContext(renderContext)
|
||||
, FirstDrawCall(firstDrawCall)
|
||||
, DrawCallsCount(drawCallsCount)
|
||||
, TimeParam(Time::Draw.UnscaledTime.GetTotalSeconds())
|
||||
{
|
||||
}
|
||||
|
||||
GPUPipelineState* MaterialShader::PipelineStateCache::InitPS(CullMode mode, bool wireframe)
|
||||
{
|
||||
Desc.CullMode = mode;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#include "ParticleMaterialShader.h"
|
||||
#include "MaterialShaderFeatures.h"
|
||||
#include "MaterialParams.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
#include "Engine/Renderer/DrawCall.h"
|
||||
#include "Engine/Renderer/RenderList.h"
|
||||
#include "Engine/Graphics/RenderView.h"
|
||||
@@ -112,7 +111,7 @@ void ParticleMaterialShader::Bind(BindParameters& params)
|
||||
materialData->ViewPos = view.Position;
|
||||
materialData->ViewFar = view.Far;
|
||||
materialData->ViewDir = view.Direction;
|
||||
materialData->TimeParam = Time::Draw.UnscaledTime.GetTotalSeconds();
|
||||
materialData->TimeParam = params.TimeParam;
|
||||
materialData->ViewInfo = view.ViewInfo;
|
||||
materialData->ScreenSize = view.ScreenSize;
|
||||
materialData->SortedIndicesOffset = drawCall.Particle.Particles->GPU.SortedIndices && params.RenderContext.View.Pass != DrawPass::Depth ? sortedIndicesOffset : 0xFFFFFFFF;
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
#include "PostFxMaterialShader.h"
|
||||
#include "MaterialParams.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
#include "Engine/Graphics/GPUDevice.h"
|
||||
#include "Engine/Graphics/RenderTask.h"
|
||||
#include "Engine/Graphics/Shaders/GPUShader.h"
|
||||
@@ -47,7 +46,7 @@ void PostFxMaterialShader::Bind(BindParameters& params)
|
||||
materialData->ViewPos = view.Position;
|
||||
materialData->ViewFar = view.Far;
|
||||
materialData->ViewDir = view.Direction;
|
||||
materialData->TimeParam = Time::Draw.UnscaledTime.GetTotalSeconds();
|
||||
materialData->TimeParam = params.TimeParam;
|
||||
materialData->ViewInfo = view.ViewInfo;
|
||||
materialData->ScreenSize = view.ScreenSize;
|
||||
materialData->TemporalAAJitter = view.TemporalAAJitter;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#include "TerrainMaterialShader.h"
|
||||
#include "MaterialShaderFeatures.h"
|
||||
#include "MaterialParams.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
#include "Engine/Graphics/GPUContext.h"
|
||||
#include "Engine/Graphics/GPULimits.h"
|
||||
#include "Engine/Graphics/GPUDevice.h"
|
||||
@@ -80,7 +79,7 @@ void TerrainMaterialShader::Bind(BindParameters& params)
|
||||
materialData->ViewPos = view.Position;
|
||||
materialData->ViewFar = view.Far;
|
||||
materialData->ViewDir = view.Direction;
|
||||
materialData->TimeParam = Time::Draw.UnscaledTime.GetTotalSeconds();
|
||||
materialData->TimeParam = params.TimeParam;
|
||||
materialData->ViewInfo = view.ViewInfo;
|
||||
materialData->ScreenSize = view.ScreenSize;
|
||||
const float scaleX = Vector3(drawCall.World.M11, drawCall.World.M12, drawCall.World.M13).Length();
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#include "VolumeParticleMaterialShader.h"
|
||||
#include "MaterialShaderFeatures.h"
|
||||
#include "MaterialParams.h"
|
||||
#include "Engine/Engine/Time.h"
|
||||
#include "Engine/Renderer/DrawCall.h"
|
||||
#include "Engine/Renderer/VolumetricFogPass.h"
|
||||
#include "Engine/Renderer/RenderList.h"
|
||||
@@ -90,7 +89,7 @@ void VolumeParticleMaterialShader::Bind(BindParameters& params)
|
||||
materialData->ViewPos = view.Position;
|
||||
materialData->ViewFar = view.Far;
|
||||
materialData->ViewDir = view.Direction;
|
||||
materialData->TimeParam = Time::Draw.UnscaledTime.GetTotalSeconds();
|
||||
materialData->TimeParam = params.TimeParam;
|
||||
materialData->ViewInfo = view.ViewInfo;
|
||||
materialData->ScreenSize = view.ScreenSize;
|
||||
materialData->GridSize = customData->GridSize;
|
||||
|
||||
Reference in New Issue
Block a user