From fa1cd56a0dcea2fe9e195424fea018a5ef263c59 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Mon, 7 Jun 2021 11:56:41 +0200 Subject: [PATCH] Optimize Vulkan shader compiler memory allocation --- .../Engine/ShadersCompilation/ShaderCompiler.cpp | 15 +++++++++++++++ Source/Engine/ShadersCompilation/ShaderCompiler.h | 1 + .../Vulkan/ShaderCompilerVulkan.cpp | 6 +----- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Source/Engine/ShadersCompilation/ShaderCompiler.cpp b/Source/Engine/ShadersCompilation/ShaderCompiler.cpp index 32decb15f..5852a9b65 100644 --- a/Source/Engine/ShadersCompilation/ShaderCompiler.cpp +++ b/Source/Engine/ShadersCompilation/ShaderCompiler.cpp @@ -364,6 +364,21 @@ bool ShaderCompiler::WriteShaderFunctionBegin(ShaderCompilationContext* context, return false; } +bool ShaderCompiler::WriteShaderFunctionPermutation(ShaderCompilationContext* context, ShaderFunctionMeta& meta, int32 permutationIndex, const ShaderBindings& bindings, const void* header, int32 headerSize, const void* cache, int32 cacheSize) +{ + auto output = context->Output; + + // [Output] Write compiled shader cache + output->WriteUint32(cacheSize + headerSize); + output->WriteBytes(header, headerSize); + output->WriteBytes(cache, cacheSize); + + // [Output] Shader bindings meta + output->Write(&bindings); + + return false; +} + bool ShaderCompiler::WriteShaderFunctionPermutation(ShaderCompilationContext* context, ShaderFunctionMeta& meta, int32 permutationIndex, const ShaderBindings& bindings, const void* cache, int32 cacheSize) { auto output = context->Output; diff --git a/Source/Engine/ShadersCompilation/ShaderCompiler.h b/Source/Engine/ShadersCompilation/ShaderCompiler.h index 43947ab89..1e31ca21e 100644 --- a/Source/Engine/ShadersCompilation/ShaderCompiler.h +++ b/Source/Engine/ShadersCompilation/ShaderCompiler.h @@ -96,6 +96,7 @@ protected: virtual bool OnCompileEnd(); static bool WriteShaderFunctionBegin(ShaderCompilationContext* context, ShaderFunctionMeta& meta); + static bool WriteShaderFunctionPermutation(ShaderCompilationContext* context, ShaderFunctionMeta& meta, int32 permutationIndex, const ShaderBindings& bindings, const void* header, int32 headerSize, const void* cache, int32 cacheSize); static bool WriteShaderFunctionPermutation(ShaderCompilationContext* context, ShaderFunctionMeta& meta, int32 permutationIndex, const ShaderBindings& bindings, const void* cache, int32 cacheSize); static bool WriteShaderFunctionEnd(ShaderCompilationContext* context, ShaderFunctionMeta& meta); static bool WriteCustomDataVS(ShaderCompilationContext* context, ShaderFunctionMeta& meta, int32 permutationIndex, const Array& macros); diff --git a/Source/Engine/ShadersCompilation/Vulkan/ShaderCompilerVulkan.cpp b/Source/Engine/ShadersCompilation/Vulkan/ShaderCompilerVulkan.cpp index 998cc4291..597fd0b39 100644 --- a/Source/Engine/ShadersCompilation/Vulkan/ShaderCompilerVulkan.cpp +++ b/Source/Engine/ShadersCompilation/Vulkan/ShaderCompilerVulkan.cpp @@ -801,12 +801,8 @@ bool ShaderCompilerVulkan::CompileShader(ShaderFunctionMeta& meta, WritePermutat int32 spirvBytesCount = (int32)spirv.size() * sizeof(unsigned); header.Type = SpirvShaderHeader::Types::Raw; - Array data; - data.Resize(sizeof(header) + spirvBytesCount); - Platform::MemoryCopy(data.Get(), &header, sizeof(header)); - Platform::MemoryCopy(data.Get() + sizeof(header), &spirv[0], spirvBytesCount); - if (WriteShaderFunctionPermutation(_context, meta, permutationIndex, bindings, data.Get(), data.Count())) + if (WriteShaderFunctionPermutation(_context, meta, permutationIndex, bindings, &header, sizeof(header), &spirv[0], spirvBytesCount)) return true; if (customDataWrite && customDataWrite(_context, meta, permutationIndex, _macros))