diff --git a/doc/classes/RDTextureView.xml b/doc/classes/RDTextureView.xml index bd8102d5531..2e03ee44aab 100644 --- a/doc/classes/RDTextureView.xml +++ b/doc/classes/RDTextureView.xml @@ -9,7 +9,7 @@ - + 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. diff --git a/doc/classes/RDVertexAttribute.xml b/doc/classes/RDVertexAttribute.xml index 364b82526b6..04e4bb53a04 100644 --- a/doc/classes/RDVertexAttribute.xml +++ b/doc/classes/RDVertexAttribute.xml @@ -9,7 +9,7 @@ - + The way that this attribute's data is interpreted when sent to a shader. diff --git a/doc/classes/RenderingDevice.xml b/doc/classes/RenderingDevice.xml index 6ec7918d3b2..18555c46d62 100644 --- a/doc/classes/RenderingDevice.xml +++ b/doc/classes/RenderingDevice.xml @@ -1874,7 +1874,35 @@ 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. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents the size of the [enum DataFormat] enum. diff --git a/drivers/d3d12/rendering_device_driver_d3d12.cpp b/drivers/d3d12/rendering_device_driver_d3d12.cpp index 88d0ac28ebe..3c595e8977b 100644 --- a/drivers/d3d12/rendering_device_driver_d3d12.cpp +++ b/drivers/d3d12/rendering_device_driver_d3d12.cpp @@ -332,6 +332,20 @@ const RenderingDeviceDriverD3D12::D3D12Format RenderingDeviceDriverD3D12::RD_TO_ /* DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM */ {}, /* DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM */ {}, /* DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM */ {}, + /* DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK*/ {}, + /* DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK */ {}, + /* DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK */ {}, }; Error RenderingDeviceDriverD3D12::DescriptorsHeap::allocate(ID3D12Device *p_device, D3D12_DESCRIPTOR_HEAP_TYPE p_type, uint32_t p_descriptor_count, bool p_for_gpu) { diff --git a/drivers/metal/pixel_formats.mm b/drivers/metal/pixel_formats.mm index c9226590b16..c784faa8397 100644 --- a/drivers/metal/pixel_formats.mm +++ b/drivers/metal/pixel_formats.mm @@ -493,32 +493,46 @@ void PixelFormats::initDataFormatCapabilities() { addDataFormatDesc(EAC_R11G11_SNORM_BLOCK, EAC_RG11Snorm, Invalid, Invalid, Invalid, 4, 4, 16, Compressed); addDataFormatDesc(ASTC_4x4_UNORM_BLOCK, ASTC_4x4_LDR, Invalid, Invalid, Invalid, 4, 4, 16, Compressed); + addDataFormatDesc(ASTC_4x4_SFLOAT_BLOCK, ASTC_4x4_HDR, Invalid, Invalid, Invalid, 4, 4, 16, Compressed); addDataFormatDesc(ASTC_4x4_SRGB_BLOCK, ASTC_4x4_sRGB, Invalid, Invalid, Invalid, 4, 4, 16, Compressed); addDataFormatDesc(ASTC_5x4_UNORM_BLOCK, ASTC_5x4_LDR, Invalid, Invalid, Invalid, 5, 4, 16, Compressed); + addDataFormatDesc(ASTC_5x4_SFLOAT_BLOCK, ASTC_5x4_HDR, Invalid, Invalid, Invalid, 5, 4, 16, Compressed); addDataFormatDesc(ASTC_5x4_SRGB_BLOCK, ASTC_5x4_sRGB, Invalid, Invalid, Invalid, 5, 4, 16, Compressed); addDataFormatDesc(ASTC_5x5_UNORM_BLOCK, ASTC_5x5_LDR, Invalid, Invalid, Invalid, 5, 5, 16, Compressed); + addDataFormatDesc(ASTC_5x5_SFLOAT_BLOCK, ASTC_5x5_HDR, Invalid, Invalid, Invalid, 5, 5, 16, Compressed); addDataFormatDesc(ASTC_5x5_SRGB_BLOCK, ASTC_5x5_sRGB, Invalid, Invalid, Invalid, 5, 5, 16, Compressed); addDataFormatDesc(ASTC_6x5_UNORM_BLOCK, ASTC_6x5_LDR, Invalid, Invalid, Invalid, 6, 5, 16, Compressed); + addDataFormatDesc(ASTC_6x5_SFLOAT_BLOCK, ASTC_6x5_HDR, Invalid, Invalid, Invalid, 6, 5, 16, Compressed); addDataFormatDesc(ASTC_6x5_SRGB_BLOCK, ASTC_6x5_sRGB, Invalid, Invalid, Invalid, 6, 5, 16, Compressed); addDataFormatDesc(ASTC_6x6_UNORM_BLOCK, ASTC_6x6_LDR, Invalid, Invalid, Invalid, 6, 6, 16, Compressed); + addDataFormatDesc(ASTC_6x6_SFLOAT_BLOCK, ASTC_6x6_HDR, Invalid, Invalid, Invalid, 6, 6, 16, Compressed); addDataFormatDesc(ASTC_6x6_SRGB_BLOCK, ASTC_6x6_sRGB, Invalid, Invalid, Invalid, 6, 6, 16, Compressed); addDataFormatDesc(ASTC_8x5_UNORM_BLOCK, ASTC_8x5_LDR, Invalid, Invalid, Invalid, 8, 5, 16, Compressed); + addDataFormatDesc(ASTC_8x5_SFLOAT_BLOCK, ASTC_8x5_HDR, Invalid, Invalid, Invalid, 8, 5, 16, Compressed); addDataFormatDesc(ASTC_8x5_SRGB_BLOCK, ASTC_8x5_sRGB, Invalid, Invalid, Invalid, 8, 5, 16, Compressed); addDataFormatDesc(ASTC_8x6_UNORM_BLOCK, ASTC_8x6_LDR, Invalid, Invalid, Invalid, 8, 6, 16, Compressed); + addDataFormatDesc(ASTC_8x6_SFLOAT_BLOCK, ASTC_8x6_HDR, Invalid, Invalid, Invalid, 8, 6, 16, Compressed); addDataFormatDesc(ASTC_8x6_SRGB_BLOCK, ASTC_8x6_sRGB, Invalid, Invalid, Invalid, 8, 6, 16, Compressed); addDataFormatDesc(ASTC_8x8_UNORM_BLOCK, ASTC_8x8_LDR, Invalid, Invalid, Invalid, 8, 8, 16, Compressed); + addDataFormatDesc(ASTC_8x8_SFLOAT_BLOCK, ASTC_8x8_HDR, Invalid, Invalid, Invalid, 8, 8, 16, Compressed); addDataFormatDesc(ASTC_8x8_SRGB_BLOCK, ASTC_8x8_sRGB, Invalid, Invalid, Invalid, 8, 8, 16, Compressed); addDataFormatDesc(ASTC_10x5_UNORM_BLOCK, ASTC_10x5_LDR, Invalid, Invalid, Invalid, 10, 5, 16, Compressed); + addDataFormatDesc(ASTC_10x5_SFLOAT_BLOCK, ASTC_10x5_HDR, Invalid, Invalid, Invalid, 10, 5, 16, Compressed); addDataFormatDesc(ASTC_10x5_SRGB_BLOCK, ASTC_10x5_sRGB, Invalid, Invalid, Invalid, 10, 5, 16, Compressed); addDataFormatDesc(ASTC_10x6_UNORM_BLOCK, ASTC_10x6_LDR, Invalid, Invalid, Invalid, 10, 6, 16, Compressed); + addDataFormatDesc(ASTC_10x6_SFLOAT_BLOCK, ASTC_10x6_HDR, Invalid, Invalid, Invalid, 10, 6, 16, Compressed); addDataFormatDesc(ASTC_10x6_SRGB_BLOCK, ASTC_10x6_sRGB, Invalid, Invalid, Invalid, 10, 6, 16, Compressed); addDataFormatDesc(ASTC_10x8_UNORM_BLOCK, ASTC_10x8_LDR, Invalid, Invalid, Invalid, 10, 8, 16, Compressed); + addDataFormatDesc(ASTC_10x8_SFLOAT_BLOCK, ASTC_10x8_HDR, Invalid, Invalid, Invalid, 10, 8, 16, Compressed); addDataFormatDesc(ASTC_10x8_SRGB_BLOCK, ASTC_10x8_sRGB, Invalid, Invalid, Invalid, 10, 8, 16, Compressed); addDataFormatDesc(ASTC_10x10_UNORM_BLOCK, ASTC_10x10_LDR, Invalid, Invalid, Invalid, 10, 10, 16, Compressed); + addDataFormatDesc(ASTC_10x10_SFLOAT_BLOCK, ASTC_10x10_HDR, Invalid, Invalid, Invalid, 10, 10, 16, Compressed); addDataFormatDesc(ASTC_10x10_SRGB_BLOCK, ASTC_10x10_sRGB, Invalid, Invalid, Invalid, 10, 10, 16, Compressed); addDataFormatDesc(ASTC_12x10_UNORM_BLOCK, ASTC_12x10_LDR, Invalid, Invalid, Invalid, 12, 10, 16, Compressed); + addDataFormatDesc(ASTC_12x10_SFLOAT_BLOCK, ASTC_12x10_HDR, Invalid, Invalid, Invalid, 12, 10, 16, Compressed); addDataFormatDesc(ASTC_12x10_SRGB_BLOCK, ASTC_12x10_sRGB, Invalid, Invalid, Invalid, 12, 10, 16, Compressed); addDataFormatDesc(ASTC_12x12_UNORM_BLOCK, ASTC_12x12_LDR, Invalid, Invalid, Invalid, 12, 12, 16, Compressed); + addDataFormatDesc(ASTC_12x12_SFLOAT_BLOCK, ASTC_12x12_HDR, Invalid, Invalid, Invalid, 12, 12, 16, Compressed); addDataFormatDesc(ASTC_12x12_SRGB_BLOCK, ASTC_12x12_sRGB, Invalid, Invalid, Invalid, 12, 12, 16, Compressed); addDfFormatDescChromaSubsampling(G8B8G8R8_422_UNORM, GBGR422, 1, 8, 2, 1, 4); diff --git a/drivers/vulkan/rendering_device_driver_vulkan.cpp b/drivers/vulkan/rendering_device_driver_vulkan.cpp index f46015f1fc3..9dbf122126f 100644 --- a/drivers/vulkan/rendering_device_driver_vulkan.cpp +++ b/drivers/vulkan/rendering_device_driver_vulkan.cpp @@ -276,6 +276,20 @@ static const VkFormat RD_TO_VK_FORMAT[RDD::DATA_FORMAT_MAX] = { VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, VK_FORMAT_G16_B16R16_2PLANE_422_UNORM, VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, + VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK, + VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK, + VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK, + VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK, + VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK, + VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK, + VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK, + VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK, + VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK, + VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK, + VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK, + VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK, + VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK, + VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK, }; static VkImageLayout RD_TO_VK_LAYOUT[RDD::TEXTURE_LAYOUT_MAX] = { @@ -514,6 +528,7 @@ Error RenderingDeviceDriverVulkan::_initialize_device_extensions() { _register_requested_device_extension(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false); _register_requested_device_extension(VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, false); _register_requested_device_extension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME, false); + _register_requested_device_extension(VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME, false); if (Engine::get_singleton()->is_generate_spirv_debug_info_enabled()) { _register_requested_device_extension(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME, true); @@ -2107,6 +2122,10 @@ void RenderingDeviceDriverVulkan::texture_unmap(TextureID p_texture) { } BitField RenderingDeviceDriverVulkan::texture_get_usages_supported_by_format(DataFormat p_format, bool p_cpu_readable) { + 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)) { + // Formats that were introduced later with extensions must not reach vkGetPhysicalDeviceFormatProperties if the extension isn't available. This means it's not supported. + return 0; + } VkFormatProperties properties = {}; vkGetPhysicalDeviceFormatProperties(physical_device, RD_TO_VK_FORMAT[p_format], &properties); diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp index 69ae3d971a4..4f26e20a3aa 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp @@ -1275,15 +1275,21 @@ RID TextureStorage::texture_create_from_native_handle(RS::TextureType p_type, Im break; case Image::FORMAT_ASTC_4x4: - case Image::FORMAT_ASTC_4x4_HDR: format = RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK; break; + case Image::FORMAT_ASTC_4x4_HDR: + format = RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK; + break; + case Image::FORMAT_ASTC_8x8: - case Image::FORMAT_ASTC_8x8_HDR: format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK; break; + case Image::FORMAT_ASTC_8x8_HDR: + format = RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK; + break; + default: // Arbitrary fallback. format = RD::DATA_FORMAT_R8G8B8A8_UNORM; @@ -2192,24 +2198,16 @@ Ref TextureStorage::_validate_texture_format(const Ref &p_image, T r_format.swizzle_b = RD::TEXTURE_SWIZZLE_ZERO; r_format.swizzle_a = RD::TEXTURE_SWIZZLE_ONE; } break; - case Image::FORMAT_ASTC_4x4: - case Image::FORMAT_ASTC_4x4_HDR: { + case Image::FORMAT_ASTC_4x4: { 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)) { r_format.format = RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK; - if (p_image->get_format() == Image::FORMAT_ASTC_4x4) { - r_format.format_srgb = RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK; - } + r_format.format_srgb = RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK; } else { //not supported, reconvert image->decompress(); - if (p_image->get_format() == Image::FORMAT_ASTC_4x4) { - r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM; - r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB; - image->convert(Image::FORMAT_RGBA8); - } else { - r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; - image->convert(Image::FORMAT_RGBAH); - } + r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM; + r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB; + image->convert(Image::FORMAT_RGBA8); } r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G; @@ -2217,24 +2215,31 @@ Ref TextureStorage::_validate_texture_format(const Ref &p_image, T r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A; } break; // astc 4x4 - case Image::FORMAT_ASTC_8x8: - case Image::FORMAT_ASTC_8x8_HDR: { - 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)) { - r_format.format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK; - if (p_image->get_format() == Image::FORMAT_ASTC_8x8) { - r_format.format_srgb = RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK; - } + case Image::FORMAT_ASTC_4x4_HDR: { + 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)) { + r_format.format = RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK; } else { //not supported, reconvert image->decompress(); - if (p_image->get_format() == Image::FORMAT_ASTC_8x8) { - r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM; - r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB; - image->convert(Image::FORMAT_RGBA8); - } else { - r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; - image->convert(Image::FORMAT_RGBAH); - } + r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; + image->convert(Image::FORMAT_RGBAH); + } + r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; + r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G; + r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B; + r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A; + + } break; // astc 4x4 HDR + case Image::FORMAT_ASTC_8x8: { + 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)) { + r_format.format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK; + r_format.format_srgb = RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK; + } else { + //not supported, reconvert + image->decompress(); + r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM; + r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB; + image->convert(Image::FORMAT_RGBA8); } r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G; @@ -2242,6 +2247,21 @@ Ref TextureStorage::_validate_texture_format(const Ref &p_image, T r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A; } break; // astc 8x8 + case Image::FORMAT_ASTC_8x8_HDR: { + 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)) { + r_format.format = RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK; + } else { + //not supported, reconvert + image->decompress(); + r_format.format = RD::DATA_FORMAT_R16G16B16A16_SFLOAT; + image->convert(Image::FORMAT_RGBAH); + } + r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; + r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G; + r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B; + r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A; + + } break; // astc 8x8 HDR default: { } @@ -2585,7 +2605,7 @@ void TextureStorage::_texture_format_from_rd(RD::DataFormat p_rd_format, Texture r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A; } break; case RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK: { - r_format.image_format = Image::FORMAT_ASTC_4x4_HDR; + r_format.image_format = Image::FORMAT_ASTC_4x4; r_format.rd_format = RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK; r_format.rd_format_srgb = RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK; r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; @@ -2593,6 +2613,14 @@ void TextureStorage::_texture_format_from_rd(RD::DataFormat p_rd_format, Texture r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B; r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A; + } break; + case RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK: { + r_format.image_format = Image::FORMAT_ASTC_4x4_HDR; + r_format.rd_format = RD::DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK; + r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; + r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G; + r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B; + r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A; } break; // astc 4x4 case RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK: { // Q: Do we do as we do below, just create the sRGB variant? @@ -2600,14 +2628,21 @@ void TextureStorage::_texture_format_from_rd(RD::DataFormat p_rd_format, Texture r_format.rd_format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK; } break; case RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: { - r_format.image_format = Image::FORMAT_ASTC_8x8_HDR; + r_format.image_format = Image::FORMAT_ASTC_8x8; r_format.rd_format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK; r_format.rd_format_srgb = RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK; r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G; r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B; r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A; - + } break; + case RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK: { + r_format.image_format = Image::FORMAT_ASTC_8x8_HDR; + r_format.rd_format = RD::DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK; + r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; + r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G; + r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B; + r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A; } break; // astc 8x8 default: { diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp index 055fcbeda64..6c799127e68 100644 --- a/servers/rendering/rendering_device.cpp +++ b/servers/rendering/rendering_device.cpp @@ -7680,6 +7680,20 @@ void RenderingDevice::_bind_methods() { BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM); BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM); BIND_ENUM_CONSTANT(DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK); + BIND_ENUM_CONSTANT(DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK); BIND_ENUM_CONSTANT(DATA_FORMAT_MAX); #ifndef DISABLE_DEPRECATED diff --git a/servers/rendering/rendering_device_commons.cpp b/servers/rendering/rendering_device_commons.cpp index 03fad5493a0..a11ffe57dd1 100644 --- a/servers/rendering/rendering_device_commons.cpp +++ b/servers/rendering/rendering_device_commons.cpp @@ -253,6 +253,20 @@ const char *const RenderingDeviceCommons::FORMAT_NAMES[DATA_FORMAT_MAX] = { "G16_B16_R16_3Plane_422_Unorm", "G16_B16R16_2Plane_422_Unorm", "G16_B16_R16_3Plane_444_Unorm", + "Astc_4X4_Sfloat_Block", + "Astc_5X4_Sfloat_Block", + "Astc_5X5_Sfloat_Block", + "Astc_6X5_Sfloat_Block", + "Astc_6X6_Sfloat_Block", + "Astc_8X5_Sfloat_Block", + "Astc_8X6_Sfloat_Block", + "Astc_8X8_Sfloat_Block", + "Astc_10X5_Sfloat_Block", + "Astc_10X6_Sfloat_Block", + "Astc_10X8_Sfloat_Block", + "Astc_10X10_Sfloat_Block", + "Astc_12X10_Sfloat_Block", + "Astc_12X12_Sfloat_Block", }; /*****************/ @@ -477,6 +491,20 @@ uint32_t RenderingDeviceCommons::get_image_format_pixel_size(DataFormat p_format case DATA_FORMAT_ASTC_12x10_SRGB_BLOCK: case DATA_FORMAT_ASTC_12x12_UNORM_BLOCK: case DATA_FORMAT_ASTC_12x12_SRGB_BLOCK: + case DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK: + case DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK: return 1; case DATA_FORMAT_G8B8G8R8_422_UNORM: case DATA_FORMAT_B8G8R8G8_422_UNORM: @@ -554,42 +582,56 @@ void RenderingDeviceCommons::get_compressed_image_format_block_dimensions(DataFo case DATA_FORMAT_EAC_R11G11_UNORM_BLOCK: case DATA_FORMAT_EAC_R11G11_SNORM_BLOCK: case DATA_FORMAT_ASTC_4x4_UNORM_BLOCK: // Again, not sure about astc. - case DATA_FORMAT_ASTC_4x4_SRGB_BLOCK: { + case DATA_FORMAT_ASTC_4x4_SRGB_BLOCK: + case DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK: { r_w = 4; r_h = 4; } break; case DATA_FORMAT_ASTC_5x4_UNORM_BLOCK: // Unsupported case DATA_FORMAT_ASTC_5x4_SRGB_BLOCK: + case DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_5x5_UNORM_BLOCK: case DATA_FORMAT_ASTC_5x5_SRGB_BLOCK: + case DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_6x5_UNORM_BLOCK: case DATA_FORMAT_ASTC_6x5_SRGB_BLOCK: + case DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_6x6_UNORM_BLOCK: case DATA_FORMAT_ASTC_6x6_SRGB_BLOCK: + case DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_8x5_UNORM_BLOCK: case DATA_FORMAT_ASTC_8x5_SRGB_BLOCK: + case DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_8x6_UNORM_BLOCK: - case DATA_FORMAT_ASTC_8x6_SRGB_BLOCK: { + case DATA_FORMAT_ASTC_8x6_SRGB_BLOCK: + case DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK: { r_w = 4; r_h = 4; } break; case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK: - case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: { + case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: + case DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK: { r_w = 8; r_h = 8; } break; case DATA_FORMAT_ASTC_10x5_UNORM_BLOCK: // Unsupported case DATA_FORMAT_ASTC_10x5_SRGB_BLOCK: + case DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_10x6_UNORM_BLOCK: case DATA_FORMAT_ASTC_10x6_SRGB_BLOCK: + case DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_10x8_UNORM_BLOCK: case DATA_FORMAT_ASTC_10x8_SRGB_BLOCK: + case DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_10x10_UNORM_BLOCK: case DATA_FORMAT_ASTC_10x10_SRGB_BLOCK: + case DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_12x10_UNORM_BLOCK: case DATA_FORMAT_ASTC_12x10_SRGB_BLOCK: + case DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_12x12_UNORM_BLOCK: case DATA_FORMAT_ASTC_12x12_SRGB_BLOCK: + case DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK: r_w = 4; r_h = 4; return; @@ -642,32 +684,46 @@ uint32_t RenderingDeviceCommons::get_compressed_image_format_block_byte_size(Dat return 16; case DATA_FORMAT_ASTC_4x4_UNORM_BLOCK: // Again, not sure about astc. case DATA_FORMAT_ASTC_4x4_SRGB_BLOCK: + case DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_5x4_UNORM_BLOCK: case DATA_FORMAT_ASTC_5x4_SRGB_BLOCK: + case DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_5x5_UNORM_BLOCK: case DATA_FORMAT_ASTC_5x5_SRGB_BLOCK: + case DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_6x5_UNORM_BLOCK: case DATA_FORMAT_ASTC_6x5_SRGB_BLOCK: + case DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_6x6_UNORM_BLOCK: case DATA_FORMAT_ASTC_6x6_SRGB_BLOCK: + case DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_8x5_UNORM_BLOCK: case DATA_FORMAT_ASTC_8x5_SRGB_BLOCK: + case DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_8x6_UNORM_BLOCK: case DATA_FORMAT_ASTC_8x6_SRGB_BLOCK: + case DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK: case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: + case DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_10x5_UNORM_BLOCK: case DATA_FORMAT_ASTC_10x5_SRGB_BLOCK: + case DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_10x6_UNORM_BLOCK: case DATA_FORMAT_ASTC_10x6_SRGB_BLOCK: + case DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_10x8_UNORM_BLOCK: case DATA_FORMAT_ASTC_10x8_SRGB_BLOCK: + case DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_10x10_UNORM_BLOCK: case DATA_FORMAT_ASTC_10x10_SRGB_BLOCK: + case DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_12x10_UNORM_BLOCK: case DATA_FORMAT_ASTC_12x10_SRGB_BLOCK: + case DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK: case DATA_FORMAT_ASTC_12x12_UNORM_BLOCK: case DATA_FORMAT_ASTC_12x12_SRGB_BLOCK: + case DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK: return 16; default: { } @@ -691,7 +747,8 @@ uint32_t RenderingDeviceCommons::get_compressed_image_format_pixel_rshift(DataFo case DATA_FORMAT_EAC_R11_SNORM_BLOCK: return 1; case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: - case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK: { + case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK: + case DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK: { return 2; } default: { diff --git a/servers/rendering/rendering_device_commons.h b/servers/rendering/rendering_device_commons.h index 67946fc4875..6aa156b7d4d 100644 --- a/servers/rendering/rendering_device_commons.h +++ b/servers/rendering/rendering_device_commons.h @@ -270,6 +270,20 @@ public: DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM, DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM, DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM, + DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK, // HDR variant. + DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK, // HDR variant. DATA_FORMAT_MAX, };