// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "UniformBuffer.h" #include "ShaderCore.h" /** * This function looks for resources specified in ResourceTableMap in the * parameter map, adds them to the resource table, and removes them from the * parameter map. If a resource is used from a currently unmapped uniform * buffer we allocate a slot for it from UsedUniformBufferSlots. */ extern SHADERCOMPILERCOMMON_API void BuildResourceTableMapping( const TMap& ResourceTableMap, const TMap& ResourceTableLayoutHashes, TBitArray<>& UsedUniformBufferSlots, FShaderParameterMap& ParameterMap, FShaderCompilerResourceTable& OutSRT ); /** * Builds a token stream out of the resource map. The resource map is one * of the arrays generated by BuildResourceTableMapping. The token stream * is used at runtime to gather resources from tables and bind them to the * appropriate slots. */ extern SHADERCOMPILERCOMMON_API void BuildResourceTableTokenStream( const TArray& InResourceMap, int32 MaxBoundResourceTable, TArray& OutTokenStream ); // Finds the number of used uniform buffers in a resource map extern SHADERCOMPILERCOMMON_API int16 GetNumUniformBuffersUsed(const FShaderCompilerResourceTable& InSRT); // This function goes through the shader source and converts // static struct // { // TYPE Member; // [...] // } UniformBuffer = { [...] }; // // TYPE Function([...]) // { // [...]UniformBuffer.Member[...] // } // //into // // /*atic struct // { // TYPE Member; // [...] // } UniformBuffer = { [...] */ // // TYPE Function([...]) // { // [...]UniformBuffer_Member[...] // } // extern SHADERCOMPILERCOMMON_API bool RemoveUniformBuffersFromSource(FString& SourceCode); extern SHADERCOMPILERCOMMON_API bool RemoveUnusedOutputs(FString& InOutSourceCode, const TArray& InUsedOutputs, const TArray& InExceptions, FString& InOutEntryPoint, TArray& OutErrors); extern SHADERCOMPILERCOMMON_API bool RemoveUnusedInputs(FString& InOutSourceCode, const TArray& InUsedInputs, FString& InOutEntryPoint, TArray& OutErrors); /** * Fall back to using the View uniform buffer directly for platforms that don't support instanced stereo. * @param ShaderSource - Preprocessed shader source */ extern SHADERCOMPILERCOMMON_API void StripInstancedStereo(FString& ShaderSource); extern SHADERCOMPILERCOMMON_API FString CreateShaderCompilerWorkerDirectCommandLine(const struct FShaderCompilerInput& Input); // Cross compiler support/common functionality namespace CrossCompiler { extern SHADERCOMPILERCOMMON_API FString CreateBatchFileContents( const FString& ShaderFile, const FString& OutputFile, uint32 Frequency, const FString& EntryPoint, const FString& VersionSwitch, uint32 CCFlags, const FString& ExtraArguments = TEXT("")); extern SHADERCOMPILERCOMMON_API void ParseHlslccError(TArray& OutErrors, const FString& InLine); struct SHADERCOMPILERCOMMON_API FHlslccHeader { FHlslccHeader(); bool Read(const ANSICHAR*& ShaderSource, int32 SourceLen); // After the standard header, different backends can output their own info virtual bool ParseCustomHeaderEntries(const ANSICHAR*& ShaderSource) { return true; } struct FInOut { FString Type; int32 Index; int32 ArrayCount; FString Name; }; struct FAttribute { int32 Index; FString Name; }; struct FPackedGlobal { ANSICHAR PackedType; FString Name; int32 Offset; int32 Count; }; //struct FUniform //{ //}; struct FPackedUB { FAttribute Attribute; struct FMember { FString Name; int32 Offset; int32 Count; }; TArray Members; }; struct FPackedUBCopy { int32 SourceUB; int32 SourceOffset; int32 DestUB; ANSICHAR DestPackedType; int32 DestOffset; int32 Count; }; struct FSampler { FString Name; int32 Offset; int32 Count; TArray SamplerStates; }; struct FUAV { FString Name; int32 Offset; int32 Count; }; FString Name; TArray Inputs; TArray Outputs; TArray UniformBlocks; //TArray Uniforms; TArray PackedGlobals; TArray PackedUBs; TArray PackedUBCopies; TArray PackedUBGlobalCopies; TArray Samplers; TArray UAVs; TArray SamplerStates; uint32 NumThreads[3]; static bool ReadInOut(const ANSICHAR*& ShaderSource, TArray& OutAttributes); static bool ReadCopies(const ANSICHAR*& ShaderSource, bool bGlobals, TArray& OutCopies); }; extern SHADERCOMPILERCOMMON_API const TCHAR* GetFrequencyName(EShaderFrequency Frequency); inline bool ParseIdentifier(const ANSICHAR*& Str, FString& OutStr) { OutStr = TEXT(""); FString Result; while ((*Str >= 'A' && *Str <= 'Z') || (*Str >= 'a' && *Str <= 'z') || (*Str >= '0' && *Str <= '9') || *Str == '_') { OutStr += (TCHAR)*Str; ++Str; } return OutStr.Len() > 0; } FORCEINLINE bool Match(const ANSICHAR*& Str, ANSICHAR Char) { if (*Str == Char) { ++Str; return true; } return false; } template inline bool ParseIntegerNumber(const ANSICHAR*& Str, T& OutNum) { auto* OriginalStr = Str; OutNum = 0; while (*Str >= '0' && *Str <= '9') { OutNum = OutNum * 10 + *Str++ - '0'; } return Str != OriginalStr; } inline bool ParseSignedNumber(const ANSICHAR*& Str, int32& OutNum) { int32 Sign = Match(Str, '-') ? -1 : 1; uint32 Num = 0; if (ParseIntegerNumber(Str, Num)) { OutNum = Sign * (int32)Num; return true; } return false; } }