summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--render/vulkan/context.c36
-rw-r--r--render/vulkan/device.c8
-rw-r--r--render/vulkan/fence.c4
-rw-r--r--render/vulkan/framebuffer.c2
-rw-r--r--render/vulkan/image.c8
-rw-r--r--render/vulkan/renderpass.c13
-rw-r--r--render/vulkan/swapchain.c15
-rw-r--r--render/vulkan/vkassert.h36
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();
}
}