/* * Copyright (c) Contributors to the Open 3D Engine Project * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #include #include #include #include namespace AZ { namespace RPI { bool ShaderVariant2::Init( const ShaderAsset2& shaderAsset, Data::Asset shaderVariantAsset, SupervariantIndex supervariantIndex) { m_pipelineStateType = shaderAsset.GetPipelineStateType(); m_pipelineLayoutDescriptor = shaderAsset.GetPipelineLayoutDescriptor(supervariantIndex); m_shaderVariantAsset = shaderVariantAsset; m_renderStates = &shaderAsset.GetRenderStates(supervariantIndex); return true; } void ShaderVariant2::ConfigurePipelineState(RHI::PipelineStateDescriptor& descriptor) const { descriptor.m_pipelineLayoutDescriptor = m_pipelineLayoutDescriptor; switch (descriptor.GetType()) { case RHI::PipelineStateType::Draw: { AZ_Assert(m_pipelineStateType == RHI::PipelineStateType::Draw, "ShaderVariant2 is not intended for the raster pipeline."); AZ_Assert(m_renderStates, "Invalid RenderStates"); RHI::PipelineStateDescriptorForDraw& descriptorForDraw = static_cast(descriptor); descriptorForDraw.m_vertexFunction = m_shaderVariantAsset->GetShaderStageFunction(RHI::ShaderStage::Vertex); descriptorForDraw.m_tessellationFunction = m_shaderVariantAsset->GetShaderStageFunction(RHI::ShaderStage::Tessellation); descriptorForDraw.m_fragmentFunction = m_shaderVariantAsset->GetShaderStageFunction(RHI::ShaderStage::Fragment); descriptorForDraw.m_renderStates = *m_renderStates; break; } case RHI::PipelineStateType::Dispatch: { AZ_Assert(m_pipelineStateType == RHI::PipelineStateType::Dispatch, "ShaderVariant2 is not intended for the compute pipeline."); RHI::PipelineStateDescriptorForDispatch& descriptorForDispatch = static_cast(descriptor); descriptorForDispatch.m_computeFunction = m_shaderVariantAsset->GetShaderStageFunction(RHI::ShaderStage::Compute); break; } case RHI::PipelineStateType::RayTracing: { AZ_Assert(m_pipelineStateType == RHI::PipelineStateType::RayTracing, "ShaderVariant2 is not intended for the ray tracing pipeline."); RHI::PipelineStateDescriptorForRayTracing& descriptorForRayTracing = static_cast(descriptor); descriptorForRayTracing.m_rayTracingFunction = m_shaderVariantAsset->GetShaderStageFunction(RHI::ShaderStage::RayTracing); break; } default: AZ_Assert(false, "Unexpected PipelineStateType"); break; } } } // namespace RPI } // namespace AZ