Rely on Tint to validate shader IO and bindings have decorations.
This removes a little bit of noise from the reflection of shader metadata in Dawn. Tests are added to make sure that Tint does the correct validation (it does). Bug: None Change-Id: I334e7c23b723cf5b5985c9914cc9f8d79a7c0568 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/85502 Reviewed-by: Austin Eng <enga@chromium.org> Reviewed-by: Loko Kung <lokokung@google.com> Commit-Queue: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
parent
2f2977b728
commit
2787a4c64c
|
@ -703,11 +703,6 @@ namespace dawn::native {
|
|||
|
||||
if (metadata->stage == SingleShaderStage::Vertex) {
|
||||
for (const auto& inputVar : entryPoint.input_variables) {
|
||||
DAWN_INVALID_IF(
|
||||
!inputVar.has_location_decoration,
|
||||
"Vertex input variable \"%s\" doesn't have a location decoration.",
|
||||
inputVar.name);
|
||||
|
||||
uint32_t unsanitizedLocation = inputVar.location_decoration;
|
||||
if (DelayedInvalidIf(unsanitizedLocation >= kMaxVertexAttributes,
|
||||
"Vertex input variable \"%s\" has a location (%u) that "
|
||||
|
@ -742,11 +737,6 @@ namespace dawn::native {
|
|||
outputVar.interpolation_sampling));
|
||||
totalInterStageShaderComponents += variable.componentCount;
|
||||
|
||||
DAWN_INVALID_IF(
|
||||
!outputVar.has_location_decoration,
|
||||
"Vertex ouput variable \"%s\" doesn't have a location decoration.",
|
||||
outputVar.name);
|
||||
|
||||
uint32_t location = outputVar.location_decoration;
|
||||
if (DelayedInvalidIf(location > kMaxInterStageShaderLocation,
|
||||
"Vertex output variable \"%s\" has a location (%u) that "
|
||||
|
@ -782,11 +772,6 @@ namespace dawn::native {
|
|||
inputVar.interpolation_sampling));
|
||||
totalInterStageShaderComponents += variable.componentCount;
|
||||
|
||||
DAWN_INVALID_IF(
|
||||
!inputVar.has_location_decoration,
|
||||
"Fragment input variable \"%s\" doesn't have a location decoration.",
|
||||
inputVar.name);
|
||||
|
||||
uint32_t location = inputVar.location_decoration;
|
||||
if (DelayedInvalidIf(location > kMaxInterStageShaderLocation,
|
||||
"Fragment input variable \"%s\" has a location (%u) that "
|
||||
|
@ -826,11 +811,6 @@ namespace dawn::native {
|
|||
TintCompositionTypeToInterStageComponentCount(outputVar.composition_type));
|
||||
ASSERT(variable.componentCount <= 4);
|
||||
|
||||
DAWN_INVALID_IF(
|
||||
!outputVar.has_location_decoration,
|
||||
"Fragment input variable \"%s\" doesn't have a location decoration.",
|
||||
outputVar.name);
|
||||
|
||||
uint32_t unsanitizedAttachment = outputVar.location_decoration;
|
||||
if (DelayedInvalidIf(unsanitizedAttachment >= kMaxColorAttachments,
|
||||
"Fragment output variable \"%s\" has a location (%u) that "
|
||||
|
|
|
@ -575,3 +575,87 @@ TEST_F(ShaderModuleValidationTest, MaxBindingNumber) {
|
|||
)");
|
||||
ASSERT_DEVICE_ERROR(device.CreateComputePipeline(&desc));
|
||||
}
|
||||
|
||||
// Test that missing decorations on shader IO or bindings causes a validation error.
|
||||
TEST_F(ShaderModuleValidationTest, MissingDecorations) {
|
||||
// Vertex input.
|
||||
utils::CreateShaderModule(device, R"(
|
||||
@stage(vertex) fn main(@location(0) a : vec4<f32>) -> @builtin(position) vec4<f32> {
|
||||
return vec4(1.0);
|
||||
}
|
||||
)");
|
||||
ASSERT_DEVICE_ERROR(utils::CreateShaderModule(device, R"(
|
||||
@stage(vertex) fn main(a : vec4<f32>) -> @builtin(position) vec4<f32> {
|
||||
return vec4(1.0);
|
||||
}
|
||||
)"));
|
||||
|
||||
// Vertex output
|
||||
utils::CreateShaderModule(device, R"(
|
||||
struct Output {
|
||||
@builtin(position) pos : vec4<f32>,
|
||||
@location(0) a : f32,
|
||||
}
|
||||
@stage(vertex) fn main() -> Output {
|
||||
var output : Output;
|
||||
return output;
|
||||
}
|
||||
)");
|
||||
ASSERT_DEVICE_ERROR(utils::CreateShaderModule(device, R"(
|
||||
struct Output {
|
||||
@builtin(position) pos : vec4<f32>,
|
||||
a : f32,
|
||||
}
|
||||
@stage(vertex) fn main() -> Output {
|
||||
var output : Output;
|
||||
return output;
|
||||
}
|
||||
)"));
|
||||
|
||||
// Fragment input
|
||||
utils::CreateShaderModule(device, R"(
|
||||
@stage(fragment) fn main(@location(0) a : vec4<f32>) -> @location(0) f32 {
|
||||
return 1.0;
|
||||
}
|
||||
)");
|
||||
ASSERT_DEVICE_ERROR(utils::CreateShaderModule(device, R"(
|
||||
@stage(fragment) fn main(a : vec4<f32>) -> @location(0) f32 {
|
||||
return 1.0;
|
||||
}
|
||||
)"));
|
||||
|
||||
// Fragment input
|
||||
utils::CreateShaderModule(device, R"(
|
||||
@stage(fragment) fn main() -> @location(0) f32 {
|
||||
return 1.0;
|
||||
}
|
||||
)");
|
||||
ASSERT_DEVICE_ERROR(utils::CreateShaderModule(device, R"(
|
||||
@stage(fragment) fn main() -> f32 {
|
||||
return 1.0;
|
||||
}
|
||||
)"));
|
||||
|
||||
// Binding decorations
|
||||
utils::CreateShaderModule(device, R"(
|
||||
@group(0) @binding(0) var s : sampler;
|
||||
@stage(fragment) fn main() -> @location(0) f32 {
|
||||
_ = s;
|
||||
return 1.0;
|
||||
}
|
||||
)");
|
||||
ASSERT_DEVICE_ERROR(utils::CreateShaderModule(device, R"(
|
||||
@binding(0) var s : sampler;
|
||||
@stage(fragment) fn main() -> @location(0) f32 {
|
||||
_ = s;
|
||||
return 1.0;
|
||||
}
|
||||
)"));
|
||||
ASSERT_DEVICE_ERROR(utils::CreateShaderModule(device, R"(
|
||||
@group(0) var s : sampler;
|
||||
@stage(fragment) fn main() -> @location(0) f32 {
|
||||
_ = s;
|
||||
return 1.0;
|
||||
}
|
||||
)"));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue