1
0
Fork 0
forked from wry/wry

vulkan: move fence to core

This commit is contained in:
Julian Orth 2026-03-02 10:45:14 +01:00
parent 7e6facf4e3
commit 3ecee1b17f
9 changed files with 89 additions and 91 deletions

View file

@ -9,7 +9,6 @@ mod descriptor_buffer;
mod device;
mod dmabuf_buffer;
mod eotfs;
mod fence;
mod format;
mod gpu_alloc_ash;
mod image;
@ -35,7 +34,8 @@ use {
STAGING_DOWNLOAD, STAGING_UPLOAD, ShmGfxTexture, StagingBufferUsecase,
},
gfx_apis::vulkan::{
image::VulkanImageMemory, instance::VulkanInstance, renderer::VulkanRenderer,
device::VulkanDevice, image::VulkanImageMemory, instance::VulkanInstance,
renderer::VulkanRenderer,
},
io_uring::IoUring,
pr_caps::PrCapsThread,
@ -46,7 +46,7 @@ use {
drm::{Drm, DrmError, syncobj::SyncobjCtx},
gbm::GbmError,
},
vulkan_core::VulkanCoreError,
vulkan_core::{self, VulkanCoreError},
},
ahash::AHashMap,
ash::vk,
@ -73,8 +73,6 @@ pub enum VulkanError {
CreateDevice(#[source] vk::Result),
#[error("Could not create a semaphore")]
CreateSemaphore(#[source] vk::Result),
#[error("Could not create a fence")]
CreateFence(#[source] vk::Result),
#[error("Could not create the buffer")]
CreateBuffer(#[source] vk::Result),
#[error("Could not create a shader module")]
@ -157,8 +155,6 @@ pub enum VulkanError {
IoctlExportSyncFile(#[source] OsError),
#[error("Could not import a sync file into a semaphore")]
ImportSyncFile(#[source] vk::Result),
#[error("Could not export a sync file from a semaphore")]
ExportSyncFile(#[source] vk::Result),
#[error("Could not fetch the render node of the device")]
FetchRenderNode(#[source] DrmError),
#[error("Device has no render node")]
@ -215,6 +211,8 @@ pub enum VulkanError {
DmaBufBufferOffsetAlignment,
}
type VulkanFence = vulkan_core::fence::VulkanFence<VulkanDevice>;
impl From<VulkanError> for GfxError {
fn from(value: VulkanError) -> Self {
Self(Box::new(value))

View file

@ -14,7 +14,8 @@ use {
gbm::{GBM_BO_USE_RENDERING, GbmDevice},
},
vulkan_core::{
ApiVersionDisplay, Extensions, VULKAN_API_VERSION, map_extension_properties,
ApiVersionDisplay, Extensions, VULKAN_API_VERSION, device::VulkanDeviceInf,
map_extension_properties,
},
},
ahash::AHashMap,
@ -639,3 +640,13 @@ fn log_device(
}
}
}
impl VulkanDeviceInf for VulkanDevice {
fn device(&self) -> &Device {
&self.device
}
fn external_fence_fd(&self) -> &external_fence_fd::Device {
&self.external_fence_fd
}
}

View file

@ -1,56 +0,0 @@
use {
crate::{
gfx_api::SyncFile,
gfx_apis::vulkan::{VulkanError, device::VulkanDevice},
},
ash::vk::{
ExportFenceCreateInfo, ExternalFenceHandleTypeFlags, Fence, FenceCreateInfo,
FenceGetFdInfoKHR,
},
std::rc::Rc,
uapi::OwnedFd,
};
pub struct VulkanFence {
pub(super) device: Rc<VulkanDevice>,
pub(super) fence: Fence,
}
impl Drop for VulkanFence {
fn drop(&mut self) {
unsafe {
self.device.device.destroy_fence(self.fence, None);
}
}
}
impl VulkanDevice {
pub fn create_fence(self: &Rc<Self>) -> Result<Rc<VulkanFence>, VulkanError> {
let fence = {
let mut export_info = ExportFenceCreateInfo::default()
.handle_types(ExternalFenceHandleTypeFlags::SYNC_FD);
let create_info = FenceCreateInfo::default().push_next(&mut export_info);
let fence = unsafe { self.device.create_fence(&create_info, None) };
fence.map_err(VulkanError::CreateFence)?
};
Ok(Rc::new(VulkanFence {
device: self.clone(),
fence,
}))
}
}
impl VulkanFence {
pub fn export_sync_file(&self) -> Result<Option<SyncFile>, VulkanError> {
let info = FenceGetFdInfoKHR::default()
.fence(self.fence)
.handle_type(ExternalFenceHandleTypeFlags::SYNC_FD);
let res = unsafe { self.device.external_fence_fd.get_fence_fd(&info) };
let fd = res.map_err(VulkanError::ExportSyncFile)?;
if fd == -1 {
Ok(None)
} else {
Ok(Some(SyncFile(Rc::new(OwnedFd::new(fd)))))
}
}
}

View file

@ -12,7 +12,7 @@ use {
GfxFormat, GfxTexture, GfxWriteModifier, ReleaseSync, SyncFile,
},
gfx_apis::vulkan::{
VulkanError,
VulkanError, VulkanFence,
allocator::{VulkanAllocator, VulkanThreadedAllocator},
buffer_cache::{GenericBufferWriter, VulkanBuffer, VulkanBufferCache},
command::{VulkanCommandBuffer, VulkanCommandPool},
@ -20,7 +20,6 @@ use {
descriptor_buffer::VulkanDescriptorBufferWriter,
device::VulkanDevice,
eotfs::{EOTF_LINEAR, EotfExt, VulkanEotf},
fence::VulkanFence,
image::{QueueFamily, QueueState, QueueTransfer, VulkanImage, VulkanImageMemory},
pipeline::{PipelineCreateInfo, VulkanPipeline},
sampler::VulkanSampler,
@ -40,6 +39,7 @@ use {
stack::Stack,
},
video::dmabuf::{DMA_BUF_SYNC_READ, DMA_BUF_SYNC_WRITE, dma_buf_export_sync_file},
vulkan_core::fence::VulkanDeviceFenceExt,
},
ahash::AHashMap,
arrayvec::ArrayVec,

View file

@ -4,10 +4,9 @@ use {
format::Format,
gfx_api::SyncFile,
gfx_apis::vulkan::{
VulkanError,
VulkanError, VulkanFence,
allocator::VulkanAllocation,
command::VulkanCommandBuffer,
fence::VulkanFence,
image::{QueueFamily, QueueState, VulkanImage, VulkanImageMemory},
renderer::{VulkanRenderer, image_barrier},
staging::VulkanStagingBuffer,
@ -15,6 +14,7 @@ use {
},
rect::Rect,
utils::errorfmt::ErrorFmt,
vulkan_core::fence::VulkanDeviceFenceExt,
},
ash::vk::{
AccessFlags2, Buffer, BufferImageCopy2, BufferMemoryBarrier2, CommandBufferBeginInfo,

View file

@ -11,10 +11,9 @@ use {
AsyncShmGfxTextureCallback, PendingShmTransfer, ShmMemory, ShmMemoryBacking, SyncFile,
},
gfx_apis::vulkan::{
VulkanError,
VulkanError, VulkanFence,
command::VulkanCommandBuffer,
dmabuf_buffer::{TRANSFER_QUEUE_BUFFER_ALIGNMENT, VulkanDmabufBuffer},
fence::VulkanFence,
image::{QueueFamily, QueueState, QueueTransfer, VulkanImage, VulkanImageMemory},
renderer::image_barrier,
shm_image::VulkanShmImage,
@ -22,6 +21,7 @@ use {
},
rect::{Rect, Region},
utils::{clonecell::CloneCell, errorfmt::ErrorFmt},
vulkan_core::fence::VulkanDeviceFenceExt,
},
arrayvec::ArrayVec,
ash::vk::{