Skip to content

Commit 68861e3

Browse files
johnstiles-googleSkia Commit-Bot
authored and
Skia Commit-Bot
committed
Add unit tests for assignment and invalid field access.
Change-Id: I8b755ae0078d6353e24834cd15603091d681114c Bug: skia:10766 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/319698 Commit-Queue: John Stiles <[email protected]> Reviewed-by: Brian Salomon <[email protected]> Auto-Submit: John Stiles <[email protected]>
1 parent 2c62e7e commit 68861e3

10 files changed

+158
-19
lines changed

gn/sksl_tests.gni

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ sksl_error_tests = [
6969
"$_tests/sksl/errors/ArgumentModifiers.sksl",
7070
"$_tests/sksl/errors/AssignmentTypeMismatch.sksl",
7171
"$_tests/sksl/errors/BadCaps.sksl",
72+
"$_tests/sksl/errors/BadFieldAccess.sksl",
7273
"$_tests/sksl/errors/BadIndex.sksl",
7374
"$_tests/sksl/errors/BadModifiers.sksl",
7475
"$_tests/sksl/errors/BinaryTypeCoercion.sksl",
@@ -145,7 +146,7 @@ sksl_shared_tests = [
145146
"$_tests/sksl/shared/ArrayConstructors.sksl",
146147
"$_tests/sksl/shared/ArrayIndexTypes.sksl",
147148
"$_tests/sksl/shared/ArrayTypes.sksl",
148-
"$_tests/sksl/shared/AssignmentTypeMatch.sksl",
149+
"$_tests/sksl/shared/Assignment.sksl",
149150
"$_tests/sksl/shared/BoolFolding.sksl",
150151
"$_tests/sksl/shared/Caps.sksl",
151152
"$_tests/sksl/shared/CastsRoundTowardZero.sksl",

src/sksl/SkSLIRGenerator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2483,7 +2483,7 @@ std::unique_ptr<Expression> IRGenerator::convertField(std::unique_ptr<Expression
24832483
}
24842484
}
24852485
fErrors.error(base->fOffset, "type '" + baseType.displayName() + "' does not have a field "
2486-
"named '" + field + "");
2486+
"named '" + field + "'");
24872487
return nullptr;
24882488
}
24892489

tests/sksl/errors/BadFieldAccess.sksl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
struct S { float f; };
2+
3+
void not_a_field() { S s; s.missing = 123; }
4+
void not_a_function() { S s; s.f(); }
5+
void not_a_bvec() { S s; s.f = bool3(true); }
6+
void not_a_struct() { S s; s.f.missing; }
7+
void not_an_array() { S s; s.f[0]; }
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
### Compilation failed:
2+
3+
error: 3: type 'S' does not have a field named 'missing'
4+
error: 4: not a function
5+
error: 5: type mismatch: '=' cannot operate on 'float', 'bool3'
6+
error: 6: too many components in swizzle mask 'missing'
7+
error: 7: expected array, but found 'float'
8+
5 errors

tests/sksl/shared/Assignment.sksl

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
struct S {
2+
float f;
3+
float af[5];
4+
half4 h4;
5+
half4 ah4[5];
6+
};
7+
8+
void main() {
9+
/* assign to scalar */ int i; i = 0;
10+
/* assign to vector */ int4 i4; i4 = int4(1,2,3,4);
11+
/* assign to matrix */ float3x3 f3x3; f3x3 = float3x3(1,2,3,4,5,6,7,8,9);
12+
/* assign to swizzle */ half4 x; x.w = 0; x.yx = half2(0);
13+
/* assign to array of scalar */ int ai[1]; ai[0] = 0;
14+
/* assign to array of vector */ int4 ai4[1]; ai4[0] = int4(1,2,3,4);
15+
/* assign to array of matrix */ half2x4 ah2x4[1]; ah2x4[0] = half2x4(1,2,3,4,5,6,7,8);
16+
/* assign to array idx by lookup */ ai[0] = 0; ai[ai[0]] = 0;
17+
/* assign to array swizzle */ float4 af4[1]; af4[0].x = 0; af4[0].ywxz = float4(1);
18+
/* assign to struct variable */ S s; s.f = 0;
19+
/* assign to struct array */ s.af[1] = 0;
20+
/* assign to struct swizzle */ s.h4.zxy = half3(9);
21+
/* assign to struct array swizzle */ s.ah4[2].yw = half2(5);
22+
23+
// Not allowed natively in GLSL, but SkSL will turn these into valid GLSL expressions.
24+
/* assign to folded ternary */ float l; float r; (true ? l : r) = 0;
25+
/* assign to unary plus */ +s.f = 1; +s.af[0] = 2;
26+
+s.h4 = half4(1); +s.ah4[0] = half4(2);
27+
28+
sk_FragColor = half(i).xxxx;
29+
sk_FragColor = half4(i4);
30+
sk_FragColor = half4(f3x3[0].xxyz);
31+
sk_FragColor = x;
32+
sk_FragColor = half(ai[0]).xxxx;
33+
sk_FragColor = half4(ai4[0]);
34+
sk_FragColor = ah2x4[0][0];
35+
sk_FragColor = half4(af4[0]);
36+
sk_FragColor = half(l).xxxx;
37+
sk_FragColor = half(s.f).xxxx;
38+
sk_FragColor = half(s.af[1]).xxxx;
39+
sk_FragColor = s.h4;
40+
sk_FragColor = s.ah4[0];
41+
}

tests/sksl/shared/AssignmentTypeMatch.sksl

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
2+
out vec4 sk_FragColor;
3+
void main() {
4+
vec4 x;
5+
x.w = 0.0;
6+
x.yx = vec2(0.0);
7+
int ai[1];
8+
ai[0] = 0;
9+
ivec4 ai4[1];
10+
ai4[0] = ivec4(1, 2, 3, 4);
11+
mat2x4 ah2x4[1];
12+
ah2x4[0] = mat2x4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
13+
ai[0] = 0;
14+
ai[ai[0]] = 0;
15+
vec4 af4[1];
16+
af4[0].x = 0.0;
17+
af4[0].ywxz = vec4(1.0);
18+
struct S {
19+
float f;
20+
float[5] af;
21+
vec4 h4;
22+
vec4[5] ah4;
23+
} s;
24+
s.f = 0.0;
25+
s.af[1] = 0.0;
26+
s.h4.zxy = vec3(9.0);
27+
s.ah4[2].yw = vec2(5.0);
28+
s.f = 1.0;
29+
s.af[0] = 2.0;
30+
s.h4 = vec4(1.0);
31+
s.ah4[0] = vec4(2.0);
32+
sk_FragColor = vec4(0.0);
33+
sk_FragColor = vec4(ivec4(1, 2, 3, 4));
34+
sk_FragColor = mat3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0)[0].xxyz;
35+
sk_FragColor = x;
36+
sk_FragColor = vec4(float(ai[0]));
37+
sk_FragColor = vec4(ai4[0]);
38+
sk_FragColor = ah2x4[0][0];
39+
sk_FragColor = af4[0];
40+
sk_FragColor = vec4(0.0);
41+
sk_FragColor = vec4(s.f);
42+
sk_FragColor = vec4(s.af[1]);
43+
sk_FragColor = s.h4;
44+
sk_FragColor = s.ah4[0];
45+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#include <metal_stdlib>
2+
#include <simd/simd.h>
3+
using namespace metal;
4+
struct Inputs {
5+
};
6+
struct Outputs {
7+
float4 sk_FragColor [[color(0)]];
8+
};
9+
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
10+
Outputs _outputStruct;
11+
thread Outputs* _out = &_outputStruct;
12+
float4 x;
13+
x.w = 0.0;
14+
x.yx = float2(0.0);
15+
int ai[1];
16+
ai[0] = 0;
17+
int4 ai4[1];
18+
ai4[0] = int4(1, 2, 3, 4);
19+
float2x4 ah2x4[1];
20+
ah2x4[0] = float2x4(float4(1.0, 2.0, 3.0, 4.0), float4(5.0, 6.0, 7.0, 8.0));
21+
ai[0] = 0;
22+
ai[ai[0]] = 0;
23+
float4 af4[1];
24+
af4[0].x = 0.0;
25+
af4[0].ywxz = float4(1.0);
26+
struct S {
27+
float f;
28+
float af[5];
29+
float4 h4;
30+
float4 ah4[5];
31+
} s;
32+
s.f = 0.0;
33+
s.af[1] = 0.0;
34+
s.h4.zxy = float3(9.0);
35+
s.ah4[2].yw = float2(5.0);
36+
s.f = 1.0;
37+
s.af[0] = 2.0;
38+
s.h4 = float4(1.0);
39+
s.ah4[0] = float4(2.0);
40+
_out->sk_FragColor = float4(0.0);
41+
_out->sk_FragColor = float4(int4(1, 2, 3, 4));
42+
_out->sk_FragColor = float3x3(float3(1.0, 2.0, 3.0), float3(4.0, 5.0, 6.0), float3(7.0, 8.0, 9.0))[0].xxyz;
43+
_out->sk_FragColor = x;
44+
_out->sk_FragColor = float4(float(ai[0]));
45+
_out->sk_FragColor = float4(ai4[0]);
46+
_out->sk_FragColor = ah2x4[0][0];
47+
_out->sk_FragColor = af4[0];
48+
_out->sk_FragColor = float4(0.0);
49+
_out->sk_FragColor = float4(s.f);
50+
_out->sk_FragColor = float4(s.af[1]);
51+
_out->sk_FragColor = s.h4;
52+
_out->sk_FragColor = s.ah4[0];
53+
return *_out;
54+
}

tests/sksl/shared/golden/AssignmentTypeMatch.glsl

Lines changed: 0 additions & 3 deletions
This file was deleted.

tests/sksl/shared/golden/AssignmentTypeMatch.metal

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)