X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Fvulkan.h;h=2b42550c24657ad2b493c8497f99ee22f6d83d76;hb=cebf1330ef6773b7b4496dc279ec02a7ca4351bb;hp=a862acfe50a710e56ac9adbf117f83b32ae57471;hpb=ce9cd2d34cbcbd772c9fa753b48b8e6a4d80f1e3;p=libs%2Fgl.git diff --git a/source/backends/vulkan/vulkan.h b/source/backends/vulkan/vulkan.h index a862acfe..2b42550c 100644 --- a/source/backends/vulkan/vulkan.h +++ b/source/backends/vulkan/vulkan.h @@ -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); } }; @@ -124,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 @@ -162,6 +163,7 @@ private: 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 @@ -260,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" }; } @@ -383,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" }; } @@ -417,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