diff options
-rw-r--r-- | render/vulkan/context.c | 36 | ||||
-rw-r--r-- | render/vulkan/device.c | 8 | ||||
-rw-r--r-- | render/vulkan/fence.c | 4 | ||||
-rw-r--r-- | render/vulkan/framebuffer.c | 2 | ||||
-rw-r--r-- | render/vulkan/image.c | 8 | ||||
-rw-r--r-- | render/vulkan/renderpass.c | 13 | ||||
-rw-r--r-- | render/vulkan/swapchain.c | 15 | ||||
-rw-r--r-- | 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 <rune/core/logging.h> #include <rune/core/alloc.h> #include <stdlib.h> #include <string.h> -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 <rune/core/logging.h> #include <rune/core/abort.h> #include <vulkan/vulkan.h> +#include <string.h> -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(); } } |