Add support for componentwise matrix divide in SPIR-V.

All the pieces of the puzzle were already here to support componentwise
addition and subtraction of matrices. Division was just a forgotten gap
in the implementation and is now patched up to match + and -.

NOTE: if you read the SPIR-V output very closely, you may be surprised
that there are fewer FDiv operations than you'd expect from reading the
input SkSL. As it turns out, a preexisting optimization is rewriting
`mat / 4` into `mat * 0.25` (see line 2689), and this rewritten form can
use the dedicated MatrixTimesScalar op. So we only get componentwise
FDivs for the `4 / mat` lines in the source.

Change-Id: I011c859f5b3a031fbb95a2956f1194a5f3b3794b
Bug: skia:11985
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/408639
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
This commit is contained in:
John Stiles 2021-05-17 09:34:23 -04:00 committed by Skia Commit-Bot
parent c1f6411045
commit bdf3bb7b5f
6 changed files with 766 additions and 649 deletions

View File

@ -41,6 +41,9 @@ bool test_float() {
ok = ok && (m32 == float3x2(2, -2, ok = ok && (m32 == float3x2(2, -2,
-2, 2, -2, 2,
-2, -2)); -2, -2));
m24 /= 4;
ok = ok && (m24 == float2x4(0.75, 0, 0, 0,
0, 0.75, 0, 0));
return ok; return ok;
} }
@ -85,6 +88,9 @@ bool test_half() {
ok = ok && (m32 == half3x2(2, -2, ok = ok && (m32 == half3x2(2, -2,
-2, 2, -2, 2,
-2, -2)); -2, -2));
m24 /= 4;
ok = ok && (m24 == half2x4(0.75, 0, 0, 0,
0, 0.75, 0, 0));
return ok; return ok;
} }

View File

@ -2528,6 +2528,10 @@ SpvId SPIRVCodeGenerator::writeBinaryExpression(const Type& leftType, SpvId lhs,
return this->writeBinaryOperation(resultType, *operandType, lhs, rhs, SpvOpFMul, return this->writeBinaryOperation(resultType, *operandType, lhs, rhs, SpvOpFMul,
SpvOpIMul, SpvOpIMul, SpvOpUndef, out); SpvOpIMul, SpvOpIMul, SpvOpUndef, out);
case Token::Kind::TK_SLASH: case Token::Kind::TK_SLASH:
if (leftType.isMatrix() && rightType.isMatrix()) {
SkASSERT(leftType == rightType);
return this->writeComponentwiseMatrixBinary(leftType, lhs, rhs, SpvOpFDiv, out);
}
return this->writeBinaryOperation(resultType, *operandType, lhs, rhs, SpvOpFDiv, return this->writeBinaryOperation(resultType, *operandType, lhs, rhs, SpvOpFDiv,
SpvOpSDiv, SpvOpUDiv, SpvOpUndef, out); SpvOpSDiv, SpvOpUDiv, SpvOpUndef, out);
case Token::Kind::TK_PERCENT: case Token::Kind::TK_PERCENT:

View File

@ -145,19 +145,35 @@ OpDecorate %283 RelaxedPrecision
OpDecorate %284 RelaxedPrecision OpDecorate %284 RelaxedPrecision
OpDecorate %285 RelaxedPrecision OpDecorate %285 RelaxedPrecision
OpDecorate %301 RelaxedPrecision OpDecorate %301 RelaxedPrecision
OpDecorate %302 RelaxedPrecision
OpDecorate %303 RelaxedPrecision
OpDecorate %304 RelaxedPrecision
OpDecorate %305 RelaxedPrecision
OpDecorate %306 RelaxedPrecision
OpDecorate %307 RelaxedPrecision
OpDecorate %308 RelaxedPrecision
OpDecorate %309 RelaxedPrecision
OpDecorate %310 RelaxedPrecision OpDecorate %310 RelaxedPrecision
OpDecorate %331 RelaxedPrecision OpDecorate %311 RelaxedPrecision
OpDecorate %353 RelaxedPrecision OpDecorate %314 RelaxedPrecision
OpDecorate %316 RelaxedPrecision
OpDecorate %317 RelaxedPrecision
OpDecorate %318 RelaxedPrecision
OpDecorate %329 RelaxedPrecision
OpDecorate %338 RelaxedPrecision
OpDecorate %359 RelaxedPrecision
OpDecorate %381 RelaxedPrecision OpDecorate %381 RelaxedPrecision
OpDecorate %410 RelaxedPrecision OpDecorate %409 RelaxedPrecision
OpDecorate %443 RelaxedPrecision OpDecorate %438 RelaxedPrecision
OpDecorate %464 RelaxedPrecision OpDecorate %471 RelaxedPrecision
OpDecorate %497 RelaxedPrecision OpDecorate %492 RelaxedPrecision
OpDecorate %527 RelaxedPrecision OpDecorate %525 RelaxedPrecision
OpDecorate %550 RelaxedPrecision OpDecorate %555 RelaxedPrecision
OpDecorate %564 RelaxedPrecision OpDecorate %588 RelaxedPrecision
OpDecorate %567 RelaxedPrecision OpDecorate %605 RelaxedPrecision
OpDecorate %568 RelaxedPrecision OpDecorate %619 RelaxedPrecision
OpDecorate %622 RelaxedPrecision
OpDecorate %623 RelaxedPrecision
%float = OpTypeFloat 32 %float = OpTypeFloat 32
%v4float = OpTypeVector %float 4 %v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float %_ptr_Output_v4float = OpTypePointer Output %v4float
@ -205,7 +221,8 @@ OpDecorate %568 RelaxedPrecision
%float_35 = OpConstant %float 35 %float_35 = OpConstant %float 35
%float_1 = OpConstant %float 1 %float_1 = OpConstant %float 1
%float_n2 = OpConstant %float -2 %float_n2 = OpConstant %float -2
%302 = OpTypeFunction %v4float %_ptr_Function_v2float %float_0_75 = OpConstant %float 0.75
%330 = OpTypeFunction %v4float %_ptr_Function_v2float
%_ptr_Function_v4float = OpTypePointer Function %v4float %_ptr_Function_v4float = OpTypePointer Function %v4float
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1 %int = OpTypeInt 32 1
@ -512,12 +529,44 @@ OpBranch %279
%279 = OpLabel %279 = OpLabel
%300 = OpPhi %bool %false %249 %299 %278 %300 = OpPhi %bool %false %249 %299 %278
OpStore %ok %300 OpStore %ok %300
%301 = OpLoad %bool %ok %301 = OpLoad %mat2v4float %m24
OpReturnValue %301 %302 = OpCompositeConstruct %v4float %float_4 %float_4 %float_4 %float_4
%303 = OpCompositeConstruct %mat2v4float %302 %302
%304 = OpCompositeExtract %v4float %301 0
%305 = OpCompositeExtract %v4float %303 0
%306 = OpFDiv %v4float %304 %305
%307 = OpCompositeExtract %v4float %301 1
%308 = OpCompositeExtract %v4float %303 1
%309 = OpFDiv %v4float %307 %308
%310 = OpCompositeConstruct %mat2v4float %306 %309
OpStore %m24 %310
%311 = OpLoad %bool %ok
OpSelectionMerge %313 None
OpBranchConditional %311 %312 %313
%312 = OpLabel
%314 = OpLoad %mat2v4float %m24
%317 = OpCompositeConstruct %v4float %float_0_75 %float_0 %float_0 %float_0
%318 = OpCompositeConstruct %v4float %float_0 %float_0_75 %float_0 %float_0
%316 = OpCompositeConstruct %mat2v4float %317 %318
%319 = OpCompositeExtract %v4float %314 0
%320 = OpCompositeExtract %v4float %316 0
%321 = OpFOrdEqual %v4bool %319 %320
%322 = OpAll %bool %321
%323 = OpCompositeExtract %v4float %314 1
%324 = OpCompositeExtract %v4float %316 1
%325 = OpFOrdEqual %v4bool %323 %324
%326 = OpAll %bool %325
%327 = OpLogicalAnd %bool %322 %326
OpBranch %313
%313 = OpLabel
%328 = OpPhi %bool %false %279 %327 %312
OpStore %ok %328
%329 = OpLoad %bool %ok
OpReturnValue %329
OpFunctionEnd OpFunctionEnd
%main = OpFunction %v4float None %302 %main = OpFunction %v4float None %330
%303 = OpFunctionParameter %_ptr_Function_v2float %331 = OpFunctionParameter %_ptr_Function_v2float
%304 = OpLabel %332 = OpLabel
%_0_ok = OpVariable %_ptr_Function_bool Function %_0_ok = OpVariable %_ptr_Function_bool Function
%_1_m23 = OpVariable %_ptr_Function_mat2v3float Function %_1_m23 = OpVariable %_ptr_Function_mat2v3float Function
%_2_m24 = OpVariable %_ptr_Function_mat2v4float Function %_2_m24 = OpVariable %_ptr_Function_mat2v4float Function
@ -526,311 +575,343 @@ OpFunctionEnd
%_6_m43 = OpVariable %_ptr_Function_mat4v3float Function %_6_m43 = OpVariable %_ptr_Function_mat4v3float Function
%_7_m22 = OpVariable %_ptr_Function_mat2v2float Function %_7_m22 = OpVariable %_ptr_Function_mat2v2float Function
%_8_m33 = OpVariable %_ptr_Function_mat3v3float Function %_8_m33 = OpVariable %_ptr_Function_mat3v3float Function
%555 = OpVariable %_ptr_Function_v4float Function %610 = OpVariable %_ptr_Function_v4float Function
OpStore %_0_ok %true OpStore %_0_ok %true
%308 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 %336 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%309 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 %337 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%307 = OpCompositeConstruct %mat2v3float %308 %309 %335 = OpCompositeConstruct %mat2v3float %336 %337
OpStore %_1_m23 %307 OpStore %_1_m23 %335
%310 = OpLoad %bool %_0_ok %338 = OpLoad %bool %_0_ok
OpSelectionMerge %312 None OpSelectionMerge %340 None
OpBranchConditional %310 %311 %312 OpBranchConditional %338 %339 %340
%311 = OpLabel %339 = OpLabel
%313 = OpLoad %mat2v3float %_1_m23 %341 = OpLoad %mat2v3float %_1_m23
%315 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 %343 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%316 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 %344 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%314 = OpCompositeConstruct %mat2v3float %315 %316 %342 = OpCompositeConstruct %mat2v3float %343 %344
%317 = OpCompositeExtract %v3float %313 0 %345 = OpCompositeExtract %v3float %341 0
%318 = OpCompositeExtract %v3float %314 0 %346 = OpCompositeExtract %v3float %342 0
%319 = OpFOrdEqual %v3bool %317 %318 %347 = OpFOrdEqual %v3bool %345 %346
%320 = OpAll %bool %319 %348 = OpAll %bool %347
%321 = OpCompositeExtract %v3float %313 1 %349 = OpCompositeExtract %v3float %341 1
%322 = OpCompositeExtract %v3float %314 1 %350 = OpCompositeExtract %v3float %342 1
%323 = OpFOrdEqual %v3bool %321 %322 %351 = OpFOrdEqual %v3bool %349 %350
%324 = OpAll %bool %323 %352 = OpAll %bool %351
%325 = OpLogicalAnd %bool %320 %324 %353 = OpLogicalAnd %bool %348 %352
OpBranch %312 OpBranch %340
%312 = OpLabel %340 = OpLabel
%326 = OpPhi %bool %false %304 %325 %311 %354 = OpPhi %bool %false %332 %353 %339
OpStore %_0_ok %326 OpStore %_0_ok %354
%329 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0 %357 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0
%330 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0 %358 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0
%328 = OpCompositeConstruct %mat2v4float %329 %330 %356 = OpCompositeConstruct %mat2v4float %357 %358
OpStore %_2_m24 %328 OpStore %_2_m24 %356
%331 = OpLoad %bool %_0_ok %359 = OpLoad %bool %_0_ok
OpSelectionMerge %333 None OpSelectionMerge %361 None
OpBranchConditional %331 %332 %333 OpBranchConditional %359 %360 %361
%332 = OpLabel %360 = OpLabel
%334 = OpLoad %mat2v4float %_2_m24 %362 = OpLoad %mat2v4float %_2_m24
%336 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0 %364 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0
%337 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0 %365 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0
%335 = OpCompositeConstruct %mat2v4float %336 %337 %363 = OpCompositeConstruct %mat2v4float %364 %365
%338 = OpCompositeExtract %v4float %334 0 %366 = OpCompositeExtract %v4float %362 0
%339 = OpCompositeExtract %v4float %335 0 %367 = OpCompositeExtract %v4float %363 0
%340 = OpFOrdEqual %v4bool %338 %339 %368 = OpFOrdEqual %v4bool %366 %367
%341 = OpAll %bool %340 %369 = OpAll %bool %368
%342 = OpCompositeExtract %v4float %334 1 %370 = OpCompositeExtract %v4float %362 1
%343 = OpCompositeExtract %v4float %335 1 %371 = OpCompositeExtract %v4float %363 1
%344 = OpFOrdEqual %v4bool %342 %343 %372 = OpFOrdEqual %v4bool %370 %371
%345 = OpAll %bool %344
%346 = OpLogicalAnd %bool %341 %345
OpBranch %333
%333 = OpLabel
%347 = OpPhi %bool %false %312 %346 %332
OpStore %_0_ok %347
%350 = OpCompositeConstruct %v2float %float_4 %float_0
%351 = OpCompositeConstruct %v2float %float_0 %float_4
%352 = OpCompositeConstruct %v2float %float_0 %float_0
%349 = OpCompositeConstruct %mat3v2float %350 %351 %352
OpStore %_3_m32 %349
%353 = OpLoad %bool %_0_ok
OpSelectionMerge %355 None
OpBranchConditional %353 %354 %355
%354 = OpLabel
%356 = OpLoad %mat3v2float %_3_m32
%358 = OpCompositeConstruct %v2float %float_4 %float_0
%359 = OpCompositeConstruct %v2float %float_0 %float_4
%360 = OpCompositeConstruct %v2float %float_0 %float_0
%357 = OpCompositeConstruct %mat3v2float %358 %359 %360
%361 = OpCompositeExtract %v2float %356 0
%362 = OpCompositeExtract %v2float %357 0
%363 = OpFOrdEqual %v2bool %361 %362
%364 = OpAll %bool %363
%365 = OpCompositeExtract %v2float %356 1
%366 = OpCompositeExtract %v2float %357 1
%367 = OpFOrdEqual %v2bool %365 %366
%368 = OpAll %bool %367
%369 = OpLogicalAnd %bool %364 %368
%370 = OpCompositeExtract %v2float %356 2
%371 = OpCompositeExtract %v2float %357 2
%372 = OpFOrdEqual %v2bool %370 %371
%373 = OpAll %bool %372 %373 = OpAll %bool %372
%374 = OpLogicalAnd %bool %369 %373 %374 = OpLogicalAnd %bool %369 %373
OpBranch %355 OpBranch %361
%355 = OpLabel %361 = OpLabel
%375 = OpPhi %bool %false %333 %374 %354 %375 = OpPhi %bool %false %340 %374 %360
OpStore %_0_ok %375 OpStore %_0_ok %375
%378 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0 %378 = OpCompositeConstruct %v2float %float_4 %float_0
%379 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0 %379 = OpCompositeConstruct %v2float %float_0 %float_4
%380 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0 %380 = OpCompositeConstruct %v2float %float_0 %float_0
%377 = OpCompositeConstruct %mat3v4float %378 %379 %380 %377 = OpCompositeConstruct %mat3v2float %378 %379 %380
OpStore %_4_m34 %377 OpStore %_3_m32 %377
%381 = OpLoad %bool %_0_ok %381 = OpLoad %bool %_0_ok
OpSelectionMerge %383 None OpSelectionMerge %383 None
OpBranchConditional %381 %382 %383 OpBranchConditional %381 %382 %383
%382 = OpLabel %382 = OpLabel
%384 = OpLoad %mat3v4float %_4_m34 %384 = OpLoad %mat3v2float %_3_m32
%386 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0 %386 = OpCompositeConstruct %v2float %float_4 %float_0
%387 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0 %387 = OpCompositeConstruct %v2float %float_0 %float_4
%388 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0 %388 = OpCompositeConstruct %v2float %float_0 %float_0
%385 = OpCompositeConstruct %mat3v4float %386 %387 %388 %385 = OpCompositeConstruct %mat3v2float %386 %387 %388
%389 = OpCompositeExtract %v4float %384 0 %389 = OpCompositeExtract %v2float %384 0
%390 = OpCompositeExtract %v4float %385 0 %390 = OpCompositeExtract %v2float %385 0
%391 = OpFOrdEqual %v4bool %389 %390 %391 = OpFOrdEqual %v2bool %389 %390
%392 = OpAll %bool %391 %392 = OpAll %bool %391
%393 = OpCompositeExtract %v4float %384 1 %393 = OpCompositeExtract %v2float %384 1
%394 = OpCompositeExtract %v4float %385 1 %394 = OpCompositeExtract %v2float %385 1
%395 = OpFOrdEqual %v4bool %393 %394 %395 = OpFOrdEqual %v2bool %393 %394
%396 = OpAll %bool %395 %396 = OpAll %bool %395
%397 = OpLogicalAnd %bool %392 %396 %397 = OpLogicalAnd %bool %392 %396
%398 = OpCompositeExtract %v4float %384 2 %398 = OpCompositeExtract %v2float %384 2
%399 = OpCompositeExtract %v4float %385 2 %399 = OpCompositeExtract %v2float %385 2
%400 = OpFOrdEqual %v4bool %398 %399 %400 = OpFOrdEqual %v2bool %398 %399
%401 = OpAll %bool %400 %401 = OpAll %bool %400
%402 = OpLogicalAnd %bool %397 %401 %402 = OpLogicalAnd %bool %397 %401
OpBranch %383 OpBranch %383
%383 = OpLabel %383 = OpLabel
%403 = OpPhi %bool %false %355 %402 %382 %403 = OpPhi %bool %false %361 %402 %382
OpStore %_0_ok %403 OpStore %_0_ok %403
%406 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0 %406 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0
%407 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0 %407 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0
%408 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7 %408 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0
%409 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0 %405 = OpCompositeConstruct %mat3v4float %406 %407 %408
%405 = OpCompositeConstruct %mat4v3float %406 %407 %408 %409 OpStore %_4_m34 %405
OpStore %_6_m43 %405 %409 = OpLoad %bool %_0_ok
%410 = OpLoad %bool %_0_ok OpSelectionMerge %411 None
OpSelectionMerge %412 None OpBranchConditional %409 %410 %411
OpBranchConditional %410 %411 %412 %410 = OpLabel
%412 = OpLoad %mat3v4float %_4_m34
%414 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0
%415 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0
%416 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0
%413 = OpCompositeConstruct %mat3v4float %414 %415 %416
%417 = OpCompositeExtract %v4float %412 0
%418 = OpCompositeExtract %v4float %413 0
%419 = OpFOrdEqual %v4bool %417 %418
%420 = OpAll %bool %419
%421 = OpCompositeExtract %v4float %412 1
%422 = OpCompositeExtract %v4float %413 1
%423 = OpFOrdEqual %v4bool %421 %422
%424 = OpAll %bool %423
%425 = OpLogicalAnd %bool %420 %424
%426 = OpCompositeExtract %v4float %412 2
%427 = OpCompositeExtract %v4float %413 2
%428 = OpFOrdEqual %v4bool %426 %427
%429 = OpAll %bool %428
%430 = OpLogicalAnd %bool %425 %429
OpBranch %411
%411 = OpLabel %411 = OpLabel
%413 = OpLoad %mat4v3float %_6_m43 %431 = OpPhi %bool %false %383 %430 %410
%415 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0 OpStore %_0_ok %431
%416 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0 %434 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0
%417 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7 %435 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0
%418 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0 %436 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7
%414 = OpCompositeConstruct %mat4v3float %415 %416 %417 %418 %437 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0
%419 = OpCompositeExtract %v3float %413 0 %433 = OpCompositeConstruct %mat4v3float %434 %435 %436 %437
%420 = OpCompositeExtract %v3float %414 0 OpStore %_6_m43 %433
%421 = OpFOrdEqual %v3bool %419 %420 %438 = OpLoad %bool %_0_ok
%422 = OpAll %bool %421 OpSelectionMerge %440 None
%423 = OpCompositeExtract %v3float %413 1 OpBranchConditional %438 %439 %440
%424 = OpCompositeExtract %v3float %414 1 %439 = OpLabel
%425 = OpFOrdEqual %v3bool %423 %424 %441 = OpLoad %mat4v3float %_6_m43
%426 = OpAll %bool %425 %443 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0
%427 = OpLogicalAnd %bool %422 %426 %444 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0
%428 = OpCompositeExtract %v3float %413 2 %445 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7
%429 = OpCompositeExtract %v3float %414 2 %446 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0
%430 = OpFOrdEqual %v3bool %428 %429 %442 = OpCompositeConstruct %mat4v3float %443 %444 %445 %446
%431 = OpAll %bool %430 %447 = OpCompositeExtract %v3float %441 0
%432 = OpLogicalAnd %bool %427 %431 %448 = OpCompositeExtract %v3float %442 0
%433 = OpCompositeExtract %v3float %413 3 %449 = OpFOrdEqual %v3bool %447 %448
%434 = OpCompositeExtract %v3float %414 3 %450 = OpAll %bool %449
%435 = OpFOrdEqual %v3bool %433 %434 %451 = OpCompositeExtract %v3float %441 1
%436 = OpAll %bool %435 %452 = OpCompositeExtract %v3float %442 1
%437 = OpLogicalAnd %bool %432 %436 %453 = OpFOrdEqual %v3bool %451 %452
OpBranch %412 %454 = OpAll %bool %453
%412 = OpLabel %455 = OpLogicalAnd %bool %450 %454
%438 = OpPhi %bool %false %383 %437 %411 %456 = OpCompositeExtract %v3float %441 2
OpStore %_0_ok %438 %457 = OpCompositeExtract %v3float %442 2
%440 = OpLoad %mat3v2float %_3_m32 %458 = OpFOrdEqual %v3bool %456 %457
%441 = OpLoad %mat2v3float %_1_m23 %459 = OpAll %bool %458
%442 = OpMatrixTimesMatrix %mat2v2float %440 %441 %460 = OpLogicalAnd %bool %455 %459
OpStore %_7_m22 %442 %461 = OpCompositeExtract %v3float %441 3
%443 = OpLoad %bool %_0_ok %462 = OpCompositeExtract %v3float %442 3
OpSelectionMerge %445 None %463 = OpFOrdEqual %v3bool %461 %462
OpBranchConditional %443 %444 %445 %464 = OpAll %bool %463
%444 = OpLabel %465 = OpLogicalAnd %bool %460 %464
%446 = OpLoad %mat2v2float %_7_m22 OpBranch %440
%448 = OpCompositeConstruct %v2float %float_8 %float_0 %440 = OpLabel
%449 = OpCompositeConstruct %v2float %float_0 %float_8 %466 = OpPhi %bool %false %411 %465 %439
%447 = OpCompositeConstruct %mat2v2float %448 %449 OpStore %_0_ok %466
%450 = OpCompositeExtract %v2float %446 0 %468 = OpLoad %mat3v2float %_3_m32
%451 = OpCompositeExtract %v2float %447 0 %469 = OpLoad %mat2v3float %_1_m23
%452 = OpFOrdEqual %v2bool %450 %451 %470 = OpMatrixTimesMatrix %mat2v2float %468 %469
%453 = OpAll %bool %452 OpStore %_7_m22 %470
%454 = OpCompositeExtract %v2float %446 1 %471 = OpLoad %bool %_0_ok
%455 = OpCompositeExtract %v2float %447 1 OpSelectionMerge %473 None
%456 = OpFOrdEqual %v2bool %454 %455 OpBranchConditional %471 %472 %473
%457 = OpAll %bool %456 %472 = OpLabel
%458 = OpLogicalAnd %bool %453 %457 %474 = OpLoad %mat2v2float %_7_m22
OpBranch %445 %476 = OpCompositeConstruct %v2float %float_8 %float_0
%445 = OpLabel %477 = OpCompositeConstruct %v2float %float_0 %float_8
%459 = OpPhi %bool %false %412 %458 %444 %475 = OpCompositeConstruct %mat2v2float %476 %477
OpStore %_0_ok %459 %478 = OpCompositeExtract %v2float %474 0
%461 = OpLoad %mat4v3float %_6_m43 %479 = OpCompositeExtract %v2float %475 0
%462 = OpLoad %mat3v4float %_4_m34 %480 = OpFOrdEqual %v2bool %478 %479
%463 = OpMatrixTimesMatrix %mat3v3float %461 %462 %481 = OpAll %bool %480
OpStore %_8_m33 %463 %482 = OpCompositeExtract %v2float %474 1
%464 = OpLoad %bool %_0_ok %483 = OpCompositeExtract %v2float %475 1
OpSelectionMerge %466 None %484 = OpFOrdEqual %v2bool %482 %483
OpBranchConditional %464 %465 %466 %485 = OpAll %bool %484
%465 = OpLabel %486 = OpLogicalAnd %bool %481 %485
%467 = OpLoad %mat3v3float %_8_m33 OpBranch %473
%469 = OpCompositeConstruct %v3float %float_35 %float_0 %float_0 %473 = OpLabel
%470 = OpCompositeConstruct %v3float %float_0 %float_35 %float_0 %487 = OpPhi %bool %false %440 %486 %472
%471 = OpCompositeConstruct %v3float %float_0 %float_0 %float_35 OpStore %_0_ok %487
%468 = OpCompositeConstruct %mat3v3float %469 %470 %471 %489 = OpLoad %mat4v3float %_6_m43
%472 = OpCompositeExtract %v3float %467 0 %490 = OpLoad %mat3v4float %_4_m34
%473 = OpCompositeExtract %v3float %468 0 %491 = OpMatrixTimesMatrix %mat3v3float %489 %490
%474 = OpFOrdEqual %v3bool %472 %473 OpStore %_8_m33 %491
%475 = OpAll %bool %474 %492 = OpLoad %bool %_0_ok
%476 = OpCompositeExtract %v3float %467 1 OpSelectionMerge %494 None
%477 = OpCompositeExtract %v3float %468 1 OpBranchConditional %492 %493 %494
%478 = OpFOrdEqual %v3bool %476 %477 %493 = OpLabel
%479 = OpAll %bool %478 %495 = OpLoad %mat3v3float %_8_m33
%480 = OpLogicalAnd %bool %475 %479 %497 = OpCompositeConstruct %v3float %float_35 %float_0 %float_0
%481 = OpCompositeExtract %v3float %467 2 %498 = OpCompositeConstruct %v3float %float_0 %float_35 %float_0
%482 = OpCompositeExtract %v3float %468 2 %499 = OpCompositeConstruct %v3float %float_0 %float_0 %float_35
%483 = OpFOrdEqual %v3bool %481 %482 %496 = OpCompositeConstruct %mat3v3float %497 %498 %499
%484 = OpAll %bool %483 %500 = OpCompositeExtract %v3float %495 0
%485 = OpLogicalAnd %bool %480 %484 %501 = OpCompositeExtract %v3float %496 0
OpBranch %466 %502 = OpFOrdEqual %v3bool %500 %501
%466 = OpLabel %503 = OpAll %bool %502
%486 = OpPhi %bool %false %445 %485 %465 %504 = OpCompositeExtract %v3float %495 1
OpStore %_0_ok %486 %505 = OpCompositeExtract %v3float %496 1
%487 = OpLoad %mat2v3float %_1_m23
%488 = OpCompositeConstruct %v3float %float_1 %float_1 %float_1
%489 = OpCompositeConstruct %mat2v3float %488 %488
%490 = OpCompositeExtract %v3float %487 0
%491 = OpCompositeExtract %v3float %489 0
%492 = OpFAdd %v3float %490 %491
%493 = OpCompositeExtract %v3float %487 1
%494 = OpCompositeExtract %v3float %489 1
%495 = OpFAdd %v3float %493 %494
%496 = OpCompositeConstruct %mat2v3float %492 %495
OpStore %_1_m23 %496
%497 = OpLoad %bool %_0_ok
OpSelectionMerge %499 None
OpBranchConditional %497 %498 %499
%498 = OpLabel
%500 = OpLoad %mat2v3float %_1_m23
%502 = OpCompositeConstruct %v3float %float_3 %float_1 %float_1
%503 = OpCompositeConstruct %v3float %float_1 %float_3 %float_1
%501 = OpCompositeConstruct %mat2v3float %502 %503
%504 = OpCompositeExtract %v3float %500 0
%505 = OpCompositeExtract %v3float %501 0
%506 = OpFOrdEqual %v3bool %504 %505 %506 = OpFOrdEqual %v3bool %504 %505
%507 = OpAll %bool %506 %507 = OpAll %bool %506
%508 = OpCompositeExtract %v3float %500 1 %508 = OpLogicalAnd %bool %503 %507
%509 = OpCompositeExtract %v3float %501 1 %509 = OpCompositeExtract %v3float %495 2
%510 = OpFOrdEqual %v3bool %508 %509 %510 = OpCompositeExtract %v3float %496 2
%511 = OpAll %bool %510 %511 = OpFOrdEqual %v3bool %509 %510
%512 = OpLogicalAnd %bool %507 %511 %512 = OpAll %bool %511
OpBranch %499 %513 = OpLogicalAnd %bool %508 %512
%499 = OpLabel OpBranch %494
%513 = OpPhi %bool %false %466 %512 %498 %494 = OpLabel
OpStore %_0_ok %513 %514 = OpPhi %bool %false %473 %513 %493
%514 = OpLoad %mat3v2float %_3_m32 OpStore %_0_ok %514
%515 = OpCompositeConstruct %v2float %float_2 %float_2 %515 = OpLoad %mat2v3float %_1_m23
%516 = OpCompositeConstruct %mat3v2float %515 %515 %515 %516 = OpCompositeConstruct %v3float %float_1 %float_1 %float_1
%517 = OpCompositeExtract %v2float %514 0 %517 = OpCompositeConstruct %mat2v3float %516 %516
%518 = OpCompositeExtract %v2float %516 0 %518 = OpCompositeExtract %v3float %515 0
%519 = OpFSub %v2float %517 %518 %519 = OpCompositeExtract %v3float %517 0
%520 = OpCompositeExtract %v2float %514 1 %520 = OpFAdd %v3float %518 %519
%521 = OpCompositeExtract %v2float %516 1 %521 = OpCompositeExtract %v3float %515 1
%522 = OpFSub %v2float %520 %521 %522 = OpCompositeExtract %v3float %517 1
%523 = OpCompositeExtract %v2float %514 2 %523 = OpFAdd %v3float %521 %522
%524 = OpCompositeExtract %v2float %516 2 %524 = OpCompositeConstruct %mat2v3float %520 %523
%525 = OpFSub %v2float %523 %524 OpStore %_1_m23 %524
%526 = OpCompositeConstruct %mat3v2float %519 %522 %525 %525 = OpLoad %bool %_0_ok
OpStore %_3_m32 %526 OpSelectionMerge %527 None
%527 = OpLoad %bool %_0_ok OpBranchConditional %525 %526 %527
OpSelectionMerge %529 None %526 = OpLabel
OpBranchConditional %527 %528 %529 %528 = OpLoad %mat2v3float %_1_m23
%528 = OpLabel %530 = OpCompositeConstruct %v3float %float_3 %float_1 %float_1
%530 = OpLoad %mat3v2float %_3_m32 %531 = OpCompositeConstruct %v3float %float_1 %float_3 %float_1
%532 = OpCompositeConstruct %v2float %float_2 %float_n2 %529 = OpCompositeConstruct %mat2v3float %530 %531
%533 = OpCompositeConstruct %v2float %float_n2 %float_2 %532 = OpCompositeExtract %v3float %528 0
%534 = OpCompositeConstruct %v2float %float_n2 %float_n2 %533 = OpCompositeExtract %v3float %529 0
%531 = OpCompositeConstruct %mat3v2float %532 %533 %534 %534 = OpFOrdEqual %v3bool %532 %533
%535 = OpCompositeExtract %v2float %530 0 %535 = OpAll %bool %534
%536 = OpCompositeExtract %v2float %531 0 %536 = OpCompositeExtract %v3float %528 1
%537 = OpFOrdEqual %v2bool %535 %536 %537 = OpCompositeExtract %v3float %529 1
%538 = OpAll %bool %537 %538 = OpFOrdEqual %v3bool %536 %537
%539 = OpCompositeExtract %v2float %530 1 %539 = OpAll %bool %538
%540 = OpCompositeExtract %v2float %531 1 %540 = OpLogicalAnd %bool %535 %539
%541 = OpFOrdEqual %v2bool %539 %540 OpBranch %527
%542 = OpAll %bool %541 %527 = OpLabel
%543 = OpLogicalAnd %bool %538 %542 %541 = OpPhi %bool %false %494 %540 %526
%544 = OpCompositeExtract %v2float %530 2 OpStore %_0_ok %541
%545 = OpCompositeExtract %v2float %531 2 %542 = OpLoad %mat3v2float %_3_m32
%546 = OpFOrdEqual %v2bool %544 %545 %543 = OpCompositeConstruct %v2float %float_2 %float_2
%547 = OpAll %bool %546 %544 = OpCompositeConstruct %mat3v2float %543 %543 %543
%548 = OpLogicalAnd %bool %543 %547 %545 = OpCompositeExtract %v2float %542 0
OpBranch %529 %546 = OpCompositeExtract %v2float %544 0
%529 = OpLabel %547 = OpFSub %v2float %545 %546
%549 = OpPhi %bool %false %499 %548 %528 %548 = OpCompositeExtract %v2float %542 1
OpStore %_0_ok %549 %549 = OpCompositeExtract %v2float %544 1
%550 = OpLoad %bool %_0_ok %550 = OpFSub %v2float %548 %549
OpSelectionMerge %552 None %551 = OpCompositeExtract %v2float %542 2
OpBranchConditional %550 %551 %552 %552 = OpCompositeExtract %v2float %544 2
%551 = OpLabel %553 = OpFSub %v2float %551 %552
%553 = OpFunctionCall %bool %test_half_b %554 = OpCompositeConstruct %mat3v2float %547 %550 %553
OpBranch %552 OpStore %_3_m32 %554
%552 = OpLabel %555 = OpLoad %bool %_0_ok
%554 = OpPhi %bool %false %529 %553 %551 OpSelectionMerge %557 None
OpSelectionMerge %559 None OpBranchConditional %555 %556 %557
OpBranchConditional %554 %557 %558 %556 = OpLabel
%558 = OpLoad %mat3v2float %_3_m32
%560 = OpCompositeConstruct %v2float %float_2 %float_n2
%561 = OpCompositeConstruct %v2float %float_n2 %float_2
%562 = OpCompositeConstruct %v2float %float_n2 %float_n2
%559 = OpCompositeConstruct %mat3v2float %560 %561 %562
%563 = OpCompositeExtract %v2float %558 0
%564 = OpCompositeExtract %v2float %559 0
%565 = OpFOrdEqual %v2bool %563 %564
%566 = OpAll %bool %565
%567 = OpCompositeExtract %v2float %558 1
%568 = OpCompositeExtract %v2float %559 1
%569 = OpFOrdEqual %v2bool %567 %568
%570 = OpAll %bool %569
%571 = OpLogicalAnd %bool %566 %570
%572 = OpCompositeExtract %v2float %558 2
%573 = OpCompositeExtract %v2float %559 2
%574 = OpFOrdEqual %v2bool %572 %573
%575 = OpAll %bool %574
%576 = OpLogicalAnd %bool %571 %575
OpBranch %557
%557 = OpLabel %557 = OpLabel
%560 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0 %577 = OpPhi %bool %false %527 %576 %556
%564 = OpLoad %v4float %560 OpStore %_0_ok %577
OpStore %555 %564 %578 = OpLoad %mat2v4float %_2_m24
OpBranch %559 %579 = OpCompositeConstruct %v4float %float_4 %float_4 %float_4 %float_4
%558 = OpLabel %580 = OpCompositeConstruct %mat2v4float %579 %579
%565 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1 %581 = OpCompositeExtract %v4float %578 0
%567 = OpLoad %v4float %565 %582 = OpCompositeExtract %v4float %580 0
OpStore %555 %567 %583 = OpFDiv %v4float %581 %582
OpBranch %559 %584 = OpCompositeExtract %v4float %578 1
%559 = OpLabel %585 = OpCompositeExtract %v4float %580 1
%568 = OpLoad %v4float %555 %586 = OpFDiv %v4float %584 %585
OpReturnValue %568 %587 = OpCompositeConstruct %mat2v4float %583 %586
OpStore %_2_m24 %587
%588 = OpLoad %bool %_0_ok
OpSelectionMerge %590 None
OpBranchConditional %588 %589 %590
%589 = OpLabel
%591 = OpLoad %mat2v4float %_2_m24
%593 = OpCompositeConstruct %v4float %float_0_75 %float_0 %float_0 %float_0
%594 = OpCompositeConstruct %v4float %float_0 %float_0_75 %float_0 %float_0
%592 = OpCompositeConstruct %mat2v4float %593 %594
%595 = OpCompositeExtract %v4float %591 0
%596 = OpCompositeExtract %v4float %592 0
%597 = OpFOrdEqual %v4bool %595 %596
%598 = OpAll %bool %597
%599 = OpCompositeExtract %v4float %591 1
%600 = OpCompositeExtract %v4float %592 1
%601 = OpFOrdEqual %v4bool %599 %600
%602 = OpAll %bool %601
%603 = OpLogicalAnd %bool %598 %602
OpBranch %590
%590 = OpLabel
%604 = OpPhi %bool %false %557 %603 %589
OpStore %_0_ok %604
%605 = OpLoad %bool %_0_ok
OpSelectionMerge %607 None
OpBranchConditional %605 %606 %607
%606 = OpLabel
%608 = OpFunctionCall %bool %test_half_b
OpBranch %607
%607 = OpLabel
%609 = OpPhi %bool %false %590 %608 %606
OpSelectionMerge %614 None
OpBranchConditional %609 %612 %613
%612 = OpLabel
%615 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
%619 = OpLoad %v4float %615
OpStore %610 %619
OpBranch %614
%613 = OpLabel
%620 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
%622 = OpLoad %v4float %620
OpStore %610 %622
OpBranch %614
%614 = OpLabel
%623 = OpLoad %v4float %610
OpReturnValue %623
OpFunctionEnd OpFunctionEnd

View File

@ -22,6 +22,8 @@ bool test_half_b() {
ok = ok && m23 == mat2x3(3.0, 1.0, 1.0, 1.0, 3.0, 1.0); ok = ok && m23 == mat2x3(3.0, 1.0, 1.0, 1.0, 3.0, 1.0);
m32 -= 2.0; m32 -= 2.0;
ok = ok && m32 == mat3x2(2.0, -2.0, -2.0, 2.0, -2.0, -2.0); ok = ok && m32 == mat3x2(2.0, -2.0, -2.0, 2.0, -2.0, -2.0);
m24 /= 4.0;
ok = ok && m24 == mat2x4(0.75, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0);
return ok; return ok;
} }
vec4 main() { vec4 main() {
@ -44,5 +46,7 @@ vec4 main() {
_0_ok = _0_ok && _1_m23 == mat2x3(3.0, 1.0, 1.0, 1.0, 3.0, 1.0); _0_ok = _0_ok && _1_m23 == mat2x3(3.0, 1.0, 1.0, 1.0, 3.0, 1.0);
_3_m32 -= 2.0; _3_m32 -= 2.0;
_0_ok = _0_ok && _3_m32 == mat3x2(2.0, -2.0, -2.0, 2.0, -2.0, -2.0); _0_ok = _0_ok && _3_m32 == mat3x2(2.0, -2.0, -2.0, 2.0, -2.0, -2.0);
_2_m24 /= 4.0;
_0_ok = _0_ok && _2_m24 == mat2x4(0.75, 0.0, 0.0, 0.0, 0.0, 0.75, 0.0, 0.0);
return _0_ok && test_half_b() ? colorGreen : colorRed; return _0_ok && test_half_b() ? colorGreen : colorRed;
} }

View File

@ -64,6 +64,13 @@ thread bool operator==(const float3x3 left, const float3x3 right) {
thread bool operator!=(const float3x3 left, const float3x3 right) { thread bool operator!=(const float3x3 left, const float3x3 right) {
return !(left == right); return !(left == right);
} }
thread float2x4 operator/(const float2x4 left, const float2x4 right) {
return float2x4(left[0] / right[0], left[1] / right[1]);
}
thread float2x4& operator/=(thread float2x4& left, thread const float2x4& right) {
left = left / right;
return left;
}
bool test_half_b() { bool test_half_b() {
bool ok = true; bool ok = true;
float2x3 m23 = float2x3(2.0); float2x3 m23 = float2x3(2.0);
@ -84,6 +91,8 @@ bool test_half_b() {
ok = ok && m23 == float2x3(float3(3.0, 1.0, 1.0), float3(1.0, 3.0, 1.0)); ok = ok && m23 == float2x3(float3(3.0, 1.0, 1.0), float3(1.0, 3.0, 1.0));
m32 -= (float3x2(1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 2.0); m32 -= (float3x2(1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 2.0);
ok = ok && m32 == float3x2(float2(2.0, -2.0), float2(-2.0, 2.0), float2(-2.0, -2.0)); ok = ok && m32 == float3x2(float2(2.0, -2.0), float2(-2.0, 2.0), float2(-2.0, -2.0));
m24 /= (float2x4(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 4.0);
ok = ok && m24 == float2x4(float4(0.75, 0.0, 0.0, 0.0), float4(0.0, 0.75, 0.0, 0.0));
return ok; return ok;
} }
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], 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]]) {
@ -108,6 +117,8 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _unifo
_0_ok = _0_ok && _1_m23 == float2x3(float3(3.0, 1.0, 1.0), float3(1.0, 3.0, 1.0)); _0_ok = _0_ok && _1_m23 == float2x3(float3(3.0, 1.0, 1.0), float3(1.0, 3.0, 1.0));
_3_m32 -= (float3x2(1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 2.0); _3_m32 -= (float3x2(1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 2.0);
_0_ok = _0_ok && _3_m32 == float3x2(float2(2.0, -2.0), float2(-2.0, 2.0), float2(-2.0, -2.0)); _0_ok = _0_ok && _3_m32 == float3x2(float2(2.0, -2.0), float2(-2.0, 2.0), float2(-2.0, -2.0));
_2_m24 /= (float2x4(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0) * 4.0);
_0_ok = _0_ok && _2_m24 == float2x4(float4(0.75, 0.0, 0.0, 0.0), float4(0.0, 0.75, 0.0, 0.0));
_out.sk_FragColor = _0_ok && test_half_b() ? _uniforms.colorGreen : _uniforms.colorRed; _out.sk_FragColor = _0_ok && test_half_b() ? _uniforms.colorGreen : _uniforms.colorRed;
return _out; return _out;
} }

View File

@ -1,8 +1,3 @@
### Compilation failed:
error: SPIR-V validation error: Expected floating scalar or vector type as Result Type: FDiv
%283 = OpFDiv %mat2v2float %282 %277
OpCapability Shader OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450" %1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450 OpMemoryModel Logical GLSL450
@ -153,19 +148,25 @@ OpDecorate %283 RelaxedPrecision
OpDecorate %284 RelaxedPrecision OpDecorate %284 RelaxedPrecision
OpDecorate %285 RelaxedPrecision OpDecorate %285 RelaxedPrecision
OpDecorate %286 RelaxedPrecision OpDecorate %286 RelaxedPrecision
OpDecorate %298 RelaxedPrecision OpDecorate %287 RelaxedPrecision
OpDecorate %303 RelaxedPrecision OpDecorate %288 RelaxedPrecision
OpDecorate %341 RelaxedPrecision OpDecorate %289 RelaxedPrecision
OpDecorate %379 RelaxedPrecision OpDecorate %290 RelaxedPrecision
OpDecorate %406 RelaxedPrecision OpDecorate %291 RelaxedPrecision
OpDecorate %433 RelaxedPrecision OpDecorate %292 RelaxedPrecision
OpDecorate %471 RelaxedPrecision OpDecorate %304 RelaxedPrecision
OpDecorate %509 RelaxedPrecision OpDecorate %309 RelaxedPrecision
OpDecorate %536 RelaxedPrecision OpDecorate %347 RelaxedPrecision
OpDecorate %558 RelaxedPrecision OpDecorate %385 RelaxedPrecision
OpDecorate %572 RelaxedPrecision OpDecorate %412 RelaxedPrecision
OpDecorate %575 RelaxedPrecision OpDecorate %439 RelaxedPrecision
OpDecorate %576 RelaxedPrecision OpDecorate %477 RelaxedPrecision
OpDecorate %515 RelaxedPrecision
OpDecorate %542 RelaxedPrecision
OpDecorate %570 RelaxedPrecision
OpDecorate %584 RelaxedPrecision
OpDecorate %587 RelaxedPrecision
OpDecorate %588 RelaxedPrecision
%float = OpTypeFloat 32 %float = OpTypeFloat 32
%v4float = OpTypeVector %float 4 %v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float %_ptr_Output_v4float = OpTypePointer Output %v4float
@ -199,7 +200,7 @@ OpDecorate %576 RelaxedPrecision
%float_0_5 = OpConstant %float 0.5 %float_0_5 = OpConstant %float 0.5
%mat2v2float = OpTypeMatrix %v2float 2 %mat2v2float = OpTypeMatrix %v2float 2
%v2bool = OpTypeVector %bool 2 %v2bool = OpTypeVector %bool 2
%299 = OpTypeFunction %v4float %_ptr_Function_v2float %305 = OpTypeFunction %v4float %_ptr_Function_v2float
%_ptr_Function_v4float = OpTypePointer Function %v4float %_ptr_Function_v4float = OpTypePointer Function %v4float
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
%int = OpTypeInt 32 1 %int = OpTypeInt 32 1
@ -487,342 +488,352 @@ OpBranchConditional %274 %275 %276
%277 = OpCompositeConstruct %mat2v2float %278 %279 %277 = OpCompositeConstruct %mat2v2float %278 %279
%281 = OpCompositeConstruct %v2float %float_4 %float_4 %281 = OpCompositeConstruct %v2float %float_4 %float_4
%282 = OpCompositeConstruct %mat2v2float %281 %281 %282 = OpCompositeConstruct %mat2v2float %281 %281
%283 = OpFDiv %mat2v2float %282 %277 %283 = OpCompositeExtract %v2float %282 0
%285 = OpCompositeConstruct %v2float %float_2 %float_2 %284 = OpCompositeExtract %v2float %277 0
%286 = OpCompositeConstruct %v2float %float_2 %float_2 %285 = OpFDiv %v2float %283 %284
%284 = OpCompositeConstruct %mat2v2float %285 %286 %286 = OpCompositeExtract %v2float %282 1
%288 = OpCompositeExtract %v2float %283 0 %287 = OpCompositeExtract %v2float %277 1
%289 = OpCompositeExtract %v2float %284 0 %288 = OpFDiv %v2float %286 %287
%290 = OpFOrdEqual %v2bool %288 %289 %289 = OpCompositeConstruct %mat2v2float %285 %288
%291 = OpAll %bool %290 %291 = OpCompositeConstruct %v2float %float_2 %float_2
%292 = OpCompositeExtract %v2float %283 1 %292 = OpCompositeConstruct %v2float %float_2 %float_2
%293 = OpCompositeExtract %v2float %284 1 %290 = OpCompositeConstruct %mat2v2float %291 %292
%294 = OpFOrdEqual %v2bool %292 %293 %294 = OpCompositeExtract %v2float %289 0
%295 = OpAll %bool %294 %295 = OpCompositeExtract %v2float %290 0
%296 = OpLogicalAnd %bool %291 %295 %296 = OpFOrdEqual %v2bool %294 %295
%297 = OpAll %bool %296
%298 = OpCompositeExtract %v2float %289 1
%299 = OpCompositeExtract %v2float %290 1
%300 = OpFOrdEqual %v2bool %298 %299
%301 = OpAll %bool %300
%302 = OpLogicalAnd %bool %297 %301
OpBranch %276 OpBranch %276
%276 = OpLabel %276 = OpLabel
%297 = OpPhi %bool %false %249 %296 %275 %303 = OpPhi %bool %false %249 %302 %275
OpStore %ok %297 OpStore %ok %303
%298 = OpLoad %bool %ok %304 = OpLoad %bool %ok
OpReturnValue %298 OpReturnValue %304
OpFunctionEnd OpFunctionEnd
%main = OpFunction %v4float None %299 %main = OpFunction %v4float None %305
%300 = OpFunctionParameter %_ptr_Function_v2float %306 = OpFunctionParameter %_ptr_Function_v2float
%301 = OpLabel %307 = OpLabel
%_0_ok = OpVariable %_ptr_Function_bool Function %_0_ok = OpVariable %_ptr_Function_bool Function
%563 = OpVariable %_ptr_Function_v4float Function %575 = OpVariable %_ptr_Function_v4float Function
OpStore %_0_ok %true OpStore %_0_ok %true
%303 = OpLoad %bool %_0_ok %309 = OpLoad %bool %_0_ok
OpSelectionMerge %305 None OpSelectionMerge %311 None
OpBranchConditional %303 %304 %305 OpBranchConditional %309 %310 %311
%304 = OpLabel %310 = OpLabel
%307 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 %313 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%308 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 %314 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%309 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 %315 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%306 = OpCompositeConstruct %mat3v3float %307 %308 %309 %312 = OpCompositeConstruct %mat3v3float %313 %314 %315
%310 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 %316 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%311 = OpCompositeConstruct %mat3v3float %310 %310 %310 %317 = OpCompositeConstruct %mat3v3float %316 %316 %316
%312 = OpCompositeExtract %v3float %306 0 %318 = OpCompositeExtract %v3float %312 0
%313 = OpCompositeExtract %v3float %311 0 %319 = OpCompositeExtract %v3float %317 0
%314 = OpFAdd %v3float %312 %313
%315 = OpCompositeExtract %v3float %306 1
%316 = OpCompositeExtract %v3float %311 1
%317 = OpFAdd %v3float %315 %316
%318 = OpCompositeExtract %v3float %306 2
%319 = OpCompositeExtract %v3float %311 2
%320 = OpFAdd %v3float %318 %319 %320 = OpFAdd %v3float %318 %319
%321 = OpCompositeConstruct %mat3v3float %314 %317 %320 %321 = OpCompositeExtract %v3float %312 1
%323 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4 %322 = OpCompositeExtract %v3float %317 1
%324 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4 %323 = OpFAdd %v3float %321 %322
%325 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6 %324 = OpCompositeExtract %v3float %312 2
%322 = OpCompositeConstruct %mat3v3float %323 %324 %325 %325 = OpCompositeExtract %v3float %317 2
%326 = OpCompositeExtract %v3float %321 0 %326 = OpFAdd %v3float %324 %325
%327 = OpCompositeExtract %v3float %322 0 %327 = OpCompositeConstruct %mat3v3float %320 %323 %326
%328 = OpFOrdEqual %v3bool %326 %327 %329 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4
%329 = OpAll %bool %328 %330 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4
%330 = OpCompositeExtract %v3float %321 1 %331 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6
%331 = OpCompositeExtract %v3float %322 1 %328 = OpCompositeConstruct %mat3v3float %329 %330 %331
%332 = OpFOrdEqual %v3bool %330 %331 %332 = OpCompositeExtract %v3float %327 0
%333 = OpAll %bool %332 %333 = OpCompositeExtract %v3float %328 0
%334 = OpLogicalAnd %bool %329 %333 %334 = OpFOrdEqual %v3bool %332 %333
%335 = OpCompositeExtract %v3float %321 2 %335 = OpAll %bool %334
%336 = OpCompositeExtract %v3float %322 2 %336 = OpCompositeExtract %v3float %327 1
%337 = OpFOrdEqual %v3bool %335 %336 %337 = OpCompositeExtract %v3float %328 1
%338 = OpAll %bool %337 %338 = OpFOrdEqual %v3bool %336 %337
%339 = OpLogicalAnd %bool %334 %338 %339 = OpAll %bool %338
OpBranch %305 %340 = OpLogicalAnd %bool %335 %339
%305 = OpLabel %341 = OpCompositeExtract %v3float %327 2
%340 = OpPhi %bool %false %301 %339 %304 %342 = OpCompositeExtract %v3float %328 2
OpStore %_0_ok %340 %343 = OpFOrdEqual %v3bool %341 %342
%341 = OpLoad %bool %_0_ok %344 = OpAll %bool %343
OpSelectionMerge %343 None %345 = OpLogicalAnd %bool %340 %344
OpBranchConditional %341 %342 %343 OpBranch %311
%342 = OpLabel %311 = OpLabel
%345 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 %346 = OpPhi %bool %false %307 %345 %310
%346 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 OpStore %_0_ok %346
%347 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 %347 = OpLoad %bool %_0_ok
%344 = OpCompositeConstruct %mat3v3float %345 %346 %347 OpSelectionMerge %349 None
%348 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 OpBranchConditional %347 %348 %349
%349 = OpCompositeConstruct %mat3v3float %348 %348 %348 %348 = OpLabel
%350 = OpCompositeExtract %v3float %344 0 %351 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%351 = OpCompositeExtract %v3float %349 0 %352 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%352 = OpFSub %v3float %350 %351 %353 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%353 = OpCompositeExtract %v3float %344 1 %350 = OpCompositeConstruct %mat3v3float %351 %352 %353
%354 = OpCompositeExtract %v3float %349 1 %354 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%355 = OpFSub %v3float %353 %354 %355 = OpCompositeConstruct %mat3v3float %354 %354 %354
%356 = OpCompositeExtract %v3float %344 2 %356 = OpCompositeExtract %v3float %350 0
%357 = OpCompositeExtract %v3float %349 2 %357 = OpCompositeExtract %v3float %355 0
%358 = OpFSub %v3float %356 %357 %358 = OpFSub %v3float %356 %357
%359 = OpCompositeConstruct %mat3v3float %352 %355 %358 %359 = OpCompositeExtract %v3float %350 1
%361 = OpCompositeConstruct %v3float %float_n2 %float_n4 %float_n4 %360 = OpCompositeExtract %v3float %355 1
%362 = OpCompositeConstruct %v3float %float_n4 %float_n2 %float_n4 %361 = OpFSub %v3float %359 %360
%363 = OpCompositeConstruct %v3float %float_n4 %float_n4 %float_n2 %362 = OpCompositeExtract %v3float %350 2
%360 = OpCompositeConstruct %mat3v3float %361 %362 %363 %363 = OpCompositeExtract %v3float %355 2
%364 = OpCompositeExtract %v3float %359 0 %364 = OpFSub %v3float %362 %363
%365 = OpCompositeExtract %v3float %360 0 %365 = OpCompositeConstruct %mat3v3float %358 %361 %364
%366 = OpFOrdEqual %v3bool %364 %365 %367 = OpCompositeConstruct %v3float %float_n2 %float_n4 %float_n4
%367 = OpAll %bool %366 %368 = OpCompositeConstruct %v3float %float_n4 %float_n2 %float_n4
%368 = OpCompositeExtract %v3float %359 1 %369 = OpCompositeConstruct %v3float %float_n4 %float_n4 %float_n2
%369 = OpCompositeExtract %v3float %360 1 %366 = OpCompositeConstruct %mat3v3float %367 %368 %369
%370 = OpFOrdEqual %v3bool %368 %369 %370 = OpCompositeExtract %v3float %365 0
%371 = OpAll %bool %370 %371 = OpCompositeExtract %v3float %366 0
%372 = OpLogicalAnd %bool %367 %371 %372 = OpFOrdEqual %v3bool %370 %371
%373 = OpCompositeExtract %v3float %359 2 %373 = OpAll %bool %372
%374 = OpCompositeExtract %v3float %360 2 %374 = OpCompositeExtract %v3float %365 1
%375 = OpFOrdEqual %v3bool %373 %374 %375 = OpCompositeExtract %v3float %366 1
%376 = OpAll %bool %375 %376 = OpFOrdEqual %v3bool %374 %375
%377 = OpLogicalAnd %bool %372 %376 %377 = OpAll %bool %376
OpBranch %343 %378 = OpLogicalAnd %bool %373 %377
%343 = OpLabel %379 = OpCompositeExtract %v3float %365 2
%378 = OpPhi %bool %false %305 %377 %342 %380 = OpCompositeExtract %v3float %366 2
OpStore %_0_ok %378 %381 = OpFOrdEqual %v3bool %379 %380
%379 = OpLoad %bool %_0_ok %382 = OpAll %bool %381
OpSelectionMerge %381 None %383 = OpLogicalAnd %bool %378 %382
OpBranchConditional %379 %380 %381 OpBranch %349
%380 = OpLabel %349 = OpLabel
%383 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 %384 = OpPhi %bool %false %311 %383 %348
%384 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 OpStore %_0_ok %384
%385 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 %385 = OpLoad %bool %_0_ok
%382 = OpCompositeConstruct %mat3v3float %383 %384 %385 OpSelectionMerge %387 None
%386 = OpMatrixTimesScalar %mat3v3float %382 %float_4 OpBranchConditional %385 %386 %387
%388 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0 %386 = OpLabel
%389 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0 %389 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%390 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8 %390 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%387 = OpCompositeConstruct %mat3v3float %388 %389 %390 %391 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%391 = OpCompositeExtract %v3float %386 0 %388 = OpCompositeConstruct %mat3v3float %389 %390 %391
%392 = OpCompositeExtract %v3float %387 0 %392 = OpMatrixTimesScalar %mat3v3float %388 %float_4
%393 = OpFOrdEqual %v3bool %391 %392 %394 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0
%394 = OpAll %bool %393 %395 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0
%395 = OpCompositeExtract %v3float %386 1 %396 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8
%396 = OpCompositeExtract %v3float %387 1 %393 = OpCompositeConstruct %mat3v3float %394 %395 %396
%397 = OpFOrdEqual %v3bool %395 %396 %397 = OpCompositeExtract %v3float %392 0
%398 = OpAll %bool %397 %398 = OpCompositeExtract %v3float %393 0
%399 = OpLogicalAnd %bool %394 %398 %399 = OpFOrdEqual %v3bool %397 %398
%400 = OpCompositeExtract %v3float %386 2 %400 = OpAll %bool %399
%401 = OpCompositeExtract %v3float %387 2 %401 = OpCompositeExtract %v3float %392 1
%402 = OpFOrdEqual %v3bool %400 %401 %402 = OpCompositeExtract %v3float %393 1
%403 = OpAll %bool %402 %403 = OpFOrdEqual %v3bool %401 %402
%404 = OpLogicalAnd %bool %399 %403 %404 = OpAll %bool %403
OpBranch %381 %405 = OpLogicalAnd %bool %400 %404
%381 = OpLabel %406 = OpCompositeExtract %v3float %392 2
%405 = OpPhi %bool %false %343 %404 %380 %407 = OpCompositeExtract %v3float %393 2
OpStore %_0_ok %405 %408 = OpFOrdEqual %v3bool %406 %407
%406 = OpLoad %bool %_0_ok %409 = OpAll %bool %408
OpSelectionMerge %408 None %410 = OpLogicalAnd %bool %405 %409
OpBranchConditional %406 %407 %408 OpBranch %387
%407 = OpLabel %387 = OpLabel
%410 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 %411 = OpPhi %bool %false %349 %410 %386
%411 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 OpStore %_0_ok %411
%412 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 %412 = OpLoad %bool %_0_ok
%409 = OpCompositeConstruct %mat3v3float %410 %411 %412 OpSelectionMerge %414 None
%413 = OpMatrixTimesScalar %mat3v3float %409 %float_0_25 OpBranchConditional %412 %413 %414
%415 = OpCompositeConstruct %v3float %float_0_5 %float_0 %float_0 %413 = OpLabel
%416 = OpCompositeConstruct %v3float %float_0 %float_0_5 %float_0 %416 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%417 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0_5 %417 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%414 = OpCompositeConstruct %mat3v3float %415 %416 %417 %418 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%418 = OpCompositeExtract %v3float %413 0 %415 = OpCompositeConstruct %mat3v3float %416 %417 %418
%419 = OpCompositeExtract %v3float %414 0 %419 = OpMatrixTimesScalar %mat3v3float %415 %float_0_25
%420 = OpFOrdEqual %v3bool %418 %419 %421 = OpCompositeConstruct %v3float %float_0_5 %float_0 %float_0
%421 = OpAll %bool %420 %422 = OpCompositeConstruct %v3float %float_0 %float_0_5 %float_0
%422 = OpCompositeExtract %v3float %413 1 %423 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0_5
%423 = OpCompositeExtract %v3float %414 1 %420 = OpCompositeConstruct %mat3v3float %421 %422 %423
%424 = OpFOrdEqual %v3bool %422 %423 %424 = OpCompositeExtract %v3float %419 0
%425 = OpAll %bool %424 %425 = OpCompositeExtract %v3float %420 0
%426 = OpLogicalAnd %bool %421 %425 %426 = OpFOrdEqual %v3bool %424 %425
%427 = OpCompositeExtract %v3float %413 2 %427 = OpAll %bool %426
%428 = OpCompositeExtract %v3float %414 2 %428 = OpCompositeExtract %v3float %419 1
%429 = OpFOrdEqual %v3bool %427 %428 %429 = OpCompositeExtract %v3float %420 1
%430 = OpAll %bool %429 %430 = OpFOrdEqual %v3bool %428 %429
%431 = OpLogicalAnd %bool %426 %430 %431 = OpAll %bool %430
OpBranch %408 %432 = OpLogicalAnd %bool %427 %431
%408 = OpLabel %433 = OpCompositeExtract %v3float %419 2
%432 = OpPhi %bool %false %381 %431 %407 %434 = OpCompositeExtract %v3float %420 2
OpStore %_0_ok %432 %435 = OpFOrdEqual %v3bool %433 %434
%433 = OpLoad %bool %_0_ok %436 = OpAll %bool %435
OpSelectionMerge %435 None %437 = OpLogicalAnd %bool %432 %436
OpBranchConditional %433 %434 %435 OpBranch %414
%434 = OpLabel %414 = OpLabel
%437 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 %438 = OpPhi %bool %false %387 %437 %413
%438 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 OpStore %_0_ok %438
%439 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 %439 = OpLoad %bool %_0_ok
%436 = OpCompositeConstruct %mat3v3float %437 %438 %439 OpSelectionMerge %441 None
%440 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 OpBranchConditional %439 %440 %441
%441 = OpCompositeConstruct %mat3v3float %440 %440 %440 %440 = OpLabel
%442 = OpCompositeExtract %v3float %441 0 %443 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%443 = OpCompositeExtract %v3float %436 0 %444 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%444 = OpFAdd %v3float %442 %443 %445 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%445 = OpCompositeExtract %v3float %441 1 %442 = OpCompositeConstruct %mat3v3float %443 %444 %445
%446 = OpCompositeExtract %v3float %436 1 %446 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%447 = OpFAdd %v3float %445 %446 %447 = OpCompositeConstruct %mat3v3float %446 %446 %446
%448 = OpCompositeExtract %v3float %441 2 %448 = OpCompositeExtract %v3float %447 0
%449 = OpCompositeExtract %v3float %436 2 %449 = OpCompositeExtract %v3float %442 0
%450 = OpFAdd %v3float %448 %449 %450 = OpFAdd %v3float %448 %449
%451 = OpCompositeConstruct %mat3v3float %444 %447 %450 %451 = OpCompositeExtract %v3float %447 1
%453 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4 %452 = OpCompositeExtract %v3float %442 1
%454 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4 %453 = OpFAdd %v3float %451 %452
%455 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6 %454 = OpCompositeExtract %v3float %447 2
%452 = OpCompositeConstruct %mat3v3float %453 %454 %455 %455 = OpCompositeExtract %v3float %442 2
%456 = OpCompositeExtract %v3float %451 0 %456 = OpFAdd %v3float %454 %455
%457 = OpCompositeExtract %v3float %452 0 %457 = OpCompositeConstruct %mat3v3float %450 %453 %456
%458 = OpFOrdEqual %v3bool %456 %457 %459 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4
%459 = OpAll %bool %458 %460 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4
%460 = OpCompositeExtract %v3float %451 1 %461 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6
%461 = OpCompositeExtract %v3float %452 1 %458 = OpCompositeConstruct %mat3v3float %459 %460 %461
%462 = OpFOrdEqual %v3bool %460 %461 %462 = OpCompositeExtract %v3float %457 0
%463 = OpAll %bool %462 %463 = OpCompositeExtract %v3float %458 0
%464 = OpLogicalAnd %bool %459 %463 %464 = OpFOrdEqual %v3bool %462 %463
%465 = OpCompositeExtract %v3float %451 2 %465 = OpAll %bool %464
%466 = OpCompositeExtract %v3float %452 2 %466 = OpCompositeExtract %v3float %457 1
%467 = OpFOrdEqual %v3bool %465 %466 %467 = OpCompositeExtract %v3float %458 1
%468 = OpAll %bool %467 %468 = OpFOrdEqual %v3bool %466 %467
%469 = OpLogicalAnd %bool %464 %468 %469 = OpAll %bool %468
OpBranch %435 %470 = OpLogicalAnd %bool %465 %469
%435 = OpLabel %471 = OpCompositeExtract %v3float %457 2
%470 = OpPhi %bool %false %408 %469 %434 %472 = OpCompositeExtract %v3float %458 2
OpStore %_0_ok %470 %473 = OpFOrdEqual %v3bool %471 %472
%471 = OpLoad %bool %_0_ok %474 = OpAll %bool %473
OpSelectionMerge %473 None %475 = OpLogicalAnd %bool %470 %474
OpBranchConditional %471 %472 %473 OpBranch %441
%472 = OpLabel %441 = OpLabel
%475 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 %476 = OpPhi %bool %false %414 %475 %440
%476 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 OpStore %_0_ok %476
%477 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 %477 = OpLoad %bool %_0_ok
%474 = OpCompositeConstruct %mat3v3float %475 %476 %477 OpSelectionMerge %479 None
%478 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 OpBranchConditional %477 %478 %479
%479 = OpCompositeConstruct %mat3v3float %478 %478 %478 %478 = OpLabel
%480 = OpCompositeExtract %v3float %479 0 %481 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%481 = OpCompositeExtract %v3float %474 0 %482 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%482 = OpFSub %v3float %480 %481 %483 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%483 = OpCompositeExtract %v3float %479 1 %480 = OpCompositeConstruct %mat3v3float %481 %482 %483
%484 = OpCompositeExtract %v3float %474 1 %484 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4
%485 = OpFSub %v3float %483 %484 %485 = OpCompositeConstruct %mat3v3float %484 %484 %484
%486 = OpCompositeExtract %v3float %479 2 %486 = OpCompositeExtract %v3float %485 0
%487 = OpCompositeExtract %v3float %474 2 %487 = OpCompositeExtract %v3float %480 0
%488 = OpFSub %v3float %486 %487 %488 = OpFSub %v3float %486 %487
%489 = OpCompositeConstruct %mat3v3float %482 %485 %488 %489 = OpCompositeExtract %v3float %485 1
%491 = OpCompositeConstruct %v3float %float_2 %float_4 %float_4 %490 = OpCompositeExtract %v3float %480 1
%492 = OpCompositeConstruct %v3float %float_4 %float_2 %float_4 %491 = OpFSub %v3float %489 %490
%493 = OpCompositeConstruct %v3float %float_4 %float_4 %float_2 %492 = OpCompositeExtract %v3float %485 2
%490 = OpCompositeConstruct %mat3v3float %491 %492 %493 %493 = OpCompositeExtract %v3float %480 2
%494 = OpCompositeExtract %v3float %489 0 %494 = OpFSub %v3float %492 %493
%495 = OpCompositeExtract %v3float %490 0 %495 = OpCompositeConstruct %mat3v3float %488 %491 %494
%496 = OpFOrdEqual %v3bool %494 %495 %497 = OpCompositeConstruct %v3float %float_2 %float_4 %float_4
%497 = OpAll %bool %496 %498 = OpCompositeConstruct %v3float %float_4 %float_2 %float_4
%498 = OpCompositeExtract %v3float %489 1 %499 = OpCompositeConstruct %v3float %float_4 %float_4 %float_2
%499 = OpCompositeExtract %v3float %490 1 %496 = OpCompositeConstruct %mat3v3float %497 %498 %499
%500 = OpFOrdEqual %v3bool %498 %499 %500 = OpCompositeExtract %v3float %495 0
%501 = OpAll %bool %500 %501 = OpCompositeExtract %v3float %496 0
%502 = OpLogicalAnd %bool %497 %501 %502 = OpFOrdEqual %v3bool %500 %501
%503 = OpCompositeExtract %v3float %489 2 %503 = OpAll %bool %502
%504 = OpCompositeExtract %v3float %490 2 %504 = OpCompositeExtract %v3float %495 1
%505 = OpFOrdEqual %v3bool %503 %504 %505 = OpCompositeExtract %v3float %496 1
%506 = OpAll %bool %505 %506 = OpFOrdEqual %v3bool %504 %505
%507 = OpLogicalAnd %bool %502 %506 %507 = OpAll %bool %506
OpBranch %473 %508 = OpLogicalAnd %bool %503 %507
%473 = OpLabel %509 = OpCompositeExtract %v3float %495 2
%508 = OpPhi %bool %false %435 %507 %472 %510 = OpCompositeExtract %v3float %496 2
OpStore %_0_ok %508 %511 = OpFOrdEqual %v3bool %509 %510
%509 = OpLoad %bool %_0_ok %512 = OpAll %bool %511
OpSelectionMerge %511 None %513 = OpLogicalAnd %bool %508 %512
OpBranchConditional %509 %510 %511 OpBranch %479
%510 = OpLabel %479 = OpLabel
%513 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 %514 = OpPhi %bool %false %441 %513 %478
%514 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 OpStore %_0_ok %514
%515 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 %515 = OpLoad %bool %_0_ok
%512 = OpCompositeConstruct %mat3v3float %513 %514 %515 OpSelectionMerge %517 None
%516 = OpMatrixTimesScalar %mat3v3float %512 %float_4 OpBranchConditional %515 %516 %517
%518 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0 %516 = OpLabel
%519 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0 %519 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0
%520 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8 %520 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0
%517 = OpCompositeConstruct %mat3v3float %518 %519 %520 %521 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2
%521 = OpCompositeExtract %v3float %516 0 %518 = OpCompositeConstruct %mat3v3float %519 %520 %521
%522 = OpCompositeExtract %v3float %517 0 %522 = OpMatrixTimesScalar %mat3v3float %518 %float_4
%523 = OpFOrdEqual %v3bool %521 %522 %524 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0
%524 = OpAll %bool %523 %525 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0
%525 = OpCompositeExtract %v3float %516 1 %526 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8
%526 = OpCompositeExtract %v3float %517 1 %523 = OpCompositeConstruct %mat3v3float %524 %525 %526
%527 = OpFOrdEqual %v3bool %525 %526 %527 = OpCompositeExtract %v3float %522 0
%528 = OpAll %bool %527 %528 = OpCompositeExtract %v3float %523 0
%529 = OpLogicalAnd %bool %524 %528 %529 = OpFOrdEqual %v3bool %527 %528
%530 = OpCompositeExtract %v3float %516 2 %530 = OpAll %bool %529
%531 = OpCompositeExtract %v3float %517 2 %531 = OpCompositeExtract %v3float %522 1
%532 = OpFOrdEqual %v3bool %530 %531 %532 = OpCompositeExtract %v3float %523 1
%533 = OpAll %bool %532 %533 = OpFOrdEqual %v3bool %531 %532
%534 = OpLogicalAnd %bool %529 %533 %534 = OpAll %bool %533
OpBranch %511 %535 = OpLogicalAnd %bool %530 %534
%511 = OpLabel %536 = OpCompositeExtract %v3float %522 2
%535 = OpPhi %bool %false %473 %534 %510 %537 = OpCompositeExtract %v3float %523 2
OpStore %_0_ok %535 %538 = OpFOrdEqual %v3bool %536 %537
%536 = OpLoad %bool %_0_ok %539 = OpAll %bool %538
OpSelectionMerge %538 None %540 = OpLogicalAnd %bool %535 %539
OpBranchConditional %536 %537 %538 OpBranch %517
%537 = OpLabel %517 = OpLabel
%540 = OpCompositeConstruct %v2float %float_2 %float_2 %541 = OpPhi %bool %false %479 %540 %516
%541 = OpCompositeConstruct %v2float %float_2 %float_2 OpStore %_0_ok %541
%539 = OpCompositeConstruct %mat2v2float %540 %541 %542 = OpLoad %bool %_0_ok
%542 = OpCompositeConstruct %v2float %float_4 %float_4 OpSelectionMerge %544 None
%543 = OpCompositeConstruct %mat2v2float %542 %542 OpBranchConditional %542 %543 %544
%544 = OpFDiv %mat2v2float %543 %539 %543 = OpLabel
%546 = OpCompositeConstruct %v2float %float_2 %float_2 %546 = OpCompositeConstruct %v2float %float_2 %float_2
%547 = OpCompositeConstruct %v2float %float_2 %float_2 %547 = OpCompositeConstruct %v2float %float_2 %float_2
%545 = OpCompositeConstruct %mat2v2float %546 %547 %545 = OpCompositeConstruct %mat2v2float %546 %547
%548 = OpCompositeExtract %v2float %544 0 %548 = OpCompositeConstruct %v2float %float_4 %float_4
%549 = OpCompositeExtract %v2float %545 0 %549 = OpCompositeConstruct %mat2v2float %548 %548
%550 = OpFOrdEqual %v2bool %548 %549 %550 = OpCompositeExtract %v2float %549 0
%551 = OpAll %bool %550 %551 = OpCompositeExtract %v2float %545 0
%552 = OpCompositeExtract %v2float %544 1 %552 = OpFDiv %v2float %550 %551
%553 = OpCompositeExtract %v2float %545 1 %553 = OpCompositeExtract %v2float %549 1
%554 = OpFOrdEqual %v2bool %552 %553 %554 = OpCompositeExtract %v2float %545 1
%555 = OpAll %bool %554 %555 = OpFDiv %v2float %553 %554
%556 = OpLogicalAnd %bool %551 %555 %556 = OpCompositeConstruct %mat2v2float %552 %555
OpBranch %538 %558 = OpCompositeConstruct %v2float %float_2 %float_2
%538 = OpLabel %559 = OpCompositeConstruct %v2float %float_2 %float_2
%557 = OpPhi %bool %false %511 %556 %537 %557 = OpCompositeConstruct %mat2v2float %558 %559
OpStore %_0_ok %557 %560 = OpCompositeExtract %v2float %556 0
%558 = OpLoad %bool %_0_ok %561 = OpCompositeExtract %v2float %557 0
OpSelectionMerge %560 None %562 = OpFOrdEqual %v2bool %560 %561
OpBranchConditional %558 %559 %560 %563 = OpAll %bool %562
%559 = OpLabel %564 = OpCompositeExtract %v2float %556 1
%561 = OpFunctionCall %bool %test_half_b %565 = OpCompositeExtract %v2float %557 1
OpBranch %560 %566 = OpFOrdEqual %v2bool %564 %565
%560 = OpLabel %567 = OpAll %bool %566
%562 = OpPhi %bool %false %538 %561 %559 %568 = OpLogicalAnd %bool %563 %567
OpSelectionMerge %567 None OpBranch %544
OpBranchConditional %562 %565 %566 %544 = OpLabel
%565 = OpLabel %569 = OpPhi %bool %false %517 %568 %543
%568 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0 OpStore %_0_ok %569
%572 = OpLoad %v4float %568 %570 = OpLoad %bool %_0_ok
OpStore %563 %572 OpSelectionMerge %572 None
OpBranch %567 OpBranchConditional %570 %571 %572
%566 = OpLabel %571 = OpLabel
%573 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1 %573 = OpFunctionCall %bool %test_half_b
%575 = OpLoad %v4float %573 OpBranch %572
OpStore %563 %575 %572 = OpLabel
OpBranch %567 %574 = OpPhi %bool %false %544 %573 %571
%567 = OpLabel OpSelectionMerge %579 None
%576 = OpLoad %v4float %563 OpBranchConditional %574 %577 %578
OpReturnValue %576 %577 = OpLabel
%580 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
%584 = OpLoad %v4float %580
OpStore %575 %584
OpBranch %579
%578 = OpLabel
%585 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
%587 = OpLoad %v4float %585
OpStore %575 %587
OpBranch %579
%579 = OpLabel
%588 = OpLoad %v4float %575
OpReturnValue %588
OpFunctionEnd OpFunctionEnd
1 error