Skip to content

Commit e8c8c79

Browse files
committed
drm: reduce duplicated geometry queries
1 parent 4157beb commit e8c8c79

File tree

1 file changed

+38
-28
lines changed
  • src/backend/drm/compositor

1 file changed

+38
-28
lines changed

src/backend/drm/compositor/mod.rs

+38-28
Original file line numberDiff line numberDiff line change
@@ -1879,7 +1879,8 @@ where
18791879
// This holds all elements that are visible on the output
18801880
// A element is considered visible if it intersects with the output geometry
18811881
// AND is not completely hidden behind opaque regions
1882-
let mut output_elements: Vec<(&'a E, usize)> = Vec::with_capacity(elements.len());
1882+
let mut output_elements: Vec<(&'a E, Rectangle<i32, Physical>, usize, bool)> =
1883+
Vec::with_capacity(elements.len());
18831884

18841885
for element in elements.iter() {
18851886
let element_id = element.id();
@@ -1913,19 +1914,22 @@ where
19131914
continue;
19141915
}
19151916

1916-
output_elements.push((element, element_visible_area));
1917-
1918-
let element_opaque_regions = element
1919-
.opaque_regions(output_scale)
1920-
.into_iter()
1921-
.map(|mut region| {
1922-
region.loc += element_loc;
1923-
region
1924-
})
1925-
.filter_map(|geo| geo.intersection(output_geometry))
1926-
.collect::<Vec<_>>();
1917+
let element_opaque_regions = element.opaque_regions(output_scale);
1918+
let element_is_opaque = Rectangle::from_loc_and_size(Point::default(), element_geometry.size)
1919+
.subtract_rects(element_opaque_regions.iter().copied())
1920+
.is_empty();
1921+
1922+
opaque_regions.extend(
1923+
element_opaque_regions
1924+
.into_iter()
1925+
.map(|mut region| {
1926+
region.loc += element_loc;
1927+
region
1928+
})
1929+
.filter_map(|geo| geo.intersection(output_geometry)),
1930+
);
19271931

1928-
opaque_regions.extend(element_opaque_regions);
1932+
output_elements.push((element, element_geometry, element_visible_area, element_is_opaque));
19291933
}
19301934

19311935
// This will hold the element that has been selected for direct scan-out on
@@ -1942,10 +1946,13 @@ where
19421946
let mut cursor_plane_element: Option<&'a E> = None;
19431947

19441948
let output_elements_len = output_elements.len();
1945-
for (index, (element, element_visible_area)) in output_elements.iter().enumerate() {
1949+
for (index, (element, element_geometry, element_visible_area, element_is_opaque)) in
1950+
output_elements.iter().enumerate()
1951+
{
19461952
let element_id = element.id();
1947-
let element_geometry = element.geometry(output_scale);
1953+
let element_geometry = *element_geometry;
19481954
let remaining_elements = output_elements_len - index;
1955+
let element_is_opaque = *element_is_opaque;
19491956

19501957
// Check if we found our last item, we can try to do
19511958
// direct scan-out on the primary plane
@@ -1954,7 +1961,6 @@ where
19541961
// on the primary plane, this will disable direct scan-out
19551962
// on the primary plane.
19561963
let try_assign_primary_plane = if remaining_elements == 1 && primary_plane_elements.is_empty() {
1957-
let element_is_opaque = element_is_opaque(element, output_scale);
19581964
let crtc_background_matches_clear_color =
19591965
(clear_color[0] == 0f32 && clear_color[1] == 0f32 && clear_color[2] == 0f32)
19601966
|| clear_color[3] == 0f32;
@@ -1976,6 +1982,8 @@ where
19761982
renderer,
19771983
*element,
19781984
index,
1985+
element_geometry,
1986+
element_is_opaque,
19791987
&mut element_states,
19801988
&primary_plane_elements,
19811989
output_scale,
@@ -2578,6 +2586,8 @@ where
25782586
renderer: &mut R,
25792587
element: &'a E,
25802588
element_zindex: usize,
2589+
element_geometry: Rectangle<i32, Physical>,
2590+
element_is_opaque: bool,
25812591
element_states: &mut IndexMap<
25822592
Id,
25832593
ElementState<DrmFramebuffer<<F as ExportFramebuffer<A::Buffer>>::Framebuffer>>,
@@ -2627,6 +2637,7 @@ where
26272637
renderer,
26282638
element,
26292639
element_zindex,
2640+
element_geometry,
26302641
element_states,
26312642
scale,
26322643
frame_state,
@@ -2651,6 +2662,7 @@ where
26512662
renderer,
26522663
element,
26532664
element_zindex,
2665+
element_geometry,
26542666
scale,
26552667
frame_state,
26562668
output_damage,
@@ -2669,6 +2681,8 @@ where
26692681
renderer,
26702682
element,
26712683
element_zindex,
2684+
element_geometry,
2685+
element_is_opaque,
26722686
element_states,
26732687
primary_plane_elements,
26742688
scale,
@@ -2695,6 +2709,7 @@ where
26952709
renderer: &mut R,
26962710
element: &'a E,
26972711
element_zindex: usize,
2712+
element_geometry: Rectangle<i32, Physical>,
26982713
element_states: &mut IndexMap<
26992714
Id,
27002715
ElementState<DrmFramebuffer<<F as ExportFramebuffer<A::Buffer>>::Framebuffer>>,
@@ -2713,9 +2728,9 @@ where
27132728
renderer,
27142729
element,
27152730
element_zindex,
2731+
element_geometry,
27162732
element_states,
27172733
frame_state,
2718-
scale,
27192734
output_transform,
27202735
output_geometry,
27212736
true,
@@ -2765,6 +2780,7 @@ where
27652780
renderer: &mut R,
27662781
element: &E,
27672782
element_zindex: usize,
2783+
element_geometry: Rectangle<i32, Physical>,
27682784
scale: Scale<f64>,
27692785
frame_state: &mut Frame<A, F>,
27702786
output_damage: &mut Vec<Rectangle<i32, Physical>>,
@@ -2799,7 +2815,6 @@ where
27992815
return None;
28002816
}
28012817

2802-
let element_geometry = element.geometry(scale);
28032818
let element_size = output_transform.transform_size(element_geometry.size);
28042819

28052820
// if the element is greater than the cursor size we can not
@@ -3102,12 +3117,12 @@ where
31023117
renderer: &mut R,
31033118
element: &E,
31043119
element_zindex: usize,
3120+
element_geometry: Rectangle<i32, Physical>,
31053121
element_states: &'a mut IndexMap<
31063122
Id,
31073123
ElementState<DrmFramebuffer<<F as ExportFramebuffer<A::Buffer>>::Framebuffer>>,
31083124
>,
31093125
frame_state: &mut Frame<A, F>,
3110-
scale: Scale<f64>,
31113126
output_transform: Transform,
31123127
output_geometry: Rectangle<i32, Physical>,
31133128
allow_opaque_fallback: bool,
@@ -3126,7 +3141,6 @@ where
31263141
E: RenderElement<R>,
31273142
{
31283143
let element_id = element.id();
3129-
let element_geometry = element.geometry(scale);
31303144

31313145
// We can only try to do direct scan-out for element that provide a underlying storage
31323146
let underlying_storage = element
@@ -3344,6 +3358,8 @@ where
33443358
renderer: &mut R,
33453359
element: &'a E,
33463360
element_zindex: usize,
3361+
element_geometry: Rectangle<i32, Physical>,
3362+
element_is_opaque: bool,
33473363
element_states: &mut IndexMap<
33483364
Id,
33493365
ElementState<DrmFramebuffer<<F as ExportFramebuffer<A::Buffer>>::Framebuffer>>,
@@ -3380,9 +3396,9 @@ where
33803396
renderer,
33813397
element,
33823398
element_zindex,
3399+
element_geometry,
33833400
element_states,
33843401
frame_state,
3385-
scale,
33863402
output_transform,
33873403
output_geometry,
33883404
false,
@@ -3450,7 +3466,7 @@ where
34503466
// test if the plane represents an underlay
34513467
let is_underlay = self.planes.primary.zpos.unwrap_or_default() > plane.zpos.unwrap_or_default();
34523468

3453-
if is_underlay && !(element_is_opaque(element, scale) && primary_plane_has_alpha) {
3469+
if is_underlay && !(element_is_opaque && primary_plane_has_alpha) {
34543470
trace!(
34553471
"skipping direct scan-out on underlay {:?} with zpos {:?}, element {:?} is not opaque or primary plane has no alpha channel",
34563472
plane.handle,
@@ -3807,12 +3823,6 @@ fn apply_output_transform(transform: Transform, output_transform: Transform) ->
38073823
}
38083824
}
38093825

3810-
fn element_is_opaque<E: Element>(element: &E, scale: Scale<f64>) -> bool {
3811-
let opaque_regions = element.opaque_regions(scale);
3812-
let element_geometry = Rectangle::from_loc_and_size(Point::default(), element.geometry(scale).size);
3813-
element_geometry.subtract_rects(opaque_regions).is_empty()
3814-
}
3815-
38163826
struct OwnedFramebuffer<B: Framebuffer>(Arc<B>);
38173827

38183828
impl<B: Framebuffer> PartialEq for OwnedFramebuffer<B> {

0 commit comments

Comments
 (0)