@@ -36,6 +36,7 @@ SwapChain::~SwapChain()
DestroySwapChainImages();
DestroySwapChain();
DestroySurface();
DestroySemaphores();
}

VkSurfaceKHR SwapChain::CreateVulkanSurface(VkInstance instance, void* display_handle, void* hwnd)
@@ -142,12 +143,53 @@ std::unique_ptr<SwapChain> SwapChain::Create(void* display_handle, void* native_
std::unique_ptr<SwapChain> swap_chain =
std::make_unique<SwapChain>(display_handle, native_handle, surface, vsync);

if (!swap_chain->CreateSwapChain() || !swap_chain->SetupSwapChainImages())
if (!swap_chain->CreateSemaphores() || !swap_chain->CreateSwapChain() ||
!swap_chain->SetupSwapChainImages())
{
return nullptr;
}

return swap_chain;
}

bool SwapChain::CreateSemaphores()
{
// Create two semaphores, one that is triggered when the swapchain buffer is ready, another after
// submit and before present
VkSemaphoreCreateInfo semaphore_info = {
VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, // VkStructureType sType
nullptr, // const void* pNext
0 // VkSemaphoreCreateFlags flags
};

VkResult res;
if ((res = vkCreateSemaphore(g_vulkan_context->GetDevice(), &semaphore_info, nullptr,
&m_image_available_semaphore)) != VK_SUCCESS ||
(res = vkCreateSemaphore(g_vulkan_context->GetDevice(), &semaphore_info, nullptr,
&m_rendering_finished_semaphore)) != VK_SUCCESS)
{
LOG_VULKAN_ERROR(res, "vkCreateSemaphore failed: ");
return false;
}

return true;
}

void SwapChain::DestroySemaphores()
{
if (m_image_available_semaphore)
{
vkDestroySemaphore(g_vulkan_context->GetDevice(), m_image_available_semaphore, nullptr);
m_image_available_semaphore = VK_NULL_HANDLE;
}

if (m_rendering_finished_semaphore)
{
vkDestroySemaphore(g_vulkan_context->GetDevice(), m_rendering_finished_semaphore, nullptr);
m_rendering_finished_semaphore = VK_NULL_HANDLE;
}
}

bool SwapChain::SelectSurfaceFormat()
{
u32 format_count;
@@ -370,8 +412,15 @@ bool SwapChain::SetupSwapChainImages()
images.data());
ASSERT(res == VK_SUCCESS);

VkRenderPass render_pass = g_object_cache->GetRenderPass(
m_surface_format.format, VK_FORMAT_UNDEFINED, 1, VK_ATTACHMENT_LOAD_OP_CLEAR);
m_render_pass = g_object_cache->GetRenderPass(m_surface_format.format, VK_FORMAT_UNDEFINED, 1,
VK_ATTACHMENT_LOAD_OP_LOAD);
m_clear_render_pass = g_object_cache->GetRenderPass(m_surface_format.format, VK_FORMAT_UNDEFINED,
1, VK_ATTACHMENT_LOAD_OP_CLEAR);
if (m_render_pass == VK_NULL_HANDLE || m_clear_render_pass == VK_NULL_HANDLE)
{
PanicAlert("Failed to get swap chain render passes.");
return false;
}

m_swap_chain_images.reserve(image_count);
for (uint32_t i = 0; i < image_count; i++)
@@ -388,7 +437,7 @@ bool SwapChain::SetupSwapChainImages()
VkFramebufferCreateInfo framebuffer_info = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
nullptr,
0,
render_pass,
m_render_pass,
1,
&view,
m_width,
@@ -428,11 +477,11 @@ void SwapChain::DestroySwapChain()
m_swap_chain = VK_NULL_HANDLE;
}

VkResult SwapChain::AcquireNextImage(VkSemaphore available_semaphore)
VkResult SwapChain::AcquireNextImage()
{
VkResult res =
vkAcquireNextImageKHR(g_vulkan_context->GetDevice(), m_swap_chain, UINT64_MAX,
available_semaphore, VK_NULL_HANDLE, &m_current_swap_chain_image_index);
VkResult res = vkAcquireNextImageKHR(g_vulkan_context->GetDevice(), m_swap_chain, UINT64_MAX,
m_image_available_semaphore, VK_NULL_HANDLE,
&m_current_swap_chain_image_index);
if (res != VK_SUCCESS && res != VK_ERROR_OUT_OF_DATE_KHR && res != VK_SUBOPTIMAL_KHR)
LOG_VULKAN_ERROR(res, "vkAcquireNextImageKHR failed: ");

@@ -53,8 +53,12 @@ class SwapChain
{
return m_swap_chain_images[m_current_swap_chain_image_index].framebuffer;
}
VkRenderPass GetLoadRenderPass() const { return m_render_pass; }
VkRenderPass GetClearRenderPass() const { return m_clear_render_pass; }
VkSemaphore GetImageAvailableSemaphore() const { return m_image_available_semaphore; }
VkSemaphore GetRenderingFinishedSemaphore() const { return m_rendering_finished_semaphore; }

VkResult AcquireNextImage(VkSemaphore available_semaphore);
VkResult AcquireNextImage();

bool RecreateSurface(void* native_handle);
bool ResizeSwapChain();
@@ -64,6 +68,9 @@ class SwapChain
bool SetVSync(bool enabled);

private:
bool CreateSemaphores();
void DestroySemaphores();

bool SelectSurfaceFormat();
bool SelectPresentMode();

@@ -94,6 +101,12 @@ class SwapChain
std::vector<SwapChainImage> m_swap_chain_images;
u32 m_current_swap_chain_image_index = 0;

VkSemaphore m_image_available_semaphore = VK_NULL_HANDLE;
VkSemaphore m_rendering_finished_semaphore = VK_NULL_HANDLE;

VkRenderPass m_render_pass = VK_NULL_HANDLE;
VkRenderPass m_clear_render_pass = VK_NULL_HANDLE;

u32 m_width = 0;
u32 m_height = 0;
u32 m_layers = 0;
@@ -29,130 +29,9 @@ VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceProperties, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceQueueFamilyProperties, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceMemoryProperties, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateDevice, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyDevice, true)
VULKAN_INSTANCE_ENTRY_POINT(vkEnumerateDeviceExtensionProperties, true)
VULKAN_INSTANCE_ENTRY_POINT(vkEnumerateDeviceLayerProperties, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetDeviceQueue, true)
VULKAN_INSTANCE_ENTRY_POINT(vkQueueSubmit, true)
VULKAN_INSTANCE_ENTRY_POINT(vkQueueWaitIdle, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDeviceWaitIdle, true)
VULKAN_INSTANCE_ENTRY_POINT(vkAllocateMemory, true)
VULKAN_INSTANCE_ENTRY_POINT(vkFreeMemory, true)
VULKAN_INSTANCE_ENTRY_POINT(vkMapMemory, true)
VULKAN_INSTANCE_ENTRY_POINT(vkUnmapMemory, true)
VULKAN_INSTANCE_ENTRY_POINT(vkFlushMappedMemoryRanges, true)
VULKAN_INSTANCE_ENTRY_POINT(vkInvalidateMappedMemoryRanges, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetDeviceMemoryCommitment, true)
VULKAN_INSTANCE_ENTRY_POINT(vkBindBufferMemory, true)
VULKAN_INSTANCE_ENTRY_POINT(vkBindImageMemory, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetBufferMemoryRequirements, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetImageMemoryRequirements, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetImageSparseMemoryRequirements, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceSparseImageFormatProperties, true)
VULKAN_INSTANCE_ENTRY_POINT(vkQueueBindSparse, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateFence, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyFence, true)
VULKAN_INSTANCE_ENTRY_POINT(vkResetFences, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetFenceStatus, true)
VULKAN_INSTANCE_ENTRY_POINT(vkWaitForFences, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateSemaphore, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroySemaphore, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateEvent, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyEvent, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetEventStatus, true)
VULKAN_INSTANCE_ENTRY_POINT(vkSetEvent, true)
VULKAN_INSTANCE_ENTRY_POINT(vkResetEvent, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateQueryPool, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyQueryPool, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetQueryPoolResults, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateBuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyBuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateBufferView, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyBufferView, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateImage, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyImage, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetImageSubresourceLayout, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateImageView, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyImageView, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateShaderModule, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyShaderModule, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreatePipelineCache, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyPipelineCache, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetPipelineCacheData, true)
VULKAN_INSTANCE_ENTRY_POINT(vkMergePipelineCaches, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateGraphicsPipelines, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateComputePipelines, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyPipeline, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreatePipelineLayout, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyPipelineLayout, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateSampler, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroySampler, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateDescriptorSetLayout, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyDescriptorSetLayout, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateDescriptorPool, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyDescriptorPool, true)
VULKAN_INSTANCE_ENTRY_POINT(vkResetDescriptorPool, true)
VULKAN_INSTANCE_ENTRY_POINT(vkAllocateDescriptorSets, true)
VULKAN_INSTANCE_ENTRY_POINT(vkFreeDescriptorSets, true)
VULKAN_INSTANCE_ENTRY_POINT(vkUpdateDescriptorSets, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateFramebuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyFramebuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateRenderPass, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyRenderPass, true)
VULKAN_INSTANCE_ENTRY_POINT(vkGetRenderAreaGranularity, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateCommandPool, true)
VULKAN_INSTANCE_ENTRY_POINT(vkDestroyCommandPool, true)
VULKAN_INSTANCE_ENTRY_POINT(vkResetCommandPool, true)
VULKAN_INSTANCE_ENTRY_POINT(vkAllocateCommandBuffers, true)
VULKAN_INSTANCE_ENTRY_POINT(vkFreeCommandBuffers, true)
VULKAN_INSTANCE_ENTRY_POINT(vkBeginCommandBuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkEndCommandBuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkResetCommandBuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdBindPipeline, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdSetViewport, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdSetScissor, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdSetLineWidth, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdSetDepthBias, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdSetBlendConstants, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdSetDepthBounds, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdSetStencilCompareMask, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdSetStencilWriteMask, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdSetStencilReference, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdBindDescriptorSets, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdBindIndexBuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdBindVertexBuffers, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdDraw, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdDrawIndexed, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdDrawIndirect, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdDrawIndexedIndirect, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdDispatch, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdDispatchIndirect, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdCopyBuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdCopyImage, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdBlitImage, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdCopyBufferToImage, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdCopyImageToBuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdUpdateBuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdFillBuffer, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdClearColorImage, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdClearDepthStencilImage, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdClearAttachments, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdResolveImage, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdSetEvent, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdResetEvent, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdWaitEvents, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdPipelineBarrier, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdBeginQuery, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdEndQuery, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdResetQueryPool, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdWriteTimestamp, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdCopyQueryPoolResults, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdPushConstants, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdBeginRenderPass, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdNextSubpass, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdEndRenderPass, true)
VULKAN_INSTANCE_ENTRY_POINT(vkCmdExecuteCommands, true)

VULKAN_INSTANCE_ENTRY_POINT(vkDestroySurfaceKHR, false)
VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceSurfaceSupportKHR, false)
VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceSurfaceCapabilitiesKHR, false)
@@ -192,6 +71,126 @@ VULKAN_INSTANCE_ENTRY_POINT(vkDebugReportMessageEXT, false)

#ifdef VULKAN_DEVICE_ENTRY_POINT

VULKAN_DEVICE_ENTRY_POINT(vkDestroyDevice, true)
VULKAN_DEVICE_ENTRY_POINT(vkGetDeviceQueue, true)
VULKAN_DEVICE_ENTRY_POINT(vkQueueSubmit, true)
VULKAN_DEVICE_ENTRY_POINT(vkQueueWaitIdle, true)
VULKAN_DEVICE_ENTRY_POINT(vkDeviceWaitIdle, true)
VULKAN_DEVICE_ENTRY_POINT(vkAllocateMemory, true)
VULKAN_DEVICE_ENTRY_POINT(vkFreeMemory, true)
VULKAN_DEVICE_ENTRY_POINT(vkMapMemory, true)
VULKAN_DEVICE_ENTRY_POINT(vkUnmapMemory, true)
VULKAN_DEVICE_ENTRY_POINT(vkFlushMappedMemoryRanges, true)
VULKAN_DEVICE_ENTRY_POINT(vkInvalidateMappedMemoryRanges, true)
VULKAN_DEVICE_ENTRY_POINT(vkGetDeviceMemoryCommitment, true)
VULKAN_DEVICE_ENTRY_POINT(vkBindBufferMemory, true)
VULKAN_DEVICE_ENTRY_POINT(vkBindImageMemory, true)
VULKAN_DEVICE_ENTRY_POINT(vkGetBufferMemoryRequirements, true)
VULKAN_DEVICE_ENTRY_POINT(vkGetImageMemoryRequirements, true)
VULKAN_DEVICE_ENTRY_POINT(vkGetImageSparseMemoryRequirements, true)
VULKAN_DEVICE_ENTRY_POINT(vkQueueBindSparse, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateFence, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyFence, true)
VULKAN_DEVICE_ENTRY_POINT(vkResetFences, true)
VULKAN_DEVICE_ENTRY_POINT(vkGetFenceStatus, true)
VULKAN_DEVICE_ENTRY_POINT(vkWaitForFences, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateSemaphore, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroySemaphore, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateEvent, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyEvent, true)
VULKAN_DEVICE_ENTRY_POINT(vkGetEventStatus, true)
VULKAN_DEVICE_ENTRY_POINT(vkSetEvent, true)
VULKAN_DEVICE_ENTRY_POINT(vkResetEvent, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateQueryPool, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyQueryPool, true)
VULKAN_DEVICE_ENTRY_POINT(vkGetQueryPoolResults, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateBuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyBuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateBufferView, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyBufferView, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateImage, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyImage, true)
VULKAN_DEVICE_ENTRY_POINT(vkGetImageSubresourceLayout, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateImageView, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyImageView, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateShaderModule, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyShaderModule, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreatePipelineCache, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyPipelineCache, true)
VULKAN_DEVICE_ENTRY_POINT(vkGetPipelineCacheData, true)
VULKAN_DEVICE_ENTRY_POINT(vkMergePipelineCaches, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateGraphicsPipelines, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateComputePipelines, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyPipeline, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreatePipelineLayout, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyPipelineLayout, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateSampler, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroySampler, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateDescriptorSetLayout, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyDescriptorSetLayout, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateDescriptorPool, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyDescriptorPool, true)
VULKAN_DEVICE_ENTRY_POINT(vkResetDescriptorPool, true)
VULKAN_DEVICE_ENTRY_POINT(vkAllocateDescriptorSets, true)
VULKAN_DEVICE_ENTRY_POINT(vkFreeDescriptorSets, true)
VULKAN_DEVICE_ENTRY_POINT(vkUpdateDescriptorSets, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateFramebuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyFramebuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateRenderPass, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyRenderPass, true)
VULKAN_DEVICE_ENTRY_POINT(vkGetRenderAreaGranularity, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateCommandPool, true)
VULKAN_DEVICE_ENTRY_POINT(vkDestroyCommandPool, true)
VULKAN_DEVICE_ENTRY_POINT(vkResetCommandPool, true)
VULKAN_DEVICE_ENTRY_POINT(vkAllocateCommandBuffers, true)
VULKAN_DEVICE_ENTRY_POINT(vkFreeCommandBuffers, true)
VULKAN_DEVICE_ENTRY_POINT(vkBeginCommandBuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkEndCommandBuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkResetCommandBuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdBindPipeline, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdSetViewport, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdSetScissor, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdSetLineWidth, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdSetDepthBias, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdSetBlendConstants, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdSetDepthBounds, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdSetStencilCompareMask, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdSetStencilWriteMask, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdSetStencilReference, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdBindDescriptorSets, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdBindIndexBuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdBindVertexBuffers, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdDraw, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdDrawIndexed, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdDrawIndirect, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdDrawIndexedIndirect, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdDispatch, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdDispatchIndirect, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdCopyBuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdCopyImage, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdBlitImage, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdCopyBufferToImage, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdCopyImageToBuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdUpdateBuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdFillBuffer, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdClearColorImage, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdClearDepthStencilImage, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdClearAttachments, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdResolveImage, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdSetEvent, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdResetEvent, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdWaitEvents, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdPipelineBarrier, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdBeginQuery, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdEndQuery, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdResetQueryPool, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdWriteTimestamp, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdCopyQueryPoolResults, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdPushConstants, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdBeginRenderPass, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdNextSubpass, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdEndRenderPass, true)
VULKAN_DEVICE_ENTRY_POINT(vkCmdExecuteCommands, true)
VULKAN_DEVICE_ENTRY_POINT(vkCreateSwapchainKHR, false)
VULKAN_DEVICE_ENTRY_POINT(vkDestroySwapchainKHR, false)
VULKAN_DEVICE_ENTRY_POINT(vkGetSwapchainImagesKHR, false)