26#pragma mark - Metal RHI Base Shader Class Support Routines
34#pragma mark - Metal RHI Base Shader Class Template Defines
38#define DEBUG_METAL_SHADERS (UE_BUILD_DEBUG || UE_BUILD_DEVELOPMENT)
43#pragma mark - Metal RHI Base Shader Class Template
91template<
typename BaseResourceType,
int32 ShaderType>
128#pragma mark - Metal RHI Base Shader Class Template Member Functions
131template<
typename BaseResourceType,
int32 ShaderType>
146 Header.Serialize(Ar, BaseResourceType::ShaderResourceTable);
150 SourceLen =
Header.SourceLen;
151 SourceCRC =
Header.SourceCRC;
156 bDeviceFunctionConstants = (
Header.bDeviceFunctionConstants == 0 ?
false :
true);
199#if !UE_BUILD_SHIPPING
205 GlslCodeNSString->retain();
216 GlslCodeNSString = NS::String::string(
ShaderSource, NS::UTF8StringEncoding);
217 check(GlslCodeNSString);
219 GlslCodeNSString->retain();
222 bHasFunctionConstants = (
Header.bDeviceFunctionConstants == 0 ?
false :
true);
224 ConstantValueHash = 0;
244 Bindings =
Header.Bindings;
263 void*
Buffer = FMemory::Malloc( BufferSize );
268 Library = NS::TransferPtr(Device.GetDevice()->newLibrary(
GCDBuffer, &
AError));
295 MTL::CompileOptions*
CompileOptions = MTL::CompileOptions::alloc()->init();
298#if DEBUG_METAL_SHADERS
315#if !PLATFORM_MAC || DEBUG_METAL_SHADERS
318 PreprocessorMacros = NS::Dictionary::dictionary(NS::String::string(
"1", NS::UTF8StringEncoding),
319 NS::String::string(
"METAL_RUNTIME_COMPILER", NS::UTF8StringEncoding));
321#if DEBUG_METAL_SHADERS
322 PreprocessorMacros = NS::Dictionary::dictionary(NS::String::string(
"1", NS::UTF8StringEncoding),
323 NS::String::string(
"MTLSL_ENABLE_DEBUG_INFO", NS::UTF8StringEncoding));
372 NS::Error*
Error =
nullptr;
374 if (Library.get() ==
nullptr)
379 else if (
Error !=
nullptr)
387 GlslCodeNSString->retain();
390 GetCompiledFunction(
true);
392 SideTableBinding =
Header.SideTable;
396#if RHI_INCLUDE_SHADER_DEBUG_DATA
397 this->
Debug.ShaderName = FString::Printf(
TEXT(
"Main_%0.8x_%0.8x"),
Header.SourceLen,
Header.SourceCRC);
401template<
typename BaseResourceType,
int32 ShaderType>
406 GlslCodeNSString->release();
407 GlslCodeNSString =
nullptr;
411template<
typename BaseResourceType,
int32 ShaderType>
416 if (!GlslCodeNSString && CodeSize && CompressedSource.Num())
420 if (!GlslCodeNSString)
422 FString
ShaderString = FString::Printf(
TEXT(
"Hash: %s, Name: Main_%0.8x_%0.8x"), *BaseResourceType::GetHash().ToString(), SourceLen, SourceCRC);
424 GlslCodeNSString->retain();
426 return GlslCodeNSString;
429template<
typename BaseResourceType,
int32 ShaderType>
448 LibraryFunctionIndex = FunctionIndex;
455 NS::String*
Name = (LibraryFunctionIndex != -1)
456 ? (NS::String*)Library->functionNames()->object(LibraryFunctionIndex) :
FStringToNSString(FString::Printf(
TEXT(
"Main_%0.8x_%0.8x"), SourceLen, SourceCRC));
459 if (bHasFunctionConstants)
464 if (bDeviceFunctionConstants)
467 ConstantValues->setConstantValue((
void*)&
GRHIVendorId, MTL::DataTypeUInt, NS::String::string(
"GMetalDeviceManufacturer", NS::UTF8StringEncoding));
471#if PLATFORM_SUPPORTS_GEOMETRY_SHADERS
473 static constexpr bool bEnableTessellation =
false;
476 bHasFunctionConstants =
true;
478 ConstantValues->setConstantValue(&bEnableTessellation, MTL::DataTypeBool,
479 NS::String::string(
"tessellationEnabled", NS::UTF8StringEncoding));
480 ConstantValues->setConstantValue(&Bindings.OutputSizeVS, MTL::DataTypeInt,
481 NS::String::string(
"vertex_shader_output_size_fc", NS::UTF8StringEncoding));
484 if (!bHasFunctionConstants || !bAsync)
487 if (!bHasFunctionConstants)
508#if ENABLE_METAL_GPUPROFILE && RHI_NEW_GPU_PROFILER == 0
519#if ENABLE_METAL_GPUPROFILE && RHI_NEW_GPU_PROFILER == 0
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
DIRECTLINK_API Display
Definition DirectLinkLog.h:8
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
#define UE_CLOG(Condition, CategoryName, Verbosity, Format,...)
Definition LogMacros.h:298
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
@ SF_Vertex
Definition RHIDefinitions.h:203
#define GRHIVendorId
Definition RHIGlobals.h:772
#define ON_SCOPE_EXIT
Definition ScopeExit.h:73
memcpy(InputBufferBase, BinkBlocksData, BinkBlocksSize)
int64 Tell() final
Definition MemoryArchive.h:29
Definition MemoryReader.h:75
void SetLimitSize(int64 NewLimitSize)
Definition MemoryReader.h:124
Definition ShaderCore.h:983
virtual int32 GetInt() const =0
Definition ArrayView.h:139
Definition UnrealString.h.inl:34
void InitStaticUniformBufferSlots(FRHIShaderData *ShaderData)
Definition RHICoreShader.h:44
@ false
Definition radaudio_common.h:23
static CORE_API const TCHAR * Get()
Definition CommandLine.cpp:61
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
static CORE_API bool Param(const TCHAR *Stream, const TCHAR *Param)
Definition Parse.cpp:325
static const EShaderOptionalDataKey Key
Definition ShaderCore.h:857
virtual IConsoleVariable * FindConsoleVariable(const TCHAR *Name, bool bTrackFrequentCalls=true) const =0
static IConsoleManager & Get()
Definition IConsoleManager.h:1270
static int32 Strlen(const CharType *String)
Definition CString.h:1047