Skip to content

Commit fcd785a

Browse files
committed
Add ASTC HDR format variants
1 parent f418603 commit fcd785a

File tree

10 files changed

+233
-38
lines changed

10 files changed

+233
-38
lines changed

doc/classes/RDTextureView.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<tutorials>
1010
</tutorials>
1111
<members>
12-
<member name="format_override" type="int" setter="set_format_override" getter="get_format_override" enum="RenderingDevice.DataFormat" default="218">
12+
<member name="format_override" type="int" setter="set_format_override" getter="get_format_override" enum="RenderingDevice.DataFormat" default="232">
1313
Optional override for the data format to return sampled values in. The corresponding [RDTextureFormat] must have had this added as a shareable format. The default value of [constant RenderingDevice.DATA_FORMAT_MAX] does not override the format.
1414
</member>
1515
<member name="swizzle_a" type="int" setter="set_swizzle_a" getter="get_swizzle_a" enum="RenderingDevice.TextureSwizzle" default="6">

doc/classes/RDVertexAttribute.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<tutorials>
1010
</tutorials>
1111
<members>
12-
<member name="format" type="int" setter="set_format" getter="get_format" enum="RenderingDevice.DataFormat" default="218">
12+
<member name="format" type="int" setter="set_format" getter="get_format" enum="RenderingDevice.DataFormat" default="232">
1313
The way that this attribute's data is interpreted when sent to a shader.
1414
</member>
1515
<member name="frequency" type="int" setter="set_frequency" getter="get_frequency" enum="RenderingDevice.VertexFrequency" default="0">

doc/classes/RenderingDevice.xml

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1874,7 +1874,35 @@
18741874
<constant name="DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM" value="217" enum="DataFormat">
18751875
16-bit-per-channel unsigned floating-point green/blue/red channel data with normalized value, plus 6 unused bits after each channel. Stored across 3 separate planes (green + blue + red). Values are in the [code][0.0, 1.0][/code] range.
18761876
</constant>
1877-
<constant name="DATA_FORMAT_MAX" value="218" enum="DataFormat">
1877+
<constant name="DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK" value="218" enum="DataFormat">
1878+
</constant>
1879+
<constant name="DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK" value="219" enum="DataFormat">
1880+
</constant>
1881+
<constant name="DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK" value="220" enum="DataFormat">
1882+
</constant>
1883+
<constant name="DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK" value="221" enum="DataFormat">
1884+
</constant>
1885+
<constant name="DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK" value="222" enum="DataFormat">
1886+
</constant>
1887+
<constant name="DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK" value="223" enum="DataFormat">
1888+
</constant>
1889+
<constant name="DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK" value="224" enum="DataFormat">
1890+
</constant>
1891+
<constant name="DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK" value="225" enum="DataFormat">
1892+
</constant>
1893+
<constant name="DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK" value="226" enum="DataFormat">
1894+
</constant>
1895+
<constant name="DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK" value="227" enum="DataFormat">
1896+
</constant>
1897+
<constant name="DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK" value="228" enum="DataFormat">
1898+
</constant>
1899+
<constant name="DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK" value="229" enum="DataFormat">
1900+
</constant>
1901+
<constant name="DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK" value="230" enum="DataFormat">
1902+
</constant>
1903+
<constant name="DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK" value="231" enum="DataFormat">
1904+
</constant>
1905+
<constant name="DATA_FORMAT_MAX" value="232" enum="DataFormat">
18781906
Represents the size of the [enum DataFormat] enum.
18791907
</constant>
18801908
<constant name="BARRIER_MASK_VERTEX" value="1" enum="BarrierMask" is_bitfield="true">

drivers/d3d12/rendering_device_driver_d3d12.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,20 @@ const RenderingDeviceDriverD3D12::D3D12Format RenderingDeviceDriverD3D12::RD_TO_
332332
/* DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM */ {},
333333
/* DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM */ {},
334334
/* DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM */ {},
335+
/* DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK */ {},
336+
/* DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK */ {},
337+
/* DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK */ {},
338+
/* DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK */ {},
339+
/* DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK */ {},
340+
/* DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK */ {},
341+
/* DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK */ {},
342+
/* DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK */ {},
343+
/* DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK*/ {},
344+
/* DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK */ {},
345+
/* DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK */ {},
346+
/* DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK */ {},
347+
/* DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK */ {},
348+
/* DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK */ {},
335349
};
336350

337351
Error RenderingDeviceDriverD3D12::DescriptorsHeap::allocate(ID3D12Device *p_device, D3D12_DESCRIPTOR_HEAP_TYPE p_type, uint32_t p_descriptor_count, bool p_for_gpu) {

drivers/metal/pixel_formats.mm

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,32 +493,46 @@ void clear(T *p_val, size_t p_count = 1) {
493493
addDataFormatDesc(EAC_R11G11_SNORM_BLOCK, EAC_RG11Snorm, Invalid, Invalid, Invalid, 4, 4, 16, Compressed);
494494

495495
addDataFormatDesc(ASTC_4x4_UNORM_BLOCK, ASTC_4x4_LDR, Invalid, Invalid, Invalid, 4, 4, 16, Compressed);
496+
addDataFormatDesc(ASTC_4x4_SFLOAT_BLOCK, ASTC_4x4_HDR, Invalid, Invalid, Invalid, 4, 4, 16, Compressed);
496497
addDataFormatDesc(ASTC_4x4_SRGB_BLOCK, ASTC_4x4_sRGB, Invalid, Invalid, Invalid, 4, 4, 16, Compressed);
497498
addDataFormatDesc(ASTC_5x4_UNORM_BLOCK, ASTC_5x4_LDR, Invalid, Invalid, Invalid, 5, 4, 16, Compressed);
499+
addDataFormatDesc(ASTC_5x4_SFLOAT_BLOCK, ASTC_5x4_HDR, Invalid, Invalid, Invalid, 5, 4, 16, Compressed);
498500
addDataFormatDesc(ASTC_5x4_SRGB_BLOCK, ASTC_5x4_sRGB, Invalid, Invalid, Invalid, 5, 4, 16, Compressed);
499501
addDataFormatDesc(ASTC_5x5_UNORM_BLOCK, ASTC_5x5_LDR, Invalid, Invalid, Invalid, 5, 5, 16, Compressed);
502+
addDataFormatDesc(ASTC_5x5_SFLOAT_BLOCK, ASTC_5x5_HDR, Invalid, Invalid, Invalid, 5, 5, 16, Compressed);
500503
addDataFormatDesc(ASTC_5x5_SRGB_BLOCK, ASTC_5x5_sRGB, Invalid, Invalid, Invalid, 5, 5, 16, Compressed);
501504
addDataFormatDesc(ASTC_6x5_UNORM_BLOCK, ASTC_6x5_LDR, Invalid, Invalid, Invalid, 6, 5, 16, Compressed);
505+
addDataFormatDesc(ASTC_6x5_SFLOAT_BLOCK, ASTC_6x5_HDR, Invalid, Invalid, Invalid, 6, 5, 16, Compressed);
502506
addDataFormatDesc(ASTC_6x5_SRGB_BLOCK, ASTC_6x5_sRGB, Invalid, Invalid, Invalid, 6, 5, 16, Compressed);
503507
addDataFormatDesc(ASTC_6x6_UNORM_BLOCK, ASTC_6x6_LDR, Invalid, Invalid, Invalid, 6, 6, 16, Compressed);
508+
addDataFormatDesc(ASTC_6x6_SFLOAT_BLOCK, ASTC_6x6_HDR, Invalid, Invalid, Invalid, 6, 6, 16, Compressed);
504509
addDataFormatDesc(ASTC_6x6_SRGB_BLOCK, ASTC_6x6_sRGB, Invalid, Invalid, Invalid, 6, 6, 16, Compressed);
505510
addDataFormatDesc(ASTC_8x5_UNORM_BLOCK, ASTC_8x5_LDR, Invalid, Invalid, Invalid, 8, 5, 16, Compressed);
511+
addDataFormatDesc(ASTC_8x5_SFLOAT_BLOCK, ASTC_8x5_HDR, Invalid, Invalid, Invalid, 8, 5, 16, Compressed);
506512
addDataFormatDesc(ASTC_8x5_SRGB_BLOCK, ASTC_8x5_sRGB, Invalid, Invalid, Invalid, 8, 5, 16, Compressed);
507513
addDataFormatDesc(ASTC_8x6_UNORM_BLOCK, ASTC_8x6_LDR, Invalid, Invalid, Invalid, 8, 6, 16, Compressed);
514+
addDataFormatDesc(ASTC_8x6_SFLOAT_BLOCK, ASTC_8x6_HDR, Invalid, Invalid, Invalid, 8, 6, 16, Compressed);
508515
addDataFormatDesc(ASTC_8x6_SRGB_BLOCK, ASTC_8x6_sRGB, Invalid, Invalid, Invalid, 8, 6, 16, Compressed);
509516
addDataFormatDesc(ASTC_8x8_UNORM_BLOCK, ASTC_8x8_LDR, Invalid, Invalid, Invalid, 8, 8, 16, Compressed);
517+
addDataFormatDesc(ASTC_8x8_SFLOAT_BLOCK, ASTC_8x8_HDR, Invalid, Invalid, Invalid, 8, 8, 16, Compressed);
510518
addDataFormatDesc(ASTC_8x8_SRGB_BLOCK, ASTC_8x8_sRGB, Invalid, Invalid, Invalid, 8, 8, 16, Compressed);
511519
addDataFormatDesc(ASTC_10x5_UNORM_BLOCK, ASTC_10x5_LDR, Invalid, Invalid, Invalid, 10, 5, 16, Compressed);
520+
addDataFormatDesc(ASTC_10x5_SFLOAT_BLOCK, ASTC_10x5_HDR, Invalid, Invalid, Invalid, 10, 5, 16, Compressed);
512521
addDataFormatDesc(ASTC_10x5_SRGB_BLOCK, ASTC_10x5_sRGB, Invalid, Invalid, Invalid, 10, 5, 16, Compressed);
513522
addDataFormatDesc(ASTC_10x6_UNORM_BLOCK, ASTC_10x6_LDR, Invalid, Invalid, Invalid, 10, 6, 16, Compressed);
523+
addDataFormatDesc(ASTC_10x6_SFLOAT_BLOCK, ASTC_10x6_HDR, Invalid, Invalid, Invalid, 10, 6, 16, Compressed);
514524
addDataFormatDesc(ASTC_10x6_SRGB_BLOCK, ASTC_10x6_sRGB, Invalid, Invalid, Invalid, 10, 6, 16, Compressed);
515525
addDataFormatDesc(ASTC_10x8_UNORM_BLOCK, ASTC_10x8_LDR, Invalid, Invalid, Invalid, 10, 8, 16, Compressed);
526+
addDataFormatDesc(ASTC_10x8_SFLOAT_BLOCK, ASTC_10x8_HDR, Invalid, Invalid, Invalid, 10, 8, 16, Compressed);
516527
addDataFormatDesc(ASTC_10x8_SRGB_BLOCK, ASTC_10x8_sRGB, Invalid, Invalid, Invalid, 10, 8, 16, Compressed);
517528
addDataFormatDesc(ASTC_10x10_UNORM_BLOCK, ASTC_10x10_LDR, Invalid, Invalid, Invalid, 10, 10, 16, Compressed);
529+
addDataFormatDesc(ASTC_10x10_SFLOAT_BLOCK, ASTC_10x10_HDR, Invalid, Invalid, Invalid, 10, 10, 16, Compressed);
518530
addDataFormatDesc(ASTC_10x10_SRGB_BLOCK, ASTC_10x10_sRGB, Invalid, Invalid, Invalid, 10, 10, 16, Compressed);
519531
addDataFormatDesc(ASTC_12x10_UNORM_BLOCK, ASTC_12x10_LDR, Invalid, Invalid, Invalid, 12, 10, 16, Compressed);
532+
addDataFormatDesc(ASTC_12x10_SFLOAT_BLOCK, ASTC_12x10_HDR, Invalid, Invalid, Invalid, 12, 10, 16, Compressed);
520533
addDataFormatDesc(ASTC_12x10_SRGB_BLOCK, ASTC_12x10_sRGB, Invalid, Invalid, Invalid, 12, 10, 16, Compressed);
521534
addDataFormatDesc(ASTC_12x12_UNORM_BLOCK, ASTC_12x12_LDR, Invalid, Invalid, Invalid, 12, 12, 16, Compressed);
535+
addDataFormatDesc(ASTC_12x12_SFLOAT_BLOCK, ASTC_12x12_HDR, Invalid, Invalid, Invalid, 12, 12, 16, Compressed);
522536
addDataFormatDesc(ASTC_12x12_SRGB_BLOCK, ASTC_12x12_sRGB, Invalid, Invalid, Invalid, 12, 12, 16, Compressed);
523537

524538
addDfFormatDescChromaSubsampling(G8B8G8R8_422_UNORM, GBGR422, 1, 8, 2, 1, 4);

drivers/vulkan/rendering_device_driver_vulkan.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,20 @@ static const VkFormat RD_TO_VK_FORMAT[RDD::DATA_FORMAT_MAX] = {
276276
VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM,
277277
VK_FORMAT_G16_B16R16_2PLANE_422_UNORM,
278278
VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM,
279+
VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK,
280+
VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK,
281+
VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK,
282+
VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK,
283+
VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK,
284+
VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK,
285+
VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK,
286+
VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK,
287+
VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK,
288+
VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK,
289+
VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK,
290+
VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK,
291+
VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK,
292+
VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK,
279293
};
280294

281295
static VkImageLayout RD_TO_VK_LAYOUT[RDD::TEXTURE_LAYOUT_MAX] = {
@@ -514,6 +528,7 @@ Error RenderingDeviceDriverVulkan::_initialize_device_extensions() {
514528
_register_requested_device_extension(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false);
515529
_register_requested_device_extension(VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, false);
516530
_register_requested_device_extension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, false);
531+
_register_requested_device_extension(VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME, false);
517532

518533
if (Engine::get_singleton()->is_generate_spirv_debug_info_enabled()) {
519534
_register_requested_device_extension(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, true);
@@ -2107,6 +2122,10 @@ void RenderingDeviceDriverVulkan::texture_unmap(TextureID p_texture) {
21072122
}
21082123

21092124
BitField<RDD::TextureUsageBits> RenderingDeviceDriverVulkan::texture_get_usages_supported_by_format(DataFormat p_format, bool p_cpu_readable) {
2125+
if (p_format >= DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK && p_format <= DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK && !enabled_device_extension_names.has(VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME)) {
2126+
// Formats that were introduced later with extensions must not reach vkGetPhysicalDeviceFormatProperties if the extension isn't available. This means it's not supported.
2127+
return 0;
2128+
}
21102129
VkFormatProperties properties = {};
21112130
vkGetPhysicalDeviceFormatProperties(physical_device, RD_TO_VK_FORMAT[p_format], &properties);
21122131

servers/rendering/renderer_rd/storage_rd/texture_storage.cpp

Lines changed: 66 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1275,15 +1275,21 @@ RID TextureStorage::texture_create_from_native_handle(RS::TextureType p_type, Im
12751275
break;
12761276

12771277
case Image::FORMAT_ASTC_4x4:
1278-
case Image::FORMAT_ASTC_4x4_HDR:
12791278
format = RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK;
12801279
break;
12811280

1281+
case Image::FORMAT_ASTC_4x4_HDR:
1282+
format = RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK;
1283+
break;
1284+
12821285
case Image::FORMAT_ASTC_8x8:
1283-
case Image::FORMAT_ASTC_8x8_HDR:
12841286
format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK;
12851287
break;
12861288

1289+
case Image::FORMAT_ASTC_8x8_HDR:
1290+
format = RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK;
1291+
break;
1292+
12871293
default:
12881294
// Arbitrary fallback.
12891295
format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
@@ -2192,56 +2198,70 @@ Ref<Image> TextureStorage::_validate_texture_format(const Ref<Image> &p_image, T
21922198
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_ZERO;
21932199
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_ONE;
21942200
} break;
2195-
case Image::FORMAT_ASTC_4x4:
2196-
case Image::FORMAT_ASTC_4x4_HDR: {
2201+
case Image::FORMAT_ASTC_4x4: {
21972202
if (RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT)) {
21982203
r_format.format = RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK;
2199-
if (p_image->get_format() == Image::FORMAT_ASTC_4x4) {
2200-
r_format.format_srgb = RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK;
2201-
}
2204+
r_format.format_srgb = RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK;
22022205
} else {
22032206
//not supported, reconvert
22042207
image->decompress();
2205-
if (p_image->get_format() == Image::FORMAT_ASTC_4x4) {
2206-
r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
2207-
r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB;
2208-
image->convert(Image::FORMAT_RGBA8);
2209-
} else {
2210-
r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
2211-
image->convert(Image::FORMAT_RGBAH);
2212-
}
2208+
r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
2209+
r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB;
2210+
image->convert(Image::FORMAT_RGBA8);
22132211
}
22142212
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
22152213
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
22162214
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
22172215
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
22182216

22192217
} break; // astc 4x4
2220-
case Image::FORMAT_ASTC_8x8:
2221-
case Image::FORMAT_ASTC_8x8_HDR: {
2218+
case Image::FORMAT_ASTC_4x4_HDR: {
2219+
if (RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT)) {
2220+
r_format.format = RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK;
2221+
} else {
2222+
//not supported, reconvert
2223+
image->decompress();
2224+
r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
2225+
image->convert(Image::FORMAT_RGBAH);
2226+
}
2227+
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
2228+
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
2229+
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
2230+
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
2231+
2232+
} break; // astc 4x4 HDR
2233+
case Image::FORMAT_ASTC_8x8: {
22222234
if (RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT)) {
22232235
r_format.format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK;
2224-
if (p_image->get_format() == Image::FORMAT_ASTC_8x8) {
2225-
r_format.format_srgb = RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK;
2226-
}
2236+
r_format.format_srgb = RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK;
22272237
} else {
22282238
//not supported, reconvert
22292239
image->decompress();
2230-
if (p_image->get_format() == Image::FORMAT_ASTC_8x8) {
2231-
r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
2232-
r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB;
2233-
image->convert(Image::FORMAT_RGBA8);
2234-
} else {
2235-
r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
2236-
image->convert(Image::FORMAT_RGBAH);
2237-
}
2240+
r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
2241+
r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB;
2242+
image->convert(Image::FORMAT_RGBA8);
22382243
}
22392244
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
22402245
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
22412246
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
22422247
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
22432248

22442249
} break; // astc 8x8
2250+
case Image::FORMAT_ASTC_8x8_HDR: {
2251+
if (RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT)) {
2252+
r_format.format = RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK;
2253+
} else {
2254+
//not supported, reconvert
2255+
image->decompress();
2256+
r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
2257+
image->convert(Image::FORMAT_RGBAH);
2258+
}
2259+
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
2260+
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
2261+
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
2262+
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
2263+
2264+
} break; // astc 8x8 HDR
22452265

22462266
default: {
22472267
}
@@ -2585,29 +2605,44 @@ void TextureStorage::_texture_format_from_rd(RD::DataFormat p_rd_format, Texture
25852605
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
25862606
} break;
25872607
case RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK: {
2588-
r_format.image_format = Image::FORMAT_ASTC_4x4_HDR;
2608+
r_format.image_format = Image::FORMAT_ASTC_4x4;
25892609
r_format.rd_format = RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK;
25902610
r_format.rd_format_srgb = RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK;
25912611
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
25922612
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
25932613
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
25942614
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
25952615

2616+
} break;
2617+
case RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK: {
2618+
r_format.image_format = Image::FORMAT_ASTC_4x4_HDR;
2619+
r_format.rd_format = RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK;
2620+
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
2621+
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
2622+
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
2623+
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
25962624
} break; // astc 4x4
25972625
case RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK: {
25982626
// Q: Do we do as we do below, just create the sRGB variant?
25992627
r_format.image_format = Image::FORMAT_ASTC_8x8;
26002628
r_format.rd_format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK;
26012629
} break;
26022630
case RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: {
2603-
r_format.image_format = Image::FORMAT_ASTC_8x8_HDR;
2631+
r_format.image_format = Image::FORMAT_ASTC_8x8;
26042632
r_format.rd_format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK;
26052633
r_format.rd_format_srgb = RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK;
26062634
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
26072635
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
26082636
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
26092637
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
2610-
2638+
} break;
2639+
case RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK: {
2640+
r_format.image_format = Image::FORMAT_ASTC_8x8_HDR;
2641+
r_format.rd_format = RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK;
2642+
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
2643+
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
2644+
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
2645+
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
26112646
} break; // astc 8x8
26122647

26132648
default: {

servers/rendering/rendering_device.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7680,6 +7680,20 @@ void RenderingDevice::_bind_methods() {
76807680
BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM);
76817681
BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM);
76827682
BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM);
7683+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK);
7684+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK);
7685+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK);
7686+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK);
7687+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK);
7688+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK);
7689+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK);
7690+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK);
7691+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK);
7692+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK);
7693+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK);
7694+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK);
7695+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK);
7696+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK);
76837697
BIND_ENUM_CONSTANT(DATA_FORMAT_MAX);
76847698

76857699
#ifndef DISABLE_DEPRECATED

0 commit comments

Comments
 (0)