/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #include #include #include #include #include #include #include #include #include #include #include #include namespace AZ { namespace RPI { void ShaderSystem::Reflect(ReflectContext* context) { ShaderOptionDescriptor::Reflect(context); ShaderOptionGroupLayout::Reflect(context); ShaderOptionGroupHints::Reflect(context); ShaderOptionGroup::Reflect(context); ShaderVariantId::Reflect(context); ShaderVariantStableId::Reflect(context); ShaderAsset::Reflect(context); ShaderInputContract::Reflect(context); ShaderOutputContract::Reflect(context); ShaderVariantAsset::Reflect(context); ShaderVariantTreeAsset::Reflect(context); ReflectShaderStageType(context); PrecompiledShaderAssetSourceData::Reflect(context); } ShaderSystemInterface* ShaderSystemInterface::Get() { return Interface::Get(); } void ShaderSystem::GetAssetHandlers(AssetHandlerPtrList& assetHandlers) { assetHandlers.emplace_back(MakeAssetHandler()); assetHandlers.emplace_back(MakeAssetHandler()); assetHandlers.emplace_back(MakeAssetHandler()); } void ShaderSystem::Init() { m_shaderVariantAsyncLoader.Init(); Interface::Register(this); { Data::InstanceHandler handler; handler.m_createFunctionWithParam = [](Data::AssetData* shaderAsset, const AZStd::any* supervariantName) { return Shader::CreateInternal(*(azrtti_cast(shaderAsset)), supervariantName); }; Data::InstanceDatabase::Create(azrtti_typeid(), handler); } { Data::InstanceHandler handler; handler.m_createFunctionWithParam = [](Data::AssetData* shaderAsset, const AZStd::any* srgInitBlob) { return ShaderResourceGroup::CreateInternal(*(azrtti_cast(shaderAsset)), srgInitBlob); }; Data::InstanceDatabase::Create(azrtti_typeid(), handler, false); } { Data::InstanceHandler handler; handler.m_createFunctionWithParam = [](Data::AssetData* shaderAsset, const AZStd::any* srgInitBlob) { return ShaderResourceGroupPool::CreateInternal(*(azrtti_cast(shaderAsset)), srgInitBlob); }; Data::InstanceDatabase::Create(azrtti_typeid(), handler, false); } } void ShaderSystem::Shutdown() { Data::InstanceDatabase::Destroy(); Data::InstanceDatabase::Destroy(); Data::InstanceDatabase::Destroy(); Interface::Unregister(this); m_shaderVariantAsyncLoader.Shutdown(); } /////////////////////////////////////////////////////////////////// // ShaderSystemInterface overrides void ShaderSystem::SetGlobalShaderOption(const AZ::Name& shaderOptionName, ShaderOptionValue value) { bool changed = false; auto iter = m_globalShaderOptionValues.find(shaderOptionName); if (iter == m_globalShaderOptionValues.end()) { changed = true; m_globalShaderOptionValues[shaderOptionName] = value; } else if (iter->second != value) { iter->second = value; changed = true; } if (changed) { m_globalShaderOptionUpdatedEvent.Signal(shaderOptionName, AZStd::move(value)); } } ShaderOptionValue ShaderSystem::GetGlobalShaderOption(const AZ::Name& shaderOptionName) { ShaderOptionValue value; auto iter = m_globalShaderOptionValues.find(shaderOptionName); if (iter != m_globalShaderOptionValues.end()) { value = iter->second; } return value; } const ShaderSystem::GlobalShaderOptionMap& ShaderSystem::GetGlobalShaderOptions() const { return m_globalShaderOptionValues; } void ShaderSystem::Connect(GlobalShaderOptionUpdatedEvent::Handler& handler) { handler.Connect(m_globalShaderOptionUpdatedEvent); } void ShaderSystem::SetSupervariantName(const AZ::Name& supervariantName) { m_supervariantName = supervariantName; } const AZ::Name& ShaderSystem::GetSupervariantName() const { return m_supervariantName; } /////////////////////////////////////////////////////////////////// } // namespace RPI } // namespace AZ