SDL  2.0
testvulkan.c
Go to the documentation of this file.
1 /*
2  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
3 
4  This software is provided 'as-is', without any express or implied
5  warranty. In no event will the authors be held liable for any damages
6  arising from the use of this software.
7 
8  Permission is granted to anyone to use this software for any purpose,
9  including commercial applications, and to alter it and redistribute it
10  freely.
11 */
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <math.h>
16 
17 #include "SDL_test_common.h"
18 
19 #if defined(__ANDROID__) && defined(__ARM_EABI__) && !defined(__ARM_ARCH_7A__)
20 
21 int main(int argc, char *argv[])
22 {
23  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "No Vulkan support on this system\n");
24  return 1;
25 }
26 
27 #else
28 
29 #define VK_NO_PROTOTYPES
30 #ifdef HAVE_VULKAN_H
31 #include <vulkan/vulkan.h>
32 #else
33 /* SDL includes a copy for building on systems without the Vulkan SDK */
34 #include "../src/video/khronos/vulkan/vulkan.h"
35 #endif
36 #include "SDL_vulkan.h"
37 
38 #ifndef UINT64_MAX /* VS2008 */
39 #define UINT64_MAX 18446744073709551615
40 #endif
41 
42 #define VULKAN_FUNCTIONS() \
43  VULKAN_DEVICE_FUNCTION(vkAcquireNextImageKHR) \
44  VULKAN_DEVICE_FUNCTION(vkAllocateCommandBuffers) \
45  VULKAN_DEVICE_FUNCTION(vkBeginCommandBuffer) \
46  VULKAN_DEVICE_FUNCTION(vkCmdClearColorImage) \
47  VULKAN_DEVICE_FUNCTION(vkCmdPipelineBarrier) \
48  VULKAN_DEVICE_FUNCTION(vkCreateCommandPool) \
49  VULKAN_DEVICE_FUNCTION(vkCreateFence) \
50  VULKAN_DEVICE_FUNCTION(vkCreateImageView) \
51  VULKAN_DEVICE_FUNCTION(vkCreateSemaphore) \
52  VULKAN_DEVICE_FUNCTION(vkCreateSwapchainKHR) \
53  VULKAN_DEVICE_FUNCTION(vkDestroyCommandPool) \
54  VULKAN_DEVICE_FUNCTION(vkDestroyDevice) \
55  VULKAN_DEVICE_FUNCTION(vkDestroyFence) \
56  VULKAN_DEVICE_FUNCTION(vkDestroyImageView) \
57  VULKAN_DEVICE_FUNCTION(vkDestroySemaphore) \
58  VULKAN_DEVICE_FUNCTION(vkDestroySwapchainKHR) \
59  VULKAN_DEVICE_FUNCTION(vkDeviceWaitIdle) \
60  VULKAN_DEVICE_FUNCTION(vkEndCommandBuffer) \
61  VULKAN_DEVICE_FUNCTION(vkFreeCommandBuffers) \
62  VULKAN_DEVICE_FUNCTION(vkGetDeviceQueue) \
63  VULKAN_DEVICE_FUNCTION(vkGetFenceStatus) \
64  VULKAN_DEVICE_FUNCTION(vkGetSwapchainImagesKHR) \
65  VULKAN_DEVICE_FUNCTION(vkQueuePresentKHR) \
66  VULKAN_DEVICE_FUNCTION(vkQueueSubmit) \
67  VULKAN_DEVICE_FUNCTION(vkResetCommandBuffer) \
68  VULKAN_DEVICE_FUNCTION(vkResetFences) \
69  VULKAN_DEVICE_FUNCTION(vkWaitForFences) \
70  VULKAN_GLOBAL_FUNCTION(vkCreateInstance) \
71  VULKAN_GLOBAL_FUNCTION(vkEnumerateInstanceExtensionProperties) \
72  VULKAN_GLOBAL_FUNCTION(vkEnumerateInstanceLayerProperties) \
73  VULKAN_INSTANCE_FUNCTION(vkCreateDevice) \
74  VULKAN_INSTANCE_FUNCTION(vkDestroyInstance) \
75  VULKAN_INSTANCE_FUNCTION(vkDestroySurfaceKHR) \
76  VULKAN_INSTANCE_FUNCTION(vkEnumerateDeviceExtensionProperties) \
77  VULKAN_INSTANCE_FUNCTION(vkEnumeratePhysicalDevices) \
78  VULKAN_INSTANCE_FUNCTION(vkGetDeviceProcAddr) \
79  VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceFeatures) \
80  VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceProperties) \
81  VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceQueueFamilyProperties) \
82  VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) \
83  VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceFormatsKHR) \
84  VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfacePresentModesKHR) \
85  VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR)
86 
87 #define VULKAN_DEVICE_FUNCTION(name) static PFN_##name name = NULL;
88 #define VULKAN_GLOBAL_FUNCTION(name) static PFN_##name name = NULL;
89 #define VULKAN_INSTANCE_FUNCTION(name) static PFN_##name name = NULL;
91 #undef VULKAN_DEVICE_FUNCTION
92 #undef VULKAN_GLOBAL_FUNCTION
93 #undef VULKAN_INSTANCE_FUNCTION
95 
96 /* Based on the headers found in
97  * https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers
98  */
99 #if VK_HEADER_VERSION < 22
100 enum
101 {
103 };
104 #endif
105 #if VK_HEADER_VERSION < 38
106 enum {
107  VK_ERROR_OUT_OF_POOL_MEMORY_KHR = -1000069000
108 };
109 #endif
110 
112 {
113  switch((int)result)
114  {
115  case VK_SUCCESS:
116  return "VK_SUCCESS";
117  case VK_NOT_READY:
118  return "VK_NOT_READY";
119  case VK_TIMEOUT:
120  return "VK_TIMEOUT";
121  case VK_EVENT_SET:
122  return "VK_EVENT_SET";
123  case VK_EVENT_RESET:
124  return "VK_EVENT_RESET";
125  case VK_INCOMPLETE:
126  return "VK_INCOMPLETE";
128  return "VK_ERROR_OUT_OF_HOST_MEMORY";
130  return "VK_ERROR_OUT_OF_DEVICE_MEMORY";
132  return "VK_ERROR_INITIALIZATION_FAILED";
134  return "VK_ERROR_DEVICE_LOST";
136  return "VK_ERROR_MEMORY_MAP_FAILED";
138  return "VK_ERROR_LAYER_NOT_PRESENT";
140  return "VK_ERROR_EXTENSION_NOT_PRESENT";
142  return "VK_ERROR_FEATURE_NOT_PRESENT";
144  return "VK_ERROR_INCOMPATIBLE_DRIVER";
146  return "VK_ERROR_TOO_MANY_OBJECTS";
148  return "VK_ERROR_FORMAT_NOT_SUPPORTED";
150  return "VK_ERROR_FRAGMENTED_POOL";
152  return "VK_ERROR_SURFACE_LOST_KHR";
154  return "VK_ERROR_NATIVE_WINDOW_IN_USE_KHR";
155  case VK_SUBOPTIMAL_KHR:
156  return "VK_SUBOPTIMAL_KHR";
158  return "VK_ERROR_OUT_OF_DATE_KHR";
160  return "VK_ERROR_INCOMPATIBLE_DISPLAY_KHR";
162  return "VK_ERROR_VALIDATION_FAILED_EXT";
164  return "VK_ERROR_OUT_OF_POOL_MEMORY_KHR";
166  return "VK_ERROR_INVALID_SHADER_NV";
167  default:
168  break;
169  }
170  if(result < 0)
171  return "VK_ERROR_<Unknown>";
172  return "VK_<Unknown>";
173 }
174 
175 typedef struct VulkanContext
176 {
177  VkInstance instance;
178  VkDevice device;
179  VkSurfaceKHR surface;
180  VkSwapchainKHR swapchain;
185  VkPhysicalDevice physicalDevice;
186  VkQueue graphicsQueue;
187  VkQueue presentQueue;
197  VkCommandPool commandPool;
199  VkImage *swapchainImages;
200  VkCommandBuffer *commandBuffers;
201  VkFence *fences;
202 } VulkanContext;
203 
206 
207 static void shutdownVulkan(void);
208 
209 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
210 static void quit(int rc)
211 {
212  shutdownVulkan();
214  exit(rc);
215 }
216 
217 static void loadGlobalFunctions(void)
218 {
221  {
223  "SDL_Vulkan_GetVkGetInstanceProcAddr(): %s\n",
224  SDL_GetError());
225  quit(2);
226  }
227 
228 #define VULKAN_DEVICE_FUNCTION(name)
229 #define VULKAN_GLOBAL_FUNCTION(name) \
230  name = (PFN_##name)vkGetInstanceProcAddr(VK_NULL_HANDLE, #name); \
231  if(!name) \
232  { \
233  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \
234  "vkGetInstanceProcAddr(VK_NULL_HANDLE, \"" #name "\") failed\n"); \
235  quit(2); \
236  }
237 #define VULKAN_INSTANCE_FUNCTION(name)
239 #undef VULKAN_DEVICE_FUNCTION
240 #undef VULKAN_GLOBAL_FUNCTION
241 #undef VULKAN_INSTANCE_FUNCTION
242 }
243 
244 static void createInstance(void)
245 {
246  VkApplicationInfo appInfo = {0};
247  VkInstanceCreateInfo instanceCreateInfo = {0};
248  const char **extensions = NULL;
249  unsigned extensionCount = 0;
251 
252 
254  appInfo.apiVersion = VK_API_VERSION_1_0;
255  instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
256  instanceCreateInfo.pApplicationInfo = &appInfo;
257  if(!SDL_Vulkan_GetInstanceExtensions(NULL, &extensionCount, NULL))
258  {
260  "SDL_Vulkan_GetInstanceExtensions(): %s\n",
261  SDL_GetError());
262  quit(2);
263  }
264  extensions = SDL_malloc(sizeof(const char *) * extensionCount);
265  if(!extensions)
266  {
267  SDL_OutOfMemory();
268  quit(2);
269  }
270  if(!SDL_Vulkan_GetInstanceExtensions(NULL, &extensionCount, extensions))
271  {
272  SDL_free((void*)extensions);
274  "SDL_Vulkan_GetInstanceExtensions(): %s\n",
275  SDL_GetError());
276  quit(2);
277  }
278  instanceCreateInfo.enabledExtensionCount = extensionCount;
279  instanceCreateInfo.ppEnabledExtensionNames = extensions;
280  result = vkCreateInstance(&instanceCreateInfo, NULL, &vulkanContext.instance);
281  SDL_free((void*)extensions);
282  if(result != VK_SUCCESS)
283  {
286  "vkCreateInstance(): %s\n",
288  quit(2);
289  }
290 }
291 
292 static void loadInstanceFunctions(void)
293 {
294 #define VULKAN_DEVICE_FUNCTION(name)
295 #define VULKAN_GLOBAL_FUNCTION(name)
296 #define VULKAN_INSTANCE_FUNCTION(name) \
297  name = (PFN_##name)vkGetInstanceProcAddr(vulkanContext.instance, #name); \
298  if(!name) \
299  { \
300  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \
301  "vkGetInstanceProcAddr(instance, \"" #name "\") failed\n"); \
302  quit(2); \
303  }
305 #undef VULKAN_DEVICE_FUNCTION
306 #undef VULKAN_GLOBAL_FUNCTION
307 #undef VULKAN_INSTANCE_FUNCTION
308 }
309 
310 static void createSurface(void)
311 {
315  {
317  SDL_LogError(
318  SDL_LOG_CATEGORY_APPLICATION, "SDL_Vulkan_CreateSurface(): %s\n", SDL_GetError());
319  quit(2);
320  }
321 }
322 
323 static void findPhysicalDevice(void)
324 {
325  uint32_t physicalDeviceCount = 0;
326  VkPhysicalDevice *physicalDevices;
327  VkQueueFamilyProperties *queueFamiliesProperties = NULL;
328  uint32_t queueFamiliesPropertiesAllocatedSize = 0;
329  VkExtensionProperties *deviceExtensions = NULL;
330  uint32_t deviceExtensionsAllocatedSize = 0;
331  uint32_t physicalDeviceIndex;
332 
333  VkResult result =
334  vkEnumeratePhysicalDevices(vulkanContext.instance, &physicalDeviceCount, NULL);
335  if(result != VK_SUCCESS)
336  {
338  "vkEnumeratePhysicalDevices(): %s\n",
340  quit(2);
341  }
342  if(physicalDeviceCount == 0)
343  {
345  "vkEnumeratePhysicalDevices(): no physical devices\n");
346  quit(2);
347  }
348  physicalDevices = SDL_malloc(sizeof(VkPhysicalDevice) * physicalDeviceCount);
349  if(!physicalDevices)
350  {
351  SDL_OutOfMemory();
352  quit(2);
353  }
354  result =
355  vkEnumeratePhysicalDevices(vulkanContext.instance, &physicalDeviceCount, physicalDevices);
356  if(result != VK_SUCCESS)
357  {
358  SDL_free(physicalDevices);
360  "vkEnumeratePhysicalDevices(): %s\n",
362  quit(2);
363  }
365  for(physicalDeviceIndex = 0; physicalDeviceIndex < physicalDeviceCount;
366  physicalDeviceIndex++)
367  {
368  uint32_t queueFamiliesCount = 0;
369  uint32_t queueFamilyIndex;
370  uint32_t deviceExtensionCount = 0;
371  SDL_bool hasSwapchainExtension = SDL_FALSE;
372  uint32_t i;
373 
374 
375  VkPhysicalDevice physicalDevice = physicalDevices[physicalDeviceIndex];
378  continue;
380  vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueFamiliesCount, NULL);
381  if(queueFamiliesCount == 0)
382  continue;
383  if(queueFamiliesPropertiesAllocatedSize < queueFamiliesCount)
384  {
385  SDL_free(queueFamiliesProperties);
386  queueFamiliesPropertiesAllocatedSize = queueFamiliesCount;
387  queueFamiliesProperties =
388  SDL_malloc(sizeof(VkQueueFamilyProperties) * queueFamiliesPropertiesAllocatedSize);
389  if(!queueFamiliesProperties)
390  {
391  SDL_free(physicalDevices);
392  SDL_free(deviceExtensions);
393  SDL_OutOfMemory();
394  quit(2);
395  }
396  }
398  physicalDevice, &queueFamiliesCount, queueFamiliesProperties);
399  vulkanContext.graphicsQueueFamilyIndex = queueFamiliesCount;
400  vulkanContext.presentQueueFamilyIndex = queueFamiliesCount;
401  for(queueFamilyIndex = 0; queueFamilyIndex < queueFamiliesCount;
402  queueFamilyIndex++)
403  {
404  VkBool32 supported = 0;
405 
406  if(queueFamiliesProperties[queueFamilyIndex].queueCount == 0)
407  continue;
408  if(queueFamiliesProperties[queueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT)
409  vulkanContext.graphicsQueueFamilyIndex = queueFamilyIndex;
411  physicalDevice, queueFamilyIndex, vulkanContext.surface, &supported);
412  if(result != VK_SUCCESS)
413  {
414  SDL_free(physicalDevices);
415  SDL_free(queueFamiliesProperties);
416  SDL_free(deviceExtensions);
418  "vkGetPhysicalDeviceSurfaceSupportKHR(): %s\n",
420  quit(2);
421  }
422  if(supported)
423  {
424  vulkanContext.presentQueueFamilyIndex = queueFamilyIndex;
425  if(queueFamiliesProperties[queueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT)
426  break; // use this queue because it can present and do graphics
427  }
428  }
429  if(vulkanContext.graphicsQueueFamilyIndex == queueFamiliesCount) // no good queues found
430  continue;
431  if(vulkanContext.presentQueueFamilyIndex == queueFamiliesCount) // no good queues found
432  continue;
433  result =
434  vkEnumerateDeviceExtensionProperties(physicalDevice, NULL, &deviceExtensionCount, NULL);
435  if(result != VK_SUCCESS)
436  {
437  SDL_free(physicalDevices);
438  SDL_free(queueFamiliesProperties);
439  SDL_free(deviceExtensions);
441  "vkEnumerateDeviceExtensionProperties(): %s\n",
443  quit(2);
444  }
445  if(deviceExtensionCount == 0)
446  continue;
447  if(deviceExtensionsAllocatedSize < deviceExtensionCount)
448  {
449  SDL_free(deviceExtensions);
450  deviceExtensionsAllocatedSize = deviceExtensionCount;
451  deviceExtensions =
452  SDL_malloc(sizeof(VkExtensionProperties) * deviceExtensionsAllocatedSize);
453  if(!deviceExtensions)
454  {
455  SDL_free(physicalDevices);
456  SDL_free(queueFamiliesProperties);
457  SDL_OutOfMemory();
458  quit(2);
459  }
460  }
462  physicalDevice, NULL, &deviceExtensionCount, deviceExtensions);
463  if(result != VK_SUCCESS)
464  {
465  SDL_free(physicalDevices);
466  SDL_free(queueFamiliesProperties);
467  SDL_free(deviceExtensions);
469  "vkEnumerateDeviceExtensionProperties(): %s\n",
471  quit(2);
472  }
473  for(i = 0; i < deviceExtensionCount; i++)
474  {
475  if(0 == SDL_strcmp(deviceExtensions[i].extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME))
476  {
477  hasSwapchainExtension = SDL_TRUE;
478  break;
479  }
480  }
481  if(!hasSwapchainExtension)
482  continue;
483  vulkanContext.physicalDevice = physicalDevice;
484  break;
485  }
486  SDL_free(physicalDevices);
487  SDL_free(queueFamiliesProperties);
488  SDL_free(deviceExtensions);
490  {
491  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Vulkan: no viable physical devices found");
492  quit(2);
493  }
494 }
495 
496 static void createDevice(void)
497 {
498  VkDeviceQueueCreateInfo deviceQueueCreateInfo[1] = {0};
499  static const float queuePriority[] = {1.0f};
500  VkDeviceCreateInfo deviceCreateInfo = {0};
501  static const char *const deviceExtensionNames[] = {
503  };
505 
506  deviceQueueCreateInfo->sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
508  deviceQueueCreateInfo->queueCount = 1;
509  deviceQueueCreateInfo->pQueuePriorities = &queuePriority[0];
510 
511  deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
512  deviceCreateInfo.queueCreateInfoCount = 1;
513  deviceCreateInfo.pQueueCreateInfos = deviceQueueCreateInfo;
514  deviceCreateInfo.pEnabledFeatures = NULL;
515  deviceCreateInfo.enabledExtensionCount = SDL_arraysize(deviceExtensionNames);
516  deviceCreateInfo.ppEnabledExtensionNames = deviceExtensionNames;
518  vulkanContext.physicalDevice, &deviceCreateInfo, NULL, &vulkanContext.device);
519  if(result != VK_SUCCESS)
520  {
522  SDL_LogError(
523  SDL_LOG_CATEGORY_APPLICATION, "vkCreateDevice(): %s\n", getVulkanResultString(result));
524  quit(2);
525  }
526 }
527 
528 static void loadDeviceFunctions(void)
529 {
530 #define VULKAN_DEVICE_FUNCTION(name) \
531  name = (PFN_##name)vkGetDeviceProcAddr(vulkanContext.device, #name); \
532  if(!name) \
533  { \
534  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \
535  "vkGetDeviceProcAddr(device, \"" #name "\") failed\n"); \
536  quit(2); \
537  }
538 #define VULKAN_GLOBAL_FUNCTION(name)
539 #define VULKAN_INSTANCE_FUNCTION(name)
541 #undef VULKAN_DEVICE_FUNCTION
542 #undef VULKAN_GLOBAL_FUNCTION
543 #undef VULKAN_INSTANCE_FUNCTION
544 }
545 
546 #undef VULKAN_FUNCTIONS
547 
548 static void getQueues(void)
549 {
552  0,
557  0,
559  else
561 }
562 
563 static void createSemaphore(VkSemaphore *semaphore)
564 {
566 
567  VkSemaphoreCreateInfo createInfo = {0};
569  result = vkCreateSemaphore(vulkanContext.device, &createInfo, NULL, semaphore);
570  if(result != VK_SUCCESS)
571  {
572  *semaphore = VK_NULL_HANDLE;
574  "vkCreateSemaphore(): %s\n",
576  quit(2);
577  }
578 }
579 
580 static void createSemaphores(void)
581 {
584 }
585 
586 static void getSurfaceCaps(void)
587 {
590  if(result != VK_SUCCESS)
591  {
593  "vkGetPhysicalDeviceSurfaceCapabilitiesKHR(): %s\n",
595  quit(2);
596  }
597 
598  // check surface usage
600  {
602  "Vulkan surface doesn't support VK_IMAGE_USAGE_TRANSFER_DST_BIT\n");
603  quit(2);
604  }
605 }
606 
607 static void getSurfaceFormats(void)
608 {
612  NULL);
613  if(result != VK_SUCCESS)
614  {
617  "vkGetPhysicalDeviceSurfaceFormatsKHR(): %s\n",
619  quit(2);
620  }
622  {
628  {
630  SDL_OutOfMemory();
631  quit(2);
632  }
633  }
638  if(result != VK_SUCCESS)
639  {
642  "vkGetPhysicalDeviceSurfaceFormatsKHR(): %s\n",
644  quit(2);
645  }
646 }
647 
648 static void getSwapchainImages(void)
649 {
651 
656  if(result != VK_SUCCESS)
657  {
660  "vkGetSwapchainImagesKHR(): %s\n",
662  quit(2);
663  }
666  {
667  SDL_OutOfMemory();
668  quit(2);
669  }
674  if(result != VK_SUCCESS)
675  {
680  "vkGetSwapchainImagesKHR(): %s\n",
682  quit(2);
683  }
684 }
685 
687 {
688  uint32_t i;
689  int w, h;
690  VkSwapchainCreateInfoKHR createInfo = {0};
692 
693  // pick an image count
698 
699  // pick a format
702  {
703  // aren't any preferred formats, so we pick
706  }
707  else
708  {
710  for(i = 0; i < vulkanContext.surfaceFormatsCount; i++)
711  {
713  {
715  break;
716  }
717  }
718  }
719 
720  // get size
724  if(w == 0 || h == 0)
725  return SDL_FALSE;
726 
728  createInfo.surface = vulkanContext.surface;
733  createInfo.imageArrayLayers = 1;
739  createInfo.clipped = VK_TRUE;
740  createInfo.oldSwapchain = vulkanContext.swapchain;
741  result =
743  if(createInfo.oldSwapchain)
745  if(result != VK_SUCCESS)
746  {
749  "vkCreateSwapchainKHR(): %s\n",
751  quit(2);
752  }
754  return SDL_TRUE;
755 }
756 
757 static void destroySwapchain(void)
758 {
764 }
765 
766 static void destroyCommandBuffers(void)
767 {
775 }
776 
777 static void destroyCommandPool(void)
778 {
782 }
783 
784 static void createCommandPool(void)
785 {
787 
788  VkCommandPoolCreateInfo createInfo = {0};
790  createInfo.flags =
793  result =
795  if(result != VK_SUCCESS)
796  {
799  "vkCreateCommandPool(): %s\n",
801  quit(2);
802  }
803 }
804 
805 static void createCommandBuffers(void)
806 {
808 
809  VkCommandBufferAllocateInfo allocateInfo = {0};
811  allocateInfo.commandPool = vulkanContext.commandPool;
812  allocateInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
815  SDL_malloc(sizeof(VkCommandBuffer) * vulkanContext.swapchainImageCount);
816  result =
818  if(result != VK_SUCCESS)
819  {
823  "vkAllocateCommandBuffers(): %s\n",
825  quit(2);
826  }
827 }
828 
829 static void createFences(void)
830 {
831  uint32_t i;
832 
834  if(!vulkanContext.fences)
835  {
836  SDL_OutOfMemory();
837  quit(2);
838  }
839  for(i = 0; i < vulkanContext.swapchainImageCount; i++)
840  {
842 
843  VkFenceCreateInfo createInfo = {0};
845  createInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
846  result =
848  if(result != VK_SUCCESS)
849  {
850  for(; i > 0; i--)
851  {
853  }
857  "vkCreateFence(): %s\n",
859  quit(2);
860  }
861  }
862 }
863 
864 static void destroyFences(void)
865 {
866  uint32_t i;
867 
868  if(!vulkanContext.fences)
869  return;
870  for(i = 0; i < vulkanContext.swapchainImageCount; i++)
871  {
873  }
876 }
877 
878 static void recordPipelineImageBarrier(VkCommandBuffer commandBuffer,
879  VkAccessFlags sourceAccessMask,
880  VkAccessFlags destAccessMask,
881  VkImageLayout sourceLayout,
882  VkImageLayout destLayout,
883  VkImage image)
884 {
885  VkImageMemoryBarrier barrier = {0};
887  barrier.srcAccessMask = sourceAccessMask;
888  barrier.dstAccessMask = destAccessMask;
889  barrier.oldLayout = sourceLayout;
890  barrier.newLayout = destLayout;
893  barrier.image = image;
895  barrier.subresourceRange.baseMipLevel = 0;
896  barrier.subresourceRange.levelCount = 1;
897  barrier.subresourceRange.baseArrayLayer = 0;
898  barrier.subresourceRange.layerCount = 1;
899  vkCmdPipelineBarrier(commandBuffer,
902  0,
903  0,
904  NULL,
905  0,
906  NULL,
907  1,
908  &barrier);
909 }
910 
911 static void rerecordCommandBuffer(uint32_t frameIndex, const VkClearColorValue *clearColor)
912 {
913  VkCommandBuffer commandBuffer = vulkanContext.commandBuffers[frameIndex];
914  VkImage image = vulkanContext.swapchainImages[frameIndex];
915  VkCommandBufferBeginInfo beginInfo = {0};
916  VkImageSubresourceRange clearRange = {0};
917 
918  VkResult result = vkResetCommandBuffer(commandBuffer, 0);
919  if(result != VK_SUCCESS)
920  {
922  "vkResetCommandBuffer(): %s\n",
924  quit(2);
925  }
928  result = vkBeginCommandBuffer(commandBuffer, &beginInfo);
929  if(result != VK_SUCCESS)
930  {
932  "vkBeginCommandBuffer(): %s\n",
934  quit(2);
935  }
936  recordPipelineImageBarrier(commandBuffer,
937  0,
941  image);
943  clearRange.baseMipLevel = 0;
944  clearRange.levelCount = 1;
945  clearRange.baseArrayLayer = 0;
946  clearRange.layerCount = 1;
948  commandBuffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, clearColor, 1, &clearRange);
949  recordPipelineImageBarrier(commandBuffer,
954  image);
955  result = vkEndCommandBuffer(commandBuffer);
956  if(result != VK_SUCCESS)
957  {
959  "vkEndCommandBuffer(): %s\n",
961  quit(2);
962  }
963 }
964 
966 {
967  destroyFences();
970  if(doDestroySwapchain)
972 }
973 
975 {
977  getSurfaceCaps();
979  if(!createSwapchain())
980  return SDL_FALSE;
983  createFences();
984  return SDL_TRUE;
985 }
986 
987 static void initVulkan(void)
988 {
990  SDL_memset(&vulkanContext, 0, sizeof(VulkanContext));
992  createInstance();
994  createSurface();
996  createDevice();
998  getQueues();
1001 }
1002 
1003 static void shutdownVulkan(void)
1004 {
1020 }
1021 
1022 static SDL_bool render(void)
1023 {
1024  uint32_t frameIndex;
1025  VkResult result;
1026  double currentTime;
1027  VkClearColorValue clearColor = {0};
1029  VkSubmitInfo submitInfo = {0};
1030  VkPresentInfoKHR presentInfo = {0};
1031  int w, h;
1032 
1034  {
1036  if(!retval)
1037  SDL_Delay(100);
1038  return retval;
1039  }
1042  UINT64_MAX,
1045  &frameIndex);
1049  {
1051  "vkAcquireNextImageKHR(): %s\n",
1053  quit(2);
1054  }
1057  if(result != VK_SUCCESS)
1058  {
1059  SDL_LogError(
1060  SDL_LOG_CATEGORY_APPLICATION, "vkWaitForFences(): %s\n", getVulkanResultString(result));
1061  quit(2);
1062  }
1064  if(result != VK_SUCCESS)
1065  {
1066  SDL_LogError(
1067  SDL_LOG_CATEGORY_APPLICATION, "vkResetFences(): %s\n", getVulkanResultString(result));
1068  quit(2);
1069  }
1070  currentTime = (double)SDL_GetPerformanceCounter() / SDL_GetPerformanceFrequency();
1071  clearColor.float32[0] = (float)(0.5 + 0.5 * SDL_sin(currentTime));
1072  clearColor.float32[1] = (float)(0.5 + 0.5 * SDL_sin(currentTime + M_PI * 2 / 3));
1073  clearColor.float32[2] = (float)(0.5 + 0.5 * SDL_sin(currentTime + M_PI * 4 / 3));
1074  clearColor.float32[3] = 1;
1075  rerecordCommandBuffer(frameIndex, &clearColor);
1076  submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1077  submitInfo.waitSemaphoreCount = 1;
1079  submitInfo.pWaitDstStageMask = &waitDestStageMask;
1080  submitInfo.commandBufferCount = 1;
1081  submitInfo.pCommandBuffers = &vulkanContext.commandBuffers[frameIndex];
1082  submitInfo.signalSemaphoreCount = 1;
1085  vulkanContext.graphicsQueue, 1, &submitInfo, vulkanContext.fences[frameIndex]);
1086  if(result != VK_SUCCESS)
1087  {
1088  SDL_LogError(
1089  SDL_LOG_CATEGORY_APPLICATION, "vkQueueSubmit(): %s\n", getVulkanResultString(result));
1090  quit(2);
1091  }
1093  presentInfo.waitSemaphoreCount = 1;
1095  presentInfo.swapchainCount = 1;
1096  presentInfo.pSwapchains = &vulkanContext.swapchain;
1097  presentInfo.pImageIndices = &frameIndex;
1100  {
1102  }
1103  if(result != VK_SUCCESS)
1104  {
1106  "vkQueuePresentKHR(): %s\n",
1108  quit(2);
1109  }
1112  {
1114  }
1115  return SDL_TRUE;
1116 }
1117 
1118 int main(int argc, char *argv[])
1119 {
1120  int fsaa, accel;
1121  int done;
1123  SDL_Event event;
1124  Uint32 then, now, frames;
1125  int dw, dh;
1126 
1127  /* Enable standard application logging */
1129 
1130  /* Initialize parameters */
1131  fsaa = 0;
1132  accel = -1;
1133 
1134  /* Initialize test framework */
1136  if(!state)
1137  {
1138  return 1;
1139  }
1140 
1141  /* Set Vulkan parameters */
1143  state->num_windows = 1;
1144  state->skip_renderer = 1;
1145 
1146  if (!SDLTest_CommonDefaultArgs(state, argc, argv) || !SDLTest_CommonInit(state)) {
1148  return 1;
1149  }
1150 
1152  SDL_Log("Screen BPP : %d\n", SDL_BITSPERPIXEL(mode.format));
1153  SDL_GetWindowSize(state->windows[0], &dw, &dh);
1154  SDL_Log("Window Size : %d,%d\n", dw, dh);
1155  SDL_Vulkan_GetDrawableSize(state->windows[0], &dw, &dh);
1156  SDL_Log("Draw Size : %d,%d\n", dw, dh);
1157  SDL_Log("\n");
1158 
1159  initVulkan();
1160 
1161  /* Main render loop */
1162  frames = 0;
1163  then = SDL_GetTicks();
1164  done = 0;
1165  while(!done)
1166  {
1167  /* Check for events */
1168  ++frames;
1169  while(SDL_PollEvent(&event))
1170  {
1172  }
1173 
1174  if(!done)
1175  render();
1176  }
1177 
1178  /* Print out some timing information */
1179  now = SDL_GetTicks();
1180  if(now > then)
1181  {
1182  SDL_Log("%2.2f frames per second\n", ((double)frames * 1000) / (now - then));
1183  }
1184  quit(0);
1185  return 0;
1186 }
1187 
1188 #endif
#define SDL_INIT_VIDEO
Definition: SDL.h:82
unsigned int uint32_t
#define SDL_memset
#define SDL_sin
#define SDL_GetWindowSize
#define SDL_GetError
#define SDL_PollEvent
#define SDL_Vulkan_UnloadLibrary
#define SDL_Vulkan_GetDrawableSize
#define SDL_Vulkan_GetVkGetInstanceProcAddr
#define SDL_malloc
#define SDL_LogSetPriority
#define SDL_LogError
#define SDL_free
#define SDL_GetPerformanceCounter
#define SDL_strcmp
#define SDL_Delay
#define SDL_Vulkan_CreateSurface
#define SDL_GetCurrentDisplayMode
#define SDL_Vulkan_LoadLibrary
#define SDL_Log
#define SDL_Vulkan_GetInstanceExtensions
#define SDL_OutOfMemory()
Definition: SDL_error.h:88
@ SDL_LOG_PRIORITY_INFO
Definition: SDL_log.h:106
@ SDL_LOG_CATEGORY_APPLICATION
Definition: SDL_log.h:66
GLeglImageOES image
Definition: SDL_opengl.h:2148
struct _cl_event * event
GLenum mode
GLuint64EXT * result
GLfloat GLfloat GLfloat GLfloat h
GLubyte GLubyte GLubyte GLubyte w
#define SDL_BITSPERPIXEL(X)
Definition: SDL_pixels.h:127
SDL_bool
Definition: SDL_stdinc.h:168
@ SDL_TRUE
Definition: SDL_stdinc.h:170
@ SDL_FALSE
Definition: SDL_stdinc.h:169
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:121
uint32_t Uint32
Definition: SDL_stdinc.h:209
void SDLTest_CommonQuit(SDLTest_CommonState *state)
Close test window.
SDL_bool SDLTest_CommonDefaultArgs(SDLTest_CommonState *state, const int argc, char **argv)
Easy argument handling when test app doesn't need any custom args.
void SDLTest_CommonEvent(SDLTest_CommonState *state, SDL_Event *event, int *done)
Common event handler for test windows.
SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state)
Open test window.
SDLTest_CommonState * SDLTest_CommonCreateState(char **argv, Uint32 flags)
Parse command line parameters and create common state.
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
Uint64 SDL_GetPerformanceFrequency(void)
Get the count per second of the high resolution counter.
@ SDL_WINDOW_VULKAN
Definition: SDL_video.h:121
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define NULL
Definition: begin_code.h:163
int done
Definition: checkkeys.c:28
The structure that defines a display mode.
Definition: SDL_video.h:54
SDL_Window ** windows
VkStructureType sType
Definition: vulkan_core.h:2131
VkCommandBufferLevel level
Definition: vulkan_core.h:3003
VkStructureType sType
Definition: vulkan_core.h:3019
VkCommandBufferUsageFlags flags
Definition: vulkan_core.h:3021
VkStructureType sType
Definition: vulkan_core.h:2993
VkCommandPoolCreateFlags flags
Definition: vulkan_core.h:2995
uint32_t enabledExtensionCount
Definition: vulkan_core.h:2393
const VkDeviceQueueCreateInfo * pQueueCreateInfos
Definition: vulkan_core.h:2390
const VkPhysicalDeviceFeatures * pEnabledFeatures
Definition: vulkan_core.h:2395
const char *const * ppEnabledExtensionNames
Definition: vulkan_core.h:2394
uint32_t queueCreateInfoCount
Definition: vulkan_core.h:2389
VkStructureType sType
Definition: vulkan_core.h:2386
const float * pQueuePriorities
Definition: vulkan_core.h:2382
VkStructureType sType
Definition: vulkan_core.h:2377
uint32_t width
Definition: vulkan_core.h:1994
uint32_t height
Definition: vulkan_core.h:1995
VkFenceCreateFlags flags
Definition: vulkan_core.h:2516
VkStructureType sType
Definition: vulkan_core.h:2514
VkAccessFlags dstAccessMask
Definition: vulkan_core.h:2075
uint32_t dstQueueFamilyIndex
Definition: vulkan_core.h:2079
VkAccessFlags srcAccessMask
Definition: vulkan_core.h:2074
VkStructureType sType
Definition: vulkan_core.h:2072
VkImageLayout newLayout
Definition: vulkan_core.h:2077
VkImageSubresourceRange subresourceRange
Definition: vulkan_core.h:2081
VkImageLayout oldLayout
Definition: vulkan_core.h:2076
uint32_t srcQueueFamilyIndex
Definition: vulkan_core.h:2078
VkImageAspectFlags aspectMask
Definition: vulkan_core.h:2064
const char *const * ppEnabledExtensionNames
Definition: vulkan_core.h:2162
VkStructureType sType
Definition: vulkan_core.h:2155
uint32_t enabledExtensionCount
Definition: vulkan_core.h:2161
const VkApplicationInfo * pApplicationInfo
Definition: vulkan_core.h:2158
const VkSemaphore * pWaitSemaphores
Definition: vulkan_core.h:5811
uint32_t waitSemaphoreCount
Definition: vulkan_core.h:5810
uint32_t swapchainCount
Definition: vulkan_core.h:5812
const uint32_t * pImageIndices
Definition: vulkan_core.h:5814
VkStructureType sType
Definition: vulkan_core.h:5808
const VkSwapchainKHR * pSwapchains
Definition: vulkan_core.h:5813
VkStructureType sType
Definition: vulkan_core.h:2520
uint32_t waitSemaphoreCount
Definition: vulkan_core.h:2413
const VkPipelineStageFlags * pWaitDstStageMask
Definition: vulkan_core.h:2415
uint32_t commandBufferCount
Definition: vulkan_core.h:2416
const VkSemaphore * pWaitSemaphores
Definition: vulkan_core.h:2414
uint32_t signalSemaphoreCount
Definition: vulkan_core.h:2418
const VkCommandBuffer * pCommandBuffers
Definition: vulkan_core.h:2417
const VkSemaphore * pSignalSemaphores
Definition: vulkan_core.h:2419
VkStructureType sType
Definition: vulkan_core.h:2411
VkSurfaceTransformFlagBitsKHR currentTransform
Definition: vulkan_core.h:5718
VkImageUsageFlags supportedUsageFlags
Definition: vulkan_core.h:5720
VkColorSpaceKHR colorSpace
Definition: vulkan_core.h:5725
VkPresentModeKHR presentMode
Definition: vulkan_core.h:5802
VkImageUsageFlags imageUsage
Definition: vulkan_core.h:5796
VkSharingMode imageSharingMode
Definition: vulkan_core.h:5797
VkStructureType sType
Definition: vulkan_core.h:5787
VkSwapchainKHR oldSwapchain
Definition: vulkan_core.h:5804
VkColorSpaceKHR imageColorSpace
Definition: vulkan_core.h:5793
VkSurfaceTransformFlagBitsKHR preTransform
Definition: vulkan_core.h:5800
VkCompositeAlphaFlagBitsKHR compositeAlpha
Definition: vulkan_core.h:5801
VkQueue graphicsQueue
Definition: testvulkan.c:186
VkSurfaceKHR surface
Definition: testvulkan.c:179
VkFence * fences
Definition: testvulkan.c:201
VkSwapchainKHR swapchain
Definition: testvulkan.c:180
VkPhysicalDeviceProperties physicalDeviceProperties
Definition: testvulkan.c:181
VkSurfaceCapabilitiesKHR surfaceCapabilities
Definition: testvulkan.c:190
VkPhysicalDevice physicalDevice
Definition: testvulkan.c:185
VkSurfaceFormatKHR surfaceFormat
Definition: testvulkan.c:195
VkExtent2D swapchainSize
Definition: testvulkan.c:196
VkDevice device
Definition: testvulkan.c:178
VkCommandBuffer * commandBuffers
Definition: testvulkan.c:200
VkImage * swapchainImages
Definition: testvulkan.c:199
VkCommandPool commandPool
Definition: testvulkan.c:197
VkSemaphore renderingFinishedSemaphore
Definition: testvulkan.c:189
VkSemaphore imageAvailableSemaphore
Definition: testvulkan.c:188
uint32_t surfaceFormatsCount
Definition: testvulkan.c:193
uint32_t presentQueueFamilyIndex
Definition: testvulkan.c:184
uint32_t swapchainDesiredImageCount
Definition: testvulkan.c:194
uint32_t surfaceFormatsAllocatedCount
Definition: testvulkan.c:192
VkSurfaceFormatKHR * surfaceFormats
Definition: testvulkan.c:191
VkInstance instance
Definition: testvulkan.c:177
uint32_t graphicsQueueFamilyIndex
Definition: testvulkan.c:183
VkPhysicalDeviceFeatures physicalDeviceFeatures
Definition: testvulkan.c:182
uint32_t swapchainImageCount
Definition: testvulkan.c:198
VkQueue presentQueue
Definition: testvulkan.c:187
SDL_bool retval
static Uint32 frames
Definition: testsprite2.c:40
static const char * getVulkanResultString(VkResult result)
Definition: testvulkan.c:111
int main(int argc, char *argv[])
Definition: testvulkan.c:1118
static void getSurfaceFormats(void)
Definition: testvulkan.c:607
static void destroySwapchainAndSwapchainSpecificStuff(SDL_bool doDestroySwapchain)
Definition: testvulkan.c:965
#define UINT64_MAX
Definition: testvulkan.c:39
static void shutdownVulkan(void)
Definition: testvulkan.c:1003
static void quit(int rc)
Definition: testvulkan.c:210
#define VULKAN_FUNCTIONS()
Definition: testvulkan.c:42
static void destroyCommandBuffers(void)
Definition: testvulkan.c:766
static SDL_bool render(void)
Definition: testvulkan.c:1022
static void destroySwapchain(void)
Definition: testvulkan.c:757
static void createSemaphores(void)
Definition: testvulkan.c:580
static void initVulkan(void)
Definition: testvulkan.c:987
static void loadInstanceFunctions(void)
Definition: testvulkan.c:292
static void recordPipelineImageBarrier(VkCommandBuffer commandBuffer, VkAccessFlags sourceAccessMask, VkAccessFlags destAccessMask, VkImageLayout sourceLayout, VkImageLayout destLayout, VkImage image)
Definition: testvulkan.c:878
static void getSurfaceCaps(void)
Definition: testvulkan.c:586
static void createCommandBuffers(void)
Definition: testvulkan.c:805
static void createSurface(void)
Definition: testvulkan.c:310
static VulkanContext vulkanContext
Definition: testvulkan.c:205
static void loadGlobalFunctions(void)
Definition: testvulkan.c:217
static void destroyFences(void)
Definition: testvulkan.c:864
static void createFences(void)
Definition: testvulkan.c:829
static void createDevice(void)
Definition: testvulkan.c:496
static SDLTest_CommonState * state
Definition: testvulkan.c:204
static void findPhysicalDevice(void)
Definition: testvulkan.c:323
static PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr
Definition: testvulkan.c:94
static void rerecordCommandBuffer(uint32_t frameIndex, const VkClearColorValue *clearColor)
Definition: testvulkan.c:911
static void destroyCommandPool(void)
Definition: testvulkan.c:777
static void loadDeviceFunctions(void)
Definition: testvulkan.c:528
static void createInstance(void)
Definition: testvulkan.c:244
static void createCommandPool(void)
Definition: testvulkan.c:784
static void getQueues(void)
Definition: testvulkan.c:548
static void createSemaphore(VkSemaphore *semaphore)
Definition: testvulkan.c:563
static SDL_bool createSwapchain(void)
Definition: testvulkan.c:686
static SDL_bool createNewSwapchainAndSwapchainSpecificStuff(void)
Definition: testvulkan.c:974
static void getSwapchainImages(void)
Definition: testvulkan.c:648
General event structure.
Definition: SDL_events.h:592
#define VK_API_VERSION_1_0
Definition: vulkan_core.h:43
VKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain)
VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator)
VkFlags VkPipelineStageFlags
Definition: vulkan_core.h:1697
VKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue)
VKAPI_ATTR VkResult VKAPI_CALL vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence)
VkImageLayout
Definition: vulkan_core.h:737
@ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
Definition: vulkan_core.h:753
@ VK_IMAGE_LAYOUT_UNDEFINED
Definition: vulkan_core.h:738
@ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
Definition: vulkan_core.h:745
#define VK_VERSION_MAJOR(version)
Definition: vulkan_core.h:51
VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences)
@ VK_COMMAND_BUFFER_LEVEL_PRIMARY
Definition: vulkan_core.h:1454
VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures)
VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore)
@ VK_SHARING_MODE_EXCLUSIVE
Definition: vulkan_core.h:1160
#define VK_TRUE
Definition: vulkan_core.h:94
VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator)
VkFlags VkAccessFlags
Definition: vulkan_core.h:1508
VKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo)
VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers)
VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex)
VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags)
VKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator)
VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance)
VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device)
@ VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT
Definition: vulkan_core.h:1968
VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties)
@ VK_IMAGE_ASPECT_COLOR_BIT
Definition: vulkan_core.h:1511
@ VK_IMAGE_USAGE_TRANSFER_DST_BIT
Definition: vulkan_core.h:1612
@ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
Definition: vulkan_core.h:1615
VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue *pColor, uint32_t rangeCount, const VkImageSubresourceRange *pRanges)
@ VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR
Definition: vulkan_core.h:5702
VKAPI_ATTR void VKAPI_CALL vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator)
VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties)
#define VK_FALSE
Definition: vulkan_core.h:88
VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, VkSurfaceKHR surface, VkBool32 *pSupported)
VKAPI_ATTR VkResult VKAPI_CALL vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout)
VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities)
VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool)
VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence)
VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices)
@ VK_QUEUE_GRAPHICS_BIT
Definition: vulkan_core.h:1649
VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers)
VkResult
Definition: vulkan_core.h:103
@ VK_ERROR_VALIDATION_FAILED_EXT
Definition: vulkan_core.h:132
@ VK_ERROR_INVALID_SHADER_NV
Definition: vulkan_core.h:133
@ VK_SUBOPTIMAL_KHR
Definition: vulkan_core.h:129
@ VK_ERROR_EXTENSION_NOT_PRESENT
Definition: vulkan_core.h:116
@ VK_INCOMPLETE
Definition: vulkan_core.h:109
@ VK_ERROR_DEVICE_LOST
Definition: vulkan_core.h:113
@ VK_SUCCESS
Definition: vulkan_core.h:104
@ VK_EVENT_SET
Definition: vulkan_core.h:107
@ VK_EVENT_RESET
Definition: vulkan_core.h:108
@ VK_ERROR_OUT_OF_POOL_MEMORY_KHR
Definition: vulkan_core.h:143
@ VK_ERROR_OUT_OF_HOST_MEMORY
Definition: vulkan_core.h:110
@ VK_ERROR_INITIALIZATION_FAILED
Definition: vulkan_core.h:112
@ VK_ERROR_INCOMPATIBLE_DISPLAY_KHR
Definition: vulkan_core.h:131
@ VK_ERROR_OUT_OF_DEVICE_MEMORY
Definition: vulkan_core.h:111
@ VK_ERROR_NATIVE_WINDOW_IN_USE_KHR
Definition: vulkan_core.h:128
@ VK_ERROR_OUT_OF_DATE_KHR
Definition: vulkan_core.h:130
@ VK_TIMEOUT
Definition: vulkan_core.h:106
@ VK_ERROR_FORMAT_NOT_SUPPORTED
Definition: vulkan_core.h:120
@ VK_ERROR_FRAGMENTED_POOL
Definition: vulkan_core.h:121
@ VK_ERROR_SURFACE_LOST_KHR
Definition: vulkan_core.h:127
@ VK_NOT_READY
Definition: vulkan_core.h:105
@ VK_ERROR_FEATURE_NOT_PRESENT
Definition: vulkan_core.h:117
@ VK_ERROR_TOO_MANY_OBJECTS
Definition: vulkan_core.h:119
@ VK_ERROR_MEMORY_MAP_FAILED
Definition: vulkan_core.h:114
@ VK_ERROR_LAYER_NOT_PRESENT
Definition: vulkan_core.h:115
@ VK_ERROR_INCOMPATIBLE_DRIVER
Definition: vulkan_core.h:118
@ VK_ACCESS_TRANSFER_WRITE_BIT
Definition: vulkan_core.h:1487
@ VK_ACCESS_MEMORY_READ_BIT
Definition: vulkan_core.h:1490
VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t *pSurfaceFormatCount, VkSurfaceFormatKHR *pSurfaceFormats)
@ VK_PRESENT_MODE_FIFO_KHR
Definition: vulkan_core.h:5659
#define VK_NULL_HANDLE
Definition: vulkan_core.h:55
VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties *pQueueFamilyProperties)
@ VK_FORMAT_R8G8B8A8_UNORM
Definition: vulkan_core.h:880
@ VK_FORMAT_UNDEFINED
Definition: vulkan_core.h:843
@ VK_COLORSPACE_SRGB_NONLINEAR_KHR
Definition: vulkan_core.h:5683
VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator)
@ VK_COMMAND_POOL_CREATE_TRANSIENT_BIT
Definition: vulkan_core.h:1952
@ VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
Definition: vulkan_core.h:1953
VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer)
uint32_t VkBool32
Definition: vulkan_core.h:57
#define VK_KHR_SWAPCHAIN_EXTENSION_NAME
Definition: vulkan_core.h:5768
@ VK_PIPELINE_STAGE_TRANSFER_BIT
Definition: vulkan_core.h:1678
PFN_vkVoidFunction(VKAPI_PTR * PFN_vkGetInstanceProcAddr)(VkInstance instance, const char *pName)
Definition: vulkan_core.h:3117
VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages)
@ VK_FENCE_CREATE_SIGNALED_BIT
Definition: vulkan_core.h:1715
VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers)
VKAPI_ATTR void VKAPI_CALL vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator)
#define VK_QUEUE_FAMILY_IGNORED
Definition: vulkan_core.h:90
VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice)
VKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator)
@ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO
Definition: vulkan_core.h:162
@ VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO
Definition: vulkan_core.h:155
@ VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO
Definition: vulkan_core.h:193
@ VK_STRUCTURE_TYPE_APPLICATION_INFO
Definition: vulkan_core.h:153
@ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO
Definition: vulkan_core.h:195
@ VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO
Definition: vulkan_core.h:154
@ VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR
Definition: vulkan_core.h:317
@ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO
Definition: vulkan_core.h:161
@ VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO
Definition: vulkan_core.h:156
@ VK_STRUCTURE_TYPE_SUBMIT_INFO
Definition: vulkan_core.h:157
@ VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO
Definition: vulkan_core.h:192
@ VK_STRUCTURE_TYPE_PRESENT_INFO_KHR
Definition: vulkan_core.h:318
@ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER
Definition: vulkan_core.h:198
VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo)