🔒 Repository is read-only – file editing is disabled.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
use drm_fourcc::{DrmFourcc, DrmModifier};
use thiserror::Error;
use crate::backend::{
allocator::dmabuf::{DmabufMappingFailed, DmabufSyncFailed},
SwapBuffersError,
};
#[cfg(feature = "wayland_frontend")]
use wayland_server::protocol::wl_shm;
/// Error returned during rendering using pixman
#[derive(Debug, Error)]
pub enum PixmanError {
/// The given buffer has an unsupported number of planes
#[error("Unsupported number of planes")]
UnsupportedNumberOfPlanes,
/// The given buffer has an unsupported pixel format
#[error("Unsupported pixel format: {0:?}")]
UnsupportedPixelFormat(DrmFourcc),
/// The given buffer has an unsupported modifier
#[error("Unsupported modifier: {0:?}")]
UnsupportedModifier(DrmModifier),
/// The given wl buffer has an unsupported pixel format
#[error("Unsupported wl_shm format: {0:?}")]
#[cfg(feature = "wayland_frontend")]
UnsupportedWlPixelFormat(wl_shm::Format),
/// The given buffer is incomplete
#[error("Incomplete buffer {expected} < {actual}")]
IncompleteBuffer {
/// Expected len of the buffer
expected: usize,
/// Actual len of the buffer
actual: usize,
},
/// The given buffer was not accessible
#[error("Error accessing the buffer ({0:?})")]
#[cfg(feature = "wayland_frontend")]
BufferAccessError(#[from] crate::wayland::shm::BufferAccessError),
/// Failed to import the given buffer
#[error("Import failed")]
ImportFailed,
/// The underlying buffer has been destroyed
#[error("The underlying buffer has been destroyed")]
BufferDestroyed,
/// Mapping the buffer failed
#[error("Mapping the buffer failed: {0}")]
Map(#[from] DmabufMappingFailed),
/// Synchronizing access to the buffer failed
#[error("Synchronizing buffer failed: {0}")]
Sync(#[from] DmabufSyncFailed),
/// The requested operation failed
#[error("The requested operation failed")]
Failed(#[from] pixman::OperationFailed),
/// No target is currently bound
#[error("No target is currently bound")]
NoTargetBound,
/// The requested operation is not supported
#[error("The requested operation is not supported")]
Unsupported,
/// Blocking for a synchronization primitive failed
#[error("Blocking for a synchronization primitive got interrupted")]
SyncInterrupted,
}
impl From<PixmanError> for SwapBuffersError {
#[inline]
fn from(value: PixmanError) -> Self {
match value {
x @ PixmanError::SyncInterrupted => SwapBuffersError::TemporaryFailure(Box::new(x)),
x => SwapBuffersError::ContextLost(Box::new(x)),
}
}
}