vk: create unorm image view only if asked and needed

Do not create unorm image view:
- if not asked
- already has unorm format
- format has no meaningful unorm counterpart
This commit is contained in:
Ivan Avdeev 2023-10-10 12:18:58 -04:00
parent 7b69988e41
commit fc36fb7c13
2 changed files with 13 additions and 11 deletions

View File

@ -96,7 +96,12 @@ r_vk_image_t R_VkImageCreate(const r_vk_image_create_t *create) {
VkMemoryRequirements memreq;
const qboolean is_cubemap = !!(create->flags & kVkImageFlagIsCubemap);
const qboolean create_unorm = !!(create->flags & kVkImageFlagCreateUnormView);
const VkFormat unorm_format = unormFormatFor(create->format);
const qboolean create_unorm =
!!(create->flags & kVkImageFlagCreateUnormView)
&& unorm_format != VK_FORMAT_UNDEFINED
&& unorm_format != create->format;
VkImageCreateInfo ici = {
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
@ -150,16 +155,11 @@ r_vk_image_t R_VkImageCreate(const r_vk_image_create_t *create) {
SET_DEBUG_NAME(image.view, VK_OBJECT_TYPE_IMAGE_VIEW, create->debug_name);
if (create_unorm) {
// FIXME handle same formats: reuse the same image_view, destroy it properly, etc
ivci.format = unormFormatFor(ici.format);
if (ivci.format != VK_FORMAT_UNDEFINED) {
XVK_CHECK(vkCreateImageView(vk_core.device, &ivci, NULL, &image.view_unorm));
ivci.format = unorm_format;
XVK_CHECK(vkCreateImageView(vk_core.device, &ivci, NULL, &image.view_unorm));
if (create->debug_name)
SET_DEBUG_NAMEF(image.view_unorm, VK_OBJECT_TYPE_IMAGE_VIEW, "%s_unorm", create->debug_name);
} else {
WARN("There's no UNORM format for %s for image \"%s\"", R_VkFormatName(ici.format), create->debug_name);
}
if (create->debug_name)
SET_DEBUG_NAMEF(image.view_unorm, VK_OBJECT_TYPE_IMAGE_VIEW, "%s_unorm", create->debug_name);
}
}

View File

@ -729,7 +729,9 @@ static qboolean uploadTexture(vk_texture_t *tex, rgbdata_t *const *const layers,
if (vk_desc.next_free < MAX_TEXTURES-2) {
const int index = tex - vk_textures;
const VkDescriptorSet ds = vk_desc.sets[vk_desc.next_free++];
const VkDescriptorSet ds_unorm = colorspace_hint == kColorspaceGamma ? vk_desc.sets[vk_desc.next_free++] : VK_NULL_HANDLE;
const VkDescriptorSet ds_unorm =
(colorspace_hint == kColorspaceGamma && tex->vk.image.view_unorm != VK_NULL_HANDLE)
? vk_desc.sets[vk_desc.next_free++] : VK_NULL_HANDLE;
const VkDescriptorImageInfo dii = {
.imageView = tex->vk.image.view,