summaryrefslogtreecommitdiff
path: root/engine/render/vulkan
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--engine/render/vulkan/context.c (renamed from render/vulkan/context.c)0
-rw-r--r--engine/render/vulkan/context.h (renamed from render/vulkan/context.h)0
-rw-r--r--engine/render/vulkan/device.c (renamed from render/vulkan/device.c)120
-rw-r--r--engine/render/vulkan/device.h (renamed from render/vulkan/device.h)2
-rw-r--r--engine/render/vulkan/fence.c (renamed from render/vulkan/fence.c)0
-rw-r--r--engine/render/vulkan/fence.h (renamed from render/vulkan/fence.h)0
-rw-r--r--engine/render/vulkan/framebuffer.c (renamed from render/vulkan/framebuffer.c)0
-rw-r--r--engine/render/vulkan/framebuffer.h (renamed from render/vulkan/framebuffer.h)0
-rw-r--r--engine/render/vulkan/image.c (renamed from render/vulkan/image.c)0
-rw-r--r--engine/render/vulkan/image.h (renamed from render/vulkan/image.h)0
-rw-r--r--engine/render/vulkan/renderer.c (renamed from render/vulkan/renderer.c)18
-rw-r--r--engine/render/vulkan/renderpass.c (renamed from render/vulkan/renderpass.c)4
-rw-r--r--engine/render/vulkan/renderpass.h (renamed from render/vulkan/renderpass.h)0
-rw-r--r--engine/render/vulkan/swapchain.c (renamed from render/vulkan/swapchain.c)8
-rw-r--r--engine/render/vulkan/swapchain.h (renamed from render/vulkan/swapchain.h)0
-rw-r--r--engine/render/vulkan/vk_types.h (renamed from render/vulkan/vk_types.h)25
-rw-r--r--engine/render/vulkan/vkassert.h (renamed from render/vulkan/vkassert.h)0
17 files changed, 137 insertions, 40 deletions
diff --git a/render/vulkan/context.c b/engine/render/vulkan/context.c
index 1282706..1282706 100644
--- a/render/vulkan/context.c
+++ b/engine/render/vulkan/context.c
diff --git a/render/vulkan/context.h b/engine/render/vulkan/context.h
index 15817e8..15817e8 100644
--- a/render/vulkan/context.h
+++ b/engine/render/vulkan/context.h
diff --git a/render/vulkan/device.c b/engine/render/vulkan/device.c
index 583fb54..11d9433 100644
--- a/render/vulkan/device.c
+++ b/engine/render/vulkan/device.c
@@ -78,7 +78,7 @@ int _query_comp_index(int num_props, VkQueueFamilyProperties *qfam_props) {
int _query_pres_index(int num_props, VkQueueFamilyProperties *qfam_props, VkPhysicalDevice pdev, VkSurfaceKHR surface) {
VkBool32 present_bit;
for (int i = 0; i < num_props; i++) {
- vkGetPhysicalDeviceSurfaceSupportKHR(pdev, 0, surface, &present_bit);
+ vkGetPhysicalDeviceSurfaceSupportKHR(pdev, i, surface, &present_bit);
if (present_bit != VK_FALSE)
pres_qfam = i;
}
@@ -124,15 +124,47 @@ VkPhysicalDevice _select_pdev(VkInstance instance, VkSurfaceKHR surface) {
return NULL;
}
-void _create_queue(vkdev_t *dev, int qfam_index, int queue_index) {
- vkGetDeviceQueue(dev->ldev, qfam_index, queue_index, &dev->queues[qfam_index].handle);
- if (dev->queues[qfam_index].handle == NULL) {
+void _create_queue(vkdev_t *dev, int qfam_type, int qfam_index, int queue_index) {
+ VkQueue *queue_arr;
+ int num_queues;
+ switch (qfam_type) {
+ case QFAM_TYPE_GRAPHICS:
+ dev->num_gfx_queues++;
+ num_queues = dev->num_gfx_queues;
+ dev->gfx_queues = rune_realloc(dev->gfx_queues, sizeof(VkQueue)*num_queues);
+ queue_arr = dev->gfx_queues;
+ break;
+ case QFAM_TYPE_TRANSFER:
+ dev->num_tsfr_queues++;
+ num_queues = dev->num_tsfr_queues;
+ dev->gfx_queues = rune_realloc(dev->tsfr_queues, sizeof(VkQueue)*num_queues);
+ queue_arr = dev->tsfr_queues;
+ break;
+ case QFAM_TYPE_COMPUTE:
+ dev->num_comp_queues++;
+ num_queues = dev->num_comp_queues;
+ dev->gfx_queues = rune_realloc(dev->comp_queues, sizeof(VkQueue)*num_queues);
+ queue_arr = dev->comp_queues;
+ break;
+ case QFAM_TYPE_PRESENT:
+ if (dev->pres_queue != NULL)
+ rune_free(dev->pres_queue);
+ dev->pres_queue = rune_alloc(sizeof(VkQueue));
+ queue_arr = dev->pres_queue;
+ break;
+ default:
+ log_output(LOG_FATAL, "Requested unknown queue type");
+ rune_abort();
+ }
+
+ vkGetDeviceQueue(dev->ldev, qfam_index, queue_index, &queue_arr[num_queues-1]);
+ if (queue_arr[num_queues-1] == NULL) {
log_output(LOG_FATAL, "Error creating required Vulkan queue");
rune_abort();
}
}
-vkdev_t* create_vkdev(VkInstance instance, VkSurfaceKHR surface) {
+vkdev_t* create_vkdev(VkInstance instance, VkSurfaceKHR surface, int num_gfx, int num_tsfr, int num_comp, int presentable) {
VkPhysicalDevice pdev = _select_pdev(instance, surface);
if (pdev == NULL) {
log_output(LOG_FATAL, "No device meets minimum requirements for rendering");
@@ -141,22 +173,58 @@ vkdev_t* create_vkdev(VkInstance instance, VkSurfaceKHR surface) {
vkdev_t *dev = rune_calloc(0, sizeof(vkdev_t));
dev->pdev = pdev;
+ dev->gfx_qfam = gfx_qfam;
+ dev->tsfr_qfam = tsfr_qfam;
+ dev->comp_qfam = comp_qfam;
+ dev->pres_qfam = pres_qfam;
- dev->queues[0].qfam = gfx_qfam;
- dev->queues[1].qfam = tsfr_qfam;
- dev->queues[2].qfam = comp_qfam;
- dev->queues[3].qfam = 0;
+ if (num_gfx > 0 && gfx_qfam == -1) {
+ log_output(LOG_FATAL, "Requested graphics queues but none found on device");
+ rune_abort();
+ }
+ if (num_tsfr > 0 && tsfr_qfam == -1) {
+ log_output(LOG_FATAL, "Requested transfer queues but none found on device");
+ rune_abort();
+ }
+ if (num_comp > 0 && comp_qfam == -1) {
+ log_output(LOG_FATAL, "Requested compute queues but none found on device");
+ rune_abort();
+ }
+ if (presentable == 1 && pres_qfam == -1) {
+ log_output(LOG_FATAL, "Requested presentation queue but none found on device");
+ rune_abort();
+ }
- float queue_priority = 1.0f;
- VkDeviceQueueCreateInfo qcinfos[3];
- for (int i = 0; i < 3; i++) {
+ int num_total = num_gfx + num_tsfr + num_comp + presentable;
+ int index = 0;
+ static const float queue_priority = 1.0f;
+ VkDeviceQueueCreateInfo *qcinfos = rune_alloc(sizeof(VkDeviceQueueCreateInfo)*num_total);
+ for (int i = 0; i < index+num_gfx; i++) {
qcinfos[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
qcinfos[i].pNext = NULL;
qcinfos[i].flags = 0;
- qcinfos[i].queueFamilyIndex = dev->queues[i].qfam;
+ qcinfos[i].queueFamilyIndex = gfx_qfam;
qcinfos[i].queueCount = 1;
qcinfos[i].pQueuePriorities = &queue_priority;
}
+ //index += num_gfx;
+ //for (int i = index; i < index+num_tsfr; i++) {
+ // qcinfos[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+ // qcinfos[i].pNext = NULL;
+ // qcinfos[i].flags = 0;
+ // qcinfos[i].queueFamilyIndex = tsfr_qfam;
+ // qcinfos[i].queueCount = 1;
+ // qcinfos[i].pQueuePriorities = &queue_priority;
+ //}
+ //index += num_tsfr;
+ //for (int i = index; i < index+num_comp; i++) {
+ // qcinfos[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+ // qcinfos[i].pNext = NULL;
+ // qcinfos[i].flags = 0;
+ // qcinfos[i].queueFamilyIndex = comp_qfam;
+ // qcinfos[i].queueCount = 1;
+ // qcinfos[i].pQueuePriorities = &queue_priority;
+ //}
struct vkdev_data pdata;
_query_pdev_data(pdev, &pdata);
@@ -165,7 +233,7 @@ vkdev_t* create_vkdev(VkInstance instance, VkSurfaceKHR surface) {
dcinfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
dcinfo.pNext = NULL;
dcinfo.flags = 0;
- dcinfo.queueCreateInfoCount = 3;
+ dcinfo.queueCreateInfoCount = num_total;
dcinfo.pQueueCreateInfos = qcinfos;
dcinfo.enabledLayerCount = 0;
dcinfo.ppEnabledLayerNames = NULL;
@@ -174,26 +242,34 @@ vkdev_t* create_vkdev(VkInstance instance, VkSurfaceKHR surface) {
dcinfo.ppEnabledExtensionNames = &ext_names;
dcinfo.pEnabledFeatures = &pdata.pdev_feats;
vkassert(vkCreateDevice(dev->pdev, &dcinfo, NULL, &dev->ldev));
+ rune_free(qcinfos);
- for (uint32_t i = 0; i < 3; i++)
- _create_queue(dev, i, 0);
-
- // FIXME: This is a dirty hack and should be fixed
- dev->queues[3].handle = dev->queues[0].handle;
+ for (int i = 0; i < num_gfx; i++)
+ _create_queue(dev, QFAM_TYPE_GRAPHICS, gfx_qfam, i);
+ for (int i = 0; i < num_tsfr; i++)
+ _create_queue(dev, QFAM_TYPE_TRANSFER, tsfr_qfam, i);
+ for (int i = 0; i < num_comp; i++)
+ _create_queue(dev, QFAM_TYPE_COMPUTE, comp_qfam, i);
VkCommandPoolCreateInfo pcinfo;
pcinfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
pcinfo.pNext = NULL;
pcinfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
- pcinfo.queueFamilyIndex = dev->queues[0].qfam;
- vkassert(vkCreateCommandPool(dev->ldev, &pcinfo, NULL, &dev->cmd_pool));
+ pcinfo.queueFamilyIndex = gfx_qfam;
+ vkassert(vkCreateCommandPool(dev->ldev, &pcinfo, NULL, &dev->gfx_cmd_pool));
+ pcinfo.queueFamilyIndex = tsfr_qfam;
+ vkassert(vkCreateCommandPool(dev->ldev, &pcinfo, NULL, &dev->tsfr_cmd_pool));
+ pcinfo.queueFamilyIndex = comp_qfam;
+ vkassert(vkCreateCommandPool(dev->ldev, &pcinfo, NULL, &dev->comp_cmd_pool));
log_output(LOG_DEBUG, "Initialized new logical device");
return dev;
}
void destroy_vkdev(vkdev_t *dev) {
- vkDestroyCommandPool(dev->ldev, dev->cmd_pool, NULL);
+ vkDestroyCommandPool(dev->ldev, dev->gfx_cmd_pool, NULL);
+ vkDestroyCommandPool(dev->ldev, dev->tsfr_cmd_pool, NULL);
+ vkDestroyCommandPool(dev->ldev, dev->comp_cmd_pool, NULL);
vkDestroyDevice(dev->ldev, NULL);
rune_free(dev);
}
diff --git a/render/vulkan/device.h b/engine/render/vulkan/device.h
index b375c5b..3dab471 100644
--- a/render/vulkan/device.h
+++ b/engine/render/vulkan/device.h
@@ -24,7 +24,7 @@
#include "vk_types.h"
-vkdev_t* create_vkdev(VkInstance instance, VkSurfaceKHR surface);
+vkdev_t* create_vkdev(VkInstance instance, VkSurfaceKHR surface, int num_gfx, int num_tsfr, int num_comp, int presentable);
void destroy_vkdev(vkdev_t *dev);
void get_swapchain_data(vkdev_t *dev, VkSurfaceKHR *surface);
diff --git a/render/vulkan/fence.c b/engine/render/vulkan/fence.c
index cee022e..cee022e 100644
--- a/render/vulkan/fence.c
+++ b/engine/render/vulkan/fence.c
diff --git a/render/vulkan/fence.h b/engine/render/vulkan/fence.h
index 49a04fe..49a04fe 100644
--- a/render/vulkan/fence.h
+++ b/engine/render/vulkan/fence.h
diff --git a/render/vulkan/framebuffer.c b/engine/render/vulkan/framebuffer.c
index 697bbb9..697bbb9 100644
--- a/render/vulkan/framebuffer.c
+++ b/engine/render/vulkan/framebuffer.c
diff --git a/render/vulkan/framebuffer.h b/engine/render/vulkan/framebuffer.h
index dbf914d..dbf914d 100644
--- a/render/vulkan/framebuffer.h
+++ b/engine/render/vulkan/framebuffer.h
diff --git a/render/vulkan/image.c b/engine/render/vulkan/image.c
index 0334e94..0334e94 100644
--- a/render/vulkan/image.c
+++ b/engine/render/vulkan/image.c
diff --git a/render/vulkan/image.h b/engine/render/vulkan/image.h
index 067025d..067025d 100644
--- a/render/vulkan/image.h
+++ b/engine/render/vulkan/image.h
diff --git a/render/vulkan/renderer.c b/engine/render/vulkan/renderer.c
index 679abef..f02d84f 100644
--- a/render/vulkan/renderer.c
+++ b/engine/render/vulkan/renderer.c
@@ -123,7 +123,11 @@ int _init_vulkan(window_t *window) {
}
context->dev = create_vkdev(context->instance,
- context->surface->handle);
+ context->surface->handle,
+ 1,
+ 1,
+ 1,
+ 1);
if (context->dev == NULL)
return -1;
@@ -238,11 +242,13 @@ int _end_frame(float time) {
*img_in_flight = context->fences_in_flight[context->swapchain->frame];
fence_unlock(*img_in_flight, context->dev);
- cmdbuf_submit(cmdbuf,
- &context->queue_semaphores[context->swapchain->frame],
- &context->image_semaphores[context->swapchain->frame],
- context->dev->queues[0].handle,
- (*img_in_flight)->handle);
+ for (int i = 0; i < context->dev->num_gfx_queues; i++) {
+ cmdbuf_submit(cmdbuf,
+ &context->queue_semaphores[context->swapchain->frame],
+ &context->image_semaphores[context->swapchain->frame],
+ context->dev->gfx_queues[i],
+ (*img_in_flight)->handle);
+ }
vkswapchain_present(context->swapchain,
context->dev,
diff --git a/render/vulkan/renderpass.c b/engine/render/vulkan/renderpass.c
index 981039a..e1e8743 100644
--- a/render/vulkan/renderpass.c
+++ b/engine/render/vulkan/renderpass.c
@@ -29,7 +29,7 @@ vkcmdbuffer_t* create_vkcmdbuffer(vkdev_t *dev, int primary) {
VkCommandBufferAllocateInfo ainfo;
ainfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
ainfo.pNext = NULL;
- ainfo.commandPool = dev->cmd_pool;
+ ainfo.commandPool = dev->gfx_cmd_pool;
if (primary == 1)
ainfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
else
@@ -42,7 +42,7 @@ vkcmdbuffer_t* create_vkcmdbuffer(vkdev_t *dev, int primary) {
}
void destroy_vkcmdbuffer(vkcmdbuffer_t *cmdbuffer, vkdev_t *dev) {
- vkFreeCommandBuffers(dev->ldev, dev->cmd_pool, 1, &cmdbuffer->handle);
+ vkFreeCommandBuffers(dev->ldev, dev->gfx_cmd_pool, 1, &cmdbuffer->handle);
rune_free(cmdbuffer);
}
diff --git a/render/vulkan/renderpass.h b/engine/render/vulkan/renderpass.h
index 1524438..1524438 100644
--- a/render/vulkan/renderpass.h
+++ b/engine/render/vulkan/renderpass.h
diff --git a/render/vulkan/swapchain.c b/engine/render/vulkan/swapchain.c
index 055d36f..36899de 100644
--- a/render/vulkan/swapchain.c
+++ b/engine/render/vulkan/swapchain.c
@@ -47,6 +47,8 @@ vkswapchain_t* create_swapchain(vksurface_t *surface, vkdev_t *dev) {
VkSwapchainCreateInfoKHR cinfo;
cinfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
+ cinfo.pNext = NULL;
+ cinfo.flags = 0;
cinfo.surface = surface->handle;
cinfo.minImageCount = img_count;
cinfo.imageFormat = swapchain->format_khr.format;
@@ -59,8 +61,8 @@ vkswapchain_t* create_swapchain(vksurface_t *surface, vkdev_t *dev) {
cinfo.presentMode = VK_PRESENT_MODE_MAILBOX_KHR;
cinfo.clipped = VK_TRUE;
cinfo.oldSwapchain = NULL;
- if (dev->queues[0].qfam != dev->queues[3].qfam) {
- uint32_t qfams[] = {dev->queues[0].qfam, dev->queues[3].qfam};
+ if (dev->gfx_qfam != dev->pres_qfam) {
+ uint32_t qfams[] = {dev->gfx_qfam, dev->pres_qfam};
cinfo.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
cinfo.queueFamilyIndexCount = 2;
cinfo.pQueueFamilyIndices = qfams;
@@ -140,7 +142,7 @@ void vkswapchain_present(vkswapchain_t *swapchain, vkdev_t *dev, VkSemaphore *re
pinfo.pImageIndices = img_index;
pinfo.pResults = NULL;
- VkResult res = vkQueuePresentKHR(dev->queues[3].handle, &pinfo);
+ 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)
diff --git a/render/vulkan/swapchain.h b/engine/render/vulkan/swapchain.h
index 7c2e2a5..7c2e2a5 100644
--- a/render/vulkan/swapchain.h
+++ b/engine/render/vulkan/swapchain.h
diff --git a/render/vulkan/vk_types.h b/engine/render/vulkan/vk_types.h
index c7610c9..2011771 100644
--- a/render/vulkan/vk_types.h
+++ b/engine/render/vulkan/vk_types.h
@@ -27,10 +27,10 @@
#include <GLFW/glfw3.h>
#include <cglm/cglm.h>
-typedef struct vkqueue {
- uint32_t qfam;
- VkQueue handle;
-} vkqueue_t;
+#define QFAM_TYPE_GRAPHICS 1
+#define QFAM_TYPE_TRANSFER 2
+#define QFAM_TYPE_COMPUTE 3
+#define QFAM_TYPE_PRESENT 4
typedef struct vksurface {
VkSurfaceKHR handle;
@@ -93,8 +93,21 @@ typedef struct vkdev {
VkPhysicalDevice pdev;
VkDevice ldev;
vkswapchain_data_t scdata;
- vkqueue_t queues[4];
- VkCommandPool cmd_pool;
+ VkQueue *gfx_queues;
+ int num_gfx_queues;
+ int gfx_qfam;
+ VkQueue *tsfr_queues;
+ int num_tsfr_queues;
+ int tsfr_qfam;
+ VkQueue *comp_queues;
+ int num_comp_queues;
+ int comp_qfam;
+ VkQueue *pres_queue;
+ int pres_qfam;
+ VkCommandPool gfx_cmd_pool;
+ VkCommandPool tsfr_cmd_pool;
+ VkCommandPool comp_cmd_pool;
+ VkCommandPool pres_cmd_pool;
VkFormat depth_format;
} vkdev_t;
diff --git a/render/vulkan/vkassert.h b/engine/render/vulkan/vkassert.h
index ca0a89d..ca0a89d 100644
--- a/render/vulkan/vkassert.h
+++ b/engine/render/vulkan/vkassert.h