BsVulkanRenderAPI.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsVulkanPrerequisites.h"
  5. #include "BsRenderAPI.h"
  6. namespace BansheeEngine
  7. {
  8. /** @addtogroup Vulkan
  9. * @{
  10. */
  11. /** Implementation of a render system using Vulkan. Provides abstracted access to various low level Vulkan methods. */
  12. class VulkanRenderAPI : public RenderAPICore
  13. {
  14. public:
  15. VulkanRenderAPI();
  16. ~VulkanRenderAPI();
  17. /** @copydoc RenderAPICore::getName */
  18. const StringID& getName() const override;
  19. /** @copydoc RenderAPICore::getShadingLanguageName */
  20. const String& getShadingLanguageName() const override;
  21. /** @copydoc RenderAPICore::setGraphicsPipeline */
  22. void setGraphicsPipeline(const SPtr<GpuPipelineStateCore>& pipelineState,
  23. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  24. /** @copydoc RenderAPICore::setComputePipeline */
  25. void setComputePipeline(const SPtr<GpuProgramCore>& computeProgram,
  26. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  27. /** @copydoc RenderAPICore::setGpuParams */
  28. void setGpuParams(const SPtr<GpuParamsCore>& gpuParams,
  29. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  30. /** @copydoc RenderAPICore::beginFrame */
  31. void beginFrame(const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  32. /** @copydoc RenderAPICore::endFrame */
  33. void endFrame(const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  34. /** @copydoc RenderAPICore::clearRenderTarget */
  35. void clearRenderTarget(UINT32 buffers, const Color& color = Color::Black, float depth = 1.0f, UINT16 stencil = 0,
  36. UINT8 targetMask = 0xFF, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  37. /** @copydoc RenderAPICore::clearViewport */
  38. void clearViewport(UINT32 buffers, const Color& color = Color::Black, float depth = 1.0f, UINT16 stencil = 0,
  39. UINT8 targetMask = 0xFF, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  40. /** @copydoc RenderAPICore::setRenderTarget */
  41. void setRenderTarget(const SPtr<RenderTargetCore>& target, bool readOnlyDepthStencil = false,
  42. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  43. /** @copydoc RenderAPICore::setViewport */
  44. void setViewport(const Rect2& area, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  45. /** @copydoc RenderAPICore::setScissorRect */
  46. void setScissorRect(UINT32 left, UINT32 top, UINT32 right, UINT32 bottom,
  47. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  48. /** @copydoc RenderAPICore::setStencilRef */
  49. void setStencilRef(UINT32 value, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  50. /** @copydoc RenderAPICore::setVertexBuffers */
  51. void setVertexBuffers(UINT32 index, SPtr<VertexBufferCore>* buffers, UINT32 numBuffers,
  52. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  53. /** @copydoc RenderAPICore::setIndexBuffer */
  54. void setIndexBuffer(const SPtr<IndexBufferCore>& buffer,
  55. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  56. /** @copydoc RenderAPICore::setVertexDeclaration */
  57. void setVertexDeclaration(const SPtr<VertexDeclarationCore>& vertexDeclaration,
  58. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  59. /** @copydoc RenderAPICore::setDrawOperation */
  60. void setDrawOperation(DrawOperationType op,
  61. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  62. /** @copydoc RenderAPICore::draw */
  63. void draw(UINT32 vertexOffset, UINT32 vertexCount, UINT32 instanceCount = 0,
  64. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  65. /** @copydoc RenderAPICore::drawIndexed */
  66. void drawIndexed(UINT32 startIndex, UINT32 indexCount, UINT32 vertexOffset, UINT32 vertexCount,
  67. UINT32 instanceCount = 0, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  68. /** @copydoc RenderAPICore::dispatchCompute */
  69. void dispatchCompute(UINT32 numGroupsX, UINT32 numGroupsY = 1, UINT32 numGroupsZ = 1,
  70. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  71. /** @copydoc RenderAPICore::swapBuffers() */
  72. void swapBuffers(const SPtr<RenderTargetCore>& target,
  73. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  74. /** @copydoc RenderAPICore::addCommands() */
  75. void addCommands(const SPtr<CommandBuffer>& commandBuffer, const SPtr<CommandBuffer>& secondary) override;
  76. /** @copydoc RenderAPICore::executeCommands() */
  77. void executeCommands(const SPtr<CommandBuffer>& commandBuffer, UINT32 syncMask = 0xFFFFFFFF) override;
  78. /** @copydoc RenderAPICore::convertProjectionMatrix */
  79. void convertProjectionMatrix(const Matrix4& matrix, Matrix4& dest) override;
  80. /** @copydoc RenderAPICore::getAPIInfo */
  81. const RenderAPIInfo& getAPIInfo() const override;
  82. /** @copydoc RenderAPICore::generateParamBlockDesc() */
  83. GpuParamBlockDesc generateParamBlockDesc(const String& name, Vector<GpuParamDataDesc>& params) override;
  84. /**
  85. * @name Internal
  86. * @{
  87. */
  88. /** Returns the internal Vulkan instance object. */
  89. VkInstance _getInstance() const { return mInstance; }
  90. /** Returns a Vulkan device at the specified index. Must be in range [0, _getNumDevices()) */
  91. SPtr<VulkanDevice> _getDevice(UINT32 idx) const { return mDevices[idx]; }
  92. /** Returns the primary device that supports swap chain present operations. */
  93. SPtr<VulkanDevice> _getPresentDevice() const { return mPrimaryDevices[0]; }
  94. /** Gets the total number of Vulkan compatible devices available on this system. */
  95. UINT32 _getNumDevices() const { return (UINT32)mDevices.size(); }
  96. /**
  97. * Returns one or multiple devices recognized as primary. This will be a single device in most cases, or multiple
  98. * devices if using some kind of a supported multi-GPU setup.
  99. */
  100. const Vector<SPtr<VulkanDevice>> _getPrimaryDevices() const { return mPrimaryDevices; }
  101. /** Returns the main command buffer, executing on the graphics queue. */
  102. VulkanCommandBuffer* _getMainCommandBuffer() const { return mMainCommandBuffer.get(); }
  103. /** @} */
  104. protected:
  105. friend class VulkanRenderAPIFactory;
  106. /** @copydoc RenderAPICore::initializePrepare */
  107. void initialize() override;
  108. /** @copydoc RenderAPICore::destroyCore */
  109. void destroyCore() override;
  110. /** Creates and populates a set of render system capabilities describing which functionality is available. */
  111. void initCapabilites();
  112. /**
  113. * Returns a valid command buffer. Uses the provided buffer if not null. Otherwise returns the default command
  114. * buffer.
  115. */
  116. VulkanCommandBuffer* getCB(const SPtr<CommandBuffer>& buffer);
  117. private:
  118. VkInstance mInstance;
  119. Vector<SPtr<VulkanDevice>> mDevices;
  120. Vector<SPtr<VulkanDevice>> mPrimaryDevices;
  121. SPtr<VulkanCommandBuffer> mMainCommandBuffer;
  122. VulkanGLSLProgramFactory* mGLSLFactory;
  123. #if BS_DEBUG_MODE
  124. VkDebugReportCallbackEXT mDebugCallback;
  125. #endif
  126. };
  127. extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;
  128. extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;
  129. extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
  130. extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;
  131. extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
  132. extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
  133. extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
  134. extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
  135. extern PFN_vkQueuePresentKHR vkQueuePresentKHR;
  136. /** @} */
  137. }