NAP
renderwindow.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Local Includes
8 #include "renderutils.h"
9 #include "irendertarget.h"
10 
11 // External Includes
12 #include <window.h>
13 #include <rect.h>
14 
15 // SDL Forward declares
16 struct SDL_Window;
17 
18 namespace nap
19 {
20  // Forward Declares
21  class Core;
22  class RenderService;
23 
43  class NAPAPI RenderWindow : public Window, public IRenderTarget
44  {
45  RTTI_ENABLE(Window)
46  friend class RenderService;
47  public:
52  enum class EPresentationMode : int
53  {
54  Immediate,
55  Mailbox,
56  FIFO_Relaxed,
57  FIFO
58  };
59 
64  RenderWindow(Core& core);
65 
69  RenderWindow(Core& core, SDL_Window* windowHandle);
70 
74  ~RenderWindow() override;
75 
79  bool init(utility::ErrorState& errorState) override;
80 
84  void onDestroy() override;
85 
92  const glm::ivec2 getSize() const;
93 
100  int getWidth() const { return getSize().x; }
101 
106  int getWidthPixels() const { return getBufferSize().x; }
107 
114  int getHeight() const { return getSize().y; }
115 
120  int getHeightPixels() const { return getBufferSize().y; }
121 
126  const glm::ivec2 getBufferSize() const override;
127 
132  void show();
133 
137  void hide();
138 
142  const std::string& getTitle() const { return mTitle; }
143 
147  void setTitle(std::string newTitle);
148 
152  bool isResizable() const { return mResizable; }
153 
159  void setFullscreen(bool value);
160 
164  void toggleFullscreen();
165 
170  void setWidth(int width);
171 
176  void setHeight(int height);
177 
182  void setSize(const glm::ivec2& size);
183 
188  void setClearColor(const RGBAColorFloat& color) override;
189 
194  const RGBAColorFloat& getClearColor() const override;
195 
200  void setPosition(const glm::ivec2& position) const;
201 
205  glm::ivec2 getPosition() const;
206 
213  float getPixelDensity() const;
214 
224  float getDisplayScale() const;
225 
230  void setAlwaysOnTop(bool onTop);
231 
235  SDL_Window* getNativeWindow() const;
236 
240  bool isEmbedded() const { return mExternalHandle != nullptr; }
241 
245  bool isMinimized() const;
246 
251  bool isHidden() const;
252 
256  bool isOccluded() const;
257 
261  uint getNumber() const override;
262 
269  math::Rect getRect() const;
270 
275  math::Rect getRectPixels() const;
276 
280  inline float getRatio() const { return static_cast<float>(getBufferSize().y) / static_cast<float>(getBufferSize().x); }
281 
285  void beginRendering() override;
286 
290  void endRendering() override;
291 
295  VkFormat getColorFormat() const override { return mSwapchainFormat; }
296 
300  VkFormat getDepthFormat() const override;
301 
305  VkSampleCountFlagBits getSampleCount() const override { return mRasterizationSamples; }
306 
310  bool getSampleShadingEnabled() const override { return mSampleShadingEnabled; }
311 
315  ECullWindingOrder getWindingOrder() const override;
316 
320  VkRenderPass getRenderPass() const override { return mRenderPass; }
321 
325  VkImageLayout getFinalLayout() const override { return VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; }
326 
330  int getDisplayIndex() const;
331 
332  bool mSampleShading = true;
333  int mWidth = 512;
334  int mHeight = 512;
335  bool mBorderless = false;
336  bool mResizable = true;
337  bool mVisible = true;
338  bool mAlwaysOnTop = false;
339  EPresentationMode mMode = EPresentationMode::Immediate;
340  std::string mTitle = "";
341  RGBAColorFloat mClearColor = { 0.0f, 0.0f, 0.0f, 1.0f };
343  int mAddedSwapImages = 1;
344  bool mClear = true;
345  bool mRestorePosition = true;
346  bool mRestoreSize = true;
347 
348  private:
349  RenderService* mRenderService = nullptr;
350  SDL_Window* mSDLWindow = nullptr;
351  VkSampleCountFlagBits mRasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
352  VkDevice mDevice = VK_NULL_HANDLE;
353  VkSurfaceKHR mSurface = VK_NULL_HANDLE;
354  VkSwapchainKHR mSwapchain = VK_NULL_HANDLE;
355  VkRenderPass mRenderPass = VK_NULL_HANDLE;
356  VkQueue mPresentQueue = VK_NULL_HANDLE;
357  VkFormat mSwapchainFormat = VK_FORMAT_UNDEFINED;
358  std::vector<VkImageView> mSwapChainImageViews;
359  std::vector<VkFramebuffer> mSwapChainFramebuffers;
360  std::vector<VkCommandBuffer> mCommandBuffers;
361  std::vector<VkSemaphore> mAcquireSemaphores;
362  std::vector<VkSemaphore> mSubmitSemaphores;
363  VkPresentModeKHR mPresentationMode = VK_PRESENT_MODE_MAILBOX_KHR;
364  ImageData mDepthImage;
365  ImageData mColorImage;
366  bool mSampleShadingEnabled = false;
367  uint32 mImageIndex = 0;
368  bool mRecreateSwapchain = false;
369  VkSurfaceCapabilitiesKHR mSurfaceCapabilities;
370  VkExtent2D mSwapchainExtent = {0,0};
371  SDL_Window* mExternalHandle = nullptr;
372 
379  VkCommandBuffer beginRecording();
380 
385  void endRecording();
386 
390  bool getSurfaceCapabilities(utility::ErrorState& error);
391 
397  bool recreateSwapChain(utility::ErrorState& errorState);
398 
404  bool createSwapChainResources(utility::ErrorState& errorState);
405 
409  void destroySwapChainResources();
410 
414  bool validSwapchainExtent() const;
415  };
416 }
nap::uint
unsigned int uint
Definition: numeric.h:23
nap::IRenderTarget
Definition: irendertarget.h:21
nap::RenderWindow
Definition: renderwindow.h:43
nap::ERasterizationSamples::Four
@ Four
nap::ERasterizationSamples
ERasterizationSamples
Definition: renderutils.h:25
nap::RGBAColor< float >
nap::RenderWindow::getSampleCount
VkSampleCountFlagBits getSampleCount() const override
Definition: renderwindow.h:305
nap::ECullWindingOrder
ECullWindingOrder
Definition: materialcommon.h:30
nap::RenderWindow::getTitle
const std::string & getTitle() const
Definition: renderwindow.h:142
nap::math::Rect
Definition: rect.h:19
nap::RenderWindow::getHeight
int getHeight() const
Definition: renderwindow.h:114
nap::utility::ErrorState
Definition: errorstate.h:19
nap::RenderWindow::EPresentationMode
EPresentationMode
Definition: renderwindow.h:52
nap::RenderWindow::isResizable
bool isResizable() const
Definition: renderwindow.h:152
nap::RenderWindow::getHeightPixels
int getHeightPixels() const
Definition: renderwindow.h:120
nap::uint32
uint32_t uint32
Definition: numeric.h:20
nap::ImageData
Definition: imagedata.h:23
nap::RenderService
Definition: renderservice.h:198
nap::Core
Definition: core.h:82
nap::RenderWindow::getColorFormat
VkFormat getColorFormat() const override
Definition: renderwindow.h:295
nap::RenderWindow::getSampleShadingEnabled
bool getSampleShadingEnabled() const override
Definition: renderwindow.h:310
nap::RenderWindow::getRatio
float getRatio() const
Definition: renderwindow.h:280
nap::RenderWindow::getWidthPixels
int getWidthPixels() const
Definition: renderwindow.h:106
nap
Definition: templateapp.h:17
nap::RenderWindow::getRenderPass
VkRenderPass getRenderPass() const override
Definition: renderwindow.h:320
nap::Window
Definition: window.h:26
nap::RenderWindow::getWidth
int getWidth() const
Definition: renderwindow.h:100
nap::RenderWindow::isEmbedded
bool isEmbedded() const
Definition: renderwindow.h:240
nap::RenderWindow::getFinalLayout
VkImageLayout getFinalLayout() const override
Definition: renderwindow.h:325