render: float color formats in nrhi (RGBA16F + R11G11B10F)

This commit is contained in:
mchughalex 2026-07-17 12:06:47 +01:00
parent 7f6a5b5b7c
commit a8e28405f9
3 changed files with 19 additions and 0 deletions

View file

@ -59,6 +59,12 @@ enum class Format : uint32_t {
kBC3_UNORM, kBC3_UNORM,
kBC4_UNORM, kBC4_UNORM,
kBC5_UNORM, kBC5_UNORM,
// Float color formats (HDR render targets), appended so existing values
// stay stable across exe/dll pairs. Both are color-renderable and
// blendable on every target backend (D3D12 FL11+, Vulkan core, MoltenVK);
// kR11G11B10_FLOAT has no alpha channel and stores no sign bits.
kR16G16B16A16_FLOAT,
kR11G11B10_FLOAT,
}; };
// Block dimensions/bytes for the copy math (1x1 for uncompressed). // Block dimensions/bytes for the copy math (1x1 for uncompressed).

View file

@ -45,6 +45,10 @@ DXGI_FORMAT ToDxgi(Format format) {
return DXGI_FORMAT_R16G16_UNORM; return DXGI_FORMAT_R16G16_UNORM;
case Format::kR10G10B10A2_UNORM: case Format::kR10G10B10A2_UNORM:
return DXGI_FORMAT_R10G10B10A2_UNORM; return DXGI_FORMAT_R10G10B10A2_UNORM;
case Format::kR16G16B16A16_FLOAT:
return DXGI_FORMAT_R16G16B16A16_FLOAT;
case Format::kR11G11B10_FLOAT:
return DXGI_FORMAT_R11G11B10_FLOAT;
case Format::kR32_FLOAT: case Format::kR32_FLOAT:
return DXGI_FORMAT_R32_FLOAT; return DXGI_FORMAT_R32_FLOAT;
case Format::kR32G32_FLOAT: case Format::kR32G32_FLOAT:

View file

@ -76,6 +76,12 @@ VkFormat ToVkFormat(Format format) {
case Format::kR10G10B10A2_UNORM: case Format::kR10G10B10A2_UNORM:
// Identical bit layout to DXGI_FORMAT_R10G10B10A2_UNORM. // Identical bit layout to DXGI_FORMAT_R10G10B10A2_UNORM.
return VK_FORMAT_A2B10G10R10_UNORM_PACK32; return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
case Format::kR16G16B16A16_FLOAT:
return VK_FORMAT_R16G16B16A16_SFLOAT;
case Format::kR11G11B10_FLOAT:
// Identical bit layout to DXGI_FORMAT_R11G11B10_FLOAT (R in the low
// bits of the packed 32).
return VK_FORMAT_B10G11R11_UFLOAT_PACK32;
case Format::kR32_FLOAT: case Format::kR32_FLOAT:
return VK_FORMAT_R32_SFLOAT; return VK_FORMAT_R32_SFLOAT;
case Format::kR32G32_FLOAT: case Format::kR32G32_FLOAT:
@ -123,6 +129,9 @@ uint32_t FormatBytesPerBlock(Format format) {
case Format::kR32_FLOAT: case Format::kR32_FLOAT:
case Format::kD32_FLOAT: case Format::kD32_FLOAT:
return 4; return 4;
case Format::kR11G11B10_FLOAT:
return 4;
case Format::kR16G16B16A16_FLOAT:
case Format::kR32G32_FLOAT: case Format::kR32G32_FLOAT:
return 8; return 8;
case Format::kR32G32B32_FLOAT: case Format::kR32G32B32_FLOAT: