From 2965bdde04eaa0012b29695aa015c354deb30bed Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Mon, 28 Oct 2024 15:52:52 -0500 Subject: render: move get_vkerr_str into vkassert.h Move get_vkerr_str into vkassert.h and use its output in the vkassert function. This reduces the need for an error message argument when calling vkassert and makes error messages in logs consistent across the entire Vulkan renderer. Signed-off-by: Danny Holman --- render/vulkan/context.c | 36 +++--------------------------------- render/vulkan/device.c | 8 ++++---- render/vulkan/fence.c | 4 ++-- render/vulkan/framebuffer.c | 2 +- render/vulkan/image.c | 8 ++++---- render/vulkan/renderpass.c | 13 +++++++------ render/vulkan/swapchain.c | 15 +++++++++------ render/vulkan/vkassert.h | 36 ++++++++++++++++++++++++++++++++++-- 8 files changed, 64 insertions(+), 58 deletions(-) diff --git a/render/vulkan/context.c b/render/vulkan/context.c index afa1648..eaf4cf3 100644 --- a/render/vulkan/context.c +++ b/render/vulkan/context.c @@ -1,40 +1,10 @@ #include "context.h" +#include "vkassert.h" #include #include #include #include -char* _get_vkerr_str(VkResult res) { - char *ret; - switch (res) { - case VK_SUCCESS: - ret = "SUCCESS"; - break; - case VK_ERROR_OUT_OF_HOST_MEMORY: - ret = "OUT OF HOST MEMORY"; - break; - case VK_ERROR_OUT_OF_DEVICE_MEMORY: - ret = "OUT OF DEVICE MEMORY"; - break; - case VK_ERROR_INITIALIZATION_FAILED: - ret = "INITIALIZATION FAILED"; - break; - case VK_ERROR_LAYER_NOT_PRESENT: - ret = "VALIDATION LAYER NOT PRESENT"; - break; - case VK_ERROR_EXTENSION_NOT_PRESENT: - ret = "EXTENSION NOT PRESENT"; - break; - case VK_ERROR_INCOMPATIBLE_DRIVER: - ret = "INCOMPATIBLE DRIVER"; - break; - default: - ret = "UNKNOWN RESULT"; - break; - } - return strdup(ret); -} - VKAPI_ATTR VkBool32 VKAPI_CALL _vulkan_db_callback( VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, VkDebugUtilsMessageTypeFlagsEXT message_types, @@ -79,7 +49,7 @@ int _init_vkdebugger(struct vkcontext *context) { VkResult res; res = func(context->instance, &dbinfo, NULL, &context->db_messenger); if (res != VK_SUCCESS) { - char *err_str = _get_vkerr_str(res); + char *err_str = get_vkerr_str(res); log_output(LOG_ERROR, "Cannot create a Vulkan debug session: %s", err_str); free(err_str); return -1; @@ -107,7 +77,7 @@ struct vkcontext* create_vkcontext(struct vklayer_container *vklayers, struct ex VkResult res; res = vkCreateInstance(&cinfo, NULL, &ret->instance); if (res != VK_SUCCESS) { - char *err_str = _get_vkerr_str(res); + char *err_str = get_vkerr_str(res); log_output(LOG_FATAL, "Cannot create a Vulkan instance: %s", err_str); free(err_str); rune_free(ret); diff --git a/render/vulkan/device.c b/render/vulkan/device.c index 02cf246..3aef3a1 100644 --- a/render/vulkan/device.c +++ b/render/vulkan/device.c @@ -94,8 +94,8 @@ struct vkdev* create_vkdev(VkInstance instance, VkSurfaceKHR surface) { int num_qfams = _query_qfam_data(surface, pdevs[selected_pdev], &qfam_props); VkBool32 present_support; for (int i = 0; i < num_qfams; i++) { - vkassert(vkGetPhysicalDeviceSurfaceSupportKHR(dev->pdev, i, surface, &present_support), "Error retrieving present queue support"); - if (present_support == VK_TRUE) + vkassert(vkGetPhysicalDeviceSurfaceSupportKHR(dev->pdev, i, surface, &present_support)); + if (present_support == VK_TRUE && i != dev->gfx_index) { dev->pres_index = i; } dev->gfx_index = _get_qfam_index(num_qfams, VK_QUEUE_GRAPHICS_BIT, qfam_props); @@ -140,7 +140,7 @@ struct vkdev* create_vkdev(VkInstance instance, VkSurfaceKHR surface) { const char *ext_names = VK_KHR_SWAPCHAIN_EXTENSION_NAME; dcinfo.ppEnabledExtensionNames = &ext_names; dcinfo.pEnabledFeatures = &pdata.pdev_feats; - vkassert(vkCreateDevice(dev->pdev, &dcinfo, NULL, &dev->ldev), "Error creating Vulkan logical device"); + vkassert(vkCreateDevice(dev->pdev, &dcinfo, NULL, &dev->ldev)); vkGetDeviceQueue(dev->ldev, dev->gfx_index, 0, &dev->gfx_queue); vkGetDeviceQueue(dev->ldev, dev->tsfr_index, 0, &dev->tsfr_queue); @@ -152,7 +152,7 @@ struct vkdev* create_vkdev(VkInstance instance, VkSurfaceKHR surface) { pcinfo.pNext = NULL; pcinfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; pcinfo.queueFamilyIndex = dev->gfx_index; - vkassert(vkCreateCommandPool(dev->ldev, &pcinfo, NULL, &dev->cmd_pool), "Error creating Vulkan command pool"); + vkassert(vkCreateCommandPool(dev->ldev, &pcinfo, NULL, &dev->cmd_pool)); log_output(LOG_DEBUG, "Initialized new logical device"); return dev; diff --git a/render/vulkan/fence.c b/render/vulkan/fence.c index 6d869c9..538bc9d 100644 --- a/render/vulkan/fence.c +++ b/render/vulkan/fence.c @@ -13,7 +13,7 @@ struct vkfence* create_vkfence(struct vkdev *dev, uint8_t signal) { fcinfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; else fcinfo.flags = 0; - vkassert(vkCreateFence(dev->ldev, &fcinfo, NULL, &ret->handle), "Failed to create fence"); + vkassert(vkCreateFence(dev->ldev, &fcinfo, NULL, &ret->handle)); return ret; } @@ -58,6 +58,6 @@ void fence_unlock(struct vkfence *fence, struct vkdev *dev) { if (fence->signal == 0) return; - vkassert(vkResetFences(dev->ldev, 1, &fence->handle), "Cannot reset Vulkan fence"); + vkassert(vkResetFences(dev->ldev, 1, &fence->handle)); fence->signal = 1; } diff --git a/render/vulkan/framebuffer.c b/render/vulkan/framebuffer.c index 36d90c0..755af29 100644 --- a/render/vulkan/framebuffer.c +++ b/render/vulkan/framebuffer.c @@ -21,7 +21,7 @@ struct vkframebuffer* create_vkframebuffer(struct vkdev *dev, struct vkrendpass fbinfo.width = width; fbinfo.height = height; fbinfo.layers = 1; - vkassert(vkCreateFramebuffer(dev->ldev, &fbinfo, NULL, &ret->handle), "Failed to create Vulkan framebuffer"); + vkassert(vkCreateFramebuffer(dev->ldev, &fbinfo, NULL, &ret->handle)); return ret; } diff --git a/render/vulkan/image.c b/render/vulkan/image.c index 9142f9e..d82b809 100644 --- a/render/vulkan/image.c +++ b/render/vulkan/image.c @@ -14,7 +14,7 @@ int _create_image_view(struct vkimage *image, struct vkdev *dev, VkFormat format vcinfo.subresourceRange.levelCount = 1; vcinfo.subresourceRange.baseArrayLayer = 0; vcinfo.subresourceRange.layerCount = 1; - vkassert(vkCreateImageView(dev->ldev, &vcinfo, NULL, &image->view), "Failed to create image view"); + vkassert(vkCreateImageView(dev->ldev, &vcinfo, NULL, &image->view)); } struct vkimage* create_vkimage(struct vkdev *dev, VkFormat format, uint32_t width, uint32_t height, uint32_t usage, uint32_t mem_flags, uint32_t aflags, int create_view) { @@ -38,7 +38,7 @@ struct vkimage* create_vkimage(struct vkdev *dev, VkFormat format, uint32_t widt icinfo.usage = usage; icinfo.samples = VK_SAMPLE_COUNT_1_BIT; icinfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - vkassert(vkCreateImage(dev->ldev, &icinfo, NULL, &ret->handle), "Failed to create image"); + vkassert(vkCreateImage(dev->ldev, &icinfo, NULL, &ret->handle)); VkMemoryRequirements mem_req; vkGetImageMemoryRequirements(dev->ldev, ret->handle, &mem_req); @@ -51,8 +51,8 @@ struct vkimage* create_vkimage(struct vkdev *dev, VkFormat format, uint32_t widt mainfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; mainfo.allocationSize = mem_req.size; mainfo.memoryTypeIndex = mem_type; - vkassert(vkAllocateMemory(dev->ldev, &mainfo, NULL, &ret->memory), "Failed to allocate image memory"); - vkassert(vkBindImageMemory(dev->ldev, ret->handle, ret->memory, 0), "Failed to bind image memory"); + vkassert(vkAllocateMemory(dev->ldev, &mainfo, NULL, &ret->memory)); + vkassert(vkBindImageMemory(dev->ldev, ret->handle, ret->memory, 0)); if (create_view == 1) _create_image_view(ret, dev, format, aflags); diff --git a/render/vulkan/renderpass.c b/render/vulkan/renderpass.c index 59d1c26..9f89697 100644 --- a/render/vulkan/renderpass.c +++ b/render/vulkan/renderpass.c @@ -14,7 +14,7 @@ struct vkcmdbuffer* create_vkcmdbuffer(struct vkdev *dev, int primary) { else ainfo.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY; ainfo.commandBufferCount = 1; - vkassert(vkAllocateCommandBuffers(dev->ldev, &ainfo, &ret->handle), "Failed to initialize command buffer"); + vkassert(vkAllocateCommandBuffers(dev->ldev, &ainfo, &ret->handle)); ret->state = CMDBUF_READY; return ret; @@ -36,12 +36,12 @@ void cmdbuf_begin(struct vkcmdbuffer *cmdbuffer, int single, int rpass_cont, int binfo.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT; if (sim_use) binfo.flags |= VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT; - vkassert(vkBeginCommandBuffer(cmdbuffer->handle, &binfo), "Cannot record commands into command buffer"); + vkassert(vkBeginCommandBuffer(cmdbuffer->handle, &binfo)); cmdbuffer->state = CMDBUF_RECORD; } void cmdbuf_end(struct vkcmdbuffer *cmdbuffer) { - vkassert(vkEndCommandBuffer(cmdbuffer->handle), "Cannot end command buffer recording"); + vkassert(vkEndCommandBuffer(cmdbuffer->handle)); cmdbuffer->state = CMDBUF_ENDREC; } @@ -63,9 +63,9 @@ void cmdbuf_end_single_use(struct vkcmdbuffer *cmdbuffer, struct vkdev *dev, VkQ sinfo.pCommandBuffers = &cmdbuffer->handle; sinfo.signalSemaphoreCount = 0; sinfo.pSignalSemaphores = NULL; - vkassert(vkQueueSubmit(queue, 1, &sinfo, 0), "Cannot submit single use command buffer"); + vkassert(vkQueueSubmit(queue, 1, &sinfo, 0)); - vkassert(vkQueueWaitIdle(queue), "Error while waiting for Vulkan queue"); + vkassert(vkQueueWaitIdle(queue)); destroy_vkcmdbuffer(cmdbuffer, dev); } @@ -130,7 +130,7 @@ struct vkrendpass* create_vkrendpass(struct vkdev *dev, struct vkswapchain *swap rcinfo.pSubpasses = &subpass; rcinfo.dependencyCount = 1; rcinfo.pDependencies = &dep; - vkassert(vkCreateRenderPass(dev->ldev, &rcinfo, NULL, &ret->handle), "Failed to create renderpass"); + vkassert(vkCreateRenderPass(dev->ldev, &rcinfo, NULL, &ret->handle)); log_output(LOG_DEBUG, "Initialized renderpass"); return ret; @@ -153,6 +153,7 @@ void renderpass_begin(struct vkcmdbuffer *buf, struct vkrendpass *rendpass, VkFr VkRenderPassBeginInfo binfo; binfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + binfo.pNext = NULL; binfo.renderPass = rendpass->handle; binfo.framebuffer = framebuf; binfo.renderArea.offset.x = rendpass->area[0]; diff --git a/render/vulkan/swapchain.c b/render/vulkan/swapchain.c index 1ecb644..1247c9a 100644 --- a/render/vulkan/swapchain.c +++ b/render/vulkan/swapchain.c @@ -47,12 +47,12 @@ struct vkswapchain* create_swapchain(struct vksurface *surface, struct vkdev *de cinfo.queueFamilyIndexCount = 0; cinfo.pQueueFamilyIndices = 0; } - vkassert(vkCreateSwapchainKHR(dev->ldev, &cinfo, NULL, &swapchain->handle), "Failed to create swapchain"); - vkassert(vkGetSwapchainImagesKHR(dev->ldev, swapchain->handle, &swapchain->img_count, NULL), "Failed to aquire swapchain image count"); + vkassert(vkCreateSwapchainKHR(dev->ldev, &cinfo, NULL, &swapchain->handle)); + vkassert(vkGetSwapchainImagesKHR(dev->ldev, swapchain->handle, &swapchain->img_count, NULL)); swapchain->images = rune_alloc(sizeof(VkImage) * swapchain->img_count); swapchain->views = rune_alloc(sizeof(VkImageView) * swapchain->img_count); - vkassert(vkGetSwapchainImagesKHR(dev->ldev, swapchain->handle, &swapchain->img_count, swapchain->images), "Failed to aquire swapchain images"); + vkassert(vkGetSwapchainImagesKHR(dev->ldev, swapchain->handle, &swapchain->img_count, swapchain->images)); VkImageViewCreateInfo vcinfo; for (uint32_t i = 0; i < swapchain->img_count; i++) { @@ -65,7 +65,7 @@ struct vkswapchain* create_swapchain(struct vksurface *surface, struct vkdev *de vcinfo.subresourceRange.levelCount = 1; vcinfo.subresourceRange.baseArrayLayer = 0; vcinfo.subresourceRange.layerCount = 1; - vkassert(vkCreateImageView(dev->ldev, &vcinfo, NULL, &swapchain->views[i]), "Failed to create image view"); + vkassert(vkCreateImageView(dev->ldev, &vcinfo, NULL, &swapchain->views[i])); } if (get_depth_format(dev) == 0) { @@ -96,18 +96,21 @@ void destroy_swapchain(struct vkswapchain *swapchain, struct vkdev *dev) { } void vkswapchain_present(struct vkswapchain *swapchain, struct vkdev *dev) { - VkPresentInfoKHR pinfo = {VK_STRUCTURE_TYPE_PRESENT_INFO_KHR}; + VkPresentInfoKHR pinfo; + pinfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + pinfo.pNext = NULL; pinfo.waitSemaphoreCount = 1; pinfo.pWaitSemaphores = &swapchain->render_complete; pinfo.swapchainCount = 1; pinfo.pSwapchains = &swapchain->handle; pinfo.pImageIndices = &dev->pres_index; + pinfo.pResults = NULL; VkResult res = vkQueuePresentKHR(dev->pres_queue, &pinfo); if (res == VK_ERROR_OUT_OF_DATE_KHR || res == VK_SUBOPTIMAL_KHR) STUBBED("Recreate swapchain"); else if (res != VK_SUCCESS) - log_output(LOG_FATAL, "Cannot present swapchain image"); + log_output(LOG_ERROR, "Vulkan error: %s", get_vkerr_str(res)); swapchain->frame = (swapchain->frame + 1) % swapchain->max_frames; } diff --git a/render/vulkan/vkassert.h b/render/vulkan/vkassert.h index 393e2de..4d4f99b 100644 --- a/render/vulkan/vkassert.h +++ b/render/vulkan/vkassert.h @@ -4,10 +4,42 @@ #include #include #include +#include -static inline void vkassert(VkResult value, const char *str) { +static char* get_vkerr_str(VkResult res) { + char *ret; + switch (res) { + case VK_SUCCESS: + ret = "SUCCESS"; + break; + case VK_ERROR_OUT_OF_HOST_MEMORY: + ret = "OUT OF HOST MEMORY"; + break; + case VK_ERROR_OUT_OF_DEVICE_MEMORY: + ret = "OUT OF DEVICE MEMORY"; + break; + case VK_ERROR_INITIALIZATION_FAILED: + ret = "INITIALIZATION FAILED"; + break; + case VK_ERROR_LAYER_NOT_PRESENT: + ret = "VALIDATION LAYER NOT PRESENT"; + break; + case VK_ERROR_EXTENSION_NOT_PRESENT: + ret = "EXTENSION NOT PRESENT"; + break; + case VK_ERROR_INCOMPATIBLE_DRIVER: + ret = "INCOMPATIBLE DRIVER"; + break; + default: + ret = "UNKNOWN RESULT"; + break; + } + return strdup(ret); +} + +static inline void vkassert(VkResult value) { if (value != VK_SUCCESS) { - log_output(LOG_ERROR, "Vulkan assertion failed: %s", str); + log_output(LOG_FATAL, "Vulkan error: %s", get_vkerr_str(value)); rune_abort(); } } -- cgit v1.2.3