diff options
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 |