VulkanWrapper.cppm 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. export module Core.VulkanWrapper;
  2. export import Core.Vulkan;
  3. export import Core.List;
  4. export import Core.Types;
  5. export import Core.VulkanBase;
  6. import Core.Meta;
  7. export namespace Core::Vulkan {
  8. bool init();
  9. void render();
  10. void destroy();
  11. template<typename T>
  12. struct BaseWrapper {
  13. VkDevice device = VK_NULL_HANDLE;
  14. T handle = VK_NULL_HANDLE;
  15. BaseWrapper() noexcept = default;
  16. BaseWrapper(const BaseWrapper&) = delete;
  17. BaseWrapper(BaseWrapper&& o) noexcept : BaseWrapper() {
  18. swap(o);
  19. }
  20. BaseWrapper& operator=(const BaseWrapper&) = delete;
  21. BaseWrapper& operator=(BaseWrapper&& o) noexcept {
  22. swap(o);
  23. return *this;
  24. }
  25. void swap(BaseWrapper& o) noexcept {
  26. Core::swap(device, o.device);
  27. Core::swap(handle, o.handle);
  28. }
  29. operator T() noexcept {
  30. return handle;
  31. }
  32. operator T*() noexcept {
  33. return &handle;
  34. }
  35. operator const T*() const noexcept {
  36. return &handle;
  37. }
  38. };
  39. struct ImageView : public BaseWrapper<VkImageView> {
  40. ImageView() noexcept = default;
  41. ImageView(ImageView&&) noexcept = default;
  42. ImageView& operator=(ImageView&&) noexcept = default;
  43. ~ImageView();
  44. bool init(VkDevice d, VkImage image, VkFormat format);
  45. };
  46. struct Framebuffer : public BaseWrapper<VkFramebuffer> {
  47. Framebuffer() noexcept = default;
  48. Framebuffer(Framebuffer&&) noexcept = default;
  49. Framebuffer& operator=(Framebuffer&&) noexcept = default;
  50. ~Framebuffer();
  51. bool init(const ImageView& iv, VkRenderPass rp, u32 width, u32 height);
  52. };
  53. struct Semaphore : public BaseWrapper<VkSemaphore> {
  54. Semaphore() noexcept = default;
  55. Semaphore(Semaphore&&) noexcept = default;
  56. Semaphore& operator=(Semaphore&&) noexcept = default;
  57. ~Semaphore();
  58. bool init(VkDevice d);
  59. };
  60. struct Fence : public BaseWrapper<VkFence> {
  61. Fence() = default;
  62. Fence(Fence&&) = default;
  63. ~Fence();
  64. bool init(VkDevice d);
  65. void reset();
  66. void waitFor(u64 timeout = 0xFFFF'FFFF'FFFF'FFFF);
  67. };
  68. enum class SwapchainResult { SUCCESS, RECREATE, ERROR_RECREATE, ERROR };
  69. struct Swapchain : public BaseWrapper<VkSwapchainKHR> {
  70. Swapchain() = default;
  71. Swapchain(Swapchain&&) = default;
  72. ~Swapchain();
  73. struct Data {
  74. Base& base;
  75. VkExtent2D size{};
  76. VkSurfaceFormatKHR surfaceFormat{};
  77. VkPresentModeKHR presentMode{};
  78. VkSharingMode sharingMode{};
  79. List<u32> queueFamilies{};
  80. };
  81. bool init(Data& d);
  82. SwapchainResult nextImage(
  83. u32& imageIndex, Semaphore& s, u64 timeout = 0xFFFF'FFFF'FFFF'FFFF);
  84. };
  85. struct ShaderModule : public BaseWrapper<VkShaderModule> {
  86. ShaderModule() = default;
  87. ShaderModule(ShaderModule&&) = default;
  88. ~ShaderModule();
  89. bool init(VkDevice d, const char* path);
  90. };
  91. struct PipelineLayout : public BaseWrapper<VkPipelineLayout> {
  92. PipelineLayout() = default;
  93. PipelineLayout(PipelineLayout&&) = default;
  94. ~PipelineLayout();
  95. bool init(VkDevice d);
  96. };
  97. struct SwapchainImages {
  98. List<VkImage> images{};
  99. List<ImageView> imageViews{};
  100. List<Semaphore> renderFinishedSemaphore{};
  101. bool init(const Swapchain& s, VkFormat format);
  102. };
  103. struct RenderPass : public BaseWrapper<VkRenderPass> {
  104. RenderPass() = default;
  105. RenderPass(RenderPass&&) = default;
  106. ~RenderPass();
  107. bool init(VkDevice d, VkFormat format);
  108. };
  109. struct Pipeline : public BaseWrapper<VkPipeline> {
  110. VkViewport viewport;
  111. VkRect2D scissor;
  112. Pipeline();
  113. Pipeline(Pipeline&&) = default;
  114. ~Pipeline();
  115. void updateSize(u32 width, u32 height);
  116. bool init(
  117. PipelineLayout& pl, RenderPass& rp,
  118. const List<VkVertexInputBindingDescription>& bd,
  119. const List<VkVertexInputAttributeDescription>& ad);
  120. };
  121. struct CommandPool : public BaseWrapper<VkCommandPool> {
  122. CommandPool() = default;
  123. CommandPool(CommandPool&&) = default;
  124. ~CommandPool();
  125. bool init(VkDevice d, u32 queueFamily);
  126. };
  127. struct CommandBuffer : public BaseWrapper<VkCommandBuffer> {
  128. CommandBuffer() = default;
  129. CommandBuffer(CommandBuffer&&) = default;
  130. bool init(CommandPool& cp);
  131. void reset();
  132. void begin();
  133. void end();
  134. void beginRenderPass(
  135. RenderPass& rp, Framebuffer& f, const VkExtent2D& size);
  136. void endRenderPass();
  137. void bindPipeline(Pipeline& p);
  138. void draw(u32 vertices);
  139. };
  140. struct Queue : public BaseWrapper<VkQueue> {
  141. Queue() = default;
  142. Queue(Queue&&) = default;
  143. bool init(VkDevice d, u32 queueFamily);
  144. void submit(
  145. CommandBuffer& cb, Fence& f, Semaphore& wait, Semaphore& signal,
  146. VkPipelineStageFlags flags);
  147. SwapchainResult present(Semaphore& signal, Swapchain& s, u32 index);
  148. };
  149. struct VertexBuffer : public BaseWrapper<VkBuffer> {
  150. VkDeviceMemory memory;
  151. VertexBuffer();
  152. VertexBuffer(const VertexBuffer&) = delete;
  153. VertexBuffer(VertexBuffer&&) = default;
  154. ~VertexBuffer();
  155. VertexBuffer& operator=(const VertexBuffer&) = delete;
  156. bool init(Base& base, size_t size, const void* data);
  157. };
  158. }