@@ -1879,7 +1879,8 @@ where
1879
1879
// This holds all elements that are visible on the output
1880
1880
// A element is considered visible if it intersects with the output geometry
1881
1881
// 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 ( ) ) ;
1883
1884
1884
1885
for element in elements. iter ( ) {
1885
1886
let element_id = element. id ( ) ;
@@ -1913,19 +1914,22 @@ where
1913
1914
continue ;
1914
1915
}
1915
1916
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
+ ) ;
1927
1931
1928
- opaque_regions . extend ( element_opaque_regions ) ;
1932
+ output_elements . push ( ( element , element_geometry , element_visible_area , element_is_opaque ) ) ;
1929
1933
}
1930
1934
1931
1935
// This will hold the element that has been selected for direct scan-out on
@@ -1942,10 +1946,13 @@ where
1942
1946
let mut cursor_plane_element: Option < & ' a E > = None ;
1943
1947
1944
1948
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
+ {
1946
1952
let element_id = element. id ( ) ;
1947
- let element_geometry = element . geometry ( output_scale ) ;
1953
+ let element_geometry = * element_geometry ;
1948
1954
let remaining_elements = output_elements_len - index;
1955
+ let element_is_opaque = * element_is_opaque;
1949
1956
1950
1957
// Check if we found our last item, we can try to do
1951
1958
// direct scan-out on the primary plane
@@ -1954,7 +1961,6 @@ where
1954
1961
// on the primary plane, this will disable direct scan-out
1955
1962
// on the primary plane.
1956
1963
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) ;
1958
1964
let crtc_background_matches_clear_color =
1959
1965
( clear_color[ 0 ] == 0f32 && clear_color[ 1 ] == 0f32 && clear_color[ 2 ] == 0f32 )
1960
1966
|| clear_color[ 3 ] == 0f32 ;
@@ -1976,6 +1982,8 @@ where
1976
1982
renderer,
1977
1983
* element,
1978
1984
index,
1985
+ element_geometry,
1986
+ element_is_opaque,
1979
1987
& mut element_states,
1980
1988
& primary_plane_elements,
1981
1989
output_scale,
@@ -2578,6 +2586,8 @@ where
2578
2586
renderer : & mut R ,
2579
2587
element : & ' a E ,
2580
2588
element_zindex : usize ,
2589
+ element_geometry : Rectangle < i32 , Physical > ,
2590
+ element_is_opaque : bool ,
2581
2591
element_states : & mut IndexMap <
2582
2592
Id ,
2583
2593
ElementState < DrmFramebuffer < <F as ExportFramebuffer < A :: Buffer > >:: Framebuffer > > ,
@@ -2627,6 +2637,7 @@ where
2627
2637
renderer,
2628
2638
element,
2629
2639
element_zindex,
2640
+ element_geometry,
2630
2641
element_states,
2631
2642
scale,
2632
2643
frame_state,
@@ -2651,6 +2662,7 @@ where
2651
2662
renderer,
2652
2663
element,
2653
2664
element_zindex,
2665
+ element_geometry,
2654
2666
scale,
2655
2667
frame_state,
2656
2668
output_damage,
@@ -2669,6 +2681,8 @@ where
2669
2681
renderer,
2670
2682
element,
2671
2683
element_zindex,
2684
+ element_geometry,
2685
+ element_is_opaque,
2672
2686
element_states,
2673
2687
primary_plane_elements,
2674
2688
scale,
@@ -2695,6 +2709,7 @@ where
2695
2709
renderer : & mut R ,
2696
2710
element : & ' a E ,
2697
2711
element_zindex : usize ,
2712
+ element_geometry : Rectangle < i32 , Physical > ,
2698
2713
element_states : & mut IndexMap <
2699
2714
Id ,
2700
2715
ElementState < DrmFramebuffer < <F as ExportFramebuffer < A :: Buffer > >:: Framebuffer > > ,
@@ -2713,9 +2728,9 @@ where
2713
2728
renderer,
2714
2729
element,
2715
2730
element_zindex,
2731
+ element_geometry,
2716
2732
element_states,
2717
2733
frame_state,
2718
- scale,
2719
2734
output_transform,
2720
2735
output_geometry,
2721
2736
true ,
@@ -2765,6 +2780,7 @@ where
2765
2780
renderer : & mut R ,
2766
2781
element : & E ,
2767
2782
element_zindex : usize ,
2783
+ element_geometry : Rectangle < i32 , Physical > ,
2768
2784
scale : Scale < f64 > ,
2769
2785
frame_state : & mut Frame < A , F > ,
2770
2786
output_damage : & mut Vec < Rectangle < i32 , Physical > > ,
@@ -2799,7 +2815,6 @@ where
2799
2815
return None ;
2800
2816
}
2801
2817
2802
- let element_geometry = element. geometry ( scale) ;
2803
2818
let element_size = output_transform. transform_size ( element_geometry. size ) ;
2804
2819
2805
2820
// if the element is greater than the cursor size we can not
@@ -3102,12 +3117,12 @@ where
3102
3117
renderer : & mut R ,
3103
3118
element : & E ,
3104
3119
element_zindex : usize ,
3120
+ element_geometry : Rectangle < i32 , Physical > ,
3105
3121
element_states : & ' a mut IndexMap <
3106
3122
Id ,
3107
3123
ElementState < DrmFramebuffer < <F as ExportFramebuffer < A :: Buffer > >:: Framebuffer > > ,
3108
3124
> ,
3109
3125
frame_state : & mut Frame < A , F > ,
3110
- scale : Scale < f64 > ,
3111
3126
output_transform : Transform ,
3112
3127
output_geometry : Rectangle < i32 , Physical > ,
3113
3128
allow_opaque_fallback : bool ,
@@ -3126,7 +3141,6 @@ where
3126
3141
E : RenderElement < R > ,
3127
3142
{
3128
3143
let element_id = element. id ( ) ;
3129
- let element_geometry = element. geometry ( scale) ;
3130
3144
3131
3145
// We can only try to do direct scan-out for element that provide a underlying storage
3132
3146
let underlying_storage = element
@@ -3344,6 +3358,8 @@ where
3344
3358
renderer : & mut R ,
3345
3359
element : & ' a E ,
3346
3360
element_zindex : usize ,
3361
+ element_geometry : Rectangle < i32 , Physical > ,
3362
+ element_is_opaque : bool ,
3347
3363
element_states : & mut IndexMap <
3348
3364
Id ,
3349
3365
ElementState < DrmFramebuffer < <F as ExportFramebuffer < A :: Buffer > >:: Framebuffer > > ,
@@ -3380,9 +3396,9 @@ where
3380
3396
renderer,
3381
3397
element,
3382
3398
element_zindex,
3399
+ element_geometry,
3383
3400
element_states,
3384
3401
frame_state,
3385
- scale,
3386
3402
output_transform,
3387
3403
output_geometry,
3388
3404
false ,
@@ -3450,7 +3466,7 @@ where
3450
3466
// test if the plane represents an underlay
3451
3467
let is_underlay = self . planes . primary . zpos . unwrap_or_default ( ) > plane. zpos . unwrap_or_default ( ) ;
3452
3468
3453
- if is_underlay && !( element_is_opaque ( element , scale ) && primary_plane_has_alpha) {
3469
+ if is_underlay && !( element_is_opaque && primary_plane_has_alpha) {
3454
3470
trace ! (
3455
3471
"skipping direct scan-out on underlay {:?} with zpos {:?}, element {:?} is not opaque or primary plane has no alpha channel" ,
3456
3472
plane. handle,
@@ -3807,12 +3823,6 @@ fn apply_output_transform(transform: Transform, output_transform: Transform) ->
3807
3823
}
3808
3824
}
3809
3825
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
-
3816
3826
struct OwnedFramebuffer < B : Framebuffer > ( Arc < B > ) ;
3817
3827
3818
3828
impl < B : Framebuffer > PartialEq for OwnedFramebuffer < B > {
0 commit comments