diff --git a/ShaderRecomp/CMakeLists.txt b/ShaderRecomp/CMakeLists.txt index aeabbd5..7bfbc0d 100644 --- a/ShaderRecomp/CMakeLists.txt +++ b/ShaderRecomp/CMakeLists.txt @@ -1,5 +1,9 @@ project(ShaderRecomp) +if (WIN32) + option(SHADER_RECOMP_DXIL "Generate DXIL shader cache" ON) +endif() + set(SMOLV_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/smol-v/source") add_executable(ShaderRecomp @@ -35,4 +39,8 @@ endif() target_compile_definitions(ShaderRecomp PRIVATE _CRT_SECURE_NO_WARNINGS) +if (SHADER_RECOMP_DXIL) + target_compile_definitions(ShaderRecomp PRIVATE SHADER_RECOMP_DXIL) +endif() + file(COPY ${PACKAGE_PREFIX_DIR}/bin/dxil.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/ShaderRecomp/main.cpp b/ShaderRecomp/main.cpp index 10535ce..22234b1 100644 --- a/ShaderRecomp/main.cpp +++ b/ShaderRecomp/main.cpp @@ -113,11 +113,15 @@ int main(int argc, char** argv) shader.specConstantsMask = recompiler.specConstantsMask; thread_local DxcCompiler dxcCompiler; - shader.dxil = dxcCompiler.compile(recompiler.out, recompiler.isPixelShader, recompiler.specConstantsMask != 0, false); - IDxcBlob* spirv = dxcCompiler.compile(recompiler.out, recompiler.isPixelShader, false, true); - assert(shader.dxil != nullptr && spirv != nullptr); - assert(*(reinterpret_cast(shader.dxil->GetBufferPointer()) + 1) != 0 && "DXIL was not signed properly!"); +#ifdef SHADER_RECOMP_DXIL + shader.dxil = dxcCompiler.compile(recompiler.out, recompiler.isPixelShader, recompiler.specConstantsMask != 0, false); + assert(shader.dxil != nullptr); + assert(*(reinterpret_cast(shader.dxil->GetBufferPointer()) + 1) != 0 && "DXIL was not signed properly!"); +#endif + + IDxcBlob* spirv = dxcCompiler.compile(recompiler.out, recompiler.isPixelShader, false, true); + assert(spirv != nullptr); bool result = smolv::Encode(spirv->GetBufferPointer(), spirv->GetBufferSize(), shader.spirv, smolv::kEncodeFlagStripDebugInfo); assert(result); @@ -141,10 +145,13 @@ int main(int argc, char** argv) for (auto& [hash, shader] : shaders) { f.println("\t{{ 0x{:X}, {}, {}, {}, {}, {} }},", - hash, dxil.size(), shader.dxil->GetBufferSize(), spirv.size(), shader.spirv.size(), shader.specConstantsMask); + hash, dxil.size(), (shader.dxil != nullptr) ? shader.dxil->GetBufferSize() : 0, spirv.size(), shader.spirv.size(), shader.specConstantsMask); - dxil.insert(dxil.end(), reinterpret_cast(shader.dxil->GetBufferPointer()), - reinterpret_cast(shader.dxil->GetBufferPointer()) + shader.dxil->GetBufferSize()); + if (shader.dxil != nullptr) + { + dxil.insert(dxil.end(), reinterpret_cast(shader.dxil->GetBufferPointer()), + reinterpret_cast(shader.dxil->GetBufferPointer()) + shader.dxil->GetBufferSize()); + } spirv.insert(spirv.end(), shader.spirv.begin(), shader.spirv.end()); } @@ -154,7 +161,8 @@ int main(int argc, char** argv) fmt::println("Compressing DXIL cache..."); int level = ZSTD_maxCLevel(); - //level = ZSTD_defaultCLevel(); + +#ifdef SHADER_RECOMP_DXIL std::vector dxilCompressed(ZSTD_compressBound(dxil.size())); dxilCompressed.resize(ZSTD_compress(dxilCompressed.data(), dxilCompressed.size(), dxil.data(), dxil.size(), level)); @@ -164,6 +172,9 @@ int main(int argc, char** argv) f.print("{},", data); f.println("}};"); + f.println("const size_t g_dxilCacheCompressedSize = {};", dxilCompressed.size()); + f.println("const size_t g_dxilCacheDecompressedSize = {};", dxil.size()); +#endif fmt::println("Compressing SPIRV cache..."); @@ -177,11 +188,9 @@ int main(int argc, char** argv) f.println("}};"); - f.println("const size_t g_shaderCacheEntryCount = {};", shaders.size()); - f.println("const size_t g_dxilCacheCompressedSize = {};", dxilCompressed.size()); - f.println("const size_t g_dxilCacheDecompressedSize = {};", dxil.size()); f.println("const size_t g_spirvCacheCompressedSize = {};", spirvCompressed.size()); f.println("const size_t g_spirvCacheDecompressedSize = {};", spirv.size()); + f.println("const size_t g_shaderCacheEntryCount = {};", shaders.size()); writeAllBytes(output, f.out.data(), f.out.size()); }