intrinsics.def: Tighten up texture constraints

Nothing was limiting the texel format to i32, u32, f32, and so the resolver was accepting any type here, and things would break in the backends.

Also limit texture access controls to read or write. read_write is not supported for textures currently.

Change-Id: I41c54a9b285800ad89aa1c4ea07e142ba0506384
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/53044
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
Ben Clayton 2021-06-03 08:32:44 +00:00 committed by Tint LUCI CQ
parent efb741fe13
commit 57d6bd2ef3
4 changed files with 710 additions and 672 deletions

File diff suppressed because it is too large Load Diff

View File

@ -268,7 +268,7 @@ std::string {{$class}}::String(MatchState&) const {
{{- if IsFirstIn . $.Types }}{{.Name}}
{{- else if IsLastIn . $.Types }} or {{.Name}}
{{- else }}, {{.Name}}
{{- end -}}
{{- end -}}
{{- end -}}
";
}
@ -319,7 +319,14 @@ Number {{$class}}::Match(MatchState&, Number number) const {
{{- end }}
std::string {{$class}}::String(MatchState&) const {
return "{{.Name}}";
return "
{{- range .Options -}}
{{- if IsFirstIn . $.Options }}{{.Name}}
{{- else if IsLastIn . $.Options }} or {{.Name}}
{{- else }}, {{.Name}}
{{- end -}}
{{- end -}}
";
}
{{ end -}}

View File

@ -473,30 +473,30 @@ TEST_F(IntrinsicTableTest, OverloadOrderByNumberOfParameters) {
R"(error: no matching call to textureDimensions(bool, bool)
25 candidate functions:
textureDimensions(texture: texture_2d<T>, level: i32) -> vec2<i32>
textureDimensions(texture: texture_2d_array<T>, level: i32) -> vec2<i32>
textureDimensions(texture: texture_3d<T>, level: i32) -> vec3<i32>
textureDimensions(texture: texture_cube<T>, level: i32) -> vec3<i32>
textureDimensions(texture: texture_cube_array<T>, level: i32) -> vec3<i32>
textureDimensions(texture: texture_2d<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_2d_array<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_3d<T>, level: i32) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_cube<T>, level: i32) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_cube_array<T>, level: i32) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32>
textureDimensions(texture: texture_depth_cube, level: i32) -> vec3<i32>
textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec3<i32>
textureDimensions(texture: texture_1d<T>) -> i32
textureDimensions(texture: texture_2d<T>) -> vec2<i32>
textureDimensions(texture: texture_2d_array<T>) -> vec2<i32>
textureDimensions(texture: texture_3d<T>) -> vec3<i32>
textureDimensions(texture: texture_cube<T>) -> vec3<i32>
textureDimensions(texture: texture_cube_array<T>) -> vec3<i32>
textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32>
textureDimensions(texture: texture_1d<T>) -> i32 where: T is f32, i32 or u32
textureDimensions(texture: texture_2d<T>) -> vec2<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_2d_array<T>) -> vec2<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_3d<T>) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_cube<T>) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_cube_array<T>) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_depth_2d) -> vec2<i32>
textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
textureDimensions(texture: texture_depth_cube) -> vec3<i32>
textureDimensions(texture: texture_depth_cube_array) -> vec3<i32>
textureDimensions(texture: texture_storage_1d<F, A>) -> i32
textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<i32>
textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<i32>
textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<i32>
textureDimensions(texture: texture_storage_1d<F, A>) -> i32 where: A is read or write
textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<i32> where: A is read or write
textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<i32> where: A is read or write
textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<i32> where: A is read or write
textureDimensions(texture: texture_external) -> vec2<i32>
)");
}
@ -512,28 +512,28 @@ TEST_F(IntrinsicTableTest, OverloadOrderByMatchingParameter) {
25 candidate functions:
textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
textureDimensions(texture: texture_depth_2d) -> vec2<i32>
textureDimensions(texture: texture_2d<T>, level: i32) -> vec2<i32>
textureDimensions(texture: texture_2d_array<T>, level: i32) -> vec2<i32>
textureDimensions(texture: texture_3d<T>, level: i32) -> vec3<i32>
textureDimensions(texture: texture_cube<T>, level: i32) -> vec3<i32>
textureDimensions(texture: texture_cube_array<T>, level: i32) -> vec3<i32>
textureDimensions(texture: texture_2d<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_2d_array<T>, level: i32) -> vec2<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_3d<T>, level: i32) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_cube<T>, level: i32) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_cube_array<T>, level: i32) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_depth_2d_array, level: i32) -> vec2<i32>
textureDimensions(texture: texture_depth_cube, level: i32) -> vec3<i32>
textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec3<i32>
textureDimensions(texture: texture_1d<T>) -> i32
textureDimensions(texture: texture_2d<T>) -> vec2<i32>
textureDimensions(texture: texture_2d_array<T>) -> vec2<i32>
textureDimensions(texture: texture_3d<T>) -> vec3<i32>
textureDimensions(texture: texture_cube<T>) -> vec3<i32>
textureDimensions(texture: texture_cube_array<T>) -> vec3<i32>
textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32>
textureDimensions(texture: texture_1d<T>) -> i32 where: T is f32, i32 or u32
textureDimensions(texture: texture_2d<T>) -> vec2<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_2d_array<T>) -> vec2<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_3d<T>) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_cube<T>) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_cube_array<T>) -> vec3<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_multisampled_2d<T>) -> vec2<i32> where: T is f32, i32 or u32
textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
textureDimensions(texture: texture_depth_cube) -> vec3<i32>
textureDimensions(texture: texture_depth_cube_array) -> vec3<i32>
textureDimensions(texture: texture_storage_1d<F, A>) -> i32
textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<i32>
textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<i32>
textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<i32>
textureDimensions(texture: texture_storage_1d<F, A>) -> i32 where: A is read or write
textureDimensions(texture: texture_storage_2d<F, A>) -> vec2<i32> where: A is read or write
textureDimensions(texture: texture_storage_2d_array<F, A>) -> vec2<i32> where: A is read or write
textureDimensions(texture: texture_storage_3d<F, A>) -> vec3<i32> where: A is read or write
textureDimensions(texture: texture_external) -> vec2<i32>
)");
}

View File

@ -121,6 +121,8 @@ match i32_texel_format:
match u32_texel_format:
rgba8uint | rgba16uint | r32uint | rg32uint | rgba32uint
match read_or_write: read | write
////////////////////////////////////////////////////////////////////////////////
// Intrinsic Functions //
// //
@ -378,18 +380,18 @@ fn unpack2x16unorm(u32) -> vec2<f32>
fn unpack4x8snorm(u32) -> vec4<f32>
fn unpack4x8unorm(u32) -> vec4<f32>
fn workgroupBarrier()
fn textureDimensions<T>(texture: texture_1d<T>) -> i32
fn textureDimensions<T>(texture: texture_2d<T>) -> vec2<i32>
fn textureDimensions<T>(texture: texture_2d<T>, level: i32) -> vec2<i32>
fn textureDimensions<T>(texture: texture_2d_array<T>) -> vec2<i32>
fn textureDimensions<T>(texture: texture_2d_array<T>, level: i32) -> vec2<i32>
fn textureDimensions<T>(texture: texture_3d<T>) -> vec3<i32>
fn textureDimensions<T>(texture: texture_3d<T>, level: i32) -> vec3<i32>
fn textureDimensions<T>(texture: texture_cube<T>) -> vec3<i32>
fn textureDimensions<T>(texture: texture_cube<T>, level: i32) -> vec3<i32>
fn textureDimensions<T>(texture: texture_cube_array<T>) -> vec3<i32>
fn textureDimensions<T>(texture: texture_cube_array<T>, level: i32) -> vec3<i32>
fn textureDimensions<T>(texture: texture_multisampled_2d<T>) -> vec2<i32>
fn textureDimensions<T: fiu32>(texture: texture_1d<T>) -> i32
fn textureDimensions<T: fiu32>(texture: texture_2d<T>) -> vec2<i32>
fn textureDimensions<T: fiu32>(texture: texture_2d<T>, level: i32) -> vec2<i32>
fn textureDimensions<T: fiu32>(texture: texture_2d_array<T>) -> vec2<i32>
fn textureDimensions<T: fiu32>(texture: texture_2d_array<T>, level: i32) -> vec2<i32>
fn textureDimensions<T: fiu32>(texture: texture_3d<T>) -> vec3<i32>
fn textureDimensions<T: fiu32>(texture: texture_3d<T>, level: i32) -> vec3<i32>
fn textureDimensions<T: fiu32>(texture: texture_cube<T>) -> vec3<i32>
fn textureDimensions<T: fiu32>(texture: texture_cube<T>, level: i32) -> vec3<i32>
fn textureDimensions<T: fiu32>(texture: texture_cube_array<T>) -> vec3<i32>
fn textureDimensions<T: fiu32>(texture: texture_cube_array<T>, level: i32) -> vec3<i32>
fn textureDimensions<T: fiu32>(texture: texture_multisampled_2d<T>) -> vec2<i32>
fn textureDimensions(texture: texture_depth_2d) -> vec2<i32>
fn textureDimensions(texture: texture_depth_2d, level: i32) -> vec2<i32>
fn textureDimensions(texture: texture_depth_2d_array) -> vec2<i32>
@ -398,26 +400,26 @@ fn textureDimensions(texture: texture_depth_cube) -> vec3<i32>
fn textureDimensions(texture: texture_depth_cube, level: i32) -> vec3<i32>
fn textureDimensions(texture: texture_depth_cube_array) -> vec3<i32>
fn textureDimensions(texture: texture_depth_cube_array, level: i32) -> vec3<i32>
fn textureDimensions<F: texel_format, A: access_control>(texture: texture_storage_1d<F, A>) -> i32
fn textureDimensions<F: texel_format, A: access_control>(texture: texture_storage_2d<F, A>) -> vec2<i32>
fn textureDimensions<F: texel_format, A: access_control>(texture: texture_storage_2d_array<F, A>) -> vec2<i32>
fn textureDimensions<F: texel_format, A: access_control>(texture: texture_storage_3d<F, A>) -> vec3<i32>
fn textureDimensions<F: texel_format, A: read_or_write>(texture: texture_storage_1d<F, A>) -> i32
fn textureDimensions<F: texel_format, A: read_or_write>(texture: texture_storage_2d<F, A>) -> vec2<i32>
fn textureDimensions<F: texel_format, A: read_or_write>(texture: texture_storage_2d_array<F, A>) -> vec2<i32>
fn textureDimensions<F: texel_format, A: read_or_write>(texture: texture_storage_3d<F, A>) -> vec3<i32>
fn textureDimensions(texture: texture_external) -> vec2<i32>
fn textureNumLayers<T>(texture: texture_2d_array<T>) -> i32
fn textureNumLayers<T>(texture: texture_cube_array<T>) -> i32
fn textureNumLayers<T: fiu32>(texture: texture_2d_array<T>) -> i32
fn textureNumLayers<T: fiu32>(texture: texture_cube_array<T>) -> i32
fn textureNumLayers(texture: texture_depth_2d_array) -> i32
fn textureNumLayers(texture: texture_depth_cube_array) -> i32
fn textureNumLayers<F: texel_format, A: access_control>(texture: texture_storage_2d_array<F, A>) -> i32
fn textureNumLevels<T>(texture: texture_2d<T>) -> i32
fn textureNumLevels<T>(texture: texture_2d_array<T>) -> i32
fn textureNumLevels<T>(texture: texture_3d<T>) -> i32
fn textureNumLevels<T>(texture: texture_cube<T>) -> i32
fn textureNumLevels<T>(texture: texture_cube_array<T>) -> i32
fn textureNumLayers<F: texel_format, A: read_or_write>(texture: texture_storage_2d_array<F, A>) -> i32
fn textureNumLevels<T: fiu32>(texture: texture_2d<T>) -> i32
fn textureNumLevels<T: fiu32>(texture: texture_2d_array<T>) -> i32
fn textureNumLevels<T: fiu32>(texture: texture_3d<T>) -> i32
fn textureNumLevels<T: fiu32>(texture: texture_cube<T>) -> i32
fn textureNumLevels<T: fiu32>(texture: texture_cube_array<T>) -> i32
fn textureNumLevels(texture: texture_depth_2d) -> i32
fn textureNumLevels(texture: texture_depth_2d_array) -> i32
fn textureNumLevels(texture: texture_depth_cube) -> i32
fn textureNumLevels(texture: texture_depth_cube_array) -> i32
fn textureNumSamples<T>(texture: texture_multisampled_2d<T>) -> i32
fn textureNumSamples<T: fiu32>(texture: texture_multisampled_2d<T>) -> i32
fn textureSample(texture: texture_1d<f32>, sampler: sampler, coords: f32) -> vec4<f32>
fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>) -> vec4<f32>
fn textureSample(texture: texture_2d<f32>, sampler: sampler, coords: vec2<f32>, offset: vec2<i32>) -> vec4<f32>
@ -483,11 +485,11 @@ fn textureStore(texture: texture_storage_1d<u32_texel_format, write>, coords: i3
fn textureStore(texture: texture_storage_2d<u32_texel_format, write>, coords: vec2<i32>, value: vec4<u32>)
fn textureStore(texture: texture_storage_2d_array<u32_texel_format, write>, coords: vec2<i32>, array_index: i32, value: vec4<u32>)
fn textureStore(texture: texture_storage_3d<u32_texel_format, write>, coords: vec3<i32>, value: vec4<u32>)
fn textureLoad<T>(texture: texture_1d<T>, coords: i32, level: i32) -> vec4<T>
fn textureLoad<T>(texture: texture_2d<T>, coords: vec2<i32>, level: i32) -> vec4<T>
fn textureLoad<T>(texture: texture_2d_array<T>, coords: vec2<i32>, array_index: i32, level: i32) -> vec4<T>
fn textureLoad<T>(texture: texture_3d<T>, coords: vec3<i32>, level: i32) -> vec4<T>
fn textureLoad<T>(texture: texture_multisampled_2d<T>, coords: vec2<i32>, sample_index: i32) -> vec4<T>
fn textureLoad<T: fiu32>(texture: texture_1d<T>, coords: i32, level: i32) -> vec4<T>
fn textureLoad<T: fiu32>(texture: texture_2d<T>, coords: vec2<i32>, level: i32) -> vec4<T>
fn textureLoad<T: fiu32>(texture: texture_2d_array<T>, coords: vec2<i32>, array_index: i32, level: i32) -> vec4<T>
fn textureLoad<T: fiu32>(texture: texture_3d<T>, coords: vec3<i32>, level: i32) -> vec4<T>
fn textureLoad<T: fiu32>(texture: texture_multisampled_2d<T>, coords: vec2<i32>, sample_index: i32) -> vec4<T>
fn textureLoad(texture: texture_depth_2d, coords: vec2<i32>, level: i32) -> f32
fn textureLoad(texture: texture_depth_2d_array, coords: vec2<i32>, array_index: i32, level: i32) -> f32
fn textureLoad(texture: texture_storage_1d<f32_texel_format, read>, coords: i32) -> vec4<f32>