Result(Result &&r): result(r.result), function(r.function) { r.result = VK_SUCCESS; }
~Result() noexcept(false) { if(!checked) check(); }
- bool operator==(VkResult r) { checked = true; return result==r; }
+ bool operator==(VkResult r) { bool m = (result==r); checked |= m; return m; }
void check() { if(result!=VK_SUCCESS) throw Graphics::vulkan_error(result, function); }
};
PFN_vkBeginCommandBuffer vkBeginCommandBuffer = 0; // 6.4
PFN_vkEndCommandBuffer vkEndCommandBuffer = 0; // 6.4
PFN_vkQueueSubmit vkQueueSubmit = 0; // 6.5
+ PFN_vkCmdExecuteCommands vkCmdExecuteCommands = 0; // 6.7
PFN_vkCreateFence vkCreateFence = 0; // 7.3
PFN_vkDestroyFence vkDestroyFence = 0; // 7.3
PFN_vkGetFenceStatus vkGetFenceStatus = 0; // 7.3
PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier = 0; // 7.6
PFN_vkQueueWaitIdle vkQueueWaitIdle = 0; // 7.8
PFN_vkCreateRenderPass vkCreateRenderPass = 0; // 8.1
+ PFN_vkCreateRenderPass2 vkCreateRenderPass2 = 0; // 8.1
PFN_vkDestroyRenderPass vkDestroyRenderPass = 0; // 8.1
PFN_vkCreateFramebuffer vkCreateFramebuffer = 0; // 8.3
PFN_vkDestroyFramebuffer vkDestroyFramebuffer = 0; // 8.3
PFN_vkCmdEndRenderPass vkCmdEndRenderPass = 0; // 8.4
PFN_vkCreateShaderModule vkCreateShaderModule = 0; // 9.1
PFN_vkDestroyShaderModule vkDestroyShaderModule = 0; // 9.1
+ PFN_vkCreateComputePipelines vkCreateComputePipelines = 0; // 10.1
PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines = 0; // 10.2
PFN_vkDestroyPipeline vkDestroyPipeline = 0; // 10.4
PFN_vkCmdBindPipeline vkCmdBindPipeline = 0; // 10.10
PFN_vkCmdPushConstants vkCmdPushConstants = 0; // 14.2.10
PFN_vkCmdCopyBuffer vkCmdCopyBuffer = 0; // 19.2
PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage = 0; // 19.4
+ PFN_vkCmdBlitImage vkCmdBlitImage = 0; // 19.5
PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer = 0; // 20.3
PFN_vkCmdDrawIndexed vkCmdDrawIndexed = 0; // 20.3
PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers = 0; // 21.2
PFN_vkCmdSetViewport vkCmdSetViewport = 0; // 24.5
PFN_vkCmdSetScissor vkCmdSetScissor = 0; // 26.1
+ PFN_vkCmdDispatch vkCmdDispatch = 0; // 28
PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilities = 0; // 30.5.1
PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormats = 0; // 30.5.2
PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModes = 0; // 30.5.3
Result QueueSubmit(std::uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) const
{ return { vkQueueSubmit(graphicsQueue, submitCount, pSubmits, handle_cast<::VkFence>(fence)), "vkQueueSubmit" }; }
+ void CmdExecuteCommands(VkCommandBuffer commandBuffer, std::uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) const
+ { vkCmdExecuteCommands(handle_cast<::VkCommandBuffer>(commandBuffer), commandBufferCount, handle_cast<const ::VkCommandBuffer *>(pCommandBuffers)); }
+
// Chapter 7: Synchronization and Cache Control
Result CreateFence(const VkFenceCreateInfo &rCreateInfo, VkFence &rFence) const
{ return { vkCreateFence(device, &rCreateInfo, 0, handle_cast<::VkFence *>(&rFence)), "vkCreateFence" }; }
Result CreateRenderPass(const VkRenderPassCreateInfo &rCreateInfo, VkRenderPass &rRenderPass) const
{ return { vkCreateRenderPass(device, &rCreateInfo, 0, handle_cast<::VkRenderPass *>(&rRenderPass)), "vkCreateRenderPass" }; }
+ Result CreateRenderPass2(const VkRenderPassCreateInfo2 &rCreateInfo, VkRenderPass &rRenderPass) const
+ { return { vkCreateRenderPass2(device, &rCreateInfo, 0, handle_cast<::VkRenderPass *>(&rRenderPass)), "vkCreateRenderPass2" }; }
+
void DestroyRenderPass(VkRenderPass renderPass) const
{ vkDestroyRenderPass(device, handle_cast<::VkRenderPass>(renderPass), 0); }
{ vkDestroyShaderModule(device, handle_cast<::VkShaderModule>(shaderModule), 0); }
// Chapter 10: Pipelines
+ Result CreateComputePipelines(VkPipelineCache pipelineCache, std::uint32_t createInfoCount, const VkComputePipelineCreateInfo *pCreateInfos, VkPipeline *pPipelines) const
+ { return { vkCreateComputePipelines(device, handle_cast<::VkPipelineCache>(pipelineCache), createInfoCount, pCreateInfos, 0, handle_cast<::VkPipeline *>(pPipelines)), "vkCreateComputePipelines" }; }
+
Result CreateGraphicsPipelines(VkPipelineCache pipelineCache, std::uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo *pCreateInfos, VkPipeline *pPipelines) const
{ return { vkCreateGraphicsPipelines(device, handle_cast<::VkPipelineCache>(pipelineCache), createInfoCount, pCreateInfos, 0, handle_cast<::VkPipeline *>(pPipelines)), "vkCreateGraphicsPipelines" }; }
void CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, std::uint32_t regionCount, const VkBufferImageCopy *pRegions) const
{ vkCmdCopyBufferToImage(handle_cast<::VkCommandBuffer>(commandBuffer), handle_cast<::VkBuffer>(srcBuffer), handle_cast<::VkImage>(dstImage), dstImageLayout, regionCount, pRegions); }
+ void CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) const
+ { vkCmdBlitImage(handle_cast<::VkCommandBuffer>(commandBuffer), handle_cast<::VkImage>(srcImage), srcImageLayout, handle_cast<::VkImage>(dstImage), dstImageLayout, regionCount, pRegions, filter); }
+
// Chapter 20: Drawing Commands
void CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) const
{ vkCmdBindIndexBuffer(handle_cast<::VkCommandBuffer>(commandBuffer), handle_cast<::VkBuffer>(buffer), offset, indexType); }
void CmdSetScissor(VkCommandBuffer commandBuffer, std::uint32_t firstScissor, std::uint32_t scissorCount, const VkRect2D *pScissors) const
{ vkCmdSetScissor(handle_cast<::VkCommandBuffer>(commandBuffer), firstScissor, scissorCount, pScissors); }
+ // Chapter 28: Dispatching Commands
+ void CmdDispatch(VkCommandBuffer commandBuffer, std::uint32_t groupCountX, std::uint32_t groupCountY, std::uint32_t groupCountZ) const
+ { vkCmdDispatch(handle_cast<::VkCommandBuffer>(commandBuffer), groupCountX, groupCountY, groupCountZ); }
+
// Chapter 30: Window System Integration (WSI)
Result GetPhysicalDeviceSurfaceCapabilities(VkSurface surface, VkSurfaceCapabilitiesKHR &rSurfaceCapabilities) const
{ return { vkGetPhysicalDeviceSurfaceCapabilities(physicalDevice, handle_cast<::VkSurfaceKHR>(surface), &rSurfaceCapabilities), "vkGetPhysicalDeviceSurfaceCapabilities" }; }
{ return { vkSetDebugUtilsObjectName(device, &rNameInfo), "vkSetDebugUtilsObjectName" }; }
};
+class VulkanCommandRecorder
+{
+private:
+ const VulkanFunctions &vk;
+ VkCommandBuffer commandBuffer;
+
+public:
+ VulkanCommandRecorder(const VulkanFunctions &v, VkCommandBuffer b): vk(v), commandBuffer(b) { }
+
+ void ExecuteCommands(std::uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) const
+ { vk.CmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers); }
+
+ void PipelineBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) const
+ { vk.CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers); }
+
+ void BeginRenderPass(const VkRenderPassBeginInfo &rRenderPassBegin, VkSubpassContents contents) const
+ { vk.CmdBeginRenderPass(commandBuffer, rRenderPassBegin, contents); }
+
+ void EndRenderPass() const
+ { vk.CmdEndRenderPass(commandBuffer); }
+
+ void BindPipeline(VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) const
+ { vk.CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline); }
+
+ void BindDescriptorSets(VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, std::uint32_t firstSet, std::uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets, std::uint32_t dynamicOffsetCount, const std::uint32_t *pDynamicOffsets) const
+ { vk.CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets); }
+
+ void PushConstants(VkPipelineLayout layout, VkShaderStageFlags stageFlags, std::uint32_t offset, std::uint32_t size, const void *pValues) const
+ { vk.CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues); }
+
+ void CopyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, std::uint32_t regionCount, const VkBufferCopy *pRegions) const
+ { vk.CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions); }
+
+ void CopyBufferToImage(VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, std::uint32_t regionCount, const VkBufferImageCopy *pRegions) const
+ { vk.CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions); }
+
+ void BlitImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) const
+ { vk.CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter); }
+
+ void BindIndexBuffer(VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) const
+ { vk.CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType); }
+
+ void DrawIndexed(std::uint32_t indexCount, std::uint32_t instanceCount, std::uint32_t firstIndex, std::int32_t vertexOffset, std::uint32_t firstInstance) const
+ { vk.CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance); }
+
+ void BindVertexBuffers(std::uint32_t firstBinding, std::uint32_t bindingCount, const VkBuffer *pBuffers, const VkDeviceSize *pOffsets) const
+ { vk.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets); }
+
+ void SetViewport(std::uint32_t firstViewport, std::uint32_t viewportCount, const VkViewport *pViewports) const
+ { vk.CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports); }
+
+ void SetScissor(std::uint32_t firstScissor, std::uint32_t scissorCount, const VkRect2D *pScissors) const
+ { vk.CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors); }
+
+ void Dispatch(std::uint32_t groupCountX, std::uint32_t groupCountY, std::uint32_t groupCountZ) const
+ { vk.CmdDispatch(commandBuffer, groupCountX, groupCountY, groupCountZ); }
+};
+
} // namespace GL
} // namespace Msp