chore: smithay update
This commit is contained in:
parent
f8fae8a5b0
commit
95b27637ae
23 changed files with 336 additions and 373 deletions
|
|
@ -57,13 +57,14 @@ use super::super::data_device::get_dnd_icon;
|
|||
pub fn submit_buffer<R>(
|
||||
frame: Frame,
|
||||
renderer: &mut R,
|
||||
offscreen: Option<&mut R::Framebuffer<'_>>,
|
||||
transform: Transform,
|
||||
damage: Option<&[Rectangle<i32, Physical>]>,
|
||||
sync: SyncPoint,
|
||||
) -> Result<Option<(Frame, Vec<Rectangle<i32, BufferCoords>>)>, <R as Renderer>::Error>
|
||||
) -> Result<Option<(Frame, Vec<Rectangle<i32, BufferCoords>>)>, R::Error>
|
||||
where
|
||||
R: ExportMem,
|
||||
<R as Renderer>::Error: FromGlesError,
|
||||
R::Error: FromGlesError,
|
||||
{
|
||||
let Some(damage) = damage else {
|
||||
frame.success(
|
||||
|
|
@ -77,7 +78,8 @@ where
|
|||
};
|
||||
|
||||
let buffer = frame.buffer();
|
||||
if matches!(buffer_type(&buffer), Some(BufferType::Shm)) {
|
||||
if let Some(fb) = offscreen {
|
||||
assert!(matches!(buffer_type(&buffer), Some(BufferType::Shm)));
|
||||
let buffer_size = buffer_dimensions(&buffer).unwrap();
|
||||
if let Err(err) = with_buffer_contents_mut(&buffer, |ptr, len, data| {
|
||||
let offset = data.offset;
|
||||
|
|
@ -98,7 +100,8 @@ where
|
|||
renderer.wait(&sync)?;
|
||||
|
||||
let format = get_transparent(format).unwrap_or(format);
|
||||
let mapping = renderer.copy_framebuffer(Rectangle::from_size(buffer_size), format)?;
|
||||
let mapping =
|
||||
renderer.copy_framebuffer(fb, Rectangle::from_size(buffer_size), format)?;
|
||||
let gl_data = renderer.map_texture(&mapping)?;
|
||||
assert!((width * height * pixelsize) as usize <= gl_data.len());
|
||||
|
||||
|
|
@ -113,7 +116,7 @@ where
|
|||
}
|
||||
Ok(())
|
||||
})
|
||||
.map_err(|err| <R as Renderer>::Error::from_gles_error(GlesError::BufferAccessError(err)))
|
||||
.map_err(|err| R::Error::from_gles_error(GlesError::BufferAccessError(err)))
|
||||
.and_then(|x| x)
|
||||
{
|
||||
frame.fail(FailureReason::Unknown);
|
||||
|
|
@ -133,31 +136,51 @@ where
|
|||
)))
|
||||
}
|
||||
|
||||
pub fn render_session<F, R>(
|
||||
pub fn render_session<F, R, T>(
|
||||
renderer: &mut R,
|
||||
session: &SessionData,
|
||||
frame: Frame,
|
||||
transform: Transform,
|
||||
render_fn: F,
|
||||
) -> Result<Option<(Frame, Vec<Rectangle<i32, BufferCoords>>)>, DTError<<R as Renderer>::Error>>
|
||||
) -> Result<Option<(Frame, Vec<Rectangle<i32, BufferCoords>>)>, DTError<R::Error>>
|
||||
where
|
||||
R: ExportMem,
|
||||
<R as Renderer>::Error: FromGlesError,
|
||||
F: for<'d> FnOnce(
|
||||
R: ExportMem + Offscreen<T>,
|
||||
R::Error: FromGlesError,
|
||||
F: for<'d, 'f> FnOnce(
|
||||
&WlBuffer,
|
||||
&mut R,
|
||||
Option<&mut R::Framebuffer<'f>>,
|
||||
&'d mut OutputDamageTracker,
|
||||
usize,
|
||||
Vec<Rectangle<i32, BufferCoords>>,
|
||||
) -> Result<RenderOutputResult<'d>, DTError<<R as Renderer>::Error>>,
|
||||
) -> Result<RenderOutputResult<'d>, DTError<R::Error>>,
|
||||
{
|
||||
let mut session_damage_tracking = session.lock().unwrap();
|
||||
|
||||
let buffer = frame.buffer();
|
||||
let mut offscreen = matches!(buffer_type(&buffer), Some(BufferType::Shm))
|
||||
.then(|| {
|
||||
let size = buffer_dimensions(&buffer).ok_or(DTError::OutputNoMode(OutputNoMode))?;
|
||||
let format = with_buffer_contents(&buffer, |_, _, data| {
|
||||
shm_format_to_fourcc(data.format)
|
||||
.expect("We should be able to convert all hardcoded shm screencopy formats")
|
||||
})
|
||||
.map_err(|_| DTError::OutputNoMode(OutputNoMode))?;
|
||||
renderer
|
||||
.create_buffer(format, size)
|
||||
.map_err(DTError::Rendering)
|
||||
})
|
||||
.transpose()?;
|
||||
|
||||
let age = session_damage_tracking.age_for_buffer(&buffer);
|
||||
let mut fb = offscreen
|
||||
.as_mut()
|
||||
.map(|tex| renderer.bind(tex).map_err(DTError::Rendering))
|
||||
.transpose()?;
|
||||
let res = render_fn(
|
||||
&frame.buffer(),
|
||||
renderer,
|
||||
fb.as_mut(),
|
||||
&mut session_damage_tracking.dt,
|
||||
age,
|
||||
frame.damage(),
|
||||
|
|
@ -167,6 +190,7 @@ where
|
|||
Ok(result) => submit_buffer(
|
||||
frame,
|
||||
renderer,
|
||||
fb.as_mut(),
|
||||
transform,
|
||||
result.damage.map(|x| x.as_slice()),
|
||||
result.sync,
|
||||
|
|
@ -217,6 +241,7 @@ pub fn render_workspace_to_buffer(
|
|||
fn render_fn<'d, R>(
|
||||
buffer: &WlBuffer,
|
||||
renderer: &mut R,
|
||||
offscreen: Option<&mut R::Framebuffer<'_>>,
|
||||
dt: &'d mut OutputDamageTracker,
|
||||
mut age: usize,
|
||||
additional_damage: Vec<Rectangle<i32, BufferCoords>>,
|
||||
|
|
@ -224,18 +249,11 @@ pub fn render_workspace_to_buffer(
|
|||
common: &mut Common,
|
||||
output: &Output,
|
||||
handle: (WorkspaceHandle, usize),
|
||||
) -> Result<RenderOutputResult<'d>, DTError<<R as Renderer>::Error>>
|
||||
) -> Result<RenderOutputResult<'d>, DTError<R::Error>>
|
||||
where
|
||||
R: Renderer
|
||||
+ ImportAll
|
||||
+ ImportMem
|
||||
+ ExportMem
|
||||
+ Bind<Dmabuf>
|
||||
+ Offscreen<GlesRenderbuffer>
|
||||
+ Blit<Dmabuf>
|
||||
+ AsGlowRenderer,
|
||||
<R as Renderer>::TextureId: Send + Clone + 'static,
|
||||
<R as Renderer>::Error: FromGlesError,
|
||||
R: Renderer + ImportAll + ImportMem + ExportMem + Bind<Dmabuf> + Blit + AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
R::Error: FromGlesError,
|
||||
CosmicElement<R>: RenderElement<R>,
|
||||
CosmicMappedRenderElement<R>: RenderElement<R>,
|
||||
WorkspaceRenderElement<R>: RenderElement<R>,
|
||||
|
|
@ -273,10 +291,12 @@ pub fn render_workspace_to_buffer(
|
|||
});
|
||||
|
||||
if let Ok(dmabuf) = get_dmabuf(buffer) {
|
||||
render_workspace::<_, _, GlesRenderbuffer>(
|
||||
let mut dmabuf = dmabuf.clone();
|
||||
let mut fb = renderer.bind(&mut dmabuf).map_err(DTError::Rendering)?;
|
||||
render_workspace(
|
||||
None,
|
||||
renderer,
|
||||
dmabuf.clone(),
|
||||
&mut fb,
|
||||
dt,
|
||||
age,
|
||||
additional_damage,
|
||||
|
|
@ -291,23 +311,12 @@ pub fn render_workspace_to_buffer(
|
|||
)
|
||||
.map(|res| res.0)
|
||||
} else {
|
||||
let size = buffer_dimensions(buffer).unwrap();
|
||||
let format =
|
||||
with_buffer_contents(buffer, |_, _, data| shm_format_to_fourcc(data.format))
|
||||
.map_err(|err| {
|
||||
DTError::Rendering(<R as Renderer>::Error::from_gles_error(
|
||||
GlesError::BufferAccessError(err),
|
||||
))
|
||||
})?
|
||||
.expect("We should be able to convert all hardcoded shm screencopy formats");
|
||||
let render_buffer =
|
||||
Offscreen::<GlesRenderbuffer>::create_buffer(renderer, format, size)
|
||||
.map_err(DTError::Rendering)?;
|
||||
let target = offscreen.expect("shm buffers should have an offscreen target");
|
||||
age = 0;
|
||||
render_workspace::<_, _, GlesRenderbuffer>(
|
||||
render_workspace(
|
||||
None,
|
||||
renderer,
|
||||
render_buffer,
|
||||
target,
|
||||
dt,
|
||||
age,
|
||||
additional_damage,
|
||||
|
|
@ -359,15 +368,16 @@ pub fn render_workspace_to_buffer(
|
|||
};
|
||||
let result = match renderer {
|
||||
RendererRef::Glow(renderer) => {
|
||||
match render_session::<_, _>(
|
||||
match render_session::<_, _, GlesRenderbuffer>(
|
||||
renderer,
|
||||
session.user_data().get::<SessionData>().unwrap(),
|
||||
frame,
|
||||
transform,
|
||||
|buffer, renderer, dt, age, additional_damage| {
|
||||
|buffer, renderer, offscreen, dt, age, additional_damage| {
|
||||
render_fn(
|
||||
buffer,
|
||||
renderer,
|
||||
offscreen,
|
||||
dt,
|
||||
age,
|
||||
additional_damage,
|
||||
|
|
@ -386,15 +396,16 @@ pub fn render_workspace_to_buffer(
|
|||
}
|
||||
}
|
||||
RendererRef::GlMulti(mut renderer) => {
|
||||
match render_session::<_, _>(
|
||||
match render_session::<_, _, GlesRenderbuffer>(
|
||||
&mut renderer,
|
||||
session.user_data().get::<SessionData>().unwrap(),
|
||||
frame,
|
||||
transform,
|
||||
|buffer, renderer, dt, age, additional_damage| {
|
||||
|buffer, renderer, offscreen, dt, age, additional_damage| {
|
||||
render_fn(
|
||||
buffer,
|
||||
renderer,
|
||||
offscreen,
|
||||
dt,
|
||||
age,
|
||||
additional_damage,
|
||||
|
|
@ -458,25 +469,19 @@ pub fn render_window_to_buffer(
|
|||
fn render_fn<'d, R>(
|
||||
buffer: &WlBuffer,
|
||||
renderer: &mut R,
|
||||
offscreen: Option<&mut R::Framebuffer<'_>>,
|
||||
dt: &'d mut OutputDamageTracker,
|
||||
mut age: usize,
|
||||
age: usize,
|
||||
additional_damage: Vec<Rectangle<i32, BufferCoords>>,
|
||||
draw_cursor: bool,
|
||||
common: &mut Common,
|
||||
window: &CosmicSurface,
|
||||
geometry: Rectangle<i32, Logical>,
|
||||
) -> Result<RenderOutputResult<'d>, DTError<<R as Renderer>::Error>>
|
||||
) -> Result<RenderOutputResult<'d>, DTError<R::Error>>
|
||||
where
|
||||
R: Renderer
|
||||
+ ImportAll
|
||||
+ ImportMem
|
||||
+ ExportMem
|
||||
+ Bind<Dmabuf>
|
||||
+ Offscreen<GlesRenderbuffer>
|
||||
+ Blit<Dmabuf>
|
||||
+ AsGlowRenderer,
|
||||
<R as Renderer>::TextureId: Send + Clone + 'static,
|
||||
<R as Renderer>::Error: FromGlesError,
|
||||
R: Renderer + ImportAll + ImportMem + ExportMem + Bind<Dmabuf> + Blit + AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
R::Error: FromGlesError,
|
||||
CosmicElement<R>: RenderElement<R>,
|
||||
CosmicMappedRenderElement<R>: RenderElement<R>,
|
||||
{
|
||||
|
|
@ -557,25 +562,15 @@ pub fn render_window_to_buffer(
|
|||
}
|
||||
|
||||
if let Ok(dmabuf) = get_dmabuf(buffer) {
|
||||
renderer.bind(dmabuf.clone()).map_err(DTError::Rendering)?;
|
||||
let mut dmabuf_clone = dmabuf.clone();
|
||||
let mut fb = renderer
|
||||
.bind(&mut dmabuf_clone)
|
||||
.map_err(DTError::Rendering)?;
|
||||
dt.render_output(renderer, &mut fb, age, &elements, Color32F::TRANSPARENT)
|
||||
} else {
|
||||
let size = buffer_dimensions(buffer).unwrap();
|
||||
let format =
|
||||
with_buffer_contents(buffer, |_, _, data| shm_format_to_fourcc(data.format))
|
||||
.map_err(|err| {
|
||||
DTError::Rendering(<R as Renderer>::Error::from_gles_error(
|
||||
GlesError::BufferAccessError(err),
|
||||
))
|
||||
})?
|
||||
.expect("We should be able to convert all hardcoded shm screencopy formats");
|
||||
let render_buffer =
|
||||
Offscreen::<GlesRenderbuffer>::create_buffer(renderer, format, size)
|
||||
.map_err(DTError::Rendering)?;
|
||||
age = 0;
|
||||
renderer.bind(render_buffer).map_err(DTError::Rendering)?;
|
||||
let fb = offscreen.expect("shm buffer should have an offscreen target");
|
||||
dt.render_output(renderer, fb, 0, &elements, Color32F::TRANSPARENT)
|
||||
}
|
||||
|
||||
dt.render_output(renderer, age, &elements, Color32F::TRANSPARENT)
|
||||
}
|
||||
|
||||
let common = &mut state.common;
|
||||
|
|
@ -607,15 +602,16 @@ pub fn render_window_to_buffer(
|
|||
}
|
||||
};
|
||||
let result = match renderer {
|
||||
RendererRef::Glow(renderer) => match render_session::<_, _>(
|
||||
RendererRef::Glow(renderer) => match render_session::<_, _, GlesRenderbuffer>(
|
||||
renderer,
|
||||
session.user_data().get::<SessionData>().unwrap(),
|
||||
frame,
|
||||
Transform::Normal,
|
||||
|buffer, renderer, dt, age, additional_damage| {
|
||||
|buffer, renderer, offscreen, dt, age, additional_damage| {
|
||||
render_fn(
|
||||
buffer,
|
||||
renderer,
|
||||
offscreen,
|
||||
dt,
|
||||
age,
|
||||
additional_damage,
|
||||
|
|
@ -632,15 +628,16 @@ pub fn render_window_to_buffer(
|
|||
None
|
||||
}
|
||||
},
|
||||
RendererRef::GlMulti(mut renderer) => match render_session::<_, _>(
|
||||
RendererRef::GlMulti(mut renderer) => match render_session::<_, _, GlesRenderbuffer>(
|
||||
&mut renderer,
|
||||
session.user_data().get::<SessionData>().unwrap(),
|
||||
frame,
|
||||
Transform::Normal,
|
||||
|buffer, renderer, dt, age, additional_damage| {
|
||||
|buffer, renderer, offscreen, dt, age, additional_damage| {
|
||||
render_fn(
|
||||
buffer,
|
||||
renderer,
|
||||
offscreen,
|
||||
dt,
|
||||
age,
|
||||
additional_damage,
|
||||
|
|
@ -697,23 +694,17 @@ pub fn render_cursor_to_buffer(
|
|||
fn render_fn<'d, R>(
|
||||
buffer: &WlBuffer,
|
||||
renderer: &mut R,
|
||||
offscreen: Option<&mut R::Framebuffer<'_>>,
|
||||
dt: &'d mut OutputDamageTracker,
|
||||
mut age: usize,
|
||||
age: usize,
|
||||
additional_damage: Vec<Rectangle<i32, BufferCoords>>,
|
||||
common: &mut Common,
|
||||
seat: &Seat<State>,
|
||||
) -> Result<RenderOutputResult<'d>, DTError<<R as Renderer>::Error>>
|
||||
) -> Result<RenderOutputResult<'d>, DTError<R::Error>>
|
||||
where
|
||||
R: Renderer
|
||||
+ ImportAll
|
||||
+ ImportMem
|
||||
+ ExportMem
|
||||
+ Bind<Dmabuf>
|
||||
+ Offscreen<GlesRenderbuffer>
|
||||
+ Blit<Dmabuf>
|
||||
+ AsGlowRenderer,
|
||||
<R as Renderer>::TextureId: Send + Clone + 'static,
|
||||
<R as Renderer>::Error: FromGlesError,
|
||||
R: Renderer + ImportAll + ImportMem + ExportMem + Bind<Dmabuf> + Blit + AsGlowRenderer,
|
||||
R::TextureId: Send + Clone + 'static,
|
||||
R::Error: FromGlesError,
|
||||
CosmicElement<R>: RenderElement<R>,
|
||||
CosmicMappedRenderElement<R>: RenderElement<R>,
|
||||
{
|
||||
|
|
@ -743,25 +734,15 @@ pub fn render_cursor_to_buffer(
|
|||
);
|
||||
|
||||
if let Ok(dmabuf) = get_dmabuf(buffer) {
|
||||
renderer.bind(dmabuf.clone()).map_err(DTError::Rendering)?;
|
||||
let mut dmabuf_clone = dmabuf.clone();
|
||||
let mut fb = renderer
|
||||
.bind(&mut dmabuf_clone)
|
||||
.map_err(DTError::Rendering)?;
|
||||
dt.render_output(renderer, &mut fb, age, &elements, [0.0, 0.0, 0.0, 0.0])
|
||||
} else {
|
||||
let size = buffer_dimensions(buffer).unwrap();
|
||||
let format =
|
||||
with_buffer_contents(buffer, |_, _, data| shm_format_to_fourcc(data.format))
|
||||
.map_err(|err| {
|
||||
DTError::Rendering(<R as Renderer>::Error::from_gles_error(
|
||||
GlesError::BufferAccessError(err),
|
||||
))
|
||||
})?
|
||||
.expect("We should be able to convert all hardcoded shm screencopy formats");
|
||||
let render_buffer =
|
||||
Offscreen::<GlesRenderbuffer>::create_buffer(renderer, format, size)
|
||||
.map_err(DTError::Rendering)?;
|
||||
age = 0;
|
||||
renderer.bind(render_buffer).map_err(DTError::Rendering)?;
|
||||
let fb = offscreen.expect("shm buffers should have offscreen target");
|
||||
dt.render_output(renderer, fb, 0, &elements, [0.0, 0.0, 0.0, 0.0])
|
||||
}
|
||||
|
||||
dt.render_output(renderer, age, &elements, [0.0, 0.0, 0.0, 0.0])
|
||||
}
|
||||
|
||||
let common = &mut state.common;
|
||||
|
|
@ -775,13 +756,22 @@ pub fn render_cursor_to_buffer(
|
|||
};
|
||||
let result = match renderer {
|
||||
RendererRef::Glow(renderer) => {
|
||||
match render_session::<_, _>(
|
||||
match render_session::<_, _, GlesRenderbuffer>(
|
||||
renderer,
|
||||
session.user_data().get::<SessionData>().unwrap(),
|
||||
frame,
|
||||
Transform::Normal,
|
||||
|buffer, renderer, dt, age, additional_damage| {
|
||||
render_fn(buffer, renderer, dt, age, additional_damage, common, seat)
|
||||
|buffer, renderer, offscreen, dt, age, additional_damage| {
|
||||
render_fn(
|
||||
buffer,
|
||||
renderer,
|
||||
offscreen,
|
||||
dt,
|
||||
age,
|
||||
additional_damage,
|
||||
common,
|
||||
seat,
|
||||
)
|
||||
},
|
||||
) {
|
||||
Ok(frame) => frame,
|
||||
|
|
@ -792,13 +782,22 @@ pub fn render_cursor_to_buffer(
|
|||
}
|
||||
}
|
||||
RendererRef::GlMulti(mut renderer) => {
|
||||
match render_session::<_, _>(
|
||||
match render_session::<_, _, GlesRenderbuffer>(
|
||||
&mut renderer,
|
||||
session.user_data().get::<SessionData>().unwrap(),
|
||||
frame,
|
||||
Transform::Normal,
|
||||
|buffer, renderer, dt, age, additional_damage| {
|
||||
render_fn(buffer, renderer, dt, age, additional_damage, common, seat)
|
||||
|buffer, renderer, offscreen, dt, age, additional_damage| {
|
||||
render_fn(
|
||||
buffer,
|
||||
renderer,
|
||||
offscreen,
|
||||
dt,
|
||||
age,
|
||||
additional_damage,
|
||||
common,
|
||||
seat,
|
||||
)
|
||||
},
|
||||
) {
|
||||
Ok(frame) => frame,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue