2
0

BsD3D11RenderWindow.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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 "BsRenderWindow.h"
  6. namespace BansheeEngine
  7. {
  8. class D3D11RenderWindow;
  9. /**
  10. * @brief Contains various properties that describe a render window.
  11. */
  12. class BS_D3D11_EXPORT D3D11RenderWindowProperties : public RenderWindowProperties
  13. {
  14. public:
  15. D3D11RenderWindowProperties(const RENDER_WINDOW_DESC& desc);
  16. virtual ~D3D11RenderWindowProperties() { }
  17. private:
  18. friend class D3D11RenderWindowCore;
  19. friend class D3D11RenderWindow;
  20. };
  21. /**
  22. * @brief Render window implementation for Windows and DirectX 11.
  23. *
  24. * @note Core thread only.
  25. */
  26. class BS_D3D11_EXPORT D3D11RenderWindowCore : public RenderWindowCore
  27. {
  28. public:
  29. /**
  30. * @copydoc RenderWindowCore::RenderWindowCore
  31. */
  32. D3D11RenderWindowCore(const RENDER_WINDOW_DESC& desc, UINT32 windowId,
  33. D3D11Device& device, IDXGIFactory* DXGIFactory);
  34. ~D3D11RenderWindowCore();
  35. /**
  36. * @copydoc RenderWindowCore::move
  37. */
  38. void move(INT32 left, INT32 top) override;
  39. /**
  40. * @copydoc RenderWindowCore::resize
  41. */
  42. void resize(UINT32 width, UINT32 height) override;
  43. /**
  44. * @copydoc RenderWindowCore::setHidden
  45. */
  46. void setHidden(bool hidden) override;
  47. /**
  48. * @copydoc RenderWindowCore::setActive
  49. */
  50. void setActive(bool state) override;
  51. /**
  52. * @copydoc RenderWindowCore::minimize
  53. */
  54. void minimize() override;
  55. /**
  56. * @copydoc RenderWindowCore::maximize
  57. */
  58. void maximize() override;
  59. /**
  60. * @copydoc RenderWindowCore::restore
  61. */
  62. void restore() override;
  63. /**
  64. * @copydoc RenderWindowCore::setFullscreen(UINT32, UINT32, float, UINT32)
  65. */
  66. void setFullscreen(UINT32 width, UINT32 height, float refreshRate = 60.0f, UINT32 monitorIdx = 0) override;
  67. /**
  68. * @copydoc RenderWindowCore::setFullscreen(const VideoMode&)
  69. */
  70. void setFullscreen(const VideoMode& mode) override;
  71. /**
  72. * @copydoc RenderWindowCore::setWindowed
  73. */
  74. void setWindowed(UINT32 width, UINT32 height) override;
  75. /**
  76. * @copydoc RenderWindowCore::copyContentsToMemory
  77. */
  78. void copyToMemory(PixelData &dst, FrameBuffer buffer);
  79. /**
  80. * @copydoc RenderWindowCore::swapBuffers
  81. */
  82. void swapBuffers() override;
  83. /**
  84. * @copydoc RenderWindowCore::getCustomAttribute
  85. */
  86. void getCustomAttribute(const String& name, void* pData) const override;
  87. /**
  88. * @copydoc RenderWindowCore::_windowMovedOrResized
  89. */
  90. void _windowMovedOrResized() override;
  91. /**
  92. * @brief Returns presentation parameters used for creating the window swap chain.
  93. */
  94. DXGI_SWAP_CHAIN_DESC* _getPresentationParameters() { return &mSwapChainDesc; }
  95. /**
  96. * @brief Returns internal window handle.
  97. */
  98. HWND _getWindowHandle() const;
  99. protected:
  100. friend class D3D11RenderWindow;
  101. /**
  102. * @copydoc CoreObjectCore::initialize
  103. */
  104. virtual void initialize() override;
  105. /**
  106. * @brief Creates internal resources dependent on window size.
  107. */
  108. void createSizeDependedD3DResources();
  109. /**
  110. * @brief Destroys internal resources dependent on window size.
  111. */
  112. void destroySizeDependedD3DResources();
  113. /**
  114. * @brief Queries the current DXGI device. Make sure to release the returned object when done with it.
  115. */
  116. IDXGIDevice* queryDxgiDevice();
  117. /**
  118. * @brief Creates a swap chain for the window.
  119. */
  120. void createSwapChain();
  121. /**
  122. * @brief Resizes all buffers attached to the swap chain to the specified size.
  123. */
  124. void resizeSwapChainBuffers(UINT32 width, UINT32 height);
  125. /**
  126. * @copydoc RenderWindowCore::getProperties
  127. */
  128. const RenderTargetProperties& getPropertiesInternal() const override { return mProperties; }
  129. /**
  130. * @copydoc RenderWindowCore::getSyncedProperties
  131. */
  132. RenderWindowProperties& getSyncedProperties() override { return mSyncedProperties; }
  133. /**
  134. * @copydoc RenderWindowCore::syncProperties
  135. */
  136. void syncProperties() override;
  137. protected:
  138. D3D11Device& mDevice;
  139. IDXGIFactory* mDXGIFactory;
  140. bool mSizing;
  141. bool mIsChild;
  142. bool mShowOnSwap;
  143. DXGI_SAMPLE_DESC mMultisampleType;
  144. UINT32 mRefreshRateNumerator;
  145. UINT32 mRefreshRateDenominator;
  146. ID3D11Texture2D* mBackBuffer;
  147. ID3D11RenderTargetView* mRenderTargetView;
  148. TextureViewPtr mDepthStencilView;
  149. SPtr<TextureCore> mDepthStencilBuffer;
  150. IDXGISwapChain* mSwapChain;
  151. DXGI_SWAP_CHAIN_DESC mSwapChainDesc;
  152. Win32Window* mWindow;
  153. D3D11RenderWindowProperties mProperties;
  154. D3D11RenderWindowProperties mSyncedProperties;
  155. };
  156. /**
  157. * @brief Render window implementation for Windows and DirectX 11.
  158. *
  159. * @note Sim thread only.
  160. */
  161. class BS_D3D11_EXPORT D3D11RenderWindow : public RenderWindow
  162. {
  163. public:
  164. ~D3D11RenderWindow() { }
  165. /**
  166. * @copydoc RenderWindow::screenToWindowPos
  167. */
  168. void getCustomAttribute(const String& name, void* pData) const override;
  169. /**
  170. * @copydoc RenderWindow::screenToWindowPos
  171. */
  172. Vector2I screenToWindowPos(const Vector2I& screenPos) const override;
  173. /**
  174. * @copydoc RenderWindow::windowToScreenPos
  175. */
  176. Vector2I windowToScreenPos(const Vector2I& windowPos) const override;
  177. /**
  178. * @copydoc RenderWindow::getCore
  179. */
  180. SPtr<D3D11RenderWindowCore> getCore() const;
  181. protected:
  182. friend class D3D11RenderWindowManager;
  183. friend class D3D11RenderWindowCore;
  184. D3D11RenderWindow(const RENDER_WINDOW_DESC& desc, UINT32 windowId,
  185. D3D11Device& device, IDXGIFactory* DXGIFactory);
  186. /**
  187. * @copydoc RenderWindowCore::getProperties
  188. */
  189. const RenderTargetProperties& getPropertiesInternal() const override { return mProperties; }
  190. /**
  191. * @copydoc RenderWindow::syncProperties
  192. */
  193. void syncProperties() override;
  194. /**
  195. * @brief Retrieves internal window handle.
  196. */
  197. HWND getHWnd() const;
  198. private:
  199. D3D11Device& mDevice;
  200. IDXGIFactory* mDXGIFactory;
  201. D3D11RenderWindowProperties mProperties;
  202. };
  203. }