use gfx_hal::device::Device;
pub struct RenderSemaphoreBuilder {}
impl RenderSemaphoreBuilder {
pub fn new() -> Self {
return Self {};
}
pub fn build<RenderBackend: gfx_hal::Backend>(
self,
gpu: &mut super::gpu::Gpu<RenderBackend>,
) -> RenderSemaphore<RenderBackend> {
let semaphore = gpu
.internal_logical_device()
.create_semaphore()
.expect("The GPU has no memory to allocate the semaphore");
return RenderSemaphore { semaphore };
}
}
pub struct RenderSemaphore<RenderBackend: gfx_hal::Backend> {
semaphore: RenderBackend::Semaphore,
}
impl<RenderBackend: gfx_hal::Backend> RenderSemaphore<RenderBackend> {
pub fn destroy(self, gpu: &super::gpu::Gpu<RenderBackend>) {
unsafe {
gpu
.internal_logical_device()
.destroy_semaphore(self.semaphore)
}
}
}
impl<RenderBackend: gfx_hal::Backend> RenderSemaphore<RenderBackend> {
pub(super) fn internal_semaphore(&self) -> &RenderBackend::Semaphore {
return &self.semaphore;
}
pub(super) fn internal_semaphore_mut(
&mut self,
) -> &mut RenderBackend::Semaphore {
return &mut self.semaphore;
}
}
pub struct RenderSubmissionFenceBuilder {
default_render_timeout: u64,
}
impl RenderSubmissionFenceBuilder {
pub fn new() -> Self {
return Self {
default_render_timeout: 1_000_000_000,
};
}
pub fn with_render_timeout(mut self, render_timeout: u64) -> Self {
self.default_render_timeout = render_timeout;
return self;
}
pub fn build<RenderBackend: gfx_hal::Backend>(
self,
gpu: &mut super::gpu::Gpu<RenderBackend>,
) -> RenderSubmissionFence<RenderBackend> {
let fence = gpu
.internal_logical_device()
.create_fence(true)
.expect("There is not enough memory to create a fence on this device.");
return RenderSubmissionFence {
fence,
default_render_timeout: self.default_render_timeout,
};
}
}
pub struct RenderSubmissionFence<RenderBackend: gfx_hal::Backend> {
fence: RenderBackend::Fence,
default_render_timeout: u64,
}
impl<RenderBackend: gfx_hal::Backend> RenderSubmissionFence<RenderBackend> {
pub fn block_until_ready(
&mut self,
gpu: &mut super::gpu::Gpu<RenderBackend>,
render_timeout_override: Option<u64>,
) {
let timeout = match render_timeout_override {
Some(render_timeout_override) => render_timeout_override,
None => self.default_render_timeout,
};
unsafe {
gpu.internal_logical_device()
.wait_for_fence(&self.fence, timeout)
}
.expect("The GPU ran out of memory or has become detached from the current context.");
unsafe { gpu.internal_logical_device().reset_fence(&mut self.fence) }
.expect("The fence failed to reset.");
}
pub fn destroy(self, gpu: &super::gpu::Gpu<RenderBackend>) {
unsafe { gpu.internal_logical_device().destroy_fence(self.fence) }
}
}
impl<RenderBackend: gfx_hal::Backend> RenderSubmissionFence<RenderBackend> {
pub fn internal_fence(&self) -> &RenderBackend::Fence {
return &self.fence;
}
pub fn internal_fence_mut(&mut self) -> &mut RenderBackend::Fence {
return &mut self.fence;
}
}