]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/vulkan.h
Support compute shaders and compute operations
[libs/gl.git] / source / backends / vulkan / vulkan.h
index 373b75aed5284d2f1d6d124b773d67f2e431e60b..2b42550c24657ad2b493c8497f99ee22f6d83d76 100644 (file)
@@ -85,7 +85,7 @@ public:
        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); }
 };
 
@@ -106,6 +106,7 @@ private:
        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
@@ -123,6 +124,7 @@ private:
        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
@@ -133,10 +135,16 @@ private:
        PFN_vkUnmapMemory vkUnmapMemory = 0;  // 11.2.9
        PFN_vkCreateBuffer vkCreateBuffer = 0;  // 12.1
        PFN_vkDestroyBuffer vkDestroyBuffer = 0;  // 12.1
+       PFN_vkCreateImage vkCreateImage = 0;  // 12.3
+       PFN_vkDestroyImage vkDestroyImage = 0;  // 12.3
        PFN_vkCreateImageView vkCreateImageView = 0;  // 12.5
        PFN_vkDestroyImageView vkDestroyImageView = 0;  // 12.5
        PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements = 0;  // 12.7
+       PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements = 0;  // 12.7
        PFN_vkBindBufferMemory vkBindBufferMemory = 0;  // 12.7
+       PFN_vkBindImageMemory vkBindImageMemory = 0;  // 12.7
+       PFN_vkCreateSampler vkCreateSampler = 0;  // 13
+       PFN_vkDestroySampler vkDestroySampler = 0;  // 13
        PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout = 0;  // 14.2.1
        PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout = 0;  // 14.2.1
        PFN_vkCreatePipelineLayout vkCreatePipelineLayout = 0;  // 14.2.2
@@ -148,11 +156,14 @@ private:
        PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets = 0;  // 14.2.7
        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
@@ -193,6 +204,9 @@ public:
        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" }; }
@@ -248,6 +262,9 @@ public:
        { 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" }; }
 
@@ -280,6 +297,12 @@ public:
        void DestroyBuffer(VkBuffer image) const
        { vkDestroyBuffer(device, handle_cast<::VkBuffer>(image), 0); }
 
+       Result CreateImage(const VkImageCreateInfo &rCreateInfo, VkImage &rImage) const
+       { return { vkCreateImage(device, &rCreateInfo, 0, handle_cast<::VkImage *>(&rImage)), "vkCreateImage" }; }
+
+       void DestroyImage(VkImage image) const
+       { vkDestroyImage(device, handle_cast<::VkImage>(image), 0); }
+
        Result CreateImageView(const VkImageViewCreateInfo &rCreateInfo, VkImageView &rView) const
        { return { vkCreateImageView(device, &rCreateInfo, 0, handle_cast<::VkImageView *>(&rView)), "vkCreateImageView" }; }
 
@@ -289,9 +312,22 @@ public:
        void GetBufferMemoryRequirements(VkBuffer image, VkMemoryRequirements &rMemoryRequirements) const
        { vkGetBufferMemoryRequirements(device, handle_cast<::VkBuffer>(image), &rMemoryRequirements); }
 
+       void GetImageMemoryRequirements(VkImage image, VkMemoryRequirements &rMemoryRequirements) const
+       { vkGetImageMemoryRequirements(device, handle_cast<::VkImage>(image), &rMemoryRequirements); }
+
        Result BindBufferMemory(VkBuffer image, VkDeviceMemory memory, VkDeviceSize memoryOffset) const
        { return { vkBindBufferMemory(device, handle_cast<::VkBuffer>(image), handle_cast<::VkDeviceMemory>(memory), memoryOffset), "vkBindBufferMemory" }; }
 
+       Result BindImageMemory(VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset) const
+       { return { vkBindImageMemory(device, handle_cast<::VkImage>(image), handle_cast<::VkDeviceMemory>(memory), memoryOffset), "vkBindImageMemory" }; }
+
+       // Chapter 13: Samplers
+       Result CreateSampler(const VkSamplerCreateInfo &rCreateInfo, VkSampler &rSampler) const
+       { return { vkCreateSampler(device, &rCreateInfo, 0, handle_cast<::VkSampler *>(&rSampler)), "vkCreateSampler" }; }
+
+       void DestroySampler(VkSampler sampler) const
+       { vkDestroySampler(device, handle_cast<::VkSampler>(sampler), 0); }
+
        // Chapter 14: Resource Descriptors
        Result CreateDescriptorSetLayout(const VkDescriptorSetLayoutCreateInfo &rCreateInfo, VkDescriptorSetLayout &rSetLayout) const
        { return { vkCreateDescriptorSetLayout(device, &rCreateInfo, 0, handle_cast<::VkDescriptorSetLayout *>(&rSetLayout)), "vkCreateDescriptorSetLayout" }; }
@@ -327,6 +363,12 @@ public:
        void CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, std::uint32_t regionCount, const VkBufferCopy *pRegions) const
        { vkCmdCopyBuffer(handle_cast<::VkCommandBuffer>(commandBuffer), handle_cast<::VkBuffer>(srcBuffer), handle_cast<::VkBuffer>(dstBuffer), regionCount, pRegions); }
 
+       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); }
@@ -346,6 +388,10 @@ public:
        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" }; }
@@ -380,6 +426,64 @@ public:
        { 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