@ -10,10 +10,43 @@
namespace Vulkan {
class VKDevice ;
class VKExecutionContext ;
class VKFence ;
class VKResourceManager ;
class VKFenceView {
public :
VKFenceView ( ) = default ;
VKFenceView ( VKFence * const & fence ) : fence { fence } { }
VKFence * operator - > ( ) const noexcept {
return fence ;
}
operator VKFence & ( ) const noexcept {
return * fence ;
}
private :
VKFence * const & fence ;
} ;
class VKCommandBufferView {
public :
VKCommandBufferView ( ) = default ;
VKCommandBufferView ( const vk : : CommandBuffer & cmdbuf ) : cmdbuf { cmdbuf } { }
const vk : : CommandBuffer * operator - > ( ) const noexcept {
return & cmdbuf ;
}
operator vk : : CommandBuffer ( ) const noexcept {
return cmdbuf ;
}
private :
const vk : : CommandBuffer & cmdbuf ;
} ;
/// The scheduler abstracts command buffer and fence management with an interface that's able to do
/// OpenGL-like operations on Vulkan command buffers.
class VKScheduler {
@ -21,16 +54,21 @@ public:
explicit VKScheduler ( const VKDevice & device , VKResourceManager & resource_manager ) ;
~ VKScheduler ( ) ;
/// Gets the current execution context.
[[nodiscard]] VKExecutionContext GetExecutionContext ( ) const ;
/// Gets a reference to the current fence.
VKFenceView GetFence ( ) const {
return current_fence ;
}
/// Gets a reference to the current command buffer.
VKCommandBufferView GetCommandBuffer ( ) const {
return current_cmdbuf ;
}
/// Sends the current execution context to the GPU. It invalidates the current execution context
/// and returns a new one.
VKExecutionContext Flush ( vk : : Semaphore semaphore = nullptr ) ;
/// Sends the current execution context to the GPU.
void Flush ( bool release_fence = true , vk : : Semaphore semaphore = nullptr ) ;
/// Sends the current execution context to the GPU and waits for it to complete. It invalidates
/// the current execution context and returns a new one.
VKExecutionContext Finish ( vk : : Semaphore semaphore = nullptr ) ;
/// Sends the current execution context to the GPU and waits for it to complete.
void Finish ( bool release_fence = true , vk : : Semaphore semaphore = nullptr ) ;
private :
void SubmitExecution ( vk : : Semaphore semaphore ) ;
@ -44,26 +82,4 @@ private:
VKFence * next_fence = nullptr ;
} ;
class VKExecutionContext {
friend class VKScheduler ;
public :
VKExecutionContext ( ) = default ;
VKFence & GetFence ( ) const {
return * fence ;
}
vk : : CommandBuffer GetCommandBuffer ( ) const {
return cmdbuf ;
}
private :
explicit VKExecutionContext ( VKFence * fence , vk : : CommandBuffer cmdbuf )
: fence { fence } , cmdbuf { cmdbuf } { }
VKFence * fence { } ;
vk : : CommandBuffer cmdbuf ;
} ;
} // namespace Vulkan