diff options
Diffstat (limited to 'include/api-test/vk-device.hpp')
| -rw-r--r-- | include/api-test/vk-device.hpp | 123 |
1 files changed, 62 insertions, 61 deletions
diff --git a/include/api-test/vk-device.hpp b/include/api-test/vk-device.hpp index 5b71529..fd69d60 100644 --- a/include/api-test/vk-device.hpp +++ b/include/api-test/vk-device.hpp @@ -15,11 +15,6 @@ using VmaAllocator = struct VmaAllocator_T*; class window; -struct vksemaphore { - VkSemaphore vk_semaphore = nullptr; - uint64_t value = 0U; -}; - class vkdevice { struct queue { VkQueue vk_queue; @@ -29,49 +24,63 @@ class vkdevice { }; public: - static vkdevice* init_device(const window& window); + void init(); - static void free_device(); - - static inline vkdevice* get_render_device() { + static inline vkdevice& get_render_device() { return render_device; } - handle<device_texture> create_texture(const texture_desc& desc); + handle<device_texture> create_texture(const texture_desc& desc); + + handle<device_buffer> create_buffer(const buffer_desc& desc); - handle<device_buffer> create_buffer(const buffer_desc& desc); + handle<device_pipeline> create_pipeline(const pipeline_desc& desc); - handle<device_pipeline> create_pipeline(const pipeline_desc& desc); + handle<device_surface> create_surface(const surface_desc& desc); - vksemaphore create_semaphore(); + handle<device_semaphore> create_semaphore(const semaphore_desc& desc); - void destroy_texture(const device_texture& texture); - void destroy_texture(handle<device_texture> handle); + void destroy_texture(const device_texture& texture); + void destroy_texture(handle<device_texture> handle); - void destroy_buffer(const device_buffer& buffer); - void destroy_buffer(handle<device_buffer> handle); + void destroy_buffer(const device_buffer& buffer); + void destroy_buffer(handle<device_buffer> handle); - void destroy_pipeline(const device_pipeline& pipeline); - void destroy_pipeline(handle<device_pipeline> handle); + void destroy_pipeline(const device_pipeline& pipeline); + void destroy_pipeline(handle<device_pipeline> handle); + + void destroy_semaphore(const device_semaphore& semaphore); + void destroy_semaphore(handle<device_semaphore> handle); + + void destroy_surface(const device_surface& surface); + void destroy_surface(handle<device_surface> handle); template<typename cmd_buf_type> void allocate_command_buffers(cmd_buf_type* buffers, size_t count, QueueType queue_type) { allocate_command_buffers(static_cast<command_buffer*>(buffers), count, queue_type); } - inline device_texture& get_texture(handle<device_texture> handle) { + [[nodiscard]] inline device_texture& get_texture(handle<device_texture> handle) { return textures[handle.id]; } - inline const device_buffer& get_buffer(handle<device_buffer> handle) { + [[nodiscard]] inline const device_buffer& get_buffer(handle<device_buffer> handle) const { return buffers[handle.id]; } - inline const device_pipeline& get_pipeline(handle<device_pipeline> handle) { + [[nodiscard]] inline const device_pipeline& get_pipeline(handle<device_pipeline> handle) const { return pipelines[handle.id]; } - inline const bindless_model& get_bindingmodel() { + [[nodiscard]] inline const device_surface& get_surface(handle<device_surface> handle) const { + return surfaces[handle.id]; + } + + [[nodiscard]] inline device_semaphore& get_semaphore(handle<device_semaphore> handle) { + return semaphores[handle.id]; + } + + [[nodiscard]] inline const bindless_model& get_bindingmodel() const { return bindless; } @@ -79,70 +88,62 @@ class vkdevice { return device; } - void wait(vksemaphore& semaphore); + void wait(handle<device_semaphore> semaphore_handle); - void submit(std::span<command_buffer> buffers, vksemaphore* wait, vksemaphore* signal); + void submit(std::span<command_buffer> buffers, handle<device_semaphore> wait_handle, handle<device_semaphore> signal_handle); - void present(device_surface& surface, const vksemaphore& semaphore); + void present(handle<device_surface> surface_handle, handle<device_semaphore> semaphore_handle); private: - vkdevice(const window& window); + vkdevice() = default; ~vkdevice(); void allocate_command_buffers(command_buffer* buffers, size_t count, QueueType type); - void create_views(device_texture& texture); + VkShaderModule create_shader_module(const std::span<uint8_t>& shader_code); - // Presentation stuff - void create_surface(const window& window); + void create_views(const texture_desc& desc, device_texture& texture); - void create_swapchain(); - - void create_virtual_frames(); - - VkSurfaceKHR surface = nullptr; - VkSwapchainKHR swapchain = nullptr; + void create_swapchain(const surface_desc& desc, device_surface& surface); // TODO: Wrap in a struct called adapter ? - void create_instance(); - - void create_device(); + void create_instance(); - void create_memory_allocator(); + void create_device(); - void create_command_pools(); + void create_memory_allocator(); - void pick_physical_device(); + void create_command_pools(); - static bool device_support_features(VkPhysicalDevice physical_dev); + void pick_physical_device(); - void create_debug_layer_callback(); + static bool device_support_features(VkPhysicalDevice physical_dev); - // Virtual frames resources - static constexpr uint32_t virtual_frames_count = 3U; - VkSemaphore semaphores[virtual_frames_count]; + void create_debug_layer_callback(); - queue queues[static_cast<uint32_t>(QueueType::MAX)]; + queue queues[static_cast<uint32_t>(QueueType::MAX)]; - VkInstance instance; - VkPhysicalDevice physical_device; - VkDevice device; + VkInstance instance; + VkPhysicalDevice physical_device; + VkDevice device; - VmaAllocator gpu_allocator; + VmaAllocator gpu_allocator; - bindless_model bindless; + bindless_model bindless; - static constexpr size_t max_allocable_command_buffers = 16; - static constexpr size_t max_submitable_command_buffers = 16; + static constexpr size_t max_allocable_command_buffers = 16; + static constexpr size_t max_submitable_command_buffers = 16; - freelist<device_texture*> storage_indices; - freelist<device_texture*> sampled_indices; + freelist<device_texture*> storage_indices; + freelist<device_texture*> sampled_indices; - freelist<device_texture> textures; - freelist<device_buffer> buffers; - freelist<device_pipeline> pipelines; + freelist<device_texture> textures; + freelist<device_buffer> buffers; + freelist<device_pipeline> pipelines; + freelist<device_surface> surfaces; + freelist<device_semaphore> semaphores; - static vkdevice* render_device; + static vkdevice render_device; #ifdef _DEBUG VkDebugUtilsMessengerEXT debug_messenger; |
