metal: use blend buffer if possible
This commit is contained in:
parent
a7cb2ee42a
commit
81d564dcb6
3 changed files with 16 additions and 4 deletions
|
|
@ -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)?;
|
||||||
|
|
|
||||||
|
|
@ -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>,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue