8 #include "vk_mem_alloc.h"
9 #include "pipelinekey.h"
10 #include "renderutils.h"
13 #include <nap/service.h>
14 #include <windowevent.h>
15 #include <rendertarget.h>
22 class CameraComponentInstance;
23 class RenderableComponentInstance;
27 class DescriptorSetCache;
28 class DescriptorSetAllocator;
31 class MaterialInstance;
32 class ComputeMaterialInstance;
33 class ComputeComponentInstance;
59 bool mHeadless =
false;
61 std::vector<std::string> mLayers = {
"VK_LAYER_KHRONOS_validation" };
62 std::vector<std::string> mAdditionalExtensions = { };
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;
91 PhysicalDevice(VkPhysicalDevice device,
const VkPhysicalDeviceProperties& properties,
const VkQueueFlags& queueCapabilities,
int queueIndex);
96 VkPhysicalDevice
getHandle()
const {
return mDevice; }
106 const VkPhysicalDeviceProperties&
getProperties()
const {
return mProperties; }
111 const VkPhysicalDeviceFeatures&
getFeatures()
const {
return mFeatures; }
121 bool isValid()
const {
return mDevice != VK_NULL_HANDLE && mQueueIndex >= 0; }
124 VkPhysicalDevice mDevice = VK_NULL_HANDLE;
125 VkPhysicalDeviceProperties mProperties;
126 VkPhysicalDeviceFeatures mFeatures;
127 VkQueueFlags mQueueCapabilities;
128 int mQueueIndex = -1;
175 const std::string&
getName()
const {
return mName; }
180 const glm::ivec2&
getMin()
const {
return mMin; }
185 const glm::ivec2&
getMax()
const {
return mMax; }
206 bool operator== (
const Display& rhs)
const {
return rhs.
getIndex() == this->getIndex(); }
219 glm::ivec2 mMin = { 0, 0 };
220 glm::ivec2 mMax = { 0, 0 };
287 bool isValid()
const {
return mPipeline != VK_NULL_HANDLE && mLayout != VK_NULL_HANDLE; }
289 VkPipeline mPipeline = VK_NULL_HANDLE;
290 VkPipelineLayout mLayout = VK_NULL_HANDLE;
358 bool beginHeadlessRecording();
374 void endHeadlessRecording();
426 bool beginComputeRecording();
443 void endComputeRecording();
489 void computeObjects(
const std::vector<ComputeComponentInstance*>& comps);
523 int getDisplayCount()
const;
531 const Display* findDisplay(
int index)
const;
722 VkSampleCountFlagBits getMaxRasterizationSamples()
const;
738 bool sampleShadingSupported()
const;
744 bool anisotropicFilteringSupported()
const;
800 VkImageAspectFlags getDepthAspectFlags()
const;
819 bool isComputeAvailable()
const;
884 void getFormatProperties(VkFormat format, VkFormatProperties& outProperties);
908 uint32 getVulkanVersionMajor()
const;
916 uint32 getVulkanVersionMinor()
const;
942 void waitForFence(
int frameIndex);
948 virtual void getDependentServices(std::vector<rtti::TypeInfo>& dependencies)
override;
960 virtual void preShutdown()
override;
965 virtual void shutdown()
override;
970 virtual void preResourcesLoaded()
override;
975 virtual void postResourcesLoaded()
override;
981 virtual void update(
double deltaTime)
override;
1006 void removeTextureRequests(
Texture2D& texture);
1012 void requestTextureClear(
Texture2D& texture);
1018 void requestTextureUpload(
Texture2D& texture);
1024 void requestTextureDownload(
Texture2D& texture);
1030 void requestBufferClear(
GPUBuffer& buffer);
1036 void requestBufferUpload(
GPUBuffer& buffer);
1042 void requestBufferDownload(
GPUBuffer& buffer);
1049 void removeBufferRequests(
GPUBuffer& buffer);
1056 void transferData(VkCommandBuffer commandBuffer,
const std::function<
void()>& transferFunction);
1061 void downloadData();
1072 void updateDownloads();
1078 void processVulkanDestructors(
int frameIndex);
1084 void waitDeviceIdle();
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>>;
1125 enum EQueueSubmitOp :
uint
1128 HeadlessRendering = 0x02,
1131 using QueueSubmitOps =
uint;
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;
1153 struct UniqueMaterial
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;
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;
1172 SceneService* mSceneService =
nullptr;
1173 bool mIsRenderingFrame =
false;
1174 bool mCanDestroyVulkanObjectsImmediately =
true;
1175 std::unique_ptr<Texture2D> mEmptyTexture;
1177 TextureSet mTexturesToClear;
1178 TextureSet mTexturesToUpload;
1179 BufferSet mBuffersToClear;
1180 BufferSet mBuffersToUpload;
1182 int mCurrentFrameIndex = 0;
1183 std::vector<Frame> mFramesInFlight;
1184 RenderWindow* mCurrentRenderWindow =
nullptr;
1186 DescriptorSetCacheMap mDescriptorSetCaches;
1187 std::unique_ptr<DescriptorSetAllocator> mDescriptorSetAllocator;
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;
1196 VkCommandPool mCommandPool = VK_NULL_HANDLE;
1197 VkQueue mQueue = VK_NULL_HANDLE;
1199 PipelineCache mPipelineCache;
1200 ComputePipelineCache mComputePipelineCache;
1202 VkFormat mDepthFormat = VK_FORMAT_UNDEFINED;
1203 VkSampleCountFlagBits mMaxRasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
1206 bool mInitialized =
false;
1207 bool mSDLInitialized =
false;
1208 bool mShInitialized =
false;
1209 bool mHeadless =
false;
1211 UniqueMaterialCache mMaterials;
1214 std::vector<std::unique_ptr<rtti::Object>> mCache;