Path: blob/main/crates/bevy_anti_alias/src/contrast_adaptive_sharpening/node.rs
9416 views
use crate::contrast_adaptive_sharpening::ViewCasPipeline;1use bevy_ecs::prelude::*;2use bevy_render::{3diagnostic::RecordDiagnostics,4extract_component::{ComponentUniforms, DynamicUniformIndex},5render_resource::{6BindGroup, BindGroupEntries, BufferId, Operations, PipelineCache,7RenderPassColorAttachment, RenderPassDescriptor, TextureViewId,8},9renderer::{RenderContext, ViewQuery},10view::{ExtractedView, ViewTarget},11};1213use super::{CasPipeline, CasUniform};1415pub(crate) fn cas(16view: ViewQuery<17(18&ViewTarget,19&ViewCasPipeline,20&DynamicUniformIndex<CasUniform>,21),22With<ExtractedView>,23>,24sharpening_pipeline: Res<CasPipeline>,25pipeline_cache: Res<PipelineCache>,26uniforms: Res<ComponentUniforms<CasUniform>>,27mut ctx: RenderContext,28mut cached_bind_group: Local<Option<(BufferId, TextureViewId, BindGroup)>>,29) {30let (target, pipeline, uniform_index) = view.into_inner();3132let uniforms_id = uniforms.buffer().unwrap().id();33let Some(uniforms_binding) = uniforms.binding() else {34return;35};3637let Some(pipeline) = pipeline_cache.get_render_pipeline(pipeline.0) else {38return;39};4041let view_target = target.post_process_write();42let source = view_target.source;43let destination = view_target.destination;4445let bind_group = match &mut *cached_bind_group {46Some((buffer_id, texture_id, bind_group))47if source.id() == *texture_id && uniforms_id == *buffer_id =>48{49bind_group50}51cached => {52let bind_group = ctx.render_device().create_bind_group(53"cas_bind_group",54&pipeline_cache.get_bind_group_layout(&sharpening_pipeline.layout),55&BindGroupEntries::sequential((56view_target.source,57&sharpening_pipeline.sampler,58uniforms_binding,59)),60);6162let (_, _, bind_group) = cached.insert((uniforms_id, source.id(), bind_group));63bind_group64}65};6667let pass_descriptor = RenderPassDescriptor {68label: Some("contrast_adaptive_sharpening"),69color_attachments: &[Some(RenderPassColorAttachment {70view: destination,71depth_slice: None,72resolve_target: None,73ops: Operations::default(),74})],75depth_stencil_attachment: None,76timestamp_writes: None,77occlusion_query_set: None,78multiview_mask: None,79};8081let diagnostics = ctx.diagnostic_recorder();82let diagnostics = diagnostics.as_deref();83let time_span = diagnostics.time_span(ctx.command_encoder(), "contrast_adaptive_sharpening");8485{86let mut render_pass = ctx.command_encoder().begin_render_pass(&pass_descriptor);87let pass_span = diagnostics.pass_span(&mut render_pass, "contrast_adaptive_sharpening");8889render_pass.set_pipeline(pipeline);90render_pass.set_bind_group(0, bind_group, &[uniform_index.index()]);91render_pass.draw(0..3, 0..1);9293pass_span.end(&mut render_pass);94}9596time_span.end(ctx.command_encoder());97}9899100