Path: blob/main/crates/bevy_pbr/src/meshlet/pipelines.rs
9441 views
use super::resource_manager::ResourceManager;1use bevy_asset::{load_embedded_asset, AssetServer, Handle};2use bevy_core_pipeline::{3core_3d::CORE_3D_DEPTH_FORMAT, mip_generation::DownsampleShaders, FullscreenShader,4};5use bevy_ecs::{6resource::Resource,7system::{Commands, Res},8world::World,9};10use bevy_render::render_resource::*;11use bevy_shader::Shader;12use bevy_utils::default;1314#[derive(Resource)]15pub struct MeshletPipelines {16clear_visibility_buffer: CachedComputePipelineId,17clear_visibility_buffer_shadow_view: CachedComputePipelineId,18first_instance_cull: CachedComputePipelineId,19second_instance_cull: CachedComputePipelineId,20first_bvh_cull: CachedComputePipelineId,21second_bvh_cull: CachedComputePipelineId,22first_meshlet_cull: CachedComputePipelineId,23second_meshlet_cull: CachedComputePipelineId,24downsample_depth_first: CachedComputePipelineId,25downsample_depth_second: CachedComputePipelineId,26downsample_depth_first_shadow_view: CachedComputePipelineId,27downsample_depth_second_shadow_view: CachedComputePipelineId,28visibility_buffer_software_raster: CachedComputePipelineId,29visibility_buffer_software_raster_shadow_view: CachedComputePipelineId,30visibility_buffer_hardware_raster: CachedRenderPipelineId,31visibility_buffer_hardware_raster_shadow_view: CachedRenderPipelineId,32visibility_buffer_hardware_raster_shadow_view_unclipped: CachedRenderPipelineId,33resolve_depth: CachedRenderPipelineId,34resolve_depth_shadow_view: CachedRenderPipelineId,35resolve_material_depth: CachedRenderPipelineId,36remap_1d_to_2d_dispatch: Option<CachedComputePipelineId>,37fill_counts: CachedComputePipelineId,38pub(crate) meshlet_mesh_material: Handle<Shader>,39}4041pub fn init_meshlet_pipelines(42mut commands: Commands,43resource_manager: Res<ResourceManager>,44fullscreen_shader: Res<FullscreenShader>,45downsample_shaders: Res<DownsampleShaders>,46pipeline_cache: Res<PipelineCache>,47asset_server: Res<AssetServer>,48) {49let clear_visibility_buffer_bind_group_layout = resource_manager50.clear_visibility_buffer_bind_group_layout51.clone();52let clear_visibility_buffer_shadow_view_bind_group_layout = resource_manager53.clear_visibility_buffer_shadow_view_bind_group_layout54.clone();55let first_instance_cull_bind_group_layout = resource_manager56.first_instance_cull_bind_group_layout57.clone();58let second_instance_cull_bind_group_layout = resource_manager59.second_instance_cull_bind_group_layout60.clone();61let first_bvh_cull_bind_group_layout =62resource_manager.first_bvh_cull_bind_group_layout.clone();63let second_bvh_cull_bind_group_layout =64resource_manager.second_bvh_cull_bind_group_layout.clone();65let first_meshlet_cull_bind_group_layout = resource_manager66.first_meshlet_cull_bind_group_layout67.clone();68let second_meshlet_cull_bind_group_layout = resource_manager69.second_meshlet_cull_bind_group_layout70.clone();71let downsample_depth_layout = resource_manager.downsample_depth_bind_group_layout.clone();72let downsample_depth_shadow_view_layout = resource_manager73.downsample_depth_shadow_view_bind_group_layout74.clone();75let visibility_buffer_raster_layout = resource_manager76.visibility_buffer_raster_bind_group_layout77.clone();78let visibility_buffer_raster_shadow_view_layout = resource_manager79.visibility_buffer_raster_shadow_view_bind_group_layout80.clone();81let resolve_depth_layout = resource_manager.resolve_depth_bind_group_layout.clone();82let resolve_depth_shadow_view_layout = resource_manager83.resolve_depth_shadow_view_bind_group_layout84.clone();85let resolve_material_depth_layout = resource_manager86.resolve_material_depth_bind_group_layout87.clone();88let remap_1d_to_2d_dispatch_layout = resource_manager89.remap_1d_to_2d_dispatch_bind_group_layout90.clone();9192let downsample_depth_shader = downsample_shaders.depth.clone();93let vertex_state = fullscreen_shader.to_vertex_state();94let fill_counts_layout = resource_manager.fill_counts_bind_group_layout.clone();9596let clear_visibility_buffer =97load_embedded_asset!(asset_server.as_ref(), "clear_visibility_buffer.wgsl");98let cull_instances = load_embedded_asset!(asset_server.as_ref(), "cull_instances.wgsl");99let cull_bvh = load_embedded_asset!(asset_server.as_ref(), "cull_bvh.wgsl");100let cull_clusters = load_embedded_asset!(asset_server.as_ref(), "cull_clusters.wgsl");101let visibility_buffer_software_raster = load_embedded_asset!(102asset_server.as_ref(),103"visibility_buffer_software_raster.wgsl"104);105let visibility_buffer_hardware_raster = load_embedded_asset!(106asset_server.as_ref(),107"visibility_buffer_hardware_raster.wgsl"108);109let resolve_render_targets =110load_embedded_asset!(asset_server.as_ref(), "resolve_render_targets.wgsl");111let remap_1d_to_2d_dispatch =112load_embedded_asset!(asset_server.as_ref(), "remap_1d_to_2d_dispatch.wgsl");113let fill_counts = load_embedded_asset!(asset_server.as_ref(), "fill_counts.wgsl");114let meshlet_mesh_material =115load_embedded_asset!(asset_server.as_ref(), "meshlet_mesh_material.wgsl");116117commands.insert_resource(MeshletPipelines {118clear_visibility_buffer: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {119label: Some("meshlet_clear_visibility_buffer_pipeline".into()),120layout: vec![clear_visibility_buffer_bind_group_layout],121immediate_size: 8,122shader: clear_visibility_buffer.clone(),123shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into()],124..default()125}),126127clear_visibility_buffer_shadow_view: pipeline_cache.queue_compute_pipeline(128ComputePipelineDescriptor {129label: Some("meshlet_clear_visibility_buffer_shadow_view_pipeline".into()),130layout: vec![clear_visibility_buffer_shadow_view_bind_group_layout],131immediate_size: 8,132shader: clear_visibility_buffer,133..default()134},135),136137first_instance_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {138label: Some("meshlet_first_instance_cull_pipeline".into()),139layout: vec![first_instance_cull_bind_group_layout.clone()],140immediate_size: 4,141shader: cull_instances.clone(),142shader_defs: vec![143"MESHLET_INSTANCE_CULLING_PASS".into(),144"MESHLET_FIRST_CULLING_PASS".into(),145],146..default()147}),148149second_instance_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {150label: Some("meshlet_second_instance_cull_pipeline".into()),151layout: vec![second_instance_cull_bind_group_layout.clone()],152immediate_size: 4,153shader: cull_instances,154shader_defs: vec![155"MESHLET_INSTANCE_CULLING_PASS".into(),156"MESHLET_SECOND_CULLING_PASS".into(),157],158..default()159}),160161first_bvh_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {162label: Some("meshlet_first_bvh_cull_pipeline".into()),163layout: vec![first_bvh_cull_bind_group_layout.clone()],164immediate_size: 8,165shader: cull_bvh.clone(),166shader_defs: vec![167"MESHLET_BVH_CULLING_PASS".into(),168"MESHLET_FIRST_CULLING_PASS".into(),169],170..default()171}),172173second_bvh_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {174label: Some("meshlet_second_bvh_cull_pipeline".into()),175layout: vec![second_bvh_cull_bind_group_layout.clone()],176immediate_size: 8,177shader: cull_bvh,178shader_defs: vec![179"MESHLET_BVH_CULLING_PASS".into(),180"MESHLET_SECOND_CULLING_PASS".into(),181],182..default()183}),184185first_meshlet_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {186label: Some("meshlet_first_meshlet_cull_pipeline".into()),187layout: vec![first_meshlet_cull_bind_group_layout.clone()],188immediate_size: 4,189shader: cull_clusters.clone(),190shader_defs: vec![191"MESHLET_CLUSTER_CULLING_PASS".into(),192"MESHLET_FIRST_CULLING_PASS".into(),193],194..default()195}),196197second_meshlet_cull: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {198label: Some("meshlet_second_meshlet_cull_pipeline".into()),199layout: vec![second_meshlet_cull_bind_group_layout.clone()],200immediate_size: 4,201shader: cull_clusters,202shader_defs: vec![203"MESHLET_CLUSTER_CULLING_PASS".into(),204"MESHLET_SECOND_CULLING_PASS".into(),205],206..default()207}),208209downsample_depth_first: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {210label: Some("meshlet_downsample_depth_first_pipeline".into()),211layout: vec![downsample_depth_layout.clone()],212immediate_size: 4,213shader: downsample_depth_shader.clone(),214shader_defs: vec![215"MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(),216"MESHLET".into(),217],218entry_point: Some("downsample_depth_first".into()),219..default()220}),221222downsample_depth_second: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {223label: Some("meshlet_downsample_depth_second_pipeline".into()),224layout: vec![downsample_depth_layout.clone()],225immediate_size: 4,226shader: downsample_depth_shader.clone(),227shader_defs: vec![228"MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(),229"MESHLET".into(),230],231entry_point: Some("downsample_depth_second".into()),232..default()233}),234235downsample_depth_first_shadow_view: pipeline_cache.queue_compute_pipeline(236ComputePipelineDescriptor {237label: Some("meshlet_downsample_depth_first_pipeline".into()),238layout: vec![downsample_depth_shadow_view_layout.clone()],239immediate_size: 4,240shader: downsample_depth_shader.clone(),241shader_defs: vec!["MESHLET".into()],242entry_point: Some("downsample_depth_first".into()),243..default()244},245),246247downsample_depth_second_shadow_view: pipeline_cache.queue_compute_pipeline(248ComputePipelineDescriptor {249label: Some("meshlet_downsample_depth_second_pipeline".into()),250layout: vec![downsample_depth_shadow_view_layout],251immediate_size: 4,252shader: downsample_depth_shader,253shader_defs: vec!["MESHLET".into()],254entry_point: Some("downsample_depth_second".into()),255zero_initialize_workgroup_memory: false,256},257),258259visibility_buffer_software_raster: pipeline_cache.queue_compute_pipeline(260ComputePipelineDescriptor {261label: Some("meshlet_visibility_buffer_software_raster_pipeline".into()),262layout: vec![visibility_buffer_raster_layout.clone()],263immediate_size: 0,264shader: visibility_buffer_software_raster.clone(),265shader_defs: vec![266"MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into(),267"MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(),268if remap_1d_to_2d_dispatch_layout.is_some() {269"MESHLET_2D_DISPATCH"270} else {271""272}273.into(),274],275..default()276},277),278279visibility_buffer_software_raster_shadow_view: pipeline_cache.queue_compute_pipeline(280ComputePipelineDescriptor {281label: Some(282"meshlet_visibility_buffer_software_raster_shadow_view_pipeline".into(),283),284layout: vec![visibility_buffer_raster_shadow_view_layout.clone()],285immediate_size: 0,286shader: visibility_buffer_software_raster,287shader_defs: vec![288"MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into(),289if remap_1d_to_2d_dispatch_layout.is_some() {290"MESHLET_2D_DISPATCH"291} else {292""293}294.into(),295],296..default()297},298),299300visibility_buffer_hardware_raster: pipeline_cache.queue_render_pipeline(301RenderPipelineDescriptor {302label: Some("meshlet_visibility_buffer_hardware_raster_pipeline".into()),303layout: vec![visibility_buffer_raster_layout.clone()],304immediate_size: 4,305vertex: VertexState {306shader: visibility_buffer_hardware_raster.clone(),307shader_defs: vec![308"MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into(),309"MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(),310],311..default()312},313fragment: Some(FragmentState {314shader: visibility_buffer_hardware_raster.clone(),315shader_defs: vec![316"MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into(),317"MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into(),318],319targets: vec![Some(ColorTargetState {320format: TextureFormat::R8Uint,321blend: None,322write_mask: ColorWrites::empty(),323})],324..default()325}),326..default()327},328),329330visibility_buffer_hardware_raster_shadow_view: pipeline_cache.queue_render_pipeline(331RenderPipelineDescriptor {332label: Some(333"meshlet_visibility_buffer_hardware_raster_shadow_view_pipeline".into(),334),335layout: vec![visibility_buffer_raster_shadow_view_layout.clone()],336immediate_size: 4,337vertex: VertexState {338shader: visibility_buffer_hardware_raster.clone(),339shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()],340..default()341},342fragment: Some(FragmentState {343shader: visibility_buffer_hardware_raster.clone(),344shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()],345targets: vec![Some(ColorTargetState {346format: TextureFormat::R8Uint,347blend: None,348write_mask: ColorWrites::empty(),349})],350..default()351}),352..default()353},354),355356visibility_buffer_hardware_raster_shadow_view_unclipped: pipeline_cache357.queue_render_pipeline(RenderPipelineDescriptor {358label: Some(359"meshlet_visibility_buffer_hardware_raster_shadow_view_unclipped_pipeline"360.into(),361),362layout: vec![visibility_buffer_raster_shadow_view_layout],363immediate_size: 4,364vertex: VertexState {365shader: visibility_buffer_hardware_raster.clone(),366shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()],367..default()368},369fragment: Some(FragmentState {370shader: visibility_buffer_hardware_raster,371shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS".into()],372targets: vec![Some(ColorTargetState {373format: TextureFormat::R8Uint,374blend: None,375write_mask: ColorWrites::empty(),376})],377..default()378}),379..default()380}),381382resolve_depth: pipeline_cache.queue_render_pipeline(RenderPipelineDescriptor {383label: Some("meshlet_resolve_depth_pipeline".into()),384layout: vec![resolve_depth_layout],385vertex: vertex_state.clone(),386depth_stencil: Some(DepthStencilState {387format: CORE_3D_DEPTH_FORMAT,388depth_write_enabled: true,389depth_compare: CompareFunction::Always,390stencil: StencilState::default(),391bias: DepthBiasState::default(),392}),393fragment: Some(FragmentState {394shader: resolve_render_targets.clone(),395shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into()],396entry_point: Some("resolve_depth".into()),397..default()398}),399..default()400}),401402resolve_depth_shadow_view: pipeline_cache.queue_render_pipeline(RenderPipelineDescriptor {403label: Some("meshlet_resolve_depth_pipeline".into()),404layout: vec![resolve_depth_shadow_view_layout],405vertex: vertex_state.clone(),406depth_stencil: Some(DepthStencilState {407format: CORE_3D_DEPTH_FORMAT,408depth_write_enabled: true,409depth_compare: CompareFunction::Always,410stencil: StencilState::default(),411bias: DepthBiasState::default(),412}),413fragment: Some(FragmentState {414shader: resolve_render_targets.clone(),415entry_point: Some("resolve_depth".into()),416..default()417}),418..default()419}),420421resolve_material_depth: pipeline_cache.queue_render_pipeline(RenderPipelineDescriptor {422label: Some("meshlet_resolve_material_depth_pipeline".into()),423layout: vec![resolve_material_depth_layout],424vertex: vertex_state,425primitive: PrimitiveState::default(),426depth_stencil: Some(DepthStencilState {427format: TextureFormat::Depth16Unorm,428depth_write_enabled: true,429depth_compare: CompareFunction::Always,430stencil: StencilState::default(),431bias: DepthBiasState::default(),432}),433fragment: Some(FragmentState {434shader: resolve_render_targets,435shader_defs: vec!["MESHLET_VISIBILITY_BUFFER_RASTER_PASS_OUTPUT".into()],436entry_point: Some("resolve_material_depth".into()),437targets: vec![],438}),439..default()440}),441442fill_counts: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {443label: Some("meshlet_fill_counts_pipeline".into()),444layout: vec![fill_counts_layout],445shader: fill_counts,446shader_defs: vec![if remap_1d_to_2d_dispatch_layout.is_some() {447"MESHLET_2D_DISPATCH"448} else {449""450}451.into()],452..default()453}),454455remap_1d_to_2d_dispatch: remap_1d_to_2d_dispatch_layout.map(|layout| {456pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {457label: Some("meshlet_remap_1d_to_2d_dispatch_pipeline".into()),458layout: vec![layout],459immediate_size: 4,460shader: remap_1d_to_2d_dispatch,461..default()462})463}),464465meshlet_mesh_material,466});467}468469impl MeshletPipelines {470pub fn get(471world: &World,472) -> Option<(473&ComputePipeline,474&ComputePipeline,475&ComputePipeline,476&ComputePipeline,477&ComputePipeline,478&ComputePipeline,479&ComputePipeline,480&ComputePipeline,481&ComputePipeline,482&ComputePipeline,483&ComputePipeline,484&ComputePipeline,485&ComputePipeline,486&ComputePipeline,487&RenderPipeline,488&RenderPipeline,489&RenderPipeline,490&RenderPipeline,491&RenderPipeline,492&RenderPipeline,493Option<&ComputePipeline>,494&ComputePipeline,495)> {496let pipeline_cache = world.get_resource::<PipelineCache>()?;497let pipeline = world.get_resource::<Self>()?;498Some((499pipeline_cache.get_compute_pipeline(pipeline.clear_visibility_buffer)?,500pipeline_cache.get_compute_pipeline(pipeline.clear_visibility_buffer_shadow_view)?,501pipeline_cache.get_compute_pipeline(pipeline.first_instance_cull)?,502pipeline_cache.get_compute_pipeline(pipeline.second_instance_cull)?,503pipeline_cache.get_compute_pipeline(pipeline.first_bvh_cull)?,504pipeline_cache.get_compute_pipeline(pipeline.second_bvh_cull)?,505pipeline_cache.get_compute_pipeline(pipeline.first_meshlet_cull)?,506pipeline_cache.get_compute_pipeline(pipeline.second_meshlet_cull)?,507pipeline_cache.get_compute_pipeline(pipeline.downsample_depth_first)?,508pipeline_cache.get_compute_pipeline(pipeline.downsample_depth_second)?,509pipeline_cache.get_compute_pipeline(pipeline.downsample_depth_first_shadow_view)?,510pipeline_cache.get_compute_pipeline(pipeline.downsample_depth_second_shadow_view)?,511pipeline_cache.get_compute_pipeline(pipeline.visibility_buffer_software_raster)?,512pipeline_cache513.get_compute_pipeline(pipeline.visibility_buffer_software_raster_shadow_view)?,514pipeline_cache.get_render_pipeline(pipeline.visibility_buffer_hardware_raster)?,515pipeline_cache516.get_render_pipeline(pipeline.visibility_buffer_hardware_raster_shadow_view)?,517pipeline_cache.get_render_pipeline(518pipeline.visibility_buffer_hardware_raster_shadow_view_unclipped,519)?,520pipeline_cache.get_render_pipeline(pipeline.resolve_depth)?,521pipeline_cache.get_render_pipeline(pipeline.resolve_depth_shadow_view)?,522pipeline_cache.get_render_pipeline(pipeline.resolve_material_depth)?,523match pipeline.remap_1d_to_2d_dispatch {524Some(id) => Some(pipeline_cache.get_compute_pipeline(id)?),525None => None,526},527pipeline_cache.get_compute_pipeline(pipeline.fill_counts)?,528))529}530}531532533