Support the Boolean form of mix() in the Metal/SPIR-V backends.

Unfortunately, it's not easily testable since SkSLTest doesn't support
non-ES2 intrinsics.

Change-Id: I5b11e2af55fdc6fc29f48725aa977471c738b55e
Bug: skia:11222
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/426538
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 2021-07-09 17:38:41 -04:00 committed by Skia Commit-Bot
parent ebc9fadf35
commit cc2d9ccf07
4 changed files with 746 additions and 9 deletions

View File

@ -759,6 +759,18 @@ bool MetalCodeGenerator::writeIntrinsicCall(const FunctionCall& c, IntrinsicKind
this->writeSimpleIntrinsic(c);
return true;
}
case k_mix_IntrinsicKind: {
SkASSERT(c.arguments().size() == 3);
if (arguments[2]->type().componentType().isBoolean()) {
// The Boolean forms of GLSL mix() use the select() intrinsic in Metal.
this->write("select");
this->writeArgumentList(c.arguments());
return true;
}
// The basic form of mix() is supported by Metal as-is.
this->writeSimpleIntrinsic(c);
return true;
}
case k_equal_IntrinsicKind:
case k_greaterThan_IntrinsicKind:
case k_greaterThanEqual_IntrinsicKind:

View File

@ -1090,8 +1090,17 @@ SpvId SPIRVCodeGenerator::writeSpecialIntrinsic(const FunctionCall& c, SpecialIn
case kMix_SpecialIntrinsic: {
std::vector<SpvId> args = this->vectorize(arguments, out);
SkASSERT(args.size() == 3);
if (arguments[2]->type().componentType().isBoolean()) {
// Use OpSelect to implement Boolean mix().
SpvId falseId = this->writeExpression(*arguments[0], out);
SpvId trueId = this->writeExpression(*arguments[1], out);
SpvId conditionId = this->writeExpression(*arguments[2], out);
this->writeInstruction(SpvOpSelect, this->getType(arguments[0]->type()), result,
conditionId, trueId, falseId, out);
} else {
this->writeGLSLExtendedInstruction(callType, result, GLSLstd450FMix, SpvOpUndef,
SpvOpUndef, args, out);
}
break;
}
case kSaturate_SpecialIntrinsic: {

View File

@ -1,6 +1,722 @@
### Compilation failed:
error: SPIR-V validation error: Invalid instruction OpExtInst starting at word 824: expected no more operands after 6 words, but stated word count is 8.
SPIR-V validation error: Invalid instruction OpExtInst starting at word 824: expected no more operands after 6 words, but stated word count is 8.
1 error
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %_entrypoint_v "_entrypoint" %sk_FragColor %sk_Clockwise
OpExecutionMode %_entrypoint_v OriginUpperLeft
OpName %sk_FragColor "sk_FragColor"
OpName %sk_Clockwise "sk_Clockwise"
OpName %_UniformBuffer "_UniformBuffer"
OpMemberName %_UniformBuffer 0 "colorGreen"
OpMemberName %_UniformBuffer 1 "colorRed"
OpMemberName %_UniformBuffer 2 "colorBlack"
OpMemberName %_UniformBuffer 3 "colorWhite"
OpMemberName %_UniformBuffer 4 "testInputs"
OpName %_entrypoint_v "_entrypoint_v"
OpName %main "main"
OpName %intGreen "intGreen"
OpName %intRed "intRed"
OpDecorate %sk_FragColor RelaxedPrecision
OpDecorate %sk_FragColor Location 0
OpDecorate %sk_FragColor Index 0
OpDecorate %sk_Clockwise BuiltIn FrontFacing
OpMemberDecorate %_UniformBuffer 0 Offset 0
OpMemberDecorate %_UniformBuffer 0 RelaxedPrecision
OpMemberDecorate %_UniformBuffer 1 Offset 16
OpMemberDecorate %_UniformBuffer 1 RelaxedPrecision
OpMemberDecorate %_UniformBuffer 2 Offset 32
OpMemberDecorate %_UniformBuffer 2 RelaxedPrecision
OpMemberDecorate %_UniformBuffer 3 Offset 48
OpMemberDecorate %_UniformBuffer 3 RelaxedPrecision
OpMemberDecorate %_UniformBuffer 4 Offset 64
OpMemberDecorate %_UniformBuffer 4 RelaxedPrecision
OpDecorate %_UniformBuffer Block
OpDecorate %10 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %33 RelaxedPrecision
OpDecorate %35 RelaxedPrecision
OpDecorate %36 RelaxedPrecision
OpDecorate %38 RelaxedPrecision
OpDecorate %40 RelaxedPrecision
OpDecorate %42 RelaxedPrecision
OpDecorate %48 RelaxedPrecision
OpDecorate %49 RelaxedPrecision
OpDecorate %50 RelaxedPrecision
OpDecorate %52 RelaxedPrecision
OpDecorate %54 RelaxedPrecision
OpDecorate %56 RelaxedPrecision
OpDecorate %248 RelaxedPrecision
OpDecorate %249 RelaxedPrecision
OpDecorate %251 RelaxedPrecision
OpDecorate %252 RelaxedPrecision
OpDecorate %254 RelaxedPrecision
OpDecorate %255 RelaxedPrecision
OpDecorate %257 RelaxedPrecision
OpDecorate %258 RelaxedPrecision
OpDecorate %260 RelaxedPrecision
OpDecorate %261 RelaxedPrecision
OpDecorate %268 RelaxedPrecision
OpDecorate %269 RelaxedPrecision
OpDecorate %271 RelaxedPrecision
OpDecorate %272 RelaxedPrecision
OpDecorate %274 RelaxedPrecision
OpDecorate %275 RelaxedPrecision
OpDecorate %277 RelaxedPrecision
OpDecorate %278 RelaxedPrecision
OpDecorate %280 RelaxedPrecision
OpDecorate %281 RelaxedPrecision
OpDecorate %289 RelaxedPrecision
OpDecorate %290 RelaxedPrecision
OpDecorate %293 RelaxedPrecision
OpDecorate %294 RelaxedPrecision
OpDecorate %296 RelaxedPrecision
OpDecorate %297 RelaxedPrecision
OpDecorate %299 RelaxedPrecision
OpDecorate %300 RelaxedPrecision
OpDecorate %302 RelaxedPrecision
OpDecorate %303 RelaxedPrecision
OpDecorate %311 RelaxedPrecision
OpDecorate %313 RelaxedPrecision
OpDecorate %315 RelaxedPrecision
OpDecorate %317 RelaxedPrecision
OpDecorate %319 RelaxedPrecision
OpDecorate %327 RelaxedPrecision
OpDecorate %328 RelaxedPrecision
OpDecorate %330 RelaxedPrecision
OpDecorate %331 RelaxedPrecision
OpDecorate %333 RelaxedPrecision
OpDecorate %334 RelaxedPrecision
OpDecorate %336 RelaxedPrecision
OpDecorate %337 RelaxedPrecision
OpDecorate %339 RelaxedPrecision
OpDecorate %340 RelaxedPrecision
OpDecorate %347 RelaxedPrecision
OpDecorate %348 RelaxedPrecision
OpDecorate %350 RelaxedPrecision
OpDecorate %351 RelaxedPrecision
OpDecorate %353 RelaxedPrecision
OpDecorate %354 RelaxedPrecision
OpDecorate %356 RelaxedPrecision
OpDecorate %357 RelaxedPrecision
OpDecorate %359 RelaxedPrecision
OpDecorate %360 RelaxedPrecision
OpDecorate %368 RelaxedPrecision
OpDecorate %369 RelaxedPrecision
OpDecorate %371 RelaxedPrecision
OpDecorate %372 RelaxedPrecision
OpDecorate %374 RelaxedPrecision
OpDecorate %375 RelaxedPrecision
OpDecorate %377 RelaxedPrecision
OpDecorate %378 RelaxedPrecision
OpDecorate %380 RelaxedPrecision
OpDecorate %381 RelaxedPrecision
OpDecorate %389 RelaxedPrecision
OpDecorate %391 RelaxedPrecision
OpDecorate %393 RelaxedPrecision
OpDecorate %395 RelaxedPrecision
OpDecorate %397 RelaxedPrecision
OpDecorate %404 RelaxedPrecision
OpDecorate %405 RelaxedPrecision
OpDecorate %411 RelaxedPrecision
OpDecorate %413 RelaxedPrecision
OpDecorate %414 RelaxedPrecision
OpDecorate %420 RelaxedPrecision
OpDecorate %422 RelaxedPrecision
OpDecorate %423 RelaxedPrecision
OpDecorate %429 RelaxedPrecision
OpDecorate %431 RelaxedPrecision
OpDecorate %438 RelaxedPrecision
OpDecorate %439 RelaxedPrecision
OpDecorate %444 RelaxedPrecision
OpDecorate %446 RelaxedPrecision
OpDecorate %447 RelaxedPrecision
OpDecorate %453 RelaxedPrecision
OpDecorate %455 RelaxedPrecision
OpDecorate %456 RelaxedPrecision
OpDecorate %462 RelaxedPrecision
OpDecorate %464 RelaxedPrecision
OpDecorate %474 RelaxedPrecision
OpDecorate %476 RelaxedPrecision
OpDecorate %477 RelaxedPrecision
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%sk_FragColor = OpVariable %_ptr_Output_v4float Output
%bool = OpTypeBool
%_ptr_Input_bool = OpTypePointer Input %bool
%sk_Clockwise = OpVariable %_ptr_Input_bool Input
%_UniformBuffer = OpTypeStruct %v4float %v4float %v4float %v4float %v4float
%_ptr_Uniform__UniformBuffer = OpTypePointer Uniform %_UniformBuffer
%10 = OpVariable %_ptr_Uniform__UniformBuffer Uniform
%void = OpTypeVoid
%15 = OpTypeFunction %void
%v2float = OpTypeVector %float 2
%float_0 = OpConstant %float 0
%19 = OpConstantComposite %v2float %float_0 %float_0
%_ptr_Function_v2float = OpTypePointer Function %v2float
%23 = OpTypeFunction %v4float %_ptr_Function_v2float
%int = OpTypeInt 32 1
%v4int = OpTypeVector %int 4
%_ptr_Function_v4int = OpTypePointer Function %v4int
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int_0 = OpConstant %int 0
%float_100 = OpConstant %float 100
%int_1 = OpConstant %int 1
%false = OpConstantFalse %bool
%v2int = OpTypeVector %int 2
%v2bool = OpTypeVector %bool 2
%81 = OpConstantComposite %v2bool %false %false
%v3int = OpTypeVector %int 3
%v3bool = OpTypeVector %bool 3
%100 = OpConstantComposite %v3bool %false %false %false
%v4bool = OpTypeVector %bool 4
%116 = OpConstantComposite %v4bool %false %false %false %false
%true = OpConstantTrue %bool
%146 = OpConstantComposite %v2bool %true %true
%163 = OpConstantComposite %v3bool %true %true %true
%178 = OpConstantComposite %v4bool %true %true %true %true
%int_100 = OpConstant %int 100
%194 = OpConstantComposite %v2int %int_0 %int_100
%202 = OpConstantComposite %v3int %int_0 %int_100 %int_0
%210 = OpConstantComposite %v4int %int_0 %int_100 %int_0 %int_100
%223 = OpConstantComposite %v2int %int_100 %int_0
%231 = OpConstantComposite %v3int %int_100 %int_0 %int_0
%239 = OpConstantComposite %v4int %int_100 %int_0 %int_0 %int_100
%v3float = OpTypeVector %float 3
%float_1 = OpConstant %float 1
%411 = OpConstantComposite %v2float %float_0 %float_1
%420 = OpConstantComposite %v3float %float_0 %float_1 %float_0
%429 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1
%444 = OpConstantComposite %v2float %float_1 %float_0
%453 = OpConstantComposite %v3float %float_1 %float_0 %float_0
%462 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
%_ptr_Function_v4float = OpTypePointer Function %v4float
%_entrypoint_v = OpFunction %void None %15
%16 = OpLabel
%20 = OpVariable %_ptr_Function_v2float Function
OpStore %20 %19
%22 = OpFunctionCall %v4float %main %20
OpStore %sk_FragColor %22
OpReturn
OpFunctionEnd
%main = OpFunction %v4float None %23
%24 = OpFunctionParameter %_ptr_Function_v2float
%25 = OpLabel
%intGreen = OpVariable %_ptr_Function_v4int Function
%intRed = OpVariable %_ptr_Function_v4int Function
%468 = OpVariable %_ptr_Function_v4float Function
%30 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%33 = OpLoad %v4float %30
%35 = OpVectorTimesScalar %v4float %33 %float_100
%36 = OpCompositeExtract %float %35 0
%37 = OpConvertFToS %int %36
%38 = OpCompositeExtract %float %35 1
%39 = OpConvertFToS %int %38
%40 = OpCompositeExtract %float %35 2
%41 = OpConvertFToS %int %40
%42 = OpCompositeExtract %float %35 3
%43 = OpConvertFToS %int %42
%44 = OpCompositeConstruct %v4int %37 %39 %41 %43
OpStore %intGreen %44
%46 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%48 = OpLoad %v4float %46
%49 = OpVectorTimesScalar %v4float %48 %float_100
%50 = OpCompositeExtract %float %49 0
%51 = OpConvertFToS %int %50
%52 = OpCompositeExtract %float %49 1
%53 = OpConvertFToS %int %52
%54 = OpCompositeExtract %float %49 2
%55 = OpConvertFToS %int %54
%56 = OpCompositeExtract %float %49 3
%57 = OpConvertFToS %int %56
%58 = OpCompositeConstruct %v4int %51 %53 %55 %57
OpStore %intRed %58
%61 = OpLoad %v4int %intGreen
%62 = OpCompositeExtract %int %61 0
%63 = OpLoad %v4int %intRed
%64 = OpCompositeExtract %int %63 0
%65 = OpLoad %v4int %intGreen
%66 = OpCompositeExtract %int %65 0
%67 = OpLoad %v4int %intRed
%68 = OpCompositeExtract %int %67 0
%60 = OpSelect %int %false %68 %66
%69 = OpLoad %v4int %intGreen
%70 = OpCompositeExtract %int %69 0
%71 = OpIEqual %bool %60 %70
OpSelectionMerge %73 None
OpBranchConditional %71 %72 %73
%72 = OpLabel
%75 = OpLoad %v4int %intGreen
%76 = OpVectorShuffle %v2int %75 %75 0 1
%78 = OpLoad %v4int %intRed
%79 = OpVectorShuffle %v2int %78 %78 0 1
%82 = OpLoad %v4int %intGreen
%83 = OpVectorShuffle %v2int %82 %82 0 1
%84 = OpLoad %v4int %intRed
%85 = OpVectorShuffle %v2int %84 %84 0 1
%74 = OpSelect %v2int %81 %85 %83
%86 = OpLoad %v4int %intGreen
%87 = OpVectorShuffle %v2int %86 %86 0 1
%88 = OpIEqual %v2bool %74 %87
%89 = OpAll %bool %88
OpBranch %73
%73 = OpLabel
%90 = OpPhi %bool %false %25 %89 %72
OpSelectionMerge %92 None
OpBranchConditional %90 %91 %92
%91 = OpLabel
%94 = OpLoad %v4int %intGreen
%95 = OpVectorShuffle %v3int %94 %94 0 1 2
%97 = OpLoad %v4int %intRed
%98 = OpVectorShuffle %v3int %97 %97 0 1 2
%101 = OpLoad %v4int %intGreen
%102 = OpVectorShuffle %v3int %101 %101 0 1 2
%103 = OpLoad %v4int %intRed
%104 = OpVectorShuffle %v3int %103 %103 0 1 2
%93 = OpSelect %v3int %100 %104 %102
%105 = OpLoad %v4int %intGreen
%106 = OpVectorShuffle %v3int %105 %105 0 1 2
%107 = OpIEqual %v3bool %93 %106
%108 = OpAll %bool %107
OpBranch %92
%92 = OpLabel
%109 = OpPhi %bool %false %73 %108 %91
OpSelectionMerge %111 None
OpBranchConditional %109 %110 %111
%110 = OpLabel
%113 = OpLoad %v4int %intGreen
%114 = OpLoad %v4int %intRed
%117 = OpLoad %v4int %intGreen
%118 = OpLoad %v4int %intRed
%112 = OpSelect %v4int %116 %118 %117
%119 = OpLoad %v4int %intGreen
%120 = OpIEqual %v4bool %112 %119
%121 = OpAll %bool %120
OpBranch %111
%111 = OpLabel
%122 = OpPhi %bool %false %92 %121 %110
OpSelectionMerge %124 None
OpBranchConditional %122 %123 %124
%123 = OpLabel
%126 = OpLoad %v4int %intGreen
%127 = OpCompositeExtract %int %126 0
%128 = OpLoad %v4int %intRed
%129 = OpCompositeExtract %int %128 0
%131 = OpLoad %v4int %intGreen
%132 = OpCompositeExtract %int %131 0
%133 = OpLoad %v4int %intRed
%134 = OpCompositeExtract %int %133 0
%125 = OpSelect %int %true %134 %132
%135 = OpLoad %v4int %intRed
%136 = OpCompositeExtract %int %135 0
%137 = OpIEqual %bool %125 %136
OpBranch %124
%124 = OpLabel
%138 = OpPhi %bool %false %111 %137 %123
OpSelectionMerge %140 None
OpBranchConditional %138 %139 %140
%139 = OpLabel
%142 = OpLoad %v4int %intGreen
%143 = OpVectorShuffle %v2int %142 %142 0 1
%144 = OpLoad %v4int %intRed
%145 = OpVectorShuffle %v2int %144 %144 0 1
%147 = OpLoad %v4int %intGreen
%148 = OpVectorShuffle %v2int %147 %147 0 1
%149 = OpLoad %v4int %intRed
%150 = OpVectorShuffle %v2int %149 %149 0 1
%141 = OpSelect %v2int %146 %150 %148
%151 = OpLoad %v4int %intRed
%152 = OpVectorShuffle %v2int %151 %151 0 1
%153 = OpIEqual %v2bool %141 %152
%154 = OpAll %bool %153
OpBranch %140
%140 = OpLabel
%155 = OpPhi %bool %false %124 %154 %139
OpSelectionMerge %157 None
OpBranchConditional %155 %156 %157
%156 = OpLabel
%159 = OpLoad %v4int %intGreen
%160 = OpVectorShuffle %v3int %159 %159 0 1 2
%161 = OpLoad %v4int %intRed
%162 = OpVectorShuffle %v3int %161 %161 0 1 2
%164 = OpLoad %v4int %intGreen
%165 = OpVectorShuffle %v3int %164 %164 0 1 2
%166 = OpLoad %v4int %intRed
%167 = OpVectorShuffle %v3int %166 %166 0 1 2
%158 = OpSelect %v3int %163 %167 %165
%168 = OpLoad %v4int %intRed
%169 = OpVectorShuffle %v3int %168 %168 0 1 2
%170 = OpIEqual %v3bool %158 %169
%171 = OpAll %bool %170
OpBranch %157
%157 = OpLabel
%172 = OpPhi %bool %false %140 %171 %156
OpSelectionMerge %174 None
OpBranchConditional %172 %173 %174
%173 = OpLabel
%176 = OpLoad %v4int %intGreen
%177 = OpLoad %v4int %intRed
%179 = OpLoad %v4int %intGreen
%180 = OpLoad %v4int %intRed
%175 = OpSelect %v4int %178 %180 %179
%181 = OpLoad %v4int %intRed
%182 = OpIEqual %v4bool %175 %181
%183 = OpAll %bool %182
OpBranch %174
%174 = OpLabel
%184 = OpPhi %bool %false %157 %183 %173
OpSelectionMerge %186 None
OpBranchConditional %184 %185 %186
%185 = OpLabel
%187 = OpLoad %v4int %intGreen
%188 = OpCompositeExtract %int %187 0
%189 = OpIEqual %bool %int_0 %188
OpBranch %186
%186 = OpLabel
%190 = OpPhi %bool %false %174 %189 %185
OpSelectionMerge %192 None
OpBranchConditional %190 %191 %192
%191 = OpLabel
%195 = OpLoad %v4int %intGreen
%196 = OpVectorShuffle %v2int %195 %195 0 1
%197 = OpIEqual %v2bool %194 %196
%198 = OpAll %bool %197
OpBranch %192
%192 = OpLabel
%199 = OpPhi %bool %false %186 %198 %191
OpSelectionMerge %201 None
OpBranchConditional %199 %200 %201
%200 = OpLabel
%203 = OpLoad %v4int %intGreen
%204 = OpVectorShuffle %v3int %203 %203 0 1 2
%205 = OpIEqual %v3bool %202 %204
%206 = OpAll %bool %205
OpBranch %201
%201 = OpLabel
%207 = OpPhi %bool %false %192 %206 %200
OpSelectionMerge %209 None
OpBranchConditional %207 %208 %209
%208 = OpLabel
%211 = OpLoad %v4int %intGreen
%212 = OpIEqual %v4bool %210 %211
%213 = OpAll %bool %212
OpBranch %209
%209 = OpLabel
%214 = OpPhi %bool %false %201 %213 %208
OpSelectionMerge %216 None
OpBranchConditional %214 %215 %216
%215 = OpLabel
%217 = OpLoad %v4int %intRed
%218 = OpCompositeExtract %int %217 0
%219 = OpIEqual %bool %int_100 %218
OpBranch %216
%216 = OpLabel
%220 = OpPhi %bool %false %209 %219 %215
OpSelectionMerge %222 None
OpBranchConditional %220 %221 %222
%221 = OpLabel
%224 = OpLoad %v4int %intRed
%225 = OpVectorShuffle %v2int %224 %224 0 1
%226 = OpIEqual %v2bool %223 %225
%227 = OpAll %bool %226
OpBranch %222
%222 = OpLabel
%228 = OpPhi %bool %false %216 %227 %221
OpSelectionMerge %230 None
OpBranchConditional %228 %229 %230
%229 = OpLabel
%232 = OpLoad %v4int %intRed
%233 = OpVectorShuffle %v3int %232 %232 0 1 2
%234 = OpIEqual %v3bool %231 %233
%235 = OpAll %bool %234
OpBranch %230
%230 = OpLabel
%236 = OpPhi %bool %false %222 %235 %229
OpSelectionMerge %238 None
OpBranchConditional %236 %237 %238
%237 = OpLabel
%240 = OpLoad %v4int %intRed
%241 = OpIEqual %v4bool %239 %240
%242 = OpAll %bool %241
OpBranch %238
%238 = OpLabel
%243 = OpPhi %bool %false %230 %242 %237
OpSelectionMerge %245 None
OpBranchConditional %243 %244 %245
%244 = OpLabel
%247 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%248 = OpLoad %v4float %247
%249 = OpCompositeExtract %float %248 0
%250 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%251 = OpLoad %v4float %250
%252 = OpCompositeExtract %float %251 0
%253 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%254 = OpLoad %v4float %253
%255 = OpCompositeExtract %float %254 0
%256 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%257 = OpLoad %v4float %256
%258 = OpCompositeExtract %float %257 0
%246 = OpSelect %float %false %258 %255
%259 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%260 = OpLoad %v4float %259
%261 = OpCompositeExtract %float %260 0
%262 = OpFOrdEqual %bool %246 %261
OpBranch %245
%245 = OpLabel
%263 = OpPhi %bool %false %238 %262 %244
OpSelectionMerge %265 None
OpBranchConditional %263 %264 %265
%264 = OpLabel
%267 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%268 = OpLoad %v4float %267
%269 = OpVectorShuffle %v2float %268 %268 0 1
%270 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%271 = OpLoad %v4float %270
%272 = OpVectorShuffle %v2float %271 %271 0 1
%273 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%274 = OpLoad %v4float %273
%275 = OpVectorShuffle %v2float %274 %274 0 1
%276 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%277 = OpLoad %v4float %276
%278 = OpVectorShuffle %v2float %277 %277 0 1
%266 = OpSelect %v2float %81 %278 %275
%279 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%280 = OpLoad %v4float %279
%281 = OpVectorShuffle %v2float %280 %280 0 1
%282 = OpFOrdEqual %v2bool %266 %281
%283 = OpAll %bool %282
OpBranch %265
%265 = OpLabel
%284 = OpPhi %bool %false %245 %283 %264
OpSelectionMerge %286 None
OpBranchConditional %284 %285 %286
%285 = OpLabel
%288 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%289 = OpLoad %v4float %288
%290 = OpVectorShuffle %v3float %289 %289 0 1 2
%292 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%293 = OpLoad %v4float %292
%294 = OpVectorShuffle %v3float %293 %293 0 1 2
%295 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%296 = OpLoad %v4float %295
%297 = OpVectorShuffle %v3float %296 %296 0 1 2
%298 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%299 = OpLoad %v4float %298
%300 = OpVectorShuffle %v3float %299 %299 0 1 2
%287 = OpSelect %v3float %100 %300 %297
%301 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%302 = OpLoad %v4float %301
%303 = OpVectorShuffle %v3float %302 %302 0 1 2
%304 = OpFOrdEqual %v3bool %287 %303
%305 = OpAll %bool %304
OpBranch %286
%286 = OpLabel
%306 = OpPhi %bool %false %265 %305 %285
OpSelectionMerge %308 None
OpBranchConditional %306 %307 %308
%307 = OpLabel
%310 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%311 = OpLoad %v4float %310
%312 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%313 = OpLoad %v4float %312
%314 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%315 = OpLoad %v4float %314
%316 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%317 = OpLoad %v4float %316
%309 = OpSelect %v4float %116 %317 %315
%318 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%319 = OpLoad %v4float %318
%320 = OpFOrdEqual %v4bool %309 %319
%321 = OpAll %bool %320
OpBranch %308
%308 = OpLabel
%322 = OpPhi %bool %false %286 %321 %307
OpSelectionMerge %324 None
OpBranchConditional %322 %323 %324
%323 = OpLabel
%326 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%327 = OpLoad %v4float %326
%328 = OpCompositeExtract %float %327 0
%329 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%330 = OpLoad %v4float %329
%331 = OpCompositeExtract %float %330 0
%332 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%333 = OpLoad %v4float %332
%334 = OpCompositeExtract %float %333 0
%335 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%336 = OpLoad %v4float %335
%337 = OpCompositeExtract %float %336 0
%325 = OpSelect %float %true %337 %334
%338 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%339 = OpLoad %v4float %338
%340 = OpCompositeExtract %float %339 0
%341 = OpFOrdEqual %bool %325 %340
OpBranch %324
%324 = OpLabel
%342 = OpPhi %bool %false %308 %341 %323
OpSelectionMerge %344 None
OpBranchConditional %342 %343 %344
%343 = OpLabel
%346 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%347 = OpLoad %v4float %346
%348 = OpVectorShuffle %v2float %347 %347 0 1
%349 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%350 = OpLoad %v4float %349
%351 = OpVectorShuffle %v2float %350 %350 0 1
%352 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%353 = OpLoad %v4float %352
%354 = OpVectorShuffle %v2float %353 %353 0 1
%355 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%356 = OpLoad %v4float %355
%357 = OpVectorShuffle %v2float %356 %356 0 1
%345 = OpSelect %v2float %146 %357 %354
%358 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%359 = OpLoad %v4float %358
%360 = OpVectorShuffle %v2float %359 %359 0 1
%361 = OpFOrdEqual %v2bool %345 %360
%362 = OpAll %bool %361
OpBranch %344
%344 = OpLabel
%363 = OpPhi %bool %false %324 %362 %343
OpSelectionMerge %365 None
OpBranchConditional %363 %364 %365
%364 = OpLabel
%367 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%368 = OpLoad %v4float %367
%369 = OpVectorShuffle %v3float %368 %368 0 1 2
%370 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%371 = OpLoad %v4float %370
%372 = OpVectorShuffle %v3float %371 %371 0 1 2
%373 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%374 = OpLoad %v4float %373
%375 = OpVectorShuffle %v3float %374 %374 0 1 2
%376 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%377 = OpLoad %v4float %376
%378 = OpVectorShuffle %v3float %377 %377 0 1 2
%366 = OpSelect %v3float %163 %378 %375
%379 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%380 = OpLoad %v4float %379
%381 = OpVectorShuffle %v3float %380 %380 0 1 2
%382 = OpFOrdEqual %v3bool %366 %381
%383 = OpAll %bool %382
OpBranch %365
%365 = OpLabel
%384 = OpPhi %bool %false %344 %383 %364
OpSelectionMerge %386 None
OpBranchConditional %384 %385 %386
%385 = OpLabel
%388 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%389 = OpLoad %v4float %388
%390 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%391 = OpLoad %v4float %390
%392 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%393 = OpLoad %v4float %392
%394 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%395 = OpLoad %v4float %394
%387 = OpSelect %v4float %178 %395 %393
%396 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%397 = OpLoad %v4float %396
%398 = OpFOrdEqual %v4bool %387 %397
%399 = OpAll %bool %398
OpBranch %386
%386 = OpLabel
%400 = OpPhi %bool %false %365 %399 %385
OpSelectionMerge %402 None
OpBranchConditional %400 %401 %402
%401 = OpLabel
%403 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%404 = OpLoad %v4float %403
%405 = OpCompositeExtract %float %404 0
%406 = OpFOrdEqual %bool %float_0 %405
OpBranch %402
%402 = OpLabel
%407 = OpPhi %bool %false %386 %406 %401
OpSelectionMerge %409 None
OpBranchConditional %407 %408 %409
%408 = OpLabel
%412 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%413 = OpLoad %v4float %412
%414 = OpVectorShuffle %v2float %413 %413 0 1
%415 = OpFOrdEqual %v2bool %411 %414
%416 = OpAll %bool %415
OpBranch %409
%409 = OpLabel
%417 = OpPhi %bool %false %402 %416 %408
OpSelectionMerge %419 None
OpBranchConditional %417 %418 %419
%418 = OpLabel
%421 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%422 = OpLoad %v4float %421
%423 = OpVectorShuffle %v3float %422 %422 0 1 2
%424 = OpFOrdEqual %v3bool %420 %423
%425 = OpAll %bool %424
OpBranch %419
%419 = OpLabel
%426 = OpPhi %bool %false %409 %425 %418
OpSelectionMerge %428 None
OpBranchConditional %426 %427 %428
%427 = OpLabel
%430 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%431 = OpLoad %v4float %430
%432 = OpFOrdEqual %v4bool %429 %431
%433 = OpAll %bool %432
OpBranch %428
%428 = OpLabel
%434 = OpPhi %bool %false %419 %433 %427
OpSelectionMerge %436 None
OpBranchConditional %434 %435 %436
%435 = OpLabel
%437 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%438 = OpLoad %v4float %437
%439 = OpCompositeExtract %float %438 0
%440 = OpFOrdEqual %bool %float_1 %439
OpBranch %436
%436 = OpLabel
%441 = OpPhi %bool %false %428 %440 %435
OpSelectionMerge %443 None
OpBranchConditional %441 %442 %443
%442 = OpLabel
%445 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%446 = OpLoad %v4float %445
%447 = OpVectorShuffle %v2float %446 %446 0 1
%448 = OpFOrdEqual %v2bool %444 %447
%449 = OpAll %bool %448
OpBranch %443
%443 = OpLabel
%450 = OpPhi %bool %false %436 %449 %442
OpSelectionMerge %452 None
OpBranchConditional %450 %451 %452
%451 = OpLabel
%454 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%455 = OpLoad %v4float %454
%456 = OpVectorShuffle %v3float %455 %455 0 1 2
%457 = OpFOrdEqual %v3bool %453 %456
%458 = OpAll %bool %457
OpBranch %452
%452 = OpLabel
%459 = OpPhi %bool %false %443 %458 %451
OpSelectionMerge %461 None
OpBranchConditional %459 %460 %461
%460 = OpLabel
%463 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%464 = OpLoad %v4float %463
%465 = OpFOrdEqual %v4bool %462 %464
%466 = OpAll %bool %465
OpBranch %461
%461 = OpLabel
%467 = OpPhi %bool %false %452 %466 %460
OpSelectionMerge %472 None
OpBranchConditional %467 %470 %471
%470 = OpLabel
%473 = OpAccessChain %_ptr_Uniform_v4float %10 %int_0
%474 = OpLoad %v4float %473
OpStore %468 %474
OpBranch %472
%471 = OpLabel
%475 = OpAccessChain %_ptr_Uniform_v4float %10 %int_1
%476 = OpLoad %v4float %475
OpStore %468 %476
OpBranch %472
%472 = OpLabel
%477 = OpLoad %v4float %468
OpReturnValue %477
OpFunctionEnd

View File

@ -18,6 +18,6 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _unifo
(void)_out;
int4 intGreen = int4(_uniforms.colorGreen * 100.0);
int4 intRed = int4(_uniforms.colorRed * 100.0);
_out.sk_FragColor = ((((((((((((((((((((((((((((((mix(intGreen.x, intRed.x, false) == intGreen.x && all(mix(intGreen.xy, intRed.xy, bool2(false)) == intGreen.xy)) && all(mix(intGreen.xyz, intRed.xyz, bool3(false)) == intGreen.xyz)) && all(mix(intGreen, intRed, bool4(false)) == intGreen)) && mix(intGreen.x, intRed.x, true) == intRed.x) && all(mix(intGreen.xy, intRed.xy, bool2(true)) == intRed.xy)) && all(mix(intGreen.xyz, intRed.xyz, bool3(true)) == intRed.xyz)) && all(mix(intGreen, intRed, bool4(true)) == intRed)) && 0 == intGreen.x) && all(int2(0, 100) == intGreen.xy)) && all(int3(0, 100, 0) == intGreen.xyz)) && all(int4(0, 100, 0, 100) == intGreen)) && 100 == intRed.x) && all(int2(100, 0) == intRed.xy)) && all(int3(100, 0, 0) == intRed.xyz)) && all(int4(100, 0, 0, 100) == intRed)) && mix(_uniforms.colorGreen.x, _uniforms.colorRed.x, false) == _uniforms.colorGreen.x) && all(mix(_uniforms.colorGreen.xy, _uniforms.colorRed.xy, bool2(false)) == _uniforms.colorGreen.xy)) && all(mix(_uniforms.colorGreen.xyz, _uniforms.colorRed.xyz, bool3(false)) == _uniforms.colorGreen.xyz)) && all(mix(_uniforms.colorGreen, _uniforms.colorRed, bool4(false)) == _uniforms.colorGreen)) && mix(_uniforms.colorGreen.x, _uniforms.colorRed.x, true) == _uniforms.colorRed.x) && all(mix(_uniforms.colorGreen.xy, _uniforms.colorRed.xy, bool2(true)) == _uniforms.colorRed.xy)) && all(mix(_uniforms.colorGreen.xyz, _uniforms.colorRed.xyz, bool3(true)) == _uniforms.colorRed.xyz)) && all(mix(_uniforms.colorGreen, _uniforms.colorRed, bool4(true)) == _uniforms.colorRed)) && 0.0 == _uniforms.colorGreen.x) && all(float2(0.0, 1.0) == _uniforms.colorGreen.xy)) && all(float3(0.0, 1.0, 0.0) == _uniforms.colorGreen.xyz)) && all(float4(0.0, 1.0, 0.0, 1.0) == _uniforms.colorGreen)) && 1.0 == _uniforms.colorRed.x) && all(float2(1.0, 0.0) == _uniforms.colorRed.xy)) && all(float3(1.0, 0.0, 0.0) == _uniforms.colorRed.xyz)) && all(float4(1.0, 0.0, 0.0, 1.0) == _uniforms.colorRed) ? _uniforms.colorGreen : _uniforms.colorRed;
_out.sk_FragColor = ((((((((((((((((((((((((((((((select(intGreen.x, intRed.x, false) == intGreen.x && all(select(intGreen.xy, intRed.xy, bool2(false)) == intGreen.xy)) && all(select(intGreen.xyz, intRed.xyz, bool3(false)) == intGreen.xyz)) && all(select(intGreen, intRed, bool4(false)) == intGreen)) && select(intGreen.x, intRed.x, true) == intRed.x) && all(select(intGreen.xy, intRed.xy, bool2(true)) == intRed.xy)) && all(select(intGreen.xyz, intRed.xyz, bool3(true)) == intRed.xyz)) && all(select(intGreen, intRed, bool4(true)) == intRed)) && 0 == intGreen.x) && all(int2(0, 100) == intGreen.xy)) && all(int3(0, 100, 0) == intGreen.xyz)) && all(int4(0, 100, 0, 100) == intGreen)) && 100 == intRed.x) && all(int2(100, 0) == intRed.xy)) && all(int3(100, 0, 0) == intRed.xyz)) && all(int4(100, 0, 0, 100) == intRed)) && select(_uniforms.colorGreen.x, _uniforms.colorRed.x, false) == _uniforms.colorGreen.x) && all(select(_uniforms.colorGreen.xy, _uniforms.colorRed.xy, bool2(false)) == _uniforms.colorGreen.xy)) && all(select(_uniforms.colorGreen.xyz, _uniforms.colorRed.xyz, bool3(false)) == _uniforms.colorGreen.xyz)) && all(select(_uniforms.colorGreen, _uniforms.colorRed, bool4(false)) == _uniforms.colorGreen)) && select(_uniforms.colorGreen.x, _uniforms.colorRed.x, true) == _uniforms.colorRed.x) && all(select(_uniforms.colorGreen.xy, _uniforms.colorRed.xy, bool2(true)) == _uniforms.colorRed.xy)) && all(select(_uniforms.colorGreen.xyz, _uniforms.colorRed.xyz, bool3(true)) == _uniforms.colorRed.xyz)) && all(select(_uniforms.colorGreen, _uniforms.colorRed, bool4(true)) == _uniforms.colorRed)) && 0.0 == _uniforms.colorGreen.x) && all(float2(0.0, 1.0) == _uniforms.colorGreen.xy)) && all(float3(0.0, 1.0, 0.0) == _uniforms.colorGreen.xyz)) && all(float4(0.0, 1.0, 0.0, 1.0) == _uniforms.colorGreen)) && 1.0 == _uniforms.colorRed.x) && all(float2(1.0, 0.0) == _uniforms.colorRed.xy)) && all(float3(1.0, 0.0, 0.0) == _uniforms.colorRed.xyz)) && all(float4(1.0, 0.0, 0.0, 1.0) == _uniforms.colorRed) ? _uniforms.colorGreen : _uniforms.colorRed;
return _out;
}