BsD3D11RenderWindow.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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. /** Contains various properties that describe a render window. */
  10. class BS_D3D11_EXPORT D3D11RenderWindowProperties : public RenderWindowProperties
  11. {
  12. public:
  13. D3D11RenderWindowProperties(const RENDER_WINDOW_DESC& desc);
  14. virtual ~D3D11RenderWindowProperties() { }
  15. private:
  16. friend class D3D11RenderWindowCore;
  17. friend class D3D11RenderWindow;
  18. };
  19. /**
  20. * Render window implementation for Windows and DirectX 11.
  21. *
  22. * @note Core thread only.
  23. */
  24. class BS_D3D11_EXPORT D3D11RenderWindowCore : public RenderWindowCore
  25. {
  26. public:
  27. /** @copydoc RenderWindowCore::RenderWindowCore */
  28. D3D11RenderWindowCore(const RENDER_WINDOW_DESC& desc, UINT32 windowId,
  29. D3D11Device& device, IDXGIFactory* DXGIFactory);
  30. ~D3D11RenderWindowCore();
  31. /** @copydoc RenderWindowCore::move */
  32. void move(INT32 left, INT32 top) override;
  33. /** @copydoc RenderWindowCore::resize */
  34. void resize(UINT32 width, UINT32 height) override;
  35. /** @copydoc RenderWindowCore::setHidden */
  36. void setHidden(bool hidden) override;
  37. /** @copydoc RenderWindowCore::setActive */
  38. void setActive(bool state) override;
  39. /** @copydoc RenderWindowCore::minimize */
  40. void minimize() override;
  41. /** @copydoc RenderWindowCore::maximize */
  42. void maximize() override;
  43. /** @copydoc RenderWindowCore::restore */
  44. void restore() override;
  45. /** @copydoc RenderWindowCore::setFullscreen(UINT32, UINT32, float, UINT32) */
  46. void setFullscreen(UINT32 width, UINT32 height, float refreshRate = 60.0f, UINT32 monitorIdx = 0) override;
  47. /** @copydoc RenderWindowCore::setFullscreen(const VideoMode&) */
  48. void setFullscreen(const VideoMode& mode) override;
  49. /** @copydoc RenderWindowCore::setWindowed */
  50. void setWindowed(UINT32 width, UINT32 height) override;
  51. /** @copydoc RenderWindowCore::copyContentsToMemory */
  52. void copyToMemory(PixelData &dst, FrameBuffer buffer);
  53. /** @copydoc RenderWindowCore::swapBuffers */
  54. void swapBuffers() override;
  55. /** @copydoc RenderWindowCore::getCustomAttribute */
  56. void getCustomAttribute(const String& name, void* pData) const override;
  57. /** @copydoc RenderWindowCore::_windowMovedOrResized */
  58. void _windowMovedOrResized() override;
  59. /** Returns presentation parameters used for creating the window swap chain. */
  60. DXGI_SWAP_CHAIN_DESC* _getPresentationParameters() { return &mSwapChainDesc; }
  61. /** Returns internal window handle. */
  62. HWND _getWindowHandle() const;
  63. protected:
  64. friend class D3D11RenderWindow;
  65. /** @copydoc CoreObjectCore::initialize */
  66. virtual void initialize() override;
  67. /** Creates internal resources dependent on window size. */
  68. void createSizeDependedD3DResources();
  69. /** Destroys internal resources dependent on window size. */
  70. void destroySizeDependedD3DResources();
  71. /** Queries the current DXGI device. Make sure to release the returned object when done with it. */
  72. IDXGIDevice* queryDxgiDevice();
  73. /** Creates a swap chain for the window. */
  74. void createSwapChain();
  75. /** Resizes all buffers attached to the swap chain to the specified size. */
  76. void resizeSwapChainBuffers(UINT32 width, UINT32 height);
  77. /** @copydoc RenderWindowCore::getProperties */
  78. const RenderTargetProperties& getPropertiesInternal() const override { return mProperties; }
  79. /** @copydoc RenderWindowCore::getSyncedProperties */
  80. RenderWindowProperties& getSyncedProperties() override { return mSyncedProperties; }
  81. /** @copydoc RenderWindowCore::syncProperties */
  82. void syncProperties() override;
  83. protected:
  84. D3D11Device& mDevice;
  85. IDXGIFactory* mDXGIFactory;
  86. bool mSizing;
  87. bool mIsChild;
  88. bool mShowOnSwap;
  89. DXGI_SAMPLE_DESC mMultisampleType;
  90. UINT32 mRefreshRateNumerator;
  91. UINT32 mRefreshRateDenominator;
  92. ID3D11Texture2D* mBackBuffer;
  93. ID3D11RenderTargetView* mRenderTargetView;
  94. TextureViewPtr mDepthStencilView;
  95. SPtr<TextureCore> mDepthStencilBuffer;
  96. IDXGISwapChain* mSwapChain;
  97. DXGI_SWAP_CHAIN_DESC mSwapChainDesc;
  98. Win32Window* mWindow;
  99. D3D11RenderWindowProperties mProperties;
  100. D3D11RenderWindowProperties mSyncedProperties;
  101. };
  102. /**
  103. * Render window implementation for Windows and DirectX 11.
  104. *
  105. * @note Sim thread only.
  106. */
  107. class BS_D3D11_EXPORT D3D11RenderWindow : public RenderWindow
  108. {
  109. public:
  110. ~D3D11RenderWindow() { }
  111. /** @copydoc RenderWindow::screenToWindowPos */
  112. void getCustomAttribute(const String& name, void* pData) const override;
  113. /** @copydoc RenderWindow::screenToWindowPos */
  114. Vector2I screenToWindowPos(const Vector2I& screenPos) const override;
  115. /** @copydoc RenderWindow::windowToScreenPos */
  116. Vector2I windowToScreenPos(const Vector2I& windowPos) const override;
  117. /** @copydoc RenderWindow::getCore */
  118. SPtr<D3D11RenderWindowCore> getCore() const;
  119. protected:
  120. friend class D3D11RenderWindowManager;
  121. friend class D3D11RenderWindowCore;
  122. D3D11RenderWindow(const RENDER_WINDOW_DESC& desc, UINT32 windowId,
  123. D3D11Device& device, IDXGIFactory* DXGIFactory);
  124. /** @copydoc RenderWindowCore::getProperties */
  125. const RenderTargetProperties& getPropertiesInternal() const override { return mProperties; }
  126. /** @copydoc RenderWindow::syncProperties */
  127. void syncProperties() override;
  128. /** Retrieves internal window handle. */
  129. HWND getHWnd() const;
  130. private:
  131. D3D11Device& mDevice;
  132. IDXGIFactory* mDXGIFactory;
  133. D3D11RenderWindowProperties mProperties;
  134. };
  135. }