vk-video 0.1.0

A library for hardware video coding using Vulkan Video, with wgpu integration.
Documentation
use std::sync::Arc;

use ash::vk;

use crate::vulkan_decoder::VulkanDecoderError;

use super::Device;

pub(crate) struct Fence {
    pub(crate) fence: vk::Fence,
    device: Arc<Device>,
}

impl Fence {
    pub(crate) fn new(device: Arc<Device>, signaled: bool) -> Result<Self, VulkanDecoderError> {
        let flags = if signaled {
            vk::FenceCreateFlags::SIGNALED
        } else {
            vk::FenceCreateFlags::empty()
        };
        let create_info = vk::FenceCreateInfo::default().flags(flags);
        let fence = unsafe { device.create_fence(&create_info, None)? };

        Ok(Self { device, fence })
    }

    pub(crate) fn wait(&self, timeout: u64) -> Result<(), VulkanDecoderError> {
        unsafe { self.device.wait_for_fences(&[self.fence], true, timeout)? };
        Ok(())
    }

    pub(crate) fn reset(&self) -> Result<(), VulkanDecoderError> {
        unsafe { self.device.reset_fences(&[self.fence])? };
        Ok(())
    }

    pub(crate) fn wait_and_reset(&self, timeout: u64) -> Result<(), VulkanDecoderError> {
        self.wait(timeout)?;
        self.reset()?;

        Ok(())
    }
}

impl Drop for Fence {
    fn drop(&mut self) {
        unsafe { self.device.destroy_fence(self.fence, None) };
    }
}

impl std::ops::Deref for Fence {
    type Target = vk::Fence;

    fn deref(&self) -> &Self::Target {
        &self.fence
    }
}

pub(crate) struct Semaphore {
    pub(crate) semaphore: vk::Semaphore,
    device: Arc<Device>,
}

impl Semaphore {
    pub(crate) fn new(device: Arc<Device>) -> Result<Self, VulkanDecoderError> {
        let create_info = vk::SemaphoreCreateInfo::default();
        let semaphore = unsafe { device.create_semaphore(&create_info, None)? };

        Ok(Self { device, semaphore })
    }
}

impl Drop for Semaphore {
    fn drop(&mut self) {
        unsafe { self.device.destroy_semaphore(self.semaphore, None) };
    }
}

impl std::ops::Deref for Semaphore {
    type Target = vk::Semaphore;

    fn deref(&self) -> &Self::Target {
        &self.semaphore
    }
}