Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_anti_alias/src/contrast_adaptive_sharpening/node.rs
9416 views
1
use crate::contrast_adaptive_sharpening::ViewCasPipeline;
2
use bevy_ecs::prelude::*;
3
use bevy_render::{
4
diagnostic::RecordDiagnostics,
5
extract_component::{ComponentUniforms, DynamicUniformIndex},
6
render_resource::{
7
BindGroup, BindGroupEntries, BufferId, Operations, PipelineCache,
8
RenderPassColorAttachment, RenderPassDescriptor, TextureViewId,
9
},
10
renderer::{RenderContext, ViewQuery},
11
view::{ExtractedView, ViewTarget},
12
};
13
14
use super::{CasPipeline, CasUniform};
15
16
pub(crate) fn cas(
17
view: ViewQuery<
18
(
19
&ViewTarget,
20
&ViewCasPipeline,
21
&DynamicUniformIndex<CasUniform>,
22
),
23
With<ExtractedView>,
24
>,
25
sharpening_pipeline: Res<CasPipeline>,
26
pipeline_cache: Res<PipelineCache>,
27
uniforms: Res<ComponentUniforms<CasUniform>>,
28
mut ctx: RenderContext,
29
mut cached_bind_group: Local<Option<(BufferId, TextureViewId, BindGroup)>>,
30
) {
31
let (target, pipeline, uniform_index) = view.into_inner();
32
33
let uniforms_id = uniforms.buffer().unwrap().id();
34
let Some(uniforms_binding) = uniforms.binding() else {
35
return;
36
};
37
38
let Some(pipeline) = pipeline_cache.get_render_pipeline(pipeline.0) else {
39
return;
40
};
41
42
let view_target = target.post_process_write();
43
let source = view_target.source;
44
let destination = view_target.destination;
45
46
let bind_group = match &mut *cached_bind_group {
47
Some((buffer_id, texture_id, bind_group))
48
if source.id() == *texture_id && uniforms_id == *buffer_id =>
49
{
50
bind_group
51
}
52
cached => {
53
let bind_group = ctx.render_device().create_bind_group(
54
"cas_bind_group",
55
&pipeline_cache.get_bind_group_layout(&sharpening_pipeline.layout),
56
&BindGroupEntries::sequential((
57
view_target.source,
58
&sharpening_pipeline.sampler,
59
uniforms_binding,
60
)),
61
);
62
63
let (_, _, bind_group) = cached.insert((uniforms_id, source.id(), bind_group));
64
bind_group
65
}
66
};
67
68
let pass_descriptor = RenderPassDescriptor {
69
label: Some("contrast_adaptive_sharpening"),
70
color_attachments: &[Some(RenderPassColorAttachment {
71
view: destination,
72
depth_slice: None,
73
resolve_target: None,
74
ops: Operations::default(),
75
})],
76
depth_stencil_attachment: None,
77
timestamp_writes: None,
78
occlusion_query_set: None,
79
multiview_mask: None,
80
};
81
82
let diagnostics = ctx.diagnostic_recorder();
83
let diagnostics = diagnostics.as_deref();
84
let time_span = diagnostics.time_span(ctx.command_encoder(), "contrast_adaptive_sharpening");
85
86
{
87
let mut render_pass = ctx.command_encoder().begin_render_pass(&pass_descriptor);
88
let pass_span = diagnostics.pass_span(&mut render_pass, "contrast_adaptive_sharpening");
89
90
render_pass.set_pipeline(pipeline);
91
render_pass.set_bind_group(0, bind_group, &[uniform_index.index()]);
92
render_pass.draw(0..3, 0..1);
93
94
pass_span.end(&mut render_pass);
95
}
96
97
time_span.end(ctx.command_encoder());
98
}
99
100