vk: better swizzling
- expand BC4 and BC5 compressed blocks - negate alpha semantic
This commit is contained in:
parent
d9a4d9d562
commit
ee81a7228d
|
@ -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));
|
||||
|
||||
|
|
|
@ -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),
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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),
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue