BsD3D11RenderAPI.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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 "RenderAPI/BsRenderAPI.h"
  6. namespace bs { namespace ct
  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 D3D11RenderAPI : public RenderAPI
  13. {
  14. public:
  15. D3D11RenderAPI();
  16. ~D3D11RenderAPI();
  17. /** @copydoc RenderAPI::getName */
  18. const StringID& getName() const override;
  19. /** @copydoc RenderAPI::getShadingLanguageName */
  20. const String& getShadingLanguageName() const override;
  21. /** @copydoc RenderAPI::setGraphicsPipeline */
  22. void setGraphicsPipeline(const SPtr<GraphicsPipelineState>& pipelineState,
  23. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  24. /** @copydoc RenderAPI::setComputePipeline */
  25. void setComputePipeline(const SPtr<ComputePipelineState>& pipelineState,
  26. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  27. /** @copydoc RenderAPI::setGpuParams */
  28. void setGpuParams(const SPtr<GpuParams>& gpuParams,
  29. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  30. /** @copydoc RenderAPI::clearRenderTarget */
  31. void clearRenderTarget(UINT32 buffers, const Color& color = Color::Black, float depth = 1.0f, UINT16 stencil = 0,
  32. UINT8 targetMask = 0xFF, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  33. /** @copydoc RenderAPI::clearViewport */
  34. void clearViewport(UINT32 buffers, const Color& color = Color::Black, float depth = 1.0f, UINT16 stencil = 0,
  35. UINT8 targetMask = 0xFF, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  36. /** @copydoc RenderAPI::setRenderTarget */
  37. void setRenderTarget(const SPtr<RenderTarget>& target, UINT32 readOnlyFlags,
  38. RenderSurfaceMask loadMask = RT_NONE, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  39. /** @copydoc RenderAPI::setViewport */
  40. void setViewport(const Rect2& area, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  41. /** @copydoc RenderAPI::setScissorRect */
  42. void setScissorRect(UINT32 left, UINT32 top, UINT32 right, UINT32 bottom,
  43. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  44. /** @copydoc RenderAPI::setStencilRef */
  45. void setStencilRef(UINT32 value, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  46. /** @copydoc RenderAPI::setVertexBuffers */
  47. void setVertexBuffers(UINT32 index, SPtr<VertexBuffer>* buffers, UINT32 numBuffers,
  48. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  49. /** @copydoc RenderAPI::setIndexBuffer */
  50. void setIndexBuffer(const SPtr<IndexBuffer>& buffer,
  51. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  52. /** @copydoc RenderAPI::setVertexDeclaration */
  53. void setVertexDeclaration(const SPtr<VertexDeclaration>& vertexDeclaration,
  54. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  55. /** @copydoc RenderAPI::setDrawOperation */
  56. void setDrawOperation(DrawOperationType op,
  57. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  58. /** @copydoc RenderAPI::draw */
  59. void draw(UINT32 vertexOffset, UINT32 vertexCount, UINT32 instanceCount = 0,
  60. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  61. /** @copydoc RenderAPI::drawIndexed */
  62. void drawIndexed(UINT32 startIndex, UINT32 indexCount, UINT32 vertexOffset, UINT32 vertexCount,
  63. UINT32 instanceCount = 0, const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  64. /** @copydoc RenderAPI::dispatchCompute */
  65. void dispatchCompute(UINT32 numGroupsX, UINT32 numGroupsY = 1, UINT32 numGroupsZ = 1,
  66. const SPtr<CommandBuffer>& commandBuffer = nullptr) override;
  67. /** @copydoc RenderAPI::swapBuffers() */
  68. void swapBuffers(const SPtr<RenderTarget>& target, UINT32 syncMask = 0xFFFFFFFF) override;
  69. /** @copydoc RenderAPI::addCommands() */
  70. void addCommands(const SPtr<CommandBuffer>& commandBuffer, const SPtr<CommandBuffer>& secondary) override;
  71. /** @copydoc RenderAPI::submitCommandBuffer() */
  72. void submitCommandBuffer(const SPtr<CommandBuffer>& commandBuffer, UINT32 syncMask = 0xFFFFFFFF) override;
  73. /** @copydoc RenderAPI::convertProjectionMatrix */
  74. void convertProjectionMatrix(const Matrix4& matrix, Matrix4& dest) override;
  75. /** @copydoc RenderAPI::getAPIInfo */
  76. const RenderAPIInfo& getAPIInfo() const override;
  77. /** @copydoc RenderAPI::generateParamBlockDesc() */
  78. GpuParamBlockDesc generateParamBlockDesc(const String& name, Vector<GpuParamDataDesc>& params) override;
  79. /************************************************************************/
  80. /* Internal use by DX11 backend only */
  81. /************************************************************************/
  82. /**
  83. * Determines DXGI multisample settings from the provided parameters.
  84. *
  85. * @param[in] multisampleCount Number of requested samples.
  86. * @param[in] format Pixel format used by the render target.
  87. * @param[out] outputSampleDesc Output structure that will contain the requested multisample settings.
  88. */
  89. void determineMultisampleSettings(UINT32 multisampleCount, DXGI_FORMAT format, DXGI_SAMPLE_DESC* outputSampleDesc);
  90. /** Returns the main DXGI factory object. */
  91. IDXGIFactory* getDXGIFactory() const { return mDXGIFactory; }
  92. /** Returns the primary DX11 device object. */
  93. D3D11Device& getPrimaryDevice() const { return *mDevice; }
  94. /** Returns information describing all available drivers. */
  95. D3D11DriverList* getDriverList() const { return mDriverList; }
  96. protected:
  97. friend class D3D11RenderAPIFactory;
  98. /** @copydoc RenderAPI::initialize */
  99. void initialize() override;
  100. /** @copydoc RenderAPI::initializeWithWindow */
  101. void initializeWithWindow(const SPtr<RenderWindow>& primaryWindow) override;
  102. /** @copydoc RenderAPI::destroyCore */
  103. void destroyCore() override;
  104. /**
  105. * Creates or retrieves a proper input layout depending on the currently set vertex shader and vertex buffer.
  106. *
  107. * Applies the input layout to the pipeline.
  108. */
  109. void applyInputLayout();
  110. /**
  111. * Recalculates actual viewport dimensions based on currently set viewport normalized dimensions and render target
  112. * and applies them for further rendering.
  113. */
  114. void applyViewport();
  115. /** Creates and populates a set of render system capabilities describing which functionality is available. */
  116. void initCapabilites(IDXGIAdapter* adapter, RenderAPICapabilities& caps) const;
  117. private:
  118. IDXGIFactory* mDXGIFactory;
  119. D3D11Device* mDevice;
  120. D3D11DriverList* mDriverList;
  121. D3D11Driver* mActiveD3DDriver;
  122. D3D_FEATURE_LEVEL mFeatureLevel;
  123. D3D11HLSLProgramFactory* mHLSLFactory;
  124. D3D11InputLayoutManager* mIAManager;
  125. bool mPSUAVsBound;
  126. bool mCSUAVsBound;
  127. UINT32 mStencilRef;
  128. Rect2 mViewportNorm;
  129. D3D11_VIEWPORT mViewport;
  130. D3D11_RECT mScissorRect;
  131. SPtr<VertexDeclaration> mActiveVertexDeclaration;
  132. SPtr<D3D11GpuProgram> mActiveVertexShader;
  133. SPtr<D3D11DepthStencilState> mActiveDepthStencilState;
  134. DrawOperationType mActiveDrawOp;
  135. };
  136. /** @} */
  137. }}