void FShaderType::Initialize(const TMap<FString, TArray<const TCHAR*> >& ShaderFileToUniformBufferVariables) { if (!FPlatformProperties::RequiresCookedData()) { for(TLinkedList<FShaderType*>::TIterator It(FShaderType::GetTypeList()); It; It.Next()) { FShaderType* Type = *It; GenerateReferencedUniformBuffers(Type->SourceFilename, Type->Name, ShaderFileToUniformBufferVariables, Type->ReferencedUniformBufferStructsCache); // Cache serialization history for each shader type // This history is used to detect when shader serialization changes without a corresponding .usf change { // Construct a temporary shader, which is initialized to safe values for serialization FShader* TempShader = Type->ConstructForDeserialization(); check(TempShader != NULL); TempShader->Type = Type; // Serialize the temp shader to memory and record the number and sizes of serializations TArray<uint8> TempData; FMemoryWriter Ar(TempData, true); FShaderSaveArchive SaveArchive(Ar, Type->SerializationHistory); TempShader->SerializeBase(SaveArchive, false); // Destroy the temporary shader delete TempShader; } } } bInitializedSerializationHistory = true; }
void FVertexFactoryType::Initialize(const TMap<FString, TArray<const TCHAR*> >& ShaderFileToUniformBufferVariables) { if (!FPlatformProperties::RequiresCookedData()) { // Cache serialization history for each VF type // This history is used to detect when shader serialization changes without a corresponding .usf change for(TLinkedList<FVertexFactoryType*>::TIterator It(FVertexFactoryType::GetTypeList()); It; It.Next()) { FVertexFactoryType* Type = *It; GenerateReferencedUniformBuffers(Type->ShaderFilename, Type->Name, ShaderFileToUniformBufferVariables, Type->ReferencedUniformBufferStructsCache); for (int32 Frequency = 0; Frequency < SF_NumFrequencies; Frequency++) { // Construct a temporary shader parameter instance, which is initialized to safe values for serialization FVertexFactoryShaderParameters* Parameters = Type->CreateShaderParameters((EShaderFrequency)Frequency); if (Parameters) { // Serialize the temp shader to memory and record the number and sizes of serializations TArray<uint8> TempData; FMemoryWriter Ar(TempData, true); FShaderSaveArchive SaveArchive(Ar, Type->SerializationHistory[Frequency]); Parameters->Serialize(SaveArchive); delete Parameters; } } } } bInitializedSerializationHistory = true; }