Validate texture max size
Bug: dawn:294
Change-Id: I966dd87bfc0584fdcfa734193d083fcaa6b50898
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/14283
Commit-Queue: Natasha Lee <natlee@microsoft.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn_native/Texture.cpp b/src/dawn_native/Texture.cpp
index b6a50d6..e1b70b2 100644
--- a/src/dawn_native/Texture.cpp
+++ b/src/dawn_native/Texture.cpp
@@ -141,6 +141,10 @@
MaybeError ValidateTextureSize(const TextureDescriptor* descriptor, const Format* format) {
ASSERT(descriptor->size.width != 0 && descriptor->size.height != 0);
+ if (descriptor->size.width > kMaxTextureSize ||
+ descriptor->size.height > kMaxTextureSize) {
+ return DAWN_VALIDATION_ERROR("Texture max size exceeded");
+ }
if (Log2(std::max(descriptor->size.width, descriptor->size.height)) + 1 <
descriptor->mipLevelCount) {
@@ -153,6 +157,13 @@
"The size of the texture is incompatible with the texture format");
}
+ if (descriptor->arrayLayerCount > kMaxTexture2DArrayLayers) {
+ return DAWN_VALIDATION_ERROR("Texture 2D array layer count exceeded");
+ }
+ if (descriptor->mipLevelCount > kMaxTexture2DMipLevels) {
+ return DAWN_VALIDATION_ERROR("Max texture 2D mip level exceeded");
+ }
+
return {};
}
diff --git a/src/tests/unittests/validation/TextureValidationTests.cpp b/src/tests/unittests/validation/TextureValidationTests.cpp
index 9e2488f..5e9cafa 100644
--- a/src/tests/unittests/validation/TextureValidationTests.cpp
+++ b/src/tests/unittests/validation/TextureValidationTests.cpp
@@ -172,6 +172,76 @@
device.CreateTexture(&descriptor);
}
+
+ // Mip level exceeding kMaxTexture2DMipLevels not allowed
+ {
+ wgpu::TextureDescriptor descriptor = defaultDescriptor;
+ descriptor.size.width = 1 >> kMaxTexture2DMipLevels;
+ descriptor.size.height = 1 >> kMaxTexture2DMipLevels;
+ descriptor.mipLevelCount = kMaxTexture2DMipLevels + 1u;
+
+ ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
+ }
+}
+// Test the validation of array layer count
+TEST_F(TextureValidationTest, ArrayLayerCount) {
+ wgpu::TextureDescriptor defaultDescriptor = CreateDefaultTextureDescriptor();
+
+ // Array layer count exceeding kMaxTexture2DArrayLayers is not allowed
+ {
+ wgpu::TextureDescriptor descriptor = defaultDescriptor;
+ descriptor.arrayLayerCount = kMaxTexture2DArrayLayers + 1u;
+
+ ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
+ }
+
+ // Array layer count less than kMaxTexture2DArrayLayers is allowed;
+ {
+ wgpu::TextureDescriptor descriptor = defaultDescriptor;
+ descriptor.arrayLayerCount = kMaxTexture2DArrayLayers >> 1;
+
+ device.CreateTexture(&descriptor);
+ }
+
+ // Array layer count equal to kMaxTexture2DArrayLayers is allowed;
+ {
+ wgpu::TextureDescriptor descriptor = defaultDescriptor;
+ descriptor.arrayLayerCount = kMaxTexture2DArrayLayers;
+
+ device.CreateTexture(&descriptor);
+ }
+}
+
+// Test the validation of texture size
+TEST_F(TextureValidationTest, TextureSize) {
+ wgpu::TextureDescriptor defaultDescriptor = CreateDefaultTextureDescriptor();
+
+ // Texture size exceeding kMaxTextureSize is not allowed
+ {
+ wgpu::TextureDescriptor descriptor = defaultDescriptor;
+ descriptor.size.width = kMaxTextureSize + 1u;
+ descriptor.size.height = kMaxTextureSize + 1u;
+
+ ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
+ }
+
+ // Texture size less than kMaxTextureSize is allowed
+ {
+ wgpu::TextureDescriptor descriptor = defaultDescriptor;
+ descriptor.size.width = kMaxTextureSize >> 1;
+ descriptor.size.height = kMaxTextureSize >> 1;
+
+ device.CreateTexture(&descriptor);
+ }
+
+ // Texture equal to kMaxTextureSize is allowed
+ {
+ wgpu::TextureDescriptor descriptor = defaultDescriptor;
+ descriptor.size.width = kMaxTextureSize;
+ descriptor.size.height = kMaxTextureSize;
+
+ device.CreateTexture(&descriptor);
+ }
}
// Test that it is valid to destroy a texture