BsD3D11RenderAPI.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsD3D11Prerequisites.h"
  5. #include "BsRenderAPI.h"
  6. namespace bs
  7. {
  8. /** @addtogroup D3D11
  9. * @{
  10. */
  11. /** Implementation of a render system using DirectX 11. Provides abstracted access to various low level DX11 methods. */
  12. class BS_D3D11_EXPORT D3D11RenderAPI : public RenderAPICore
  13. {
  14. public:
  15. D3D11RenderAPI();
  16. ~D3D11RenderAPI();
  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<GraphicsPipelineStateCore>& pipelineState,
  23. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  24. /** @copydoc RenderAPICore::setComputePipeline */
  25. void setComputePipeline(const SPtr<ComputePipelineStateCore>& pipelineState,
  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. RenderSurfaceMask loadMask = RT_NONE, 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, UINT32 syncMask = 0xFFFFFFFF) override;
  73. /** @copydoc RenderAPICore::addCommands() */
  74. void addCommands(const SPtr<CommandBuffer>& commandBuffer, const SPtr<CommandBuffer>& secondary) override;
  75. /** @copydoc RenderAPICore::executeCommands() */
  76. void executeCommands(const SPtr<CommandBuffer>& commandBuffer, UINT32 syncMask = 0xFFFFFFFF) override;
  77. /** @copydoc RenderAPICore::convertProjectionMatrix */
  78. void convertProjectionMatrix(const Matrix4& matrix, Matrix4& dest) override;
  79. /** @copydoc RenderAPICore::getAPIInfo */
  80. const RenderAPIInfo& getAPIInfo() const override;
  81. /** @copydoc RenderAPICore::generateParamBlockDesc() */
  82. GpuParamBlockDesc generateParamBlockDesc(const String& name, Vector<GpuParamDataDesc>& params) override;
  83. /************************************************************************/
  84. /* Internal use by DX11 RenderSystem only */
  85. /************************************************************************/
  86. /**
  87. * Determines DXGI multisample settings from the provided parameters.
  88. *
  89. * @param[in] multisampleCount Number of requested samples.
  90. * @param[in] format Pixel format used by the render target.
  91. * @param[out] outputSampleDesc Output structure that will contain the requested multisample settings.
  92. */
  93. void determineMultisampleSettings(UINT32 multisampleCount, DXGI_FORMAT format, DXGI_SAMPLE_DESC* outputSampleDesc);
  94. /** Returns the main DXGI factory object. */
  95. IDXGIFactory* getDXGIFactory() const { return mDXGIFactory; }
  96. /** Returns the primary DX11 device object. */
  97. D3D11Device& getPrimaryDevice() const { return *mDevice; }
  98. /** Returns information describing all available drivers. */
  99. D3D11DriverList* getDriverList() const { return mDriverList; }
  100. protected:
  101. friend class D3D11RenderAPIFactory;
  102. /** @copydoc RenderAPICore::initialize */
  103. void initialize() override;
  104. /** @copydoc RenderAPICore::initializeWithWindow */
  105. void initializeWithWindow(const SPtr<RenderWindowCore>& primaryWindow) override;
  106. /** @copydoc RenderAPICore::destroyCore */
  107. void destroyCore() override;
  108. /**
  109. * Sets a sampler state for the specified texture unit.
  110. *
  111. * @param[in] gptype Determines to which GPU program slot to bind the sampler state.
  112. * @param[in] texUnit Texture unit index to bind the state to.
  113. * @param[in] samplerState Sampler state to bind, or null to unbind.
  114. *
  115. * @see SamplerState
  116. */
  117. void setSamplerState(GpuProgramType gptype, UINT16 texUnit, const SPtr<SamplerStateCore>& samplerState);
  118. /**
  119. * Binds a texture to the pipeline for the specified GPU program type at the specified slot. If the slot matches
  120. * the one configured in the GPU program the program will be able to access this texture on the GPU.
  121. *
  122. * @param[in] gptype Determines to which GPU program slot to bind the texture.
  123. * @param[in] texUnit Texture unit index to bind the texture to.
  124. * @param[in] texture Texture to bind.
  125. */
  126. void setTexture(GpuProgramType gptype, UINT16 texUnit, const SPtr<TextureCore>& texture);
  127. /**
  128. * Binds a texture that can be used for random load/store operations from a GPU program.
  129. *
  130. * @param[in] gptype Determines to which GPU program slot to bind the texture.
  131. * @param[in] texUnit Texture unit index to bind the texture to.
  132. * @param[in] texture Texture to bind.
  133. * @param[in] surface Determines which surface of the texture to bind.
  134. */
  135. void setLoadStoreTexture(GpuProgramType gptype, UINT16 texUnit, const SPtr<TextureCore>& texture,
  136. const TextureSurface& surface);
  137. /**
  138. * Binds a buffer that can be used for read or write operations on the GPU.
  139. *
  140. * @param[in] gptype Determines to which GPU program slot to bind the buffer.
  141. * @param[in] unit GPU program unit index to bind the buffer to.
  142. * @param[in] buffer Buffer to bind.
  143. * @param[in] loadStore If true the buffer will be bound with support for unordered reads and writes,
  144. * otherwise it will only be bound for reads.
  145. */
  146. void setBuffer(GpuProgramType gptype, UINT16 unit, const SPtr<GpuBufferCore>& buffer,
  147. bool loadStore = false);
  148. /**
  149. * Creates or retrieves a proper input layout depending on the currently set vertex shader and vertex buffer.
  150. *
  151. * Applies the input layout to the pipeline.
  152. */
  153. void applyInputLayout();
  154. /**
  155. * Recalculates actual viewport dimensions based on currently set viewport normalized dimensions and render target
  156. * and applies them for further rendering.
  157. */
  158. void applyViewport();
  159. /** Creates and populates a set of render system capabilities describing which functionality is available. */
  160. void initCapabilites(IDXGIAdapter* adapter, RenderAPICapabilities& caps) const;
  161. private:
  162. IDXGIFactory* mDXGIFactory;
  163. D3D11Device* mDevice;
  164. D3D11DriverList* mDriverList;
  165. D3D11Driver* mActiveD3DDriver;
  166. D3D_FEATURE_LEVEL mFeatureLevel;
  167. D3D11HLSLProgramFactory* mHLSLFactory;
  168. D3D11InputLayoutManager* mIAManager;
  169. std::pair<SPtr<TextureCore>, SPtr<TextureView>> mBoundUAVs[D3D11_PS_CS_UAV_REGISTER_COUNT];
  170. UINT32 mStencilRef;
  171. Rect2 mViewportNorm;
  172. D3D11_VIEWPORT mViewport;
  173. D3D11_RECT mScissorRect;
  174. SPtr<VertexDeclarationCore> mActiveVertexDeclaration;
  175. SPtr<D3D11GpuProgramCore> mActiveVertexShader;
  176. SPtr<D3D11DepthStencilStateCore> mActiveDepthStencilState;
  177. DrawOperationType mActiveDrawOp;
  178. };
  179. /** @} */
  180. }