From 9843f53cde2ec29d199b20f3f955cc6cf33edf9f Mon Sep 17 00:00:00 2001 From: Ivan Avdeev Date: Mon, 9 Oct 2023 14:48:50 -0400 Subject: [PATCH] vk: rt: recreate images on format change --- ref/vk/vk_image.c | 2 ++ ref/vk/vk_image.h | 1 + ref/vk/vk_rtx.c | 10 ++++++---- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ref/vk/vk_image.c b/ref/vk/vk_image.c index 1635e6e3..6fc9f631 100644 --- a/ref/vk/vk_image.c +++ b/ref/vk/vk_image.c @@ -119,6 +119,8 @@ r_vk_image_t R_VkImageCreate(const r_vk_image_create_t *create) { XVK_CHECK(vkCreateImage(vk_core.device, &ici, NULL, &image.image)); + image.format = ici.format; + if (create->debug_name) SET_DEBUG_NAME(image.image, VK_OBJECT_TYPE_IMAGE, create->debug_name); diff --git a/ref/vk/vk_image.h b/ref/vk/vk_image.h index 392d9f4f..8231cf34 100644 --- a/ref/vk/vk_image.h +++ b/ref/vk/vk_image.h @@ -13,6 +13,7 @@ typedef struct r_vk_image_s { uint32_t width, height; int mips; + VkFormat format; } r_vk_image_t; enum { diff --git a/ref/vk/vk_rtx.c b/ref/vk/vk_rtx.c index d45c760c..168d3764 100644 --- a/ref/vk/vk_rtx.c +++ b/ref/vk/vk_rtx.c @@ -390,10 +390,11 @@ static void reloadMainpipe(void) { for (int i = 0; i < newpipe->resources_count; ++i) { const vk_meatpipe_resource_t *mr = newpipe->resources + i; - DEBUG("res %d/%d: %s descriptor=%u count=%d flags=[%c%c] image_format=%u", + DEBUG("res %d/%d: %s descriptor=%u count=%d flags=[%c%c] image_format=(%s)%u", i, newpipe->resources_count, mr->name, mr->descriptor_type, mr->count, (mr->flags & MEATPIPE_RES_WRITE) ? 'W' : ' ', (mr->flags & MEATPIPE_RES_CREATE) ? 'C' : ' ', + R_VkFormatName(mr->image_format), mr->image_format); const qboolean create = !!(mr->flags & MEATPIPE_RES_CREATE); @@ -418,7 +419,10 @@ static void reloadMainpipe(void) { newpipe_out = res; if (create) { - if (res->image.image == VK_NULL_HANDLE) { + if (res->image.image == VK_NULL_HANDLE || mr->image_format != res->image.format) { + if (res->image.image != VK_NULL_HANDLE) { + R_VkImageDestroy(&res->image); + } const r_vk_image_create_t create = { .debug_name = mr->name, .width = FRAME_WIDTH, @@ -434,8 +438,6 @@ static void reloadMainpipe(void) { }; res->image = R_VkImageCreate(&create); Q_strncpy(res->name, mr->name, sizeof(res->name)); - } else { - // TODO if (mr->image_format != res->image.format) { S_ERROR and goto fail } } }