Compat: Disallow @interpolate(linear/sample)
OpenGL ES 3.1 doesn't support these interpolation modes
Bug: dawn:2293
Change-Id: I103d8b1495531d8230a86e8bf3a342fedbe3abde
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/165800
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Gregg Tavares <gman@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/dawn/native/RenderPipeline.cpp b/src/dawn/native/RenderPipeline.cpp
index a44097e..1b6357f 100644
--- a/src/dawn/native/RenderPipeline.cpp
+++ b/src/dawn/native/RenderPipeline.cpp
@@ -715,6 +715,18 @@
"different from the interpolation sampling (%s) of the fragment input at "
"location %u.",
vertexOutputInfo.interpolationSampling, i, fragmentInputInfo.interpolationSampling, i);
+
+ DAWN_INVALID_IF(device->IsCompatibilityMode() &&
+ vertexOutputInfo.interpolationType == InterpolationType::Linear,
+ "The interpolation type (%s) of the vertex output at location %u is not "
+ "supported in compatibility mode",
+ vertexOutputInfo.interpolationType, i);
+
+ DAWN_INVALID_IF(device->IsCompatibilityMode() &&
+ vertexOutputInfo.interpolationSampling == InterpolationSampling::Sample,
+ "The interpolation sampling (%s) of the vertex output at location %u is "
+ "not supported in compatibility mode",
+ vertexOutputInfo.interpolationSampling, i);
}
return {};
diff --git a/src/dawn/tests/unittests/validation/CompatValidationTests.cpp b/src/dawn/tests/unittests/validation/CompatValidationTests.cpp
index 522b327..1ec8684 100644
--- a/src/dawn/tests/unittests/validation/CompatValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/CompatValidationTests.cpp
@@ -234,6 +234,65 @@
}
}
+TEST_F(CompatValidationTest, CanNotUseShaderWithUnsupportedInterpolateTypeOrSampling) {
+ static const char* interpolateParams[] = {
+ "linear",
+ "perspective, sample",
+ };
+ for (auto interpolateParam : interpolateParams) {
+ auto wgsl = absl::StrFormat(R"(
+ struct Vertex {
+ @builtin(position) pos: vec4f,
+ @location(0) @interpolate(%s) color : vec4f,
+ };
+ @vertex fn vs() -> Vertex {
+ var v: Vertex;
+ v.pos = vec4f(1);
+ v.color = vec4f(1);
+ return v;
+ }
+ @fragment fn fsWithoutBadInterpolationUsage() -> @location(0) vec4f {
+ return vec4f(1);
+ }
+ @fragment fn fsWithBadInterpolationUsage1(v: Vertex) -> @location(0) vec4f {
+ return vec4f(1);
+ }
+ @fragment fn fsWithBadInterpolationUsage2(v: Vertex) -> @location(0) vec4f {
+ return v.pos;
+ }
+ @fragment fn fsWithBadInterpolationUsage3(v: Vertex) -> @location(0) vec4f {
+ return v.color;
+ }
+ )",
+ interpolateParam);
+ wgpu::ShaderModule moduleInterpolationLinear =
+ utils::CreateShaderModule(device, wgsl.c_str());
+
+ static const char* entryPoints[] = {
+ "fsWithoutBadInterpolationUsage",
+ "fsWithBadInterpolationUsage1",
+ "fsWithBadInterpolationUsage2",
+ "fsWithBadInterpolationUsage3",
+ };
+ for (auto entryPoint : entryPoints) {
+ utils::ComboRenderPipelineDescriptor descriptor;
+ descriptor.vertex.module = moduleInterpolationLinear;
+ descriptor.vertex.entryPoint = "vs";
+ descriptor.cFragment.module = moduleInterpolationLinear;
+ descriptor.cFragment.entryPoint = entryPoint;
+
+ bool shouldSucceed = entryPoint == entryPoints[0];
+
+ if (shouldSucceed) {
+ device.CreateRenderPipeline(&descriptor);
+ } else {
+ ASSERT_DEVICE_ERROR(device.CreateRenderPipeline(&descriptor),
+ testing::HasSubstr("in compatibility mode"));
+ }
+ }
+ }
+}
+
constexpr const char* kRenderTwoTexturesOneBindgroupWGSL = R"(
@vertex
fn vs(@builtin(vertex_index) VertexIndex : u32) -> @builtin(position) vec4f {