Engine
Frameworkcreatedbymeusableforthecreationofsimplegames.CurrentlysupportsOpenGL(Verysimple)andVulkan.
VulkanPhysicalDevice.hpp
Go to the documentation of this file.
1 #pragma once
3 #ifdef USING_VULKAN
4 #include <ThirdParty/Vulkan/Include/vulkan/vulkan.h>
5 #include <ThirdParty/EASTL-master/include/EASTL/vector.h>
6 
7 namespace Engine {
8 
9  class VulkanInstance;
10 
11  typedef struct {
12  float robustBufferAccess;
13  float fullDrawIndexUint32;
14  float imageCubeArray;
15  float independentBlend;
16  float geometryShader;
17  float tessellationShader;
18  float sampleRateShading;
19  float dualSrcBlend;
20  float logicOp;
21  float multiDrawIndirect;
22  float drawIndirectFirstInstance;
23  float depthClamp;
24  float depthBiasClamp;
25  float fillModeNonSolid;
26  float depthBounds;
27  float wideLines;
28  float largePoints;
29  float alphaToOne;
30  float multiViewport;
31  float samplerAnisotropy;
32  float textureCompressionETC2;
33  float textureCompressionASTC_LDR;
34  float textureCompressionBC;
35  float occlusionQueryPrecise;
36  float pipelineStatisticsQuery;
37  float vertexPipelineStoresAndAtomics;
38  float fragmentStoresAndAtomics;
39  float shaderTessellationAndGeometryPointSize;
40  float shaderImageGatherExtended;
41  float shaderStorageImageExtendedFormats;
42  float shaderStorageImageMultisample;
43  float shaderStorageImageReadWithoutFormat;
44  float shaderStorageImageWriteWithoutFormat;
45  float shaderUniformBufferArrayDynamicIndexing;
46  float shaderSampledImageArrayDynamicIndexing;
47  float shaderStorageBufferArrayDynamicIndexing;
48  float shaderStorageImageArrayDynamicIndexing;
49  float shaderClipDistance;
50  float shaderCullDistance;
51  float shaderFloat64;
52  float shaderInt64;
53  float shaderInt16;
54  float shaderResourceResidency;
55  float shaderResourceMinLod;
56  float sparseBinding;
57  float sparseResidencyBuffer;
58  float sparseResidencyImage2D;
59  float sparseResidencyImage3D;
60  float sparseResidency2Samples;
61  float sparseResidency4Samples;
62  float sparseResidency8Samples;
63  float sparseResidency16Samples;
64  float sparseResidencyAliased;
65  float variableMultisampleRate;
66  float inheritedQueries;
67  }VulkanDeviceFeatures_t;
68 
69  typedef struct {
70  bool graphics;
71  bool compute;
72  bool transfere;
73  bool sparseBinding;
74  bool present;
75  }VulkanDeviceQueueRequestedFamilies_t;
76 
77  typedef struct {
78  int graphics = -1;
79  int compute = -1;
80  int transfere = -1;
81  int sparseBinding = -1;
82  int present = -1;
83  }VulkanDeviceQueueFamilies_t;
84 
85  typedef struct {
86  VkSurfaceCapabilitiesKHR capabilities;
87  eastl::vector<VkSurfaceFormatKHR> formats;
88  eastl::vector<VkPresentModeKHR> presentModes;
89  }VulkanSwapChainSupportDetails_t;
90 
91  class VulkanPhysicalDevice
92  {
93  public:
94  static VulkanPhysicalDevice* GetBestPhysicalDevice(VulkanInstance* instance, VkSurfaceKHR surface, eastl::vector<const char*> requiredExtensions,
95  VulkanDeviceFeatures_t requiredFeatures = {}, VulkanDeviceFeatures_t optionalFeatures = {}, VulkanDeviceQueueRequestedFamilies_t requestedQueueFamilies = {},
96  bool GPU = true);
97  static eastl::vector<VulkanPhysicalDevice*> GetAllPhysicalDevices(VulkanInstance* instance, VkSurfaceKHR surface);
98 
99  VkPhysicalDevice GetPhysicalDevice() { return device; };
100  VulkanDeviceQueueFamilies_t GetQueueFamilies();
101  VulkanSwapChainSupportDetails_t GetSwapChainSupportDetails();
102  VulkanSwapChainSupportDetails_t ReloadSwapChainSupportDetails();
103 
104  VkSurfaceFormatKHR ChooseSwapSurfaceFormat(const eastl::vector<VkSurfaceFormatKHR>& availableFormats);
105  VkPresentModeKHR ChooseSwapPresentMode(const eastl::vector<VkPresentModeKHR> availablePresentModes);
106  VkExtent2D ChooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, int width, int height);
107 
108  ~VulkanPhysicalDevice();
109 
110  private:
111  VulkanPhysicalDevice(VkPhysicalDevice device, VkSurfaceKHR surface);
112 
113  VkPhysicalDevice device;
114  VulkanDeviceQueueFamilies_t QueueFamilies;
115  VulkanSwapChainSupportDetails_t details;
116  VkSurfaceKHR surface;
117  bool queueFamiliesFound;
118  bool swapChainDetailsFound;
119  };
120 
121 }
122 
123 #endif // USING_VULKAN