Make DXIL Optional. (#3)

* Make DXIL Optional.

* Change to ifdef.

* Macro name changes.
This commit is contained in:
Darío 2024-12-14 12:34:13 -03:00 committed by GitHub
parent 12b38144b9
commit 4b69741e19
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 28 additions and 11 deletions

View file

@ -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})

View file

@ -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<uint32_t*>(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<uint32_t *>(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<uint8_t*>(shader.dxil->GetBufferPointer()),
reinterpret_cast<uint8_t*>(shader.dxil->GetBufferPointer()) + shader.dxil->GetBufferSize());
if (shader.dxil != nullptr)
{
dxil.insert(dxil.end(), reinterpret_cast<uint8_t *>(shader.dxil->GetBufferPointer()),
reinterpret_cast<uint8_t *>(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<uint8_t> 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());
}