1
0
Fork 0
forked from wry/wry

render: re-initialize buffer textures on gfx context change

This commit is contained in:
Julian Orth 2024-02-03 22:40:25 +01:00
parent 777fb010ca
commit db9c382002
2 changed files with 17 additions and 4 deletions

View file

@ -149,8 +149,15 @@ impl WlBuffer {
if self.render_ctx_version.replace(ctx_version) == ctx_version { if self.render_ctx_version.replace(ctx_version) == ctx_version {
return; return;
} }
self.texture.set(None); let had_texture = self.texture.set(None).is_some();
self.famebuffer.set(None); self.famebuffer.set(None);
self.reset_storage_after_gfx_context_change();
if had_texture {
self.update_texture_or_log();
}
}
fn reset_storage_after_gfx_context_change(&self) {
let mut storage = self.storage.borrow_mut(); let mut storage = self.storage.borrow_mut();
if let Some(storage) = &mut *storage { if let Some(storage) = &mut *storage {
if let WlBufferStorage::Shm { .. } = storage { if let WlBufferStorage::Shm { .. } = storage {
@ -167,7 +174,7 @@ impl WlBuffer {
Ok(image) => image, Ok(image) => image,
Err(e) => { Err(e) => {
log::error!( log::error!(
"Cannot re-import wl_buffer after graphics context reset: {}", "Cannot re-import wl_buffer after graphics context change: {}",
ErrorFmt(e) ErrorFmt(e)
); );
return; return;
@ -177,7 +184,13 @@ impl WlBuffer {
} }
} }
pub fn update_texture(&self) -> Result<(), WlBufferError> { pub fn update_texture_or_log(&self) {
if let Err(e) = self.update_texture() {
log::warn!("Could not update texture: {}", ErrorFmt(e));
}
}
fn update_texture(&self) -> Result<(), WlBufferError> {
let storage = self.storage.borrow_mut(); let storage = self.storage.borrow_mut();
let storage = match storage.deref() { let storage = match storage.deref() {
Some(s) => s, Some(s) => s,

View file

@ -766,7 +766,7 @@ impl WlSurface {
} }
} }
if let Some(buffer) = buffer_change { if let Some(buffer) = buffer_change {
let _ = buffer.update_texture(); buffer.update_texture_or_log();
self.buffer.set(Some(buffer)); self.buffer.set(Some(buffer));
self.buf_x.fetch_add(dx); self.buf_x.fetch_add(dx);
self.buf_y.fetch_add(dy); self.buf_y.fetch_add(dy);