BsD3D11RenderAPI.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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 BansheeEngine
  7. {
  8. /**
  9. * @brief Implementation of a render system using DirectX 11. Provides abstracted
  10. * access to various low level DX11 methods.
  11. */
  12. class BS_D3D11_EXPORT D3D11RenderAPI : public RenderAPICore
  13. {
  14. public:
  15. D3D11RenderAPI();
  16. ~D3D11RenderAPI();
  17. /**
  18. * @copydoc RenderAPICore::getName
  19. */
  20. const StringID& getName() const override;
  21. /**
  22. * @copydoc RenderAPICore::getShadingLanguageName
  23. */
  24. const String& getShadingLanguageName() const override;
  25. /**
  26. * @copydoc RenderAPICore::setBlendState
  27. */
  28. void setBlendState(const SPtr<BlendStateCore>& blendState) override;
  29. /**
  30. * @copydoc RenderAPICore::setRasterizerState
  31. */
  32. void setRasterizerState(const SPtr<RasterizerStateCore>& rasterizerState) override;
  33. /**
  34. * @copydoc RenderAPICore::setDepthStencilState
  35. */
  36. void setDepthStencilState(const SPtr<DepthStencilStateCore>& depthStencilState, UINT32 stencilRefValue) override;
  37. /**
  38. * @copydoc RenderAPICore::setSamplerState
  39. */
  40. void setSamplerState(GpuProgramType gptype, UINT16 texUnit, const SPtr<SamplerStateCore>& samplerState) override;
  41. /**
  42. * @copydoc RenderAPICore::setTexture
  43. */
  44. void setTexture(GpuProgramType gptype, UINT16 unit, bool enabled, const SPtr<TextureCore>& texPtr) override;
  45. /**
  46. * @copydoc RenderAPICore::setLoadStoreTexture
  47. */
  48. void setLoadStoreTexture(GpuProgramType gptype, UINT16 unit, bool enabled, const SPtr<TextureCore>& texPtr,
  49. const TextureSurface& surface) override;
  50. /**
  51. * @copydoc RenderAPICore::disableTextureUnit
  52. */
  53. void disableTextureUnit(GpuProgramType gptype, UINT16 texUnit) override;
  54. /**
  55. * @copydoc RenderAPICore::beginFrame
  56. */
  57. void beginFrame() override;
  58. /**
  59. * @copydoc RenderAPICore::endFrame
  60. */
  61. void endFrame() override;
  62. /**
  63. * @copydoc RenderAPICore::clearRenderTarget
  64. */
  65. void clearRenderTarget(UINT32 buffers, const Color& color = Color::Black, float depth = 1.0f, UINT16 stencil = 0,
  66. UINT8 targetMask = 0xFF) override;
  67. /**
  68. * @copydoc RenderAPICore::clearViewport
  69. */
  70. void clearViewport(UINT32 buffers, const Color& color = Color::Black, float depth = 1.0f, UINT16 stencil = 0,
  71. UINT8 targetMask = 0xFF) override;
  72. /**
  73. * @copydoc RenderAPICore::setRenderTarget
  74. */
  75. void setRenderTarget(const SPtr<RenderTargetCore>& target, bool readOnlyDepthStencil = false) override;
  76. /**
  77. * @copydoc RenderAPICore::setViewport
  78. */
  79. void setViewport(const Rect2& vp) override;
  80. /**
  81. * @copydoc RenderAPICore::setScissorRect
  82. */
  83. void setScissorRect(UINT32 left, UINT32 top, UINT32 right, UINT32 bottom) override;
  84. /**
  85. * @copydoc RenderAPICore::setVertexBuffers
  86. */
  87. void setVertexBuffers(UINT32 index, SPtr<VertexBufferCore>* buffers, UINT32 numBuffers) override;
  88. /**
  89. * @copydoc RenderAPICore::setIndexBuffer
  90. */
  91. void setIndexBuffer(const SPtr<IndexBufferCore>& buffer) override;
  92. /**
  93. * @copydoc RenderAPICore::setVertexDeclaration
  94. */
  95. void setVertexDeclaration(const SPtr<VertexDeclarationCore>& vertexDeclaration) override;
  96. /**
  97. * @copydoc RenderAPICore::setDrawOperation
  98. */
  99. void setDrawOperation(DrawOperationType op) override;
  100. /**
  101. * @copydoc RenderAPICore::draw
  102. */
  103. void draw(UINT32 vertexOffset, UINT32 vertexCount) override;
  104. /**
  105. * @copydoc RenderAPICore::drawIndexed
  106. */
  107. void drawIndexed(UINT32 startIndex, UINT32 indexCount, UINT32 vertexOffset, UINT32 vertexCount) override;
  108. /**
  109. * @copydoc RenderAPICore::drawIndexed()
  110. */
  111. void dispatchCompute(UINT32 numGroupsX, UINT32 numGroupsY = 1, UINT32 numGroupsZ = 1) override;
  112. /**
  113. * @copydoc RenderAPICore::bindGpuProgram
  114. */
  115. void bindGpuProgram(const SPtr<GpuProgramCore>& prg) override;
  116. /**
  117. * @copydoc RenderAPICore::unbindGpuProgram
  118. */
  119. void unbindGpuProgram(GpuProgramType gptype) override;
  120. /**
  121. * @copydoc RenderAPICore::setConstantBuffers
  122. */
  123. void setConstantBuffers(GpuProgramType gptype, const SPtr<GpuParamsCore>& params) override;
  124. /**
  125. * @copydoc RenderAPICore::setClipPlanesImpl
  126. */
  127. void setClipPlanesImpl(const PlaneList& clipPlanes) override;
  128. /**
  129. * @copydoc RenderAPICore::convertProjectionMatrix
  130. */
  131. void convertProjectionMatrix(const Matrix4& matrix, Matrix4& dest) override;
  132. /**
  133. * @copydoc RenderAPICore::getColorVertexElementType
  134. */
  135. VertexElementType getColorVertexElementType() const override;
  136. /**
  137. * @copydoc RenderAPICore::getHorizontalTexelOffset
  138. */
  139. float getHorizontalTexelOffset() override;
  140. /**
  141. * @copydoc RenderAPICore::getVerticalTexelOffset
  142. */
  143. float getVerticalTexelOffset() override;
  144. /**
  145. * @copydoc RenderAPICore::getMinimumDepthInputValue
  146. */
  147. float getMinimumDepthInputValue() override;
  148. /**
  149. * @copydoc RenderAPICore::getMaximumDepthInputValue
  150. */
  151. float getMaximumDepthInputValue() override;
  152. /**
  153. * @copydoc RenderAPICore::generateParamBlockDesc()
  154. */
  155. GpuParamBlockDesc generateParamBlockDesc(const String& name, Vector<GpuParamDataDesc>& params) override;
  156. /************************************************************************/
  157. /* Internal use by DX11 RenderSystem only */
  158. /************************************************************************/
  159. /**
  160. * @brief Determines DXGI multisample settings from the provided parameters.
  161. *
  162. * @param multisampleCount Number of requested samples.
  163. * @param format Pixel format used by the render target.
  164. * @param outputSampleDesc Output structure that will contain the requested multisample settings.
  165. */
  166. void determineMultisampleSettings(UINT32 multisampleCount, DXGI_FORMAT format, DXGI_SAMPLE_DESC* outputSampleDesc);
  167. /**
  168. * @brief Returns the main DXGI factory object.
  169. */
  170. IDXGIFactory* getDXGIFactory() const { return mDXGIFactory; }
  171. /**
  172. * @brief Returns the primary DX11 device object.
  173. */
  174. D3D11Device& getPrimaryDevice() const { return *mDevice; }
  175. /**
  176. * @brief Returns information describing all available drivers.
  177. */
  178. D3D11DriverList* getDriverList() const { return mDriverList; }
  179. protected:
  180. friend class D3D11RenderAPIFactory;
  181. /**
  182. * @copydoc RenderAPICore::initializePrepare
  183. */
  184. void initializePrepare() override;
  185. /**
  186. * @copydoc RenderAPICore::initializeFinalize
  187. */
  188. void initializeFinalize(const SPtr<RenderWindowCore>& primaryWindow) override;
  189. /**
  190. * @copydoc RenderAPICore::destroy_internal
  191. */
  192. void destroyCore() override;
  193. /**
  194. * @brief Creates or retrieves a proper input layout depending on the currently set vertex shader
  195. * and vertex buffer.
  196. *
  197. * Applies the input layout to the pipeline.
  198. */
  199. void applyInputLayout();
  200. /**
  201. * @brief Recalculates actual viewport dimensions based on currently
  202. * set viewport normalized dimensions and render target and applies
  203. * them for further rendering.
  204. */
  205. void applyViewport();
  206. /**
  207. * @brief Creates and populates a set of render system capabilities describing which functionality
  208. * is available.
  209. */
  210. RenderAPICapabilities* createRenderSystemCapabilities() const;
  211. private:
  212. IDXGIFactory* mDXGIFactory;
  213. D3D11Device* mDevice;
  214. D3D11DriverList* mDriverList;
  215. D3D11Driver* mActiveD3DDriver;
  216. D3D_FEATURE_LEVEL mFeatureLevel;
  217. D3D11HLSLProgramFactory* mHLSLFactory;
  218. D3D11InputLayoutManager* mIAManager;
  219. std::pair<SPtr<TextureCore>, TextureViewPtr> mBoundUAVs[D3D11_PS_CS_UAV_REGISTER_COUNT];
  220. UINT32 mStencilRef;
  221. Rect2 mViewportNorm;
  222. D3D11_VIEWPORT mViewport;
  223. D3D11_RECT mScissorRect;
  224. SPtr<VertexDeclarationCore> mActiveVertexDeclaration;
  225. SPtr<D3D11GpuProgramCore> mActiveVertexShader;
  226. DrawOperationType mActiveDrawOp;
  227. };
  228. }