Add d32fs8;

This commit is contained in:
bjorn 2022-07-17 11:03:00 -07:00
parent 7aab5ce79b
commit 5d3e1f93cd
6 changed files with 48 additions and 18 deletions

View File

@ -23,8 +23,9 @@ StringEntry lovrTextureFormat[] = {
[FORMAT_RGB10A2] = ENTRY("rgb10a2"),
[FORMAT_RG11B10F] = ENTRY("rg11b10f"),
[FORMAT_D16] = ENTRY("d16"),
[FORMAT_D24S8] = ENTRY("d24s8"),
[FORMAT_D32F] = ENTRY("d32f"),
[FORMAT_D24S8] = ENTRY("d24s8"),
[FORMAT_D32FS8] = ENTRY("d32fs8"),
[FORMAT_BC1] = ENTRY("bc1"),
[FORMAT_BC2] = ENTRY("bc2"),
[FORMAT_BC3] = ENTRY("bc3"),

View File

@ -78,8 +78,9 @@ typedef enum {
GPU_FORMAT_RGB10A2,
GPU_FORMAT_RG11B10F,
GPU_FORMAT_D16,
GPU_FORMAT_D24S8,
GPU_FORMAT_D32F,
GPU_FORMAT_D24S8,
GPU_FORMAT_D32FS8,
GPU_FORMAT_BC1,
GPU_FORMAT_BC2,
GPU_FORMAT_BC3,

View File

@ -87,12 +87,14 @@ typedef enum {
GPU_MEMORY_BUFFER_CPU_READ,
GPU_MEMORY_TEXTURE_COLOR,
GPU_MEMORY_TEXTURE_D16,
GPU_MEMORY_TEXTURE_D24S8,
GPU_MEMORY_TEXTURE_D32F,
GPU_MEMORY_TEXTURE_D24S8,
GPU_MEMORY_TEXTURE_D32FS8,
GPU_MEMORY_TEXTURE_LAZY_COLOR,
GPU_MEMORY_TEXTURE_LAZY_D16,
GPU_MEMORY_TEXTURE_LAZY_D24S8,
GPU_MEMORY_TEXTURE_LAZY_D32F,
GPU_MEMORY_TEXTURE_LAZY_D24S8,
GPU_MEMORY_TEXTURE_LAZY_D32FS8,
GPU_MEMORY_COUNT
} gpu_memory_type;
@ -490,13 +492,17 @@ bool gpu_texture_init(gpu_texture* texture, gpu_texture_info* info) {
texture->aspect = VK_IMAGE_ASPECT_DEPTH_BIT;
memoryType = (info->usage & GPU_TEXTURE_TRANSIENT) ? GPU_MEMORY_TEXTURE_LAZY_D16 : GPU_MEMORY_TEXTURE_D16;
break;
case GPU_FORMAT_D32F:
texture->aspect = VK_IMAGE_ASPECT_DEPTH_BIT;
memoryType = (info->usage & GPU_TEXTURE_TRANSIENT) ? GPU_MEMORY_TEXTURE_LAZY_D32F : GPU_MEMORY_TEXTURE_D32F;
break;
case GPU_FORMAT_D24S8:
texture->aspect = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
memoryType = (info->usage & GPU_TEXTURE_TRANSIENT) ? GPU_MEMORY_TEXTURE_LAZY_D24S8 : GPU_MEMORY_TEXTURE_D24S8;
break;
case GPU_FORMAT_D32F:
texture->aspect = VK_IMAGE_ASPECT_DEPTH_BIT;
memoryType = (info->usage & GPU_TEXTURE_TRANSIENT) ? GPU_MEMORY_TEXTURE_LAZY_D32F : GPU_MEMORY_TEXTURE_D32F;
case GPU_FORMAT_D32FS8:
texture->aspect = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
memoryType = (info->usage & GPU_TEXTURE_TRANSIENT) ? GPU_MEMORY_TEXTURE_LAZY_D32FS8 : GPU_MEMORY_TEXTURE_D32FS8;
break;
default:
texture->aspect = VK_IMAGE_ASPECT_COLOR_BIT;
@ -2023,12 +2029,14 @@ bool gpu_init(gpu_config* config) {
struct { VkFormat format; VkImageUsageFlags usage; } imageFlags[] = {
[GPU_MEMORY_TEXTURE_COLOR] = { VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT },
[GPU_MEMORY_TEXTURE_D16] = { VK_FORMAT_D16_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT },
[GPU_MEMORY_TEXTURE_D24S8] = { VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_SAMPLED_BIT },
[GPU_MEMORY_TEXTURE_D32F] = { VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_SAMPLED_BIT },
[GPU_MEMORY_TEXTURE_D24S8] = { VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_SAMPLED_BIT },
[GPU_MEMORY_TEXTURE_D32FS8] = { VK_FORMAT_D32_SFLOAT_S8_UINT, VK_IMAGE_USAGE_SAMPLED_BIT },
[GPU_MEMORY_TEXTURE_LAZY_COLOR] = { VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | transient },
[GPU_MEMORY_TEXTURE_LAZY_D16] = { VK_FORMAT_D16_UNORM, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | transient },
[GPU_MEMORY_TEXTURE_LAZY_D32F] = { VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | transient },
[GPU_MEMORY_TEXTURE_LAZY_D24S8] = { VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | transient },
[GPU_MEMORY_TEXTURE_LAZY_D32F] = { VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | transient }
[GPU_MEMORY_TEXTURE_LAZY_D32FS8] = { VK_FORMAT_D32_SFLOAT_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | transient }
};
uint32_t allocatorCount = GPU_MEMORY_TEXTURE_COLOR;
@ -2341,12 +2349,14 @@ static gpu_memory* gpu_allocate(gpu_memory_type type, VkMemoryRequirements info,
[GPU_MEMORY_BUFFER_CPU_READ] = 0,
[GPU_MEMORY_TEXTURE_COLOR] = 1 << 28,
[GPU_MEMORY_TEXTURE_D16] = 1 << 28,
[GPU_MEMORY_TEXTURE_D24S8] = 1 << 28,
[GPU_MEMORY_TEXTURE_D32F] = 1 << 28,
[GPU_MEMORY_TEXTURE_D24S8] = 1 << 28,
[GPU_MEMORY_TEXTURE_D32FS8] = 1 << 28,
[GPU_MEMORY_TEXTURE_LAZY_COLOR] = 1 << 28,
[GPU_MEMORY_TEXTURE_LAZY_D16] = 1 << 28,
[GPU_MEMORY_TEXTURE_LAZY_D32F] = 1 << 28,
[GPU_MEMORY_TEXTURE_LAZY_D24S8] = 1 << 28,
[GPU_MEMORY_TEXTURE_LAZY_D32F] = 1 << 28
[GPU_MEMORY_TEXTURE_LAZY_D32FS8] = 1 << 28
};
uint32_t blockSize = blockSizes[type];
@ -2685,8 +2695,9 @@ static VkFormat convertFormat(gpu_texture_format format, int colorspace) {
[GPU_FORMAT_RGB10A2] = { VK_FORMAT_A2B10G10R10_UNORM_PACK32, VK_FORMAT_A2B10G10R10_UNORM_PACK32 },
[GPU_FORMAT_RG11B10F] = { VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_B10G11R11_UFLOAT_PACK32 },
[GPU_FORMAT_D16] = { VK_FORMAT_D16_UNORM, VK_FORMAT_D16_UNORM },
[GPU_FORMAT_D24S8] = { VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT },
[GPU_FORMAT_D32F] = { VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT },
[GPU_FORMAT_D24S8] = { VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT },
[GPU_FORMAT_D32FS8] = { VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT },
[GPU_FORMAT_BC1] = { VK_FORMAT_BC1_RGB_UNORM_BLOCK, VK_FORMAT_BC1_RGB_SRGB_BLOCK },
[GPU_FORMAT_BC2] = { VK_FORMAT_BC2_UNORM_BLOCK, VK_FORMAT_BC2_SRGB_BLOCK },
[GPU_FORMAT_BC3] = { VK_FORMAT_BC3_UNORM_BLOCK, VK_FORMAT_BC3_SRGB_BLOCK },

View File

@ -48,8 +48,9 @@ static size_t measure(uint32_t w, uint32_t h, TextureFormat format) {
case FORMAT_RGB10A2: return w * h * 4;
case FORMAT_RG11B10F: return w * h * 4;
case FORMAT_D16: return w * h * 2;
case FORMAT_D24S8: return w * h * 4;
case FORMAT_D32F: return w * h * 4;
case FORMAT_D24S8: return w * h * 4;
case FORMAT_D32FS8: return w * h * 5;
case FORMAT_BC1: return ((w + 3) / 4) * ((h + 3) / 4) * 8;
case FORMAT_BC2:
case FORMAT_BC3:
@ -134,7 +135,15 @@ bool lovrImageIsCube(Image* image) {
}
bool lovrImageIsDepth(Image* image) {
return image->format == FORMAT_D16 || image->format == FORMAT_D24S8 || image->format == FORMAT_D32F;
switch (image->format) {
case FORMAT_D16:
case FORMAT_D32F:
case FORMAT_D24S8:
case FORMAT_D32FS8:
return true;
default:
return false;
}
}
bool lovrImageIsCompressed(Image* image) {
@ -628,6 +637,10 @@ static Image* loadDDS(Blob* blob) {
format = FORMAT_RG32F;
break;
case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
format = FORMAT_D32FS8;
break;
case DXGI_FORMAT_R10G10B10A2_TYPELESS:
case DXGI_FORMAT_R10G10B10A2_UNORM:
format = FORMAT_RGB10A2;
@ -963,8 +976,9 @@ static Image* loadKTX1(Blob* blob) {
[FORMAT_RGB10A2] = { 0x8368, 0x1908, 0x8059, 0 },
[FORMAT_RG11B10F] = { 0x8C3B, 0x1907, 0x8C3A, 0 },
[FORMAT_D16] = { 0x1403, 0x1902, 0x81A5, 0 },
[FORMAT_D24S8] = { 0x84FA, 0x84F9, 0x88F0, 0 },
[FORMAT_D32F] = { 0x1406, 0x1902, 0x8CAC, 0 },
[FORMAT_D24S8] = { 0x84FA, 0x84F9, 0x88F0, 0 },
[FORMAT_D32FS8] = { 0x8DAD, 0x84F9, 0x8CAD, 0 },
[FORMAT_BC1] = { 0x0000, 0x0000, 0x83F1, 0x8C4D },
[FORMAT_BC2] = { 0x0000, 0x0000, 0x83F2, 0x8C4E },
[FORMAT_BC3] = { 0x0000, 0x0000, 0x83F3, 0x8C4F },
@ -1105,8 +1119,9 @@ static Image* loadKTX2(Blob* blob) {
case 64: image->format = FORMAT_RGB10A2; break;
case 122: image->format = FORMAT_RG11B10F; break;
case 124: image->format = FORMAT_D16; break;
case 129: image->format = FORMAT_D24S8; break;
case 126: image->format = FORMAT_D32F; break;
case 129: image->format = FORMAT_D24S8; break;
case 130: image->format = FORMAT_D32FS8; break;
case 132: image->flags |= IMAGE_SRGB; case 131: image->format = FORMAT_BC1; break;
case 136: image->flags |= IMAGE_SRGB; case 135: image->format = FORMAT_BC2; break;
case 138: image->flags |= IMAGE_SRGB; case 137: image->format = FORMAT_BC3; break;

View File

@ -24,8 +24,9 @@ typedef enum {
FORMAT_RGB10A2,
FORMAT_RG11B10F,
FORMAT_D16,
FORMAT_D24S8,
FORMAT_D32F,
FORMAT_D24S8,
FORMAT_D32FS8,
FORMAT_BC1,
FORMAT_BC2,
FORMAT_BC3,

View File

@ -2968,7 +2968,7 @@ Pass* lovrGraphicsGetPass(PassInfo* info) {
if (canvas->depth.texture || canvas->depth.format) {
TextureFormat format = canvas->depth.texture ? canvas->depth.texture->info.format : canvas->depth.format;
bool renderable = state.features.formats[format] & GPU_FEATURE_RENDER;
lovrCheck(format == FORMAT_D16 || format == FORMAT_D24S8 || format == FORMAT_D32F, "Depth buffer must use a depth format");
lovrCheck(format == FORMAT_D16 || format == FORMAT_D32F || format == FORMAT_D24S8 || format == FORMAT_D32FS8, "Depth buffer must use a depth format");
lovrCheck(renderable, "This GPU does not support depth buffers with this texture format");
if (canvas->depth.texture) {
const TextureInfo* texture = &canvas->depth.texture->info;
@ -5283,6 +5283,7 @@ static size_t measureTexture(TextureFormat format, uint16_t w, uint16_t h, uint1
case FORMAT_RGB10A2:
case FORMAT_D24S8:
case FORMAT_D32F: return w * h * d * 4;
case FORMAT_D32FS8: return w * h * d * 5;
case FORMAT_RGBA16:
case FORMAT_RGBA16F:
case FORMAT_RG32F: return w * h * d * 8;