Compat: Validated out sample_index
GLES 3.1 doesn't support sample_index (gl_SampleID)
Change-Id: I209e6eaf9712dd53fc02ec490583109f9975e0b4
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/168803
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Gregg Tavares <gman@chromium.org>
diff --git a/src/dawn/native/RenderPipeline.cpp b/src/dawn/native/RenderPipeline.cpp
index 3315697..2589b68 100644
--- a/src/dawn/native/RenderPipeline.cpp
+++ b/src/dawn/native/RenderPipeline.cpp
@@ -647,6 +647,11 @@
"sample_mask is not supported in compatibility mode in the fragment stage (%s, %s)",
descriptor->module, &entryPoint);
+ DAWN_INVALID_IF(
+ fragmentMetadata.usesSampleIndex,
+ "sample_index is not supported in compatibility mode in the fragment stage (%s, %s)",
+ descriptor->module, &entryPoint);
+
// Check that all the color target states match.
ColorAttachmentIndex firstColorTargetIndex{};
const ColorTargetState* firstColorTargetState = nullptr;
diff --git a/src/dawn/native/ShaderModule.cpp b/src/dawn/native/ShaderModule.cpp
index 2117673..c36db36 100644
--- a/src/dawn/native/ShaderModule.cpp
+++ b/src/dawn/native/ShaderModule.cpp
@@ -729,6 +729,7 @@
totalInterStageShaderComponents += 1;
}
metadata->usesSampleMaskOutput = entryPoint.output_sample_mask_used;
+ metadata->usesSampleIndex = entryPoint.sample_index_used;
if (entryPoint.sample_index_used) {
totalInterStageShaderComponents += 1;
}
diff --git a/src/dawn/native/ShaderModule.h b/src/dawn/native/ShaderModule.h
index a9ce0a2..9066530 100644
--- a/src/dawn/native/ShaderModule.h
+++ b/src/dawn/native/ShaderModule.h
@@ -284,6 +284,7 @@
bool usesInstanceIndex = false;
bool usesNumWorkgroups = false;
bool usesSampleMaskOutput = false;
+ bool usesSampleIndex = false;
bool usesVertexIndex = false;
};
diff --git a/src/dawn/tests/end2end/MaxLimitTests.cpp b/src/dawn/tests/end2end/MaxLimitTests.cpp
index b54648a..c8e2b26 100644
--- a/src/dawn/tests/end2end/MaxLimitTests.cpp
+++ b/src/dawn/tests/end2end/MaxLimitTests.cpp
@@ -862,6 +862,9 @@
};
void DoTest(const MaxInterStageLimitTestsSpec& spec) {
+ // Compat mode does not support sample index.
+ DAWN_TEST_UNSUPPORTED_IF(IsCompatibilityMode() && spec.hasSampleIndex);
+
wgpu::RenderPipeline pipeline = CreateRenderPipeline(spec);
EXPECT_NE(nullptr, pipeline.Get());
}
diff --git a/src/dawn/tests/end2end/ShaderTests.cpp b/src/dawn/tests/end2end/ShaderTests.cpp
index c2293e3..2c2c65a 100644
--- a/src/dawn/tests/end2end/ShaderTests.cpp
+++ b/src/dawn/tests/end2end/ShaderTests.cpp
@@ -630,6 +630,9 @@
// supported on some platforms.
DAWN_TEST_UNSUPPORTED_IF(HasToggleEnabled("disable_sample_variables"));
+ // Compat mode does not support sample_index
+ DAWN_TEST_UNSUPPORTED_IF(IsCompatibilityMode());
+
wgpu::ShaderModule vsModule = utils::CreateShaderModule(device, R"(
@vertex
fn main(@location(0) pos : vec4f) -> @builtin(position) vec4f {
diff --git a/src/dawn/tests/unittests/validation/CompatValidationTests.cpp b/src/dawn/tests/unittests/validation/CompatValidationTests.cpp
index 41c33d4..ea72185 100644
--- a/src/dawn/tests/unittests/validation/CompatValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/CompatValidationTests.cpp
@@ -261,6 +261,54 @@
}
}
+TEST_F(CompatValidationTest, CanNotUseFragmentShaderWithSampleIndex) {
+ wgpu::ShaderModule moduleSampleMaskOutput = utils::CreateShaderModule(device, R"(
+ @vertex fn vs() -> @builtin(position) vec4f {
+ return vec4f(1);
+ }
+ struct Output {
+ @location(0) color : vec4f,
+ }
+ @fragment fn fsWithoutSampleIndexUsage() -> @location(0) vec4f {
+ return vec4f(1.0, 1.0, 1.0, 1.0);
+ }
+ @fragment fn fsWithSampleIndexUsage(@builtin(sample_index) sNdx: u32) -> Output {
+ var o: Output;
+ _ = sNdx;
+ o.color = vec4f(1.0, 1.0, 1.0, 1.0);
+ return o;
+ }
+ )");
+
+ // Check we can use a fragment shader that doesn't use sample_index from
+ // the same module as one that does.
+ {
+ utils::ComboRenderPipelineDescriptor descriptor;
+ descriptor.vertex.module = moduleSampleMaskOutput;
+ descriptor.vertex.entryPoint = "vs";
+ descriptor.cFragment.module = moduleSampleMaskOutput;
+ descriptor.cFragment.entryPoint = "fsWithoutSampleIndexUsage";
+ descriptor.multisample.count = 4;
+ descriptor.multisample.alphaToCoverageEnabled = false;
+
+ device.CreateRenderPipeline(&descriptor);
+ }
+
+ // Check we can not use a fragment shader that uses sample_index.
+ {
+ utils::ComboRenderPipelineDescriptor descriptor;
+ descriptor.vertex.module = moduleSampleMaskOutput;
+ descriptor.vertex.entryPoint = "vs";
+ descriptor.cFragment.module = moduleSampleMaskOutput;
+ descriptor.cFragment.entryPoint = "fsWithSampleIndexUsage";
+ descriptor.multisample.count = 4;
+ descriptor.multisample.alphaToCoverageEnabled = false;
+
+ ASSERT_DEVICE_ERROR(device.CreateRenderPipeline(&descriptor),
+ testing::HasSubstr("sample_index"));
+ }
+}
+
TEST_F(CompatValidationTest, CanNotUseShaderWithUnsupportedInterpolateTypeOrSampling) {
static const char* interpolateParams[] = {
"linear",