Use WGPU_ARRAY_LAYER_COUNT_UNDEFINED instead of 0
This seperates the undefined 'arrayLayerCount' from 0 to
WGPU_ARRAY_LAYER_COUNT_UNDEFINED. So 0 arrayLayerCount is treated
as a validation error.
Bug: dawn:1026
Change-Id: I7b4ae024b02ac0d2aa260b2a8c64b09bd967db87
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/63660
Reviewed-by: Jie A Chen <jie.a.chen@intel.com>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Jie A Chen <jie.a.chen@intel.com>
diff --git a/dawn.json b/dawn.json
index dd86991..2bfdaa4 100644
--- a/dawn.json
+++ b/dawn.json
@@ -2093,7 +2093,7 @@
{"name": "base mip level", "type": "uint32_t", "default": "0"},
{"name": "mip level count", "type": "uint32_t", "default": "0"},
{"name": "base array layer", "type": "uint32_t", "default": "0"},
- {"name": "array layer count", "type": "uint32_t", "default": "0"},
+ {"name": "array layer count", "type": "uint32_t", "default": "WGPU_ARRAY_LAYER_COUNT_UNDEFINED"},
{"name": "aspect", "type": "texture aspect", "default": "all"}
]
},
diff --git a/generator/templates/webgpu.h b/generator/templates/webgpu.h
index f0b8538..64dbc47 100644
--- a/generator/templates/webgpu.h
+++ b/generator/templates/webgpu.h
@@ -79,6 +79,7 @@
#define WGPU_COPY_STRIDE_UNDEFINED (0xffffffffUL)
#define WGPU_LIMIT_U32_UNDEFINED (0xffffffffUL)
#define WGPU_LIMIT_U64_UNDEFINED (0xffffffffffffffffULL)
+#define WGPU_ARRAY_LAYER_COUNT_UNDEFINED (0xffffffffUL)
typedef uint32_t WGPUFlags;
diff --git a/generator/templates/webgpu_cpp.h b/generator/templates/webgpu_cpp.h
index 2f5a3c5..945f7c3 100644
--- a/generator/templates/webgpu_cpp.h
+++ b/generator/templates/webgpu_cpp.h
@@ -25,6 +25,7 @@
static constexpr uint32_t kCopyStrideUndefined = WGPU_COPY_STRIDE_UNDEFINED;
static constexpr uint32_t kLimitU32Undefined = WGPU_LIMIT_U32_UNDEFINED;
static constexpr uint64_t kLimitU64Undefined = WGPU_LIMIT_U64_UNDEFINED;
+ static constexpr uint32_t kArrayLayerCountUndefined = WGPU_ARRAY_LAYER_COUNT_UNDEFINED;
{% for type in by_category["enum"] %}
enum class {{as_cppType(type.name)}} : uint32_t {
diff --git a/src/dawn_native/Texture.cpp b/src/dawn_native/Texture.cpp
index 21e378b..33d7c78 100644
--- a/src/dawn_native/Texture.cpp
+++ b/src/dawn_native/Texture.cpp
@@ -397,7 +397,7 @@
// TODO(dawn:682): Use GetAspectInfo(aspect).
desc.format = texture->GetFormat().format;
}
- if (desc.arrayLayerCount == 0) {
+ if (desc.arrayLayerCount == wgpu::kArrayLayerCountUndefined) {
switch (desc.dimension) {
case wgpu::TextureViewDimension::e1D:
case wgpu::TextureViewDimension::e2D:
diff --git a/src/tests/unittests/validation/TextureViewValidationTests.cpp b/src/tests/unittests/validation/TextureViewValidationTests.cpp
index 110062a..76d7b43 100644
--- a/src/tests/unittests/validation/TextureViewValidationTests.cpp
+++ b/src/tests/unittests/validation/TextureViewValidationTests.cpp
@@ -72,6 +72,13 @@
wgpu::TextureViewDescriptor base2DTextureViewDescriptor =
CreateDefaultViewDescriptor(wgpu::TextureViewDimension::e2D);
+ // It is an error to create a view with zero 'arrayLayerCount'.
+ {
+ wgpu::TextureViewDescriptor descriptor = base2DTextureViewDescriptor;
+ descriptor.arrayLayerCount = 0;
+ ASSERT_DEVICE_ERROR(texture.CreateView(&descriptor));
+ }
+
// It is OK to create a 2D texture view on a 2D texture.
{
wgpu::TextureViewDescriptor descriptor = base2DTextureViewDescriptor;
@@ -144,6 +151,14 @@
wgpu::TextureViewDescriptor base2DArrayTextureViewDescriptor =
CreateDefaultViewDescriptor(wgpu::TextureViewDimension::e2DArray);
+ // It is an error to create a view with zero 'arrayLayerCount'.
+ {
+ wgpu::TextureViewDescriptor descriptor = base2DArrayTextureViewDescriptor;
+ descriptor.dimension = wgpu::TextureViewDimension::e2D;
+ descriptor.arrayLayerCount = 0;
+ ASSERT_DEVICE_ERROR(texture.CreateView(&descriptor));
+ }
+
// It is OK to create a 2D texture view on a 2D array texture.
{
wgpu::TextureViewDescriptor descriptor = base2DArrayTextureViewDescriptor;
@@ -167,10 +182,11 @@
ASSERT_DEVICE_ERROR(texture.CreateView(&descriptor));
}
- // baseArrayLayer == k && arrayLayerCount == 0 means to use layers k..end.
+ // baseArrayLayer == k && arrayLayerCount == wgpu::kArrayLayerCountUndefined means to use
+ // layers k..end.
{
wgpu::TextureViewDescriptor descriptor = base2DArrayTextureViewDescriptor;
- descriptor.arrayLayerCount = 0;
+ descriptor.arrayLayerCount = wgpu::kArrayLayerCountUndefined;
descriptor.baseArrayLayer = 0;
texture.CreateView(&descriptor);
@@ -207,6 +223,13 @@
wgpu::TextureViewDescriptor base3DTextureViewDescriptor =
CreateDefaultViewDescriptor(wgpu::TextureViewDimension::e3D);
+ // It is an error to create a view with zero 'arrayLayerCount'.
+ {
+ wgpu::TextureViewDescriptor descriptor = base3DTextureViewDescriptor;
+ descriptor.arrayLayerCount = 0;
+ ASSERT_DEVICE_ERROR(texture.CreateView(&descriptor));
+ }
+
// It is OK to create a 3D texture view on a 3D texture.
{
wgpu::TextureViewDescriptor descriptor = base3DTextureViewDescriptor;
@@ -264,11 +287,12 @@
ASSERT_DEVICE_ERROR(texture.CreateView(&descriptor));
}
- // baseArrayLayer == k && arrayLayerCount == 0 means to use layers k..end. But
- // baseArrayLayer must be 0, and arrayLayerCount must be 1 at most for 3D texture view.
+ // baseArrayLayer == k && arrayLayerCount == wgpu::kArrayLayerCountUndefined means to use
+ // layers k..end. But baseArrayLayer must be 0, and arrayLayerCount must be 1 at most for 3D
+ // texture view.
{
wgpu::TextureViewDescriptor descriptor = base3DTextureViewDescriptor;
- descriptor.arrayLayerCount = 0;
+ descriptor.arrayLayerCount = wgpu::kArrayLayerCountUndefined;
descriptor.baseArrayLayer = 0;
texture.CreateView(&descriptor);
descriptor.baseArrayLayer = 1;
@@ -371,7 +395,7 @@
}
{
wgpu::TextureViewDescriptor descriptor;
- descriptor.arrayLayerCount = 0;
+ descriptor.arrayLayerCount = wgpu::kArrayLayerCountUndefined;
texture.CreateView(&descriptor);
descriptor.arrayLayerCount = 1;
texture.CreateView(&descriptor);
@@ -416,7 +440,7 @@
}
{
wgpu::TextureViewDescriptor descriptor;
- descriptor.arrayLayerCount = 0;
+ descriptor.arrayLayerCount = wgpu::kArrayLayerCountUndefined;
texture.CreateView(&descriptor);
descriptor.arrayLayerCount = 1;
texture.CreateView(&descriptor);
@@ -441,6 +465,14 @@
wgpu::TextureViewDescriptor base2DArrayTextureViewDescriptor =
CreateDefaultViewDescriptor(wgpu::TextureViewDimension::e2DArray);
+ // It is an error to create a view with zero 'arrayLayerCount'.
+ {
+ wgpu::TextureViewDescriptor descriptor = base2DArrayTextureViewDescriptor;
+ descriptor.dimension = wgpu::TextureViewDimension::Cube;
+ descriptor.arrayLayerCount = 0;
+ ASSERT_DEVICE_ERROR(texture.CreateView(&descriptor));
+ }
+
// It is OK to create a cube map texture view with arrayLayerCount == 6.
{
wgpu::TextureViewDescriptor descriptor = base2DArrayTextureViewDescriptor;