use crate::{
render_passes::{
coverage::shader::template::ShaderTemplateCoverage,
display::shader::template::ShaderTemplateDisplay,
effects::shader::template::ShaderTemplateEffects,
geometry::shader::masked_template::ShaderTemplateGeometryMasked,
geometry::shader::template::ShaderTemplateGeometry,
hzb::shader::template::{ShaderTemplateHzbReduce, ShaderTemplateHzbSeed},
light_culling::shader::template::ShaderTemplateLightCulling,
material_classify::shader::template::ShaderTemplateMaterialClassify,
material_decal::classify::shader::template::ShaderTemplateDecalClassify,
material_decal::shader::template::ShaderTemplateMaterialDecal,
material_opaque::shader::edge_template::ShaderTemplateMaterialFinalBlend,
material_opaque::shader::template::ShaderTemplateMaterialOpaque,
material_prep::shader::template::ShaderTemplateMaterialPrep,
material_transparent::shader::template::ShaderTemplateMaterialTransparent,
occlusion::shader::template::{
ShaderTemplateOcclusionCompaction, ShaderTemplateOcclusionCull,
},
shader_cache_key::ShaderCacheKeyRenderPass,
},
shaders::AwsmShaderError,
};
pub enum ShaderTemplateRenderPass {
Coverage(ShaderTemplateCoverage),
Geometry(ShaderTemplateGeometry),
GeometryMasked(ShaderTemplateGeometryMasked),
HzbSeed(ShaderTemplateHzbSeed),
HzbReduce(ShaderTemplateHzbReduce),
LightCulling(ShaderTemplateLightCulling),
MaterialClassify(ShaderTemplateMaterialClassify),
MaterialPrep(ShaderTemplateMaterialPrep),
DecalClassify(ShaderTemplateDecalClassify),
MaterialDecal(ShaderTemplateMaterialDecal),
MaterialOpaque(ShaderTemplateMaterialOpaque),
MaterialFinalBlend(ShaderTemplateMaterialFinalBlend),
MaterialTransparent(ShaderTemplateMaterialTransparent),
OcclusionCull(ShaderTemplateOcclusionCull),
OcclusionCompaction(ShaderTemplateOcclusionCompaction),
Effects(ShaderTemplateEffects),
Display(ShaderTemplateDisplay),
}
impl TryFrom<&ShaderCacheKeyRenderPass> for ShaderTemplateRenderPass {
type Error = AwsmShaderError;
fn try_from(value: &ShaderCacheKeyRenderPass) -> std::result::Result<Self, Self::Error> {
match value {
ShaderCacheKeyRenderPass::Coverage(cache_key) => {
Ok(ShaderTemplateRenderPass::Coverage(cache_key.try_into()?))
}
ShaderCacheKeyRenderPass::Geometry(cache_key) => {
Ok(ShaderTemplateRenderPass::Geometry(cache_key.try_into()?))
}
ShaderCacheKeyRenderPass::GeometryMasked(cache_key) => Ok(
ShaderTemplateRenderPass::GeometryMasked(cache_key.try_into()?),
),
ShaderCacheKeyRenderPass::HzbSeed(cache_key) => {
Ok(ShaderTemplateRenderPass::HzbSeed(cache_key.try_into()?))
}
ShaderCacheKeyRenderPass::HzbReduce(cache_key) => {
Ok(ShaderTemplateRenderPass::HzbReduce(cache_key.try_into()?))
}
ShaderCacheKeyRenderPass::LightCulling(cache_key) => Ok(
ShaderTemplateRenderPass::LightCulling(cache_key.try_into()?),
),
ShaderCacheKeyRenderPass::MaterialClassify(cache_key) => Ok(
ShaderTemplateRenderPass::MaterialClassify(cache_key.try_into()?),
),
ShaderCacheKeyRenderPass::MaterialPrep(cache_key) => Ok(
ShaderTemplateRenderPass::MaterialPrep(cache_key.try_into()?),
),
ShaderCacheKeyRenderPass::DecalClassify(cache_key) => Ok(
ShaderTemplateRenderPass::DecalClassify(cache_key.try_into()?),
),
ShaderCacheKeyRenderPass::MaterialDecal(cache_key) => Ok(
ShaderTemplateRenderPass::MaterialDecal(cache_key.try_into()?),
),
ShaderCacheKeyRenderPass::MaterialOpaque(cache_key) => Ok(
ShaderTemplateRenderPass::MaterialOpaque(cache_key.try_into()?),
),
ShaderCacheKeyRenderPass::MaterialFinalBlend(cache_key) => Ok(
ShaderTemplateRenderPass::MaterialFinalBlend(cache_key.try_into()?),
),
ShaderCacheKeyRenderPass::MaterialTransparent(cache_key) => Ok(
ShaderTemplateRenderPass::MaterialTransparent(cache_key.try_into()?),
),
ShaderCacheKeyRenderPass::OcclusionCull(cache_key) => Ok(
ShaderTemplateRenderPass::OcclusionCull(cache_key.try_into()?),
),
ShaderCacheKeyRenderPass::OcclusionCompaction(cache_key) => Ok(
ShaderTemplateRenderPass::OcclusionCompaction(cache_key.try_into()?),
),
ShaderCacheKeyRenderPass::Effects(cache_key) => {
Ok(ShaderTemplateRenderPass::Effects(cache_key.try_into()?))
}
ShaderCacheKeyRenderPass::Display(cache_key) => {
Ok(ShaderTemplateRenderPass::Display(cache_key.try_into()?))
}
}
}
}
impl ShaderTemplateRenderPass {
pub fn into_source(self) -> std::result::Result<String, AwsmShaderError> {
match self {
ShaderTemplateRenderPass::Coverage(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::Geometry(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::GeometryMasked(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::HzbSeed(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::HzbReduce(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::LightCulling(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::MaterialClassify(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::MaterialPrep(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::DecalClassify(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::MaterialDecal(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::MaterialOpaque(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::MaterialFinalBlend(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::MaterialTransparent(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::OcclusionCull(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::OcclusionCompaction(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::Effects(tmpl) => tmpl.into_source(),
ShaderTemplateRenderPass::Display(tmpl) => tmpl.into_source(),
}
}
pub fn debug_label(&self) -> Option<&str> {
match self {
ShaderTemplateRenderPass::Coverage(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::Geometry(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::GeometryMasked(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::HzbSeed(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::HzbReduce(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::LightCulling(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::MaterialClassify(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::MaterialPrep(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::DecalClassify(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::MaterialDecal(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::MaterialOpaque(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::MaterialFinalBlend(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::MaterialTransparent(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::OcclusionCull(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::OcclusionCompaction(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::Effects(tmpl) => tmpl.debug_label(),
ShaderTemplateRenderPass::Display(tmpl) => tmpl.debug_label(),
}
}
}