Adds placeholders for ETC2/ASTC compression texture format
Compatible Vulkan backends should now enable ETC2/ASTC but no functional
changes because no TextureFormat in ETC2 or ASTC have been added yet.
Bug: dawn:955
Change-Id: I56e8ff73f931a12253fe6d21f3f4b91e3459ef13
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/62701
Commit-Queue: Loko Kung <lokokung@google.com>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/dawn.json b/dawn.json
index 831e32d..5d08c33 100644
--- a/dawn.json
+++ b/dawn.json
@@ -875,6 +875,8 @@
"extensible": false,
"members": [
{"name": "texture compression BC", "type": "bool", "default": "false"},
+ {"name": "texture compression ETC2", "type": "bool", "default": "false"},
+ {"name": "texture compression ASTC", "type": "bool", "default": "false"},
{"name": "shader float16", "type": "bool", "default": "false"},
{"name": "pipeline statistics query", "type": "bool", "default": "false"},
{"name": "timestamp query", "type": "bool", "default": "false"},
diff --git a/src/dawn_native/Extensions.cpp b/src/dawn_native/Extensions.cpp
index bd11c82..5eeb1a2 100644
--- a/src/dawn_native/Extensions.cpp
+++ b/src/dawn_native/Extensions.cpp
@@ -35,6 +35,18 @@
{"texture_compression_bc", "Support Block Compressed (BC) texture formats",
"https://bugs.chromium.org/p/dawn/issues/detail?id=42"},
&WGPUDeviceProperties::textureCompressionBC},
+ {Extension::TextureCompressionETC2,
+ {"texture-compression-etc2",
+ "Support Ericsson Texture Compressed (ETC2/EAC) texture "
+ "formats",
+ "https://bugs.chromium.org/p/dawn/issues/detail?id=955"},
+ &WGPUDeviceProperties::textureCompressionETC2},
+ {Extension::TextureCompressionASTC,
+ {"texture-compression-astc",
+ "Support Adaptable Scalable Texture Compressed (ASTC) "
+ "texture formats",
+ "https://bugs.chromium.org/p/dawn/issues/detail?id=955"},
+ &WGPUDeviceProperties::textureCompressionASTC},
{Extension::ShaderFloat16,
{"shader_float16",
"Support 16bit float arithmetic and declarations in uniform and storage buffers",
diff --git a/src/dawn_native/Extensions.h b/src/dawn_native/Extensions.h
index 16ac807..b862032 100644
--- a/src/dawn_native/Extensions.h
+++ b/src/dawn_native/Extensions.h
@@ -25,6 +25,8 @@
enum class Extension {
TextureCompressionBC,
+ TextureCompressionETC2,
+ TextureCompressionASTC,
ShaderFloat16,
PipelineStatisticsQuery,
TimestampQuery,
diff --git a/src/dawn_native/vulkan/AdapterVk.cpp b/src/dawn_native/vulkan/AdapterVk.cpp
index 6d52f31..2be2198 100644
--- a/src/dawn_native/vulkan/AdapterVk.cpp
+++ b/src/dawn_native/vulkan/AdapterVk.cpp
@@ -88,9 +88,12 @@
return DAWN_INTERNAL_ERROR("Vulkan robustBufferAccess feature required.");
}
- // TODO(crbug.com/dawn/955): Require BC || (ETC && ASTC) instead.
- if (!mDeviceInfo.features.textureCompressionBC) {
- return DAWN_INTERNAL_ERROR("Vulkan textureCompressionBC feature required.");
+ if (!mDeviceInfo.features.textureCompressionBC &&
+ !(mDeviceInfo.features.textureCompressionETC2 &&
+ mDeviceInfo.features.textureCompressionASTC_LDR)) {
+ return DAWN_INTERNAL_ERROR(
+ "Vulkan textureCompressionBC feature required or both textureCompressionETC2 and "
+ "textureCompressionASTC required.");
}
// Needed for the respective WebGPU features.
@@ -263,6 +266,14 @@
mSupportedExtensions.EnableExtension(Extension::TextureCompressionBC);
}
+ if (mDeviceInfo.features.textureCompressionETC2 == VK_TRUE) {
+ mSupportedExtensions.EnableExtension(Extension::TextureCompressionETC2);
+ }
+
+ if (mDeviceInfo.features.textureCompressionASTC_LDR == VK_TRUE) {
+ mSupportedExtensions.EnableExtension(Extension::TextureCompressionASTC);
+ }
+
if (mDeviceInfo.features.pipelineStatisticsQuery == VK_TRUE) {
mSupportedExtensions.EnableExtension(Extension::PipelineStatisticsQuery);
}
diff --git a/src/dawn_native/vulkan/DeviceVk.cpp b/src/dawn_native/vulkan/DeviceVk.cpp
index 5e72eac..efab8a1 100644
--- a/src/dawn_native/vulkan/DeviceVk.cpp
+++ b/src/dawn_native/vulkan/DeviceVk.cpp
@@ -348,6 +348,18 @@
usedKnobs.features.textureCompressionBC = VK_TRUE;
}
+ if (IsExtensionEnabled(Extension::TextureCompressionETC2)) {
+ ASSERT(ToBackend(GetAdapter())->GetDeviceInfo().features.textureCompressionETC2 ==
+ VK_TRUE);
+ usedKnobs.features.textureCompressionETC2 = VK_TRUE;
+ }
+
+ if (IsExtensionEnabled(Extension::TextureCompressionASTC)) {
+ ASSERT(ToBackend(GetAdapter())->GetDeviceInfo().features.textureCompressionASTC_LDR ==
+ VK_TRUE);
+ usedKnobs.features.textureCompressionASTC_LDR = VK_TRUE;
+ }
+
if (IsExtensionEnabled(Extension::PipelineStatisticsQuery)) {
ASSERT(ToBackend(GetAdapter())->GetDeviceInfo().features.pipelineStatisticsQuery ==
VK_TRUE);
diff --git a/src/tests/unittests/validation/TextureValidationTests.cpp b/src/tests/unittests/validation/TextureValidationTests.cpp
index 8036517..8779ca8 100644
--- a/src/tests/unittests/validation/TextureValidationTests.cpp
+++ b/src/tests/unittests/validation/TextureValidationTests.cpp
@@ -541,13 +541,34 @@
}
}
+ // Test that the creation of a texture with ETC2 format will fail when the extension
+ // textureCompressionETC2 is not enabled.
+ TEST_F(TextureValidationTest, UseETC2FormatWithoutEnablingExtension) {
+ for (wgpu::TextureFormat format : utils::kETC2Formats) {
+ wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
+ descriptor.format = format;
+ ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
+ }
+ }
+
+ // Test that the creation of a texture with ASTC format will fail when the extension
+ // textureCompressionASTC is not enabled.
+ TEST_F(TextureValidationTest, UseASTCFormatWithoutEnablingExtension) {
+ for (wgpu::TextureFormat format : utils::kASTCFormats) {
+ wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
+ descriptor.format = format;
+ ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
+ }
+ }
+
// TODO(jiawei.shao@intel.com): add tests to verify we cannot create 1D or 3D textures with
// compressed texture formats.
class CompressedTextureFormatsValidationTests : public TextureValidationTest {
protected:
WGPUDevice CreateTestDevice() override {
dawn_native::DeviceDescriptor descriptor;
- descriptor.requiredExtensions = {"texture_compression_bc"};
+ descriptor.requiredExtensions = {"texture_compression_bc", "texture-compression-etc2",
+ "texture-compression-astc"};
return adapter.CreateDevice(&descriptor);
}
@@ -560,9 +581,8 @@
}
};
- // Test the validation of texture size when creating textures in compressed texture formats.
- // It is invalid to use a number that is not a multiple of 4 (the compressed block width and
- // height of all BC formats) as the width or height of textures in BC formats.
+ // Test that it is invalid to use a number that is not a multiple of 4 (the compressed block
+ // width and height of all BC formats) as the width or height in BC formats.
TEST_F(CompressedTextureFormatsValidationTests, TextureSize) {
for (wgpu::TextureFormat format : utils::kBCFormats) {
{
@@ -596,9 +616,7 @@
}
}
- // Test the validation of texture usages when creating textures in compressed texture formats.
- // Only CopySrc, CopyDst and Sampled are accepted as the texture usage of the textures in BC
- // formats.
+ // Test that only CopySrc, CopyDst and Sampled are accepted as usage in compressed formats.
TEST_F(CompressedTextureFormatsValidationTests, TextureUsage) {
wgpu::TextureUsage invalidUsages[] = {
wgpu::TextureUsage::RenderAttachment,
@@ -613,6 +631,22 @@
ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
}
}
+ for (wgpu::TextureFormat format : utils::kETC2Formats) {
+ for (wgpu::TextureUsage usage : invalidUsages) {
+ wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
+ descriptor.format = format;
+ descriptor.usage = usage;
+ ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
+ }
+ }
+ for (wgpu::TextureFormat format : utils::kASTCFormats) {
+ for (wgpu::TextureUsage usage : invalidUsages) {
+ wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
+ descriptor.format = format;
+ descriptor.usage = usage;
+ ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
+ }
+ }
}
TEST_F(CompressedTextureFormatsValidationTests, MipLevelCount) {
@@ -626,8 +660,7 @@
}
}
- // Test the validation of sample count when creating textures in compressed texture formats.
- // It is invalid to specify SampleCount > 1 when we create a texture in BC formats.
+ // Test that it is invalid to specify SampleCount>1 in BC formats.
TEST_F(CompressedTextureFormatsValidationTests, SampleCount) {
for (wgpu::TextureFormat format : utils::kBCFormats) {
wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
diff --git a/src/utils/TextureUtils.h b/src/utils/TextureUtils.h
index 97d24f0..bc12404 100644
--- a/src/utils/TextureUtils.h
+++ b/src/utils/TextureUtils.h
@@ -87,6 +87,10 @@
wgpu::TextureFormat::BC6HRGBUfloat, wgpu::TextureFormat::BC6HRGBFloat,
wgpu::TextureFormat::BC7RGBAUnorm, wgpu::TextureFormat::BC7RGBAUnormSrgb};
+ // TODO(crbug.com/dawn/955) Add formats once implemented.
+ static constexpr std::array<wgpu::TextureFormat, 0> kETC2Formats = {};
+ static constexpr std::array<wgpu::TextureFormat, 0> kASTCFormats = {};
+
bool TextureFormatSupportsStorageTexture(wgpu::TextureFormat format);
uint32_t GetTexelBlockSizeInBytes(wgpu::TextureFormat textureFormat);