Path: blob/main/crates/bevy_anti_alias/src/fxaa/node.rs
9299 views
use crate::fxaa::{CameraFxaaPipeline, Fxaa, FxaaPipeline};1use bevy_ecs::prelude::*;2use bevy_render::{3diagnostic::RecordDiagnostics,4render_resource::{5BindGroup, BindGroupEntries, Operations, PipelineCache, RenderPassColorAttachment,6RenderPassDescriptor, TextureViewId,7},8renderer::{RenderContext, ViewQuery},9view::ViewTarget,10};1112pub(crate) fn fxaa(13view: ViewQuery<(&ViewTarget, &CameraFxaaPipeline, &Fxaa)>,14fxaa_pipeline: Res<FxaaPipeline>,15pipeline_cache: Res<PipelineCache>,16mut ctx: RenderContext,17mut cached_bind_group: Local<Option<(TextureViewId, BindGroup)>>,18) {19let (target, pipeline, fxaa) = view.into_inner();2021if !fxaa.enabled {22return;23}2425let Some(pipeline) = pipeline_cache.get_render_pipeline(pipeline.pipeline_id) else {26return;27};2829let post_process = target.post_process_write();30let source = post_process.source;31let destination = post_process.destination;32let bind_group = match &mut *cached_bind_group {33Some((id, bind_group)) if source.id() == *id => bind_group,34cached => {35let bind_group = ctx.render_device().create_bind_group(36None,37&pipeline_cache.get_bind_group_layout(&fxaa_pipeline.texture_bind_group),38&BindGroupEntries::sequential((source, &fxaa_pipeline.sampler)),39);4041let (_, bind_group) = cached.insert((source.id(), bind_group));42bind_group43}44};4546let pass_descriptor = RenderPassDescriptor {47label: Some("fxaa"),48color_attachments: &[Some(RenderPassColorAttachment {49view: destination,50depth_slice: None,51resolve_target: None,52ops: Operations::default(),53})],54depth_stencil_attachment: None,55timestamp_writes: None,56occlusion_query_set: None,57multiview_mask: None,58};5960let diagnostics = ctx.diagnostic_recorder();61let diagnostics = diagnostics.as_deref();62let time_span = diagnostics.time_span(ctx.command_encoder(), "fxaa");6364{65let mut render_pass = ctx.command_encoder().begin_render_pass(&pass_descriptor);66let pass_span = diagnostics.pass_span(&mut render_pass, "fxaa");6768render_pass.set_pipeline(pipeline);69render_pass.set_bind_group(0, bind_group, &[]);70render_pass.draw(0..3, 0..1);7172pass_span.end(&mut render_pass);73}7475time_span.end(ctx.command_encoder());76}777879