[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 <burelc@amazon.com>
This commit is contained in:
Chris Burel
2021-11-05 11:38:41 -07:00
parent 3bf25aceaa
commit 0e885b8267
@@ -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<bool> s_enabled;
static EnvironmentVariable<int> s_indent;
@@ -24,11 +24,7 @@ namespace AZ
void ShaderReloadDebugTracker::Init()
{
ShaderReloadDebugTrackerInternal::s_enabled = AZ::Environment::CreateVariable<bool>(ShaderReloadDebugTrackerInternal::EnabledVariableName);
ShaderReloadDebugTrackerInternal::s_indent = AZ::Environment::CreateVariable<int>(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<bool>(ShaderReloadDebugTrackerInternal::EnabledVariableName);
ShaderReloadDebugTrackerInternal::s_indent = AZ::Environment::FindVariable<int>(ShaderReloadDebugTrackerInternal::IndentVariableName);
ShaderReloadDebugTrackerInternal::s_enabled = AZ::Environment::CreateVariable<bool>(AZ::Crc32(ShaderReloadDebugTrackerInternal::EnabledVariableName), false);
ShaderReloadDebugTrackerInternal::s_indent = AZ::Environment::CreateVariable<int>(AZ::Crc32(ShaderReloadDebugTrackerInternal::IndentVariableName), 0);
}
}