Reland "Improve support for arrays in Metal."
This reverts commit38df4c8470
. Reason for revert: updated ArrayTypes test for ES2 compatibility Original change's description: > Revert "Improve support for arrays in Metal." > > This reverts commitdd904af566
. > > Reason for revert: breaks ANGLE > > Original change's description: > > Improve support for arrays in Metal. > > > > Arrays in Metal now use the `array<T, N>` type instead of the C-style > > `T[N]` type. This gives them semantics much more in line with GLSL, > > so they can be initialized and assigned like GLSL arrays. > > > > This allows the ArrayTypes and Assignment tests to pass, so they have > > been added to our dm SkSL tests. (ArrayConstructors also passes, but > > is not ES2-compliant so it is not enabled.) > > > > Change-Id: Id1028311963084befd0e044e11e223af6a064dda > > Bug: skia:10761, skia:10760, skia:11022, skia:10939 > > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/365699 > > Commit-Queue: John Stiles <johnstiles@google.com> > > Auto-Submit: John Stiles <johnstiles@google.com> > > Reviewed-by: Brian Osman <brianosman@google.com> > > TBR=brianosman@google.com,ethannicholas@google.com,johnstiles@google.com > > Change-Id: If6a18dea7d6a45fa7836e9129bf81c2e536f07e3 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: skia:10761 > Bug: skia:10760 > Bug: skia:11022 > Bug: skia:10939 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/365976 > Reviewed-by: John Stiles <johnstiles@google.com> > Commit-Queue: John Stiles <johnstiles@google.com> TBR=brianosman@google.com,ethannicholas@google.com,johnstiles@google.com Bug: skia:10761 Bug: skia:10760 Bug: skia:11022 Bug: skia:10939 Change-Id: Ia1c4917f5d3c41162d282b3093814d861707ad30 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/366144 Reviewed-by: John Stiles <johnstiles@google.com> Commit-Queue: John Stiles <johnstiles@google.com>
This commit is contained in:
parent
420c8a505e
commit
b44185086e
@ -1,7 +1,9 @@
|
||||
float test1[4] = float[4](1, 2, 3, 4);
|
||||
float2 test2[2] = float2[2](float2(1, 2), float2(3, 4));
|
||||
float4x4 test3[1] = float4x4[1](float4x4(16));
|
||||
uniform half4 colorGreen, colorRed;
|
||||
|
||||
void main() {
|
||||
sk_FragColor.r = half(test1[0] + test2[0].x + test3[0][0][0]);
|
||||
half4 main() {
|
||||
float test1[4] = float[4](1, 2, 3, 4);
|
||||
float2 test2[2] = float2[2](float2(1, 2), float2(3, 4));
|
||||
float4x4 test3[1] = float4x4[1](float4x4(16));
|
||||
|
||||
return (test1[3] + test2[1][1] + test3[0][3][3] == 24) ? colorGreen : colorRed;
|
||||
}
|
||||
|
@ -1,6 +1,13 @@
|
||||
void main() {
|
||||
float2 x[2] = float2[2](float2(1), float2(2));
|
||||
float2[2] y = float2[2](float2(3), float2(4));
|
||||
half4 main() {
|
||||
float2 x[2];
|
||||
x[0] = float2( 0, 0);
|
||||
x[1] = float2( 1, 0);
|
||||
float2 y[2];
|
||||
y[0] = float2( 0, 1);
|
||||
y[1] = float2(-1, 2);
|
||||
|
||||
sk_FragColor = half4(half2(x[0]), half2(y[1]));
|
||||
return half4(x[0][0] * x[0][1], // R=0
|
||||
x[1][0] - x[1][1], // G=1
|
||||
y[0][0] / y[0][1], // B=0
|
||||
y[1][0] + y[1][1]); // A=1
|
||||
}
|
||||
|
@ -1,41 +1,39 @@
|
||||
struct S {
|
||||
float f;
|
||||
float af[5];
|
||||
half4 h4;
|
||||
half4 ah4[5];
|
||||
};
|
||||
uniform half4 colorGreen;
|
||||
|
||||
void main() {
|
||||
// TODO(skia:10939): Structs not working in Runtime Effects yet
|
||||
//struct S {
|
||||
// float f;
|
||||
// float af[5];
|
||||
// half4 h4;
|
||||
// half4 ah4[5];
|
||||
//};
|
||||
|
||||
half4 main() {
|
||||
/* assign to scalar */ int i; i = 0;
|
||||
/* assign to vector */ int4 i4; i4 = int4(1,2,3,4);
|
||||
/* assign to matrix */ float3x3 f3x3; f3x3 = float3x3(1,2,3,4,5,6,7,8,9);
|
||||
/* assign to swizzle */ half4 x; x.w = 0; x.yx = half2(0);
|
||||
/* assign to array of scalar */ int ai[1]; ai[0] = 0;
|
||||
/* assign to array of vector */ int4 ai4[1]; ai4[0] = int4(1,2,3,4);
|
||||
/* assign to array of matrix */ half2x4 ah2x4[1]; ah2x4[0] = half2x4(1,2,3,4,5,6,7,8);
|
||||
/* assign to array idx by lookup */ ai[0] = 0; ai[ai[0]] = 0;
|
||||
/* assign to array of matrix */ half3x3 ah2x4[1]; ah2x4[0] = half3x3(1,2,3,4,5,6,7,8,9);
|
||||
/* assign to array swizzle */ float4 af4[1]; af4[0].x = 0; af4[0].ywxz = float4(1);
|
||||
/* assign to struct variable */ S s; s.f = 0;
|
||||
/* assign to struct array */ s.af[1] = 0;
|
||||
/* assign to struct swizzle */ s.h4.zxy = half3(9);
|
||||
/* assign to struct array swizzle */ s.ah4[2].yw = half2(5);
|
||||
|
||||
// TODO(skia:10939): Structs not working in Runtime Effects yet
|
||||
// /* assign to struct variable */ S s; s.f = 0;
|
||||
// /* assign to struct array */ s.af[1] = 0;
|
||||
// /* assign to struct swizzle */ s.h4.zxy = half3(9);
|
||||
// /* assign to struct array swizzle */ s.ah4[2].yw = half2(5);
|
||||
|
||||
// Not allowed in ES2
|
||||
// /* assign to array idx by lookup */ ai[0] = 0; ai[ai[0]] = 0;
|
||||
|
||||
// Not allowed natively in GLSL, but SkSL will turn these into valid GLSL expressions.
|
||||
/* assign to folded ternary */ float l; float r; (true ? l : r) = 0;
|
||||
/* assign to unary plus */ +s.f = 1; +s.af[0] = 2;
|
||||
+s.h4 = half4(1); +s.ah4[0] = half4(2);
|
||||
/* assign to folded ternary */ half l, r; (true ? l : r) = 0;
|
||||
// TODO(skia:10939): Structs not working in Runtime Effects yet
|
||||
// /* assign to struct unary plus */ +s.f = 1; +s.af[0] = 2;
|
||||
// +s.h4 = half4(1); +s.ah4[0] = half4(2);
|
||||
|
||||
sk_FragColor = half(i).xxxx;
|
||||
sk_FragColor = half4(i4);
|
||||
sk_FragColor = half4(f3x3[0].xxyz);
|
||||
sk_FragColor = x;
|
||||
sk_FragColor = half(ai[0]).xxxx;
|
||||
sk_FragColor = half4(ai4[0]);
|
||||
sk_FragColor = ah2x4[0][0];
|
||||
sk_FragColor = half4(af4[0]);
|
||||
sk_FragColor = half(l).xxxx;
|
||||
sk_FragColor = half(s.f).xxxx;
|
||||
sk_FragColor = half(s.af[1]).xxxx;
|
||||
sk_FragColor = s.h4;
|
||||
sk_FragColor = s.ah4[0];
|
||||
i4.y *= i;
|
||||
x.y *= l;
|
||||
return ai, ai4, ah2x4, af4, colorGreen;
|
||||
}
|
||||
|
@ -109,15 +109,24 @@ void MetalCodeGenerator::writeExtension(const Extension& ext) {
|
||||
|
||||
String MetalCodeGenerator::typeName(const Type& type) {
|
||||
switch (type.typeKind()) {
|
||||
case Type::TypeKind::kArray:
|
||||
SkASSERTF(type.columns() > 0, "invalid array size: %s", type.description().c_str());
|
||||
return String::printf("array<%s, %d>",
|
||||
this->typeName(type.componentType()).c_str(), type.columns());
|
||||
|
||||
case Type::TypeKind::kVector:
|
||||
return this->typeName(type.componentType()) + to_string(type.columns());
|
||||
|
||||
case Type::TypeKind::kMatrix:
|
||||
return this->typeName(type.componentType()) + to_string(type.columns()) + "x" +
|
||||
to_string(type.rows());
|
||||
|
||||
case Type::TypeKind::kSampler:
|
||||
return "texture2d<float>"; // FIXME - support other texture types
|
||||
|
||||
case Type::TypeKind::kEnum:
|
||||
return "int";
|
||||
|
||||
default:
|
||||
if (type == *fContext.fTypes.fHalf) {
|
||||
// FIXME - Currently only supporting floats in MSL to avoid type coercion issues.
|
||||
@ -141,36 +150,8 @@ void MetalCodeGenerator::writeStructDefinition(const StructDefinition& s) {
|
||||
this->writeLine("};");
|
||||
}
|
||||
|
||||
// Flags an error if an array type is found. Meant to be used in places where an array type might
|
||||
// appear in the SkSL/IR, but can't be represented by Metal.
|
||||
void MetalCodeGenerator::disallowArrayTypes(const Type& type, int offset) {
|
||||
if (type.isArray()) {
|
||||
fErrors.error(offset, "Metal does not support array types in this context");
|
||||
}
|
||||
}
|
||||
|
||||
// Writes the base type, stripping array suffixes. e.g. `float[2]` will output `float`.
|
||||
// Call `writeArrayDimensions` to write the type's accompanying array sizes.
|
||||
void MetalCodeGenerator::writeBaseType(const Type& type) {
|
||||
switch (type.typeKind()) {
|
||||
case Type::TypeKind::kArray:
|
||||
this->writeBaseType(type.componentType());
|
||||
break;
|
||||
default:
|
||||
this->write(this->typeName(type));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Writes the array suffix of a type, if one exists. e.g. `float[2][4]` will output `[2][4]`.
|
||||
void MetalCodeGenerator::writeArrayDimensions(const Type& type) {
|
||||
if (type.isArray()) {
|
||||
this->write("[");
|
||||
if (type.columns() != Type::kUnsizedArray) {
|
||||
this->write(to_string(type.columns()));
|
||||
}
|
||||
this->write("]");
|
||||
}
|
||||
void MetalCodeGenerator::writeType(const Type& type) {
|
||||
this->write(this->typeName(type));
|
||||
}
|
||||
|
||||
void MetalCodeGenerator::writeExpression(const Expression& expr, Precedence parentPrecedence) {
|
||||
@ -242,7 +223,7 @@ String MetalCodeGenerator::getOutParamHelper(const FunctionCall& call,
|
||||
// `outVars` is non-null; in those places, we take the type of the VariableReference.
|
||||
//
|
||||
// float _skOutParamHelper0_originalFuncName(float _var0, float _var1, float& outParam) {
|
||||
this->writeBaseType(call.type());
|
||||
this->writeType(call.type());
|
||||
this->write(" ");
|
||||
this->write(name);
|
||||
this->write("(");
|
||||
@ -259,7 +240,7 @@ String MetalCodeGenerator::getOutParamHelper(const FunctionCall& call,
|
||||
this->writeModifiers(param->modifiers(), /*globalContext=*/false);
|
||||
|
||||
const Type* type = outVars[index] ? &outVars[index]->type() : &arguments[index]->type();
|
||||
this->writeBaseType(*type);
|
||||
this->writeType(*type);
|
||||
|
||||
if (param->modifiers().fFlags & Modifiers::kOut_Flag) {
|
||||
this->write("&");
|
||||
@ -273,7 +254,6 @@ String MetalCodeGenerator::getOutParamHelper(const FunctionCall& call,
|
||||
this->write(" _var");
|
||||
this->write(to_string(index));
|
||||
}
|
||||
this->writeArrayDimensions(*type);
|
||||
}
|
||||
this->writeLine(") {");
|
||||
|
||||
@ -283,7 +263,7 @@ String MetalCodeGenerator::getOutParamHelper(const FunctionCall& call,
|
||||
continue;
|
||||
}
|
||||
// float3 _var2[ = outParam.zyx];
|
||||
this->writeBaseType(arguments[index]->type());
|
||||
this->writeType(arguments[index]->type());
|
||||
this->write(" _var");
|
||||
this->write(to_string(index));
|
||||
|
||||
@ -301,7 +281,7 @@ String MetalCodeGenerator::getOutParamHelper(const FunctionCall& call,
|
||||
// [int _skResult = ] myFunction(inputs, outputs, _globals, _var0, _var1, _var2, _var3);
|
||||
bool hasResult = (call.type().name() != "void");
|
||||
if (hasResult) {
|
||||
this->writeBaseType(call.type());
|
||||
this->writeType(call.type());
|
||||
this->write(" _skResult = ");
|
||||
}
|
||||
|
||||
@ -1082,9 +1062,8 @@ void MetalCodeGenerator::writeConstructor(const Constructor& c, Precedence paren
|
||||
}
|
||||
|
||||
// Explicitly invoke the constructor, passing in the necessary arguments.
|
||||
this->writeBaseType(constructorType);
|
||||
this->disallowArrayTypes(constructorType, c.fOffset);
|
||||
this->write("(");
|
||||
this->writeType(constructorType);
|
||||
this->write(constructorType.isArray() ? "{" : "(");
|
||||
const char* separator = "";
|
||||
int scalarCount = 0;
|
||||
for (const std::unique_ptr<Expression>& arg : c.arguments()) {
|
||||
@ -1095,7 +1074,7 @@ void MetalCodeGenerator::writeConstructor(const Constructor& c, Precedence paren
|
||||
argType.columns() < constructorType.rows()) {
|
||||
// Merge scalars and smaller vectors together.
|
||||
if (!scalarCount) {
|
||||
this->writeBaseType(constructorType.componentType());
|
||||
this->writeType(constructorType.componentType());
|
||||
this->write(to_string(constructorType.rows()));
|
||||
this->write("(");
|
||||
}
|
||||
@ -1107,7 +1086,7 @@ void MetalCodeGenerator::writeConstructor(const Constructor& c, Precedence paren
|
||||
scalarCount = 0;
|
||||
}
|
||||
}
|
||||
this->write(")");
|
||||
this->write(constructorType.isArray() ? "}" : ")");
|
||||
}
|
||||
|
||||
void MetalCodeGenerator::writeFragCoord() {
|
||||
@ -1500,7 +1479,7 @@ bool MetalCodeGenerator::writeFunctionDeclaration(const FunctionDeclaration& f)
|
||||
continue;
|
||||
}
|
||||
this->write(", constant ");
|
||||
this->writeBaseType(intf.variable().type());
|
||||
this->writeType(intf.variable().type());
|
||||
this->write("& " );
|
||||
this->write(fInterfaceBlockNameMap[&intf]);
|
||||
this->write(" [[buffer(");
|
||||
@ -1520,8 +1499,7 @@ bool MetalCodeGenerator::writeFunctionDeclaration(const FunctionDeclaration& f)
|
||||
}
|
||||
separator = ", ";
|
||||
} else {
|
||||
this->writeBaseType(f.returnType());
|
||||
this->disallowArrayTypes(f.returnType(), f.fOffset);
|
||||
this->writeType(f.returnType());
|
||||
this->write(" ");
|
||||
this->writeName(f.name());
|
||||
this->write("(");
|
||||
@ -1532,13 +1510,12 @@ bool MetalCodeGenerator::writeFunctionDeclaration(const FunctionDeclaration& f)
|
||||
separator = ", ";
|
||||
this->writeModifiers(param->modifiers(), /*globalContext=*/false);
|
||||
const Type* type = ¶m->type();
|
||||
this->writeBaseType(*type);
|
||||
this->writeType(*type);
|
||||
if (param->modifiers().fFlags & Modifiers::kOut_Flag) {
|
||||
this->write("&");
|
||||
}
|
||||
this->write(" ");
|
||||
this->writeName(param->name());
|
||||
this->writeArrayDimensions(*type);
|
||||
}
|
||||
this->write(")");
|
||||
return true;
|
||||
@ -1698,10 +1675,9 @@ void MetalCodeGenerator::writeFields(const std::vector<Type::Field>& fields, int
|
||||
}
|
||||
currentOffset += fieldSize;
|
||||
this->writeModifiers(field.fModifiers, /*globalContext=*/false);
|
||||
this->writeBaseType(*fieldType);
|
||||
this->writeType(*fieldType);
|
||||
this->write(" ");
|
||||
this->writeName(field.fName);
|
||||
this->writeArrayDimensions(*fieldType);
|
||||
this->writeLine(";");
|
||||
if (parentIntf) {
|
||||
fInterfaceBlockMap[&field] = parentIntf;
|
||||
@ -1720,25 +1696,17 @@ void MetalCodeGenerator::writeName(const String& name) {
|
||||
this->write(name);
|
||||
}
|
||||
|
||||
void MetalCodeGenerator::writeVarDeclaration(const VarDeclaration& var, bool global) {
|
||||
if (global && !(var.var().modifiers().fFlags & Modifiers::kConst_Flag)) {
|
||||
void MetalCodeGenerator::writeVarDeclaration(const VarDeclaration& varDecl, bool global) {
|
||||
if (global && !(varDecl.var().modifiers().fFlags & Modifiers::kConst_Flag)) {
|
||||
return;
|
||||
}
|
||||
this->writeModifiers(var.var().modifiers(), global);
|
||||
this->writeBaseType(var.baseType());
|
||||
this->disallowArrayTypes(var.baseType(), var.fOffset);
|
||||
this->writeModifiers(varDecl.var().modifiers(), global);
|
||||
this->writeType(varDecl.var().type());
|
||||
this->write(" ");
|
||||
this->writeName(var.var().name());
|
||||
if (var.arraySize() > 0) {
|
||||
this->write("[");
|
||||
this->write(to_string(var.arraySize()));
|
||||
this->write("]");
|
||||
} else if (var.arraySize() == Type::kUnsizedArray){
|
||||
this->write("[]");
|
||||
}
|
||||
if (var.value()) {
|
||||
this->writeName(varDecl.var().name());
|
||||
if (varDecl.value()) {
|
||||
this->write(" = ");
|
||||
this->writeVarInitializer(var.var(), *var.value());
|
||||
this->writeVarInitializer(varDecl.var(), *varDecl.value());
|
||||
}
|
||||
this->write(";");
|
||||
}
|
||||
@ -1940,10 +1908,9 @@ void MetalCodeGenerator::writeUniformStruct() {
|
||||
"the same 'layout(set=...)'");
|
||||
}
|
||||
this->write(" ");
|
||||
this->writeBaseType(var.type());
|
||||
this->writeType(var.type());
|
||||
this->write(" ");
|
||||
this->writeName(var.name());
|
||||
this->writeArrayDimensions(var.type());
|
||||
this->write(";\n");
|
||||
}
|
||||
}
|
||||
@ -1962,10 +1929,9 @@ void MetalCodeGenerator::writeInputStruct() {
|
||||
if (var.modifiers().fFlags & Modifiers::kIn_Flag &&
|
||||
-1 == var.modifiers().fLayout.fBuiltin) {
|
||||
this->write(" ");
|
||||
this->writeBaseType(var.type());
|
||||
this->writeType(var.type());
|
||||
this->write(" ");
|
||||
this->writeName(var.name());
|
||||
this->writeArrayDimensions(var.type());
|
||||
if (-1 != var.modifiers().fLayout.fLocation) {
|
||||
if (fProgram.fKind == Program::kVertex_Kind) {
|
||||
this->write(" [[attribute(" +
|
||||
@ -1996,10 +1962,9 @@ void MetalCodeGenerator::writeOutputStruct() {
|
||||
if (var.modifiers().fFlags & Modifiers::kOut_Flag &&
|
||||
-1 == var.modifiers().fLayout.fBuiltin) {
|
||||
this->write(" ");
|
||||
this->writeBaseType(var.type());
|
||||
this->writeType(var.type());
|
||||
this->write(" ");
|
||||
this->writeName(var.name());
|
||||
this->writeArrayDimensions(var.type());
|
||||
|
||||
int location = var.modifiers().fLayout.fLocation;
|
||||
if (location < 0) {
|
||||
@ -2088,10 +2053,9 @@ void MetalCodeGenerator::writeGlobalStruct() {
|
||||
void visitTexture(const Type& type, const String& name) override {
|
||||
this->addElement();
|
||||
fCodeGen->write(" ");
|
||||
fCodeGen->writeBaseType(type);
|
||||
fCodeGen->writeType(type);
|
||||
fCodeGen->write(" ");
|
||||
fCodeGen->writeName(name);
|
||||
fCodeGen->writeArrayDimensions(type);
|
||||
fCodeGen->write(";\n");
|
||||
}
|
||||
void visitSampler(const Type&, const String& name) override {
|
||||
@ -2103,10 +2067,9 @@ void MetalCodeGenerator::writeGlobalStruct() {
|
||||
void visitVariable(const Variable& var, const Expression* value) override {
|
||||
this->addElement();
|
||||
fCodeGen->write(" ");
|
||||
fCodeGen->writeBaseType(var.type());
|
||||
fCodeGen->writeType(var.type());
|
||||
fCodeGen->write(" ");
|
||||
fCodeGen->writeName(var.name());
|
||||
fCodeGen->writeArrayDimensions(var.type());
|
||||
fCodeGen->write(";\n");
|
||||
}
|
||||
void addElement() {
|
||||
|
@ -172,11 +172,7 @@ protected:
|
||||
|
||||
void writeStructDefinition(const StructDefinition& s);
|
||||
|
||||
void disallowArrayTypes(const Type& type, int offset);
|
||||
|
||||
void writeBaseType(const Type& type);
|
||||
|
||||
void writeArrayDimensions(const Type& type);
|
||||
void writeType(const Type& type);
|
||||
|
||||
void writeExtension(const Extension& ext);
|
||||
|
||||
|
@ -105,13 +105,15 @@ static void test_gpu(skiatest::Reporter* r, GrDirectContext* ctx, const char* te
|
||||
test_permutations(r, surface.get(), testFile);
|
||||
}
|
||||
|
||||
#define SKSL_TEST(name, path) \
|
||||
#define SKSL_TEST_CPU(name, path) \
|
||||
DEF_TEST(name ## _CPU, r) { \
|
||||
test_cpu(r, path); \
|
||||
} \
|
||||
}
|
||||
#define SKSL_TEST_GPU(name, path) \
|
||||
DEF_GPUTEST_FOR_RENDERING_CONTEXTS(name ## _GPU, r, ctxInfo) { \
|
||||
test_gpu(r, ctxInfo.directContext(), path); \
|
||||
}
|
||||
#define SKSL_TEST(name, path) SKSL_TEST_CPU(name, path) SKSL_TEST_GPU(name, path)
|
||||
|
||||
SKSL_TEST(SkSLBoolFolding, "folding/BoolFolding.sksl")
|
||||
SKSL_TEST(SkSLIntFoldingES2, "folding/IntFoldingES2.sksl")
|
||||
@ -129,6 +131,8 @@ SKSL_TEST(SkSLIntrinsicMinFloat, "intrinsics/MinFloat.sksl")
|
||||
SKSL_TEST(SkSLIntrinsicMixFloat, "intrinsics/MixFloat.sksl")
|
||||
SKSL_TEST(SkSLIntrinsicSignFloat, "intrinsics/SignFloat.sksl")
|
||||
|
||||
SKSL_TEST(SkSLArrayTypes, "shared/ArrayTypes.sksl")
|
||||
SKSL_TEST(SkSLAssignment, "shared/Assignment.sksl")
|
||||
SKSL_TEST(SkSLCastsRoundTowardZero, "shared/CastsRoundTowardZero.sksl")
|
||||
SKSL_TEST(SkSLCommaMixedTypes, "shared/CommaMixedTypes.sksl")
|
||||
SKSL_TEST(SkSLCommaSideEffects, "shared/CommaSideEffects.sksl")
|
||||
@ -172,6 +176,7 @@ SKSL_TEST(SkSLIntrinsicMinInt, "intrinsics/MinInt.sksl")
|
||||
SKSL_TEST(SkSLIntrinsicMixBool, "intrinsics/MixBool.sksl")
|
||||
SKSL_TEST(SkSLIntrinsicSignInt, "intrinsics/SignInt.sksl")
|
||||
|
||||
SKSL_TEST(SkSLArrayConstructors, "shared/ArrayConstructors.sksl")
|
||||
SKSL_TEST(SkSLDeadLoopVariable, "shared/DeadLoopVariable.sksl")
|
||||
SKSL_TEST(SkSLDoWhileControlFlow, "shared/DoWhileControlFlow.sksl")
|
||||
SKSL_TEST(SkSLEmptyBlocksES3, "shared/EmptyBlocksES3.sksl")
|
||||
|
@ -1,22 +1,33 @@
|
||||
OpCapability Shader
|
||||
%1 = OpExtInstImport "GLSL.std.450"
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint Fragment %main "main" %sk_FragColor %sk_Clockwise
|
||||
OpExecutionMode %main OriginUpperLeft
|
||||
OpEntryPoint Fragment %_entrypoint "_entrypoint" %sk_FragColor %sk_Clockwise
|
||||
OpExecutionMode %_entrypoint OriginUpperLeft
|
||||
OpName %sk_FragColor "sk_FragColor"
|
||||
OpName %sk_Clockwise "sk_Clockwise"
|
||||
OpName %test1 "test1"
|
||||
OpName %test2 "test2"
|
||||
OpName %test3 "test3"
|
||||
OpName %_UniformBuffer "_UniformBuffer"
|
||||
OpMemberName %_UniformBuffer 0 "colorGreen"
|
||||
OpMemberName %_UniformBuffer 1 "colorRed"
|
||||
OpName %_entrypoint "_entrypoint"
|
||||
OpName %main "main"
|
||||
OpDecorate %sk_FragColor RelaxedPrecision
|
||||
OpDecorate %sk_FragColor Location 0
|
||||
OpDecorate %sk_FragColor Index 0
|
||||
OpDecorate %sk_Clockwise RelaxedPrecision
|
||||
OpDecorate %sk_Clockwise BuiltIn FrontFacing
|
||||
OpMemberDecorate %_UniformBuffer 0 Offset 0
|
||||
OpMemberDecorate %_UniformBuffer 0 RelaxedPrecision
|
||||
OpMemberDecorate %_UniformBuffer 1 Offset 16
|
||||
OpMemberDecorate %_UniformBuffer 1 RelaxedPrecision
|
||||
OpDecorate %_UniformBuffer Block
|
||||
OpDecorate %10 Binding 0
|
||||
OpDecorate %10 DescriptorSet 0
|
||||
OpDecorate %_arr_float_int_4 ArrayStride 16
|
||||
OpDecorate %_arr_v2float_int_2 ArrayStride 16
|
||||
OpDecorate %_arr_mat4v4float_int_1 ArrayStride 64
|
||||
OpDecorate %74 RelaxedPrecision
|
||||
OpDecorate %76 RelaxedPrecision
|
||||
OpDecorate %77 RelaxedPrecision
|
||||
%float = OpTypeFloat 32
|
||||
%v4float = OpTypeVector %float 4
|
||||
%_ptr_Output_v4float = OpTypePointer Output %v4float
|
||||
@ -24,60 +35,86 @@ OpDecorate %_arr_mat4v4float_int_1 ArrayStride 64
|
||||
%bool = OpTypeBool
|
||||
%_ptr_Input_bool = OpTypePointer Input %bool
|
||||
%sk_Clockwise = OpVariable %_ptr_Input_bool Input
|
||||
%_UniformBuffer = OpTypeStruct %v4float %v4float
|
||||
%_ptr_Uniform__UniformBuffer = OpTypePointer Uniform %_UniformBuffer
|
||||
%10 = OpVariable %_ptr_Uniform__UniformBuffer Uniform
|
||||
%void = OpTypeVoid
|
||||
%15 = OpTypeFunction %void
|
||||
%18 = OpTypeFunction %v4float
|
||||
%int = OpTypeInt 32 1
|
||||
%int_4 = OpConstant %int 4
|
||||
%_arr_float_int_4 = OpTypeArray %float %int_4
|
||||
%_ptr_Private__arr_float_int_4 = OpTypePointer Private %_arr_float_int_4
|
||||
%test1 = OpVariable %_ptr_Private__arr_float_int_4 Private
|
||||
%_ptr_Function__arr_float_int_4 = OpTypePointer Function %_arr_float_int_4
|
||||
%float_1 = OpConstant %float 1
|
||||
%float_2 = OpConstant %float 2
|
||||
%float_3 = OpConstant %float 3
|
||||
%float_4 = OpConstant %float 4
|
||||
%int_3 = OpConstant %int 3
|
||||
%_ptr_Function_float = OpTypePointer Function %float
|
||||
%v2float = OpTypeVector %float 2
|
||||
%int_2 = OpConstant %int 2
|
||||
%_arr_v2float_int_2 = OpTypeArray %v2float %int_2
|
||||
%_ptr_Private__arr_v2float_int_2 = OpTypePointer Private %_arr_v2float_int_2
|
||||
%test2 = OpVariable %_ptr_Private__arr_v2float_int_2 Private
|
||||
%25 = OpConstantComposite %v2float %float_1 %float_2
|
||||
%26 = OpConstantComposite %v2float %float_3 %float_4
|
||||
%mat4v4float = OpTypeMatrix %v4float 4
|
||||
%_ptr_Function__arr_v2float_int_2 = OpTypePointer Function %_arr_v2float_int_2
|
||||
%39 = OpConstantComposite %v2float %float_1 %float_2
|
||||
%40 = OpConstantComposite %v2float %float_3 %float_4
|
||||
%int_1 = OpConstant %int 1
|
||||
%_ptr_Function_v2float = OpTypePointer Function %v2float
|
||||
%mat4v4float = OpTypeMatrix %v4float 4
|
||||
%_arr_mat4v4float_int_1 = OpTypeArray %mat4v4float %int_1
|
||||
%_ptr_Private__arr_mat4v4float_int_1 = OpTypePointer Private %_arr_mat4v4float_int_1
|
||||
%test3 = OpVariable %_ptr_Private__arr_mat4v4float_int_1 Private
|
||||
%_ptr_Function__arr_mat4v4float_int_1 = OpTypePointer Function %_arr_mat4v4float_int_1
|
||||
%float_16 = OpConstant %float 16
|
||||
%float_0 = OpConstant %float 0
|
||||
%void = OpTypeVoid
|
||||
%42 = OpTypeFunction %void
|
||||
%int_0 = OpConstant %int 0
|
||||
%_ptr_Private_float = OpTypePointer Private %float
|
||||
%_ptr_Private_v2float = OpTypePointer Private %v2float
|
||||
%_ptr_Private_v4float = OpTypePointer Private %v4float
|
||||
%_ptr_Output_float = OpTypePointer Output %float
|
||||
%main = OpFunction %void None %42
|
||||
%43 = OpLabel
|
||||
%19 = OpCompositeConstruct %_arr_float_int_4 %float_1 %float_2 %float_3 %float_4
|
||||
OpStore %test1 %19
|
||||
%27 = OpCompositeConstruct %_arr_v2float_int_2 %25 %26
|
||||
OpStore %test2 %27
|
||||
%36 = OpCompositeConstruct %v4float %float_16 %float_0 %float_0 %float_0
|
||||
%37 = OpCompositeConstruct %v4float %float_0 %float_16 %float_0 %float_0
|
||||
%38 = OpCompositeConstruct %v4float %float_0 %float_0 %float_16 %float_0
|
||||
%39 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_16
|
||||
%34 = OpCompositeConstruct %mat4v4float %36 %37 %38 %39
|
||||
%40 = OpCompositeConstruct %_arr_mat4v4float_int_1 %34
|
||||
OpStore %test3 %40
|
||||
%45 = OpAccessChain %_ptr_Private_float %test1 %int_0
|
||||
%47 = OpLoad %float %45
|
||||
%48 = OpAccessChain %_ptr_Private_v2float %test2 %int_0
|
||||
%50 = OpLoad %v2float %48
|
||||
%51 = OpCompositeExtract %float %50 0
|
||||
%52 = OpFAdd %float %47 %51
|
||||
%53 = OpAccessChain %_ptr_Private_v4float %test3 %int_0 %int_0
|
||||
%55 = OpLoad %v4float %53
|
||||
%56 = OpCompositeExtract %float %55 0
|
||||
%57 = OpFAdd %float %52 %56
|
||||
%58 = OpAccessChain %_ptr_Output_float %sk_FragColor %int_0
|
||||
OpStore %58 %57
|
||||
%_ptr_Function_v4float = OpTypePointer Function %v4float
|
||||
%float_24 = OpConstant %float 24
|
||||
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
|
||||
%_entrypoint = OpFunction %void None %15
|
||||
%16 = OpLabel
|
||||
%17 = OpFunctionCall %v4float %main
|
||||
OpStore %sk_FragColor %17
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
%main = OpFunction %v4float None %18
|
||||
%19 = OpLabel
|
||||
%20 = OpVariable %_ptr_Function__arr_float_int_4 Function
|
||||
%34 = OpVariable %_ptr_Function__arr_v2float_int_2 Function
|
||||
%48 = OpVariable %_ptr_Function__arr_mat4v4float_int_1 Function
|
||||
%68 = OpVariable %_ptr_Function_v4float Function
|
||||
%29 = OpCompositeConstruct %_arr_float_int_4 %float_1 %float_2 %float_3 %float_4
|
||||
OpStore %20 %29
|
||||
%31 = OpAccessChain %_ptr_Function_float %20 %int_3
|
||||
%33 = OpLoad %float %31
|
||||
%41 = OpCompositeConstruct %_arr_v2float_int_2 %39 %40
|
||||
OpStore %34 %41
|
||||
%43 = OpAccessChain %_ptr_Function_v2float %34 %int_1
|
||||
%45 = OpLoad %v2float %43
|
||||
%46 = OpCompositeExtract %float %45 1
|
||||
%47 = OpFAdd %float %33 %46
|
||||
%55 = OpCompositeConstruct %v4float %float_16 %float_0 %float_0 %float_0
|
||||
%56 = OpCompositeConstruct %v4float %float_0 %float_16 %float_0 %float_0
|
||||
%57 = OpCompositeConstruct %v4float %float_0 %float_0 %float_16 %float_0
|
||||
%58 = OpCompositeConstruct %v4float %float_0 %float_0 %float_0 %float_16
|
||||
%53 = OpCompositeConstruct %mat4v4float %55 %56 %57 %58
|
||||
%59 = OpCompositeConstruct %_arr_mat4v4float_int_1 %53
|
||||
OpStore %48 %59
|
||||
%61 = OpAccessChain %_ptr_Function_v4float %48 %int_0 %int_3
|
||||
%63 = OpLoad %v4float %61
|
||||
%64 = OpCompositeExtract %float %63 3
|
||||
%65 = OpFAdd %float %47 %64
|
||||
%67 = OpFOrdEqual %bool %65 %float_24
|
||||
OpSelectionMerge %71 None
|
||||
OpBranchConditional %67 %69 %70
|
||||
%69 = OpLabel
|
||||
%72 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
|
||||
%74 = OpLoad %v4float %72
|
||||
OpStore %68 %74
|
||||
OpBranch %71
|
||||
%70 = OpLabel
|
||||
%75 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
|
||||
%76 = OpLoad %v4float %75
|
||||
OpStore %68 %76
|
||||
OpBranch %71
|
||||
%71 = OpLabel
|
||||
%77 = OpLoad %v4float %68
|
||||
OpReturnValue %77
|
||||
OpFunctionEnd
|
||||
|
@ -1,8 +1,7 @@
|
||||
|
||||
out vec4 sk_FragColor;
|
||||
float test1[4] = float[4](1.0, 2.0, 3.0, 4.0);
|
||||
vec2 test2[2] = vec2[2](vec2(1.0, 2.0), vec2(3.0, 4.0));
|
||||
mat4 test3[1] = mat4[1](mat4(16.0));
|
||||
void main() {
|
||||
sk_FragColor.x = (test1[0] + test2[0].x) + test3[0][0].x;
|
||||
uniform vec4 colorGreen;
|
||||
uniform vec4 colorRed;
|
||||
vec4 main() {
|
||||
return (float[4](1.0, 2.0, 3.0, 4.0)[3] + vec2[2](vec2(1.0, 2.0), vec2(3.0, 4.0))[1].y) + mat4[1](mat4(16.0))[0][3].w == 24.0 ? colorGreen : colorRed;
|
||||
}
|
||||
|
@ -1,6 +1,20 @@
|
||||
### Compilation failed:
|
||||
#include <metal_stdlib>
|
||||
#include <simd/simd.h>
|
||||
using namespace metal;
|
||||
struct Uniforms {
|
||||
float4 colorGreen;
|
||||
float4 colorRed;
|
||||
};
|
||||
struct Inputs {
|
||||
};
|
||||
struct Outputs {
|
||||
float4 sk_FragColor [[color(0)]];
|
||||
};
|
||||
|
||||
error: 1: Metal does not support array types in this context
|
||||
error: 2: Metal does not support array types in this context
|
||||
error: 3: Metal does not support array types in this context
|
||||
3 errors
|
||||
|
||||
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
|
||||
Outputs _out;
|
||||
(void)_out;
|
||||
_out.sk_FragColor = (array<float, 4>{1.0, 2.0, 3.0, 4.0}[3] + array<float2, 2>{float2(1.0, 2.0), float2(3.0, 4.0)}[1].y) + array<float4x4, 1>{float4x4(16.0)}[0][3].w == 24.0 ? _uniforms.colorGreen : _uniforms.colorRed;
|
||||
return _out;
|
||||
}
|
||||
|
@ -1,7 +1,14 @@
|
||||
### Compilation failed:
|
||||
|
||||
error: 2: Metal does not support array types in this context
|
||||
error: 2: Metal does not support array types in this context
|
||||
error: 2: Metal does not support array types in this context
|
||||
error: 2: Metal does not support array types in this context
|
||||
4 errors
|
||||
#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 _out;
|
||||
(void)_out;
|
||||
_out.sk_FragColor = float4(array<float, 4>{1.0, 2.0, 3.0, 4.0}[0], array<float, 4>{1.0, 2.0, 3.0, 4.0}[1u], array<float, 4>{1.0, 2.0, 3.0, 4.0}[2], array<float, 4>{1.0, 2.0, 3.0, 4.0}[3u]);
|
||||
return _out;
|
||||
}
|
||||
|
@ -1,11 +1,14 @@
|
||||
OpCapability Shader
|
||||
%1 = OpExtInstImport "GLSL.std.450"
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint Fragment %main "main" %sk_FragColor %sk_Clockwise
|
||||
OpExecutionMode %main OriginUpperLeft
|
||||
OpEntryPoint Fragment %_entrypoint "_entrypoint" %sk_FragColor %sk_Clockwise
|
||||
OpExecutionMode %_entrypoint OriginUpperLeft
|
||||
OpName %sk_FragColor "sk_FragColor"
|
||||
OpName %sk_Clockwise "sk_Clockwise"
|
||||
OpName %_entrypoint "_entrypoint"
|
||||
OpName %main "main"
|
||||
OpName %x "x"
|
||||
OpName %y "y"
|
||||
OpDecorate %sk_FragColor RelaxedPrecision
|
||||
OpDecorate %sk_FragColor Location 0
|
||||
OpDecorate %sk_FragColor Index 0
|
||||
@ -20,40 +23,70 @@ OpDecorate %_arr_v2float_int_2 ArrayStride 16
|
||||
%_ptr_Input_bool = OpTypePointer Input %bool
|
||||
%sk_Clockwise = OpVariable %_ptr_Input_bool Input
|
||||
%void = OpTypeVoid
|
||||
%11 = OpTypeFunction %void
|
||||
%12 = OpTypeFunction %void
|
||||
%15 = OpTypeFunction %v4float
|
||||
%v2float = OpTypeVector %float 2
|
||||
%int = OpTypeInt 32 1
|
||||
%int_2 = OpConstant %int 2
|
||||
%_arr_v2float_int_2 = OpTypeArray %v2float %int_2
|
||||
%_ptr_Function__arr_v2float_int_2 = OpTypePointer Function %_arr_v2float_int_2
|
||||
%float_1 = OpConstant %float 1
|
||||
%20 = OpConstantComposite %v2float %float_1 %float_1
|
||||
%float_2 = OpConstant %float 2
|
||||
%22 = OpConstantComposite %v2float %float_2 %float_2
|
||||
%float_0 = OpConstant %float 0
|
||||
%24 = OpConstantComposite %v2float %float_0 %float_0
|
||||
%int_0 = OpConstant %int 0
|
||||
%_ptr_Function_v2float = OpTypePointer Function %v2float
|
||||
%float_3 = OpConstant %float 3
|
||||
%32 = OpConstantComposite %v2float %float_3 %float_3
|
||||
%float_4 = OpConstant %float 4
|
||||
%34 = OpConstantComposite %v2float %float_4 %float_4
|
||||
%float_1 = OpConstant %float 1
|
||||
%29 = OpConstantComposite %v2float %float_1 %float_0
|
||||
%int_1 = OpConstant %int 1
|
||||
%main = OpFunction %void None %11
|
||||
%12 = OpLabel
|
||||
%13 = OpVariable %_ptr_Function__arr_v2float_int_2 Function
|
||||
%30 = OpVariable %_ptr_Function__arr_v2float_int_2 Function
|
||||
%23 = OpCompositeConstruct %_arr_v2float_int_2 %20 %22
|
||||
OpStore %13 %23
|
||||
%25 = OpAccessChain %_ptr_Function_v2float %13 %int_0
|
||||
%27 = OpLoad %v2float %25
|
||||
%28 = OpCompositeExtract %float %27 0
|
||||
%29 = OpCompositeExtract %float %27 1
|
||||
%35 = OpCompositeConstruct %_arr_v2float_int_2 %32 %34
|
||||
OpStore %30 %35
|
||||
%37 = OpAccessChain %_ptr_Function_v2float %30 %int_1
|
||||
%38 = OpLoad %v2float %37
|
||||
%39 = OpCompositeExtract %float %38 0
|
||||
%40 = OpCompositeExtract %float %38 1
|
||||
%41 = OpCompositeConstruct %v4float %28 %29 %39 %40
|
||||
OpStore %sk_FragColor %41
|
||||
%33 = OpConstantComposite %v2float %float_0 %float_1
|
||||
%float_n1 = OpConstant %float -1
|
||||
%float_2 = OpConstant %float 2
|
||||
%37 = OpConstantComposite %v2float %float_n1 %float_2
|
||||
%_entrypoint = OpFunction %void None %12
|
||||
%13 = OpLabel
|
||||
%14 = OpFunctionCall %v4float %main
|
||||
OpStore %sk_FragColor %14
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
%main = OpFunction %v4float None %15
|
||||
%16 = OpLabel
|
||||
%x = OpVariable %_ptr_Function__arr_v2float_int_2 Function
|
||||
%y = OpVariable %_ptr_Function__arr_v2float_int_2 Function
|
||||
%26 = OpAccessChain %_ptr_Function_v2float %x %int_0
|
||||
OpStore %26 %24
|
||||
%31 = OpAccessChain %_ptr_Function_v2float %x %int_1
|
||||
OpStore %31 %29
|
||||
%34 = OpAccessChain %_ptr_Function_v2float %y %int_0
|
||||
OpStore %34 %33
|
||||
%38 = OpAccessChain %_ptr_Function_v2float %y %int_1
|
||||
OpStore %38 %37
|
||||
%39 = OpAccessChain %_ptr_Function_v2float %x %int_0
|
||||
%40 = OpLoad %v2float %39
|
||||
%41 = OpCompositeExtract %float %40 0
|
||||
%42 = OpAccessChain %_ptr_Function_v2float %x %int_0
|
||||
%43 = OpLoad %v2float %42
|
||||
%44 = OpCompositeExtract %float %43 1
|
||||
%45 = OpFMul %float %41 %44
|
||||
%46 = OpAccessChain %_ptr_Function_v2float %x %int_1
|
||||
%47 = OpLoad %v2float %46
|
||||
%48 = OpCompositeExtract %float %47 0
|
||||
%49 = OpAccessChain %_ptr_Function_v2float %x %int_1
|
||||
%50 = OpLoad %v2float %49
|
||||
%51 = OpCompositeExtract %float %50 1
|
||||
%52 = OpFSub %float %48 %51
|
||||
%53 = OpAccessChain %_ptr_Function_v2float %y %int_0
|
||||
%54 = OpLoad %v2float %53
|
||||
%55 = OpCompositeExtract %float %54 0
|
||||
%56 = OpAccessChain %_ptr_Function_v2float %y %int_0
|
||||
%57 = OpLoad %v2float %56
|
||||
%58 = OpCompositeExtract %float %57 1
|
||||
%59 = OpFDiv %float %55 %58
|
||||
%60 = OpAccessChain %_ptr_Function_v2float %y %int_1
|
||||
%61 = OpLoad %v2float %60
|
||||
%62 = OpCompositeExtract %float %61 0
|
||||
%63 = OpAccessChain %_ptr_Function_v2float %y %int_1
|
||||
%64 = OpLoad %v2float %63
|
||||
%65 = OpCompositeExtract %float %64 1
|
||||
%66 = OpFAdd %float %62 %65
|
||||
%67 = OpCompositeConstruct %v4float %45 %52 %59 %66
|
||||
OpReturnValue %67
|
||||
OpFunctionEnd
|
||||
|
@ -1,5 +1,11 @@
|
||||
|
||||
out vec4 sk_FragColor;
|
||||
void main() {
|
||||
sk_FragColor = vec4(vec2[2](vec2(1.0), vec2(2.0))[0], vec2[2](vec2(3.0), vec2(4.0))[1]);
|
||||
vec4 main() {
|
||||
vec2 x[2];
|
||||
x[0] = vec2(0.0, 0.0);
|
||||
x[1] = vec2(1.0, 0.0);
|
||||
vec2 y[2];
|
||||
y[0] = vec2(0.0, 1.0);
|
||||
y[1] = vec2(-1.0, 2.0);
|
||||
return vec4(x[0].x * x[0].y, x[1].x - x[1].y, y[0].x / y[0].y, y[1].x + y[1].y);
|
||||
}
|
||||
|
@ -1,5 +1,20 @@
|
||||
### Compilation failed:
|
||||
|
||||
error: 2: Metal does not support array types in this context
|
||||
error: 3: Metal does not support array types in this context
|
||||
2 errors
|
||||
#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 _out;
|
||||
(void)_out;
|
||||
array<float2, 2> x;
|
||||
x[0] = float2(0.0, 0.0);
|
||||
x[1] = float2(1.0, 0.0);
|
||||
array<float2, 2> y;
|
||||
y[0] = float2(0.0, 1.0);
|
||||
y[1] = float2(-1.0, 2.0);
|
||||
_out.sk_FragColor = float4(x[0].x * x[0].y, x[1].x - x[1].y, y[0].x / y[0].y, y[1].x + y[1].y);
|
||||
return _out;
|
||||
}
|
||||
|
@ -1,49 +1,43 @@
|
||||
OpCapability Shader
|
||||
%1 = OpExtInstImport "GLSL.std.450"
|
||||
OpMemoryModel Logical GLSL450
|
||||
OpEntryPoint Fragment %main "main" %sk_FragColor %sk_Clockwise
|
||||
OpExecutionMode %main OriginUpperLeft
|
||||
OpEntryPoint Fragment %_entrypoint "_entrypoint" %sk_FragColor %sk_Clockwise
|
||||
OpExecutionMode %_entrypoint OriginUpperLeft
|
||||
OpName %sk_FragColor "sk_FragColor"
|
||||
OpName %sk_Clockwise "sk_Clockwise"
|
||||
OpName %_UniformBuffer "_UniformBuffer"
|
||||
OpMemberName %_UniformBuffer 0 "colorGreen"
|
||||
OpName %_entrypoint "_entrypoint"
|
||||
OpName %main "main"
|
||||
OpName %i4 "i4"
|
||||
OpName %x "x"
|
||||
OpName %ai "ai"
|
||||
OpName %ai4 "ai4"
|
||||
OpName %ah2x4 "ah2x4"
|
||||
OpName %af4 "af4"
|
||||
OpName %S "S"
|
||||
OpMemberName %S 0 "f"
|
||||
OpMemberName %S 1 "af"
|
||||
OpMemberName %S 2 "h4"
|
||||
OpMemberName %S 3 "ah4"
|
||||
OpName %s "s"
|
||||
OpDecorate %sk_FragColor RelaxedPrecision
|
||||
OpDecorate %sk_FragColor Location 0
|
||||
OpDecorate %sk_FragColor Index 0
|
||||
OpDecorate %sk_Clockwise RelaxedPrecision
|
||||
OpDecorate %sk_Clockwise BuiltIn FrontFacing
|
||||
OpDecorate %23 RelaxedPrecision
|
||||
OpMemberDecorate %_UniformBuffer 0 Offset 0
|
||||
OpMemberDecorate %_UniformBuffer 0 RelaxedPrecision
|
||||
OpDecorate %_UniformBuffer Block
|
||||
OpDecorate %10 Binding 0
|
||||
OpDecorate %10 DescriptorSet 0
|
||||
OpDecorate %37 RelaxedPrecision
|
||||
OpDecorate %_arr_int_int_1 ArrayStride 16
|
||||
OpDecorate %_arr_v4int_int_1 ArrayStride 16
|
||||
OpDecorate %_arr_mat2v4float_int_1 ArrayStride 32
|
||||
OpDecorate %53 RelaxedPrecision
|
||||
OpDecorate %54 RelaxedPrecision
|
||||
OpDecorate %52 RelaxedPrecision
|
||||
OpDecorate %_arr_mat3v3float_int_1 ArrayStride 48
|
||||
OpDecorate %63 RelaxedPrecision
|
||||
OpDecorate %64 RelaxedPrecision
|
||||
OpDecorate %65 RelaxedPrecision
|
||||
OpDecorate %62 RelaxedPrecision
|
||||
OpDecorate %_arr_v4float_int_1 ArrayStride 16
|
||||
OpDecorate %_arr_float_int_5 ArrayStride 16
|
||||
OpDecorate %_arr_v4float_int_5 ArrayStride 16
|
||||
OpMemberDecorate %S 0 Offset 0
|
||||
OpMemberDecorate %S 1 Offset 16
|
||||
OpMemberDecorate %S 2 Offset 96
|
||||
OpMemberDecorate %S 2 RelaxedPrecision
|
||||
OpMemberDecorate %S 3 Offset 112
|
||||
OpMemberDecorate %S 3 RelaxedPrecision
|
||||
OpDecorate %83 RelaxedPrecision
|
||||
OpDecorate %87 RelaxedPrecision
|
||||
OpDecorate %114 RelaxedPrecision
|
||||
OpDecorate %131 RelaxedPrecision
|
||||
OpDecorate %141 RelaxedPrecision
|
||||
OpDecorate %143 RelaxedPrecision
|
||||
OpDecorate %81 RelaxedPrecision
|
||||
OpDecorate %82 RelaxedPrecision
|
||||
OpDecorate %85 RelaxedPrecision
|
||||
OpDecorate %89 RelaxedPrecision
|
||||
%float = OpTypeFloat 32
|
||||
%v4float = OpTypeVector %float 4
|
||||
%_ptr_Output_v4float = OpTypePointer Output %v4float
|
||||
@ -51,30 +45,35 @@ OpDecorate %143 RelaxedPrecision
|
||||
%bool = OpTypeBool
|
||||
%_ptr_Input_bool = OpTypePointer Input %bool
|
||||
%sk_Clockwise = OpVariable %_ptr_Input_bool Input
|
||||
%_UniformBuffer = OpTypeStruct %v4float
|
||||
%_ptr_Uniform__UniformBuffer = OpTypePointer Uniform %_UniformBuffer
|
||||
%10 = OpVariable %_ptr_Uniform__UniformBuffer Uniform
|
||||
%void = OpTypeVoid
|
||||
%11 = OpTypeFunction %void
|
||||
%15 = OpTypeFunction %void
|
||||
%18 = OpTypeFunction %v4float
|
||||
%int = OpTypeInt 32 1
|
||||
%v4int = OpTypeVector %int 4
|
||||
%_ptr_Function_v4int = OpTypePointer Function %v4int
|
||||
%int_1 = OpConstant %int 1
|
||||
%int_2 = OpConstant %int 2
|
||||
%int_3 = OpConstant %int 3
|
||||
%int_4 = OpConstant %int 4
|
||||
%28 = OpConstantComposite %v4int %int_1 %int_2 %int_3 %int_4
|
||||
%_ptr_Function_v4float = OpTypePointer Function %v4float
|
||||
%float_0 = OpConstant %float 0
|
||||
%_ptr_Function_float = OpTypePointer Function %float
|
||||
%int = OpTypeInt 32 1
|
||||
%int_3 = OpConstant %int 3
|
||||
%v2float = OpTypeVector %float 2
|
||||
%21 = OpConstantComposite %v2float %float_0 %float_0
|
||||
%int_1 = OpConstant %int 1
|
||||
%35 = OpConstantComposite %v2float %float_0 %float_0
|
||||
%_arr_int_int_1 = OpTypeArray %int %int_1
|
||||
%_ptr_Function__arr_int_int_1 = OpTypePointer Function %_arr_int_int_1
|
||||
%int_0 = OpConstant %int 0
|
||||
%_ptr_Function_int = OpTypePointer Function %int
|
||||
%v4int = OpTypeVector %int 4
|
||||
%_arr_v4int_int_1 = OpTypeArray %v4int %int_1
|
||||
%_ptr_Function__arr_v4int_int_1 = OpTypePointer Function %_arr_v4int_int_1
|
||||
%int_2 = OpConstant %int 2
|
||||
%int_4 = OpConstant %int 4
|
||||
%37 = OpConstantComposite %v4int %int_1 %int_2 %int_3 %int_4
|
||||
%_ptr_Function_v4int = OpTypePointer Function %v4int
|
||||
%mat2v4float = OpTypeMatrix %v4float 2
|
||||
%_arr_mat2v4float_int_1 = OpTypeArray %mat2v4float %int_1
|
||||
%_ptr_Function__arr_mat2v4float_int_1 = OpTypePointer Function %_arr_mat2v4float_int_1
|
||||
%v3float = OpTypeVector %float 3
|
||||
%mat3v3float = OpTypeMatrix %v3float 3
|
||||
%_arr_mat3v3float_int_1 = OpTypeArray %mat3v3float %int_1
|
||||
%_ptr_Function__arr_mat3v3float_int_1 = OpTypePointer Function %_arr_mat3v3float_int_1
|
||||
%float_1 = OpConstant %float 1
|
||||
%float_2 = OpConstant %float 2
|
||||
%float_3 = OpConstant %float 3
|
||||
@ -83,139 +82,62 @@ OpDecorate %143 RelaxedPrecision
|
||||
%float_6 = OpConstant %float 6
|
||||
%float_7 = OpConstant %float 7
|
||||
%float_8 = OpConstant %float 8
|
||||
%_ptr_Function_mat2v4float = OpTypePointer Function %mat2v4float
|
||||
%float_9 = OpConstant %float 9
|
||||
%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
|
||||
%_arr_v4float_int_1 = OpTypeArray %v4float %int_1
|
||||
%_ptr_Function__arr_v4float_int_1 = OpTypePointer Function %_arr_v4float_int_1
|
||||
%66 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
|
||||
%int_5 = OpConstant %int 5
|
||||
%_arr_float_int_5 = OpTypeArray %float %int_5
|
||||
%_arr_v4float_int_5 = OpTypeArray %v4float %int_5
|
||||
%S = OpTypeStruct %float %_arr_float_int_5 %v4float %_arr_v4float_int_5
|
||||
%_ptr_Function_S = OpTypePointer Function %S
|
||||
%v3float = OpTypeVector %float 3
|
||||
%float_9 = OpConstant %float 9
|
||||
%80 = OpConstantComposite %v3float %float_9 %float_9 %float_9
|
||||
%84 = OpConstantComposite %v2float %float_5 %float_5
|
||||
%91 = OpConstantComposite %v4float %float_2 %float_2 %float_2 %float_2
|
||||
%93 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
|
||||
%mat3v3float = OpTypeMatrix %v3float 3
|
||||
%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
|
||||
%_ptr_Function_v3float = OpTypePointer Function %v3float
|
||||
%main = OpFunction %void None %11
|
||||
%12 = OpLabel
|
||||
%73 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
|
||||
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
|
||||
%_entrypoint = OpFunction %void None %15
|
||||
%16 = OpLabel
|
||||
%17 = OpFunctionCall %v4float %main
|
||||
OpStore %sk_FragColor %17
|
||||
OpReturn
|
||||
OpFunctionEnd
|
||||
%main = OpFunction %v4float None %18
|
||||
%19 = OpLabel
|
||||
%i4 = OpVariable %_ptr_Function_v4int Function
|
||||
%x = OpVariable %_ptr_Function_v4float Function
|
||||
%ai = OpVariable %_ptr_Function__arr_int_int_1 Function
|
||||
%ai4 = OpVariable %_ptr_Function__arr_v4int_int_1 Function
|
||||
%ah2x4 = OpVariable %_ptr_Function__arr_mat2v4float_int_1 Function
|
||||
%ah2x4 = OpVariable %_ptr_Function__arr_mat3v3float_int_1 Function
|
||||
%af4 = OpVariable %_ptr_Function__arr_v4float_int_1 Function
|
||||
%s = OpVariable %_ptr_Function_S Function
|
||||
%103 = OpVariable %_ptr_Function_mat3v3float Function
|
||||
%16 = OpAccessChain %_ptr_Function_float %x %int_3
|
||||
OpStore %16 %float_0
|
||||
%22 = OpLoad %v4float %x
|
||||
%23 = OpVectorShuffle %v4float %22 %21 5 4 2 3
|
||||
OpStore %x %23
|
||||
%29 = OpAccessChain %_ptr_Function_int %ai %int_0
|
||||
OpStore %29 %int_0
|
||||
%38 = OpAccessChain %_ptr_Function_v4int %ai4 %int_0
|
||||
OpStore %38 %37
|
||||
%53 = OpCompositeConstruct %v4float %float_1 %float_2 %float_3 %float_4
|
||||
%54 = OpCompositeConstruct %v4float %float_5 %float_6 %float_7 %float_8
|
||||
%52 = OpCompositeConstruct %mat2v4float %53 %54
|
||||
%55 = OpAccessChain %_ptr_Function_mat2v4float %ah2x4 %int_0
|
||||
OpStore %55 %52
|
||||
%57 = OpAccessChain %_ptr_Function_int %ai %int_0
|
||||
OpStore %57 %int_0
|
||||
%58 = OpAccessChain %_ptr_Function_int %ai %int_0
|
||||
%59 = OpLoad %int %58
|
||||
%60 = OpAccessChain %_ptr_Function_int %ai %59
|
||||
OpStore %60 %int_0
|
||||
%64 = OpAccessChain %_ptr_Function_v4float %af4 %int_0
|
||||
%65 = OpAccessChain %_ptr_Function_float %64 %int_0
|
||||
OpStore %65 %float_0
|
||||
%67 = OpAccessChain %_ptr_Function_v4float %af4 %int_0
|
||||
%68 = OpLoad %v4float %67
|
||||
%69 = OpVectorShuffle %v4float %68 %66 6 4 7 5
|
||||
OpStore %67 %69
|
||||
%76 = OpAccessChain %_ptr_Function_float %s %int_0
|
||||
OpStore %76 %float_0
|
||||
%77 = OpAccessChain %_ptr_Function_float %s %int_1 %int_1
|
||||
OpStore %77 %float_0
|
||||
%81 = OpAccessChain %_ptr_Function_v4float %s %int_2
|
||||
%82 = OpLoad %v4float %81
|
||||
%83 = OpVectorShuffle %v4float %82 %80 5 6 4 3
|
||||
OpStore %81 %83
|
||||
%85 = OpAccessChain %_ptr_Function_v4float %s %int_3 %int_2
|
||||
%86 = OpLoad %v4float %85
|
||||
%87 = OpVectorShuffle %v4float %86 %84 0 4 2 5
|
||||
OpStore %85 %87
|
||||
%88 = OpAccessChain %_ptr_Function_float %s %int_0
|
||||
OpStore %88 %float_1
|
||||
%89 = OpAccessChain %_ptr_Function_float %s %int_1 %int_0
|
||||
OpStore %89 %float_2
|
||||
%90 = OpAccessChain %_ptr_Function_v4float %s %int_2
|
||||
OpStore %90 %66
|
||||
%92 = OpAccessChain %_ptr_Function_v4float %s %int_3 %int_0
|
||||
OpStore %92 %91
|
||||
OpStore %sk_FragColor %93
|
||||
%94 = OpCompositeExtract %int %37 0
|
||||
%95 = OpConvertSToF %float %94
|
||||
%96 = OpCompositeExtract %int %37 1
|
||||
%97 = OpConvertSToF %float %96
|
||||
%98 = OpCompositeExtract %int %37 2
|
||||
%99 = OpConvertSToF %float %98
|
||||
%100 = OpCompositeExtract %int %37 3
|
||||
%101 = OpConvertSToF %float %100
|
||||
%102 = OpCompositeConstruct %v4float %95 %97 %99 %101
|
||||
OpStore %sk_FragColor %102
|
||||
%107 = OpCompositeConstruct %v3float %float_1 %float_2 %float_3
|
||||
%108 = OpCompositeConstruct %v3float %float_4 %float_5 %float_6
|
||||
%109 = OpCompositeConstruct %v3float %float_7 %float_8 %float_9
|
||||
%106 = OpCompositeConstruct %mat3v3float %107 %108 %109
|
||||
OpStore %103 %106
|
||||
%110 = OpAccessChain %_ptr_Function_v3float %103 %int_0
|
||||
%112 = OpLoad %v3float %110
|
||||
%113 = OpVectorShuffle %v4float %112 %112 0 0 1 2
|
||||
OpStore %sk_FragColor %113
|
||||
%114 = OpLoad %v4float %x
|
||||
OpStore %sk_FragColor %114
|
||||
%115 = OpAccessChain %_ptr_Function_int %ai %int_0
|
||||
%116 = OpLoad %int %115
|
||||
%117 = OpConvertSToF %float %116
|
||||
%118 = OpCompositeConstruct %v4float %117 %117 %117 %117
|
||||
OpStore %sk_FragColor %118
|
||||
%119 = OpAccessChain %_ptr_Function_v4int %ai4 %int_0
|
||||
%120 = OpLoad %v4int %119
|
||||
%121 = OpCompositeExtract %int %120 0
|
||||
%122 = OpConvertSToF %float %121
|
||||
%123 = OpCompositeExtract %int %120 1
|
||||
%124 = OpConvertSToF %float %123
|
||||
%125 = OpCompositeExtract %int %120 2
|
||||
%126 = OpConvertSToF %float %125
|
||||
%127 = OpCompositeExtract %int %120 3
|
||||
%128 = OpConvertSToF %float %127
|
||||
%129 = OpCompositeConstruct %v4float %122 %124 %126 %128
|
||||
OpStore %sk_FragColor %129
|
||||
%130 = OpAccessChain %_ptr_Function_v4float %ah2x4 %int_0 %int_0
|
||||
%131 = OpLoad %v4float %130
|
||||
OpStore %sk_FragColor %131
|
||||
%132 = OpAccessChain %_ptr_Function_v4float %af4 %int_0
|
||||
%133 = OpLoad %v4float %132
|
||||
OpStore %sk_FragColor %133
|
||||
OpStore %sk_FragColor %93
|
||||
%134 = OpAccessChain %_ptr_Function_float %s %int_0
|
||||
%135 = OpLoad %float %134
|
||||
%136 = OpCompositeConstruct %v4float %135 %135 %135 %135
|
||||
OpStore %sk_FragColor %136
|
||||
%137 = OpAccessChain %_ptr_Function_float %s %int_1 %int_1
|
||||
%138 = OpLoad %float %137
|
||||
%139 = OpCompositeConstruct %v4float %138 %138 %138 %138
|
||||
OpStore %sk_FragColor %139
|
||||
%140 = OpAccessChain %_ptr_Function_v4float %s %int_2
|
||||
%141 = OpLoad %v4float %140
|
||||
OpStore %sk_FragColor %141
|
||||
%142 = OpAccessChain %_ptr_Function_v4float %s %int_3 %int_0
|
||||
%143 = OpLoad %v4float %142
|
||||
OpStore %sk_FragColor %143
|
||||
OpReturn
|
||||
OpStore %i4 %28
|
||||
%32 = OpAccessChain %_ptr_Function_float %x %int_3
|
||||
OpStore %32 %float_0
|
||||
%36 = OpLoad %v4float %x
|
||||
%37 = OpVectorShuffle %v4float %36 %35 5 4 2 3
|
||||
OpStore %x %37
|
||||
%42 = OpAccessChain %_ptr_Function_int %ai %int_0
|
||||
OpStore %42 %int_0
|
||||
%47 = OpAccessChain %_ptr_Function_v4int %ai4 %int_0
|
||||
OpStore %47 %28
|
||||
%63 = OpCompositeConstruct %v3float %float_1 %float_2 %float_3
|
||||
%64 = OpCompositeConstruct %v3float %float_4 %float_5 %float_6
|
||||
%65 = OpCompositeConstruct %v3float %float_7 %float_8 %float_9
|
||||
%62 = OpCompositeConstruct %mat3v3float %63 %64 %65
|
||||
%66 = OpAccessChain %_ptr_Function_mat3v3float %ah2x4 %int_0
|
||||
OpStore %66 %62
|
||||
%71 = OpAccessChain %_ptr_Function_v4float %af4 %int_0
|
||||
%72 = OpAccessChain %_ptr_Function_float %71 %int_0
|
||||
OpStore %72 %float_0
|
||||
%74 = OpAccessChain %_ptr_Function_v4float %af4 %int_0
|
||||
%75 = OpLoad %v4float %74
|
||||
%76 = OpVectorShuffle %v4float %75 %73 6 4 7 5
|
||||
OpStore %74 %76
|
||||
%77 = OpAccessChain %_ptr_Function_int %i4 %int_1
|
||||
%78 = OpLoad %int %77
|
||||
%79 = OpIMul %int %78 %int_0
|
||||
OpStore %77 %79
|
||||
%80 = OpAccessChain %_ptr_Function_float %x %int_1
|
||||
%81 = OpLoad %float %80
|
||||
%82 = OpFMul %float %81 %float_0
|
||||
OpStore %80 %82
|
||||
%83 = OpLoad %_arr_int_int_1 %ai
|
||||
%84 = OpLoad %_arr_v4int_int_1 %ai4
|
||||
%85 = OpLoad %_arr_mat3v3float_int_1 %ah2x4
|
||||
%86 = OpLoad %_arr_v4float_int_1 %af4
|
||||
%87 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
|
||||
%89 = OpLoad %v4float %87
|
||||
OpReturnValue %89
|
||||
OpFunctionEnd
|
||||
|
@ -1,12 +1,9 @@
|
||||
|
||||
out vec4 sk_FragColor;
|
||||
struct S {
|
||||
float f;
|
||||
float[5] af;
|
||||
vec4 h4;
|
||||
vec4[5] ah4;
|
||||
};
|
||||
void main() {
|
||||
uniform vec4 colorGreen;
|
||||
vec4 main() {
|
||||
ivec4 i4;
|
||||
i4 = ivec4(1, 2, 3, 4);
|
||||
vec4 x;
|
||||
x.w = 0.0;
|
||||
x.yx = vec2(0.0);
|
||||
@ -14,33 +11,12 @@ void main() {
|
||||
ai[0] = 0;
|
||||
ivec4 ai4[1];
|
||||
ai4[0] = ivec4(1, 2, 3, 4);
|
||||
mat2x4 ah2x4[1];
|
||||
ah2x4[0] = mat2x4(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0);
|
||||
ai[0] = 0;
|
||||
ai[ai[0]] = 0;
|
||||
mat3 ah2x4[1];
|
||||
ah2x4[0] = mat3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);
|
||||
vec4 af4[1];
|
||||
af4[0].x = 0.0;
|
||||
af4[0].ywxz = vec4(1.0);
|
||||
S s;
|
||||
s.f = 0.0;
|
||||
s.af[1] = 0.0;
|
||||
s.h4.zxy = vec3(9.0);
|
||||
s.ah4[2].yw = vec2(5.0);
|
||||
s.f = 1.0;
|
||||
s.af[0] = 2.0;
|
||||
s.h4 = vec4(1.0);
|
||||
s.ah4[0] = vec4(2.0);
|
||||
sk_FragColor = vec4(0.0);
|
||||
sk_FragColor = vec4(ivec4(1, 2, 3, 4));
|
||||
sk_FragColor = mat3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0)[0].xxyz;
|
||||
sk_FragColor = x;
|
||||
sk_FragColor = vec4(float(ai[0]));
|
||||
sk_FragColor = vec4(ai4[0]);
|
||||
sk_FragColor = ah2x4[0][0];
|
||||
sk_FragColor = af4[0];
|
||||
sk_FragColor = vec4(0.0);
|
||||
sk_FragColor = vec4(s.f);
|
||||
sk_FragColor = vec4(s.af[1]);
|
||||
sk_FragColor = s.h4;
|
||||
sk_FragColor = s.ah4[0];
|
||||
i4.y *= 0;
|
||||
x.y *= 0.0;
|
||||
return ((((ai , ai4) , ah2x4) , af4) , colorGreen);
|
||||
}
|
||||
|
@ -1,55 +1,34 @@
|
||||
#include <metal_stdlib>
|
||||
#include <simd/simd.h>
|
||||
using namespace metal;
|
||||
struct S {
|
||||
float f;
|
||||
float af[5];
|
||||
float4 h4;
|
||||
float4 ah4[5];
|
||||
struct Uniforms {
|
||||
float4 colorGreen;
|
||||
};
|
||||
struct Inputs {
|
||||
};
|
||||
struct Outputs {
|
||||
float4 sk_FragColor [[color(0)]];
|
||||
};
|
||||
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
|
||||
|
||||
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
|
||||
Outputs _out;
|
||||
(void)_out;
|
||||
int4 i4;
|
||||
i4 = int4(1, 2, 3, 4);
|
||||
float4 x;
|
||||
x.w = 0.0;
|
||||
x.yx = float2(0.0);
|
||||
int ai[1];
|
||||
array<int, 1> ai;
|
||||
ai[0] = 0;
|
||||
int4 ai4[1];
|
||||
array<int4, 1> ai4;
|
||||
ai4[0] = int4(1, 2, 3, 4);
|
||||
float2x4 ah2x4[1];
|
||||
ah2x4[0] = float2x4(float4(1.0, 2.0, 3.0, 4.0), float4(5.0, 6.0, 7.0, 8.0));
|
||||
ai[0] = 0;
|
||||
ai[ai[0]] = 0;
|
||||
float4 af4[1];
|
||||
array<float3x3, 1> ah2x4;
|
||||
ah2x4[0] = float3x3(float3(1.0, 2.0, 3.0), float3(4.0, 5.0, 6.0), float3(7.0, 8.0, 9.0));
|
||||
array<float4, 1> af4;
|
||||
af4[0].x = 0.0;
|
||||
af4[0].ywxz = float4(1.0);
|
||||
S s;
|
||||
s.f = 0.0;
|
||||
s.af[1] = 0.0;
|
||||
s.h4.zxy = float3(9.0);
|
||||
s.ah4[2].yw = float2(5.0);
|
||||
s.f = 1.0;
|
||||
s.af[0] = 2.0;
|
||||
s.h4 = float4(1.0);
|
||||
s.ah4[0] = float4(2.0);
|
||||
_out.sk_FragColor = float4(0.0);
|
||||
_out.sk_FragColor = float4(int4(1, 2, 3, 4));
|
||||
_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;
|
||||
_out.sk_FragColor = x;
|
||||
_out.sk_FragColor = float4(float(ai[0]));
|
||||
_out.sk_FragColor = float4(ai4[0]);
|
||||
_out.sk_FragColor = ah2x4[0][0];
|
||||
_out.sk_FragColor = af4[0];
|
||||
_out.sk_FragColor = float4(0.0);
|
||||
_out.sk_FragColor = float4(s.f);
|
||||
_out.sk_FragColor = float4(s.af[1]);
|
||||
_out.sk_FragColor = s.h4;
|
||||
_out.sk_FragColor = s.ah4[0];
|
||||
i4.y = i4.y * 0;
|
||||
x.y = x.y * 0.0;
|
||||
_out.sk_FragColor = ((((ai , ai4) , ah2x4) , af4) , _uniforms.colorGreen);
|
||||
return _out;
|
||||
}
|
||||
|
@ -1,4 +1,15 @@
|
||||
### Compilation failed:
|
||||
|
||||
error: 1: Metal does not support array types in this context
|
||||
1 error
|
||||
#include <metal_stdlib>
|
||||
#include <simd/simd.h>
|
||||
using namespace metal;
|
||||
struct Inputs {
|
||||
};
|
||||
struct Outputs {
|
||||
float4 sk_FragColor [[color(0)]];
|
||||
};
|
||||
constant array<float, 4> test = array<float, 4>{1.0, 2.0, 3.0, 4.0};
|
||||
fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
|
||||
Outputs _out;
|
||||
(void)_out;
|
||||
_out.sk_FragColor = float4(_globals.test[0], _globals.test[1], _globals.test[2], _globals.test[3]);
|
||||
return _out;
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ float foo(float2 v) {
|
||||
return v.x * v.y;
|
||||
}
|
||||
void bar(thread float& x) {
|
||||
float y[2];
|
||||
array<float, 2> y;
|
||||
y[0] = x;
|
||||
y[1] = x * 2.0;
|
||||
x = foo(float2(y[0], y[1]));
|
||||
|
@ -11,7 +11,7 @@ struct uniformBuffer {
|
||||
float4 sk_RTAdjust;
|
||||
float2 uIncrement_Stage1_c0;
|
||||
char pad0[8];
|
||||
float4 uKernel_Stage1_c0[7];
|
||||
array<float4, 7> uKernel_Stage1_c0;
|
||||
float3x3 umatrix_Stage1_c0_c0;
|
||||
float4 uborder_Stage1_c0_c0_c0;
|
||||
float4 usubset_Stage1_c0_c0_c0;
|
||||
|
@ -12,7 +12,7 @@ struct testBlock {
|
||||
struct Globals {
|
||||
constant testBlock* test;
|
||||
};
|
||||
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant testBlock& test [[buffer(123)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
|
||||
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant array<testBlock, 2>& test [[buffer(123)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
|
||||
Globals _globals{&test};
|
||||
(void)_globals;
|
||||
Outputs _out;
|
||||
|
@ -26,32 +26,32 @@ struct S8 {
|
||||
S7 x;
|
||||
};
|
||||
struct SA1 {
|
||||
int x[8];
|
||||
array<int, 8> x;
|
||||
};
|
||||
struct SA2 {
|
||||
SA1 x[7];
|
||||
array<SA1, 7> x;
|
||||
};
|
||||
struct SA3 {
|
||||
SA2 x[6];
|
||||
array<SA2, 6> x;
|
||||
};
|
||||
struct SA4 {
|
||||
SA3 x[5];
|
||||
array<SA3, 5> x;
|
||||
};
|
||||
struct SA5 {
|
||||
SA4 x[4];
|
||||
array<SA4, 4> x;
|
||||
};
|
||||
struct SA6 {
|
||||
SA5 x[3];
|
||||
array<SA5, 3> x;
|
||||
};
|
||||
struct SA7 {
|
||||
SA6 x[2];
|
||||
array<SA6, 2> x;
|
||||
};
|
||||
struct SA8 {
|
||||
SA7 x[1];
|
||||
array<SA7, 1> x;
|
||||
};
|
||||
struct Inputs {
|
||||
S8 s8;
|
||||
SA8 sa8[9];
|
||||
array<SA8, 9> sa8;
|
||||
};
|
||||
struct Outputs {
|
||||
float4 sk_FragColor [[color(0)]];
|
||||
|
@ -7,7 +7,7 @@ struct A {
|
||||
};
|
||||
struct B {
|
||||
float x;
|
||||
float y[2];
|
||||
array<float, 2> y;
|
||||
A z;
|
||||
};
|
||||
struct Inputs {
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include <simd/simd.h>
|
||||
using namespace metal;
|
||||
struct Uniforms {
|
||||
float arr[3];
|
||||
array<float, 3> arr;
|
||||
};
|
||||
struct Inputs {
|
||||
};
|
||||
|
@ -10,7 +10,7 @@ struct testBlock {
|
||||
float x;
|
||||
int w;
|
||||
char pad0[8];
|
||||
float y[2];
|
||||
array<float, 2> y;
|
||||
char pad1[24];
|
||||
float3x3 z;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user