1
0
Fork 0
forked from wry/wry

metal: use blend buffer if possible

This commit is contained in:
Julian Orth 2025-02-21 12:22:28 +01:00
parent a7cb2ee42a
commit 81d564dcb6
3 changed files with 16 additions and 4 deletions

View file

@ -749,7 +749,7 @@ impl MetalConnector {
ReleaseSync::Explicit, ReleaseSync::Explicit,
&latched.pass, &latched.pass,
&latched.damage, &latched.damage,
None, buffer.blend_buffer.as_ref(),
) )
.map_err(MetalError::RenderFrame)?; .map_err(MetalError::RenderFrame)?;
sync_file = buffer.copy_to_dev(sf)?; sync_file = buffer.copy_to_dev(sf)?;

View file

@ -18,8 +18,8 @@ use {
edid::{CtaDataBlock, Descriptor, EdidExtension}, edid::{CtaDataBlock, Descriptor, EdidExtension},
format::{ARGB8888, Format, XRGB8888}, format::{ARGB8888, Format, XRGB8888},
gfx_api::{ gfx_api::{
AcquireSync, GfxContext, GfxFramebuffer, GfxTexture, ReleaseSync, SyncFile, AcquireSync, GfxBlendBuffer, GfxContext, GfxFramebuffer, GfxTexture, ReleaseSync,
needs_render_usage, SyncFile, needs_render_usage,
}, },
ifs::{ ifs::{
wl_output::OutputId, wl_output::OutputId,
@ -2607,6 +2607,15 @@ impl MetalBackend {
ctx: &MetalRenderContext, ctx: &MetalRenderContext,
cursor: bool, cursor: bool,
) -> Result<[RenderBuffer; N], MetalError> { ) -> Result<[RenderBuffer; N], MetalError> {
let mut blend_buffer = None;
if !cursor {
match ctx.gfx.acquire_blend_buffer(width, height) {
Ok(bb) => blend_buffer = Some(bb),
Err(e) => {
log::warn!("Could not create blend buffer: {}", ErrorFmt(e));
}
}
}
let mut damage_queue = ArrayVec::from(DamageQueue::new::<N>()); let mut damage_queue = ArrayVec::from(DamageQueue::new::<N>());
let mut create = || { let mut create = || {
self.create_scanout_buffer( self.create_scanout_buffer(
@ -2618,6 +2627,7 @@ impl MetalBackend {
ctx, ctx,
cursor, cursor,
damage_queue.pop().unwrap(), damage_queue.pop().unwrap(),
blend_buffer.clone(),
) )
}; };
let mut array = ArrayVec::<_, N>::new(); let mut array = ArrayVec::<_, N>::new();
@ -2640,6 +2650,7 @@ impl MetalBackend {
render_ctx: &MetalRenderContext, render_ctx: &MetalRenderContext,
cursor: bool, cursor: bool,
damage_queue: DamageQueue, damage_queue: DamageQueue,
blend_buffer: Option<Rc<dyn GfxBlendBuffer>>,
) -> Result<RenderBuffer, MetalError> { ) -> Result<RenderBuffer, MetalError> {
let ctx = dev.ctx.get(); let ctx = dev.ctx.get();
let dev_gfx_formats = ctx.gfx.formats(); let dev_gfx_formats = ctx.gfx.formats();
@ -2771,6 +2782,7 @@ impl MetalBackend {
damage_queue, damage_queue,
dev_bo, dev_bo,
_render_bo: render_bo, _render_bo: render_bo,
blend_buffer,
dev_fb, dev_fb,
dev_tex, dev_tex,
render_tex, render_tex,
@ -2996,6 +3008,7 @@ pub struct RenderBuffer {
pub damage_queue: DamageQueue, pub damage_queue: DamageQueue,
pub dev_bo: GbmBo, pub dev_bo: GbmBo,
pub _render_bo: Option<GbmBo>, pub _render_bo: Option<GbmBo>,
pub blend_buffer: Option<Rc<dyn GfxBlendBuffer>>,
// ctx = dev // ctx = dev
// buffer location = dev // buffer location = dev
pub dev_fb: Rc<dyn GfxFramebuffer>, pub dev_fb: Rc<dyn GfxFramebuffer>,

View file

@ -714,7 +714,6 @@ pub trait GfxContext: Debug {
Rc::new(Dummy(size)) Rc::new(Dummy(size))
} }
#[expect(dead_code)]
fn acquire_blend_buffer( fn acquire_blend_buffer(
&self, &self,
width: i32, width: i32,