From 22683d7d630a2b3448513c04f33f1eede50fbffb Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Wed, 9 Jun 2021 05:22:05 +0100 Subject: [PATCH] Remove MAX_SWAPCHAIN_IMAGES limit for XWayland A well-behaved Vulkan application should not care about the number of swapchain images exposed by vkGetSwapchainImagesKHR. In XWayland (right now), there is no IMMEDIATE mode, only MAILBOX, which is exposed as IMMEDIATE. However, this means that the max number of swapchain images exceeds what would normally be expected for typical IMMEDIATE implementations under X11. With this change I can run Quake 2 RTX under XWayland on my Radeon VII. This will also likely be needed by NVIDIA following the release of their 470 driver which enables [X]Wayland support. Signed-off-by: Joshua Ashton --- src/refresh/vkpt/draw.c | 7 +++++-- src/refresh/vkpt/main.c | 20 +++++++++++++++++--- src/refresh/vkpt/vkpt.h | 5 ++--- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/refresh/vkpt/draw.c b/src/refresh/vkpt/draw.c index 7b6c720d9..4cf8644d1 100644 --- a/src/refresh/vkpt/draw.c +++ b/src/refresh/vkpt/draw.c @@ -52,7 +52,7 @@ static VkPipelineLayout pipeline_layout_final_blit; static VkRenderPass render_pass_stretch_pic; static VkPipeline pipeline_stretch_pic; static VkPipeline pipeline_final_blit; -static VkFramebuffer framebuffer_stretch_pic[MAX_SWAPCHAIN_IMAGES]; +static VkFramebuffer* framebuffer_stretch_pic = NULL; static BufferResource_t buf_stretch_pic_queue[MAX_FRAMES_IN_FLIGHT]; static VkDescriptorSetLayout desc_set_layout_sbo; static VkDescriptorPool desc_pool_sbo; @@ -316,6 +316,9 @@ vkpt_draw_destroy_pipelines() for(int i = 0; i < qvk.num_swap_chain_images; i++) { vkDestroyFramebuffer(qvk.device, framebuffer_stretch_pic[i], NULL); } + free(framebuffer_stretch_pic); + framebuffer_stretch_pic = NULL; + return VK_SUCCESS; } @@ -465,7 +468,7 @@ vkpt_draw_create_pipelines() _VK(vkCreateGraphicsPipelines(qvk.device, VK_NULL_HANDLE, 1, &pipeline_info, NULL, &pipeline_final_blit)); ATTACH_LABEL_VARIABLE(pipeline_final_blit, PIPELINE); - + framebuffer_stretch_pic = malloc(qvk.num_swap_chain_images * sizeof(*framebuffer_stretch_pic)); for(int i = 0; i < qvk.num_swap_chain_images; i++) { VkImageView attachments[] = { qvk.swap_chain_image_views[i] diff --git a/src/refresh/vkpt/main.c b/src/refresh/vkpt/main.c index b2dcd7f48..b7b9ea59a 100644 --- a/src/refresh/vkpt/main.c +++ b/src/refresh/vkpt/main.c @@ -642,11 +642,11 @@ out:; } vkGetSwapchainImagesKHR(qvk.device, qvk.swap_chain, &qvk.num_swap_chain_images, NULL); - //qvk.swap_chain_images = malloc(qvk.num_swap_chain_images * sizeof(*qvk.swap_chain_images)); - assert(qvk.num_swap_chain_images < MAX_SWAPCHAIN_IMAGES); + assert(qvk.num_swap_chain_images); + qvk.swap_chain_images = malloc(qvk.num_swap_chain_images * sizeof(*qvk.swap_chain_images)); vkGetSwapchainImagesKHR(qvk.device, qvk.swap_chain, &qvk.num_swap_chain_images, qvk.swap_chain_images); - //qvk.swap_chain_image_views = malloc(qvk.num_swap_chain_images * sizeof(*qvk.swap_chain_image_views)); + qvk.swap_chain_image_views = malloc(qvk.num_swap_chain_images * sizeof(*qvk.swap_chain_image_views)); for(int i = 0; i < qvk.num_swap_chain_images; i++) { VkImageViewCreateInfo img_create_info = { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, @@ -672,6 +672,14 @@ out:; if(vkCreateImageView(qvk.device, &img_create_info, NULL, qvk.swap_chain_image_views + i) != VK_SUCCESS) { Com_EPrintf("error creating image view!"); + + free(qvk.swap_chain_image_views); + qvk.swap_chain_image_views = NULL; + + free(qvk.swap_chain_images); + qvk.swap_chain_images = NULL; + + qvk.num_swap_chain_images = 0; return 1; } } @@ -1495,6 +1503,12 @@ destroy_swapchain() vkDestroyImageView (qvk.device, qvk.swap_chain_image_views[i], NULL); qvk.swap_chain_image_views[i] = VK_NULL_HANDLE; } + free(qvk.swap_chain_image_views); + qvk.swap_chain_image_views = NULL; + + free(qvk.swap_chain_images); + qvk.swap_chain_images = NULL; + qvk.num_swap_chain_images = 0; vkDestroySwapchainKHR(qvk.device, qvk.swap_chain, NULL); diff --git a/src/refresh/vkpt/vkpt.h b/src/refresh/vkpt/vkpt.h index d89536887..f9a46d71e 100644 --- a/src/refresh/vkpt/vkpt.h +++ b/src/refresh/vkpt/vkpt.h @@ -140,7 +140,6 @@ enum QVK_SHADER_MODULES { }; #define MAX_FRAMES_IN_FLIGHT 2 -#define MAX_SWAPCHAIN_IMAGES 4 typedef struct cmd_buf_group_s { uint32_t count_per_frame; @@ -189,8 +188,8 @@ typedef struct QVK_s { uint32_t gpu_slice_width; uint32_t gpu_slice_width_prev; uint32_t num_swap_chain_images; - VkImage swap_chain_images[MAX_SWAPCHAIN_IMAGES]; - VkImageView swap_chain_image_views[MAX_SWAPCHAIN_IMAGES]; + VkImage* swap_chain_images; + VkImageView* swap_chain_image_views; qboolean use_khr_ray_tracing; qboolean use_ray_query;