vk: better swizzling

- expand BC4 and BC5 compressed blocks
- negate alpha semantic
This commit is contained in:
Ivan Avdeev 2023-10-16 12:08:54 -04:00
parent d9a4d9d562
commit ee81a7228d
5 changed files with 35 additions and 6 deletions

View File

@ -68,7 +68,7 @@ r_vk_image_t R_VkImageCreate(const r_vk_image_create_t *create) {
XVK_CHECK(vkBindImageMemory(vk_core.device, image.image, image.devmem.device_memory, image.devmem.offset));
if (create->usage & usage_bits_implying_views) {
const qboolean has_alpha = !!(create->flags & kVkImageFlagHasAlpha);
const qboolean ignore_alpha = !!(create->flags & kVkImageFlagIgnoreAlpha) && !is_depth;
VkImageViewCreateInfo ivci = {
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
@ -80,8 +80,7 @@ r_vk_image_t R_VkImageCreate(const r_vk_image_create_t *create) {
.subresourceRange.levelCount = ici.mipLevels,
.subresourceRange.baseArrayLayer = 0,
.subresourceRange.layerCount = ici.arrayLayers,
// TODO component swizzling based on format, e.g. R8 -> RRRR
.components = (VkComponentMapping){0, 0, 0, (is_depth || has_alpha) ? 0 : VK_COMPONENT_SWIZZLE_ONE},
.components = componentMappingForFormat(ici.format, ignore_alpha),
};
XVK_CHECK(vkCreateImageView(vk_core.device, &ivci, NULL, &image.view));

View File

@ -17,7 +17,7 @@ typedef struct r_vk_image_s {
} r_vk_image_t;
enum {
kVkImageFlagHasAlpha = (1<<0),
kVkImageFlagIgnoreAlpha = (1<<0),
kVkImageFlagIsCubemap = (1<<1),
kVkImageFlagCreateUnormView = (1<<2),
};

View File

@ -438,3 +438,33 @@ static VkFormat unormFormatFor(VkFormat fmt) {
}
}
static VkComponentMapping componentMappingForFormat( VkFormat format, qboolean ignore_alpha ) {
VkComponentMapping map = {
VK_COMPONENT_SWIZZLE_IDENTITY,
VK_COMPONENT_SWIZZLE_IDENTITY,
VK_COMPONENT_SWIZZLE_IDENTITY,
VK_COMPONENT_SWIZZLE_IDENTITY,
};
switch ( format ) {
case VK_FORMAT_BC4_UNORM_BLOCK:
map.g = map.b = map.a = VK_COMPONENT_SWIZZLE_R;
break;
case VK_FORMAT_BC4_SNORM_BLOCK:
map.g = map.b = map.a = VK_COMPONENT_SWIZZLE_R;
break;
case VK_FORMAT_BC5_UNORM_BLOCK:
map.b = VK_COMPONENT_SWIZZLE_R;
map.a = VK_COMPONENT_SWIZZLE_G;
break;
case VK_FORMAT_BC5_SNORM_BLOCK:
map.b = VK_COMPONENT_SWIZZLE_R;
map.a = VK_COMPONENT_SWIZZLE_G;
break;
}
if (ignore_alpha)
map.a = VK_COMPONENT_SWIZZLE_ONE;
return map;
}

View File

@ -436,7 +436,7 @@ static void reloadMainpipe(void) {
// TODO figure out how to detect this need properly. prev_dest is not defined as "output"
//.usage = VK_IMAGE_USAGE_STORAGE_BIT | (output ? VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT : 0),
.usage = VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
.flags = kVkImageFlagHasAlpha,
.flags = 0,
};
res->image = R_VkImageCreate(&create);
Q_strncpy(res->name, mr->name, sizeof(res->name));

View File

@ -949,7 +949,7 @@ static qboolean uploadTexture(vk_texture_t *tex, rgbdata_t *const *const layers,
.tiling = VK_IMAGE_TILING_OPTIMAL,
.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
.flags = 0
| ((layers[0]->flags & IMAGE_HAS_ALPHA) ? kVkImageFlagHasAlpha : 0)
| ((layers[0]->flags & IMAGE_HAS_ALPHA) ? 0 : kVkImageFlagIgnoreAlpha)
| (cubemap ? kVkImageFlagIsCubemap : 0)
| (colorspace_hint == kColorspaceGamma ? kVkImageFlagCreateUnormView : 0),
};