// Copyright Epic Games, Inc. All Rights Reserved. #include "ShaderParameterMetadataBuilder.h" void FShaderParametersMetadataBuilder::AddReferencedStruct( const TCHAR* Name, const FShaderParametersMetadata* StructMetadata, EShaderPrecisionModifier::Type Precision ) { NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_STRUCT_ALIGNMENT); Members.Emplace( Name, StructMetadata->GetStructTypeName(), __LINE__, NextMemberOffset, UBMT_REFERENCED_STRUCT, Precision, 1, 1, 0, StructMetadata ); NextMemberOffset += Align(StructMetadata->GetSize(), SHADER_PARAMETER_STRUCT_ALIGNMENT); } void FShaderParametersMetadataBuilder::AddIncludedStruct( const FShaderParametersMetadata* StructMetadata, EShaderPrecisionModifier::Type Precision ) { NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_STRUCT_ALIGNMENT); Members.Emplace( TEXT(""), StructMetadata->GetStructTypeName(), __LINE__, NextMemberOffset, UBMT_INCLUDED_STRUCT, Precision, 1, 1, 0, StructMetadata ); NextMemberOffset += Align(StructMetadata->GetSize(), SHADER_PARAMETER_STRUCT_ALIGNMENT); } uint32 FShaderParametersMetadataBuilder::AddNestedStruct( const TCHAR* Name, const FShaderParametersMetadata* StructMetadata, EShaderPrecisionModifier::Type Precision /* = EShaderPrecisionModifier::Float */ ) { NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_STRUCT_ALIGNMENT); const uint32 ThisMemberOffset = NextMemberOffset; Members.Emplace( Name, TEXT(""), __LINE__, NextMemberOffset, UBMT_NESTED_STRUCT, Precision, 1, 1, 0, StructMetadata ); NextMemberOffset += Align(StructMetadata->GetSize(), SHADER_PARAMETER_STRUCT_ALIGNMENT); return ThisMemberOffset; } void FShaderParametersMetadataBuilder::AddBufferSRV( const TCHAR* Name, const TCHAR* ShaderType, EShaderPrecisionModifier::Type Precision /* = EShaderPrecisionModifier::Float */ ) { NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_POINTER_ALIGNMENT); Members.Emplace( Name, ShaderType, __LINE__, NextMemberOffset, UBMT_SRV, Precision, TShaderResourceParameterTypeInfo::NumRows, TShaderResourceParameterTypeInfo::NumColumns, TShaderResourceParameterTypeInfo::NumElements, TShaderResourceParameterTypeInfo::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); Members.Emplace( Name, ShaderType, __LINE__, NextMemberOffset, UBMT_UAV, Precision, TShaderResourceParameterTypeInfo::NumRows, TShaderResourceParameterTypeInfo::NumColumns, TShaderResourceParameterTypeInfo::NumElements, TShaderResourceParameterTypeInfo::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); Members.Emplace( Name, ShaderType, __LINE__, NextMemberOffset, UBMT_RDG_BUFFER_SRV, Precision, TShaderResourceParameterTypeInfo::NumRows, TShaderResourceParameterTypeInfo::NumColumns, TShaderResourceParameterTypeInfo::NumElements, TShaderResourceParameterTypeInfo::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); Members.Emplace( Name, ShaderType, __LINE__, NextMemberOffset, UBMT_RDG_BUFFER_UAV, Precision, TShaderResourceParameterTypeInfo::NumRows, TShaderResourceParameterTypeInfo::NumColumns, TShaderResourceParameterTypeInfo::NumElements, TShaderResourceParameterTypeInfo::GetStructMetadata() ); NextMemberOffset += SHADER_PARAMETER_POINTER_ALIGNMENT; } void FShaderParametersMetadataBuilder::AddTexture( const TCHAR* Name, const TCHAR* ShaderType, EShaderPrecisionModifier::Type Precision) { NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_POINTER_ALIGNMENT); Members.Emplace( Name, ShaderType, __LINE__, NextMemberOffset, UBMT_TEXTURE, Precision, TShaderResourceParameterTypeInfo::NumRows, TShaderResourceParameterTypeInfo::NumColumns, TShaderResourceParameterTypeInfo::NumElements, TShaderResourceParameterTypeInfo::GetStructMetadata() ); NextMemberOffset += SHADER_PARAMETER_POINTER_ALIGNMENT; } void FShaderParametersMetadataBuilder::AddRDGTexture( const TCHAR* Name, const TCHAR* ShaderType, EShaderPrecisionModifier::Type Precision /* = EShaderPrecisionModifier::Float */ ) { NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_POINTER_ALIGNMENT); Members.Emplace( Name, ShaderType, __LINE__, NextMemberOffset, UBMT_RDG_TEXTURE, Precision, TShaderResourceParameterTypeInfo::NumRows, TShaderResourceParameterTypeInfo::NumColumns, TShaderResourceParameterTypeInfo::NumElements, TShaderResourceParameterTypeInfo::GetStructMetadata() ); NextMemberOffset += SHADER_PARAMETER_POINTER_ALIGNMENT; } void FShaderParametersMetadataBuilder::AddSampler(const TCHAR* Name, const TCHAR* ShaderType, EShaderPrecisionModifier::Type Precision) { NextMemberOffset = Align(NextMemberOffset, SHADER_PARAMETER_POINTER_ALIGNMENT); Members.Emplace( Name, ShaderType, __LINE__, NextMemberOffset, UBMT_SAMPLER, Precision, TShaderResourceParameterTypeInfo::NumRows, TShaderResourceParameterTypeInfo::NumColumns, TShaderResourceParameterTypeInfo::NumElements, TShaderResourceParameterTypeInfo::GetStructMetadata() ); NextMemberOffset += SHADER_PARAMETER_POINTER_ALIGNMENT; } void FShaderParametersMetadataBuilder::AddRenderTargetBindingSlots(const TCHAR* Name, const TCHAR* ShaderType, EShaderPrecisionModifier::Type Precision) { NextMemberOffset = Align(NextMemberOffset, FRenderTargetBindingSlots::FTypeInfo::Alignment); Members.Emplace( Name, ShaderType, __LINE__, NextMemberOffset, UBMT_RENDER_TARGET_BINDING_SLOTS, Precision, FRenderTargetBindingSlots::FTypeInfo::NumRows, FRenderTargetBindingSlots::FTypeInfo::NumColumns, FRenderTargetBindingSlots::FTypeInfo::NumElements, FRenderTargetBindingSlots::FTypeInfo::GetStructMetadata() ); NextMemberOffset += sizeof(FRenderTargetBindingSlots::FTypeInfo::TAlignedType); } 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; } FShaderParametersMetadata* FShaderParametersMetadataBuilder::Build( FShaderParametersMetadata::EUseCase InUseCase, EUniformBufferBindingFlags InBindingFlags, const TCHAR* InLayoutName, const TCHAR* InStructTypeName, const TCHAR* InShaderVariableName, const TCHAR* InStaticSlotName, const ANSICHAR* InFileName, const int32 InFileLine, bool bForceCompleteInitialization, FRHIUniformBufferLayoutInitializer* OutLayoutInitializer, FShaderParametersMetadata::EUsageFlags InUsageFlags ) { const uint32 StructSize = Align(NextMemberOffset, SHADER_PARAMETER_STRUCT_ALIGNMENT); FShaderParametersMetadata* ShaderParameterMetadata = new FShaderParametersMetadata( InUseCase, InBindingFlags, InLayoutName, InStructTypeName, InShaderVariableName, InStaticSlotName, InFileName, InFileLine, StructSize, Members, bForceCompleteInitialization, OutLayoutInitializer, InUsageFlags ); return ShaderParameterMetadata; }