49 uint32_t extensionCount;
50 vkEnumerateDeviceExtensionProperties(
51 device,
nullptr, &extensionCount,
nullptr);
53 std::vector<VkExtensionProperties> availableExtensions(extensionCount);
54 vkEnumerateDeviceExtensionProperties(
55 device,
nullptr, &extensionCount, availableExtensions.data());
57 std::set<std::string> requiredExtensions(
61 for (
const auto& extension : availableExtensions) {
62 requiredExtensions.erase(extension.extensionName);
65 return requiredExtensions.empty();
116 VkPhysicalDeviceProperties physicalDeviceProperties;
117 vkGetPhysicalDeviceProperties(physicalDevice, &physicalDeviceProperties);
119 VkSampleCountFlags counts
120 = physicalDeviceProperties.limits.framebufferColorSampleCounts;
121 if (counts & VK_SAMPLE_COUNT_64_BIT) {
122 return VK_SAMPLE_COUNT_64_BIT;
124 if (counts & VK_SAMPLE_COUNT_32_BIT) {
125 return VK_SAMPLE_COUNT_32_BIT;
127 if (counts & VK_SAMPLE_COUNT_16_BIT) {
128 return VK_SAMPLE_COUNT_16_BIT;
130 if (counts & VK_SAMPLE_COUNT_8_BIT) {
131 return VK_SAMPLE_COUNT_8_BIT;
133 if (counts & VK_SAMPLE_COUNT_4_BIT) {
134 return VK_SAMPLE_COUNT_4_BIT;
136 if (counts & VK_SAMPLE_COUNT_2_BIT) {
137 return VK_SAMPLE_COUNT_2_BIT;
139 return VK_SAMPLE_COUNT_1_BIT;
143 VkInstance instance, VkSurfaceKHR surface)
146 uint32_t deviceCount = 0;
147 vkEnumeratePhysicalDevices(instance, &deviceCount,
nullptr);
148 if (deviceCount == 0) {
149 LOG(1,
"Failed to find GPUs with Vulkan support")
150 throw std::runtime_error(
"Failed to find GPUs with Vulkan support");
152 LOG(3,
"Number of devices found: " + std::to_string(deviceCount))
153 std::vector<VkPhysicalDevice> devices(deviceCount);
154 vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());
157 for (
const auto& device : devices) {
159 physicalDevice = device;
164 if (physicalDevice == VK_NULL_HANDLE) {
165 LOG(1,
"Failed to find a suitable GPU")
166 throw std::runtime_error(
"Failed to find a suitable GPU");
168#ifdef CHRONOS_ENABLE_LOGGING
169 VkPhysicalDeviceProperties deviceProperties;
170 vkGetPhysicalDeviceProperties(physicalDevice, &deviceProperties);
171 LOG(3,
"****PHYSICAL DEVICE INFORMATION*****")
173 "Physical device picked: " + std::string(deviceProperties.deviceName))
174 LOG(3,
"Driver version: " + std::to_string(deviceProperties.driverVersion))
175 LOG(3,
"API version: " + std::to_string(deviceProperties.apiVersion))
176 LOG(3,
"Device ID: " + std::to_string(deviceProperties.deviceID))
177 LOG(3,
"Vendor ID: " + std::to_string(deviceProperties.vendorID))
178 LOG(3,
"MSAA samples: " + std::to_string(msaaSamples))
186 std::vector<VkDeviceQueueCreateInfo> queueCreateInfos;
187 std::set<uint32_t> uniqueQueueFamilies
190 float queuePriority = 1.0f;
191 for (uint32_t queueFamily : uniqueQueueFamilies) {
192 VkDeviceQueueCreateInfo queueCreateInfo {};
193 queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
194 queueCreateInfo.queueFamilyIndex = queueFamily;
195 queueCreateInfo.queueCount = 1;
196 queueCreateInfo.pQueuePriorities = &queuePriority;
197 queueCreateInfos.push_back(queueCreateInfo);
200 VkPhysicalDeviceFeatures deviceFeatures {};
201 deviceFeatures.samplerAnisotropy = VK_TRUE;
202 deviceFeatures.sampleRateShading = VK_TRUE;
204 VkDeviceCreateInfo createInfo {};
205 createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
206 createInfo.pQueueCreateInfos = queueCreateInfos.data();
207 createInfo.queueCreateInfoCount
208 =
static_cast<uint32_t
>(queueCreateInfos.size());
209 createInfo.pEnabledFeatures = &deviceFeatures;
210 createInfo.enabledExtensionCount
213 createInfo.enabledLayerCount = 0;
214#ifdef ENABLE_VALIDATION_LAYERS
215 createInfo.enabledLayerCount
216 =
static_cast<uint32_t
>(validationLayers.size());
217 createInfo.ppEnabledLayerNames = validationLayers.data();
220 if (vkCreateDevice(physicalDevice, &createInfo,
nullptr, &device)
222 LOG(1,
"Failed to create logical device")
223 throw std::runtime_error(
"Failed to create logical device");
226 LOG(3,
"Logical device created")
228 vkGetDeviceQueue(device, indices.
graphicsFamily.value(), 0, &graphicsQueue);
229 vkGetDeviceQueue(device, indices.
presentFamily.value(), 0, &presentQueue);
SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device, VkSurfaceKHR surface)
For a given swapchain mode, it gets the capabilites, formats and present modes.