Skip to content

Commit 18335c6

Browse files
committed
kms: Refactor out postprocessing helpers
1 parent a748ea8 commit 18335c6

File tree

4 files changed

+236
-118
lines changed

4 files changed

+236
-118
lines changed

src/backend/kms/surface/mod.rs

Lines changed: 32 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
use crate::{
44
backend::render::{
55
element::{CosmicElement, DamageElement},
6-
init_shaders, output_elements, CursorMode, GlMultiRenderer, CLEAR_COLOR,
6+
init_shaders, output_elements, CursorMode, GlMultiRenderer, PostprocessOutputConfig,
7+
PostprocessShader, PostprocessState, CLEAR_COLOR,
78
},
89
config::AdaptiveSync,
910
shell::Shell,
@@ -24,7 +25,6 @@ use smithay::{
2425
allocator::{
2526
format::FormatSet,
2627
gbm::{GbmAllocator, GbmDevice},
27-
Fourcc,
2828
},
2929
drm::{
3030
compositor::{BlitFrameResultError, FrameError, FrameFlags, PrimaryPlaneElement},
@@ -34,9 +34,9 @@ use smithay::{
3434
egl::EGLContext,
3535
renderer::{
3636
buffer_dimensions,
37-
damage::{Error as RenderError, OutputDamageTracker},
37+
damage::Error as RenderError,
3838
element::{
39-
texture::{TextureRenderBuffer, TextureRenderElement},
39+
texture::TextureRenderElement,
4040
utils::{constrain_render_elements, ConstrainAlign, ConstrainScaleBehavior},
4141
Element, Kind, RenderElementStates,
4242
},
@@ -63,7 +63,7 @@ use smithay::{
6363
},
6464
wayland_server::protocol::wl_surface::WlSurface,
6565
},
66-
utils::{Buffer as BufferCoords, Clock, Monotonic, Physical, Rectangle, Size, Transform},
66+
utils::{Buffer as BufferCoords, Clock, Monotonic, Physical, Rectangle, Transform},
6767
wayland::{
6868
dmabuf::{get_dmabuf, DmabufFeedbackBuilder},
6969
presentation::Refresh,
@@ -129,7 +129,7 @@ pub struct SurfaceThreadState {
129129

130130
output: Output,
131131
mirroring: Option<Output>,
132-
mirroring_textures: HashMap<DrmNode, MirroringState>,
132+
postprocess_textures: HashMap<DrmNode, PostprocessState>,
133133

134134
shell: Arc<RwLock<Shell>>,
135135

@@ -140,76 +140,6 @@ pub struct SurfaceThreadState {
140140
egui: EguiState,
141141
}
142142

143-
#[derive(Debug, PartialEq)]
144-
struct MirroringOutputConfig {
145-
size: Size<i32, Physical>,
146-
fractional_scale: f64,
147-
}
148-
149-
impl MirroringOutputConfig {
150-
fn for_output_untransformed(output: &Output) -> Self {
151-
Self {
152-
// Apply inverse of output transform to mode size to get correct size
153-
// for an untransformed render.
154-
size: output.current_transform().invert().transform_size(
155-
output
156-
.current_mode()
157-
.map(|mode| mode.size)
158-
.unwrap_or_default(),
159-
),
160-
fractional_scale: output.current_scale().fractional_scale(),
161-
}
162-
}
163-
164-
fn for_output(output: &Output) -> Self {
165-
Self {
166-
size: output
167-
.current_mode()
168-
.map(|mode| mode.size)
169-
.unwrap_or_default(),
170-
fractional_scale: output.current_scale().fractional_scale(),
171-
}
172-
}
173-
}
174-
175-
#[derive(Debug)]
176-
struct MirroringState {
177-
texture: TextureRenderBuffer<GlesTexture>,
178-
damage_tracker: OutputDamageTracker,
179-
output_config: MirroringOutputConfig,
180-
}
181-
182-
impl MirroringState {
183-
fn new_with_renderer(
184-
renderer: &mut GlMultiRenderer,
185-
format: Fourcc,
186-
output_config: MirroringOutputConfig,
187-
) -> Result<Self> {
188-
let size = output_config.size;
189-
let buffer_size = size.to_logical(1).to_buffer(1, Transform::Normal);
190-
let opaque_regions = vec![Rectangle::from_size(buffer_size)];
191-
192-
let texture = Offscreen::<GlesTexture>::create_buffer(renderer, format, buffer_size)?;
193-
let texture_buffer = TextureRenderBuffer::from_texture(
194-
renderer,
195-
texture,
196-
1,
197-
Transform::Normal,
198-
Some(opaque_regions),
199-
);
200-
201-
// Don't use `from_output` to avoid applying output transform
202-
let damage_tracker =
203-
OutputDamageTracker::new(size, output_config.fractional_scale, Transform::Normal);
204-
205-
Ok(MirroringState {
206-
texture: texture_buffer,
207-
damage_tracker,
208-
output_config,
209-
})
210-
}
211-
}
212-
213143
pub type GbmDrmOutput = DrmOutput<
214144
GbmAllocator<DrmDeviceFd>,
215145
GbmDevice<DrmDeviceFd>,
@@ -560,7 +490,7 @@ fn surface_thread(
560490

561491
output,
562492
mirroring: None,
563-
mirroring_textures: HashMap::new(),
493+
postprocess_textures: HashMap::new(),
564494

565495
shell,
566496
loop_handle: event_loop.handle(),
@@ -1056,40 +986,45 @@ impl SurfaceThreadState {
1056986
}).unwrap_or_default();
1057987

1058988
// actual rendering
1059-
let res = if let Some(mirrored_output) = self.mirroring.as_ref().filter(|mirrored_output| {
1060-
MirroringOutputConfig::for_output_untransformed(mirrored_output)
1061-
!= MirroringOutputConfig::for_output(&self.output)
1062-
}) {
1063-
let mirrored_output_config =
1064-
MirroringOutputConfig::for_output_untransformed(mirrored_output);
1065-
let mirroring_state = match self.mirroring_textures.entry(self.target_node) {
989+
let source_output = self
990+
.mirroring
991+
.as_ref()
992+
.filter(|output| {
993+
PostprocessOutputConfig::for_output_untransformed(output)
994+
!= PostprocessOutputConfig::for_output(&self.output)
995+
});
996+
997+
let res = if let Some(source_output) = source_output {
998+
let offscreen_output_config =
999+
PostprocessOutputConfig::for_output_untransformed(source_output);
1000+
let postprocess_state = match self.postprocess_textures.entry(self.target_node) {
10661001
hash_map::Entry::Occupied(occupied) => {
1067-
let mirroring_state = occupied.into_mut();
1002+
let postprocess_state = occupied.into_mut();
10681003
// If output config is different, re-create offscreen state
1069-
if mirroring_state.output_config != mirrored_output_config {
1070-
*mirroring_state = MirroringState::new_with_renderer(
1004+
if postprocess_state.output_config != offscreen_output_config {
1005+
*postprocess_state = PostprocessState::new_with_renderer(
10711006
&mut renderer,
10721007
compositor.format(),
1073-
mirrored_output_config,
1008+
offscreen_output_config,
10741009
)?
10751010
}
1076-
mirroring_state
1011+
postprocess_state
10771012
}
10781013
hash_map::Entry::Vacant(vacant) => {
1079-
vacant.insert(MirroringState::new_with_renderer(
1014+
vacant.insert(PostprocessState::new_with_renderer(
10801015
&mut renderer,
10811016
compositor.format(),
1082-
mirrored_output_config,
1017+
offscreen_output_config,
10831018
)?)
10841019
}
10851020
};
10861021

1087-
mirroring_state
1022+
postprocess_state
10881023
.texture
10891024
.render()
10901025
.draw::<_, <GlMultiRenderer as RendererSuper>::Error>(|tex| {
10911026
let mut fb = renderer.bind(tex)?;
1092-
let res = match mirroring_state.damage_tracker.render_output(
1027+
let res = match postprocess_state.damage_tracker.render_output(
10931028
&mut renderer,
10941029
&mut fb,
10951030
1,
@@ -1103,7 +1038,7 @@ impl SurfaceThreadState {
11031038
renderer.wait(&res.sync)?;
11041039
std::mem::drop(fb);
11051040

1106-
let transform = mirrored_output.current_transform();
1041+
let transform = source_output.current_transform();
11071042
let area = tex.size().to_logical(1, transform);
11081043

11091044
Ok(res
@@ -1120,7 +1055,7 @@ impl SurfaceThreadState {
11201055

11211056
let texture_elem = TextureRenderElement::from_texture_render_buffer(
11221057
(0., 0.),
1123-
&mirroring_state.texture,
1058+
&postprocess_state.texture,
11241059
Some(1.0),
11251060
None,
11261061
None,
@@ -1145,7 +1080,7 @@ impl SurfaceThreadState {
11451080
ConstrainAlign::CENTER,
11461081
1.0,
11471082
)
1148-
.map(CosmicElement::Mirror)
1083+
.map(CosmicElement::Postprocess)
11491084
.collect::<Vec<_>>();
11501085

11511086
renderer = self.api.single_renderer(&self.target_node).unwrap();
@@ -1448,7 +1383,7 @@ impl SurfaceThreadState {
14481383

14491384
fn update_mirroring(&mut self, mirroring_output: Option<Output>) {
14501385
self.mirroring = mirroring_output;
1451-
self.mirroring_textures.clear();
1386+
self.postprocess_textures.clear();
14521387
}
14531388

14541389
fn send_frame_callbacks(&mut self) {

src/backend/render/element.rs

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
use crate::shell::{CosmicMappedRenderElement, WorkspaceRenderElement};
22

3+
#[cfg(feature = "debug")]
4+
use smithay::backend::renderer::{element::texture::TextureRenderElement, gles::GlesTexture};
35
use smithay::{
46
backend::renderer::{
57
element::{
68
memory::MemoryRenderBufferRenderElement,
79
surface::WaylandSurfaceRenderElement,
8-
texture::TextureRenderElement,
910
utils::{CropRenderElement, Relocate, RelocateRenderElement, RescaleRenderElement},
1011
Element, Id, Kind, RenderElement, UnderlyingStorage,
1112
},
12-
gles::{GlesError, GlesTexture},
13+
gles::{element::TextureShaderElement, GlesError},
1314
glow::{GlowFrame, GlowRenderer},
1415
utils::{CommitCounter, DamageSet, OpaqueRegions},
1516
ImportAll, ImportMem, Renderer,
@@ -32,10 +33,8 @@ where
3233
Dnd(WaylandSurfaceRenderElement<R>),
3334
MoveGrab(RescaleRenderElement<CosmicMappedRenderElement<R>>),
3435
AdditionalDamage(DamageElement),
35-
Mirror(
36-
CropRenderElement<
37-
RelocateRenderElement<RescaleRenderElement<TextureRenderElement<GlesTexture>>>,
38-
>,
36+
Postprocess(
37+
CropRenderElement<RelocateRenderElement<RescaleRenderElement<TextureShaderElement>>>,
3938
),
4039
Zoom(MemoryRenderBufferRenderElement<R>),
4140
#[cfg(feature = "debug")]
@@ -55,7 +54,7 @@ where
5554
CosmicElement::Dnd(elem) => elem.id(),
5655
CosmicElement::MoveGrab(elem) => elem.id(),
5756
CosmicElement::AdditionalDamage(elem) => elem.id(),
58-
CosmicElement::Mirror(elem) => elem.id(),
57+
CosmicElement::Postprocess(elem) => elem.id(),
5958
CosmicElement::Zoom(elem) => elem.id(),
6059
#[cfg(feature = "debug")]
6160
CosmicElement::Egui(elem) => elem.id(),
@@ -69,7 +68,7 @@ where
6968
CosmicElement::Dnd(elem) => elem.current_commit(),
7069
CosmicElement::MoveGrab(elem) => elem.current_commit(),
7170
CosmicElement::AdditionalDamage(elem) => elem.current_commit(),
72-
CosmicElement::Mirror(elem) => elem.current_commit(),
71+
CosmicElement::Postprocess(elem) => elem.current_commit(),
7372
CosmicElement::Zoom(elem) => elem.current_commit(),
7473
#[cfg(feature = "debug")]
7574
CosmicElement::Egui(elem) => elem.current_commit(),
@@ -83,7 +82,7 @@ where
8382
CosmicElement::Dnd(elem) => elem.src(),
8483
CosmicElement::MoveGrab(elem) => elem.src(),
8584
CosmicElement::AdditionalDamage(elem) => elem.src(),
86-
CosmicElement::Mirror(elem) => elem.src(),
85+
CosmicElement::Postprocess(elem) => elem.src(),
8786
CosmicElement::Zoom(elem) => elem.src(),
8887
#[cfg(feature = "debug")]
8988
CosmicElement::Egui(elem) => elem.src(),
@@ -97,7 +96,7 @@ where
9796
CosmicElement::Dnd(elem) => elem.geometry(scale),
9897
CosmicElement::MoveGrab(elem) => elem.geometry(scale),
9998
CosmicElement::AdditionalDamage(elem) => elem.geometry(scale),
100-
CosmicElement::Mirror(elem) => elem.geometry(scale),
99+
CosmicElement::Postprocess(elem) => elem.geometry(scale),
101100
CosmicElement::Zoom(elem) => elem.geometry(scale),
102101
#[cfg(feature = "debug")]
103102
CosmicElement::Egui(elem) => elem.geometry(scale),
@@ -111,7 +110,7 @@ where
111110
CosmicElement::Dnd(elem) => elem.location(scale),
112111
CosmicElement::MoveGrab(elem) => elem.location(scale),
113112
CosmicElement::AdditionalDamage(elem) => elem.location(scale),
114-
CosmicElement::Mirror(elem) => elem.location(scale),
113+
CosmicElement::Postprocess(elem) => elem.location(scale),
115114
CosmicElement::Zoom(elem) => elem.location(scale),
116115
#[cfg(feature = "debug")]
117116
CosmicElement::Egui(elem) => elem.location(scale),
@@ -125,7 +124,7 @@ where
125124
CosmicElement::Dnd(elem) => elem.transform(),
126125
CosmicElement::MoveGrab(elem) => elem.transform(),
127126
CosmicElement::AdditionalDamage(elem) => elem.transform(),
128-
CosmicElement::Mirror(elem) => elem.transform(),
127+
CosmicElement::Postprocess(elem) => elem.transform(),
129128
CosmicElement::Zoom(elem) => elem.transform(),
130129
#[cfg(feature = "debug")]
131130
CosmicElement::Egui(elem) => elem.transform(),
@@ -143,7 +142,7 @@ where
143142
CosmicElement::Dnd(elem) => elem.damage_since(scale, commit),
144143
CosmicElement::MoveGrab(elem) => elem.damage_since(scale, commit),
145144
CosmicElement::AdditionalDamage(elem) => elem.damage_since(scale, commit),
146-
CosmicElement::Mirror(elem) => elem.damage_since(scale, commit),
145+
CosmicElement::Postprocess(elem) => elem.damage_since(scale, commit),
147146
CosmicElement::Zoom(elem) => elem.damage_since(scale, commit),
148147
#[cfg(feature = "debug")]
149148
CosmicElement::Egui(elem) => elem.damage_since(scale, commit),
@@ -157,7 +156,7 @@ where
157156
CosmicElement::Dnd(elem) => elem.opaque_regions(scale),
158157
CosmicElement::MoveGrab(elem) => elem.opaque_regions(scale),
159158
CosmicElement::AdditionalDamage(elem) => elem.opaque_regions(scale),
160-
CosmicElement::Mirror(elem) => elem.opaque_regions(scale),
159+
CosmicElement::Postprocess(elem) => elem.opaque_regions(scale),
161160
CosmicElement::Zoom(elem) => elem.opaque_regions(scale),
162161
#[cfg(feature = "debug")]
163162
CosmicElement::Egui(elem) => elem.opaque_regions(scale),
@@ -171,7 +170,7 @@ where
171170
CosmicElement::Dnd(elem) => elem.alpha(),
172171
CosmicElement::MoveGrab(elem) => elem.alpha(),
173172
CosmicElement::AdditionalDamage(elem) => elem.alpha(),
174-
CosmicElement::Mirror(elem) => elem.alpha(),
173+
CosmicElement::Postprocess(elem) => elem.alpha(),
175174
CosmicElement::Zoom(elem) => elem.alpha(),
176175
#[cfg(feature = "debug")]
177176
CosmicElement::Egui(elem) => elem.alpha(),
@@ -185,7 +184,7 @@ where
185184
CosmicElement::Dnd(elem) => elem.kind(),
186185
CosmicElement::MoveGrab(elem) => elem.kind(),
187186
CosmicElement::AdditionalDamage(elem) => elem.kind(),
188-
CosmicElement::Mirror(elem) => elem.kind(),
187+
CosmicElement::Postprocess(elem) => elem.kind(),
189188
CosmicElement::Zoom(elem) => elem.kind(),
190189
#[cfg(feature = "debug")]
191190
CosmicElement::Egui(elem) => elem.kind(),
@@ -216,7 +215,7 @@ where
216215
CosmicElement::AdditionalDamage(elem) => {
217216
RenderElement::<R>::draw(elem, frame, src, dst, damage, opaque_regions)
218217
}
219-
CosmicElement::Mirror(elem) => {
218+
CosmicElement::Postprocess(elem) => {
220219
let glow_frame = R::glow_frame_mut(frame);
221220
RenderElement::<GlowRenderer>::draw(
222221
elem,
@@ -252,7 +251,7 @@ where
252251
CosmicElement::Dnd(elem) => elem.underlying_storage(renderer),
253252
CosmicElement::MoveGrab(elem) => elem.underlying_storage(renderer),
254253
CosmicElement::AdditionalDamage(elem) => elem.underlying_storage(renderer),
255-
CosmicElement::Mirror(elem) => {
254+
CosmicElement::Postprocess(elem) => {
256255
let glow_renderer = renderer.glow_renderer_mut();
257256
elem.underlying_storage(glow_renderer)
258257
}

0 commit comments

Comments
 (0)