vulkan: use sync objects if possible
This commit is contained in:
parent
2ac3519f2d
commit
3d3132fe39
23 changed files with 535 additions and 86 deletions
|
|
@ -1,6 +1,7 @@
|
|||
use {
|
||||
crate::{
|
||||
allocator::BufferObject,
|
||||
eventfd_cache::EventfdCache,
|
||||
format::XRGB8888,
|
||||
gfx_apis::vulkan::{
|
||||
VulkanError,
|
||||
|
|
@ -14,8 +15,8 @@ use {
|
|||
gbm::{GBM_BO_USE_RENDERING, GbmDevice},
|
||||
},
|
||||
vulkan_core::{
|
||||
ApiVersionDisplay, Extensions, VULKAN_API_VERSION, device::VulkanDeviceInf,
|
||||
map_extension_properties,
|
||||
ApiVersionDisplay, Extensions, VULKAN_API_VERSION, VulkanCoreInstance,
|
||||
device::VulkanDeviceInf, map_extension_properties,
|
||||
},
|
||||
},
|
||||
ahash::AHashMap,
|
||||
|
|
@ -64,6 +65,7 @@ pub struct VulkanDevice {
|
|||
pub(super) sync_ctx: Rc<SyncobjCtx>,
|
||||
pub(super) instance: Rc<VulkanInstance>,
|
||||
pub(super) device: Arc<Device>,
|
||||
pub(super) eventfd_cache: Rc<EventfdCache>,
|
||||
pub(super) external_memory_fd: external_memory_fd::Device,
|
||||
pub(super) external_semaphore_fd: external_semaphore_fd::Device,
|
||||
pub(super) external_fence_fd: external_fence_fd::Device,
|
||||
|
|
@ -86,6 +88,7 @@ pub struct VulkanDevice {
|
|||
pub(super) uniform_buffer_descriptor_size: usize,
|
||||
pub(super) lost: Cell<bool>,
|
||||
pub(super) fast_ram_access: bool,
|
||||
pub(super) supports_timeline_opaque_export: bool,
|
||||
}
|
||||
|
||||
impl Drop for VulkanDevice {
|
||||
|
|
@ -338,6 +341,7 @@ impl VulkanInstance {
|
|||
pub fn create_device(
|
||||
self: &Rc<Self>,
|
||||
drm: &Drm,
|
||||
eventfd_cache: &Rc<EventfdCache>,
|
||||
mut high_priority: bool,
|
||||
software: bool,
|
||||
) -> Result<Rc<VulkanDevice>, VulkanError> {
|
||||
|
|
@ -380,6 +384,9 @@ impl VulkanInstance {
|
|||
}
|
||||
transfer_granularity_mask = (width_mask, height_mask);
|
||||
}
|
||||
let features = self.get_features(phy_dev);
|
||||
let supports_timeline_opaque_export =
|
||||
self.supports_timeline_opaque_export(phy_dev, &features);
|
||||
if !self.supports_semaphore_import(phy_dev) {
|
||||
return Err(VulkanError::SyncFileImport);
|
||||
}
|
||||
|
|
@ -390,8 +397,8 @@ impl VulkanInstance {
|
|||
if supports_descriptor_buffer {
|
||||
enabled_extensions.push(descriptor_buffer::NAME.as_ptr());
|
||||
}
|
||||
let mut semaphore_features =
|
||||
PhysicalDeviceTimelineSemaphoreFeatures::default().timeline_semaphore(true);
|
||||
let mut semaphore_features = PhysicalDeviceTimelineSemaphoreFeatures::default()
|
||||
.timeline_semaphore(supports_timeline_opaque_export);
|
||||
let mut synchronization2_features =
|
||||
PhysicalDeviceSynchronization2Features::default().synchronization2(true);
|
||||
let mut dynamic_rendering_features =
|
||||
|
|
@ -558,6 +565,7 @@ impl VulkanInstance {
|
|||
gbm: Rc::new(gbm),
|
||||
instance: self.clone(),
|
||||
device: Arc::new(device),
|
||||
eventfd_cache: eventfd_cache.clone(),
|
||||
external_memory_fd,
|
||||
external_semaphore_fd,
|
||||
external_fence_fd,
|
||||
|
|
@ -581,6 +589,7 @@ impl VulkanInstance {
|
|||
uniform_buffer_descriptor_size,
|
||||
lost: Cell::new(false),
|
||||
fast_ram_access,
|
||||
supports_timeline_opaque_export,
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
|
@ -642,6 +651,10 @@ fn log_device(
|
|||
}
|
||||
|
||||
impl VulkanDeviceInf for VulkanDevice {
|
||||
fn instance(&self) -> &VulkanCoreInstance {
|
||||
&self.instance
|
||||
}
|
||||
|
||||
fn device(&self) -> &Device {
|
||||
&self.device
|
||||
}
|
||||
|
|
@ -649,4 +662,20 @@ impl VulkanDeviceInf for VulkanDevice {
|
|||
fn external_fence_fd(&self) -> &external_fence_fd::Device {
|
||||
&self.external_fence_fd
|
||||
}
|
||||
|
||||
fn external_semaphore_fd(&self) -> &external_semaphore_fd::Device {
|
||||
&self.external_semaphore_fd
|
||||
}
|
||||
|
||||
fn supports_timeline_opaque_export(&self) -> bool {
|
||||
self.supports_timeline_opaque_export
|
||||
}
|
||||
|
||||
fn sync_ctx(&self) -> &Rc<SyncobjCtx> {
|
||||
&self.sync_ctx
|
||||
}
|
||||
|
||||
fn eventfd_cache(&self) -> &Rc<EventfdCache> {
|
||||
&self.eventfd_cache
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ use {
|
|||
GfxFormat, GfxTexture, GfxWriteModifier, ReleaseSync,
|
||||
},
|
||||
gfx_apis::vulkan::{
|
||||
VulkanError, VulkanSync,
|
||||
VulkanError, VulkanSync, VulkanTimelineSemaphore,
|
||||
allocator::{VulkanAllocator, VulkanThreadedAllocator},
|
||||
buffer_cache::{GenericBufferWriter, VulkanBuffer, VulkanBufferCache},
|
||||
command::{VulkanCommandBuffer, VulkanCommandPool},
|
||||
|
|
@ -39,7 +39,9 @@ use {
|
|||
stack::Stack,
|
||||
},
|
||||
video::dmabuf::{DMA_BUF_SYNC_READ, DMA_BUF_SYNC_WRITE, dma_buf_export_sync_file},
|
||||
vulkan_core::sync::VulkanDeviceSyncExt,
|
||||
vulkan_core::{
|
||||
sync::VulkanDeviceSyncExt, timeline_semaphore::VulkanDeviceTimelineSemaphoreExt,
|
||||
},
|
||||
},
|
||||
ahash::AHashMap,
|
||||
arrayvec::ArrayVec,
|
||||
|
|
@ -113,6 +115,8 @@ pub struct VulkanRenderer {
|
|||
pub(super) blend_buffers: RefCell<AHashMap<(u32, u32), Weak<VulkanImage>>>,
|
||||
pub(super) shader_buffer_cache: Rc<VulkanBufferCache>,
|
||||
pub(super) uniform_buffer_cache: Rc<VulkanBufferCache>,
|
||||
pub(super) render_tls: Option<Rc<VulkanTimelineSemaphore>>,
|
||||
pub(super) transfer_tls: Option<Rc<VulkanTimelineSemaphore>>,
|
||||
}
|
||||
|
||||
pub(super) struct CachedCommandBuffers {
|
||||
|
|
@ -407,6 +411,8 @@ impl VulkanDevice {
|
|||
blend_buffers: Default::default(),
|
||||
shader_buffer_cache,
|
||||
uniform_buffer_cache,
|
||||
render_tls: self.create_timeline_semaphore_or_log(),
|
||||
transfer_tls: self.create_timeline_semaphore_or_log(),
|
||||
});
|
||||
Ok(render)
|
||||
}
|
||||
|
|
@ -1755,11 +1761,16 @@ impl VulkanRenderer {
|
|||
fn submit(&self, buf: CommandBuffer) -> Result<(), VulkanError> {
|
||||
zone!("submit");
|
||||
let mut memory = self.memory.borrow_mut();
|
||||
let mut semaphore_submit_info = SemaphoreSubmitInfo::default();
|
||||
let command_buffer_info = CommandBufferSubmitInfo::default().command_buffer(buf);
|
||||
let submit_info = SubmitInfo2::default()
|
||||
let mut submit_info = SubmitInfo2::default()
|
||||
.wait_semaphore_infos(&memory.wait_semaphore_infos)
|
||||
.command_buffer_infos(slice::from_ref(&command_buffer_info));
|
||||
let vulkan_sync = self.device.create_sync()?;
|
||||
let vulkan_sync = self.device.create_sync(
|
||||
self.render_tls.as_ref(),
|
||||
&mut semaphore_submit_info,
|
||||
&mut submit_info,
|
||||
)?;
|
||||
unsafe {
|
||||
self.device
|
||||
.device
|
||||
|
|
|
|||
|
|
@ -22,7 +22,8 @@ use {
|
|||
CopyImageToBufferInfo2, DependencyInfoKHR, DeviceSize, Extent3D, ImageAspectFlags,
|
||||
ImageCreateInfo, ImageLayout, ImageSubresourceLayers, ImageSubresourceRange, ImageTiling,
|
||||
ImageType, ImageUsageFlags, ImageViewCreateInfo, ImageViewType, Offset3D,
|
||||
PipelineStageFlags2, QUEUE_FAMILY_FOREIGN_EXT, SampleCountFlags, SharingMode, SubmitInfo2,
|
||||
PipelineStageFlags2, QUEUE_FAMILY_FOREIGN_EXT, SampleCountFlags, SemaphoreSubmitInfo,
|
||||
SharingMode, SubmitInfo2,
|
||||
},
|
||||
gpu_alloc::UsageFlags,
|
||||
isnt::std_1::primitive::IsntSliceExt,
|
||||
|
|
@ -269,11 +270,20 @@ impl VulkanShmImage {
|
|||
};
|
||||
let dev = &img.renderer.device.device;
|
||||
let command_buffer_info = CommandBufferSubmitInfo::default().command_buffer(cmd.buffer);
|
||||
let submit_info =
|
||||
let mut semaphore_submit_info = SemaphoreSubmitInfo::default();
|
||||
let mut submit_info =
|
||||
SubmitInfo2::default().command_buffer_infos(slice::from_ref(&command_buffer_info));
|
||||
let begin_info =
|
||||
CommandBufferBeginInfo::default().flags(CommandBufferUsageFlags::ONE_TIME_SUBMIT);
|
||||
let vulkan_sync = img.renderer.device.create_sync()?;
|
||||
let tls = match use_transfer_queue {
|
||||
true => &img.renderer.transfer_tls,
|
||||
false => &img.renderer.render_tls,
|
||||
};
|
||||
let vulkan_sync = img.renderer.device.create_sync(
|
||||
tls.as_ref(),
|
||||
&mut semaphore_submit_info,
|
||||
&mut submit_info,
|
||||
)?;
|
||||
unsafe {
|
||||
dev.begin_command_buffer(cmd.buffer, &begin_info)
|
||||
.map_err(VulkanError::BeginCommandBuffer)?;
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ use {
|
|||
ash::vk::{
|
||||
AccessFlags2, BufferImageCopy2, CommandBufferBeginInfo, CommandBufferSubmitInfo,
|
||||
CommandBufferUsageFlags, DependencyInfo, Extent3D, ImageAspectFlags, ImageLayout,
|
||||
ImageSubresourceLayers, Offset3D, PipelineStageFlags2, SubmitInfo2,
|
||||
ImageSubresourceLayers, Offset3D, PipelineStageFlags2, SemaphoreSubmitInfo, SubmitInfo2,
|
||||
},
|
||||
std::{
|
||||
cell::{Cell, RefCell, RefMut},
|
||||
|
|
@ -380,9 +380,14 @@ impl VulkanShmImage {
|
|||
CommandBufferBeginInfo::default().flags(CommandBufferUsageFlags::ONE_TIME_SUBMIT);
|
||||
let cmd = img.renderer.gfx_command_buffers.allocate()?;
|
||||
let command_buffer_info = CommandBufferSubmitInfo::default().command_buffer(cmd.buffer);
|
||||
let submit_info =
|
||||
let mut semaphore_submit_info = SemaphoreSubmitInfo::default();
|
||||
let mut submit_info =
|
||||
SubmitInfo2::default().command_buffer_infos(slice::from_ref(&command_buffer_info));
|
||||
let vulkan_sync = img.renderer.device.create_sync()?;
|
||||
let vulkan_sync = img.renderer.device.create_sync(
|
||||
img.renderer.render_tls.as_ref(),
|
||||
&mut semaphore_submit_info,
|
||||
&mut submit_info,
|
||||
)?;
|
||||
unsafe {
|
||||
dev.begin_command_buffer(cmd.buffer, &begin_info)
|
||||
.map_err(VulkanError::BeginCommandBuffer)?;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue