coral_device.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #pragma once
  2. #include "coral_window.h"
  3. #include <vk_mem_alloc.h>
  4. #include <string>
  5. #include <vector>
  6. #include "vk_types.h"
  7. namespace coral_3d
  8. {
  9. struct UploadContext
  10. {
  11. VkFence upload_fence;
  12. VkCommandPool command_pool;
  13. VkCommandBuffer command_buffer;
  14. };
  15. struct SwapchainSupportDetails
  16. {
  17. VkSurfaceCapabilitiesKHR capabilities;
  18. std::vector<VkSurfaceFormatKHR> formats;
  19. std::vector<VkPresentModeKHR> present_modes;
  20. };
  21. struct QueueFamilyIndices
  22. {
  23. uint32_t graphics_family;
  24. uint32_t present_family;
  25. bool graphics_family_has_value { false };
  26. bool present_family_has_value { false };
  27. bool is_complete() { return graphics_family_has_value && present_family_has_value; }
  28. };
  29. class coral_device final
  30. {
  31. public:
  32. #ifdef NDEBUG
  33. const bool c_enable_validation_layers_{false};
  34. #else
  35. const bool c_enable_validation_layers_{ true };
  36. #endif
  37. coral_device(coral_window& window);
  38. ~coral_device();
  39. // Non-copyable & non-movable
  40. coral_device(const coral_device&) = delete;
  41. void operator=(const coral_device&) = delete;
  42. coral_device(coral_device&&) = delete;
  43. coral_device& operator=(coral_device&&) = delete;
  44. VkCommandPool get_command_pool() { return command_pool_; }
  45. VkDevice device() { return device_; }
  46. VkInstance instance() {return instance_; }
  47. VkPhysicalDevice physical_device() { return physical_device_; }
  48. VmaAllocator allocator() { return allocator_; }
  49. VkSurfaceKHR surface() { return surface_; }
  50. DeletionQueue& deletion_queue() { return deletion_queue_; }
  51. VkQueue graphics_queue() { return graphics_queue_; }
  52. VkQueue present_queue() { return present_queue_; }
  53. SwapchainSupportDetails get_swapchain_support() { return query_swapchain_support(physical_device_); }
  54. uint32_t find_memory_type(uint32_t type_filter, VkMemoryPropertyFlags properties);
  55. QueueFamilyIndices find_physical_queue_families() { return find_queue_families(physical_device_); }
  56. VkFormat find_supported_format(
  57. const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features);
  58. // Buffer helpers
  59. AllocatedBuffer create_buffer(VkDeviceSize alloc_size, VkBufferUsageFlags usage, VmaMemoryUsage memory_usage, VmaAllocationCreateFlags flags = 0);
  60. AllocatedImage create_image(const VkImageCreateInfo& image_info,VmaMemoryUsage memory_usage);
  61. void immediate_submit(std::function<void(VkCommandBuffer cmd)>&& function);
  62. void copy_buffer(AllocatedBuffer src_buffer, AllocatedBuffer dst_buffer, VkDeviceSize size);
  63. void copy_buffer_to_image(AllocatedBuffer buffer, AllocatedImage image, uint32_t width, uint32_t height, uint32_t layer_count);
  64. void transition_image_layout(VkImage image, VkFormat format, VkImageLayout old_layout, VkImageLayout new_layout, uint32_t layer_count = 1, uint32_t mip_levels = 1);
  65. VkPhysicalDeviceProperties properties;
  66. private:
  67. void create_instance();
  68. void create_surface();
  69. void create_command_pool();
  70. void create_sync_structures();
  71. void create_command_buffers();
  72. // Helper methods
  73. std::vector<const char*> get_required_extensions();
  74. bool check_validation_layer_support();
  75. QueueFamilyIndices find_queue_families(VkPhysicalDevice device);
  76. void has_glfw_required_instance_extensions();
  77. bool check_device_extension_support(VkPhysicalDevice device);
  78. SwapchainSupportDetails query_swapchain_support(VkPhysicalDevice device);
  79. DeletionQueue deletion_queue_;
  80. // For immediate commands
  81. UploadContext upload_context_;
  82. VkInstance instance_;
  83. VkDebugUtilsMessengerEXT debug_messenger_;
  84. VkPhysicalDevice physical_device_ { VK_NULL_HANDLE };
  85. coral_window& window_;
  86. VkCommandPool command_pool_;
  87. VmaAllocator allocator_;
  88. VkDevice device_;
  89. VkSurfaceKHR surface_;
  90. VkQueue graphics_queue_;
  91. VkQueue present_queue_;
  92. const std::vector<const char*> c_validation_layers { "VK_LAYER_KHRONOS_validation" };
  93. const std::vector<const char*> c_device_extensions { VK_KHR_SWAPCHAIN_EXTENSION_NAME };
  94. };
  95. }