BsLinuxRenderWindow.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. /** @copydoc RenderWindow::createCore() */
  46. SPtr<ct::CoreObject> createCore() const override;
  47. private:
  48. ct::LinuxGLSupport& mGLSupport;
  49. RenderWindowProperties mProperties;
  50. };
  51. namespace ct
  52. {
  53. /**
  54. * Render window implementation for Linux.
  55. *
  56. * @note Core thread only.
  57. */
  58. class LinuxRenderWindow : public RenderWindow
  59. {
  60. public:
  61. LinuxRenderWindow(const RENDER_WINDOW_DESC& desc, UINT32 windowId, LinuxGLSupport &glSupport);
  62. ~LinuxRenderWindow();
  63. /** @copydoc RenderWindow::setFullscreen(UINT32, UINT32, float, UINT32) */
  64. void setFullscreen(UINT32 width, UINT32 height, float refreshRate = 60.0f, UINT32 monitorIdx = 0) override;
  65. /** @copydoc RenderWindow::setFullscreen(const VideoMode&) */
  66. void setFullscreen(const VideoMode& videoMode) override;
  67. /** @copydoc RenderWindow::setWindowed */
  68. void setWindowed(UINT32 width, UINT32 height) override;
  69. /** @copydoc RenderWindow::setHidden */
  70. void setHidden(bool hidden) override;
  71. /** @copydoc RenderWindow::minimize */
  72. void minimize() override;
  73. /** @copydoc RenderWindow::maximize */
  74. void maximize() override;
  75. /** @copydoc RenderWindow::restore */
  76. void restore() override;
  77. /** @copydoc RenderWindow::move */
  78. void move(INT32 left, INT32 top) override;
  79. /** @copydoc RenderWindow::resize */
  80. void resize(UINT32 width, UINT32 height) override;
  81. /** @copydoc RenderWindow::setVSync */
  82. void setVSync(bool enabled, UINT32 interval = 1) override;
  83. /**
  84. * Copies the contents of a frame buffer into the pre-allocated buffer.
  85. *
  86. * @param[out] dst Previously allocated buffer to read the contents into. Must be of valid size.
  87. * @param[in] buffer Frame buffer to read the contents from.
  88. */
  89. void copyToMemory(PixelData& dst, FrameBuffer buffer);
  90. /** @copydoc RenderWindow::swapBuffers */
  91. void swapBuffers(UINT32 syncMask) override;
  92. /** @copydoc RenderWindow::getCustomAttribute */
  93. void getCustomAttribute(const String& name, void* pData) const override;
  94. /** @copydoc RenderWindow::setActive */
  95. void setActive(bool state) override;
  96. /** @copydoc RenderWindow::_windowMovedOrResized */
  97. void _windowMovedOrResized() override;
  98. /** Returns a lock that can be used for accessing synced properties. */
  99. SpinLock& _getPropertiesLock() { return mLock;}
  100. /** Returns the internal X11 window that this object wraps. */
  101. LinuxWindow* _getInternal() const { return mWindow; }
  102. protected:
  103. friend class LinuxGLSupport;
  104. /** Changes the video mode to the specified RandR mode on the specified output device. */
  105. void setVideoMode(INT32 screen, RROutput output, RRMode mode);
  106. /** @copydoc CoreObject::initialize */
  107. void initialize() override;
  108. /** @copydoc RenderWindow::getProperties */
  109. const RenderTargetProperties& getPropertiesInternal() const override { return mProperties; }
  110. /** @copydoc RenderWindow::getSyncedProperties */
  111. RenderWindowProperties& getSyncedProperties() override { return mSyncedProperties; }
  112. /** @copydoc RenderWindow::syncProperties */
  113. void syncProperties() override;
  114. protected:
  115. friend class bs::LinuxRenderWindow;
  116. LinuxWindow* mWindow;
  117. LinuxGLSupport& mGLSupport;
  118. SPtr<LinuxContext> mContext;
  119. RenderWindowProperties mProperties;
  120. RenderWindowProperties mSyncedProperties;
  121. bool mIsChild;
  122. bool mShowOnSwap;
  123. };
  124. }
  125. /** @} */
  126. }