vengine  0.1.0
3D graphics engine made with Vulkan
Loading...
Searching...
No Matches
device.cpp
Go to the documentation of this file.
1#include <cstring>
2#include <iostream>
3#include <set>
4#include <unordered_set>
5
6#include "VEngine/Device.hpp"
7
8static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(const VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, const VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData)
9{
10 (void) pUserData; (void) messageSeverity; (void) messageType;
11
12 std::cerr << "validation layer: " << pCallbackData->pMessage << '\n';
13 return VK_FALSE;
14}
15
16VkResult CreateDebugUtilsMessengerEXT(const VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugUtilsMessengerEXT *pDebugMessenger)
17{
18 auto func = reinterpret_cast<PFN_vkCreateDebugUtilsMessengerEXT>(vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"));
19 if (func != nullptr) {
20 return func(instance, pCreateInfo, pAllocator, pDebugMessenger);
21 }
22
23 return VK_ERROR_EXTENSION_NOT_PRESENT;
24}
25
26void DestroyDebugUtilsMessengerEXT(const VkInstance instance, const VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks *pAllocator)
27{
28 auto func = reinterpret_cast<PFN_vkDestroyDebugUtilsMessengerEXT>(vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT"));
29 if (func != nullptr) {
30 func(instance, debugMessenger, pAllocator);
31 }
32}
33
43
45{
46 vkDestroyCommandPool(device_, commandPool, nullptr);
47 vkDestroyDevice(device_, nullptr);
48
49 if (enableValidationLayers) {
50 DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr);
51 }
52
53 vkDestroySurfaceKHR(instance, surface_, nullptr);
54 vkDestroyInstance(instance, nullptr);
55}
56
58{
59 if (enableValidationLayers && !checkValidationLayerSupport()) {
60 throw std::runtime_error("validation layers requested, but not available!");
61 }
62
63 VkApplicationInfo appInfo = {};
64 appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
65 appInfo.pApplicationName = "LittleVulkanEngine App";
66 appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
67 appInfo.pEngineName = "No Engine";
68 appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
69 appInfo.apiVersion = VK_API_VERSION_1_0;
70
71 VkInstanceCreateInfo createInfo = {};
72 createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
73 createInfo.pApplicationInfo = &appInfo;
74
75 std::vector<const char *> extensions = getRequiredExtensions();
76 createInfo.enabledExtensionCount = static_cast<uint32_t>(extensions.size());
77 createInfo.ppEnabledExtensionNames = extensions.data();
78
79 VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo;
80 if (enableValidationLayers) {
81 createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());
82 createInfo.ppEnabledLayerNames = validationLayers.data();
83
84 populateDebugMessengerCreateInfo(debugCreateInfo);
85 createInfo.pNext = &debugCreateInfo;
86 } else {
87 createInfo.enabledLayerCount = 0;
88 createInfo.pNext = nullptr;
89 }
90
91 if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) {
92 throw std::runtime_error("failed to create instance!");
93 }
94
95 hasGlfwRequiredInstanceExtensions();
96}
97
99{
100 uint32_t deviceCount = 0;
101 vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);
102 if (deviceCount == 0) {
103 throw std::runtime_error("failed to find GPUs with Vulkan support!");
104 }
105 std::cout << "Device count: " << deviceCount << '\n';
106 std::vector<VkPhysicalDevice> devices(deviceCount);
107 vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());
108
109 for (const auto &device : devices) {
110 if (isDeviceSuitable(device)) {
111 physicalDevice = device;
112 break;
113 }
114 }
115
116 if (physicalDevice == VK_NULL_HANDLE) {
117 throw std::runtime_error("failed to find a suitable GPU!");
118 }
119
120 vkGetPhysicalDeviceProperties(physicalDevice, &m_properties);
121 std::cout << "physical device: " << m_properties.deviceName << '\n';
122}
123
125{
126 const QueueFamilyIndices indices = findQueueFamilies(physicalDevice);
127
128 std::vector<VkDeviceQueueCreateInfo> queueCreateInfos;
129 const std::set<uint32_t> uniqueQueueFamilies = {indices.graphicsFamily, indices.presentFamily};
130 float queuePriority = 1.0F;
131
132 for (const uint32_t queueFamily : uniqueQueueFamilies) {
133 VkDeviceQueueCreateInfo queueCreateInfo = {};
134 queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
135 queueCreateInfo.queueFamilyIndex = queueFamily;
136 queueCreateInfo.queueCount = 1;
137 queueCreateInfo.pQueuePriorities = &queuePriority;
138 queueCreateInfos.push_back(queueCreateInfo);
139 }
140
141 VkPhysicalDeviceFeatures deviceFeatures = {};
142 deviceFeatures.samplerAnisotropy = VK_TRUE;
143
144 VkDeviceCreateInfo createInfo = {};
145 createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
146
147 createInfo.queueCreateInfoCount = static_cast<uint32_t>(queueCreateInfos.size());
148 createInfo.pQueueCreateInfos = queueCreateInfos.data();
149
150 createInfo.pEnabledFeatures = &deviceFeatures;
151 createInfo.enabledExtensionCount = static_cast<uint32_t>(deviceExtensions.size());
152 createInfo.ppEnabledExtensionNames = deviceExtensions.data();
153
154 // might not really be necessary anymore because device specific validation layers
155 // have been deprecated
156 if (enableValidationLayers) {
157 createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());
158 createInfo.ppEnabledLayerNames = validationLayers.data();
159 } else {
160 createInfo.enabledLayerCount = 0;
161 }
162
163 if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device_) != VK_SUCCESS) {
164 throw std::runtime_error("failed to create logical device!");
165 }
166
167 vkGetDeviceQueue(device_, indices.graphicsFamily, 0, &graphicsQueue_);
168 vkGetDeviceQueue(device_, indices.presentFamily, 0, &presentQueue_);
169}
170
172{
173 const QueueFamilyIndices queueFamilyIndices = findPhysicalQueueFamilies();
174
175 VkCommandPoolCreateInfo poolInfo = {};
176 poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
177 poolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily;
178 poolInfo.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
179
180 if (vkCreateCommandPool(device_, &poolInfo, nullptr, &commandPool) != VK_SUCCESS) {
181 throw std::runtime_error("failed to create command pool!");
182 }
183}
184
185bool ven::Device::isDeviceSuitable(const VkPhysicalDevice device) const
186{
187 const QueueFamilyIndices indices = findQueueFamilies(device);
188 const bool extensionsSupported = checkDeviceExtensionSupport(device);
189 bool swapChainAdequate = false;
190
191 if (extensionsSupported) {
192 SwapChainSupportDetails swapChainSupport = querySwapChainSupport(device);
193 swapChainAdequate = !swapChainSupport.formats.empty() && !swapChainSupport.presentModes.empty();
194 }
195
196 VkPhysicalDeviceFeatures supportedFeatures;
197 vkGetPhysicalDeviceFeatures(device, &supportedFeatures);
198
199 return indices.isComplete() && extensionsSupported && swapChainAdequate && (supportedFeatures.samplerAnisotropy != 0U);
200}
201
202void ven::Device::populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT &createInfo)
203{
204 createInfo = {};
205 createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
206 createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
207 VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
208 createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
209 VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
210 VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
211 createInfo.pfnUserCallback = debugCallback;
212 createInfo.pUserData = nullptr; // Optional
213}
214
216{
217 if (!enableValidationLayers) { return; }
218 VkDebugUtilsMessengerCreateInfoEXT createInfo;
219 populateDebugMessengerCreateInfo(createInfo);
220 if (CreateDebugUtilsMessengerEXT(instance, &createInfo, nullptr, &debugMessenger) != VK_SUCCESS) {
221 throw std::runtime_error("failed to set up debug messenger!");
222 }
223}
224
226{
227 uint32_t layerCount = 0;
228 vkEnumerateInstanceLayerProperties(&layerCount, nullptr);
229
230 std::vector<VkLayerProperties> availableLayers(layerCount);
231 vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data());
232
233 for (const char *layerName : validationLayers) {
234 bool layerFound = false;
235
236 for (const auto &layerProperties : availableLayers) {
237 if (strcmp(layerName, layerProperties.layerName) == 0) {
238 layerFound = true;
239 break;
240 }
241 }
242 if (!layerFound) {
243 return false;
244 }
245 }
246
247 return true;
248}
249
250std::vector<const char *> ven::Device::getRequiredExtensions() const
251{
252 uint32_t glfwExtensionCount = 0;
253 const char **glfwExtensions = nullptr;
254 glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
255
256 std::vector<const char *> extensions(glfwExtensions, glfwExtensions + glfwExtensionCount);
257
258 if (enableValidationLayers) {
259 extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
260 }
261
262 return extensions;
263}
264
266{
267 uint32_t extensionCount = 0;
268 vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
269 std::vector<VkExtensionProperties> extensions(extensionCount);
270 vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensions.data());
271
272 std::cout << "available extensions:\n";
273 std::unordered_set<std::string> available;
274 for (const auto &extension : extensions) {
275 std::cout << '\t' << extension.extensionName << '\n';
276 available.insert(extension.extensionName);
277 }
278
279 std::cout << "required extensions:\n";
280 const std::vector<const char *> requiredExtensions = getRequiredExtensions();
281 for (const auto &required : requiredExtensions) {
282 std::cout << "\t" << required << '\n';
283 if (available.find(required) == available.end()) {
284 throw std::runtime_error("Missing required glfw extension");
285 }
286 }
287}
288
289bool ven::Device::checkDeviceExtensionSupport(const VkPhysicalDevice device) const
290{
291 uint32_t extensionCount = 0;
292 vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, nullptr);
293
294 std::vector<VkExtensionProperties> availableExtensions(extensionCount);
295 vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, availableExtensions.data());
296
297 std::set<std::string> requiredExtensions(deviceExtensions.begin(), deviceExtensions.end());
298 for (const auto &extension : availableExtensions) {
299 requiredExtensions.erase(extension.extensionName);
300 }
301
302 return requiredExtensions.empty();
303}
304
305ven::QueueFamilyIndices ven::Device::findQueueFamilies(const VkPhysicalDevice device) const
306{
307 QueueFamilyIndices indices;
308
309 uint32_t queueFamilyCount = 0;
310 vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);
311 std::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);
312 vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());
313 uint32_t index = 0;
314
315 for (const auto &queueFamily : queueFamilies) {
316 if (queueFamily.queueCount > 0 && ((queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0U)) {
317 indices.graphicsFamily = index;
318 indices.graphicsFamilyHasValue = true;
319 }
320 VkBool32 presentSupport = 0U;
321 vkGetPhysicalDeviceSurfaceSupportKHR(device, index, surface_, &presentSupport);
322 if (queueFamily.queueCount > 0 && (presentSupport != 0U)) {
323 indices.presentFamily = index;
324 indices.presentFamilyHasValue = true;
325 }
326 if (indices.isComplete()) {
327 break;
328 }
329 index++;
330 }
331 return indices;
332}
333
335{
337 vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface_, &details.capabilities);
338 uint32_t formatCount = 0;
339
340 vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface_, &formatCount, nullptr);
341 if (formatCount != 0) {
342 details.formats.resize(formatCount);
343 vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface_, &formatCount, details.formats.data());
344 }
345 uint32_t presentModeCount = 0;
346 vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface_, &presentModeCount, nullptr);
347 if (presentModeCount != 0) {
348 details.presentModes.resize(presentModeCount);
349 vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface_, &presentModeCount, details.presentModes.data());
350 }
351
352 return details;
353}
354
355VkFormat ven::Device::findSupportedFormat(const std::vector<VkFormat> &candidates, const VkImageTiling tiling, const VkFormatFeatureFlags features) const
356{
357 for (const VkFormat format : candidates) {
358 VkFormatProperties props;
359 vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &props);
360 if (tiling == VK_IMAGE_TILING_LINEAR && (props.linearTilingFeatures & features) == features) {
361 return format;
362 } if (tiling == VK_IMAGE_TILING_OPTIMAL && (props.optimalTilingFeatures & features) == features) {
363 return format;
364 }
365 }
366 throw std::runtime_error("failed to find supported format!");
367}
368
369uint32_t ven::Device::findMemoryType(const uint32_t typeFilter, const VkMemoryPropertyFlags propertiesp) const
370{
371 VkPhysicalDeviceMemoryProperties memProperties;
372 vkGetPhysicalDeviceMemoryProperties(physicalDevice, &memProperties);
373
374 for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++) {
375 if (((typeFilter & (1 << i)) != 0U) &&
376 (memProperties.memoryTypes[i].propertyFlags & propertiesp) == propertiesp) {
377 return i;
378 }
379 }
380
381 throw std::runtime_error("failed to find suitable m_memory type!");
382}
383
384void ven::Device::createBuffer(const VkDeviceSize size, const VkBufferUsageFlags usage, const VkMemoryPropertyFlags propertiesp, VkBuffer &buffer, VkDeviceMemory &bufferMemory) const
385{
386 VkBufferCreateInfo bufferInfo{};
387 bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
388 bufferInfo.size = size;
389 bufferInfo.usage = usage;
390 bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
391
392 if (vkCreateBuffer(device_, &bufferInfo, nullptr, &buffer) != VK_SUCCESS) {
393 throw std::runtime_error("failed to create vertex m_buffer!");
394 }
395
396 VkMemoryRequirements memRequirements;
397 vkGetBufferMemoryRequirements(device_, buffer, &memRequirements);
398
399 VkMemoryAllocateInfo allocInfo{};
400 allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
401 allocInfo.allocationSize = memRequirements.size;
402 allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, propertiesp);
403
404 if (vkAllocateMemory(device_, &allocInfo, nullptr, &bufferMemory) != VK_SUCCESS) {
405 throw std::runtime_error("failed to allocate vertex m_buffer m_memory!");
406 }
407
408 vkBindBufferMemory(device_, buffer, bufferMemory, 0);
409}
410
412{
413 VkCommandBufferAllocateInfo allocInfo{};
414 allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
415 allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
416 allocInfo.commandPool = commandPool;
417 allocInfo.commandBufferCount = 1;
418
419 VkCommandBuffer commandBuffer = nullptr;
420 vkAllocateCommandBuffers(device_, &allocInfo, &commandBuffer);
421
422 VkCommandBufferBeginInfo beginInfo{};
423 beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
424 beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
425
426 vkBeginCommandBuffer(commandBuffer, &beginInfo);
427 return commandBuffer;
428}
429
430void ven::Device::endSingleTimeCommands(const VkCommandBuffer commandBuffer) const
431{
432 vkEndCommandBuffer(commandBuffer);
433
434 VkSubmitInfo submitInfo{};
435 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
436 submitInfo.commandBufferCount = 1;
437 submitInfo.pCommandBuffers = &commandBuffer;
438
439 vkQueueSubmit(graphicsQueue_, 1, &submitInfo, VK_NULL_HANDLE);
440 vkQueueWaitIdle(graphicsQueue_);
441
442 vkFreeCommandBuffers(device_, commandPool, 1, &commandBuffer);
443}
444
445void ven::Device::copyBuffer(const VkBuffer srcBuffer, const VkBuffer dstBuffer, const VkDeviceSize size) const
446{
447 const VkCommandBuffer commandBuffer = beginSingleTimeCommands();
448
449 VkBufferCopy copyRegion{};
450 copyRegion.srcOffset = 0; // Optional
451 copyRegion.dstOffset = 0; // Optional
452 copyRegion.size = size;
453 vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, 1, &copyRegion);
454
455 endSingleTimeCommands(commandBuffer);
456}
457
458void ven::Device::copyBufferToImage(const VkBuffer buffer, const VkImage image, const uint32_t width, const uint32_t height, const uint32_t layerCount) const
459{
460 const VkCommandBuffer commandBuffer = beginSingleTimeCommands();
461
462 VkBufferImageCopy region{};
463 region.bufferOffset = 0;
464 region.bufferRowLength = 0;
465 region.bufferImageHeight = 0;
466
467 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
468 region.imageSubresource.mipLevel = 0;
469 region.imageSubresource.baseArrayLayer = 0;
470 region.imageSubresource.layerCount = layerCount;
471
472 region.imageOffset = {0, 0, 0};
473 region.imageExtent = {width, height, 1};
474
475 vkCmdCopyBufferToImage(commandBuffer, buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
476 endSingleTimeCommands(commandBuffer);
477}
478
479void ven::Device::createImageWithInfo(const VkImageCreateInfo &imageInfo, const VkMemoryPropertyFlags properties, VkImage &image, VkDeviceMemory &imageMemory) const
480{
481 if (vkCreateImage(device_, &imageInfo, nullptr, &image) != VK_SUCCESS) {
482 throw std::runtime_error("failed to create image!");
483 }
484
485 VkMemoryRequirements memRequirements;
486 vkGetImageMemoryRequirements(device_, image, &memRequirements);
487
488 VkMemoryAllocateInfo allocInfo{};
489 allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
490 allocInfo.allocationSize = memRequirements.size;
491 allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties);
492
493 if (vkAllocateMemory(device_, &allocInfo, nullptr, &imageMemory) != VK_SUCCESS) {
494 throw std::runtime_error("failed to allocate image m_memory!");
495 }
496
497 if (vkBindImageMemory(device_, image, imageMemory, 0) != VK_SUCCESS) {
498 throw std::runtime_error("failed to bind image m_memory!");
499 }
500}
This file contains the Device class.
void endSingleTimeCommands(VkCommandBuffer commandBuffer) const
Definition device.cpp:430
void createCommandPool()
Definition device.cpp:171
SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device) const
Definition device.cpp:334
void createInstance()
Definition device.cpp:57
bool checkValidationLayerSupport() const
Definition device.cpp:225
void setupDebugMessenger()
Definition device.cpp:215
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags propertiesp) const
Definition device.cpp:369
void pickPhysicalDevice()
Definition device.cpp:98
bool checkDeviceExtensionSupport(VkPhysicalDevice device) const
Definition device.cpp:289
void createLogicalDevice()
Definition device.cpp:124
Device(Window &window)
Definition device.cpp:34
void createImageWithInfo(const VkImageCreateInfo &imageInfo, VkMemoryPropertyFlags properties, VkImage &image, VkDeviceMemory &imageMemory) const
Definition device.cpp:479
QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device) const
Definition device.cpp:305
VkCommandBuffer beginSingleTimeCommands() const
Definition device.cpp:411
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size) const
Definition device.cpp:445
bool isDeviceSuitable(VkPhysicalDevice device) const
Definition device.cpp:185
std::vector< const char * > getRequiredExtensions() const
Definition device.cpp:250
void copyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height, uint32_t layerCount) const
Definition device.cpp:458
void createSurface()
Definition Device.hpp:76
static void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT &createInfo)
Definition device.cpp:202
void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags propertiesp, VkBuffer &buffer, VkDeviceMemory &bufferMemory) const
Definition device.cpp:384
void hasGlfwRequiredInstanceExtensions() const
Definition device.cpp:265
VkFormat findSupportedFormat(const std::vector< VkFormat > &candidates, VkImageTiling tiling, VkFormatFeatureFlags features) const
Definition device.cpp:355
void DestroyDebugUtilsMessengerEXT(const VkInstance instance, const VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks *pAllocator)
Definition device.cpp:26
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(const VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, const VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData)
Definition device.cpp:8
VkResult CreateDebugUtilsMessengerEXT(const VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugUtilsMessengerEXT *pDebugMessenger)
Definition device.cpp:16
bool isComplete() const
Definition Device.hpp:26
std::vector< VkPresentModeKHR > presentModes
Definition Device.hpp:18
VkSurfaceCapabilitiesKHR capabilities
Definition Device.hpp:16
std::vector< VkSurfaceFormatKHR > formats
Definition Device.hpp:17