Only allow creating 2D textures with RenderAttachment usage
BUG=dawn:1364
TEST=dawn_unittests
Change-Id: I49cdeeac8b951c3715211fc3b3b71934a19a6e64
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/86622
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
diff --git a/src/dawn/native/Texture.cpp b/src/dawn/native/Texture.cpp
index cabef76..75b3c0c 100644
--- a/src/dawn/native/Texture.cpp
+++ b/src/dawn/native/Texture.cpp
@@ -310,6 +310,13 @@
usage, wgpu::TextureUsage::RenderAttachment, format->format);
DAWN_INVALID_IF(
+ descriptor->dimension != wgpu::TextureDimension::e2D &&
+ (usage & wgpu::TextureUsage::RenderAttachment),
+ "The texture usage (%s) includes %s, which is incompatible with the texture "
+ "dimension (%s).",
+ usage, wgpu::TextureUsage::RenderAttachment, descriptor->dimension);
+
+ DAWN_INVALID_IF(
!format->supportsStorageUsage && (usage & wgpu::TextureUsage::StorageBinding),
"The texture usage (%s) includes %s, which is incompatible with the format (%s).",
usage, wgpu::TextureUsage::StorageBinding, format->format);
diff --git a/src/dawn/tests/end2end/NonzeroTextureCreationTests.cpp b/src/dawn/tests/end2end/NonzeroTextureCreationTests.cpp
index 19f412a..365b150 100644
--- a/src/dawn/tests/end2end/NonzeroTextureCreationTests.cpp
+++ b/src/dawn/tests/end2end/NonzeroTextureCreationTests.cpp
@@ -301,7 +301,7 @@
{wgpu::TextureAspect::All},
{wgpu::TextureUsage(wgpu::TextureUsage::RenderAttachment | wgpu::TextureUsage::CopySrc),
wgpu::TextureUsage::CopySrc},
- {wgpu::TextureDimension::e2D, wgpu::TextureDimension::e3D},
+ {wgpu::TextureDimension::e2D},
{1u, 7u}, // depth or array layers
{4u}, // mip count
{0u, 1u, 2u, 3u}, // mip
diff --git a/src/dawn/tests/unittests/validation/ExternalTextureTests.cpp b/src/dawn/tests/unittests/validation/ExternalTextureTests.cpp
index 57cb301..3c4aba3 100644
--- a/src/dawn/tests/unittests/validation/ExternalTextureTests.cpp
+++ b/src/dawn/tests/unittests/validation/ExternalTextureTests.cpp
@@ -72,6 +72,7 @@
{
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
textureDescriptor.dimension = wgpu::TextureDimension::e3D;
+ textureDescriptor.usage = wgpu::TextureUsage::TextureBinding;
wgpu::Texture internalTexture = device.CreateTexture(&textureDescriptor);
wgpu::ExternalTextureDescriptor externalDesc;
diff --git a/src/dawn/tests/unittests/validation/TextureValidationTests.cpp b/src/dawn/tests/unittests/validation/TextureValidationTests.cpp
index 3136c76..ac0192e 100644
--- a/src/dawn/tests/unittests/validation/TextureValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/TextureValidationTests.cpp
@@ -178,6 +178,7 @@
// Test the validation of the mip level count
TEST_F(TextureValidationTest, MipLevelCount) {
wgpu::TextureDescriptor defaultDescriptor = CreateDefaultTextureDescriptor();
+ defaultDescriptor.usage = wgpu::TextureUsage::TextureBinding;
// mipLevelCount == 1 is allowed
{
@@ -456,12 +457,13 @@
// Test the validation of 3D texture size
TEST_F(TextureValidationTest, 3DTextureSize) {
wgpu::TextureDescriptor defaultDescriptor = CreateDefaultTextureDescriptor();
+ defaultDescriptor.dimension = wgpu::TextureDimension::e3D;
+ defaultDescriptor.usage = wgpu::TextureUsage::TextureBinding;
wgpu::Limits supportedLimits = GetSupportedLimits().limits;
// Out-of-bound texture dimension is not allowed
{
wgpu::TextureDescriptor descriptor = defaultDescriptor;
- descriptor.dimension = wgpu::TextureDimension::e3D;
descriptor.size = {supportedLimits.maxTextureDimension3D + 1u, 1, 1};
ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
@@ -476,7 +478,6 @@
// Zero-sized texture is not allowed
{
wgpu::TextureDescriptor descriptor = defaultDescriptor;
- descriptor.dimension = wgpu::TextureDimension::e3D;
descriptor.size = {0, 1, 1};
ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
@@ -491,7 +492,6 @@
// Texture size less than max dimension is allowed
{
wgpu::TextureDescriptor descriptor = defaultDescriptor;
- descriptor.dimension = wgpu::TextureDimension::e3D;
descriptor.size = {supportedLimits.maxTextureDimension3D >> 1,
supportedLimits.maxTextureDimension3D >> 1,
@@ -502,7 +502,6 @@
// Texture size equal to max dimension is allowed
{
wgpu::TextureDescriptor descriptor = defaultDescriptor;
- descriptor.dimension = wgpu::TextureDimension::e3D;
descriptor.size = {supportedLimits.maxTextureDimension3D,
supportedLimits.maxTextureDimension3D,
@@ -625,6 +624,27 @@
}
}
+ // Test it is an error to create a RenderAttachment texture with the texture dimensions that
+ // doesn't support TextureUsage::RenderAttachment texture usages.
+ TEST_F(TextureValidationTest, TextureDimensionNotSupportRenderAttachment) {
+ wgpu::TextureDescriptor descriptor;
+ descriptor.size = {1, 1, 1};
+ descriptor.format = wgpu::TextureFormat::RGBA8Unorm;
+ descriptor.usage = wgpu::TextureUsage::RenderAttachment;
+
+ constexpr std::array<wgpu::TextureDimension, 3> kTextureDimensions = {
+ {wgpu::TextureDimension::e1D, wgpu::TextureDimension::e2D,
+ wgpu::TextureDimension::e3D}};
+ for (wgpu::TextureDimension dimension : kTextureDimensions) {
+ descriptor.dimension = dimension;
+ if (dimension == wgpu::TextureDimension::e2D) {
+ device.CreateTexture(&descriptor);
+ } else {
+ ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
+ }
+ }
+ }
+
// Test it is an error to create a texture with format "Undefined".
TEST_F(TextureValidationTest, TextureFormatUndefined) {
wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
diff --git a/webgpu-cts/expectations.txt b/webgpu-cts/expectations.txt
index 1303d67..6ae1323 100644
--- a/webgpu-cts/expectations.txt
+++ b/webgpu-cts/expectations.txt
@@ -464,12 +464,6 @@
crbug.com/dawn/0000 [ win ] webgpu:api,operation,command_buffer,copyTextureToTexture:color_textures,non_compressed,* [ Failure ]
################################################################################
-# crbug.com/dawn/1364 Add validation that render attachments must be 2D (array) textures
-# KEEP
-################################################################################
-crbug.com/dawn/1364 webgpu:api,validation,createTexture:texture_usage:* [ Failure ]
-
-################################################################################
# Triaged failures
# KEEP
################################################################################