Convert remaining Metal tests to golden outputs.

Metal-specific tests are pretty thin on the ground here, and some of
the remaining tests no longer added value as they were already covered
pretty well by existing tests in Shared. The majority of remaining tests
were specific to Metal's lack of flexible matrix casting (and SkSL's
ability to paper over this with helper functions).

Change-Id: I7b3c445268b95320e7f46ec88d793c315d43ee8a
Bug: skia:10694
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/334956
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
This commit is contained in:
John Stiles 2020-11-13 18:14:11 -05:00 committed by Skia Commit-Bot
parent 2f9dad4b8c
commit 34de5cb57b
22 changed files with 253 additions and 375 deletions

View File

@ -159,6 +159,16 @@ sksl_glsl_tests = [
"$_tests/sksl/glsl/Version450Core.sksl", "$_tests/sksl/glsl/Version450Core.sksl",
] ]
sksl_metal_tests = [
"$_tests/sksl/metal/CastHalf4ToMat2x2.sksl",
"$_tests/sksl/metal/CastMat2x2ToMat3x3.sksl",
"$_tests/sksl/metal/CastMat2x3ToMat4x4.sksl",
"$_tests/sksl/metal/CastMat4x4ToMat3x4.sksl",
"$_tests/sksl/metal/CastMat4x4ToMat4x3.sksl",
"$_tests/sksl/metal/NumericGlobals.sksl",
"$_tests/sksl/metal/SamplerGlobals.sksl",
]
sksl_shared_tests = [ sksl_shared_tests = [
"$_tests/sksl/shared/ArrayConstructors.sksl", "$_tests/sksl/shared/ArrayConstructors.sksl",
"$_tests/sksl/shared/ArrayIndexTypes.sksl", "$_tests/sksl/shared/ArrayIndexTypes.sksl",
@ -356,4 +366,5 @@ sksl_glsl_settings_tests_sources = sksl_blend_tests + sksl_settings_tests
# Tests in sksl_metal_tests_sources will be compiled with --settings on, and are expected to # Tests in sksl_metal_tests_sources will be compiled with --settings on, and are expected to
# generate a .metal output file. # generate a .metal output file.
sksl_metal_tests_sources = sksl_blend_tests + sksl_shared_tests sksl_metal_tests_sources =
sksl_metal_tests + sksl_blend_tests + sksl_shared_tests

View File

@ -268,7 +268,7 @@ tests_sources = [
"$_tests/SkSLGLSLTestbed.cpp", "$_tests/SkSLGLSLTestbed.cpp",
"$_tests/SkSLInterpreterTest.cpp", "$_tests/SkSLInterpreterTest.cpp",
"$_tests/SkSLMemoryLayoutTest.cpp", "$_tests/SkSLMemoryLayoutTest.cpp",
"$_tests/SkSLMetalTest.cpp", "$_tests/SkSLMetalTestbed.cpp",
"$_tests/SkSLNodeArrayWrapperTest.cpp", "$_tests/SkSLNodeArrayWrapperTest.cpp",
"$_tests/SkSLSPIRVTest.cpp", "$_tests/SkSLSPIRVTest.cpp",
"$_tests/SkScalerCacheTest.cpp", "$_tests/SkScalerCacheTest.cpp",

View File

@ -9,13 +9,6 @@
#include "tests/Test.h" #include "tests/Test.h"
// Note that the optimizer will aggressively kill dead code and substitute constants in place of
// variables, so we have to jump through a few hoops to ensure that the code in these tests has the
// necessary side-effects to remain live. In some cases we rely on the optimizer not (yet) being
// smart enough to optimize around certain constructs; as the optimizer gets smarter it will
// undoubtedly end up breaking some of these tests. That is a good thing, as long as the new code is
// equivalent!
static void test(skiatest::Reporter* r, static void test(skiatest::Reporter* r,
const GrShaderCaps& caps, const GrShaderCaps& caps,
const char* src, const char* src,

View File

@ -1,366 +0,0 @@
/*
* Copyright 2019 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "src/sksl/SkSLCompiler.h"
#include "tests/Test.h"
static void test(skiatest::Reporter* r, const GrShaderCaps& caps, const char* src,
const char* expected, SkSL::Program::Kind kind = SkSL::Program::kFragment_Kind) {
SkSL::Compiler compiler(&caps);
SkSL::Program::Settings settings;
SkSL::String output;
std::unique_ptr<SkSL::Program> program = compiler.convertProgram(kind, SkSL::String(src),
settings);
if (!program) {
SkDebugf("Unexpected error compiling %s\n%s", src, compiler.errorText().c_str());
}
REPORTER_ASSERT(r, program);
REPORTER_ASSERT(r, compiler.toMetal(*program, &output));
if (program) {
SkSL::String skExpected(expected);
if (output != skExpected) {
SkDebugf("MSL MISMATCH:\nsource:\n%s\n\nexpected:\n'%s'\n\nreceived:\n'%s'", src,
expected, output.c_str());
}
REPORTER_ASSERT(r, output == skExpected);
}
}
DEF_TEST(SkSLMetalHelloWorld, r) {
test(r, *SkSL::ShaderCapsFactory::Default(),
"void main() { sk_FragColor = half4(0.75); }",
"#include <metal_stdlib>\n"
"#include <simd/simd.h>\n"
"using namespace metal;\n"
"struct Inputs {\n"
"};\n"
"struct Outputs {\n"
" float4 sk_FragColor [[color(0)]];\n"
"};\n"
"fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {\n"
" Outputs _outputStruct;\n"
" thread Outputs* _out = &_outputStruct;\n"
" _out->sk_FragColor = float4(0.75);\n"
" return *_out;\n"
"}\n");
}
DEF_TEST(SkSLMetal2x2MatrixCopyFromFloat2x2, r) {
test(r, *SkSL::ShaderCapsFactory::Default(),
R"__SkSL__(
void main() {
float2x2 m1 = float2x2(float2(1, 2), float2(3, 4));
float2x2 m2 = m1;
float2x2 m3 = float2x2(m1);
sk_FragColor = half4(half(m1[0][0] + m2[0][0] + m3[0][0]));
})__SkSL__",
R"__MSL__(#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor = float4((float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0][0] + float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0][0]) + float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0][0]);
return *_out;
}
)__MSL__");
}
DEF_TEST(SkSLMetal2x2MatrixCopyFromConstantPropagatedFloat4, r) {
test(r, *SkSL::ShaderCapsFactory::Default(),
R"__SkSL__(
void main() {
float2x2 m1 = float2x2(float4(1, 2, 3, 4));
float2x2 m2 = m1;
float2x2 m3 = float2x2(m1);
sk_FragColor = half4(half(m1[0][0] + m2[0][0] + m3[0][0]));
})__SkSL__",
R"__MSL__(#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float2x2 float2x2_from_float4(float4 x0) {
return float2x2(float2(x0[0], x0[1]), float2(x0[2], x0[3]));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor = float4((float2x2_from_float4(float4(1.0, 2.0, 3.0, 4.0))[0][0] + float2x2_from_float4(float4(1.0, 2.0, 3.0, 4.0))[0][0]) + float2x2_from_float4(float4(1.0, 2.0, 3.0, 4.0))[0][0]);
return *_out;
}
)__MSL__");
}
DEF_TEST(SkSLMetalCastMat2x2ToMat3x3, r) {
test(r, *SkSL::ShaderCapsFactory::Default(),
R"__SkSL__(
void main() {
float3x3 a = float3x3(1);
float3x3 b = float3x3(float2x2(1));
sk_FragColor.x = (a[0] == b[0]) ? 0 : 1;
}
)__SkSL__",
R"__MSL__(#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float3x3 float3x3_from_float2x2(float2x2 x0) {
return float3x3(float3(x0[0].xy, 0.0), float3(x0[1].xy, 0.0), float3(0.0, 0.0, 1.0));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor.x = float(all(float3x3(1.0)[0] == float3x3_from_float2x2(float2x2(1.0))[0]) ? 0 : 1);
return *_out;
}
)__MSL__");
}
DEF_TEST(SkSLMetalCastMat2x3ToMat4x4, r) {
test(r, *SkSL::ShaderCapsFactory::Default(),
R"__SkSL__(
void main() {
float4x4 a = float4x4(6);
float4x4 b = float4x4(float2x3(7));
sk_FragColor.x = (a[1] == b[1]) ? 0 : 1;
}
)__SkSL__",
R"__MSL__(#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float4x4 float4x4_from_float2x3(float2x3 x0) {
return float4x4(float4(x0[0].xyz, 0.0), float4(x0[1].xyz, 0.0), float4(0.0, 0.0, 1.0, 0.0), float4(0.0, 0.0, 0.0, 1.0));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor.x = float(all(float4x4(6.0)[1] == float4x4_from_float2x3(float2x3(7.0))[1]) ? 0 : 1);
return *_out;
}
)__MSL__");
}
DEF_TEST(SkSLMetalCastMat4x4ToMat3x4, r) {
test(r, *SkSL::ShaderCapsFactory::Default(),
R"__SkSL__(
void main() {
float3x4 a = float3x4(1);
float3x4 b = float3x4(float4x4(1));
sk_FragColor.x = (a[0] == b[0]) ? 0 : 1;
}
)__SkSL__",
R"__MSL__(#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float3x4 float3x4_from_float4x4(float4x4 x0) {
return float3x4(float4(x0[0].xyzw), float4(x0[1].xyzw), float4(x0[2].xyzw));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor.x = float(all(float3x4(1.0)[0] == float3x4_from_float4x4(float4x4(1.0))[0]) ? 0 : 1);
return *_out;
}
)__MSL__");
}
DEF_TEST(SkSLMetalCastMat4x4ToMat4x3, r) {
test(r, *SkSL::ShaderCapsFactory::Default(),
R"__SkSL__(
void main() {
float4x3 a = float4x3(1);
float4x3 b = float4x3(float4x4(1));
sk_FragColor.x = (a[0] == b[0]) ? 0 : 1;
}
)__SkSL__",
R"__MSL__(#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float4x3 float4x3_from_float4x4(float4x4 x0) {
return float4x3(float3(x0[0].xyz), float3(x0[1].xyz), float3(x0[2].xyz), float3(x0[3].xyz));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor.x = float(all(float4x3(1.0)[0] == float4x3_from_float4x4(float4x4(1.0))[0]) ? 0 : 1);
return *_out;
}
)__MSL__");
}
DEF_TEST(SkSLMetalMatrices, r) {
test(r, *SkSL::ShaderCapsFactory::Default(),
R"__SkSL__(
void main() {
float2x2 m1 = float2x2(float4(1, 2, 3, 4));
float2x2 m2 = float2x2(float4(0));
float2x2 m3 = float2x2(m1);
float2x2 m4 = float2x2(1);
float2x2 m5 = float2x2(m1[0][0]);
float2x2 m6 = float2x2(1, 2, 3, 4);
float2x2 m7 = float2x2(5, float3(6, 7, 8));
float3x2 m8 = float3x2(float2(1, 2), 3, float3(4, 5, 6));
float3x3 m9 = float3x3(1);
float4x4 m10 = float4x4(1);
float4x4 m11 = float4x4(2);
sk_FragColor = half4(half(m1[0][0] + m2[0][0] + m3[0][0] + m4[0][0] + m5[0][0] +
m6[0][0] + m7[0][0] + m8[0][0] + m9[0][0] + m10[0][0] + m11[0][0]));
})__SkSL__",
R"__MSL__(#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float2x2 float2x2_from_float4(float4 x0) {
return float2x2(float2(x0[0], x0[1]), float2(x0[2], x0[3]));
}
float2x2 float2x2_from_float_float3(float x0, float3 x1) {
return float2x2(float2(x0, x1[0]), float2(x1[1], x1[2]));
}
float3x2 float3x2_from_float2_float_float3(float2 x0, float x1, float3 x2) {
return float3x2(float2(x0[0], x0[1]), float2(x1, x2[0]), float2(x2[1], x2[2]));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
float2x2 m5 = float2x2(float2x2_from_float4(float4(1.0, 2.0, 3.0, 4.0))[0][0]);
_out->sk_FragColor = float4((((((((((float2x2_from_float4(float4(1.0, 2.0, 3.0, 4.0))[0][0] + float2x2_from_float4(float4(0.0))[0][0]) + float2x2_from_float4(float4(1.0, 2.0, 3.0, 4.0))[0][0]) + float2x2(1.0)[0][0]) + m5[0][0]) + float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0][0]) + float2x2_from_float_float3(5.0, float3(6.0, 7.0, 8.0))[0][0]) + float3x2_from_float2_float_float3(float2(1.0, 2.0), 3.0, float3(4.0, 5.0, 6.0))[0][0]) + float3x3(1.0)[0][0]) + float4x4(1.0)[0][0]) + float4x4(2.0)[0][0]);
return *_out;
}
)__MSL__");
}
DEF_TEST(SkSLMetalConstantSwizzle, r) {
test(r, *SkSL::ShaderCapsFactory::Default(),
"void main() {"
"sk_FragColor = half4(0.5).rgb1;"
"}",
"#include <metal_stdlib>\n"
"#include <simd/simd.h>\n"
"using namespace metal;\n"
"struct Inputs {\n"
"};\n"
"struct Outputs {\n"
" float4 sk_FragColor [[color(0)]];\n"
"};\n"
"fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {\n"
" Outputs _outputStruct;\n"
" thread Outputs* _out = &_outputStruct;\n"
" _out->sk_FragColor = float4(float4(0.5).xyz, 1.0);\n"
" return *_out;\n"
"}\n");
}
DEF_TEST(SkSLMetalNumericGlobals, r) {
test(r, *SkSL::ShaderCapsFactory::Default(),
R"__SkSL__(
half attr1;
int attr2 = 123;
float attr3;
half4 attr4 = half4(4, 5, 6, 7);
void main()
{
sk_FragColor = half4(attr1, attr2, half(attr3), attr4.x);
}
)__SkSL__",
R"__MSL__(#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
struct Globals {
float attr1;
int attr2;
float attr3;
float4 attr4;
};
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Globals globalStruct{{}, 123, {}, float4(4.0, 5.0, 6.0, 7.0)};
thread Globals* _globals = &globalStruct;
(void)_globals;
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor = float4(_globals->attr1, float(_globals->attr2), _globals->attr3, _globals->attr4.x);
return *_out;
}
)__MSL__");
}
DEF_TEST(SkSLMetalSamplerGlobals, r) {
test(r, *SkSL::ShaderCapsFactory::Default(),
R"__SkSL__(
layout(binding=1) uniform sampler2D texA;
layout(binding=0) uniform sampler2D texB;
void main()
{
sk_FragColor = sample(texA, half2(0)) * sample(texB, half2(0));
}
)__SkSL__",
R"__MSL__(#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
struct Globals {
texture2d<float> texA;
sampler texASmplr;
texture2d<float> texB;
sampler texBSmplr;
};
fragment Outputs fragmentMain(Inputs _in [[stage_in]], texture2d<float> texA[[texture(1)]], sampler texASmplr[[sampler(1)]], texture2d<float> texB[[texture(0)]], sampler texBSmplr[[sampler(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Globals globalStruct{texA, texASmplr, texB, texBSmplr};
thread Globals* _globals = &globalStruct;
(void)_globals;
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor = _globals->texA.sample(_globals->texASmplr, float2(0.0)) * _globals->texB.sample(_globals->texBSmplr, float2(0.0));
return *_out;
}
)__MSL__");
}

View File

@ -0,0 +1,40 @@
/*
* Copyright 2020 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "src/sksl/SkSLCompiler.h"
#include "tests/Test.h"
static void test(skiatest::Reporter* r,
const GrShaderCaps& caps,
const char* src,
SkSL::Program::Kind kind = SkSL::Program::kFragment_Kind) {
SkSL::Compiler compiler(&caps);
SkSL::Program::Settings settings;
SkSL::String output;
std::unique_ptr<SkSL::Program> program = compiler.convertProgram(kind, SkSL::String(src),
settings);
if (!program) {
SkDebugf("Unexpected error compiling %s\n%s", src, compiler.errorText().c_str());
REPORTER_ASSERT(r, program);
} else {
REPORTER_ASSERT(r, compiler.toMetal(*program, &output));
REPORTER_ASSERT(r, output != "");
//SkDebugf("Metal output:\n\n%s", output.c_str());
}
}
DEF_TEST(SkSLMetalTestbed, r) {
// Add in your SkSL here.
test(r,
*SkSL::ShaderCapsFactory::Default(),
R"__SkSL__(
void main() {
sk_FragColor = half4(0);
}
)__SkSL__");
}

View File

@ -0,0 +1,4 @@
void main() {
half2x2 m1 = half2x2(half4(1, 2, 3, 4));
sk_FragColor = m1[0].xyxy;
}

View File

@ -0,0 +1,5 @@
void main() {
float3x3 a = float3x3(1);
float3x3 b = float3x3(float2x2(1));
sk_FragColor.x = (a[0] == b[0]) ? 0 : 1;
}

View File

@ -0,0 +1,5 @@
void main() {
float4x4 a = float4x4(6);
float4x4 b = float4x4(float2x3(7));
sk_FragColor.x = (a[1] == b[1]) ? 0 : 1;
}

View File

@ -0,0 +1,5 @@
void main() {
float3x4 a = float3x4(1);
float3x4 b = float3x4(float4x4(1));
sk_FragColor.x = (a[0] == b[0]) ? 0 : 1;
}

View File

@ -0,0 +1,5 @@
void main() {
float4x3 a = float4x3(1);
float4x3 b = float4x3(float4x4(1));
sk_FragColor.x = (a[0] == b[0]) ? 0 : 1;
}

View File

@ -0,0 +1,8 @@
half attr1;
int attr2 = 123;
float attr3;
half4 attr4 = half4(4, 5, 6, 7);
void main()
{
sk_FragColor = half4(attr1, attr2, half(attr3), attr4.x);
}

View File

@ -0,0 +1,6 @@
layout(binding=1) uniform sampler2D texA;
layout(binding=0) uniform sampler2D texB;
void main()
{
sk_FragColor = sample(texA, half2(0)) * sample(texB, half2(0));
}

View File

@ -0,0 +1,17 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float2x2 float2x2_from_half4(half4 x0) {
return float2x2(float2(x0[0], x0[1]), float2(x0[2], x0[3]));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor = float2x2_from_half4(float4(1.0, 2.0, 3.0, 4.0))[0].xyxy;
return *_out;
}

View File

@ -0,0 +1,17 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float3x3 float3x3_from_float2x2(float2x2 x0) {
return float3x3(float3(x0[0].xy, 0.0), float3(x0[1].xy, 0.0), float3(0.0, 0.0, 1.0));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor.x = float(all(float3x3(1.0)[0] == float3x3_from_float2x2(float2x2(1.0))[0]) ? 0 : 1);
return *_out;
}

View File

@ -0,0 +1,17 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float4x4 float4x4_from_float2x3(float2x3 x0) {
return float4x4(float4(x0[0].xyz, 0.0), float4(x0[1].xyz, 0.0), float4(0.0, 0.0, 1.0, 0.0), float4(0.0, 0.0, 0.0, 1.0));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor.x = float(all(float4x4(6.0)[1] == float4x4_from_float2x3(float2x3(7.0))[1]) ? 0 : 1);
return *_out;
}

View File

@ -0,0 +1,17 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float3x4 float3x4_from_float4x4(float4x4 x0) {
return float3x4(float4(x0[0].xyzw), float4(x0[1].xyzw), float4(x0[2].xyzw));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor.x = float(all(float3x4(1.0)[0] == float3x4_from_float4x4(float4x4(1.0))[0]) ? 0 : 1);
return *_out;
}

View File

@ -0,0 +1,17 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
float4x3 float4x3_from_float4x4(float4x4 x0) {
return float4x3(float3(x0[0].xyz), float3(x0[1].xyz), float3(x0[2].xyz), float3(x0[3].xyz));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor.x = float(all(float4x3(1.0)[0] == float4x3_from_float4x4(float4x4(1.0))[0]) ? 0 : 1);
return *_out;
}

View File

@ -0,0 +1,26 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
struct Globals {
float attr1;
int attr2;
float attr3;
float4 attr4;
};
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Globals globalStruct{{}, 123, {}, float4(4.0, 5.0, 6.0, 7.0)};
thread Globals* _globals = &globalStruct;
(void)_globals;
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor = float4(_globals->attr1, float(_globals->attr2), _globals->attr3, _globals->attr4.x);
return *_out;
}

View File

@ -0,0 +1,24 @@
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct Inputs {
};
struct Outputs {
float4 sk_FragColor [[color(0)]];
};
struct Globals {
texture2d<float> texA;
sampler texASmplr;
texture2d<float> texB;
sampler texBSmplr;
};
fragment Outputs fragmentMain(Inputs _in [[stage_in]], texture2d<float> texA[[texture(1)]], sampler texASmplr[[sampler(1)]], texture2d<float> texB[[texture(0)]], sampler texBSmplr[[sampler(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Globals globalStruct{texA, texASmplr, texB, texBSmplr};
thread Globals* _globals = &globalStruct;
(void)_globals;
Outputs _outputStruct;
thread Outputs* _out = &_outputStruct;
_out->sk_FragColor = _globals->texA.sample(_globals->texASmplr, float2(0.0)) * _globals->texB.sample(_globals->texBSmplr, float2(0.0));
return *_out;
}

View File

@ -5,4 +5,18 @@ void main() {
float3 v1 = float3x3(1) * float3(2); float3 v1 = float3x3(1) * float3(2);
float3 v2 = float3(2) * float3x3(1); float3 v2 = float3(2) * float3x3(1);
sk_FragColor = half4(half(z[0].x), half3(v1 + v2)); sk_FragColor = half4(half(z[0].x), half3(v1 + v2));
float2x2 m1 = float2x2(float4(1, 2, 3, 4));
float2x2 m2 = float2x2(float4(0));
float2x2 m3 = float2x2(m1);
float2x2 m4 = float2x2(1);
float2x2 m5 = float2x2(m1[0][0]);
float2x2 m6 = float2x2(1, 2, 3, 4);
float2x2 m7 = float2x2(5, float3(6, 7, 8));
float3x2 m8 = float3x2(float2(1, 2), 3, float3(4, 5, 6));
float3x3 m9 = float3x3(1);
float4x4 m10 = float4x4(1);
float4x4 m11 = float4x4(2);
sk_FragColor = half4(half(m1[0][0] + m2[0][0] + m3[0][0] + m4[0][0] + m5[0][0] +
m6[0][0] + m7[0][0] + m8[0][0] + m9[0][0] + m10[0][0] + m11[0][0]));
} }

View File

@ -5,4 +5,6 @@ void main() {
vec3 v1 = mat3(1.0) * vec3(2.0); vec3 v1 = mat3(1.0) * vec3(2.0);
vec3 v2 = vec3(2.0) * mat3(1.0); vec3 v2 = vec3(2.0) * mat3(1.0);
sk_FragColor = vec4(z[0].x, v1 + v2); sk_FragColor = vec4(z[0].x, v1 + v2);
mat2 m5 = mat2(mat2(vec4(1.0, 2.0, 3.0, 4.0))[0][0]);
sk_FragColor = vec4((((((((((mat2(vec4(1.0, 2.0, 3.0, 4.0))[0][0] + mat2(vec4(0.0))[0][0]) + mat2(vec4(1.0, 2.0, 3.0, 4.0))[0][0]) + mat2(1.0)[0][0]) + m5[0][0]) + mat2(1.0, 2.0, 3.0, 4.0)[0][0]) + mat2(5.0, vec3(6.0, 7.0, 8.0))[0][0]) + mat3x2(vec2(1.0, 2.0), 3.0, vec3(4.0, 5.0, 6.0))[0][0]) + mat3(1.0)[0][0]) + mat4(1.0)[0][0]) + mat4(2.0)[0][0]);
} }

View File

@ -6,6 +6,15 @@ struct Inputs {
struct Outputs { struct Outputs {
float4 sk_FragColor [[color(0)]]; float4 sk_FragColor [[color(0)]];
}; };
float2x2 float2x2_from_float4(float4 x0) {
return float2x2(float2(x0[0], x0[1]), float2(x0[2], x0[3]));
}
float2x2 float2x2_from_float_float3(float x0, float3 x1) {
return float2x2(float2(x0, x1[0]), float2(x1[1], x1[2]));
}
float3x2 float3x2_from_float2_float_float3(float2 x0, float x1, float3 x2) {
return float3x2(float2(x0[0], x0[1]), float2(x1, x2[0]), float2(x2[1], x2[2]));
}
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) { fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
Outputs _outputStruct; Outputs _outputStruct;
thread Outputs* _out = &_outputStruct; thread Outputs* _out = &_outputStruct;
@ -13,5 +22,7 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
float3 v1 = float3x3(1.0) * float3(2.0); float3 v1 = float3x3(1.0) * float3(2.0);
float3 v2 = float3(2.0) * float3x3(1.0); float3 v2 = float3(2.0) * float3x3(1.0);
_out->sk_FragColor = float4(z[0].x, v1 + v2); _out->sk_FragColor = float4(z[0].x, v1 + v2);
float2x2 m5 = float2x2(float2x2_from_float4(float4(1.0, 2.0, 3.0, 4.0))[0][0]);
_out->sk_FragColor = float4((((((((((float2x2_from_float4(float4(1.0, 2.0, 3.0, 4.0))[0][0] + float2x2_from_float4(float4(0.0))[0][0]) + float2x2_from_float4(float4(1.0, 2.0, 3.0, 4.0))[0][0]) + float2x2(1.0)[0][0]) + m5[0][0]) + float2x2(float2(1.0, 2.0), float2(3.0, 4.0))[0][0]) + float2x2_from_float_float3(5.0, float3(6.0, 7.0, 8.0))[0][0]) + float3x2_from_float2_float_float3(float2(1.0, 2.0), 3.0, float3(4.0, 5.0, 6.0))[0][0]) + float3x3(1.0)[0][0]) + float4x4(1.0)[0][0]) + float4x4(2.0)[0][0]);
return *_out; return *_out;
} }