2022-02-22 16:34:35 -05:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
2022-04-28 17:33:51 -04:00
|
|
|
#include "ShaderParameterMetadataBuilder.h"
|
2022-02-22 16:34:35 -05:00
|
|
|
|
2022-04-28 17:33:51 -04:00
|
|
|
void FShaderParametersMetadataBuilder::AddReferencedStruct(
|
2022-02-22 16:34:35 -05:00
|
|
|
const TCHAR* Name,
|
2022-04-28 17:33:51 -04:00
|
|
|
const FShaderParametersMetadata* StructMetadata,
|
|
|
|
|
EShaderPrecisionModifier::Type Precision
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_STRUCT_ALIGNMENT);
|
|
|
|
|
|
|
|
|
|
new(Members) FShaderParametersMetadata::FMember(
|
|
|
|
|
Name,
|
|
|
|
|
StructMetadata->GetStructTypeName(),
|
|
|
|
|
__LINE__,
|
|
|
|
|
NextMemberOffset,
|
|
|
|
|
UBMT_REFERENCED_STRUCT,
|
|
|
|
|
Precision,
|
|
|
|
|
1,
|
|
|
|
|
1,
|
|
|
|
|
0,
|
|
|
|
|
StructMetadata
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
NextMemberOffset += Align(StructMetadata->GetSize(), SHADER_PARAMETER_STRUCT_ALIGNMENT);
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-16 13:35:46 -04:00
|
|
|
void FShaderParametersMetadataBuilder::AddIncludedStruct(
|
|
|
|
|
const FShaderParametersMetadata* StructMetadata,
|
|
|
|
|
EShaderPrecisionModifier::Type Precision
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_STRUCT_ALIGNMENT);
|
|
|
|
|
|
|
|
|
|
new(Members) FShaderParametersMetadata::FMember(
|
|
|
|
|
TEXT(""),
|
|
|
|
|
StructMetadata->GetStructTypeName(),
|
|
|
|
|
__LINE__,
|
|
|
|
|
NextMemberOffset,
|
|
|
|
|
UBMT_INCLUDED_STRUCT,
|
|
|
|
|
Precision,
|
|
|
|
|
1,
|
|
|
|
|
1,
|
|
|
|
|
0,
|
|
|
|
|
StructMetadata
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
NextMemberOffset += Align(StructMetadata->GetSize(), SHADER_PARAMETER_STRUCT_ALIGNMENT);
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-28 17:33:51 -04:00
|
|
|
uint32 FShaderParametersMetadataBuilder::AddNestedStruct(
|
|
|
|
|
const TCHAR* Name,
|
|
|
|
|
const FShaderParametersMetadata* StructMetadata,
|
2022-02-22 16:34:35 -05:00
|
|
|
EShaderPrecisionModifier::Type Precision /* = EShaderPrecisionModifier::Float */
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_STRUCT_ALIGNMENT);
|
2022-04-28 17:33:51 -04:00
|
|
|
const uint32 ThisMemberOffset = NextMemberOffset;
|
2022-02-22 16:34:35 -05:00
|
|
|
|
|
|
|
|
new(Members) FShaderParametersMetadata::FMember(
|
|
|
|
|
Name,
|
|
|
|
|
TEXT(""),
|
|
|
|
|
__LINE__,
|
|
|
|
|
NextMemberOffset,
|
|
|
|
|
UBMT_NESTED_STRUCT,
|
|
|
|
|
Precision,
|
|
|
|
|
1,
|
|
|
|
|
1,
|
|
|
|
|
0,
|
|
|
|
|
StructMetadata
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
NextMemberOffset += Align(StructMetadata->GetSize(), SHADER_PARAMETER_STRUCT_ALIGNMENT);
|
2022-04-28 17:33:51 -04:00
|
|
|
return ThisMemberOffset;
|
2022-02-22 16:34:35 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FShaderParametersMetadataBuilder::AddBufferSRV(
|
|
|
|
|
const TCHAR* Name,
|
|
|
|
|
const TCHAR* ShaderType,
|
|
|
|
|
EShaderPrecisionModifier::Type Precision /* = EShaderPrecisionModifier::Float */
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_POINTER_ALIGNMENT);
|
|
|
|
|
|
|
|
|
|
new(Members) FShaderParametersMetadata::FMember(
|
|
|
|
|
Name,
|
|
|
|
|
ShaderType,
|
|
|
|
|
__LINE__,
|
|
|
|
|
NextMemberOffset,
|
|
|
|
|
UBMT_SRV,
|
|
|
|
|
Precision,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRHIShaderResourceView*>::NumRows,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRHIShaderResourceView*>::NumColumns,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRHIShaderResourceView*>::NumElements,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRHIShaderResourceView*>::GetStructMetadata()
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
NextMemberOffset += SHADER_PARAMETER_POINTER_ALIGNMENT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FShaderParametersMetadataBuilder::AddBufferUAV(
|
|
|
|
|
const TCHAR* Name,
|
|
|
|
|
const TCHAR* ShaderType,
|
|
|
|
|
EShaderPrecisionModifier::Type Precision /* = EShaderPrecisionModifier::Float */
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_POINTER_ALIGNMENT);
|
|
|
|
|
|
|
|
|
|
new(Members) FShaderParametersMetadata::FMember(
|
|
|
|
|
Name,
|
|
|
|
|
ShaderType,
|
|
|
|
|
__LINE__,
|
|
|
|
|
NextMemberOffset,
|
|
|
|
|
UBMT_UAV,
|
|
|
|
|
Precision,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRHIUnorderedAccessView*>::NumRows,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRHIUnorderedAccessView*>::NumColumns,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRHIUnorderedAccessView*>::NumElements,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRHIUnorderedAccessView*>::GetStructMetadata()
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
NextMemberOffset += SHADER_PARAMETER_POINTER_ALIGNMENT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FShaderParametersMetadataBuilder::AddRDGBufferSRV(
|
|
|
|
|
const TCHAR* Name,
|
|
|
|
|
const TCHAR* ShaderType,
|
|
|
|
|
EShaderPrecisionModifier::Type Precision /* = EShaderPrecisionModifier::Float */
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_POINTER_ALIGNMENT);
|
|
|
|
|
|
|
|
|
|
new(Members) FShaderParametersMetadata::FMember(
|
|
|
|
|
Name,
|
|
|
|
|
ShaderType,
|
|
|
|
|
__LINE__,
|
|
|
|
|
NextMemberOffset,
|
|
|
|
|
UBMT_RDG_BUFFER_SRV,
|
|
|
|
|
Precision,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRDGBufferSRV*>::NumRows,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRDGBufferSRV*>::NumColumns,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRDGBufferSRV*>::NumElements,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRDGBufferSRV*>::GetStructMetadata()
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
NextMemberOffset += SHADER_PARAMETER_POINTER_ALIGNMENT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FShaderParametersMetadataBuilder::AddRDGBufferUAV(
|
|
|
|
|
const TCHAR* Name,
|
|
|
|
|
const TCHAR* ShaderType,
|
|
|
|
|
EShaderPrecisionModifier::Type Precision /* = EShaderPrecisionModifier::Float */
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_POINTER_ALIGNMENT);
|
|
|
|
|
|
|
|
|
|
new(Members) FShaderParametersMetadata::FMember(
|
|
|
|
|
Name,
|
|
|
|
|
ShaderType,
|
|
|
|
|
__LINE__,
|
|
|
|
|
NextMemberOffset,
|
|
|
|
|
UBMT_RDG_BUFFER_UAV,
|
|
|
|
|
Precision,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRDGBufferUAV*>::NumRows,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRDGBufferUAV*>::NumColumns,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRDGBufferUAV*>::NumElements,
|
|
|
|
|
TShaderResourceParameterTypeInfo<FRDGBufferUAV*>::GetStructMetadata()
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
NextMemberOffset += SHADER_PARAMETER_POINTER_ALIGNMENT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FShaderParametersMetadata* FShaderParametersMetadataBuilder::Build(
|
|
|
|
|
FShaderParametersMetadata::EUseCase UseCase,
|
|
|
|
|
const TCHAR* ShaderParameterName
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
const uint32 StructSize = Align(NextMemberOffset, SHADER_PARAMETER_STRUCT_ALIGNMENT);
|
|
|
|
|
|
|
|
|
|
FShaderParametersMetadata* ShaderParameterMetadata = new FShaderParametersMetadata(
|
|
|
|
|
UseCase,
|
|
|
|
|
EUniformBufferBindingFlags::Shader,
|
|
|
|
|
ShaderParameterName,
|
|
|
|
|
ShaderParameterName,
|
|
|
|
|
nullptr,
|
|
|
|
|
nullptr,
|
|
|
|
|
__FILE__,
|
|
|
|
|
__LINE__,
|
|
|
|
|
StructSize,
|
|
|
|
|
Members
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return ShaderParameterMetadata;
|
|
|
|
|
}
|