From 0e885b826788fdee0ce35a4f47ec0d6c654c38c9 Mon Sep 17 00:00:00 2001 From: Chris Burel Date: Fri, 5 Nov 2021 11:38:41 -0700 Subject: [PATCH] [Linux] Fix crash from accessing an invalid AZ::EnvironmentVariable During asset processing, no `RPISystem` component is created, so nothing so nothing calls `ShaderSystem::Init()`, so nothing calls `ShaderReloadDebugTracker::Init()`. Consequently, the AZ::EnvironmentVariables that are used during `ShaderReloadDebugTracker::IsEnabled()` never got created, causing a read from a nullptr at runtime. This fixes that issue by making `IsEnabled()` call `CreateVariable()` on the variables it needs if they are not valid. In addition, it changes the call to `CreateVariable()` to initialize the variable's values directly, to ensure they are only initialized once. It also switches to use `AZ::Crc32` so that the variable's id is computed at compile time. Signed-off-by: Chris Burel --- .../RPI.Public/Shader/ShaderReloadDebugTracker.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/ShaderReloadDebugTracker.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/ShaderReloadDebugTracker.cpp index 3e7ff826cf..fd1f9a845f 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/ShaderReloadDebugTracker.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/ShaderReloadDebugTracker.cpp @@ -15,8 +15,8 @@ namespace AZ { namespace ShaderReloadDebugTrackerInternal { - static const char EnabledVariableName[] = "ShaderReloadDebugTracker enabled"; - static const char IndentVariableName[] = "ShaderReloadDebugTracker indent"; + static constexpr char EnabledVariableName[] = "ShaderReloadDebugTracker enabled"; + static constexpr char IndentVariableName[] = "ShaderReloadDebugTracker indent"; static EnvironmentVariable s_enabled; static EnvironmentVariable s_indent; @@ -24,11 +24,7 @@ namespace AZ void ShaderReloadDebugTracker::Init() { - ShaderReloadDebugTrackerInternal::s_enabled = AZ::Environment::CreateVariable(ShaderReloadDebugTrackerInternal::EnabledVariableName); - ShaderReloadDebugTrackerInternal::s_indent = AZ::Environment::CreateVariable(ShaderReloadDebugTrackerInternal::IndentVariableName); - - ShaderReloadDebugTrackerInternal::s_enabled.Get() = false; - ShaderReloadDebugTrackerInternal::s_indent.Get() = 0; + MakeReady(); } void ShaderReloadDebugTracker::Shutdown() @@ -41,8 +37,8 @@ namespace AZ { if (!ShaderReloadDebugTrackerInternal::s_enabled.IsValid()) { - ShaderReloadDebugTrackerInternal::s_enabled = AZ::Environment::FindVariable(ShaderReloadDebugTrackerInternal::EnabledVariableName); - ShaderReloadDebugTrackerInternal::s_indent = AZ::Environment::FindVariable(ShaderReloadDebugTrackerInternal::IndentVariableName); + ShaderReloadDebugTrackerInternal::s_enabled = AZ::Environment::CreateVariable(AZ::Crc32(ShaderReloadDebugTrackerInternal::EnabledVariableName), false); + ShaderReloadDebugTrackerInternal::s_indent = AZ::Environment::CreateVariable(AZ::Crc32(ShaderReloadDebugTrackerInternal::IndentVariableName), 0); } }