Fix shaders cache to be invalidated when changing ReverseZ option

#2684
This commit is contained in:
2026-05-08 10:53:40 +02:00
parent fb21ffd3be
commit 7f2ba7a81e
3 changed files with 52 additions and 27 deletions
@@ -233,6 +233,15 @@ void CookAssetsStep::CacheData::Load(CookingData& data)
LOG(Info, "{0} option has been modified.", TEXT("ShadersGenerateDebugData")); LOG(Info, "{0} option has been modified.", TEXT("ShadersGenerateDebugData"));
invalidateShaders = true; invalidateShaders = true;
} }
bool reverseZ = false;
#if REVERSE_Z
reverseZ = true;
#endif
if (reverseZ != Settings.Global.ShadersReverseZ)
{
LOG(Info, "{0} option has been modified.", TEXT("ShadersReverseZ"));
invalidateShaders = true;
}
#if PLATFORM_TOOLS_WINDOWS #if PLATFORM_TOOLS_WINDOWS
if (data.Platform == BuildPlatform::Windows32 || data.Platform == BuildPlatform::Windows64) if (data.Platform == BuildPlatform::Windows32 || data.Platform == BuildPlatform::Windows64)
{ {
@@ -97,6 +97,7 @@ public:
{ {
bool ShadersNoOptimize; bool ShadersNoOptimize;
bool ShadersGenerateDebugData; bool ShadersGenerateDebugData;
bool ShadersReverseZ;
Guid StreamingSettingsAssetId; Guid StreamingSettingsAssetId;
int32 ShadersVersion; int32 ShadersVersion;
int32 MaterialGraphVersion; int32 MaterialGraphVersion;
@@ -188,17 +188,41 @@ bool ShaderCacheManagerService::Init()
int32 ShaderCacheVersion = -1; int32 ShaderCacheVersion = -1;
int32 MaterialGraphVersion = -1; int32 MaterialGraphVersion = -1;
int32 ParticleGraphVersion = -1; int32 ParticleGraphVersion = -1;
bool ShaderDebug; union
bool ShaderProfile; {
}; struct
CacheVersion cacheVersion; {
const String cacheVerFile = rootDir / TEXT("CacheVersion"); uint32 ShaderDebug : 1;
uint32 ShaderProfile : 1;
uint32 ReverseZ : 1;
};
uint32 Flags;
};
CacheVersion()
{
Platform::MemoryClear(this, sizeof(*this));
}
void InitDefault()
{
EngineVersion = FLAXENGINE_VERSION_BUILD;
ShaderCacheVersion = GPU_SHADER_CACHE_VERSION;
MaterialGraphVersion = MATERIAL_GRAPH_VERSION;
ParticleGraphVersion = PARTICLE_GPU_GRAPH_VERSION;
Flags = 0;
#if USE_EDITOR #if USE_EDITOR
const bool shaderDebug = CommandLine::Options.ShaderDebug.IsTrue(); ShaderDebug = CommandLine::Options.ShaderDebug.IsTrue();
const bool shaderProfile = CommandLine::Options.ShaderProfile.IsTrue(); ShaderProfile = CommandLine::Options.ShaderProfile.IsTrue();
#else
const bool shaderDebug = false;
#endif #endif
#if REVERSE_Z
ReverseZ = true;
#endif
}
};
CacheVersion cacheVersion, cacheVersionDefault;
cacheVersionDefault.InitDefault();
const String cacheVerFile = rootDir / TEXT("CacheVersion");
if (FileSystem::FileExists(cacheVerFile)) if (FileSystem::FileExists(cacheVerFile))
{ {
if (File::ReadAllBytes(cacheVerFile, (byte*)&cacheVersion, sizeof(cacheVersion))) if (File::ReadAllBytes(cacheVerFile, (byte*)&cacheVersion, sizeof(cacheVersion)))
@@ -207,34 +231,25 @@ bool ShaderCacheManagerService::Init()
LOG(Warning, "Failed to read the shaders cache database version file."); LOG(Warning, "Failed to read the shaders cache database version file.");
} }
} }
if (cacheVersion.EngineVersion != FLAXENGINE_VERSION_BUILD if (cacheVersion.EngineVersion != cacheVersionDefault.EngineVersion
|| cacheVersion.ShaderCacheVersion != GPU_SHADER_CACHE_VERSION || cacheVersion.ShaderCacheVersion != cacheVersionDefault.ShaderCacheVersion
|| cacheVersion.MaterialGraphVersion != MATERIAL_GRAPH_VERSION || cacheVersion.MaterialGraphVersion != cacheVersionDefault.MaterialGraphVersion
|| cacheVersion.ParticleGraphVersion != PARTICLE_GPU_GRAPH_VERSION || cacheVersion.ParticleGraphVersion != cacheVersionDefault.ParticleGraphVersion
|| cacheVersion.ShaderDebug != shaderDebug || cacheVersion.Flags != cacheVersionDefault.Flags
|| cacheVersion.ShaderProfile != shaderProfile
) )
{ {
LOG(Warning, "Shaders cache database is invalid. Performing reset."); LOG(Warning, "Shaders cache database is invalid. Performing reset.");
if (FileSystem::DirectoryExists(rootDir) && FileSystem::DeleteDirectory(rootDir)) if (FileSystem::DirectoryExists(rootDir) && FileSystem::DeleteDirectory(rootDir))
{ {
LOG(Warning, "Failed to reset the shaders cache database."); LOG(Warning, "Failed to reset shaders cache database.");
} }
if (FileSystem::CreateDirectory(rootDir)) if (FileSystem::CreateDirectory(rootDir))
{ {
LOG(Error, "Failed to createe the shaders cache database directory."); LOG(Error, "Failed to create shaders cache database directory.");
} }
if (File::WriteAllBytes(cacheVerFile, (byte*)&cacheVersionDefault, sizeof(cacheVersionDefault)))
cacheVersion.EngineVersion = FLAXENGINE_VERSION_BUILD;
cacheVersion.ShaderCacheVersion = GPU_SHADER_CACHE_VERSION;
cacheVersion.MaterialGraphVersion = MATERIAL_GRAPH_VERSION;
cacheVersion.ParticleGraphVersion = PARTICLE_GPU_GRAPH_VERSION;
cacheVersion.ShaderDebug = shaderDebug;
cacheVersion.ShaderProfile = shaderProfile;
if (File::WriteAllBytes(cacheVerFile, (byte*)&cacheVersion, sizeof(cacheVersion)))
{ {
LOG(Error, "Failed to create the shaders cache database version file."); LOG(Error, "Failed to create shaders cache database version file.");
} }
} }