Files
UnrealEngine/Engine/Source/Runtime/RenderCore/Public/ShaderBundles.h
2025-05-18 13:04:45 +08:00

73 lines
2.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "GlobalShader.h"
/** Global shader to fill a shader bundle. */
class FDispatchShaderBundleCS : public FGlobalShader
{
DECLARE_EXPORTED_GLOBAL_SHADER(FDispatchShaderBundleCS, RENDERCORE_API);
// TODO: Dependency issues
// class FBundleMode : SHADER_PERMUTATION_ENUM_CLASS("BUNDLE_MODE", ERHIShaderBundleMode);
class FBundleMode : SHADER_PERMUTATION_INT("BUNDLE_MODE", 3);
using FPermutationDomain = TShaderPermutationDomain<FBundleMode>;
public:
FDispatchShaderBundleCS() = default;
FDispatchShaderBundleCS(const ShaderMetaType::CompiledShaderInitializerType& Initializer)
: FGlobalShader(Initializer)
{
// Platforms with support for root constants will not have a bind point for this parameter
RootConstantsParam.Bind(Initializer.ParameterMap, TEXT("PassData"), SPF_Optional);
RecordArgBufferParam.Bind(Initializer.ParameterMap, TEXT("RecordArgBuffer"), SPF_Mandatory);
RecordDataBufferParam.Bind(Initializer.ParameterMap, TEXT("RecordDataBuffer"), SPF_Optional);
RWExecutionBufferParam.Bind(Initializer.ParameterMap, TEXT("RWExecutionBuffer"), SPF_Optional);
}
static const uint32 ThreadGroupSizeX = 64;
LAYOUT_FIELD(FShaderParameter, RootConstantsParam);
LAYOUT_FIELD(FShaderResourceParameter, RecordArgBufferParam);
LAYOUT_FIELD(FShaderResourceParameter, RecordDataBufferParam);
LAYOUT_FIELD(FShaderResourceParameter, RWExecutionBufferParam);
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters);
static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment);
};
/** Global work graph shader used to dispatch a shader bundle. */
class FDispatchShaderBundleWorkGraph : public FGlobalShader
{
DECLARE_EXPORTED_GLOBAL_SHADER(FDispatchShaderBundleWorkGraph, RENDERCORE_API);
FDispatchShaderBundleWorkGraph() = default;
FDispatchShaderBundleWorkGraph(const ShaderMetaType::CompiledShaderInitializerType& Initializer)
: FGlobalShader(Initializer)
{
RecordArgBufferParam.Bind(Initializer.ParameterMap, TEXT("RecordArgBuffer"), SPF_Optional);
}
static const uint32 ThreadGroupSizeX = 64;
LAYOUT_FIELD(FShaderResourceParameter, RecordArgBufferParam);
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters);
static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment);
RENDERCORE_API static int32 GetMaxShaderBundleSize();
// Input record structure should match the one declared in the shader.
struct FEntryNodeRecord
{
uint32 DispatchGridSize;
uint32 RecordCount;
FUintVector PlatformData;
};
RENDERCORE_API static FEntryNodeRecord MakeInputRecord(uint32 RecordCount, uint32 ArgOffset, uint32 ArgStride, uint32 ArgsBindlessHandle);
};