NAP
renderservice.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 "vk_mem_alloc.h"
9 #include "pipelinekey.h"
10 #include "renderutils.h"
11 
12 // External Includes
13 #include <nap/service.h>
14 #include <windowevent.h>
15 #include <rendertarget.h>
16 #include <material.h>
17 #include <rect.h>
18 
19 namespace nap
20 {
21  // Forward Declares
22  class CameraComponentInstance;
23  class RenderableComponentInstance;
24  class RenderWindow;
25  class RenderService;
26  class SceneService;
27  class DescriptorSetCache;
28  class DescriptorSetAllocator;
29  class RenderableMesh;
30  class IMesh;
31  class MaterialInstance;
32  class ComputeMaterialInstance;
33  class ComputeComponentInstance;
34  class Texture2D;
35 
36 
38  // Render Service Configuration
40 
45  {
46  RTTI_ENABLE(ServiceConfiguration)
47  public:
51  enum class EPhysicalDeviceType : int
52  {
53  Integrated = 1,
54  Discrete = 2,
55  Virtual = 3,
56  CPU = 4
57  };
58 
59  bool mHeadless = false;
60  EPhysicalDeviceType mPreferredGPU = EPhysicalDeviceType::Discrete;
61  std::vector<std::string> mLayers = { "VK_LAYER_KHRONOS_validation" };
62  std::vector<std::string> mAdditionalExtensions = { };
63  uint32 mVulkanVersionMajor = 1;
64  uint32 mVulkanVersionMinor = 0;
65  uint32 mAnisotropicFilterSamples = 8;
66  bool mEnableHighDPIMode = true;
67  bool mEnableCompute = true;
68  bool mEnableCaching = true;
69  bool mEnableRobustBufferAccess = false;
70  bool mPrintAvailableLayers = false;
71  bool mPrintAvailableExtensions = false;
72 
73  virtual rtti::TypeInfo getServiceType() const override { return RTTI_OF(RenderService); }
74  };
75 
76 
78  // Render Physical Device
80 
84  class NAPAPI PhysicalDevice final
85  {
86  public:
87  // Default constructor, invalid object
88  PhysicalDevice() = default;
89 
90  // Called by the render service
91  PhysicalDevice(VkPhysicalDevice device, const VkPhysicalDeviceProperties& properties, const VkQueueFlags& queueCapabilities, int queueIndex);
92 
96  VkPhysicalDevice getHandle() const { return mDevice; }
97 
101  int getQueueIndex() const { return mQueueIndex; }
102 
106  const VkPhysicalDeviceProperties& getProperties() const { return mProperties; }
107 
111  const VkPhysicalDeviceFeatures& getFeatures() const { return mFeatures; }
112 
116  const VkQueueFlags& getQueueCapabilities() const { return mQueueCapabilities; }
117 
121  bool isValid() const { return mDevice != VK_NULL_HANDLE && mQueueIndex >= 0; }
122 
123  private:
124  VkPhysicalDevice mDevice = VK_NULL_HANDLE;
125  VkPhysicalDeviceProperties mProperties;
126  VkPhysicalDeviceFeatures mFeatures;
127  VkQueueFlags mQueueCapabilities;
128  int mQueueIndex = -1;
129  };
130 
131 
133  // Display
135 
139  class NAPAPI Display final
140  {
141  public:
146  Display(int index);
147 
151  int getIndex() const { return mIndex; }
152 
157  float getDiagonalDPI() const { return mDDPI; }
158 
163  float getHorizontalDPI() const { return mHDPI; }
164 
169  float getVerticalDPI() const { return mVDPI; }
170 
175  const std::string& getName() const { return mName; }
176 
180  const glm::ivec2& getMin() const { return mMin; }
181 
185  const glm::ivec2& getMax() const { return mMax; }
186 
190  math::Rect getBounds() const;
191 
196  bool isValid() const { return mValid; }
197 
201  std::string toString() const;
202 
206  bool operator== (const Display& rhs) const { return rhs.getIndex() == this->getIndex(); }
207 
211  bool operator!=(const Display& rhs) const { return !(rhs == *this); }
212 
213  private:
214  std::string mName;
215  int mIndex = -1;
216  float mDDPI = 96.0f;
217  float mHDPI = 96.0f;
218  float mVDPI = 96.0f;
219  glm::ivec2 mMin = { 0, 0 };
220  glm::ivec2 mMax = { 0, 0 };
221  bool mValid = false;
222  };
223  using DisplayList = std::vector<Display>;
224 
225 
227  // Render Service
229 
268  class NAPAPI RenderService : public Service
269  {
270  friend class Texture2D;
271  friend class GPUBuffer;
272  friend class RenderWindow;
273  RTTI_ENABLE(Service)
274  public:
275  using SortFunction = std::function<void(std::vector<RenderableComponentInstance*>&, const CameraComponentInstance&)>;
276  using VulkanObjectDestructor = std::function<void(RenderService&)>;
277 
281  struct Pipeline
282  {
287  bool isValid() const { return mPipeline != VK_NULL_HANDLE && mLayout != VK_NULL_HANDLE; }
288 
289  VkPipeline mPipeline = VK_NULL_HANDLE;
290  VkPipelineLayout mLayout = VK_NULL_HANDLE;
291  };
292 
297  RenderService(ServiceConfiguration* configuration);
298 
299  // Default destructor
300  virtual ~RenderService();
301 
322  void beginFrame();
323 
340  void endFrame();
341 
358  bool beginHeadlessRecording();
359 
374  void endHeadlessRecording();
375 
391  bool beginRecording(RenderWindow& renderWindow);
392 
407  void endRecording();
408 
426  bool beginComputeRecording();
427 
443  void endComputeRecording();
444 
453  void renderObjects(IRenderTarget& renderTarget, CameraComponentInstance& camera);
454 
462  void renderObjects(IRenderTarget& renderTarget, CameraComponentInstance& camera, const SortFunction& sortFunction);
463 
472  void renderObjects(IRenderTarget& renderTarget, CameraComponentInstance& camera, const std::vector<RenderableComponentInstance*>& comps);
473 
482  void renderObjects(IRenderTarget& renderTarget, CameraComponentInstance& camera, const std::vector<RenderableComponentInstance*>& comps, const SortFunction& sortFunction);
483 
489  void computeObjects(const std::vector<ComputeComponentInstance*>& comps);
490 
496  bool addWindow(RenderWindow& window, utility::ErrorState& errorState);
497 
502  void removeWindow(RenderWindow& window);
503 
509  RenderWindow* findWindow(void* nativeWindow) const;
510 
516  RenderWindow* findWindow(uint id) const;
517 
523  int getDisplayCount() const;
524 
531  const Display* findDisplay(int index) const;
532 
537  const Display* findDisplay(const nap::RenderWindow& window) const;
538 
542  const DisplayList& getDisplays() const;
543 
549  void addEvent(WindowEventPtr windowEvent);
550 
561  RenderableMesh createRenderableMesh(IMesh& mesh, MaterialInstance& materialInstance, utility::ErrorState& errorState);
562 
581  Pipeline getOrCreatePipeline(const IRenderTarget& renderTarget, const IMesh& mesh, const MaterialInstance& materialInstance, utility::ErrorState& errorState);
582 
600  Pipeline getOrCreateComputePipeline(const ComputeMaterialInstance& computeMaterialInstance, utility::ErrorState& errorState);
601 
619  Pipeline getOrCreatePipeline(const IRenderTarget& renderTarget, const RenderableMesh& renderableMesh, utility::ErrorState& errorState);
620 
637  void queueVulkanObjectDestructor(const VulkanObjectDestructor& function);
638 
646  DescriptorSetCache& getOrCreateDescriptorSetCache(VkDescriptorSetLayout layout);
647 
651  VmaAllocator getVulkanAllocator() const { return mVulkanAllocator; }
652 
659  bool isHeadless() const { return mHeadless; }
660 
668  VkCommandBuffer getCurrentCommandBuffer() { assert(mCurrentCommandBuffer != VK_NULL_HANDLE); return mCurrentCommandBuffer; }
669 
675  RenderWindow* getCurrentRenderWindow() { assert(mCurrentRenderWindow != VK_NULL_HANDLE); return mCurrentRenderWindow; }
676 
681  VkInstance getVulkanInstance() const { return mInstance; }
682 
688  VkPhysicalDevice getPhysicalDevice() const { return mPhysicalDevice.getHandle(); }
689 
694  const VkPhysicalDeviceFeatures& getPhysicalDeviceFeatures() const { return mPhysicalDevice.getFeatures(); }
695 
703  uint32 getPhysicalDeviceVersion() const { return mPhysicalDevice.getProperties().apiVersion; }
704 
709  const VkPhysicalDeviceProperties& getPhysicalDeviceProperties() const { return mPhysicalDevice.getProperties(); }
710 
716  VkDevice getDevice() const { return mDevice; }
717 
722  VkSampleCountFlagBits getMaxRasterizationSamples() const;
723 
732  bool getRasterizationSamples(ERasterizationSamples requestedSamples, VkSampleCountFlagBits& outSamples, nap::utility::ErrorState& errorState);
733 
738  bool sampleShadingSupported() const;
739 
744  bool anisotropicFilteringSupported() const;
745 
750  bool getWideLinesSupported() const { return mWideLinesSupported; }
751 
756  bool getNonSolidFillSupported() const { return mNonSolidFillModeSupported; }
757 
762  bool getPolygonModeSupported(EPolygonMode mode) { return mode == EPolygonMode::Fill || mNonSolidFillModeSupported; }
763 
768  bool getLargePointsSupported() const { return mLargePointsSupported; }
769 
775  bool getHighDPIEnabled() const { return mEnableHighDPIMode; }
776 
782  uint32 getAnisotropicSamples() const { return mAnisotropicSamples; }
783 
788  VkFormat getDepthFormat() const { return mDepthFormat; }
789 
795  VkCommandPool getCommandPool() const { return mCommandPool; }
796 
800  VkImageAspectFlags getDepthAspectFlags() const;
801 
806  uint32 getQueueIndex() const { return mPhysicalDevice.getQueueIndex(); }
807 
813  VkQueue getQueue() const { return mQueue; }
814 
819  bool isComputeAvailable() const;
820 
825  Texture2D& getEmptyTexture() const { return *mEmptyTexture; }
826 
841  Material* getOrCreateMaterial(rtti::TypeInfo shaderType, utility::ErrorState& error);
842 
856  template<typename T>
857  Material* getOrCreateMaterial(utility::ErrorState& error) { return getOrCreateMaterial(RTTI_OF(T), error); }
858 
865  int getCurrentFrameIndex() const { return mCurrentFrameIndex; }
866 
878  int getMaxFramesInFlight() const { return 2; }
879 
884  void getFormatProperties(VkFormat format, VkFormatProperties& outProperties);
885 
893  bool isRenderingFrame() const { return mIsRenderingFrame; }
894 
900  uint32 getVulkanVersion() const { return mAPIVersion; }
901 
908  uint32 getVulkanVersionMajor() const;
909 
916  uint32 getVulkanVersionMinor() const;
917 
922 
927 
933  bool isInitialized() const { return mInitialized; }
934 
942  void waitForFence(int frameIndex);
943 
944  protected:
948  virtual void getDependentServices(std::vector<rtti::TypeInfo>& dependencies) override;
949 
955  virtual bool init(nap::utility::ErrorState& errorState) override;
956 
960  virtual void preShutdown() override;
961 
965  virtual void shutdown() override;
966 
970  virtual void preResourcesLoaded() override;
971 
975  virtual void postResourcesLoaded() override;
976 
981  virtual void update(double deltaTime) override;
982 
983  private:
992  void sortObjects(std::vector<RenderableComponentInstance*>& comps, const CameraComponentInstance& camera);
993 
999  bool initEmptyTexture(nap::utility::ErrorState& errorState);
1000 
1006  void removeTextureRequests(Texture2D& texture);
1007 
1012  void requestTextureClear(Texture2D& texture);
1013 
1018  void requestTextureUpload(Texture2D& texture);
1019 
1024  void requestTextureDownload(Texture2D& texture);
1025 
1030  void requestBufferClear(GPUBuffer& buffer);
1031 
1036  void requestBufferUpload(GPUBuffer& buffer);
1037 
1042  void requestBufferDownload(GPUBuffer& buffer);
1043 
1049  void removeBufferRequests(GPUBuffer& buffer);
1050 
1056  void transferData(VkCommandBuffer commandBuffer, const std::function<void()>& transferFunction);
1057 
1061  void downloadData();
1062 
1066  void uploadData();
1067 
1072  void updateDownloads();
1073 
1078  void processVulkanDestructors(int frameIndex);
1079 
1084  void waitDeviceIdle();
1085 
1093  bool writeIni(const std::string& path, utility::ErrorState error);
1094 
1102  bool loadIni(const std::string& path, utility::ErrorState error);
1103 
1108  void restoreWindow(nap::RenderWindow& window);
1109 
1110  private:
1111  struct UniqueMaterial;
1112  using PipelineCache = std::unordered_map<PipelineKey, Pipeline>;
1113  using ComputePipelineCache = std::unordered_map<ComputePipelineKey, Pipeline>;
1114  using WindowList = std::vector<RenderWindow*>;
1115  using DescriptorSetCacheMap = std::unordered_map<VkDescriptorSetLayout, std::unique_ptr<DescriptorSetCache>>;
1116  using TextureSet = std::unordered_set<Texture2D*>;
1117  using BufferSet = std::unordered_set<GPUBuffer*>;
1118  using VulkanObjectDestructorList = std::vector<VulkanObjectDestructor>;
1119  using UniqueMaterialCache = std::unordered_map<rtti::TypeInfo, std::unique_ptr<UniqueMaterial>>;
1120 
1125  enum EQueueSubmitOp : uint
1126  {
1127  Rendering = 0x01,
1128  HeadlessRendering = 0x02,
1129  Compute = 0x04
1130  };
1131  using QueueSubmitOps = uint;
1132 
1136  struct Frame
1137  {
1138  VkFence mFence;
1139  std::vector<Texture2D*> mTextureDownloads;
1140  std::vector<GPUBuffer*> mBufferDownloads;
1141  VkCommandBuffer mUploadCommandBuffer;
1142  VkCommandBuffer mDownloadCommandBuffer;
1143  VkCommandBuffer mHeadlessCommandBuffer;
1144  VkCommandBuffer mComputeCommandBuffer;
1145  VulkanObjectDestructorList mQueuedVulkanObjectDestructors;
1146  QueueSubmitOps mQueueSubmitOps = 0U;
1147  };
1148 
1153  struct UniqueMaterial
1154  {
1155  UniqueMaterial() = default;
1156  UniqueMaterial(std::unique_ptr<Shader> shader, std::unique_ptr<Material> material);
1157  std::unique_ptr<Shader> mShader = nullptr;
1158  std::unique_ptr<Material> mMaterial = nullptr;
1159  bool valid() const;
1160  };
1161 
1162  bool mEnableHighDPIMode = true;
1163  bool mEnableCaching = true;
1164  bool mSampleShadingSupported = false;
1165  bool mAnisotropicFilteringSupported = false;
1166  bool mWideLinesSupported = false;
1167  bool mLargePointsSupported = false;
1168  bool mNonSolidFillModeSupported = false;
1169  uint32 mAnisotropicSamples = 1;
1170  WindowList mWindows;
1171  DisplayList mDisplays;
1172  SceneService* mSceneService = nullptr;
1173  bool mIsRenderingFrame = false;
1174  bool mCanDestroyVulkanObjectsImmediately = true;
1175  std::unique_ptr<Texture2D> mEmptyTexture;
1176 
1177  TextureSet mTexturesToClear;
1178  TextureSet mTexturesToUpload;
1179  BufferSet mBuffersToClear;
1180  BufferSet mBuffersToUpload;
1181 
1182  int mCurrentFrameIndex = 0;
1183  std::vector<Frame> mFramesInFlight;
1184  RenderWindow* mCurrentRenderWindow = nullptr;
1185 
1186  DescriptorSetCacheMap mDescriptorSetCaches;
1187  std::unique_ptr<DescriptorSetAllocator> mDescriptorSetAllocator;
1188 
1189  VkInstance mInstance = VK_NULL_HANDLE;
1190  VmaAllocator mVulkanAllocator = VK_NULL_HANDLE;
1191  VkDebugReportCallbackEXT mDebugCallback = VK_NULL_HANDLE;
1192  PhysicalDevice mPhysicalDevice;
1193  VkDevice mDevice = VK_NULL_HANDLE;
1194  VkCommandBuffer mCurrentCommandBuffer = VK_NULL_HANDLE;
1195 
1196  VkCommandPool mCommandPool = VK_NULL_HANDLE;
1197  VkQueue mQueue = VK_NULL_HANDLE;
1198 
1199  PipelineCache mPipelineCache;
1200  ComputePipelineCache mComputePipelineCache;
1201 
1202  VkFormat mDepthFormat = VK_FORMAT_UNDEFINED;
1203  VkSampleCountFlagBits mMaxRasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
1204 
1205  uint32 mAPIVersion = 0;
1206  bool mInitialized = false;
1207  bool mSDLInitialized = false;
1208  bool mShInitialized = false;
1209  bool mHeadless = false;
1210 
1211  UniqueMaterialCache mMaterials;
1212 
1213  // Cache read from ini file, contains saved settings
1214  std::vector<std::unique_ptr<rtti::Object>> mCache;
1215  };
1216 } // nap
nap::RenderService::getPhysicalDeviceVersion
uint32 getPhysicalDeviceVersion() const
Definition: renderservice.h:703
nap::uint
unsigned int uint
Definition: numeric.h:23
nap::DisplayList
std::vector< Display > DisplayList
Definition: renderservice.h:223
nap::toString
NAPAPI std::string toString(EDay day)
nap::RenderService::getAnisotropicSamples
uint32 getAnisotropicSamples() const
Definition: renderservice.h:782
nap::IRenderTarget
Definition: irendertarget.h:21
nap::PhysicalDevice::getQueueIndex
int getQueueIndex() const
Definition: renderservice.h:101
nap::DescriptorSetCache
Definition: descriptorsetcache.h:48
nap::RenderService::windowRemoved
nap::Signal< nap::RenderWindow & > windowRemoved
Definition: renderservice.h:926
nap::RenderWindow
Definition: renderwindow.h:43
nap::RenderServiceConfiguration::EPhysicalDeviceType
EPhysicalDeviceType
Definition: renderservice.h:51
nap::RenderService::getDepthFormat
VkFormat getDepthFormat() const
Definition: renderservice.h:788
nap::RenderService::Pipeline
Definition: renderservice.h:281
nap::RenderService::isInitialized
bool isInitialized() const
Definition: renderservice.h:933
nap::RenderService::isHeadless
bool isHeadless() const
Definition: renderservice.h:659
nap::EPolygonMode
EPolygonMode
Definition: mesh.h:55
nap::Display::getName
const std::string & getName() const
Definition: renderservice.h:175
nap::ERasterizationSamples
ERasterizationSamples
Definition: renderutils.h:91
nap::RenderService::getWideLinesSupported
bool getWideLinesSupported() const
Definition: renderservice.h:750
nap::CameraComponentInstance
Definition: cameracomponent.h:19
nap::math::Rect
Definition: rect.h:19
nap::Display::operator!=
bool operator!=(const Display &rhs) const
Definition: renderservice.h:211
nap::utility::ErrorState
Definition: errorstate.h:19
nap::IMesh
Definition: mesh.h:396
nap::RenderService::getCurrentRenderWindow
RenderWindow * getCurrentRenderWindow()
Definition: renderservice.h:675
nap::Material
Definition: material.h:72
nap::Display
Definition: renderservice.h:139
nap::RenderService::getLargePointsSupported
bool getLargePointsSupported() const
Definition: renderservice.h:768
nap::RenderService::getNonSolidFillSupported
bool getNonSolidFillSupported() const
Definition: renderservice.h:756
nap::RenderService::getVulkanVersion
uint32 getVulkanVersion() const
Definition: renderservice.h:900
nap::uint32
uint32_t uint32
Definition: numeric.h:20
nap::ServiceConfiguration
Definition: service.h:28
nap::RenderService::getPhysicalDeviceProperties
const VkPhysicalDeviceProperties & getPhysicalDeviceProperties() const
Definition: renderservice.h:709
nap::PhysicalDevice::getProperties
const VkPhysicalDeviceProperties & getProperties() const
Definition: renderservice.h:106
nap::Texture2D
Definition: texture2d.h:43
nap::PhysicalDevice::getFeatures
const VkPhysicalDeviceFeatures & getFeatures() const
Definition: renderservice.h:111
nap::Signal< nap::RenderWindow & >
nap::RenderService::getPhysicalDevice
VkPhysicalDevice getPhysicalDevice() const
Definition: renderservice.h:688
nap::RenderService::getMaxFramesInFlight
int getMaxFramesInFlight() const
Definition: renderservice.h:878
nap::RenderService
Definition: renderservice.h:268
nap::Display::getHorizontalDPI
float getHorizontalDPI() const
Definition: renderservice.h:163
nap::RenderService::getQueue
VkQueue getQueue() const
Definition: renderservice.h:813
nap::RenderService::getCurrentCommandBuffer
VkCommandBuffer getCurrentCommandBuffer()
Definition: renderservice.h:668
nap::RenderService::getVulkanInstance
VkInstance getVulkanInstance() const
Definition: renderservice.h:681
nap::Display::getVerticalDPI
float getVerticalDPI() const
Definition: renderservice.h:169
nap::RenderService::SortFunction
std::function< void(std::vector< RenderableComponentInstance * > &, const CameraComponentInstance &)> SortFunction
Definition: renderservice.h:275
nap::RenderServiceConfiguration::getServiceType
virtual rtti::TypeInfo getServiceType() const override
Definition: renderservice.h:73
nap::Service
Definition: service.h:52
nap::PhysicalDevice::isValid
bool isValid() const
Definition: renderservice.h:121
nap::EPolygonMode::Fill
@ Fill
Polygons are interpreted and rendered using the specified 'EDrawMode'.
nap::Display::getMax
const glm::ivec2 & getMax() const
Definition: renderservice.h:185
nap::RenderableMesh
Definition: renderablemesh.h:22
nap::MaterialInstance
Definition: materialinstance.h:217
nap::RenderService::VulkanObjectDestructor
std::function< void(RenderService &)> VulkanObjectDestructor
Definition: renderservice.h:276
nap::RenderService::Pipeline::isValid
bool isValid() const
Definition: renderservice.h:287
nap::WindowEventPtr
std::unique_ptr< WindowEvent > WindowEventPtr
Definition: windowevent.h:189
nap::ComputeMaterialInstance
Definition: materialinstance.h:284
nap::RenderService::getCommandPool
VkCommandPool getCommandPool() const
Definition: renderservice.h:795
nap::RenderService::getDevice
VkDevice getDevice() const
Definition: renderservice.h:716
nap::RenderService::getOrCreateMaterial
Material * getOrCreateMaterial(utility::ErrorState &error)
Definition: renderservice.h:857
nap::PhysicalDevice
Definition: renderservice.h:84
nap::RenderServiceConfiguration
Definition: renderservice.h:44
nap::Display::isValid
bool isValid() const
Definition: renderservice.h:196
nap
Definition: assert.h:10
nap::RenderService::getPolygonModeSupported
bool getPolygonModeSupported(EPolygonMode mode)
Definition: renderservice.h:762
nap::Display::getIndex
int getIndex() const
Definition: renderservice.h:151
nap::Display::getMin
const glm::ivec2 & getMin() const
Definition: renderservice.h:180
nap::GPUBuffer
Definition: gpubuffer.h:63
nap::PhysicalDevice::getHandle
VkPhysicalDevice getHandle() const
Definition: renderservice.h:96
nap::PhysicalDevice::getQueueCapabilities
const VkQueueFlags & getQueueCapabilities() const
Definition: renderservice.h:116
nap::rtti::TypeInfo
rttr::type TypeInfo
Definition: typeinfo.h:139
nap::RenderService::getEmptyTexture
Texture2D & getEmptyTexture() const
Definition: renderservice.h:825
nap::Display::getDiagonalDPI
float getDiagonalDPI() const
Definition: renderservice.h:157
nap::RenderService::getVulkanAllocator
VmaAllocator getVulkanAllocator() const
Definition: renderservice.h:651
nap::RenderService::getQueueIndex
uint32 getQueueIndex() const
Definition: renderservice.h:806
nap::RenderService::windowAdded
nap::Signal< nap::RenderWindow & > windowAdded
Definition: renderservice.h:921
nap::RenderService::getCurrentFrameIndex
int getCurrentFrameIndex() const
Definition: renderservice.h:865
nap::RenderService::getHighDPIEnabled
bool getHighDPIEnabled() const
Definition: renderservice.h:775
nap::RenderService::isRenderingFrame
bool isRenderingFrame() const
Definition: renderservice.h:893
nap::RenderService::getPhysicalDeviceFeatures
const VkPhysicalDeviceFeatures & getPhysicalDeviceFeatures() const
Definition: renderservice.h:694