Make Snorm formats non-renderable
They aren't guaranteed renderable in Vulkan nor core OpenGL 4.5 without
extensions. They happened to work on a lot of our CQ builders but failed
on Intel OpenGL Linux which helped understand this was an issue.
BUG=dawn:128
Change-Id: I83c4f8116c1125c3bac2f1dd6197976c9063e129
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/9682
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Jiawei Shao <jiawei.shao@intel.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn_native/Format.cpp b/src/dawn_native/Format.cpp
index 44ae1d8..0f904bd 100644
--- a/src/dawn_native/Format.cpp
+++ b/src/dawn_native/Format.cpp
@@ -112,18 +112,18 @@
// 1 byte color formats
AddColorFormat(dawn::TextureFormat::R8Unorm, true, 1);
- AddColorFormat(dawn::TextureFormat::R8Snorm, true, 1);
+ AddColorFormat(dawn::TextureFormat::R8Snorm, false, 1);
AddColorFormat(dawn::TextureFormat::R8Uint, true, 1);
AddColorFormat(dawn::TextureFormat::R8Sint, true, 1);
// 2 bytes color formats
AddColorFormat(dawn::TextureFormat::R16Unorm, true, 2);
- AddColorFormat(dawn::TextureFormat::R16Snorm, true, 2);
+ AddColorFormat(dawn::TextureFormat::R16Snorm, false, 2);
AddColorFormat(dawn::TextureFormat::R16Uint, true, 2);
AddColorFormat(dawn::TextureFormat::R16Sint, true, 2);
AddColorFormat(dawn::TextureFormat::R16Float, true, 2);
AddColorFormat(dawn::TextureFormat::RG8Unorm, true, 2);
- AddColorFormat(dawn::TextureFormat::RG8Snorm, true, 2);
+ AddColorFormat(dawn::TextureFormat::RG8Snorm, false, 2);
AddColorFormat(dawn::TextureFormat::RG8Uint, true, 2);
AddColorFormat(dawn::TextureFormat::RG8Sint, true, 2);
@@ -132,13 +132,13 @@
AddColorFormat(dawn::TextureFormat::R32Sint, true, 4);
AddColorFormat(dawn::TextureFormat::R32Float, true, 4);
AddColorFormat(dawn::TextureFormat::RG16Unorm, true, 4);
- AddColorFormat(dawn::TextureFormat::RG16Snorm, true, 4);
+ AddColorFormat(dawn::TextureFormat::RG16Snorm, false, 4);
AddColorFormat(dawn::TextureFormat::RG16Uint, true, 4);
AddColorFormat(dawn::TextureFormat::RG16Sint, true, 4);
AddColorFormat(dawn::TextureFormat::RG16Float, true, 4);
AddColorFormat(dawn::TextureFormat::RGBA8Unorm, true, 4);
AddColorFormat(dawn::TextureFormat::RGBA8UnormSrgb, true, 4);
- AddColorFormat(dawn::TextureFormat::RGBA8Snorm, true, 4);
+ AddColorFormat(dawn::TextureFormat::RGBA8Snorm, false, 4);
AddColorFormat(dawn::TextureFormat::RGBA8Uint, true, 4);
AddColorFormat(dawn::TextureFormat::RGBA8Sint, true, 4);
AddColorFormat(dawn::TextureFormat::BGRA8Unorm, true, 4);
@@ -152,7 +152,7 @@
AddColorFormat(dawn::TextureFormat::RG32Sint, true, 8);
AddColorFormat(dawn::TextureFormat::RG32Float, true, 8);
AddColorFormat(dawn::TextureFormat::RGBA16Unorm, true, 8);
- AddColorFormat(dawn::TextureFormat::RGBA16Snorm, true, 8);
+ AddColorFormat(dawn::TextureFormat::RGBA16Snorm, false, 8);
AddColorFormat(dawn::TextureFormat::RGBA16Uint, true, 8);
AddColorFormat(dawn::TextureFormat::RGBA16Sint, true, 8);
AddColorFormat(dawn::TextureFormat::RGBA16Float, true, 8);
diff --git a/src/tests/end2end/TextureFormatTests.cpp b/src/tests/end2end/TextureFormatTests.cpp
index 0abc0a3..fb69740 100644
--- a/src/tests/end2end/TextureFormatTests.cpp
+++ b/src/tests/end2end/TextureFormatTests.cpp
@@ -394,11 +394,7 @@
std::vector<float> uncompressedData = {0.0f, 1.0f / maxValue, 1.0f, -1.0f};
DoFloatFormatSamplingTest(formatInfo, textureData, uncompressedData, 0.0001f / maxValue);
-
- // It is not possible to render minValue because -1.0f is the minimum and corresponds to
- // -maxValue (minValue is - maxValue -1)
- textureData[3] = -maxValue;
- DoFormatRenderingTest(formatInfo, uncompressedData, textureData);
+ // Snorm formats aren't renderable because they are not guaranteed renderable in Vulkan
}
template <typename T>
@@ -507,49 +503,31 @@
// Test the R8Snorm format
TEST_P(TextureFormatTest, R8Snorm) {
- // TODO(cwallez@chromium.org): This fails on the Mesa Intel GL driver, understand why.
- DAWN_SKIP_TEST_IF(IsOpenGL() && IsLinux() && IsIntel());
-
DoSnormTest<int8_t>({dawn::TextureFormat::R8Snorm, 1, Float, 1});
}
// Test the RG8Snorm format
TEST_P(TextureFormatTest, RG8Snorm) {
- // TODO(cwallez@chromium.org): This fails on the Mesa Intel GL driver, understand why.
- DAWN_SKIP_TEST_IF(IsOpenGL() && IsLinux() && IsIntel());
-
DoSnormTest<int8_t>({dawn::TextureFormat::RG8Snorm, 2, Float, 2});
}
// Test the RGBA8Snorm format
TEST_P(TextureFormatTest, RGBA8Snorm) {
- // TODO(cwallez@chromium.org): This fails on the Mesa Intel GL driver, understand why.
- DAWN_SKIP_TEST_IF(IsOpenGL() && IsLinux() && IsIntel());
-
DoSnormTest<int8_t>({dawn::TextureFormat::RGBA8Snorm, 4, Float, 4});
}
// Test the R16Snorm format
TEST_P(TextureFormatTest, R16Snorm) {
- // TODO(cwallez@chromium.org): This fails on the Mesa Intel GL driver, understand why.
- DAWN_SKIP_TEST_IF(IsOpenGL() && IsLinux() && IsIntel());
-
DoSnormTest<int16_t>({dawn::TextureFormat::R16Snorm, 2, Float, 1});
}
// Test the RG16Snorm format
TEST_P(TextureFormatTest, RG16Snorm) {
- // TODO(cwallez@chromium.org): This fails on the Mesa Intel GL driver, understand why.
- DAWN_SKIP_TEST_IF(IsOpenGL() && IsLinux() && IsIntel());
-
DoSnormTest<int16_t>({dawn::TextureFormat::RG16Snorm, 4, Float, 2});
}
// Test the RGBA16Snorm format
TEST_P(TextureFormatTest, RGBA16Snorm) {
- // TODO(cwallez@chromium.org): This fails on the Mesa Intel GL driver, understand why.
- DAWN_SKIP_TEST_IF(IsOpenGL() && IsLinux() && IsIntel());
-
DoSnormTest<int16_t>({dawn::TextureFormat::RGBA16Snorm, 8, Float, 4});
}
diff --git a/src/tests/unittests/validation/TextureValidationTests.cpp b/src/tests/unittests/validation/TextureValidationTests.cpp
index 75874f8..af783ba 100644
--- a/src/tests/unittests/validation/TextureValidationTests.cpp
+++ b/src/tests/unittests/validation/TextureValidationTests.cpp
@@ -245,9 +245,18 @@
descriptor.format = dawn::TextureFormat::RGBA8Unorm;
device.CreateTexture(&descriptor);
- // Fails because RG11B10Float is non-renderable
- descriptor.format = dawn::TextureFormat::RG11B10Float;
- ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
+ dawn::TextureFormat nonRenderableFormats[] = {
+ dawn::TextureFormat::RG11B10Float, dawn::TextureFormat::R8Snorm,
+ dawn::TextureFormat::RG8Snorm, dawn::TextureFormat::RGBA8Snorm,
+ dawn::TextureFormat::R16Snorm, dawn::TextureFormat::RG16Snorm,
+ dawn::TextureFormat::RGBA16Snorm,
+ };
+
+ for (dawn::TextureFormat format : nonRenderableFormats) {
+ // Fails because `format` is non-renderable
+ 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