Frame.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #ifndef QTSDL_VULKAN_FRAME_H
  2. #define QTSDL_VULKAN_FRAME_H
  3. #include "vulkan_include.h"
  4. namespace vkw
  5. {
  6. struct Frame
  7. {
  8. uint32_t swapchainIndex;
  9. VkCommandBuffer commandBuffer = VK_NULL_HANDLE; // the command buffer to record. THis buffer is automatically reset
  10. // when acquireFrame() is called. If you need more command buffers
  11. // you can allocate it from the commandPool. You will need
  12. // to manage these extra buffers yourself.
  13. VkCommandPool commandPool = VK_NULL_HANDLE; // The command pool for this frame. Do not RESET this pool
  14. VkFramebuffer framebuffer = VK_NULL_HANDLE;
  15. VkRenderPass renderPass = VK_NULL_HANDLE;
  16. VkImage swapchainImage = VK_NULL_HANDLE;
  17. VkImageView swapchainImageView = VK_NULL_HANDLE;
  18. VkFormat swapchainFormat = VK_FORMAT_UNDEFINED;
  19. VkExtent2D swapchainSize;
  20. VkImage depthImage = VK_NULL_HANDLE;
  21. VkImageView depthImageView = VK_NULL_HANDLE;
  22. VkFormat depthFormat = VK_FORMAT_UNDEFINED;
  23. VkSemaphore imageAvailableSemaphore = VK_NULL_HANDLE; // the semaphore you have to wait on.
  24. VkSemaphore renderCompleteSemaphore = VK_NULL_HANDLE; // the semaphore you have to trigger when you have
  25. // submitted your last command buffer.
  26. VkFence fence = VK_NULL_HANDLE; // the fence you should trigger when submitting this frame
  27. VkClearColorValue clearColor;
  28. VkClearDepthStencilValue clearDepth;
  29. void beginCommandBuffer()
  30. {
  31. VkCommandBufferBeginInfo beginInfo = {};
  32. beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
  33. beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
  34. vkBeginCommandBuffer(commandBuffer, &beginInfo);
  35. }
  36. void endCommandBuffer()
  37. {
  38. vkEndCommandBuffer(commandBuffer);
  39. }
  40. void beginRenderPass( VkCommandBuffer cmd )
  41. {
  42. VkRenderPassBeginInfo render_pass_info = {};
  43. render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
  44. render_pass_info.renderPass = renderPass;
  45. render_pass_info.framebuffer = framebuffer;
  46. render_pass_info.renderArea.offset = {0, 0};
  47. render_pass_info.renderArea.extent = swapchainSize;
  48. render_pass_info.clearValueCount = 1;
  49. std::vector<VkClearValue> clearValues(2);
  50. clearValues[0].color = clearColor;
  51. clearValues[1].depthStencil = clearDepth;
  52. render_pass_info.clearValueCount = depthImage==VK_NULL_HANDLE? 1 : static_cast<uint32_t>(clearValues.size());
  53. render_pass_info.pClearValues = clearValues.data();
  54. vkCmdBeginRenderPass(cmd, &render_pass_info, VK_SUBPASS_CONTENTS_INLINE);
  55. }
  56. void endRenderPass(VkCommandBuffer cmd)
  57. {
  58. vkCmdEndRenderPass(cmd);
  59. }
  60. };
  61. }
  62. #endif