SDL  2.0
testvulkan.c File Reference
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "SDL_test_common.h"
#include "../src/video/khronos/vulkan/vulkan.h"
#include "SDL_vulkan.h"
+ Include dependency graph for testvulkan.c:

Go to the source code of this file.

Data Structures

struct  VulkanContext
 

Macros

#define VK_NO_PROTOTYPES
 
#define UINT64_MAX   18446744073709551615
 
#define VULKAN_FUNCTIONS()
 
#define VULKAN_DEVICE_FUNCTION(name)   static PFN_##name name = NULL;
 
#define VULKAN_GLOBAL_FUNCTION(name)   static PFN_##name name = NULL;
 
#define VULKAN_INSTANCE_FUNCTION(name)   static PFN_##name name = NULL;
 
#define VULKAN_DEVICE_FUNCTION(name)
 
#define VULKAN_GLOBAL_FUNCTION(name)
 
#define VULKAN_INSTANCE_FUNCTION(name)
 
#define VULKAN_DEVICE_FUNCTION(name)
 
#define VULKAN_GLOBAL_FUNCTION(name)
 
#define VULKAN_INSTANCE_FUNCTION(name)
 
#define VULKAN_DEVICE_FUNCTION(name)
 
#define VULKAN_GLOBAL_FUNCTION(name)
 
#define VULKAN_INSTANCE_FUNCTION(name)
 

Functions

static const char * getVulkanResultString (VkResult result)
 
static void shutdownVulkan (void)
 
static void quit (int rc)
 
static void loadGlobalFunctions (void)
 
static void createInstance (void)
 
static void loadInstanceFunctions (void)
 
static void createSurface (void)
 
static void findPhysicalDevice (void)
 
static void createDevice (void)
 
static void loadDeviceFunctions (void)
 
static void getQueues (void)
 
static void createSemaphore (VkSemaphore *semaphore)
 
static void createSemaphores (void)
 
static void getSurfaceCaps (void)
 
static void getSurfaceFormats (void)
 
static void getSwapchainImages (void)
 
static SDL_bool createSwapchain (void)
 
static void destroySwapchain (void)
 
static void destroyCommandBuffers (void)
 
static void destroyCommandPool (void)
 
static void createCommandPool (void)
 
static void createCommandBuffers (void)
 
static void createFences (void)
 
static void destroyFences (void)
 
static void recordPipelineImageBarrier (VkCommandBuffer commandBuffer, VkAccessFlags sourceAccessMask, VkAccessFlags destAccessMask, VkImageLayout sourceLayout, VkImageLayout destLayout, VkImage image)
 
static void rerecordCommandBuffer (uint32_t frameIndex, const VkClearColorValue *clearColor)
 
static void destroySwapchainAndSwapchainSpecificStuff (SDL_bool doDestroySwapchain)
 
static SDL_bool createNewSwapchainAndSwapchainSpecificStuff (void)
 
static void initVulkan (void)
 
static SDL_bool render (void)
 
int main (int argc, char *argv[])
 

Variables

static PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = NULL
 
static SDLTest_CommonStatestate
 
static VulkanContext vulkanContext = {0}
 

Macro Definition Documentation

◆ UINT64_MAX

#define UINT64_MAX   18446744073709551615

Definition at line 39 of file testvulkan.c.

◆ VK_NO_PROTOTYPES

#define VK_NO_PROTOTYPES

Definition at line 29 of file testvulkan.c.

◆ VULKAN_DEVICE_FUNCTION [1/4]

#define VULKAN_DEVICE_FUNCTION (   name)    static PFN_##name name = NULL;

Definition at line 87 of file testvulkan.c.

◆ VULKAN_DEVICE_FUNCTION [2/4]

#define VULKAN_DEVICE_FUNCTION (   name)

Definition at line 87 of file testvulkan.c.

◆ VULKAN_DEVICE_FUNCTION [3/4]

#define VULKAN_DEVICE_FUNCTION (   name)

Definition at line 87 of file testvulkan.c.

◆ VULKAN_DEVICE_FUNCTION [4/4]

#define VULKAN_DEVICE_FUNCTION (   name)
Value:
if(!name) \
{ \
"vkGetDeviceProcAddr(device, \"" #name "\") failed\n"); \
quit(2); \
}
@ SDL_LOG_CATEGORY_APPLICATION
Definition: SDL_log.h:66
GLuint const GLchar * name
VkDevice device
Definition: testvulkan.c:178
static VulkanContext vulkanContext
Definition: testvulkan.c:205
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *pName)

Definition at line 87 of file testvulkan.c.

◆ VULKAN_FUNCTIONS

#define VULKAN_FUNCTIONS ( )

Definition at line 42 of file testvulkan.c.

◆ VULKAN_GLOBAL_FUNCTION [1/4]

#define VULKAN_GLOBAL_FUNCTION (   name)    static PFN_##name name = NULL;

Definition at line 88 of file testvulkan.c.

◆ VULKAN_GLOBAL_FUNCTION [2/4]

#define VULKAN_GLOBAL_FUNCTION (   name)
Value:
if(!name) \
{ \
"vkGetInstanceProcAddr(VK_NULL_HANDLE, \"" #name "\") failed\n"); \
quit(2); \
}
static PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr
Definition: testvulkan.c:94
#define VK_NULL_HANDLE
Definition: vulkan_core.h:55

Definition at line 88 of file testvulkan.c.

◆ VULKAN_GLOBAL_FUNCTION [3/4]

#define VULKAN_GLOBAL_FUNCTION (   name)

Definition at line 88 of file testvulkan.c.

◆ VULKAN_GLOBAL_FUNCTION [4/4]

#define VULKAN_GLOBAL_FUNCTION (   name)

Definition at line 88 of file testvulkan.c.

◆ VULKAN_INSTANCE_FUNCTION [1/4]

#define VULKAN_INSTANCE_FUNCTION (   name)    static PFN_##name name = NULL;

Definition at line 89 of file testvulkan.c.

◆ VULKAN_INSTANCE_FUNCTION [2/4]

#define VULKAN_INSTANCE_FUNCTION (   name)

Definition at line 89 of file testvulkan.c.

◆ VULKAN_INSTANCE_FUNCTION [3/4]

#define VULKAN_INSTANCE_FUNCTION (   name)
Value:
if(!name) \
{ \
"vkGetInstanceProcAddr(instance, \"" #name "\") failed\n"); \
quit(2); \
}
VkInstance instance
Definition: testvulkan.c:177

Definition at line 89 of file testvulkan.c.

◆ VULKAN_INSTANCE_FUNCTION [4/4]

#define VULKAN_INSTANCE_FUNCTION (   name)

Definition at line 89 of file testvulkan.c.

Function Documentation

◆ createCommandBuffers()

static void createCommandBuffers ( void  )
static

Definition at line 805 of file testvulkan.c.

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 }
#define SDL_malloc
#define SDL_LogError
#define SDL_free
GLuint64EXT * result
#define NULL
Definition: begin_code.h:163
VkCommandBufferLevel level
Definition: vulkan_core.h:3003
VkCommandBuffer * commandBuffers
Definition: testvulkan.c:200
VkCommandPool commandPool
Definition: testvulkan.c:197
uint32_t swapchainImageCount
Definition: testvulkan.c:198
static const char * getVulkanResultString(VkResult result)
Definition: testvulkan.c:111
static void quit(int rc)
Definition: testvulkan.c:210
@ VK_COMMAND_BUFFER_LEVEL_PRIMARY
Definition: vulkan_core.h:1454
VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers)
VkResult
Definition: vulkan_core.h:103
@ VK_SUCCESS
Definition: vulkan_core.h:104
@ VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO
Definition: vulkan_core.h:193

References VkCommandBufferAllocateInfo::commandBufferCount, VulkanContext::commandBuffers, VkCommandBufferAllocateInfo::commandPool, VulkanContext::commandPool, VulkanContext::device, getVulkanResultString(), VkCommandBufferAllocateInfo::level, NULL, quit(), SDL_free, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_malloc, VkCommandBufferAllocateInfo::sType, VulkanContext::swapchainImageCount, VK_COMMAND_BUFFER_LEVEL_PRIMARY, VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, VK_SUCCESS, vkAllocateCommandBuffers(), and vulkanContext.

Referenced by createNewSwapchainAndSwapchainSpecificStuff().

◆ createCommandPool()

static void createCommandPool ( void  )
static

Definition at line 784 of file testvulkan.c.

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 }
VkStructureType sType
Definition: vulkan_core.h:2993
VkCommandPoolCreateFlags flags
Definition: vulkan_core.h:2995
uint32_t graphicsQueueFamilyIndex
Definition: testvulkan.c:183
VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool)
@ VK_COMMAND_POOL_CREATE_TRANSIENT_BIT
Definition: vulkan_core.h:1952
@ VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
Definition: vulkan_core.h:1953
@ VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO
Definition: vulkan_core.h:192

References VulkanContext::commandPool, VulkanContext::device, VkCommandPoolCreateInfo::flags, getVulkanResultString(), VulkanContext::graphicsQueueFamilyIndex, NULL, VkCommandPoolCreateInfo::queueFamilyIndex, quit(), SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, VkCommandPoolCreateInfo::sType, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, VK_COMMAND_POOL_CREATE_TRANSIENT_BIT, VK_NULL_HANDLE, VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, VK_SUCCESS, vkCreateCommandPool(), and vulkanContext.

Referenced by createNewSwapchainAndSwapchainSpecificStuff().

◆ createDevice()

static void createDevice ( void  )
static

Definition at line 496 of file testvulkan.c.

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 }
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:121
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
VkPhysicalDevice physicalDevice
Definition: testvulkan.c:185
#define VK_KHR_SWAPCHAIN_EXTENSION_NAME
Definition: vulkan_core.h:5768
VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice)
@ VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO
Definition: vulkan_core.h:155
@ VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO
Definition: vulkan_core.h:156

References VulkanContext::device, VkDeviceCreateInfo::enabledExtensionCount, getVulkanResultString(), VulkanContext::graphicsQueueFamilyIndex, NULL, VkDeviceCreateInfo::pEnabledFeatures, VulkanContext::physicalDevice, VkDeviceCreateInfo::ppEnabledExtensionNames, VkDeviceCreateInfo::pQueueCreateInfos, VkDeviceQueueCreateInfo::pQueuePriorities, VkDeviceQueueCreateInfo::queueCount, VkDeviceCreateInfo::queueCreateInfoCount, VkDeviceQueueCreateInfo::queueFamilyIndex, quit(), SDL_arraysize, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, VkDeviceQueueCreateInfo::sType, VkDeviceCreateInfo::sType, VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_NULL_HANDLE, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, VK_SUCCESS, vkCreateDevice(), and vulkanContext.

Referenced by initVulkan().

◆ createFences()

static void createFences ( void  )
static

Definition at line 829 of file testvulkan.c.

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 }
unsigned int uint32_t
#define SDL_OutOfMemory()
Definition: SDL_error.h:88
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
VkFenceCreateFlags flags
Definition: vulkan_core.h:2516
VkStructureType sType
Definition: vulkan_core.h:2514
VkFence * fences
Definition: testvulkan.c:201
VKAPI_ATTR VkResult VKAPI_CALL vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence)
VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator)
@ VK_FENCE_CREATE_SIGNALED_BIT
Definition: vulkan_core.h:1715
@ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO
Definition: vulkan_core.h:161

References VulkanContext::device, VulkanContext::fences, VkFenceCreateInfo::flags, getVulkanResultString(), i, NULL, quit(), SDL_free, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_malloc, SDL_OutOfMemory, VkFenceCreateInfo::sType, VulkanContext::swapchainImageCount, VK_FENCE_CREATE_SIGNALED_BIT, VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, VK_SUCCESS, vkCreateFence(), vkDestroyFence(), and vulkanContext.

Referenced by createNewSwapchainAndSwapchainSpecificStuff().

◆ createInstance()

static void createInstance ( void  )
static

Definition at line 244 of file testvulkan.c.

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 }
#define SDL_GetError
#define SDL_Vulkan_GetInstanceExtensions
VkStructureType sType
Definition: vulkan_core.h:2131
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
#define VK_API_VERSION_1_0
Definition: vulkan_core.h:43
VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance)
@ VK_STRUCTURE_TYPE_APPLICATION_INFO
Definition: vulkan_core.h:153
@ VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO
Definition: vulkan_core.h:154

References VkApplicationInfo::apiVersion, VkInstanceCreateInfo::enabledExtensionCount, getVulkanResultString(), VulkanContext::instance, NULL, VkInstanceCreateInfo::pApplicationInfo, VkInstanceCreateInfo::ppEnabledExtensionNames, quit(), SDL_free, SDL_GetError, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_malloc, SDL_OutOfMemory, SDL_Vulkan_GetInstanceExtensions, VkApplicationInfo::sType, VkInstanceCreateInfo::sType, VK_API_VERSION_1_0, VK_NULL_HANDLE, VK_STRUCTURE_TYPE_APPLICATION_INFO, VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, VK_SUCCESS, vkCreateInstance(), and vulkanContext.

Referenced by initVulkan().

◆ createNewSwapchainAndSwapchainSpecificStuff()

static SDL_bool createNewSwapchainAndSwapchainSpecificStuff ( void  )
static

Definition at line 974 of file testvulkan.c.

975 {
977  getSurfaceCaps();
979  if(!createSwapchain())
980  return SDL_FALSE;
983  createFences();
984  return SDL_TRUE;
985 }
@ SDL_TRUE
Definition: SDL_stdinc.h:170
@ SDL_FALSE
Definition: SDL_stdinc.h:169
static void getSurfaceFormats(void)
Definition: testvulkan.c:607
static void destroySwapchainAndSwapchainSpecificStuff(SDL_bool doDestroySwapchain)
Definition: testvulkan.c:965
static void getSurfaceCaps(void)
Definition: testvulkan.c:586
static void createCommandBuffers(void)
Definition: testvulkan.c:805
static void createFences(void)
Definition: testvulkan.c:829
static void createCommandPool(void)
Definition: testvulkan.c:784
static SDL_bool createSwapchain(void)
Definition: testvulkan.c:686

References createCommandBuffers(), createCommandPool(), createFences(), createSwapchain(), destroySwapchainAndSwapchainSpecificStuff(), getSurfaceCaps(), getSurfaceFormats(), SDL_FALSE, and SDL_TRUE.

Referenced by initVulkan(), and render().

◆ createSemaphore()

static void createSemaphore ( VkSemaphore *  semaphore)
static

Definition at line 563 of file testvulkan.c.

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 }
VkStructureType sType
Definition: vulkan_core.h:2520
VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore)
@ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO
Definition: vulkan_core.h:162

References VulkanContext::device, getVulkanResultString(), NULL, quit(), SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, VkSemaphoreCreateInfo::sType, VK_NULL_HANDLE, VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, VK_SUCCESS, vkCreateSemaphore(), and vulkanContext.

Referenced by createSemaphores().

◆ createSemaphores()

static void createSemaphores ( void  )
static

Definition at line 580 of file testvulkan.c.

581 {
584 }
VkSemaphore renderingFinishedSemaphore
Definition: testvulkan.c:189
VkSemaphore imageAvailableSemaphore
Definition: testvulkan.c:188
static void createSemaphore(VkSemaphore *semaphore)
Definition: testvulkan.c:563

References createSemaphore(), VulkanContext::imageAvailableSemaphore, VulkanContext::renderingFinishedSemaphore, and vulkanContext.

Referenced by initVulkan().

◆ createSurface()

static void createSurface ( void  )
static

Definition at line 310 of file testvulkan.c.

311 {
315  {
317  SDL_LogError(
318  SDL_LOG_CATEGORY_APPLICATION, "SDL_Vulkan_CreateSurface(): %s\n", SDL_GetError());
319  quit(2);
320  }
321 }
#define SDL_Vulkan_CreateSurface
SDL_Window ** windows
VkSurfaceKHR surface
Definition: testvulkan.c:179
static SDLTest_CommonState * state
Definition: testvulkan.c:204

References VulkanContext::instance, quit(), SDL_GetError, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_Vulkan_CreateSurface, state, VulkanContext::surface, VK_NULL_HANDLE, vulkanContext, and SDLTest_CommonState::windows.

Referenced by initVulkan().

◆ createSwapchain()

static SDL_bool createSwapchain ( void  )
static

Definition at line 686 of file testvulkan.c.

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 }
#define SDL_Vulkan_GetDrawableSize
GLfloat GLfloat GLfloat GLfloat h
GLubyte GLubyte GLubyte GLubyte w
uint32_t width
Definition: vulkan_core.h:1994
uint32_t height
Definition: vulkan_core.h:1995
VkSurfaceTransformFlagBitsKHR currentTransform
Definition: vulkan_core.h:5718
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
VkSwapchainKHR swapchain
Definition: testvulkan.c:180
VkSurfaceCapabilitiesKHR surfaceCapabilities
Definition: testvulkan.c:190
VkSurfaceFormatKHR surfaceFormat
Definition: testvulkan.c:195
VkExtent2D swapchainSize
Definition: testvulkan.c:196
uint32_t surfaceFormatsCount
Definition: testvulkan.c:193
uint32_t swapchainDesiredImageCount
Definition: testvulkan.c:194
VkSurfaceFormatKHR * surfaceFormats
Definition: testvulkan.c:191
static void getSwapchainImages(void)
Definition: testvulkan.c:648
VKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain)
@ VK_SHARING_MODE_EXCLUSIVE
Definition: vulkan_core.h:1160
#define VK_TRUE
Definition: vulkan_core.h:94
VKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator)
@ VK_IMAGE_USAGE_TRANSFER_DST_BIT
Definition: vulkan_core.h:1612
@ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
Definition: vulkan_core.h:1615
@ VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR
Definition: vulkan_core.h:5702
@ VK_PRESENT_MODE_FIFO_KHR
Definition: vulkan_core.h:5659
@ 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
@ VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR
Definition: vulkan_core.h:317

References VkSwapchainCreateInfoKHR::clipped, VkSurfaceFormatKHR::colorSpace, VkSwapchainCreateInfoKHR::compositeAlpha, VkSurfaceCapabilitiesKHR::currentTransform, VulkanContext::device, VkSurfaceFormatKHR::format, getSwapchainImages(), getVulkanResultString(), VkExtent2D::height, i, VkSwapchainCreateInfoKHR::imageArrayLayers, VkSwapchainCreateInfoKHR::imageColorSpace, VkSwapchainCreateInfoKHR::imageExtent, VkSwapchainCreateInfoKHR::imageFormat, VkSwapchainCreateInfoKHR::imageSharingMode, VkSwapchainCreateInfoKHR::imageUsage, VkSurfaceCapabilitiesKHR::maxImageCount, VkSurfaceCapabilitiesKHR::minImageCount, VkSwapchainCreateInfoKHR::minImageCount, NULL, VkSwapchainCreateInfoKHR::oldSwapchain, VkSwapchainCreateInfoKHR::presentMode, VkSwapchainCreateInfoKHR::preTransform, quit(), SDL_FALSE, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_TRUE, SDL_Vulkan_GetDrawableSize, state, VkSwapchainCreateInfoKHR::sType, VkSwapchainCreateInfoKHR::surface, VulkanContext::surface, VulkanContext::surfaceCapabilities, VulkanContext::surfaceFormat, VulkanContext::surfaceFormats, VulkanContext::surfaceFormatsCount, VulkanContext::swapchain, VulkanContext::swapchainDesiredImageCount, VulkanContext::swapchainSize, VK_COLORSPACE_SRGB_NONLINEAR_KHR, VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_UNDEFINED, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_NULL_HANDLE, VK_PRESENT_MODE_FIFO_KHR, VK_SHARING_MODE_EXCLUSIVE, VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, VK_SUCCESS, VK_TRUE, vkCreateSwapchainKHR(), vkDestroySwapchainKHR(), vulkanContext, VkExtent2D::width, and SDLTest_CommonState::windows.

Referenced by createNewSwapchainAndSwapchainSpecificStuff().

◆ destroyCommandBuffers()

static void destroyCommandBuffers ( void  )
static

Definition at line 766 of file testvulkan.c.

767 {
775 }
VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers)

References VulkanContext::commandBuffers, VulkanContext::commandPool, VulkanContext::device, NULL, SDL_free, VulkanContext::swapchainImageCount, vkFreeCommandBuffers(), and vulkanContext.

Referenced by destroySwapchainAndSwapchainSpecificStuff().

◆ destroyCommandPool()

static void destroyCommandPool ( void  )
static

Definition at line 777 of file testvulkan.c.

778 {
782 }
VKAPI_ATTR void VKAPI_CALL vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator)

References VulkanContext::commandPool, VulkanContext::device, NULL, VK_NULL_HANDLE, vkDestroyCommandPool(), and vulkanContext.

Referenced by destroySwapchainAndSwapchainSpecificStuff().

◆ destroyFences()

static void destroyFences ( void  )
static

◆ destroySwapchain()

◆ destroySwapchainAndSwapchainSpecificStuff()

static void destroySwapchainAndSwapchainSpecificStuff ( SDL_bool  doDestroySwapchain)
static

Definition at line 965 of file testvulkan.c.

966 {
967  destroyFences();
970  if(doDestroySwapchain)
972 }
static void destroyCommandBuffers(void)
Definition: testvulkan.c:766
static void destroySwapchain(void)
Definition: testvulkan.c:757
static void destroyFences(void)
Definition: testvulkan.c:864
static void destroyCommandPool(void)
Definition: testvulkan.c:777

References destroyCommandBuffers(), destroyCommandPool(), destroyFences(), and destroySwapchain().

Referenced by createNewSwapchainAndSwapchainSpecificStuff(), and shutdownVulkan().

◆ findPhysicalDevice()

static void findPhysicalDevice ( void  )
static

Definition at line 323 of file testvulkan.c.

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 }
#define SDL_strcmp
SDL_bool
Definition: SDL_stdinc.h:168
VkPhysicalDeviceProperties physicalDeviceProperties
Definition: testvulkan.c:181
uint32_t presentQueueFamilyIndex
Definition: testvulkan.c:184
VkPhysicalDeviceFeatures physicalDeviceFeatures
Definition: testvulkan.c:182
#define VK_VERSION_MAJOR(version)
Definition: vulkan_core.h:51
VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures)
VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties)
VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties)
VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, VkSurfaceKHR surface, VkBool32 *pSupported)
VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices)
@ VK_QUEUE_GRAPHICS_BIT
Definition: vulkan_core.h:1649
VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties *pQueueFamilyProperties)
uint32_t VkBool32
Definition: vulkan_core.h:57

References VkPhysicalDeviceProperties::apiVersion, getVulkanResultString(), VulkanContext::graphicsQueueFamilyIndex, i, VulkanContext::instance, NULL, VulkanContext::physicalDevice, VulkanContext::physicalDeviceFeatures, VulkanContext::physicalDeviceProperties, VulkanContext::presentQueueFamilyIndex, quit(), SDL_FALSE, SDL_free, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_malloc, SDL_OutOfMemory, SDL_strcmp, SDL_TRUE, VulkanContext::surface, VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_QUEUE_GRAPHICS_BIT, VK_SUCCESS, VK_VERSION_MAJOR, vkEnumerateDeviceExtensionProperties(), vkEnumeratePhysicalDevices(), vkGetPhysicalDeviceFeatures(), vkGetPhysicalDeviceProperties(), vkGetPhysicalDeviceQueueFamilyProperties(), vkGetPhysicalDeviceSurfaceSupportKHR(), and vulkanContext.

Referenced by initVulkan().

◆ getQueues()

static void getQueues ( void  )
static

◆ getSurfaceCaps()

static void getSurfaceCaps ( void  )
static

Definition at line 586 of file testvulkan.c.

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 }
VkImageUsageFlags supportedUsageFlags
Definition: vulkan_core.h:5720
VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities)

References getVulkanResultString(), VulkanContext::physicalDevice, quit(), SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, VkSurfaceCapabilitiesKHR::supportedUsageFlags, VulkanContext::surface, VulkanContext::surfaceCapabilities, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_SUCCESS, vkGetPhysicalDeviceSurfaceCapabilitiesKHR(), and vulkanContext.

Referenced by createNewSwapchainAndSwapchainSpecificStuff().

◆ getSurfaceFormats()

static void getSurfaceFormats ( void  )
static

Definition at line 607 of file testvulkan.c.

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 }
uint32_t surfaceFormatsAllocatedCount
Definition: testvulkan.c:192
VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t *pSurfaceFormatCount, VkSurfaceFormatKHR *pSurfaceFormats)

References getVulkanResultString(), NULL, VulkanContext::physicalDevice, quit(), SDL_free, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_malloc, SDL_OutOfMemory, VulkanContext::surface, VulkanContext::surfaceFormats, VulkanContext::surfaceFormatsAllocatedCount, VulkanContext::surfaceFormatsCount, VK_SUCCESS, vkGetPhysicalDeviceSurfaceFormatsKHR(), and vulkanContext.

Referenced by createNewSwapchainAndSwapchainSpecificStuff().

◆ getSwapchainImages()

static void getSwapchainImages ( void  )
static

Definition at line 648 of file testvulkan.c.

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 }
VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount, VkImage *pSwapchainImages)

References VulkanContext::device, getVulkanResultString(), NULL, quit(), SDL_free, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_malloc, SDL_OutOfMemory, VulkanContext::swapchain, VulkanContext::swapchainImageCount, VulkanContext::swapchainImages, VK_SUCCESS, vkGetSwapchainImagesKHR(), and vulkanContext.

Referenced by createSwapchain().

◆ getVulkanResultString()

static const char* getVulkanResultString ( VkResult  result)
static

Definition at line 111 of file testvulkan.c.

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 }
@ 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_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

References VK_ERROR_DEVICE_LOST, VK_ERROR_EXTENSION_NOT_PRESENT, VK_ERROR_FEATURE_NOT_PRESENT, VK_ERROR_FORMAT_NOT_SUPPORTED, VK_ERROR_FRAGMENTED_POOL, VK_ERROR_INCOMPATIBLE_DISPLAY_KHR, VK_ERROR_INCOMPATIBLE_DRIVER, VK_ERROR_INITIALIZATION_FAILED, VK_ERROR_INVALID_SHADER_NV, VK_ERROR_LAYER_NOT_PRESENT, VK_ERROR_MEMORY_MAP_FAILED, VK_ERROR_NATIVE_WINDOW_IN_USE_KHR, VK_ERROR_OUT_OF_DATE_KHR, VK_ERROR_OUT_OF_DEVICE_MEMORY, VK_ERROR_OUT_OF_HOST_MEMORY, VK_ERROR_OUT_OF_POOL_MEMORY_KHR, VK_ERROR_SURFACE_LOST_KHR, VK_ERROR_TOO_MANY_OBJECTS, VK_ERROR_VALIDATION_FAILED_EXT, VK_EVENT_RESET, VK_EVENT_SET, VK_INCOMPLETE, VK_NOT_READY, VK_SUBOPTIMAL_KHR, VK_SUCCESS, and VK_TIMEOUT.

Referenced by createCommandBuffers(), createCommandPool(), createDevice(), createFences(), createInstance(), createSemaphore(), createSwapchain(), findPhysicalDevice(), getSurfaceCaps(), getSurfaceFormats(), getSwapchainImages(), render(), and rerecordCommandBuffer().

◆ initVulkan()

static void initVulkan ( void  )
static

Definition at line 987 of file testvulkan.c.

988 {
990  SDL_memset(&vulkanContext, 0, sizeof(VulkanContext));
992  createInstance();
994  createSurface();
996  createDevice();
998  getQueues();
1001 }
#define SDL_memset
#define SDL_Vulkan_LoadLibrary
static void createSemaphores(void)
Definition: testvulkan.c:580
static void loadInstanceFunctions(void)
Definition: testvulkan.c:292
static void createSurface(void)
Definition: testvulkan.c:310
static void loadGlobalFunctions(void)
Definition: testvulkan.c:217
static void createDevice(void)
Definition: testvulkan.c:496
static void findPhysicalDevice(void)
Definition: testvulkan.c:323
static void loadDeviceFunctions(void)
Definition: testvulkan.c:528
static void createInstance(void)
Definition: testvulkan.c:244
static void getQueues(void)
Definition: testvulkan.c:548
static SDL_bool createNewSwapchainAndSwapchainSpecificStuff(void)
Definition: testvulkan.c:974

References createDevice(), createInstance(), createNewSwapchainAndSwapchainSpecificStuff(), createSemaphores(), createSurface(), findPhysicalDevice(), getQueues(), loadDeviceFunctions(), loadGlobalFunctions(), loadInstanceFunctions(), NULL, SDL_memset, SDL_Vulkan_LoadLibrary, and vulkanContext.

Referenced by main().

◆ loadDeviceFunctions()

static void loadDeviceFunctions ( void  )
static

Definition at line 528 of file testvulkan.c.

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 }
#define VULKAN_FUNCTIONS()
Definition: testvulkan.c:42

References VULKAN_FUNCTIONS.

Referenced by initVulkan().

◆ loadGlobalFunctions()

static void loadGlobalFunctions ( void  )
static

Definition at line 217 of file testvulkan.c.

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 }
#define SDL_Vulkan_GetVkGetInstanceProcAddr

References quit(), SDL_GetError, SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_Vulkan_GetVkGetInstanceProcAddr, vkGetInstanceProcAddr, and VULKAN_FUNCTIONS.

Referenced by initVulkan().

◆ loadInstanceFunctions()

static void loadInstanceFunctions ( void  )
static

Definition at line 292 of file testvulkan.c.

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 }

References VULKAN_FUNCTIONS.

Referenced by initVulkan().

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 1118 of file testvulkan.c.

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 }
#define SDL_INIT_VIDEO
Definition: SDL.h:82
#define SDL_GetWindowSize
#define SDL_PollEvent
#define SDL_LogSetPriority
#define SDL_GetCurrentDisplayMode
#define SDL_Log
@ SDL_LOG_PRIORITY_INFO
Definition: SDL_log.h:106
struct _cl_event * event
GLenum mode
#define SDL_BITSPERPIXEL(X)
Definition: SDL_pixels.h:127
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.
@ SDL_WINDOW_VULKAN
Definition: SDL_video.h:121
int done
Definition: checkkeys.c:28
The structure that defines a display mode.
Definition: SDL_video.h:54
static Uint32 frames
Definition: testsprite2.c:40
static SDL_bool render(void)
Definition: testvulkan.c:1022
static void initVulkan(void)
Definition: testvulkan.c:987
General event structure.
Definition: SDL_events.h:592

References done, frames, initVulkan(), SDLTest_CommonState::num_windows, quit(), render(), SDL_BITSPERPIXEL, SDL_GetCurrentDisplayMode, SDL_GetTicks(), SDL_GetWindowSize, SDL_INIT_VIDEO, SDL_Log, SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, SDL_LogSetPriority, SDL_PollEvent, SDL_Vulkan_GetDrawableSize, SDL_WINDOW_VULKAN, SDLTest_CommonCreateState(), SDLTest_CommonDefaultArgs(), SDLTest_CommonEvent(), SDLTest_CommonInit(), SDLTest_CommonQuit(), SDLTest_CommonState::skip_renderer, state, SDLTest_CommonState::window_flags, and SDLTest_CommonState::windows.

◆ quit()

◆ recordPipelineImageBarrier()

static void recordPipelineImageBarrier ( VkCommandBuffer  commandBuffer,
VkAccessFlags  sourceAccessMask,
VkAccessFlags  destAccessMask,
VkImageLayout  sourceLayout,
VkImageLayout  destLayout,
VkImage  image 
)
static

Definition at line 878 of file testvulkan.c.

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 }
GLeglImageOES image
Definition: SDL_opengl.h:2148
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
@ VK_IMAGE_ASPECT_COLOR_BIT
Definition: vulkan_core.h:1511
@ VK_PIPELINE_STAGE_TRANSFER_BIT
Definition: vulkan_core.h:1678
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)
#define VK_QUEUE_FAMILY_IGNORED
Definition: vulkan_core.h:90
@ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER
Definition: vulkan_core.h:198

References VkImageSubresourceRange::aspectMask, VkImageSubresourceRange::baseArrayLayer, VkImageSubresourceRange::baseMipLevel, VkImageMemoryBarrier::dstAccessMask, VkImageMemoryBarrier::dstQueueFamilyIndex, VkImageMemoryBarrier::image, VkImageSubresourceRange::layerCount, VkImageSubresourceRange::levelCount, VkImageMemoryBarrier::newLayout, NULL, VkImageMemoryBarrier::oldLayout, VkImageMemoryBarrier::srcAccessMask, VkImageMemoryBarrier::srcQueueFamilyIndex, VkImageMemoryBarrier::sType, VkImageMemoryBarrier::subresourceRange, VK_IMAGE_ASPECT_COLOR_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_QUEUE_FAMILY_IGNORED, VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, and vkCmdPipelineBarrier().

Referenced by rerecordCommandBuffer().

◆ render()

static SDL_bool render ( void  )
static

Definition at line 1022 of file testvulkan.c.

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 }
#define SDL_sin
#define SDL_GetPerformanceCounter
#define SDL_Delay
Uint64 SDL_GetPerformanceFrequency(void)
Get the count per second of the high resolution counter.
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
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
SDL_bool retval
#define UINT64_MAX
Definition: testvulkan.c:39
static void rerecordCommandBuffer(uint32_t frameIndex, const VkClearColorValue *clearColor)
Definition: testvulkan.c:911
VkFlags VkPipelineStageFlags
Definition: vulkan_core.h:1697
VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences)
VKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo)
VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex)
#define VK_FALSE
Definition: vulkan_core.h:88
VKAPI_ATTR VkResult VKAPI_CALL vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout)
VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence)
@ VK_STRUCTURE_TYPE_SUBMIT_INFO
Definition: vulkan_core.h:157
@ VK_STRUCTURE_TYPE_PRESENT_INFO_KHR
Definition: vulkan_core.h:318

References VkSubmitInfo::commandBufferCount, VulkanContext::commandBuffers, createNewSwapchainAndSwapchainSpecificStuff(), VulkanContext::device, VulkanContext::fences, VkClearColorValue::float32, getVulkanResultString(), VulkanContext::graphicsQueue, VkExtent2D::height, VulkanContext::imageAvailableSemaphore, VkSubmitInfo::pCommandBuffers, VkPresentInfoKHR::pImageIndices, VulkanContext::presentQueue, VkSubmitInfo::pSignalSemaphores, VkPresentInfoKHR::pSwapchains, VkSubmitInfo::pWaitDstStageMask, VkSubmitInfo::pWaitSemaphores, VkPresentInfoKHR::pWaitSemaphores, quit(), VulkanContext::renderingFinishedSemaphore, rerecordCommandBuffer(), retval, SDL_Delay, SDL_GetPerformanceCounter, SDL_GetPerformanceFrequency(), SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, SDL_sin, SDL_TRUE, SDL_Vulkan_GetDrawableSize, VkSubmitInfo::signalSemaphoreCount, state, VkSubmitInfo::sType, VkPresentInfoKHR::sType, VulkanContext::swapchain, VkPresentInfoKHR::swapchainCount, VulkanContext::swapchainSize, UINT64_MAX, VK_ERROR_OUT_OF_DATE_KHR, VK_FALSE, VK_NULL_HANDLE, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, VK_STRUCTURE_TYPE_SUBMIT_INFO, VK_SUBOPTIMAL_KHR, VK_SUCCESS, vkAcquireNextImageKHR(), vkQueuePresentKHR(), vkQueueSubmit(), vkResetFences(), vkWaitForFences(), vulkanContext, VkSubmitInfo::waitSemaphoreCount, VkPresentInfoKHR::waitSemaphoreCount, VkExtent2D::width, and SDLTest_CommonState::windows.

Referenced by main().

◆ rerecordCommandBuffer()

static void rerecordCommandBuffer ( uint32_t  frameIndex,
const VkClearColorValue clearColor 
)
static

Definition at line 911 of file testvulkan.c.

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 }
VkStructureType sType
Definition: vulkan_core.h:3019
VkCommandBufferUsageFlags flags
Definition: vulkan_core.h:3021
static void recordPipelineImageBarrier(VkCommandBuffer commandBuffer, VkAccessFlags sourceAccessMask, VkAccessFlags destAccessMask, VkImageLayout sourceLayout, VkImageLayout destLayout, VkImage image)
Definition: testvulkan.c:878
@ 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
VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags)
@ VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT
Definition: vulkan_core.h:1968
VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue *pColor, uint32_t rangeCount, const VkImageSubresourceRange *pRanges)
@ 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 vkEndCommandBuffer(VkCommandBuffer commandBuffer)
@ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO
Definition: vulkan_core.h:195
VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo)

References VkImageSubresourceRange::aspectMask, VkImageSubresourceRange::baseArrayLayer, VkImageSubresourceRange::baseMipLevel, VulkanContext::commandBuffers, VkCommandBufferBeginInfo::flags, getVulkanResultString(), VkImageSubresourceRange::layerCount, VkImageSubresourceRange::levelCount, quit(), recordPipelineImageBarrier(), SDL_LOG_CATEGORY_APPLICATION, SDL_LogError, VkCommandBufferBeginInfo::sType, VulkanContext::swapchainImages, VK_ACCESS_MEMORY_READ_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_UNDEFINED, VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, VK_SUCCESS, vkBeginCommandBuffer(), vkCmdClearColorImage(), vkEndCommandBuffer(), vkResetCommandBuffer(), and vulkanContext.

Referenced by render().

◆ shutdownVulkan()

static void shutdownVulkan ( void  )
static

Definition at line 1003 of file testvulkan.c.

1004 {
1020 }
#define SDL_Vulkan_UnloadLibrary
VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator)
VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device)
VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator)
VKAPI_ATTR void VKAPI_CALL vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator)
VKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *pAllocator)

References destroySwapchainAndSwapchainSpecificStuff(), VulkanContext::device, VulkanContext::imageAvailableSemaphore, VulkanContext::instance, NULL, VulkanContext::renderingFinishedSemaphore, SDL_free, SDL_TRUE, SDL_Vulkan_UnloadLibrary, VulkanContext::surface, VulkanContext::surfaceFormats, vkDestroyDevice(), vkDestroyInstance(), vkDestroySemaphore(), vkDestroySurfaceKHR(), vkDeviceWaitIdle(), and vulkanContext.

Referenced by quit().

Variable Documentation

◆ state

SDLTest_CommonState* state
static

Definition at line 204 of file testvulkan.c.

Referenced by createSurface(), createSwapchain(), main(), quit(), and render().

◆ vkGetInstanceProcAddr

PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = NULL
static

Definition at line 94 of file testvulkan.c.

Referenced by loadGlobalFunctions().

◆ vulkanContext