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:179
static VulkanContext vulkanContext
Definition: testvulkan.c:206
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:49

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:178

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 806 of file testvulkan.c.

807{
809
810 VkCommandBufferAllocateInfo allocateInfo = {0};
816 SDL_malloc(sizeof(VkCommandBuffer) * vulkanContext.swapchainImageCount);
817 result =
819 if(result != VK_SUCCESS)
820 {
824 "vkAllocateCommandBuffers(): %s\n",
826 quit(2);
827 }
828}
#define SDL_malloc
#define SDL_LogError
#define SDL_free
GLuint64EXT * result
#define NULL
Definition: begin_code.h:167
VkCommandBufferLevel level
Definition: vulkan_core.h:2681
VkCommandBuffer * commandBuffers
Definition: testvulkan.c:201
VkCommandPool commandPool
Definition: testvulkan.c:198
uint32_t swapchainImageCount
Definition: testvulkan.c:199
static void quit(int rc)
Definition: testvulkan.c:211
static const char * getVulkanResultString(VkResult result)
Definition: testvulkan.c:111
@ VK_COMMAND_BUFFER_LEVEL_PRIMARY
Definition: vulkan_core.h:1216
VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers)
VkResult
Definition: vulkan_core.h:120
@ VK_SUCCESS
Definition: vulkan_core.h:121
@ VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO
Definition: vulkan_core.h:200

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 785 of file testvulkan.c.

786{
788
789 VkCommandPoolCreateInfo createInfo = {0};
791 createInfo.flags =
794 result =
796 if(result != VK_SUCCESS)
797 {
800 "vkCreateCommandPool(): %s\n",
802 quit(2);
803 }
804}
VkStructureType sType
Definition: vulkan_core.h:2671
VkCommandPoolCreateFlags flags
Definition: vulkan_core.h:2673
uint32_t graphicsQueueFamilyIndex
Definition: testvulkan.c:184
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:1693
@ VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT
Definition: vulkan_core.h:1694
@ VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO
Definition: vulkan_core.h:199

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 497 of file testvulkan.c.

498{
499 VkDeviceQueueCreateInfo deviceQueueCreateInfo[1] = {0};
500 static const float queuePriority[] = {1.0f};
501 VkDeviceCreateInfo deviceCreateInfo = {0};
502 static const char *const deviceExtensionNames[] = {
504 };
506
507 deviceQueueCreateInfo->sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
509 deviceQueueCreateInfo->queueCount = 1;
510 deviceQueueCreateInfo->pQueuePriorities = &queuePriority[0];
511
513 deviceCreateInfo.queueCreateInfoCount = 1;
514 deviceCreateInfo.pQueueCreateInfos = deviceQueueCreateInfo;
515 deviceCreateInfo.pEnabledFeatures = NULL;
516 deviceCreateInfo.enabledExtensionCount = SDL_arraysize(deviceExtensionNames);
517 deviceCreateInfo.ppEnabledExtensionNames = deviceExtensionNames;
520 if(result != VK_SUCCESS)
521 {
524 SDL_LOG_CATEGORY_APPLICATION, "vkCreateDevice(): %s\n", getVulkanResultString(result));
525 quit(2);
526 }
527}
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115
uint32_t enabledExtensionCount
Definition: vulkan_core.h:2042
const VkDeviceQueueCreateInfo * pQueueCreateInfos
Definition: vulkan_core.h:2039
const VkPhysicalDeviceFeatures * pEnabledFeatures
Definition: vulkan_core.h:2044
const char *const * ppEnabledExtensionNames
Definition: vulkan_core.h:2043
uint32_t queueCreateInfoCount
Definition: vulkan_core.h:2038
VkStructureType sType
Definition: vulkan_core.h:2035
const float * pQueuePriorities
Definition: vulkan_core.h:2031
VkStructureType sType
Definition: vulkan_core.h:2026
VkPhysicalDevice physicalDevice
Definition: testvulkan.c:186
#define VK_KHR_SWAPCHAIN_EXTENSION_NAME
Definition: vulkan_core.h:4791
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:162
@ VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO
Definition: vulkan_core.h:163

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 830 of file testvulkan.c.

831{
832 uint32_t i;
833
836 {
838 quit(2);
839 }
840 for(i = 0; i < vulkanContext.swapchainImageCount; i++)
841 {
843
844 VkFenceCreateInfo createInfo = {0};
847 result =
849 if(result != VK_SUCCESS)
850 {
851 for(; i > 0; i--)
852 {
854 }
858 "vkCreateFence(): %s\n",
860 quit(2);
861 }
862 }
863}
unsigned int uint32_t
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
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:2171
VkStructureType sType
Definition: vulkan_core.h:2169
VkFence * fences
Definition: testvulkan.c:202
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:1492
@ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO
Definition: vulkan_core.h:168

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 245 of file testvulkan.c.

246{
247 VkApplicationInfo appInfo = {0};
248 VkInstanceCreateInfo instanceCreateInfo = {0};
249 const char **extensions = NULL;
250 unsigned extensionCount = 0;
252
253
257 instanceCreateInfo.pApplicationInfo = &appInfo;
258 if(!SDL_Vulkan_GetInstanceExtensions(NULL, &extensionCount, NULL))
259 {
261 "SDL_Vulkan_GetInstanceExtensions(): %s\n",
262 SDL_GetError());
263 quit(2);
264 }
265 extensions = SDL_malloc(sizeof(const char *) * extensionCount);
266 if(!extensions)
267 {
269 quit(2);
270 }
271 if(!SDL_Vulkan_GetInstanceExtensions(NULL, &extensionCount, extensions))
272 {
273 SDL_free((void*)extensions);
275 "SDL_Vulkan_GetInstanceExtensions(): %s\n",
276 SDL_GetError());
277 quit(2);
278 }
279 instanceCreateInfo.enabledExtensionCount = extensionCount;
280 instanceCreateInfo.ppEnabledExtensionNames = extensions;
281 result = vkCreateInstance(&instanceCreateInfo, NULL, &vulkanContext.instance);
282 SDL_free((void*)extensions);
283 if(result != VK_SUCCESS)
284 {
287 "vkCreateInstance(): %s\n",
289 quit(2);
290 }
291}
#define SDL_GetError
#define SDL_Vulkan_GetInstanceExtensions
VkStructureType sType
Definition: vulkan_core.h:1735
const char *const * ppEnabledExtensionNames
Definition: vulkan_core.h:1752
VkStructureType sType
Definition: vulkan_core.h:1745
uint32_t enabledExtensionCount
Definition: vulkan_core.h:1751
const VkApplicationInfo * pApplicationInfo
Definition: vulkan_core.h:1748
#define VK_API_VERSION_1_0
Definition: vulkan_core.h:40
VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance)
@ VK_STRUCTURE_TYPE_APPLICATION_INFO
Definition: vulkan_core.h:160
@ VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO
Definition: vulkan_core.h:161

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 975 of file testvulkan.c.

976{
980 if(!createSwapchain())
981 return SDL_FALSE;
984 createFences();
985 return SDL_TRUE;
986}
@ SDL_TRUE
Definition: SDL_stdinc.h:164
@ SDL_FALSE
Definition: SDL_stdinc.h:163
static void getSurfaceFormats(void)
Definition: testvulkan.c:608
static void destroySwapchainAndSwapchainSpecificStuff(SDL_bool doDestroySwapchain)
Definition: testvulkan.c:966
static void getSurfaceCaps(void)
Definition: testvulkan.c:587
static void createCommandBuffers(void)
Definition: testvulkan.c:806
static void createFences(void)
Definition: testvulkan.c:830
static void createCommandPool(void)
Definition: testvulkan.c:785
static SDL_bool createSwapchain(void)
Definition: testvulkan.c:687

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 564 of file testvulkan.c.

565{
567
568 VkSemaphoreCreateInfo createInfo = {0};
570 result = vkCreateSemaphore(vulkanContext.device, &createInfo, NULL, semaphore);
571 if(result != VK_SUCCESS)
572 {
573 *semaphore = VK_NULL_HANDLE;
575 "vkCreateSemaphore(): %s\n",
577 quit(2);
578 }
579}
VkStructureType sType
Definition: vulkan_core.h:2175
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:169

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 581 of file testvulkan.c.

582{
585}
VkSemaphore renderingFinishedSemaphore
Definition: testvulkan.c:190
VkSemaphore imageAvailableSemaphore
Definition: testvulkan.c:189
static void createSemaphore(VkSemaphore *semaphore)
Definition: testvulkan.c:564

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

Referenced by initVulkan().

◆ createSurface()

static void createSurface ( void  )
static

Definition at line 311 of file testvulkan.c.

312{
316 {
319 SDL_LOG_CATEGORY_APPLICATION, "SDL_Vulkan_CreateSurface(): %s\n", SDL_GetError());
320 quit(2);
321 }
322}
#define SDL_Vulkan_CreateSurface
SDL_Window ** windows
VkSurfaceKHR surface
Definition: testvulkan.c:180
static SDLTest_CommonState * state
Definition: testvulkan.c:205

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 687 of file testvulkan.c.

688{
689 uint32_t i;
690 int w, h;
691 VkSwapchainCreateInfoKHR createInfo = {0};
693
694 // pick an image count
699
700 // pick a format
703 {
704 // aren't any preferred formats, so we pick
707 }
708 else
709 {
711 for(i = 0; i < vulkanContext.surfaceFormatsCount; i++)
712 {
714 {
716 break;
717 }
718 }
719 }
720
721 // get size
725 if(w == 0 || h == 0)
726 return SDL_FALSE;
727
729 createInfo.surface = vulkanContext.surface;
734 createInfo.imageArrayLayers = 1;
740 createInfo.clipped = VK_TRUE;
742 result =
744 if(createInfo.oldSwapchain)
746 if(result != VK_SUCCESS)
747 {
750 "vkCreateSwapchainKHR(): %s\n",
752 quit(2);
753 }
755 return SDL_TRUE;
756}
#define SDL_Vulkan_GetDrawableSize
GLfloat GLfloat GLfloat GLfloat h
GLubyte GLubyte GLubyte GLubyte w
uint32_t width
Definition: vulkan_core.h:2360
uint32_t height
Definition: vulkan_core.h:2361
VkSurfaceTransformFlagBitsKHR currentTransform
Definition: vulkan_core.h:4740
VkColorSpaceKHR colorSpace
Definition: vulkan_core.h:4747
VkPresentModeKHR presentMode
Definition: vulkan_core.h:4826
VkImageUsageFlags imageUsage
Definition: vulkan_core.h:4820
VkSharingMode imageSharingMode
Definition: vulkan_core.h:4821
VkStructureType sType
Definition: vulkan_core.h:4811
VkSwapchainKHR oldSwapchain
Definition: vulkan_core.h:4828
VkColorSpaceKHR imageColorSpace
Definition: vulkan_core.h:4817
VkSurfaceTransformFlagBitsKHR preTransform
Definition: vulkan_core.h:4824
VkCompositeAlphaFlagBitsKHR compositeAlpha
Definition: vulkan_core.h:4825
VkSwapchainKHR swapchain
Definition: testvulkan.c:181
VkSurfaceCapabilitiesKHR surfaceCapabilities
Definition: testvulkan.c:191
VkSurfaceFormatKHR surfaceFormat
Definition: testvulkan.c:196
VkExtent2D swapchainSize
Definition: testvulkan.c:197
uint32_t surfaceFormatsCount
Definition: testvulkan.c:194
uint32_t swapchainDesiredImageCount
Definition: testvulkan.c:195
VkSurfaceFormatKHR * surfaceFormats
Definition: testvulkan.c:192
static void getSwapchainImages(void)
Definition: testvulkan.c:649
VKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain)
@ VK_SHARING_MODE_EXCLUSIVE
Definition: vulkan_core.h:857
#define VK_TRUE
Definition: vulkan_core.h:100
VKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator)
@ VK_IMAGE_USAGE_TRANSFER_DST_BIT
Definition: vulkan_core.h:1342
@ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
Definition: vulkan_core.h:1345
@ VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR
Definition: vulkan_core.h:4724
@ VK_PRESENT_MODE_FIFO_KHR
Definition: vulkan_core.h:4698
@ VK_FORMAT_R8G8B8A8_UNORM
Definition: vulkan_core.h:582
@ VK_FORMAT_UNDEFINED
Definition: vulkan_core.h:545
@ VK_COLORSPACE_SRGB_NONLINEAR_KHR
Definition: vulkan_core.h:4688
@ VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR
Definition: vulkan_core.h:274

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 767 of file testvulkan.c.

768{
776}
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 778 of file testvulkan.c.

779{
783}
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()

◆ destroySwapchain()

◆ destroySwapchainAndSwapchainSpecificStuff()

static void destroySwapchainAndSwapchainSpecificStuff ( SDL_bool  doDestroySwapchain)
static

Definition at line 966 of file testvulkan.c.

967{
971 if(doDestroySwapchain)
973}
static void destroyCommandBuffers(void)
Definition: testvulkan.c:767
static void destroySwapchain(void)
Definition: testvulkan.c:758
static void destroyFences(void)
Definition: testvulkan.c:865
static void destroyCommandPool(void)
Definition: testvulkan.c:778

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

Referenced by createNewSwapchainAndSwapchainSpecificStuff(), and shutdownVulkan().

◆ findPhysicalDevice()

static void findPhysicalDevice ( void  )
static

Definition at line 324 of file testvulkan.c.

325{
326 uint32_t physicalDeviceCount = 0;
327 VkPhysicalDevice *physicalDevices;
328 VkQueueFamilyProperties *queueFamiliesProperties = NULL;
329 uint32_t queueFamiliesPropertiesAllocatedSize = 0;
330 VkExtensionProperties *deviceExtensions = NULL;
331 uint32_t deviceExtensionsAllocatedSize = 0;
332 uint32_t physicalDeviceIndex;
333
336 if(result != VK_SUCCESS)
337 {
339 "vkEnumeratePhysicalDevices(): %s\n",
341 quit(2);
342 }
343 if(physicalDeviceCount == 0)
344 {
346 "vkEnumeratePhysicalDevices(): no physical devices\n");
347 quit(2);
348 }
349 physicalDevices = SDL_malloc(sizeof(VkPhysicalDevice) * physicalDeviceCount);
350 if(!physicalDevices)
351 {
353 quit(2);
354 }
355 result =
356 vkEnumeratePhysicalDevices(vulkanContext.instance, &physicalDeviceCount, physicalDevices);
357 if(result != VK_SUCCESS)
358 {
359 SDL_free(physicalDevices);
361 "vkEnumeratePhysicalDevices(): %s\n",
363 quit(2);
364 }
366 for(physicalDeviceIndex = 0; physicalDeviceIndex < physicalDeviceCount;
367 physicalDeviceIndex++)
368 {
369 uint32_t queueFamiliesCount = 0;
370 uint32_t queueFamilyIndex;
371 uint32_t deviceExtensionCount = 0;
372 SDL_bool hasSwapchainExtension = SDL_FALSE;
373 uint32_t i;
374
375
376 VkPhysicalDevice physicalDevice = physicalDevices[physicalDeviceIndex];
379 continue;
381 vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueFamiliesCount, NULL);
382 if(queueFamiliesCount == 0)
383 continue;
384 if(queueFamiliesPropertiesAllocatedSize < queueFamiliesCount)
385 {
386 SDL_free(queueFamiliesProperties);
387 queueFamiliesPropertiesAllocatedSize = queueFamiliesCount;
388 queueFamiliesProperties =
389 SDL_malloc(sizeof(VkQueueFamilyProperties) * queueFamiliesPropertiesAllocatedSize);
390 if(!queueFamiliesProperties)
391 {
392 SDL_free(physicalDevices);
393 SDL_free(deviceExtensions);
395 quit(2);
396 }
397 }
399 physicalDevice, &queueFamiliesCount, queueFamiliesProperties);
400 vulkanContext.graphicsQueueFamilyIndex = queueFamiliesCount;
401 vulkanContext.presentQueueFamilyIndex = queueFamiliesCount;
402 for(queueFamilyIndex = 0; queueFamilyIndex < queueFamiliesCount;
403 queueFamilyIndex++)
404 {
405 VkBool32 supported = 0;
406
407 if(queueFamiliesProperties[queueFamilyIndex].queueCount == 0)
408 continue;
409 if(queueFamiliesProperties[queueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT)
410 vulkanContext.graphicsQueueFamilyIndex = queueFamilyIndex;
412 physicalDevice, queueFamilyIndex, vulkanContext.surface, &supported);
413 if(result != VK_SUCCESS)
414 {
415 SDL_free(physicalDevices);
416 SDL_free(queueFamiliesProperties);
417 SDL_free(deviceExtensions);
419 "vkGetPhysicalDeviceSurfaceSupportKHR(): %s\n",
421 quit(2);
422 }
423 if(supported)
424 {
425 vulkanContext.presentQueueFamilyIndex = queueFamilyIndex;
426 if(queueFamiliesProperties[queueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT)
427 break; // use this queue because it can present and do graphics
428 }
429 }
430 if(vulkanContext.graphicsQueueFamilyIndex == queueFamiliesCount) // no good queues found
431 continue;
432 if(vulkanContext.presentQueueFamilyIndex == queueFamiliesCount) // no good queues found
433 continue;
434 result =
435 vkEnumerateDeviceExtensionProperties(physicalDevice, NULL, &deviceExtensionCount, NULL);
436 if(result != VK_SUCCESS)
437 {
438 SDL_free(physicalDevices);
439 SDL_free(queueFamiliesProperties);
440 SDL_free(deviceExtensions);
442 "vkEnumerateDeviceExtensionProperties(): %s\n",
444 quit(2);
445 }
446 if(deviceExtensionCount == 0)
447 continue;
448 if(deviceExtensionsAllocatedSize < deviceExtensionCount)
449 {
450 SDL_free(deviceExtensions);
451 deviceExtensionsAllocatedSize = deviceExtensionCount;
452 deviceExtensions =
453 SDL_malloc(sizeof(VkExtensionProperties) * deviceExtensionsAllocatedSize);
454 if(!deviceExtensions)
455 {
456 SDL_free(physicalDevices);
457 SDL_free(queueFamiliesProperties);
459 quit(2);
460 }
461 }
463 physicalDevice, NULL, &deviceExtensionCount, deviceExtensions);
464 if(result != VK_SUCCESS)
465 {
466 SDL_free(physicalDevices);
467 SDL_free(queueFamiliesProperties);
468 SDL_free(deviceExtensions);
470 "vkEnumerateDeviceExtensionProperties(): %s\n",
472 quit(2);
473 }
474 for(i = 0; i < deviceExtensionCount; i++)
475 {
476 if(0 == SDL_strcmp(deviceExtensions[i].extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME))
477 {
478 hasSwapchainExtension = SDL_TRUE;
479 break;
480 }
481 }
482 if(!hasSwapchainExtension)
483 continue;
484 vulkanContext.physicalDevice = physicalDevice;
485 break;
486 }
487 SDL_free(physicalDevices);
488 SDL_free(queueFamiliesProperties);
489 SDL_free(deviceExtensions);
491 {
492 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Vulkan: no viable physical devices found");
493 quit(2);
494 }
495}
#define SDL_strcmp
SDL_bool
Definition: SDL_stdinc.h:162
VkPhysicalDeviceProperties physicalDeviceProperties
Definition: testvulkan.c:182
uint32_t presentQueueFamilyIndex
Definition: testvulkan.c:185
VkPhysicalDeviceFeatures physicalDeviceFeatures
Definition: testvulkan.c:183
#define VK_VERSION_MAJOR(version)
Definition: vulkan_core.h:42
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:1392
VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties *pQueueFamilyProperties)
uint32_t VkBool32
Definition: vulkan_core.h:65

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()

◆ getSurfaceCaps()

static void getSurfaceCaps ( void  )
static

Definition at line 587 of file testvulkan.c.

588{
591 if(result != VK_SUCCESS)
592 {
594 "vkGetPhysicalDeviceSurfaceCapabilitiesKHR(): %s\n",
596 quit(2);
597 }
598
599 // check surface usage
601 {
603 "Vulkan surface doesn't support VK_IMAGE_USAGE_TRANSFER_DST_BIT\n");
604 quit(2);
605 }
606}
VkImageUsageFlags supportedUsageFlags
Definition: vulkan_core.h:4742
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 608 of file testvulkan.c.

609{
613 NULL);
614 if(result != VK_SUCCESS)
615 {
618 "vkGetPhysicalDeviceSurfaceFormatsKHR(): %s\n",
620 quit(2);
621 }
623 {
629 {
632 quit(2);
633 }
634 }
639 if(result != VK_SUCCESS)
640 {
643 "vkGetPhysicalDeviceSurfaceFormatsKHR(): %s\n",
645 quit(2);
646 }
647}
uint32_t surfaceFormatsAllocatedCount
Definition: testvulkan.c:193
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 649 of file testvulkan.c.

650{
652
657 if(result != VK_SUCCESS)
658 {
661 "vkGetSwapchainImagesKHR(): %s\n",
663 quit(2);
664 }
667 {
669 quit(2);
670 }
675 if(result != VK_SUCCESS)
676 {
681 "vkGetSwapchainImagesKHR(): %s\n",
683 quit(2);
684 }
685}
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";
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";
169 break;
170 }
171 if(result < 0)
172 return "VK_ERROR_<Unknown>";
173 return "VK_<Unknown>";
174}
@ VK_ERROR_VALIDATION_FAILED_EXT
Definition: vulkan_core.h:146
@ VK_ERROR_INVALID_SHADER_NV
Definition: vulkan_core.h:147
@ VK_SUBOPTIMAL_KHR
Definition: vulkan_core.h:143
@ VK_ERROR_EXTENSION_NOT_PRESENT
Definition: vulkan_core.h:133
@ VK_INCOMPLETE
Definition: vulkan_core.h:126
@ VK_ERROR_DEVICE_LOST
Definition: vulkan_core.h:130
@ VK_EVENT_SET
Definition: vulkan_core.h:124
@ VK_EVENT_RESET
Definition: vulkan_core.h:125
@ VK_ERROR_OUT_OF_POOL_MEMORY_KHR
Definition: vulkan_core.h:151
@ VK_RESULT_RANGE_SIZE
Definition: vulkan_core.h:155
@ VK_ERROR_OUT_OF_HOST_MEMORY
Definition: vulkan_core.h:127
@ VK_ERROR_INITIALIZATION_FAILED
Definition: vulkan_core.h:129
@ VK_ERROR_INCOMPATIBLE_DISPLAY_KHR
Definition: vulkan_core.h:145
@ VK_ERROR_OUT_OF_DEVICE_MEMORY
Definition: vulkan_core.h:128
@ VK_ERROR_NATIVE_WINDOW_IN_USE_KHR
Definition: vulkan_core.h:142
@ VK_ERROR_OUT_OF_DATE_KHR
Definition: vulkan_core.h:144
@ VK_TIMEOUT
Definition: vulkan_core.h:123
@ VK_ERROR_FORMAT_NOT_SUPPORTED
Definition: vulkan_core.h:137
@ VK_ERROR_FRAGMENTED_POOL
Definition: vulkan_core.h:138
@ VK_ERROR_SURFACE_LOST_KHR
Definition: vulkan_core.h:141
@ VK_NOT_READY
Definition: vulkan_core.h:122
@ VK_ERROR_FEATURE_NOT_PRESENT
Definition: vulkan_core.h:134
@ VK_ERROR_TOO_MANY_OBJECTS
Definition: vulkan_core.h:136
@ VK_RESULT_MAX_ENUM
Definition: vulkan_core.h:156
@ VK_ERROR_MEMORY_MAP_FAILED
Definition: vulkan_core.h:131
@ VK_ERROR_LAYER_NOT_PRESENT
Definition: vulkan_core.h:132
@ VK_ERROR_INCOMPATIBLE_DRIVER
Definition: vulkan_core.h:135

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_RESULT_MAX_ENUM, VK_RESULT_RANGE_SIZE, 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 988 of file testvulkan.c.

989{
997 createDevice();
999 getQueues();
1002}
#define SDL_memset
#define SDL_Vulkan_LoadLibrary
static void createSemaphores(void)
Definition: testvulkan.c:581
static void loadInstanceFunctions(void)
Definition: testvulkan.c:293
static void createSurface(void)
Definition: testvulkan.c:311
static void loadGlobalFunctions(void)
Definition: testvulkan.c:218
static void createDevice(void)
Definition: testvulkan.c:497
static void findPhysicalDevice(void)
Definition: testvulkan.c:324
static void loadDeviceFunctions(void)
Definition: testvulkan.c:529
static void createInstance(void)
Definition: testvulkan.c:245
static void getQueues(void)
Definition: testvulkan.c:549
static SDL_bool createNewSwapchainAndSwapchainSpecificStuff(void)
Definition: testvulkan.c:975

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 529 of file testvulkan.c.

530{
531#define VULKAN_DEVICE_FUNCTION(name) \
532 name = (PFN_##name)vkGetDeviceProcAddr(vulkanContext.device, #name); \
533 if(!name) \
534 { \
535 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \
536 "vkGetDeviceProcAddr(device, \"" #name "\") failed\n"); \
537 quit(2); \
538 }
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
545}
#define VULKAN_FUNCTIONS()
Definition: testvulkan.c:42

References VULKAN_FUNCTIONS.

Referenced by initVulkan().

◆ loadGlobalFunctions()

static void loadGlobalFunctions ( void  )
static

Definition at line 218 of file testvulkan.c.

219{
222 {
224 "SDL_Vulkan_GetVkGetInstanceProcAddr(): %s\n",
225 SDL_GetError());
226 quit(2);
227 }
228
229#define VULKAN_DEVICE_FUNCTION(name)
230#define VULKAN_GLOBAL_FUNCTION(name) \
231 name = (PFN_##name)vkGetInstanceProcAddr(VK_NULL_HANDLE, #name); \
232 if(!name) \
233 { \
234 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \
235 "vkGetInstanceProcAddr(VK_NULL_HANDLE, \"" #name "\") failed\n"); \
236 quit(2); \
237 }
238#define VULKAN_INSTANCE_FUNCTION(name)
240#undef VULKAN_DEVICE_FUNCTION
241#undef VULKAN_GLOBAL_FUNCTION
242#undef VULKAN_INSTANCE_FUNCTION
243}
#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 293 of file testvulkan.c.

294{
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); \
299 if(!name) \
300 { \
301 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \
302 "vkGetInstanceProcAddr(instance, \"" #name "\") failed\n"); \
303 quit(2); \
304 }
306#undef VULKAN_DEVICE_FUNCTION
307#undef VULKAN_GLOBAL_FUNCTION
308#undef VULKAN_INSTANCE_FUNCTION
309}

References VULKAN_FUNCTIONS.

Referenced by initVulkan().

◆ main()

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

Definition at line 1119 of file testvulkan.c.

1120{
1121 int fsaa, accel;
1122 int done;
1125 Uint32 then, now, frames;
1126 int dw, dh;
1127
1128 /* Enable standard application logging */
1130
1131 /* Initialize parameters */
1132 fsaa = 0;
1133 accel = -1;
1134
1135 /* Initialize test framework */
1137 if(!state)
1138 {
1139 return 1;
1140 }
1141
1142 /* Set Vulkan parameters */
1144 state->num_windows = 1;
1145 state->skip_renderer = 1;
1146
1149 return 1;
1150 }
1151
1153 SDL_Log("Screen BPP : %d\n", SDL_BITSPERPIXEL(mode.format));
1154 SDL_GetWindowSize(state->windows[0], &dw, &dh);
1155 SDL_Log("Window Size : %d,%d\n", dw, dh);
1157 SDL_Log("Draw Size : %d,%d\n", dw, dh);
1158 SDL_Log("\n");
1159
1160 initVulkan();
1161
1162 /* Main render loop */
1163 frames = 0;
1164 then = SDL_GetTicks();
1165 done = 0;
1166 while(!done)
1167 {
1168 /* Check for events */
1169 ++frames;
1170 while(SDL_PollEvent(&event))
1171 {
1173 }
1174
1175 if(!done)
1176 render();
1177 }
1178
1179 /* Print out some timing information */
1180 now = SDL_GetTicks();
1181 if(now > then)
1182 {
1183 SDL_Log("%2.2f frames per second\n", ((double)frames * 1000) / (now - then));
1184 }
1185 quit(0);
1186 return 0;
1187}
#define SDL_INIT_VIDEO
Definition: SDL.h:79
#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:203
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.
SDLTest_CommonState * SDLTest_CommonCreateState(char **argv, Uint32 flags)
Parse command line parameters and create common state.
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.
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
@ SDL_WINDOW_VULKAN
Definition: SDL_video.h:122
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:1023
static void initVulkan(void)
Definition: testvulkan.c:988
General event structure.
Definition: SDL_events.h:558

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 879 of file testvulkan.c.

885{
886 VkImageMemoryBarrier barrier = {0};
888 barrier.srcAccessMask = sourceAccessMask;
889 barrier.dstAccessMask = destAccessMask;
890 barrier.oldLayout = sourceLayout;
891 barrier.newLayout = destLayout;
894 barrier.image = image;
896 barrier.subresourceRange.baseMipLevel = 0;
897 barrier.subresourceRange.levelCount = 1;
899 barrier.subresourceRange.layerCount = 1;
900 vkCmdPipelineBarrier(commandBuffer,
903 0,
904 0,
905 NULL,
906 0,
907 NULL,
908 1,
909 &barrier);
910}
GLeglImageOES image
Definition: SDL_opengl.h:2148
VkAccessFlags dstAccessMask
Definition: vulkan_core.h:2799
uint32_t dstQueueFamilyIndex
Definition: vulkan_core.h:2803
VkAccessFlags srcAccessMask
Definition: vulkan_core.h:2798
VkStructureType sType
Definition: vulkan_core.h:2796
VkImageLayout newLayout
Definition: vulkan_core.h:2801
VkImageSubresourceRange subresourceRange
Definition: vulkan_core.h:2805
VkImageLayout oldLayout
Definition: vulkan_core.h:2800
uint32_t srcQueueFamilyIndex
Definition: vulkan_core.h:2802
VkImageAspectFlags aspectMask
Definition: vulkan_core.h:2250
@ VK_IMAGE_ASPECT_COLOR_BIT
Definition: vulkan_core.h:1459
@ VK_PIPELINE_STAGE_TRANSFER_BIT
Definition: vulkan_core.h:1440
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:102
@ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER
Definition: vulkan_core.h:205

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 1023 of file testvulkan.c.

1024{
1025 uint32_t frameIndex;
1027 double currentTime;
1028 VkClearColorValue clearColor = {0};
1030 VkSubmitInfo submitInfo = {0};
1031 VkPresentInfoKHR presentInfo = {0};
1032 int w, h;
1033
1035 {
1037 if(!retval)
1038 SDL_Delay(100);
1039 return retval;
1040 }
1043 UINT64_MAX,
1046 &frameIndex);
1050 {
1052 "vkAcquireNextImageKHR(): %s\n",
1054 quit(2);
1055 }
1058 if(result != VK_SUCCESS)
1059 {
1061 SDL_LOG_CATEGORY_APPLICATION, "vkWaitForFences(): %s\n", getVulkanResultString(result));
1062 quit(2);
1063 }
1065 if(result != VK_SUCCESS)
1066 {
1068 SDL_LOG_CATEGORY_APPLICATION, "vkResetFences(): %s\n", getVulkanResultString(result));
1069 quit(2);
1070 }
1071 currentTime = (double)SDL_GetPerformanceCounter() / SDL_GetPerformanceFrequency();
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));
1075 clearColor.float32[3] = 1;
1076 rerecordCommandBuffer(frameIndex, &clearColor);
1078 submitInfo.waitSemaphoreCount = 1;
1080 submitInfo.pWaitDstStageMask = &waitDestStageMask;
1081 submitInfo.commandBufferCount = 1;
1082 submitInfo.pCommandBuffers = &vulkanContext.commandBuffers[frameIndex];
1083 submitInfo.signalSemaphoreCount = 1;
1086 vulkanContext.graphicsQueue, 1, &submitInfo, vulkanContext.fences[frameIndex]);
1087 if(result != VK_SUCCESS)
1088 {
1090 SDL_LOG_CATEGORY_APPLICATION, "vkQueueSubmit(): %s\n", getVulkanResultString(result));
1091 quit(2);
1092 }
1094 presentInfo.waitSemaphoreCount = 1;
1096 presentInfo.swapchainCount = 1;
1097 presentInfo.pSwapchains = &vulkanContext.swapchain;
1098 presentInfo.pImageIndices = &frameIndex;
1101 {
1103 }
1104 if(result != VK_SUCCESS)
1105 {
1107 "vkQueuePresentKHR(): %s\n",
1109 quit(2);
1110 }
1113 {
1115 }
1116 return SDL_TRUE;
1117}
#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:4835
uint32_t waitSemaphoreCount
Definition: vulkan_core.h:4834
uint32_t swapchainCount
Definition: vulkan_core.h:4836
const uint32_t * pImageIndices
Definition: vulkan_core.h:4838
VkStructureType sType
Definition: vulkan_core.h:4832
const VkSwapchainKHR * pSwapchains
Definition: vulkan_core.h:4837
uint32_t waitSemaphoreCount
Definition: vulkan_core.h:2062
const VkPipelineStageFlags * pWaitDstStageMask
Definition: vulkan_core.h:2064
uint32_t commandBufferCount
Definition: vulkan_core.h:2065
const VkSemaphore * pWaitSemaphores
Definition: vulkan_core.h:2063
uint32_t signalSemaphoreCount
Definition: vulkan_core.h:2067
const VkCommandBuffer * pCommandBuffers
Definition: vulkan_core.h:2066
const VkSemaphore * pSignalSemaphores
Definition: vulkan_core.h:2068
VkStructureType sType
Definition: vulkan_core.h:2060
SDL_bool retval
#define UINT64_MAX
Definition: testvulkan.c:39
static void rerecordCommandBuffer(uint32_t frameIndex, const VkClearColorValue *clearColor)
Definition: testvulkan.c:912
VkFlags VkPipelineStageFlags
Definition: vulkan_core.h:1455
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:101
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:164
@ VK_STRUCTURE_TYPE_PRESENT_INFO_KHR
Definition: vulkan_core.h:275

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 912 of file testvulkan.c.

913{
914 VkCommandBuffer commandBuffer = vulkanContext.commandBuffers[frameIndex];
915 VkImage image = vulkanContext.swapchainImages[frameIndex];
916 VkCommandBufferBeginInfo beginInfo = {0};
917 VkImageSubresourceRange clearRange = {0};
918
919 VkResult result = vkResetCommandBuffer(commandBuffer, 0);
920 if(result != VK_SUCCESS)
921 {
923 "vkResetCommandBuffer(): %s\n",
925 quit(2);
926 }
929 result = vkBeginCommandBuffer(commandBuffer, &beginInfo);
930 if(result != VK_SUCCESS)
931 {
933 "vkBeginCommandBuffer(): %s\n",
935 quit(2);
936 }
937 recordPipelineImageBarrier(commandBuffer,
938 0,
942 image);
944 clearRange.baseMipLevel = 0;
945 clearRange.levelCount = 1;
946 clearRange.baseArrayLayer = 0;
947 clearRange.layerCount = 1;
949 commandBuffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, clearColor, 1, &clearRange);
950 recordPipelineImageBarrier(commandBuffer,
955 image);
956 result = vkEndCommandBuffer(commandBuffer);
957 if(result != VK_SUCCESS)
958 {
960 "vkEndCommandBuffer(): %s\n",
962 quit(2);
963 }
964}
VkStructureType sType
Definition: vulkan_core.h:2697
VkCommandBufferUsageFlags flags
Definition: vulkan_core.h:2699
static void recordPipelineImageBarrier(VkCommandBuffer commandBuffer, VkAccessFlags sourceAccessMask, VkAccessFlags destAccessMask, VkImageLayout sourceLayout, VkImageLayout destLayout, VkImage image)
Definition: testvulkan.c:879
@ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
Definition: vulkan_core.h:877
@ VK_IMAGE_LAYOUT_UNDEFINED
Definition: vulkan_core.h:866
@ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
Definition: vulkan_core.h:873
VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags)
@ VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT
Definition: vulkan_core.h:1709
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:1663
@ VK_ACCESS_MEMORY_READ_BIT
Definition: vulkan_core.h:1666
VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer)
@ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO
Definition: vulkan_core.h:202
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 1004 of file testvulkan.c.

1005{
1021}
#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 205 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