19 #if defined(__ANDROID__) && defined(__ARM_EABI__) && !defined(__ARM_ARCH_7A__)
21 int main(
int argc,
char *argv[])
29 #define VK_NO_PROTOTYPES
34 #include "../src/video/khronos/vulkan/vulkan.h"
39 #define UINT64_MAX 18446744073709551615
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)
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
99 #if VK_HEADER_VERSION < 22
105 #if VK_HEADER_VERSION < 38
118 return "VK_NOT_READY";
122 return "VK_EVENT_SET";
124 return "VK_EVENT_RESET";
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";
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";
172 return "VK_ERROR_<Unknown>";
173 return "VK_<Unknown>";
221 if(!vkGetInstanceProcAddr)
224 "SDL_Vulkan_GetVkGetInstanceProcAddr(): %s\n",
229 #define VULKAN_DEVICE_FUNCTION(name)
230 #define VULKAN_GLOBAL_FUNCTION(name) \
231 name = (PFN_##name)vkGetInstanceProcAddr(VK_NULL_HANDLE, #name); \
234 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \
235 "vkGetInstanceProcAddr(VK_NULL_HANDLE, \"" #name "\") failed\n"); \
238 #define VULKAN_INSTANCE_FUNCTION(name)
240 #undef VULKAN_DEVICE_FUNCTION
241 #undef VULKAN_GLOBAL_FUNCTION
242 #undef VULKAN_INSTANCE_FUNCTION
249 const char **extensions =
NULL;
250 unsigned extensionCount = 0;
261 "SDL_Vulkan_GetInstanceExtensions(): %s\n",
265 extensions =
SDL_malloc(
sizeof(
const char *) * extensionCount);
275 "SDL_Vulkan_GetInstanceExtensions(): %s\n",
287 "vkCreateInstance(): %s\n",
295 #define VULKAN_DEVICE_FUNCTION(name)
296 #define VULKAN_GLOBAL_FUNCTION(name)
297 #define VULKAN_INSTANCE_FUNCTION(name) \
298 name = (PFN_##name)vkGetInstanceProcAddr(vulkanContext.instance, #name); \
301 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \
302 "vkGetInstanceProcAddr(instance, \"" #name "\") failed\n"); \
306 #undef VULKAN_DEVICE_FUNCTION
307 #undef VULKAN_GLOBAL_FUNCTION
308 #undef VULKAN_INSTANCE_FUNCTION
327 VkPhysicalDevice *physicalDevices;
329 uint32_t queueFamiliesPropertiesAllocatedSize = 0;
331 uint32_t deviceExtensionsAllocatedSize = 0;
339 "vkEnumeratePhysicalDevices(): %s\n",
343 if(physicalDeviceCount == 0)
346 "vkEnumeratePhysicalDevices(): no physical devices\n");
349 physicalDevices =
SDL_malloc(
sizeof(VkPhysicalDevice) * physicalDeviceCount);
361 "vkEnumeratePhysicalDevices(): %s\n",
366 for(physicalDeviceIndex = 0; physicalDeviceIndex < physicalDeviceCount;
367 physicalDeviceIndex++)
376 VkPhysicalDevice physicalDevice = physicalDevices[physicalDeviceIndex];
382 if(queueFamiliesCount == 0)
384 if(queueFamiliesPropertiesAllocatedSize < queueFamiliesCount)
387 queueFamiliesPropertiesAllocatedSize = queueFamiliesCount;
388 queueFamiliesProperties =
390 if(!queueFamiliesProperties)
399 physicalDevice, &queueFamiliesCount, queueFamiliesProperties);
402 for(queueFamilyIndex = 0; queueFamilyIndex < queueFamiliesCount;
407 if(queueFamiliesProperties[queueFamilyIndex].queueCount == 0)
412 physicalDevice, queueFamilyIndex, vulkanContext.
surface, &supported);
419 "vkGetPhysicalDeviceSurfaceSupportKHR(): %s\n",
426 if(queueFamiliesProperties[queueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT)
442 "vkEnumerateDeviceExtensionProperties(): %s\n",
446 if(deviceExtensionCount == 0)
448 if(deviceExtensionsAllocatedSize < deviceExtensionCount)
451 deviceExtensionsAllocatedSize = deviceExtensionCount;
454 if(!deviceExtensions)
463 physicalDevice,
NULL, &deviceExtensionCount, deviceExtensions);
470 "vkEnumerateDeviceExtensionProperties(): %s\n",
474 for(i = 0; i < deviceExtensionCount; i++)
482 if(!hasSwapchainExtension)
500 static const float queuePriority[] = {1.0f};
502 static const char *
const deviceExtensionNames[] = {
531 #define VULKAN_DEVICE_FUNCTION(name) \
532 name = (PFN_##name)vkGetDeviceProcAddr(vulkanContext.device, #name); \
535 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \
536 "vkGetDeviceProcAddr(device, \"" #name "\") failed\n"); \
539 #define VULKAN_GLOBAL_FUNCTION(name)
540 #define VULKAN_INSTANCE_FUNCTION(name)
542 #undef VULKAN_DEVICE_FUNCTION
543 #undef VULKAN_GLOBAL_FUNCTION
544 #undef VULKAN_INSTANCE_FUNCTION
547 #undef VULKAN_FUNCTIONS
575 "vkCreateSemaphore(): %s\n",
594 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR(): %s\n",
603 "Vulkan surface doesn't support VK_IMAGE_USAGE_TRANSFER_DST_BIT\n");
618 "vkGetPhysicalDeviceSurfaceFormatsKHR(): %s\n",
643 "vkGetPhysicalDeviceSurfaceFormatsKHR(): %s\n",
661 "vkGetSwapchainImagesKHR(): %s\n",
681 "vkGetSwapchainImagesKHR(): %s\n",
750 "vkCreateSwapchainKHR(): %s\n",
800 "vkCreateCommandPool(): %s\n",
824 "vkAllocateCommandBuffers(): %s\n",
858 "vkCreateFence(): %s\n",
914 VkCommandBuffer commandBuffer = vulkanContext.
commandBuffers[frameIndex];
923 "vkResetCommandBuffer(): %s\n",
933 "vkBeginCommandBuffer(): %s\n",
960 "vkEndCommandBuffer(): %s\n",
971 if(doDestroySwapchain)
1052 "vkAcquireNextImageKHR(): %s\n",
1072 clearColor.
float32[0] = (float)(0.5 + 0.5 *
SDL_sin(currentTime));
1073 clearColor.
float32[1] = (float)(0.5 + 0.5 *
SDL_sin(currentTime + M_PI * 2 / 3));
1074 clearColor.
float32[2] = (float)(0.5 + 0.5 *
SDL_sin(currentTime + M_PI * 4 / 3));
1107 "vkQueuePresentKHR(): %s\n",
1125 Uint32 then, now, frames;
1141 for(i = 1; i < argc;)
1167 SDL_Log(
"Window Size : %d,%d\n", dw, dh);
1169 SDL_Log(
"Draw Size : %d,%d\n", dw, dh);
1195 SDL_Log(
"%2.2f frames per second\n", ((
double)frames * 1000) / (now - then));