Skip to content

Commit 4bafafa

Browse files
committed
Merge pull request godotengine#102777 from darksylinc/matias-astc-hdr
Add ASTC HDR format variants
2 parents 134da37 + fcd785a commit 4bafafa

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
@@ -1871,7 +1871,35 @@
18711871
<constant name="DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM" value="217" enum="DataFormat">
18721872
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.
18731873
</constant>
1874-
<constant name="DATA_FORMAT_MAX" value="218" enum="DataFormat">
1874+
<constant name="DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK" value="218" enum="DataFormat">
1875+
</constant>
1876+
<constant name="DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK" value="219" enum="DataFormat">
1877+
</constant>
1878+
<constant name="DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK" value="220" enum="DataFormat">
1879+
</constant>
1880+
<constant name="DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK" value="221" enum="DataFormat">
1881+
</constant>
1882+
<constant name="DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK" value="222" enum="DataFormat">
1883+
</constant>
1884+
<constant name="DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK" value="223" enum="DataFormat">
1885+
</constant>
1886+
<constant name="DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK" value="224" enum="DataFormat">
1887+
</constant>
1888+
<constant name="DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK" value="225" enum="DataFormat">
1889+
</constant>
1890+
<constant name="DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK" value="226" enum="DataFormat">
1891+
</constant>
1892+
<constant name="DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK" value="227" enum="DataFormat">
1893+
</constant>
1894+
<constant name="DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK" value="228" enum="DataFormat">
1895+
</constant>
1896+
<constant name="DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK" value="229" enum="DataFormat">
1897+
</constant>
1898+
<constant name="DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK" value="230" enum="DataFormat">
1899+
</constant>
1900+
<constant name="DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK" value="231" enum="DataFormat">
1901+
</constant>
1902+
<constant name="DATA_FORMAT_MAX" value="232" enum="DataFormat">
18751903
Represents the size of the [enum DataFormat] enum.
18761904
</constant>
18771905
<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);
@@ -2140,6 +2155,10 @@ void RenderingDeviceDriverVulkan::texture_unmap(TextureID p_texture) {
21402155
}
21412156

21422157
BitField<RDD::TextureUsageBits> RenderingDeviceDriverVulkan::texture_get_usages_supported_by_format(DataFormat p_format, bool p_cpu_readable) {
2158+
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)) {
2159+
// Formats that were introduced later with extensions must not reach vkGetPhysicalDeviceFormatProperties if the extension isn't available. This means it's not supported.
2160+
return 0;
2161+
}
21432162
VkFormatProperties properties = {};
21442163
vkGetPhysicalDeviceFormatProperties(physical_device, RD_TO_VK_FORMAT[p_format], &properties);
21452164

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;
@@ -2197,56 +2203,70 @@ Ref<Image> TextureStorage::_validate_texture_format(const Ref<Image> &p_image, T
21972203
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_ZERO;
21982204
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_ONE;
21992205
} break;
2200-
case Image::FORMAT_ASTC_4x4:
2201-
case Image::FORMAT_ASTC_4x4_HDR: {
2206+
case Image::FORMAT_ASTC_4x4: {
22022207
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)) {
22032208
r_format.format = RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK;
2204-
if (p_image->get_format() == Image::FORMAT_ASTC_4x4) {
2205-
r_format.format_srgb = RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK;
2206-
}
2209+
r_format.format_srgb = RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK;
22072210
} else {
22082211
//not supported, reconvert
22092212
image->decompress();
2210-
if (p_image->get_format() == Image::FORMAT_ASTC_4x4) {
2211-
r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
2212-
r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB;
2213-
image->convert(Image::FORMAT_RGBA8);
2214-
} else {
2215-
r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
2216-
image->convert(Image::FORMAT_RGBAH);
2217-
}
2213+
r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
2214+
r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB;
2215+
image->convert(Image::FORMAT_RGBA8);
22182216
}
22192217
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
22202218
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
22212219
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
22222220
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
22232221

22242222
} break; // astc 4x4
2225-
case Image::FORMAT_ASTC_8x8:
2226-
case Image::FORMAT_ASTC_8x8_HDR: {
2223+
case Image::FORMAT_ASTC_4x4_HDR: {
2224+
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)) {
2225+
r_format.format = RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK;
2226+
} else {
2227+
//not supported, reconvert
2228+
image->decompress();
2229+
r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
2230+
image->convert(Image::FORMAT_RGBAH);
2231+
}
2232+
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
2233+
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
2234+
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
2235+
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
2236+
2237+
} break; // astc 4x4 HDR
2238+
case Image::FORMAT_ASTC_8x8: {
22272239
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)) {
22282240
r_format.format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK;
2229-
if (p_image->get_format() == Image::FORMAT_ASTC_8x8) {
2230-
r_format.format_srgb = RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK;
2231-
}
2241+
r_format.format_srgb = RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK;
22322242
} else {
22332243
//not supported, reconvert
22342244
image->decompress();
2235-
if (p_image->get_format() == Image::FORMAT_ASTC_8x8) {
2236-
r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
2237-
r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB;
2238-
image->convert(Image::FORMAT_RGBA8);
2239-
} else {
2240-
r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
2241-
image->convert(Image::FORMAT_RGBAH);
2242-
}
2245+
r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
2246+
r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB;
2247+
image->convert(Image::FORMAT_RGBA8);
22432248
}
22442249
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
22452250
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
22462251
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
22472252
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
22482253

22492254
} break; // astc 8x8
2255+
case Image::FORMAT_ASTC_8x8_HDR: {
2256+
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)) {
2257+
r_format.format = RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK;
2258+
} else {
2259+
//not supported, reconvert
2260+
image->decompress();
2261+
r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT;
2262+
image->convert(Image::FORMAT_RGBAH);
2263+
}
2264+
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
2265+
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
2266+
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
2267+
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
2268+
2269+
} break; // astc 8x8 HDR
22502270

22512271
default: {
22522272
}
@@ -2589,14 +2609,22 @@ void TextureStorage::_texture_format_from_rd(RD::DataFormat p_rd_format, Texture
25892609
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
25902610
} break;
25912611
case RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK: {
2592-
r_format.image_format = Image::FORMAT_ASTC_4x4_HDR;
2612+
r_format.image_format = Image::FORMAT_ASTC_4x4;
25932613
r_format.rd_format = RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK;
25942614
r_format.rd_format_srgb = RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK;
25952615
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
25962616
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
25972617
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
25982618
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
25992619

2620+
} break;
2621+
case RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK: {
2622+
r_format.image_format = Image::FORMAT_ASTC_4x4_HDR;
2623+
r_format.rd_format = RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK;
2624+
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
2625+
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
2626+
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
2627+
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
26002628
} break; // astc 4x4
26012629
case RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK: {
26022630
// Q: Do we do as we do below, just create the sRGB variant?
@@ -2608,14 +2636,21 @@ void TextureStorage::_texture_format_from_rd(RD::DataFormat p_rd_format, Texture
26082636
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
26092637
} break;
26102638
case RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: {
2611-
r_format.image_format = Image::FORMAT_ASTC_8x8_HDR;
2639+
r_format.image_format = Image::FORMAT_ASTC_8x8;
26122640
r_format.rd_format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK;
26132641
r_format.rd_format_srgb = RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK;
26142642
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
26152643
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
26162644
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
26172645
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
2618-
2646+
} break;
2647+
case RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK: {
2648+
r_format.image_format = Image::FORMAT_ASTC_8x8_HDR;
2649+
r_format.rd_format = RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK;
2650+
r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R;
2651+
r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G;
2652+
r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B;
2653+
r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A;
26192654
} break; // astc 8x8
26202655

26212656
default: {

servers/rendering/rendering_device.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7683,6 +7683,20 @@ void RenderingDevice::_bind_methods() {
76837683
BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM);
76847684
BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM);
76857685
BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM);
7686+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK);
7687+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK);
7688+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK);
7689+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK);
7690+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK);
7691+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK);
7692+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK);
7693+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK);
7694+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK);
7695+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK);
7696+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK);
7697+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK);
7698+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK);
7699+
BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK);
76867700
BIND_ENUM_CONSTANT(DATA_FORMAT_MAX);
76877701

76887702
#ifndef DISABLE_DEPRECATED

0 commit comments

Comments
 (0)