BsLinuxRenderWindow.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "RenderAPI/BsRenderWindow.h"
  5. #include <X11/extensions/Xrandr.h>
  6. namespace bs
  7. {
  8. class LinuxWindow;
  9. class LinuxRenderWindow;
  10. namespace ct
  11. {
  12. class LinuxGLSupport;
  13. class LinuxContext;
  14. class LinuxRenderWindow;
  15. }
  16. /** @addtogroup GL
  17. * @{
  18. */
  19. /**
  20. * Render window implementation for Linux.
  21. *
  22. * @note Sim thread only.
  23. */
  24. class LinuxRenderWindow : public RenderWindow
  25. {
  26. public:
  27. ~LinuxRenderWindow() { }
  28. /** @copydoc RenderWindow::getCustomAttribute */
  29. void getCustomAttribute(const String& name, void* pData) const override;
  30. /** @copydoc RenderWindow::screenToWindowPos */
  31. Vector2I screenToWindowPos(const Vector2I& screenPos) const override;
  32. /** @copydoc RenderWindow::windowToScreenPos */
  33. Vector2I windowToScreenPos(const Vector2I& windowPos) const override;
  34. /** @copydoc RenderWindow::getCore */
  35. SPtr<ct::LinuxRenderWindow> getCore() const;
  36. protected:
  37. friend class GLRenderWindowManager;
  38. friend class ct::LinuxGLSupport;
  39. friend class ct::LinuxRenderWindow;
  40. LinuxRenderWindow(const RENDER_WINDOW_DESC& desc, UINT32 windowId, ct::LinuxGLSupport& glSupport);
  41. /** @copydoc RenderWindow::getProperties */
  42. const RenderTargetProperties& getPropertiesInternal() const override { return mProperties; }
  43. /** @copydoc RenderWindow::syncProperties */
  44. void syncProperties() override;
  45. private:
  46. ct::LinuxGLSupport& mGLSupport;
  47. RenderWindowProperties mProperties;
  48. };
  49. namespace ct
  50. {
  51. /**
  52. * Render window implementation for Linux.
  53. *
  54. * @note Core thread only.
  55. */
  56. class LinuxRenderWindow : public RenderWindow
  57. {
  58. public:
  59. LinuxRenderWindow(const RENDER_WINDOW_DESC& desc, UINT32 windowId, LinuxGLSupport &glSupport);
  60. ~LinuxRenderWindow();
  61. /** @copydoc RenderWindow::setFullscreen(UINT32, UINT32, float, UINT32) */
  62. void setFullscreen(UINT32 width, UINT32 height, float refreshRate = 60.0f, UINT32 monitorIdx = 0) override;
  63. /** @copydoc RenderWindow::setFullscreen(const VideoMode&) */
  64. void setFullscreen(const VideoMode& videoMode) override;
  65. /** @copydoc RenderWindow::setWindowed */
  66. void setWindowed(UINT32 width, UINT32 height) override;
  67. /** @copydoc RenderWindow::setHidden */
  68. void setHidden(bool hidden) override;
  69. /** @copydoc RenderWindow::minimize */
  70. void minimize() override;
  71. /** @copydoc RenderWindow::maximize */
  72. void maximize() override;
  73. /** @copydoc RenderWindow::restore */
  74. void restore() override;
  75. /** @copydoc RenderWindow::move */
  76. void move(INT32 left, INT32 top) override;
  77. /** @copydoc RenderWindow::resize */
  78. void resize(UINT32 width, UINT32 height) override;
  79. /** @copydoc RenderWindow::setVSync */
  80. void setVSync(bool enabled, UINT32 interval = 1) override;
  81. /**
  82. * Copies the contents of a frame buffer into the pre-allocated buffer.
  83. *
  84. * @param[out] dst Previously allocated buffer to read the contents into. Must be of valid size.
  85. * @param[in] buffer Frame buffer to read the contents from.
  86. */
  87. void copyToMemory(PixelData& dst, FrameBuffer buffer);
  88. /** @copydoc RenderWindow::swapBuffers */
  89. void swapBuffers(UINT32 syncMask) override;
  90. /** @copydoc RenderWindow::getCustomAttribute */
  91. void getCustomAttribute(const String& name, void* pData) const override;
  92. /** @copydoc RenderWindow::setActive */
  93. void setActive(bool state) override;
  94. /** @copydoc RenderWindow::_windowMovedOrResized */
  95. void _windowMovedOrResized() override;
  96. /** Returns a lock that can be used for accessing synced properties. */
  97. SpinLock& _getPropertiesLock() { return mLock;}
  98. /** Returns the internal X11 window that this object wraps. */
  99. LinuxWindow* _getInternal() const { return mWindow; }
  100. protected:
  101. friend class LinuxGLSupport;
  102. /** Changes the video mode to the specified RandR mode on the specified output device. */
  103. void setVideoMode(INT32 screen, RROutput output, RRMode mode);
  104. /** @copydoc CoreObject::initialize */
  105. void initialize() override;
  106. /** @copydoc RenderWindow::getProperties */
  107. const RenderTargetProperties& getPropertiesInternal() const override { return mProperties; }
  108. /** @copydoc RenderWindow::getSyncedProperties */
  109. RenderWindowProperties& getSyncedProperties() override { return mSyncedProperties; }
  110. /** @copydoc RenderWindow::syncProperties */
  111. void syncProperties() override;
  112. protected:
  113. friend class bs::LinuxRenderWindow;
  114. LinuxWindow* mWindow;
  115. LinuxGLSupport& mGLSupport;
  116. SPtr<LinuxContext> mContext;
  117. RenderWindowProperties mProperties;
  118. RenderWindowProperties mSyncedProperties;
  119. bool mIsChild;
  120. bool mShowOnSwap;
  121. };
  122. }
  123. /** @} */
  124. }