From a91bf055eadde278912010b2ef69956de967cf1c Mon Sep 17 00:00:00 2001 From: John Stiles Date: Mon, 17 May 2021 09:34:03 -0400 Subject: [PATCH] Add support for matrix-scalar operations in SPIR-V. Multiplication is handled just as before. Ops other than multiplication are handled by splatting the scalar into a matrix, then performing the op as a componentwise matrix-op-matrix binary expression. Change-Id: I654715c45bf5c91b8e9660fdf1c1c6d6818b621a Bug: skia:11985 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/408637 Commit-Queue: John Stiles Auto-Submit: John Stiles Reviewed-by: Ethan Nicholas --- resources/sksl/shared/MatricesNonsquare.sksl | 16 + src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp | 75 +- src/sksl/codegen/SkSLSPIRVCodeGenerator.h | 2 + tests/sksl/shared/MatricesNonsquare.asm.frag | 678 ++++++---- tests/sksl/shared/MatricesNonsquare.glsl | 8 + tests/sksl/shared/MatricesNonsquare.metal | 8 + tests/sksl/spirv/MatrixScalarSplat.asm.frag | 1225 ++++++++++-------- 7 files changed, 1209 insertions(+), 803 deletions(-) diff --git a/resources/sksl/shared/MatricesNonsquare.sksl b/resources/sksl/shared/MatricesNonsquare.sksl index 1d7d042179..b3d4f9e54c 100644 --- a/resources/sksl/shared/MatricesNonsquare.sksl +++ b/resources/sksl/shared/MatricesNonsquare.sksl @@ -33,6 +33,14 @@ bool test_float() { float3x3 m33 = m43 * m34; ok = ok && (m33 == float3x3(7 * 5)); float4x4 m44 = m24 * m42; + + m23 += 1; + ok = ok && (m23 == float2x3(3, 1, 1, + 1, 3, 1)); + m32 -= 2; + ok = ok && (m32 == float3x2(2, -2, + -2, 2, + -2, -2)); return ok; } @@ -69,6 +77,14 @@ bool test_half() { half3x3 m33 = m43 * m34; ok = ok && (m33 == half3x3(7 * 5)); half4x4 m44 = m24 * m42; + + m23 += 1; + ok = ok && (m23 == half2x3(3, 1, 1, + 1, 3, 1)); + m32 -= 2; + ok = ok && (m32 == half3x2(2, -2, + -2, 2, + -2, -2)); return ok; } diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp index e14e4eb117..3e38ccb85d 100644 --- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp +++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp @@ -2296,6 +2296,21 @@ SpvId SPIRVCodeGenerator::writeReciprocal(const Type& type, SpvId value, OutputS return reciprocal; } +SpvId SPIRVCodeGenerator::writeScalarToMatrixSplat(const Type& matrixType, + SpvId scalarId, + OutputStream& out) { + // Splat the scalar into a vector. + const Type& vectorType = matrixType.componentType().toCompound(fContext, + /*columns=*/matrixType.rows(), + /*rows=*/1); + std::vector vecArguments(/*count*/ matrixType.rows(), /*value*/ scalarId); + SpvId vectorId = this->writeComposite(vecArguments, vectorType, out); + + // Splat the vector into a matrix. + std::vector matArguments(/*count*/ matrixType.columns(), /*value*/ vectorId); + return this->writeComposite(matArguments, matrixType, out); +} + SpvId SPIRVCodeGenerator::writeBinaryExpression(const Type& leftType, SpvId lhs, Operator op, const Type& rightType, SpvId rhs, const Type& resultType, OutputStream& out) { @@ -2357,29 +2372,57 @@ SpvId SPIRVCodeGenerator::writeBinaryExpression(const Type& leftType, SpvId lhs, lhs = vec; operandType = &rightType; } else if (leftType.isMatrix()) { - SpvOp_ spvop; - if (rightType.isMatrix()) { - spvop = SpvOpMatrixTimesMatrix; - } else if (rightType.isVector()) { - spvop = SpvOpMatrixTimesVector; + if (op.kind() == Token::Kind::TK_STAR) { + // Matrix-times-vector and matrix-times-scalar have dedicated ops in SPIR-V. + SpvOp_ spvop; + if (rightType.isMatrix()) { + spvop = SpvOpMatrixTimesMatrix; + } else if (rightType.isVector()) { + spvop = SpvOpMatrixTimesVector; + } else { + SkASSERT(rightType.isScalar()); + spvop = SpvOpMatrixTimesScalar; + } + SpvId result = this->nextId(&resultType); + this->writeInstruction(spvop, this->getType(resultType), result, lhs, rhs, out); + return result; } else { + // Matrix-op-vector is not supported in GLSL/SkSL for non-multiplication ops; we + // expect to have a scalar here. SkASSERT(rightType.isScalar()); - spvop = SpvOpMatrixTimesScalar; + + // Splat rhs across an entire matrix so we can reuse the matrix-op-matrix path. + SpvId rhsMatrix = this->writeScalarToMatrixSplat(leftType, rhs, out); + + // Perform this operation as matrix-op-matrix. + return this->writeBinaryExpression(leftType, lhs, op, leftType, rhsMatrix, + resultType, out); } - SpvId result = this->nextId(&resultType); - this->writeInstruction(spvop, this->getType(resultType), result, lhs, rhs, out); - return result; } else if (rightType.isMatrix()) { - SpvId result = this->nextId(&resultType); - if (leftType.isVector()) { - this->writeInstruction(SpvOpVectorTimesMatrix, this->getType(resultType), result, - lhs, rhs, out); + if (op.kind() == Token::Kind::TK_STAR) { + // Matrix-times-vector and matrix-times-scalar have dedicated ops in SPIR-V. + SpvId result = this->nextId(&resultType); + if (leftType.isVector()) { + this->writeInstruction(SpvOpVectorTimesMatrix, this->getType(resultType), + result, lhs, rhs, out); + } else { + SkASSERT(leftType.isScalar()); + this->writeInstruction(SpvOpMatrixTimesScalar, this->getType(resultType), + result, rhs, lhs, out); + } + return result; } else { + // Vector-op-matrix is not supported in GLSL/SkSL for non-multiplication ops; we + // expect to have a scalar here. SkASSERT(leftType.isScalar()); - this->writeInstruction(SpvOpMatrixTimesScalar, this->getType(resultType), result, - rhs, lhs, out); + + // Splat lhs across an entire matrix so we can reuse the matrix-op-matrix path. + SpvId lhsMatrix = this->writeScalarToMatrixSplat(rightType, lhs, out); + + // Perform this operation as matrix-op-matrix. + return this->writeBinaryExpression(rightType, lhsMatrix, op, rightType, rhs, + resultType, out); } - return result; } else { fErrors.error(leftType.fOffset, "unsupported mixed-type expression"); return -1; diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.h b/src/sksl/codegen/SkSLSPIRVCodeGenerator.h index 1623272a6a..d0f6ceca13 100644 --- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.h +++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.h @@ -249,6 +249,8 @@ private: SpvId writeConstantVector(const AnyConstructor& c); + SpvId writeScalarToMatrixSplat(const Type& matrixType, SpvId scalarId, OutputStream& out); + SpvId writeFloatConstructor(const AnyConstructor& c, OutputStream& out); SpvId castScalarToFloat(SpvId inputId, const Type& inputType, const Type& outputType, diff --git a/tests/sksl/shared/MatricesNonsquare.asm.frag b/tests/sksl/shared/MatricesNonsquare.asm.frag index 4212b841ec..1c99f1a360 100644 --- a/tests/sksl/shared/MatricesNonsquare.asm.frag +++ b/tests/sksl/shared/MatricesNonsquare.asm.frag @@ -111,17 +111,53 @@ OpDecorate %218 RelaxedPrecision OpDecorate %219 RelaxedPrecision OpDecorate %220 RelaxedPrecision OpDecorate %236 RelaxedPrecision +OpDecorate %238 RelaxedPrecision +OpDecorate %239 RelaxedPrecision +OpDecorate %240 RelaxedPrecision +OpDecorate %241 RelaxedPrecision +OpDecorate %242 RelaxedPrecision +OpDecorate %243 RelaxedPrecision +OpDecorate %244 RelaxedPrecision OpDecorate %245 RelaxedPrecision +OpDecorate %246 RelaxedPrecision +OpDecorate %247 RelaxedPrecision +OpDecorate %250 RelaxedPrecision +OpDecorate %251 RelaxedPrecision +OpDecorate %252 RelaxedPrecision +OpDecorate %253 RelaxedPrecision +OpDecorate %264 RelaxedPrecision +OpDecorate %265 RelaxedPrecision OpDecorate %266 RelaxedPrecision -OpDecorate %288 RelaxedPrecision -OpDecorate %316 RelaxedPrecision -OpDecorate %345 RelaxedPrecision -OpDecorate %378 RelaxedPrecision -OpDecorate %399 RelaxedPrecision -OpDecorate %422 RelaxedPrecision -OpDecorate %436 RelaxedPrecision -OpDecorate %439 RelaxedPrecision -OpDecorate %440 RelaxedPrecision +OpDecorate %267 RelaxedPrecision +OpDecorate %268 RelaxedPrecision +OpDecorate %269 RelaxedPrecision +OpDecorate %270 RelaxedPrecision +OpDecorate %271 RelaxedPrecision +OpDecorate %272 RelaxedPrecision +OpDecorate %273 RelaxedPrecision +OpDecorate %274 RelaxedPrecision +OpDecorate %275 RelaxedPrecision +OpDecorate %276 RelaxedPrecision +OpDecorate %277 RelaxedPrecision +OpDecorate %280 RelaxedPrecision +OpDecorate %282 RelaxedPrecision +OpDecorate %283 RelaxedPrecision +OpDecorate %284 RelaxedPrecision +OpDecorate %285 RelaxedPrecision +OpDecorate %301 RelaxedPrecision +OpDecorate %310 RelaxedPrecision +OpDecorate %331 RelaxedPrecision +OpDecorate %353 RelaxedPrecision +OpDecorate %381 RelaxedPrecision +OpDecorate %410 RelaxedPrecision +OpDecorate %443 RelaxedPrecision +OpDecorate %464 RelaxedPrecision +OpDecorate %497 RelaxedPrecision +OpDecorate %527 RelaxedPrecision +OpDecorate %550 RelaxedPrecision +OpDecorate %564 RelaxedPrecision +OpDecorate %567 RelaxedPrecision +OpDecorate %568 RelaxedPrecision %float = OpTypeFloat 32 %v4float = OpTypeVector %float 4 %_ptr_Output_v4float = OpTypePointer Output %v4float @@ -167,7 +203,9 @@ OpDecorate %440 RelaxedPrecision %mat3v3float = OpTypeMatrix %v3float 3 %_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float %float_35 = OpConstant %float 35 -%237 = OpTypeFunction %v4float %_ptr_Function_v2float +%float_1 = OpConstant %float 1 +%float_n2 = OpConstant %float -2 +%302 = OpTypeFunction %v4float %_ptr_Function_v2float %_ptr_Function_v4float = OpTypePointer Function %v4float %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float %int = OpTypeInt 32 1 @@ -401,12 +439,85 @@ OpBranch %214 %214 = OpLabel %235 = OpPhi %bool %false %190 %234 %213 OpStore %ok %235 -%236 = OpLoad %bool %ok -OpReturnValue %236 +%236 = OpLoad %mat2v3float %m23 +%238 = OpCompositeConstruct %v3float %float_1 %float_1 %float_1 +%239 = OpCompositeConstruct %mat2v3float %238 %238 +%240 = OpCompositeExtract %v3float %236 0 +%241 = OpCompositeExtract %v3float %239 0 +%242 = OpFAdd %v3float %240 %241 +%243 = OpCompositeExtract %v3float %236 1 +%244 = OpCompositeExtract %v3float %239 1 +%245 = OpFAdd %v3float %243 %244 +%246 = OpCompositeConstruct %mat2v3float %242 %245 +OpStore %m23 %246 +%247 = OpLoad %bool %ok +OpSelectionMerge %249 None +OpBranchConditional %247 %248 %249 +%248 = OpLabel +%250 = OpLoad %mat2v3float %m23 +%252 = OpCompositeConstruct %v3float %float_3 %float_1 %float_1 +%253 = OpCompositeConstruct %v3float %float_1 %float_3 %float_1 +%251 = OpCompositeConstruct %mat2v3float %252 %253 +%254 = OpCompositeExtract %v3float %250 0 +%255 = OpCompositeExtract %v3float %251 0 +%256 = OpFOrdEqual %v3bool %254 %255 +%257 = OpAll %bool %256 +%258 = OpCompositeExtract %v3float %250 1 +%259 = OpCompositeExtract %v3float %251 1 +%260 = OpFOrdEqual %v3bool %258 %259 +%261 = OpAll %bool %260 +%262 = OpLogicalAnd %bool %257 %261 +OpBranch %249 +%249 = OpLabel +%263 = OpPhi %bool %false %214 %262 %248 +OpStore %ok %263 +%264 = OpLoad %mat3v2float %m32 +%265 = OpCompositeConstruct %v2float %float_2 %float_2 +%266 = OpCompositeConstruct %mat3v2float %265 %265 %265 +%267 = OpCompositeExtract %v2float %264 0 +%268 = OpCompositeExtract %v2float %266 0 +%269 = OpFSub %v2float %267 %268 +%270 = OpCompositeExtract %v2float %264 1 +%271 = OpCompositeExtract %v2float %266 1 +%272 = OpFSub %v2float %270 %271 +%273 = OpCompositeExtract %v2float %264 2 +%274 = OpCompositeExtract %v2float %266 2 +%275 = OpFSub %v2float %273 %274 +%276 = OpCompositeConstruct %mat3v2float %269 %272 %275 +OpStore %m32 %276 +%277 = OpLoad %bool %ok +OpSelectionMerge %279 None +OpBranchConditional %277 %278 %279 +%278 = OpLabel +%280 = OpLoad %mat3v2float %m32 +%283 = OpCompositeConstruct %v2float %float_2 %float_n2 +%284 = OpCompositeConstruct %v2float %float_n2 %float_2 +%285 = OpCompositeConstruct %v2float %float_n2 %float_n2 +%282 = OpCompositeConstruct %mat3v2float %283 %284 %285 +%286 = OpCompositeExtract %v2float %280 0 +%287 = OpCompositeExtract %v2float %282 0 +%288 = OpFOrdEqual %v2bool %286 %287 +%289 = OpAll %bool %288 +%290 = OpCompositeExtract %v2float %280 1 +%291 = OpCompositeExtract %v2float %282 1 +%292 = OpFOrdEqual %v2bool %290 %291 +%293 = OpAll %bool %292 +%294 = OpLogicalAnd %bool %289 %293 +%295 = OpCompositeExtract %v2float %280 2 +%296 = OpCompositeExtract %v2float %282 2 +%297 = OpFOrdEqual %v2bool %295 %296 +%298 = OpAll %bool %297 +%299 = OpLogicalAnd %bool %294 %298 +OpBranch %279 +%279 = OpLabel +%300 = OpPhi %bool %false %249 %299 %278 +OpStore %ok %300 +%301 = OpLoad %bool %ok +OpReturnValue %301 OpFunctionEnd -%main = OpFunction %v4float None %237 -%238 = OpFunctionParameter %_ptr_Function_v2float -%239 = OpLabel +%main = OpFunction %v4float None %302 +%303 = OpFunctionParameter %_ptr_Function_v2float +%304 = OpLabel %_0_ok = OpVariable %_ptr_Function_bool Function %_1_m23 = OpVariable %_ptr_Function_mat2v3float Function %_2_m24 = OpVariable %_ptr_Function_mat2v4float Function @@ -415,238 +526,311 @@ OpFunctionEnd %_6_m43 = OpVariable %_ptr_Function_mat4v3float Function %_7_m22 = OpVariable %_ptr_Function_mat2v2float Function %_8_m33 = OpVariable %_ptr_Function_mat3v3float Function -%427 = OpVariable %_ptr_Function_v4float Function +%555 = OpVariable %_ptr_Function_v4float Function OpStore %_0_ok %true -%243 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%244 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%242 = OpCompositeConstruct %mat2v3float %243 %244 -OpStore %_1_m23 %242 -%245 = OpLoad %bool %_0_ok -OpSelectionMerge %247 None -OpBranchConditional %245 %246 %247 -%246 = OpLabel -%248 = OpLoad %mat2v3float %_1_m23 -%250 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%251 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%249 = OpCompositeConstruct %mat2v3float %250 %251 -%252 = OpCompositeExtract %v3float %248 0 -%253 = OpCompositeExtract %v3float %249 0 -%254 = OpFOrdEqual %v3bool %252 %253 -%255 = OpAll %bool %254 -%256 = OpCompositeExtract %v3float %248 1 -%257 = OpCompositeExtract %v3float %249 1 -%258 = OpFOrdEqual %v3bool %256 %257 -%259 = OpAll %bool %258 -%260 = OpLogicalAnd %bool %255 %259 -OpBranch %247 -%247 = OpLabel -%261 = OpPhi %bool %false %239 %260 %246 -OpStore %_0_ok %261 -%264 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0 -%265 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0 -%263 = OpCompositeConstruct %mat2v4float %264 %265 -OpStore %_2_m24 %263 -%266 = OpLoad %bool %_0_ok -OpSelectionMerge %268 None -OpBranchConditional %266 %267 %268 -%267 = OpLabel -%269 = OpLoad %mat2v4float %_2_m24 -%271 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0 -%272 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0 -%270 = OpCompositeConstruct %mat2v4float %271 %272 -%273 = OpCompositeExtract %v4float %269 0 -%274 = OpCompositeExtract %v4float %270 0 -%275 = OpFOrdEqual %v4bool %273 %274 -%276 = OpAll %bool %275 -%277 = OpCompositeExtract %v4float %269 1 -%278 = OpCompositeExtract %v4float %270 1 -%279 = OpFOrdEqual %v4bool %277 %278 -%280 = OpAll %bool %279 -%281 = OpLogicalAnd %bool %276 %280 -OpBranch %268 -%268 = OpLabel -%282 = OpPhi %bool %false %247 %281 %267 -OpStore %_0_ok %282 -%285 = OpCompositeConstruct %v2float %float_4 %float_0 -%286 = OpCompositeConstruct %v2float %float_0 %float_4 -%287 = OpCompositeConstruct %v2float %float_0 %float_0 -%284 = OpCompositeConstruct %mat3v2float %285 %286 %287 -OpStore %_3_m32 %284 -%288 = OpLoad %bool %_0_ok -OpSelectionMerge %290 None -OpBranchConditional %288 %289 %290 -%289 = OpLabel -%291 = OpLoad %mat3v2float %_3_m32 -%293 = OpCompositeConstruct %v2float %float_4 %float_0 -%294 = OpCompositeConstruct %v2float %float_0 %float_4 -%295 = OpCompositeConstruct %v2float %float_0 %float_0 -%292 = OpCompositeConstruct %mat3v2float %293 %294 %295 -%296 = OpCompositeExtract %v2float %291 0 -%297 = OpCompositeExtract %v2float %292 0 -%298 = OpFOrdEqual %v2bool %296 %297 -%299 = OpAll %bool %298 -%300 = OpCompositeExtract %v2float %291 1 -%301 = OpCompositeExtract %v2float %292 1 -%302 = OpFOrdEqual %v2bool %300 %301 -%303 = OpAll %bool %302 -%304 = OpLogicalAnd %bool %299 %303 -%305 = OpCompositeExtract %v2float %291 2 -%306 = OpCompositeExtract %v2float %292 2 -%307 = OpFOrdEqual %v2bool %305 %306 -%308 = OpAll %bool %307 -%309 = OpLogicalAnd %bool %304 %308 -OpBranch %290 -%290 = OpLabel -%310 = OpPhi %bool %false %268 %309 %289 -OpStore %_0_ok %310 -%313 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0 -%314 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0 -%315 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0 -%312 = OpCompositeConstruct %mat3v4float %313 %314 %315 -OpStore %_4_m34 %312 -%316 = OpLoad %bool %_0_ok -OpSelectionMerge %318 None -OpBranchConditional %316 %317 %318 -%317 = OpLabel -%319 = OpLoad %mat3v4float %_4_m34 -%321 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0 -%322 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0 -%323 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0 -%320 = OpCompositeConstruct %mat3v4float %321 %322 %323 -%324 = OpCompositeExtract %v4float %319 0 -%325 = OpCompositeExtract %v4float %320 0 -%326 = OpFOrdEqual %v4bool %324 %325 -%327 = OpAll %bool %326 -%328 = OpCompositeExtract %v4float %319 1 -%329 = OpCompositeExtract %v4float %320 1 -%330 = OpFOrdEqual %v4bool %328 %329 -%331 = OpAll %bool %330 -%332 = OpLogicalAnd %bool %327 %331 -%333 = OpCompositeExtract %v4float %319 2 -%334 = OpCompositeExtract %v4float %320 2 -%335 = OpFOrdEqual %v4bool %333 %334 -%336 = OpAll %bool %335 -%337 = OpLogicalAnd %bool %332 %336 -OpBranch %318 -%318 = OpLabel -%338 = OpPhi %bool %false %290 %337 %317 -OpStore %_0_ok %338 -%341 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0 -%342 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0 -%343 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7 -%344 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0 -%340 = OpCompositeConstruct %mat4v3float %341 %342 %343 %344 -OpStore %_6_m43 %340 -%345 = OpLoad %bool %_0_ok -OpSelectionMerge %347 None -OpBranchConditional %345 %346 %347 -%346 = OpLabel -%348 = OpLoad %mat4v3float %_6_m43 -%350 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0 -%351 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0 -%352 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7 -%353 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0 -%349 = OpCompositeConstruct %mat4v3float %350 %351 %352 %353 -%354 = OpCompositeExtract %v3float %348 0 -%355 = OpCompositeExtract %v3float %349 0 -%356 = OpFOrdEqual %v3bool %354 %355 -%357 = OpAll %bool %356 -%358 = OpCompositeExtract %v3float %348 1 -%359 = OpCompositeExtract %v3float %349 1 -%360 = OpFOrdEqual %v3bool %358 %359 -%361 = OpAll %bool %360 -%362 = OpLogicalAnd %bool %357 %361 -%363 = OpCompositeExtract %v3float %348 2 -%364 = OpCompositeExtract %v3float %349 2 -%365 = OpFOrdEqual %v3bool %363 %364 -%366 = OpAll %bool %365 -%367 = OpLogicalAnd %bool %362 %366 -%368 = OpCompositeExtract %v3float %348 3 -%369 = OpCompositeExtract %v3float %349 3 -%370 = OpFOrdEqual %v3bool %368 %369 -%371 = OpAll %bool %370 -%372 = OpLogicalAnd %bool %367 %371 -OpBranch %347 -%347 = OpLabel -%373 = OpPhi %bool %false %318 %372 %346 -OpStore %_0_ok %373 -%375 = OpLoad %mat3v2float %_3_m32 -%376 = OpLoad %mat2v3float %_1_m23 -%377 = OpMatrixTimesMatrix %mat2v2float %375 %376 -OpStore %_7_m22 %377 -%378 = OpLoad %bool %_0_ok -OpSelectionMerge %380 None -OpBranchConditional %378 %379 %380 -%379 = OpLabel -%381 = OpLoad %mat2v2float %_7_m22 -%383 = OpCompositeConstruct %v2float %float_8 %float_0 -%384 = OpCompositeConstruct %v2float %float_0 %float_8 -%382 = OpCompositeConstruct %mat2v2float %383 %384 -%385 = OpCompositeExtract %v2float %381 0 -%386 = OpCompositeExtract %v2float %382 0 -%387 = OpFOrdEqual %v2bool %385 %386 -%388 = OpAll %bool %387 -%389 = OpCompositeExtract %v2float %381 1 -%390 = OpCompositeExtract %v2float %382 1 -%391 = OpFOrdEqual %v2bool %389 %390 +%308 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%309 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%307 = OpCompositeConstruct %mat2v3float %308 %309 +OpStore %_1_m23 %307 +%310 = OpLoad %bool %_0_ok +OpSelectionMerge %312 None +OpBranchConditional %310 %311 %312 +%311 = OpLabel +%313 = OpLoad %mat2v3float %_1_m23 +%315 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%316 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%314 = OpCompositeConstruct %mat2v3float %315 %316 +%317 = OpCompositeExtract %v3float %313 0 +%318 = OpCompositeExtract %v3float %314 0 +%319 = OpFOrdEqual %v3bool %317 %318 +%320 = OpAll %bool %319 +%321 = OpCompositeExtract %v3float %313 1 +%322 = OpCompositeExtract %v3float %314 1 +%323 = OpFOrdEqual %v3bool %321 %322 +%324 = OpAll %bool %323 +%325 = OpLogicalAnd %bool %320 %324 +OpBranch %312 +%312 = OpLabel +%326 = OpPhi %bool %false %304 %325 %311 +OpStore %_0_ok %326 +%329 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0 +%330 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0 +%328 = OpCompositeConstruct %mat2v4float %329 %330 +OpStore %_2_m24 %328 +%331 = OpLoad %bool %_0_ok +OpSelectionMerge %333 None +OpBranchConditional %331 %332 %333 +%332 = OpLabel +%334 = OpLoad %mat2v4float %_2_m24 +%336 = OpCompositeConstruct %v4float %float_3 %float_0 %float_0 %float_0 +%337 = OpCompositeConstruct %v4float %float_0 %float_3 %float_0 %float_0 +%335 = OpCompositeConstruct %mat2v4float %336 %337 +%338 = OpCompositeExtract %v4float %334 0 +%339 = OpCompositeExtract %v4float %335 0 +%340 = OpFOrdEqual %v4bool %338 %339 +%341 = OpAll %bool %340 +%342 = OpCompositeExtract %v4float %334 1 +%343 = OpCompositeExtract %v4float %335 1 +%344 = OpFOrdEqual %v4bool %342 %343 +%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 +%374 = OpLogicalAnd %bool %369 %373 +OpBranch %355 +%355 = OpLabel +%375 = OpPhi %bool %false %333 %374 %354 +OpStore %_0_ok %375 +%378 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0 +%379 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0 +%380 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0 +%377 = OpCompositeConstruct %mat3v4float %378 %379 %380 +OpStore %_4_m34 %377 +%381 = OpLoad %bool %_0_ok +OpSelectionMerge %383 None +OpBranchConditional %381 %382 %383 +%382 = OpLabel +%384 = OpLoad %mat3v4float %_4_m34 +%386 = OpCompositeConstruct %v4float %float_5 %float_0 %float_0 %float_0 +%387 = OpCompositeConstruct %v4float %float_0 %float_5 %float_0 %float_0 +%388 = OpCompositeConstruct %v4float %float_0 %float_0 %float_5 %float_0 +%385 = OpCompositeConstruct %mat3v4float %386 %387 %388 +%389 = OpCompositeExtract %v4float %384 0 +%390 = OpCompositeExtract %v4float %385 0 +%391 = OpFOrdEqual %v4bool %389 %390 %392 = OpAll %bool %391 -%393 = OpLogicalAnd %bool %388 %392 -OpBranch %380 -%380 = OpLabel -%394 = OpPhi %bool %false %347 %393 %379 -OpStore %_0_ok %394 -%396 = OpLoad %mat4v3float %_6_m43 -%397 = OpLoad %mat3v4float %_4_m34 -%398 = OpMatrixTimesMatrix %mat3v3float %396 %397 -OpStore %_8_m33 %398 -%399 = OpLoad %bool %_0_ok -OpSelectionMerge %401 None -OpBranchConditional %399 %400 %401 -%400 = OpLabel -%402 = OpLoad %mat3v3float %_8_m33 -%404 = OpCompositeConstruct %v3float %float_35 %float_0 %float_0 -%405 = OpCompositeConstruct %v3float %float_0 %float_35 %float_0 -%406 = OpCompositeConstruct %v3float %float_0 %float_0 %float_35 -%403 = OpCompositeConstruct %mat3v3float %404 %405 %406 -%407 = OpCompositeExtract %v3float %402 0 -%408 = OpCompositeExtract %v3float %403 0 -%409 = OpFOrdEqual %v3bool %407 %408 -%410 = OpAll %bool %409 -%411 = OpCompositeExtract %v3float %402 1 -%412 = OpCompositeExtract %v3float %403 1 -%413 = OpFOrdEqual %v3bool %411 %412 -%414 = OpAll %bool %413 -%415 = OpLogicalAnd %bool %410 %414 -%416 = OpCompositeExtract %v3float %402 2 -%417 = OpCompositeExtract %v3float %403 2 -%418 = OpFOrdEqual %v3bool %416 %417 -%419 = OpAll %bool %418 -%420 = OpLogicalAnd %bool %415 %419 -OpBranch %401 -%401 = OpLabel -%421 = OpPhi %bool %false %380 %420 %400 -OpStore %_0_ok %421 -%422 = OpLoad %bool %_0_ok -OpSelectionMerge %424 None -OpBranchConditional %422 %423 %424 -%423 = OpLabel -%425 = OpFunctionCall %bool %test_half_b -OpBranch %424 -%424 = OpLabel -%426 = OpPhi %bool %false %401 %425 %423 -OpSelectionMerge %431 None -OpBranchConditional %426 %429 %430 -%429 = OpLabel -%432 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0 -%436 = OpLoad %v4float %432 -OpStore %427 %436 -OpBranch %431 -%430 = OpLabel -%437 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1 -%439 = OpLoad %v4float %437 -OpStore %427 %439 -OpBranch %431 -%431 = OpLabel -%440 = OpLoad %v4float %427 -OpReturnValue %440 +%393 = OpCompositeExtract %v4float %384 1 +%394 = OpCompositeExtract %v4float %385 1 +%395 = OpFOrdEqual %v4bool %393 %394 +%396 = OpAll %bool %395 +%397 = OpLogicalAnd %bool %392 %396 +%398 = OpCompositeExtract %v4float %384 2 +%399 = OpCompositeExtract %v4float %385 2 +%400 = OpFOrdEqual %v4bool %398 %399 +%401 = OpAll %bool %400 +%402 = OpLogicalAnd %bool %397 %401 +OpBranch %383 +%383 = OpLabel +%403 = OpPhi %bool %false %355 %402 %382 +OpStore %_0_ok %403 +%406 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0 +%407 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0 +%408 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7 +%409 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0 +%405 = OpCompositeConstruct %mat4v3float %406 %407 %408 %409 +OpStore %_6_m43 %405 +%410 = OpLoad %bool %_0_ok +OpSelectionMerge %412 None +OpBranchConditional %410 %411 %412 +%411 = OpLabel +%413 = OpLoad %mat4v3float %_6_m43 +%415 = OpCompositeConstruct %v3float %float_7 %float_0 %float_0 +%416 = OpCompositeConstruct %v3float %float_0 %float_7 %float_0 +%417 = OpCompositeConstruct %v3float %float_0 %float_0 %float_7 +%418 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0 +%414 = OpCompositeConstruct %mat4v3float %415 %416 %417 %418 +%419 = OpCompositeExtract %v3float %413 0 +%420 = OpCompositeExtract %v3float %414 0 +%421 = OpFOrdEqual %v3bool %419 %420 +%422 = OpAll %bool %421 +%423 = OpCompositeExtract %v3float %413 1 +%424 = OpCompositeExtract %v3float %414 1 +%425 = OpFOrdEqual %v3bool %423 %424 +%426 = OpAll %bool %425 +%427 = OpLogicalAnd %bool %422 %426 +%428 = OpCompositeExtract %v3float %413 2 +%429 = OpCompositeExtract %v3float %414 2 +%430 = OpFOrdEqual %v3bool %428 %429 +%431 = OpAll %bool %430 +%432 = OpLogicalAnd %bool %427 %431 +%433 = OpCompositeExtract %v3float %413 3 +%434 = OpCompositeExtract %v3float %414 3 +%435 = OpFOrdEqual %v3bool %433 %434 +%436 = OpAll %bool %435 +%437 = OpLogicalAnd %bool %432 %436 +OpBranch %412 +%412 = OpLabel +%438 = OpPhi %bool %false %383 %437 %411 +OpStore %_0_ok %438 +%440 = OpLoad %mat3v2float %_3_m32 +%441 = OpLoad %mat2v3float %_1_m23 +%442 = OpMatrixTimesMatrix %mat2v2float %440 %441 +OpStore %_7_m22 %442 +%443 = OpLoad %bool %_0_ok +OpSelectionMerge %445 None +OpBranchConditional %443 %444 %445 +%444 = OpLabel +%446 = OpLoad %mat2v2float %_7_m22 +%448 = OpCompositeConstruct %v2float %float_8 %float_0 +%449 = OpCompositeConstruct %v2float %float_0 %float_8 +%447 = OpCompositeConstruct %mat2v2float %448 %449 +%450 = OpCompositeExtract %v2float %446 0 +%451 = OpCompositeExtract %v2float %447 0 +%452 = OpFOrdEqual %v2bool %450 %451 +%453 = OpAll %bool %452 +%454 = OpCompositeExtract %v2float %446 1 +%455 = OpCompositeExtract %v2float %447 1 +%456 = OpFOrdEqual %v2bool %454 %455 +%457 = OpAll %bool %456 +%458 = OpLogicalAnd %bool %453 %457 +OpBranch %445 +%445 = OpLabel +%459 = OpPhi %bool %false %412 %458 %444 +OpStore %_0_ok %459 +%461 = OpLoad %mat4v3float %_6_m43 +%462 = OpLoad %mat3v4float %_4_m34 +%463 = OpMatrixTimesMatrix %mat3v3float %461 %462 +OpStore %_8_m33 %463 +%464 = OpLoad %bool %_0_ok +OpSelectionMerge %466 None +OpBranchConditional %464 %465 %466 +%465 = OpLabel +%467 = OpLoad %mat3v3float %_8_m33 +%469 = OpCompositeConstruct %v3float %float_35 %float_0 %float_0 +%470 = OpCompositeConstruct %v3float %float_0 %float_35 %float_0 +%471 = OpCompositeConstruct %v3float %float_0 %float_0 %float_35 +%468 = OpCompositeConstruct %mat3v3float %469 %470 %471 +%472 = OpCompositeExtract %v3float %467 0 +%473 = OpCompositeExtract %v3float %468 0 +%474 = OpFOrdEqual %v3bool %472 %473 +%475 = OpAll %bool %474 +%476 = OpCompositeExtract %v3float %467 1 +%477 = OpCompositeExtract %v3float %468 1 +%478 = OpFOrdEqual %v3bool %476 %477 +%479 = OpAll %bool %478 +%480 = OpLogicalAnd %bool %475 %479 +%481 = OpCompositeExtract %v3float %467 2 +%482 = OpCompositeExtract %v3float %468 2 +%483 = OpFOrdEqual %v3bool %481 %482 +%484 = OpAll %bool %483 +%485 = OpLogicalAnd %bool %480 %484 +OpBranch %466 +%466 = OpLabel +%486 = OpPhi %bool %false %445 %485 %465 +OpStore %_0_ok %486 +%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 +%507 = OpAll %bool %506 +%508 = OpCompositeExtract %v3float %500 1 +%509 = OpCompositeExtract %v3float %501 1 +%510 = OpFOrdEqual %v3bool %508 %509 +%511 = OpAll %bool %510 +%512 = OpLogicalAnd %bool %507 %511 +OpBranch %499 +%499 = OpLabel +%513 = OpPhi %bool %false %466 %512 %498 +OpStore %_0_ok %513 +%514 = OpLoad %mat3v2float %_3_m32 +%515 = OpCompositeConstruct %v2float %float_2 %float_2 +%516 = OpCompositeConstruct %mat3v2float %515 %515 %515 +%517 = OpCompositeExtract %v2float %514 0 +%518 = OpCompositeExtract %v2float %516 0 +%519 = OpFSub %v2float %517 %518 +%520 = OpCompositeExtract %v2float %514 1 +%521 = OpCompositeExtract %v2float %516 1 +%522 = OpFSub %v2float %520 %521 +%523 = OpCompositeExtract %v2float %514 2 +%524 = OpCompositeExtract %v2float %516 2 +%525 = OpFSub %v2float %523 %524 +%526 = OpCompositeConstruct %mat3v2float %519 %522 %525 +OpStore %_3_m32 %526 +%527 = OpLoad %bool %_0_ok +OpSelectionMerge %529 None +OpBranchConditional %527 %528 %529 +%528 = OpLabel +%530 = OpLoad %mat3v2float %_3_m32 +%532 = OpCompositeConstruct %v2float %float_2 %float_n2 +%533 = OpCompositeConstruct %v2float %float_n2 %float_2 +%534 = OpCompositeConstruct %v2float %float_n2 %float_n2 +%531 = OpCompositeConstruct %mat3v2float %532 %533 %534 +%535 = OpCompositeExtract %v2float %530 0 +%536 = OpCompositeExtract %v2float %531 0 +%537 = OpFOrdEqual %v2bool %535 %536 +%538 = OpAll %bool %537 +%539 = OpCompositeExtract %v2float %530 1 +%540 = OpCompositeExtract %v2float %531 1 +%541 = OpFOrdEqual %v2bool %539 %540 +%542 = OpAll %bool %541 +%543 = OpLogicalAnd %bool %538 %542 +%544 = OpCompositeExtract %v2float %530 2 +%545 = OpCompositeExtract %v2float %531 2 +%546 = OpFOrdEqual %v2bool %544 %545 +%547 = OpAll %bool %546 +%548 = OpLogicalAnd %bool %543 %547 +OpBranch %529 +%529 = OpLabel +%549 = OpPhi %bool %false %499 %548 %528 +OpStore %_0_ok %549 +%550 = OpLoad %bool %_0_ok +OpSelectionMerge %552 None +OpBranchConditional %550 %551 %552 +%551 = OpLabel +%553 = OpFunctionCall %bool %test_half_b +OpBranch %552 +%552 = OpLabel +%554 = OpPhi %bool %false %529 %553 %551 +OpSelectionMerge %559 None +OpBranchConditional %554 %557 %558 +%557 = OpLabel +%560 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0 +%564 = OpLoad %v4float %560 +OpStore %555 %564 +OpBranch %559 +%558 = OpLabel +%565 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1 +%567 = OpLoad %v4float %565 +OpStore %555 %567 +OpBranch %559 +%559 = OpLabel +%568 = OpLoad %v4float %555 +OpReturnValue %568 OpFunctionEnd diff --git a/tests/sksl/shared/MatricesNonsquare.glsl b/tests/sksl/shared/MatricesNonsquare.glsl index aaee40382e..b11333b52e 100644 --- a/tests/sksl/shared/MatricesNonsquare.glsl +++ b/tests/sksl/shared/MatricesNonsquare.glsl @@ -18,6 +18,10 @@ bool test_half_b() { ok = ok && m22 == mat2(8.0); mat3 m33 = m43 * m34; ok = ok && m33 == mat3(35.0); + m23 += 1.0; + ok = ok && m23 == mat2x3(3.0, 1.0, 1.0, 1.0, 3.0, 1.0); + m32 -= 2.0; + ok = ok && m32 == mat3x2(2.0, -2.0, -2.0, 2.0, -2.0, -2.0); return ok; } vec4 main() { @@ -36,5 +40,9 @@ vec4 main() { _0_ok = _0_ok && _7_m22 == mat2(8.0); mat3 _8_m33 = _6_m43 * _4_m34; _0_ok = _0_ok && _8_m33 == mat3(35.0); + _1_m23 += 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; + _0_ok = _0_ok && _3_m32 == mat3x2(2.0, -2.0, -2.0, 2.0, -2.0, -2.0); return _0_ok && test_half_b() ? colorGreen : colorRed; } diff --git a/tests/sksl/shared/MatricesNonsquare.metal b/tests/sksl/shared/MatricesNonsquare.metal index 64e3318a31..ec56ce3dd6 100644 --- a/tests/sksl/shared/MatricesNonsquare.metal +++ b/tests/sksl/shared/MatricesNonsquare.metal @@ -80,6 +80,10 @@ bool test_half_b() { ok = ok && m22 == float2x2(8.0); float3x3 m33 = m43 * m34; ok = ok && m33 == float3x3(35.0); + m23 += (float2x3(1.0, 1.0, 1.0, 1.0, 1.0, 1.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); + ok = ok && m32 == float3x2(float2(2.0, -2.0), float2(-2.0, 2.0), float2(-2.0, -2.0)); return ok; } fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) { @@ -100,6 +104,10 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _unifo _0_ok = _0_ok && _7_m22 == float2x2(8.0); float3x3 _8_m33 = _6_m43 * _4_m34; _0_ok = _0_ok && _8_m33 == float3x3(35.0); + _1_m23 += (float2x3(1.0, 1.0, 1.0, 1.0, 1.0, 1.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); + _0_ok = _0_ok && _3_m32 == float3x2(float2(2.0, -2.0), float2(-2.0, 2.0), float2(-2.0, -2.0)); _out.sk_FragColor = _0_ok && test_half_b() ? _uniforms.colorGreen : _uniforms.colorRed; return _out; } diff --git a/tests/sksl/spirv/MatrixScalarSplat.asm.frag b/tests/sksl/spirv/MatrixScalarSplat.asm.frag index 84ed3c336f..b59b4cae61 100644 --- a/tests/sksl/spirv/MatrixScalarSplat.asm.frag +++ b/tests/sksl/spirv/MatrixScalarSplat.asm.frag @@ -1,3 +1,8 @@ +### Compilation failed: + +error: SPIR-V validation error: Expected floating scalar or vector type as Result Type: FDiv + %283 = OpFDiv %mat2v2float %282 %277 + OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -30,51 +35,68 @@ OpDecorate %36 RelaxedPrecision OpDecorate %37 RelaxedPrecision OpDecorate %38 RelaxedPrecision OpDecorate %41 RelaxedPrecision +OpDecorate %42 RelaxedPrecision OpDecorate %43 RelaxedPrecision OpDecorate %44 RelaxedPrecision OpDecorate %45 RelaxedPrecision OpDecorate %46 RelaxedPrecision -OpDecorate %63 RelaxedPrecision -OpDecorate %66 RelaxedPrecision -OpDecorate %67 RelaxedPrecision -OpDecorate %68 RelaxedPrecision -OpDecorate %69 RelaxedPrecision -OpDecorate %70 RelaxedPrecision -OpDecorate %73 RelaxedPrecision +OpDecorate %47 RelaxedPrecision +OpDecorate %48 RelaxedPrecision +OpDecorate %49 RelaxedPrecision +OpDecorate %50 RelaxedPrecision +OpDecorate %51 RelaxedPrecision +OpDecorate %52 RelaxedPrecision +OpDecorate %54 RelaxedPrecision +OpDecorate %55 RelaxedPrecision +OpDecorate %56 RelaxedPrecision +OpDecorate %57 RelaxedPrecision OpDecorate %74 RelaxedPrecision -OpDecorate %75 RelaxedPrecision -OpDecorate %76 RelaxedPrecision +OpDecorate %77 RelaxedPrecision +OpDecorate %78 RelaxedPrecision +OpDecorate %79 RelaxedPrecision +OpDecorate %80 RelaxedPrecision +OpDecorate %81 RelaxedPrecision +OpDecorate %82 RelaxedPrecision +OpDecorate %83 RelaxedPrecision +OpDecorate %84 RelaxedPrecision +OpDecorate %85 RelaxedPrecision +OpDecorate %86 RelaxedPrecision +OpDecorate %87 RelaxedPrecision +OpDecorate %88 RelaxedPrecision +OpDecorate %89 RelaxedPrecision +OpDecorate %90 RelaxedPrecision +OpDecorate %91 RelaxedPrecision OpDecorate %92 RelaxedPrecision OpDecorate %95 RelaxedPrecision OpDecorate %96 RelaxedPrecision OpDecorate %97 RelaxedPrecision OpDecorate %98 RelaxedPrecision -OpDecorate %99 RelaxedPrecision -OpDecorate %101 RelaxedPrecision -OpDecorate %102 RelaxedPrecision -OpDecorate %103 RelaxedPrecision -OpDecorate %104 RelaxedPrecision +OpDecorate %114 RelaxedPrecision +OpDecorate %117 RelaxedPrecision +OpDecorate %118 RelaxedPrecision +OpDecorate %119 RelaxedPrecision OpDecorate %120 RelaxedPrecision +OpDecorate %121 RelaxedPrecision OpDecorate %123 RelaxedPrecision OpDecorate %124 RelaxedPrecision OpDecorate %125 RelaxedPrecision OpDecorate %126 RelaxedPrecision -OpDecorate %128 RelaxedPrecision -OpDecorate %130 RelaxedPrecision -OpDecorate %131 RelaxedPrecision -OpDecorate %132 RelaxedPrecision -OpDecorate %133 RelaxedPrecision -OpDecorate %149 RelaxedPrecision +OpDecorate %142 RelaxedPrecision +OpDecorate %145 RelaxedPrecision +OpDecorate %146 RelaxedPrecision +OpDecorate %147 RelaxedPrecision +OpDecorate %148 RelaxedPrecision +OpDecorate %150 RelaxedPrecision OpDecorate %152 RelaxedPrecision OpDecorate %153 RelaxedPrecision OpDecorate %154 RelaxedPrecision OpDecorate %155 RelaxedPrecision -OpDecorate %156 RelaxedPrecision -OpDecorate %157 RelaxedPrecision -OpDecorate %158 RelaxedPrecision -OpDecorate %159 RelaxedPrecision -OpDecorate %160 RelaxedPrecision +OpDecorate %171 RelaxedPrecision +OpDecorate %174 RelaxedPrecision +OpDecorate %175 RelaxedPrecision OpDecorate %176 RelaxedPrecision +OpDecorate %177 RelaxedPrecision +OpDecorate %178 RelaxedPrecision OpDecorate %179 RelaxedPrecision OpDecorate %180 RelaxedPrecision OpDecorate %181 RelaxedPrecision @@ -84,37 +106,66 @@ OpDecorate %184 RelaxedPrecision OpDecorate %185 RelaxedPrecision OpDecorate %186 RelaxedPrecision OpDecorate %187 RelaxedPrecision -OpDecorate %203 RelaxedPrecision -OpDecorate %206 RelaxedPrecision -OpDecorate %207 RelaxedPrecision -OpDecorate %208 RelaxedPrecision +OpDecorate %188 RelaxedPrecision +OpDecorate %189 RelaxedPrecision +OpDecorate %190 RelaxedPrecision +OpDecorate %191 RelaxedPrecision +OpDecorate %192 RelaxedPrecision +OpDecorate %193 RelaxedPrecision OpDecorate %209 RelaxedPrecision -OpDecorate %210 RelaxedPrecision -OpDecorate %211 RelaxedPrecision OpDecorate %212 RelaxedPrecision OpDecorate %213 RelaxedPrecision OpDecorate %214 RelaxedPrecision +OpDecorate %215 RelaxedPrecision +OpDecorate %216 RelaxedPrecision +OpDecorate %217 RelaxedPrecision +OpDecorate %218 RelaxedPrecision +OpDecorate %219 RelaxedPrecision +OpDecorate %220 RelaxedPrecision +OpDecorate %221 RelaxedPrecision +OpDecorate %222 RelaxedPrecision +OpDecorate %223 RelaxedPrecision +OpDecorate %224 RelaxedPrecision +OpDecorate %225 RelaxedPrecision +OpDecorate %226 RelaxedPrecision +OpDecorate %227 RelaxedPrecision +OpDecorate %228 RelaxedPrecision +OpDecorate %229 RelaxedPrecision OpDecorate %230 RelaxedPrecision -OpDecorate %233 RelaxedPrecision -OpDecorate %234 RelaxedPrecision -OpDecorate %235 RelaxedPrecision -OpDecorate %237 RelaxedPrecision -OpDecorate %238 RelaxedPrecision -OpDecorate %239 RelaxedPrecision -OpDecorate %240 RelaxedPrecision +OpDecorate %231 RelaxedPrecision +OpDecorate %247 RelaxedPrecision +OpDecorate %250 RelaxedPrecision +OpDecorate %251 RelaxedPrecision OpDecorate %252 RelaxedPrecision +OpDecorate %253 RelaxedPrecision +OpDecorate %254 RelaxedPrecision +OpDecorate %255 RelaxedPrecision +OpDecorate %256 RelaxedPrecision OpDecorate %257 RelaxedPrecision +OpDecorate %258 RelaxedPrecision +OpDecorate %274 RelaxedPrecision +OpDecorate %277 RelaxedPrecision +OpDecorate %278 RelaxedPrecision +OpDecorate %279 RelaxedPrecision +OpDecorate %281 RelaxedPrecision +OpDecorate %282 RelaxedPrecision +OpDecorate %283 RelaxedPrecision OpDecorate %284 RelaxedPrecision -OpDecorate %311 RelaxedPrecision -OpDecorate %338 RelaxedPrecision -OpDecorate %365 RelaxedPrecision -OpDecorate %392 RelaxedPrecision -OpDecorate %419 RelaxedPrecision -OpDecorate %446 RelaxedPrecision -OpDecorate %466 RelaxedPrecision -OpDecorate %480 RelaxedPrecision -OpDecorate %483 RelaxedPrecision -OpDecorate %484 RelaxedPrecision +OpDecorate %285 RelaxedPrecision +OpDecorate %286 RelaxedPrecision +OpDecorate %298 RelaxedPrecision +OpDecorate %303 RelaxedPrecision +OpDecorate %341 RelaxedPrecision +OpDecorate %379 RelaxedPrecision +OpDecorate %406 RelaxedPrecision +OpDecorate %433 RelaxedPrecision +OpDecorate %471 RelaxedPrecision +OpDecorate %509 RelaxedPrecision +OpDecorate %536 RelaxedPrecision +OpDecorate %558 RelaxedPrecision +OpDecorate %572 RelaxedPrecision +OpDecorate %575 RelaxedPrecision +OpDecorate %576 RelaxedPrecision %float = OpTypeFloat 32 %v4float = OpTypeVector %float 4 %_ptr_Output_v4float = OpTypePointer Output %v4float @@ -148,7 +199,7 @@ OpDecorate %484 RelaxedPrecision %float_0_5 = OpConstant %float 0.5 %mat2v2float = OpTypeMatrix %v2float 2 %v2bool = OpTypeVector %bool 2 -%253 = OpTypeFunction %v4float %_ptr_Function_v2float +%299 = OpTypeFunction %v4float %_ptr_Function_v2float %_ptr_Function_v4float = OpTypePointer Function %v4float %_ptr_Uniform_v4float = OpTypePointer Uniform %v4float %int = OpTypeInt 32 1 @@ -174,510 +225,604 @@ OpBranchConditional %30 %31 %32 %37 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 %38 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 %34 = OpCompositeConstruct %mat3v3float %36 %37 %38 -%41 = OpMatrixTimesScalar %mat3v3float %34 %float_4 -%44 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4 -%45 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4 -%46 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6 -%43 = OpCompositeConstruct %mat3v3float %44 %45 %46 -%48 = OpCompositeExtract %v3float %41 0 -%49 = OpCompositeExtract %v3float %43 0 -%50 = OpFOrdEqual %v3bool %48 %49 -%51 = OpAll %bool %50 -%52 = OpCompositeExtract %v3float %41 1 -%53 = OpCompositeExtract %v3float %43 1 -%54 = OpFOrdEqual %v3bool %52 %53 -%55 = OpAll %bool %54 -%56 = OpLogicalAnd %bool %51 %55 -%57 = OpCompositeExtract %v3float %41 2 -%58 = OpCompositeExtract %v3float %43 2 -%59 = OpFOrdEqual %v3bool %57 %58 -%60 = OpAll %bool %59 -%61 = OpLogicalAnd %bool %56 %60 +%41 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 +%42 = OpCompositeConstruct %mat3v3float %41 %41 %41 +%43 = OpCompositeExtract %v3float %34 0 +%44 = OpCompositeExtract %v3float %42 0 +%45 = OpFAdd %v3float %43 %44 +%46 = OpCompositeExtract %v3float %34 1 +%47 = OpCompositeExtract %v3float %42 1 +%48 = OpFAdd %v3float %46 %47 +%49 = OpCompositeExtract %v3float %34 2 +%50 = OpCompositeExtract %v3float %42 2 +%51 = OpFAdd %v3float %49 %50 +%52 = OpCompositeConstruct %mat3v3float %45 %48 %51 +%55 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4 +%56 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4 +%57 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6 +%54 = OpCompositeConstruct %mat3v3float %55 %56 %57 +%59 = OpCompositeExtract %v3float %52 0 +%60 = OpCompositeExtract %v3float %54 0 +%61 = OpFOrdEqual %v3bool %59 %60 +%62 = OpAll %bool %61 +%63 = OpCompositeExtract %v3float %52 1 +%64 = OpCompositeExtract %v3float %54 1 +%65 = OpFOrdEqual %v3bool %63 %64 +%66 = OpAll %bool %65 +%67 = OpLogicalAnd %bool %62 %66 +%68 = OpCompositeExtract %v3float %52 2 +%69 = OpCompositeExtract %v3float %54 2 +%70 = OpFOrdEqual %v3bool %68 %69 +%71 = OpAll %bool %70 +%72 = OpLogicalAnd %bool %67 %71 OpBranch %32 %32 = OpLabel -%62 = OpPhi %bool %false %25 %61 %31 -OpStore %ok %62 -%63 = OpLoad %bool %ok -OpSelectionMerge %65 None -OpBranchConditional %63 %64 %65 -%64 = OpLabel -%67 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%68 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%69 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 -%66 = OpCompositeConstruct %mat3v3float %67 %68 %69 -%70 = OpMatrixTimesScalar %mat3v3float %66 %float_4 -%74 = OpCompositeConstruct %v3float %float_n2 %float_n4 %float_n4 -%75 = OpCompositeConstruct %v3float %float_n4 %float_n2 %float_n4 -%76 = OpCompositeConstruct %v3float %float_n4 %float_n4 %float_n2 -%73 = OpCompositeConstruct %mat3v3float %74 %75 %76 -%77 = OpCompositeExtract %v3float %70 0 -%78 = OpCompositeExtract %v3float %73 0 -%79 = OpFOrdEqual %v3bool %77 %78 -%80 = OpAll %bool %79 -%81 = OpCompositeExtract %v3float %70 1 -%82 = OpCompositeExtract %v3float %73 1 -%83 = OpFOrdEqual %v3bool %81 %82 -%84 = OpAll %bool %83 -%85 = OpLogicalAnd %bool %80 %84 -%86 = OpCompositeExtract %v3float %70 2 -%87 = OpCompositeExtract %v3float %73 2 -%88 = OpFOrdEqual %v3bool %86 %87 -%89 = OpAll %bool %88 -%90 = OpLogicalAnd %bool %85 %89 -OpBranch %65 -%65 = OpLabel -%91 = OpPhi %bool %false %32 %90 %64 -OpStore %ok %91 -%92 = OpLoad %bool %ok -OpSelectionMerge %94 None -OpBranchConditional %92 %93 %94 -%93 = OpLabel -%96 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%97 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%98 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%73 = OpPhi %bool %false %25 %72 %31 +OpStore %ok %73 +%74 = OpLoad %bool %ok +OpSelectionMerge %76 None +OpBranchConditional %74 %75 %76 +%75 = OpLabel +%78 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%79 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%80 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%77 = OpCompositeConstruct %mat3v3float %78 %79 %80 +%81 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 +%82 = OpCompositeConstruct %mat3v3float %81 %81 %81 +%83 = OpCompositeExtract %v3float %77 0 +%84 = OpCompositeExtract %v3float %82 0 +%85 = OpFSub %v3float %83 %84 +%86 = OpCompositeExtract %v3float %77 1 +%87 = OpCompositeExtract %v3float %82 1 +%88 = OpFSub %v3float %86 %87 +%89 = OpCompositeExtract %v3float %77 2 +%90 = OpCompositeExtract %v3float %82 2 +%91 = OpFSub %v3float %89 %90 +%92 = OpCompositeConstruct %mat3v3float %85 %88 %91 +%96 = OpCompositeConstruct %v3float %float_n2 %float_n4 %float_n4 +%97 = OpCompositeConstruct %v3float %float_n4 %float_n2 %float_n4 +%98 = OpCompositeConstruct %v3float %float_n4 %float_n4 %float_n2 %95 = OpCompositeConstruct %mat3v3float %96 %97 %98 -%99 = OpMatrixTimesScalar %mat3v3float %95 %float_4 -%102 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0 -%103 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0 -%104 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8 -%101 = OpCompositeConstruct %mat3v3float %102 %103 %104 -%105 = OpCompositeExtract %v3float %99 0 -%106 = OpCompositeExtract %v3float %101 0 -%107 = OpFOrdEqual %v3bool %105 %106 -%108 = OpAll %bool %107 -%109 = OpCompositeExtract %v3float %99 1 -%110 = OpCompositeExtract %v3float %101 1 -%111 = OpFOrdEqual %v3bool %109 %110 -%112 = OpAll %bool %111 -%113 = OpLogicalAnd %bool %108 %112 -%114 = OpCompositeExtract %v3float %99 2 -%115 = OpCompositeExtract %v3float %101 2 -%116 = OpFOrdEqual %v3bool %114 %115 -%117 = OpAll %bool %116 -%118 = OpLogicalAnd %bool %113 %117 -OpBranch %94 -%94 = OpLabel -%119 = OpPhi %bool %false %65 %118 %93 -OpStore %ok %119 -%120 = OpLoad %bool %ok -OpSelectionMerge %122 None -OpBranchConditional %120 %121 %122 -%121 = OpLabel -%124 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%125 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%126 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%99 = OpCompositeExtract %v3float %92 0 +%100 = OpCompositeExtract %v3float %95 0 +%101 = OpFOrdEqual %v3bool %99 %100 +%102 = OpAll %bool %101 +%103 = OpCompositeExtract %v3float %92 1 +%104 = OpCompositeExtract %v3float %95 1 +%105 = OpFOrdEqual %v3bool %103 %104 +%106 = OpAll %bool %105 +%107 = OpLogicalAnd %bool %102 %106 +%108 = OpCompositeExtract %v3float %92 2 +%109 = OpCompositeExtract %v3float %95 2 +%110 = OpFOrdEqual %v3bool %108 %109 +%111 = OpAll %bool %110 +%112 = OpLogicalAnd %bool %107 %111 +OpBranch %76 +%76 = OpLabel +%113 = OpPhi %bool %false %32 %112 %75 +OpStore %ok %113 +%114 = OpLoad %bool %ok +OpSelectionMerge %116 None +OpBranchConditional %114 %115 %116 +%115 = OpLabel +%118 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%119 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%120 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%117 = OpCompositeConstruct %mat3v3float %118 %119 %120 +%121 = OpMatrixTimesScalar %mat3v3float %117 %float_4 +%124 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0 +%125 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0 +%126 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8 %123 = OpCompositeConstruct %mat3v3float %124 %125 %126 -%128 = OpMatrixTimesScalar %mat3v3float %123 %float_0_25 -%131 = OpCompositeConstruct %v3float %float_0_5 %float_0 %float_0 -%132 = OpCompositeConstruct %v3float %float_0 %float_0_5 %float_0 -%133 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0_5 -%130 = OpCompositeConstruct %mat3v3float %131 %132 %133 -%134 = OpCompositeExtract %v3float %128 0 -%135 = OpCompositeExtract %v3float %130 0 -%136 = OpFOrdEqual %v3bool %134 %135 -%137 = OpAll %bool %136 -%138 = OpCompositeExtract %v3float %128 1 -%139 = OpCompositeExtract %v3float %130 1 -%140 = OpFOrdEqual %v3bool %138 %139 -%141 = OpAll %bool %140 -%142 = OpLogicalAnd %bool %137 %141 -%143 = OpCompositeExtract %v3float %128 2 -%144 = OpCompositeExtract %v3float %130 2 -%145 = OpFOrdEqual %v3bool %143 %144 -%146 = OpAll %bool %145 -%147 = OpLogicalAnd %bool %142 %146 -OpBranch %122 -%122 = OpLabel -%148 = OpPhi %bool %false %94 %147 %121 -OpStore %ok %148 -%149 = OpLoad %bool %ok -OpSelectionMerge %151 None -OpBranchConditional %149 %150 %151 -%150 = OpLabel -%153 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%154 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%155 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%127 = OpCompositeExtract %v3float %121 0 +%128 = OpCompositeExtract %v3float %123 0 +%129 = OpFOrdEqual %v3bool %127 %128 +%130 = OpAll %bool %129 +%131 = OpCompositeExtract %v3float %121 1 +%132 = OpCompositeExtract %v3float %123 1 +%133 = OpFOrdEqual %v3bool %131 %132 +%134 = OpAll %bool %133 +%135 = OpLogicalAnd %bool %130 %134 +%136 = OpCompositeExtract %v3float %121 2 +%137 = OpCompositeExtract %v3float %123 2 +%138 = OpFOrdEqual %v3bool %136 %137 +%139 = OpAll %bool %138 +%140 = OpLogicalAnd %bool %135 %139 +OpBranch %116 +%116 = OpLabel +%141 = OpPhi %bool %false %76 %140 %115 +OpStore %ok %141 +%142 = OpLoad %bool %ok +OpSelectionMerge %144 None +OpBranchConditional %142 %143 %144 +%143 = OpLabel +%146 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%147 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%148 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%145 = OpCompositeConstruct %mat3v3float %146 %147 %148 +%150 = OpMatrixTimesScalar %mat3v3float %145 %float_0_25 +%153 = OpCompositeConstruct %v3float %float_0_5 %float_0 %float_0 +%154 = OpCompositeConstruct %v3float %float_0 %float_0_5 %float_0 +%155 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0_5 %152 = OpCompositeConstruct %mat3v3float %153 %154 %155 -%156 = OpMatrixTimesScalar %mat3v3float %152 %float_4 -%158 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4 -%159 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4 -%160 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6 -%157 = OpCompositeConstruct %mat3v3float %158 %159 %160 -%161 = OpCompositeExtract %v3float %156 0 -%162 = OpCompositeExtract %v3float %157 0 -%163 = OpFOrdEqual %v3bool %161 %162 -%164 = OpAll %bool %163 -%165 = OpCompositeExtract %v3float %156 1 -%166 = OpCompositeExtract %v3float %157 1 +%156 = OpCompositeExtract %v3float %150 0 +%157 = OpCompositeExtract %v3float %152 0 +%158 = OpFOrdEqual %v3bool %156 %157 +%159 = OpAll %bool %158 +%160 = OpCompositeExtract %v3float %150 1 +%161 = OpCompositeExtract %v3float %152 1 +%162 = OpFOrdEqual %v3bool %160 %161 +%163 = OpAll %bool %162 +%164 = OpLogicalAnd %bool %159 %163 +%165 = OpCompositeExtract %v3float %150 2 +%166 = OpCompositeExtract %v3float %152 2 %167 = OpFOrdEqual %v3bool %165 %166 %168 = OpAll %bool %167 %169 = OpLogicalAnd %bool %164 %168 -%170 = OpCompositeExtract %v3float %156 2 -%171 = OpCompositeExtract %v3float %157 2 -%172 = OpFOrdEqual %v3bool %170 %171 -%173 = OpAll %bool %172 -%174 = OpLogicalAnd %bool %169 %173 -OpBranch %151 -%151 = OpLabel -%175 = OpPhi %bool %false %122 %174 %150 -OpStore %ok %175 -%176 = OpLoad %bool %ok -OpSelectionMerge %178 None -OpBranchConditional %176 %177 %178 -%177 = OpLabel -%180 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%181 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%182 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 -%179 = OpCompositeConstruct %mat3v3float %180 %181 %182 -%183 = OpMatrixTimesScalar %mat3v3float %179 %float_4 -%185 = OpCompositeConstruct %v3float %float_2 %float_4 %float_4 -%186 = OpCompositeConstruct %v3float %float_4 %float_2 %float_4 -%187 = OpCompositeConstruct %v3float %float_4 %float_4 %float_2 -%184 = OpCompositeConstruct %mat3v3float %185 %186 %187 -%188 = OpCompositeExtract %v3float %183 0 -%189 = OpCompositeExtract %v3float %184 0 -%190 = OpFOrdEqual %v3bool %188 %189 -%191 = OpAll %bool %190 -%192 = OpCompositeExtract %v3float %183 1 -%193 = OpCompositeExtract %v3float %184 1 -%194 = OpFOrdEqual %v3bool %192 %193 -%195 = OpAll %bool %194 -%196 = OpLogicalAnd %bool %191 %195 -%197 = OpCompositeExtract %v3float %183 2 -%198 = OpCompositeExtract %v3float %184 2 -%199 = OpFOrdEqual %v3bool %197 %198 -%200 = OpAll %bool %199 -%201 = OpLogicalAnd %bool %196 %200 -OpBranch %178 -%178 = OpLabel -%202 = OpPhi %bool %false %151 %201 %177 -OpStore %ok %202 -%203 = OpLoad %bool %ok -OpSelectionMerge %205 None -OpBranchConditional %203 %204 %205 -%204 = OpLabel -%207 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%208 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%209 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 -%206 = OpCompositeConstruct %mat3v3float %207 %208 %209 -%210 = OpMatrixTimesScalar %mat3v3float %206 %float_4 -%212 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0 -%213 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0 -%214 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8 -%211 = OpCompositeConstruct %mat3v3float %212 %213 %214 -%215 = OpCompositeExtract %v3float %210 0 -%216 = OpCompositeExtract %v3float %211 0 -%217 = OpFOrdEqual %v3bool %215 %216 -%218 = OpAll %bool %217 -%219 = OpCompositeExtract %v3float %210 1 -%220 = OpCompositeExtract %v3float %211 1 -%221 = OpFOrdEqual %v3bool %219 %220 -%222 = OpAll %bool %221 -%223 = OpLogicalAnd %bool %218 %222 -%224 = OpCompositeExtract %v3float %210 2 -%225 = OpCompositeExtract %v3float %211 2 -%226 = OpFOrdEqual %v3bool %224 %225 -%227 = OpAll %bool %226 -%228 = OpLogicalAnd %bool %223 %227 -OpBranch %205 -%205 = OpLabel -%229 = OpPhi %bool %false %178 %228 %204 -OpStore %ok %229 -%230 = OpLoad %bool %ok -OpSelectionMerge %232 None -OpBranchConditional %230 %231 %232 -%231 = OpLabel -%234 = OpCompositeConstruct %v2float %float_2 %float_2 -%235 = OpCompositeConstruct %v2float %float_2 %float_2 -%233 = OpCompositeConstruct %mat2v2float %234 %235 -%237 = OpMatrixTimesScalar %mat2v2float %233 %float_4 -%239 = OpCompositeConstruct %v2float %float_2 %float_2 -%240 = OpCompositeConstruct %v2float %float_2 %float_2 -%238 = OpCompositeConstruct %mat2v2float %239 %240 -%242 = OpCompositeExtract %v2float %237 0 -%243 = OpCompositeExtract %v2float %238 0 -%244 = OpFOrdEqual %v2bool %242 %243 -%245 = OpAll %bool %244 -%246 = OpCompositeExtract %v2float %237 1 -%247 = OpCompositeExtract %v2float %238 1 -%248 = OpFOrdEqual %v2bool %246 %247 -%249 = OpAll %bool %248 -%250 = OpLogicalAnd %bool %245 %249 -OpBranch %232 -%232 = OpLabel -%251 = OpPhi %bool %false %205 %250 %231 -OpStore %ok %251 -%252 = OpLoad %bool %ok -OpReturnValue %252 +OpBranch %144 +%144 = OpLabel +%170 = OpPhi %bool %false %116 %169 %143 +OpStore %ok %170 +%171 = OpLoad %bool %ok +OpSelectionMerge %173 None +OpBranchConditional %171 %172 %173 +%172 = OpLabel +%175 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%176 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%177 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%174 = OpCompositeConstruct %mat3v3float %175 %176 %177 +%178 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 +%179 = OpCompositeConstruct %mat3v3float %178 %178 %178 +%180 = OpCompositeExtract %v3float %179 0 +%181 = OpCompositeExtract %v3float %174 0 +%182 = OpFAdd %v3float %180 %181 +%183 = OpCompositeExtract %v3float %179 1 +%184 = OpCompositeExtract %v3float %174 1 +%185 = OpFAdd %v3float %183 %184 +%186 = OpCompositeExtract %v3float %179 2 +%187 = OpCompositeExtract %v3float %174 2 +%188 = OpFAdd %v3float %186 %187 +%189 = OpCompositeConstruct %mat3v3float %182 %185 %188 +%191 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4 +%192 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4 +%193 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6 +%190 = OpCompositeConstruct %mat3v3float %191 %192 %193 +%194 = OpCompositeExtract %v3float %189 0 +%195 = OpCompositeExtract %v3float %190 0 +%196 = OpFOrdEqual %v3bool %194 %195 +%197 = OpAll %bool %196 +%198 = OpCompositeExtract %v3float %189 1 +%199 = OpCompositeExtract %v3float %190 1 +%200 = OpFOrdEqual %v3bool %198 %199 +%201 = OpAll %bool %200 +%202 = OpLogicalAnd %bool %197 %201 +%203 = OpCompositeExtract %v3float %189 2 +%204 = OpCompositeExtract %v3float %190 2 +%205 = OpFOrdEqual %v3bool %203 %204 +%206 = OpAll %bool %205 +%207 = OpLogicalAnd %bool %202 %206 +OpBranch %173 +%173 = OpLabel +%208 = OpPhi %bool %false %144 %207 %172 +OpStore %ok %208 +%209 = OpLoad %bool %ok +OpSelectionMerge %211 None +OpBranchConditional %209 %210 %211 +%210 = OpLabel +%213 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%214 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%215 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%212 = OpCompositeConstruct %mat3v3float %213 %214 %215 +%216 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 +%217 = OpCompositeConstruct %mat3v3float %216 %216 %216 +%218 = OpCompositeExtract %v3float %217 0 +%219 = OpCompositeExtract %v3float %212 0 +%220 = OpFSub %v3float %218 %219 +%221 = OpCompositeExtract %v3float %217 1 +%222 = OpCompositeExtract %v3float %212 1 +%223 = OpFSub %v3float %221 %222 +%224 = OpCompositeExtract %v3float %217 2 +%225 = OpCompositeExtract %v3float %212 2 +%226 = OpFSub %v3float %224 %225 +%227 = OpCompositeConstruct %mat3v3float %220 %223 %226 +%229 = OpCompositeConstruct %v3float %float_2 %float_4 %float_4 +%230 = OpCompositeConstruct %v3float %float_4 %float_2 %float_4 +%231 = OpCompositeConstruct %v3float %float_4 %float_4 %float_2 +%228 = OpCompositeConstruct %mat3v3float %229 %230 %231 +%232 = OpCompositeExtract %v3float %227 0 +%233 = OpCompositeExtract %v3float %228 0 +%234 = OpFOrdEqual %v3bool %232 %233 +%235 = OpAll %bool %234 +%236 = OpCompositeExtract %v3float %227 1 +%237 = OpCompositeExtract %v3float %228 1 +%238 = OpFOrdEqual %v3bool %236 %237 +%239 = OpAll %bool %238 +%240 = OpLogicalAnd %bool %235 %239 +%241 = OpCompositeExtract %v3float %227 2 +%242 = OpCompositeExtract %v3float %228 2 +%243 = OpFOrdEqual %v3bool %241 %242 +%244 = OpAll %bool %243 +%245 = OpLogicalAnd %bool %240 %244 +OpBranch %211 +%211 = OpLabel +%246 = OpPhi %bool %false %173 %245 %210 +OpStore %ok %246 +%247 = OpLoad %bool %ok +OpSelectionMerge %249 None +OpBranchConditional %247 %248 %249 +%248 = OpLabel +%251 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%252 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%253 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%250 = OpCompositeConstruct %mat3v3float %251 %252 %253 +%254 = OpMatrixTimesScalar %mat3v3float %250 %float_4 +%256 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0 +%257 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0 +%258 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8 +%255 = OpCompositeConstruct %mat3v3float %256 %257 %258 +%259 = OpCompositeExtract %v3float %254 0 +%260 = OpCompositeExtract %v3float %255 0 +%261 = OpFOrdEqual %v3bool %259 %260 +%262 = OpAll %bool %261 +%263 = OpCompositeExtract %v3float %254 1 +%264 = OpCompositeExtract %v3float %255 1 +%265 = OpFOrdEqual %v3bool %263 %264 +%266 = OpAll %bool %265 +%267 = OpLogicalAnd %bool %262 %266 +%268 = OpCompositeExtract %v3float %254 2 +%269 = OpCompositeExtract %v3float %255 2 +%270 = OpFOrdEqual %v3bool %268 %269 +%271 = OpAll %bool %270 +%272 = OpLogicalAnd %bool %267 %271 +OpBranch %249 +%249 = OpLabel +%273 = OpPhi %bool %false %211 %272 %248 +OpStore %ok %273 +%274 = OpLoad %bool %ok +OpSelectionMerge %276 None +OpBranchConditional %274 %275 %276 +%275 = OpLabel +%278 = OpCompositeConstruct %v2float %float_2 %float_2 +%279 = OpCompositeConstruct %v2float %float_2 %float_2 +%277 = OpCompositeConstruct %mat2v2float %278 %279 +%281 = OpCompositeConstruct %v2float %float_4 %float_4 +%282 = OpCompositeConstruct %mat2v2float %281 %281 +%283 = OpFDiv %mat2v2float %282 %277 +%285 = OpCompositeConstruct %v2float %float_2 %float_2 +%286 = OpCompositeConstruct %v2float %float_2 %float_2 +%284 = OpCompositeConstruct %mat2v2float %285 %286 +%288 = OpCompositeExtract %v2float %283 0 +%289 = OpCompositeExtract %v2float %284 0 +%290 = OpFOrdEqual %v2bool %288 %289 +%291 = OpAll %bool %290 +%292 = OpCompositeExtract %v2float %283 1 +%293 = OpCompositeExtract %v2float %284 1 +%294 = OpFOrdEqual %v2bool %292 %293 +%295 = OpAll %bool %294 +%296 = OpLogicalAnd %bool %291 %295 +OpBranch %276 +%276 = OpLabel +%297 = OpPhi %bool %false %249 %296 %275 +OpStore %ok %297 +%298 = OpLoad %bool %ok +OpReturnValue %298 OpFunctionEnd -%main = OpFunction %v4float None %253 -%254 = OpFunctionParameter %_ptr_Function_v2float -%255 = OpLabel +%main = OpFunction %v4float None %299 +%300 = OpFunctionParameter %_ptr_Function_v2float +%301 = OpLabel %_0_ok = OpVariable %_ptr_Function_bool Function -%471 = OpVariable %_ptr_Function_v4float Function +%563 = OpVariable %_ptr_Function_v4float Function OpStore %_0_ok %true -%257 = OpLoad %bool %_0_ok -OpSelectionMerge %259 None -OpBranchConditional %257 %258 %259 -%258 = OpLabel -%261 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%262 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%263 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 -%260 = OpCompositeConstruct %mat3v3float %261 %262 %263 -%264 = OpMatrixTimesScalar %mat3v3float %260 %float_4 -%266 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4 -%267 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4 -%268 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6 -%265 = OpCompositeConstruct %mat3v3float %266 %267 %268 -%269 = OpCompositeExtract %v3float %264 0 -%270 = OpCompositeExtract %v3float %265 0 -%271 = OpFOrdEqual %v3bool %269 %270 -%272 = OpAll %bool %271 -%273 = OpCompositeExtract %v3float %264 1 -%274 = OpCompositeExtract %v3float %265 1 -%275 = OpFOrdEqual %v3bool %273 %274 -%276 = OpAll %bool %275 -%277 = OpLogicalAnd %bool %272 %276 -%278 = OpCompositeExtract %v3float %264 2 -%279 = OpCompositeExtract %v3float %265 2 -%280 = OpFOrdEqual %v3bool %278 %279 -%281 = OpAll %bool %280 -%282 = OpLogicalAnd %bool %277 %281 -OpBranch %259 -%259 = OpLabel -%283 = OpPhi %bool %false %255 %282 %258 -OpStore %_0_ok %283 -%284 = OpLoad %bool %_0_ok -OpSelectionMerge %286 None -OpBranchConditional %284 %285 %286 -%285 = OpLabel -%288 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%289 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%290 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 -%287 = OpCompositeConstruct %mat3v3float %288 %289 %290 -%291 = OpMatrixTimesScalar %mat3v3float %287 %float_4 -%293 = OpCompositeConstruct %v3float %float_n2 %float_n4 %float_n4 -%294 = OpCompositeConstruct %v3float %float_n4 %float_n2 %float_n4 -%295 = OpCompositeConstruct %v3float %float_n4 %float_n4 %float_n2 -%292 = OpCompositeConstruct %mat3v3float %293 %294 %295 -%296 = OpCompositeExtract %v3float %291 0 -%297 = OpCompositeExtract %v3float %292 0 -%298 = OpFOrdEqual %v3bool %296 %297 -%299 = OpAll %bool %298 -%300 = OpCompositeExtract %v3float %291 1 -%301 = OpCompositeExtract %v3float %292 1 -%302 = OpFOrdEqual %v3bool %300 %301 -%303 = OpAll %bool %302 -%304 = OpLogicalAnd %bool %299 %303 -%305 = OpCompositeExtract %v3float %291 2 -%306 = OpCompositeExtract %v3float %292 2 -%307 = OpFOrdEqual %v3bool %305 %306 -%308 = OpAll %bool %307 -%309 = OpLogicalAnd %bool %304 %308 -OpBranch %286 -%286 = OpLabel -%310 = OpPhi %bool %false %259 %309 %285 -OpStore %_0_ok %310 -%311 = OpLoad %bool %_0_ok -OpSelectionMerge %313 None -OpBranchConditional %311 %312 %313 -%312 = OpLabel -%315 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%316 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%317 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 -%314 = OpCompositeConstruct %mat3v3float %315 %316 %317 -%318 = OpMatrixTimesScalar %mat3v3float %314 %float_4 -%320 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0 -%321 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0 -%322 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8 -%319 = OpCompositeConstruct %mat3v3float %320 %321 %322 -%323 = OpCompositeExtract %v3float %318 0 -%324 = OpCompositeExtract %v3float %319 0 -%325 = OpFOrdEqual %v3bool %323 %324 -%326 = OpAll %bool %325 -%327 = OpCompositeExtract %v3float %318 1 -%328 = OpCompositeExtract %v3float %319 1 -%329 = OpFOrdEqual %v3bool %327 %328 -%330 = OpAll %bool %329 -%331 = OpLogicalAnd %bool %326 %330 -%332 = OpCompositeExtract %v3float %318 2 -%333 = OpCompositeExtract %v3float %319 2 -%334 = OpFOrdEqual %v3bool %332 %333 -%335 = OpAll %bool %334 -%336 = OpLogicalAnd %bool %331 %335 -OpBranch %313 -%313 = OpLabel -%337 = OpPhi %bool %false %286 %336 %312 -OpStore %_0_ok %337 -%338 = OpLoad %bool %_0_ok -OpSelectionMerge %340 None -OpBranchConditional %338 %339 %340 -%339 = OpLabel -%342 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%343 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%344 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 -%341 = OpCompositeConstruct %mat3v3float %342 %343 %344 -%345 = OpMatrixTimesScalar %mat3v3float %341 %float_0_25 -%347 = OpCompositeConstruct %v3float %float_0_5 %float_0 %float_0 -%348 = OpCompositeConstruct %v3float %float_0 %float_0_5 %float_0 -%349 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0_5 -%346 = OpCompositeConstruct %mat3v3float %347 %348 %349 -%350 = OpCompositeExtract %v3float %345 0 -%351 = OpCompositeExtract %v3float %346 0 -%352 = OpFOrdEqual %v3bool %350 %351 -%353 = OpAll %bool %352 -%354 = OpCompositeExtract %v3float %345 1 -%355 = OpCompositeExtract %v3float %346 1 -%356 = OpFOrdEqual %v3bool %354 %355 -%357 = OpAll %bool %356 -%358 = OpLogicalAnd %bool %353 %357 -%359 = OpCompositeExtract %v3float %345 2 -%360 = OpCompositeExtract %v3float %346 2 -%361 = OpFOrdEqual %v3bool %359 %360 -%362 = OpAll %bool %361 -%363 = OpLogicalAnd %bool %358 %362 -OpBranch %340 -%340 = OpLabel -%364 = OpPhi %bool %false %313 %363 %339 -OpStore %_0_ok %364 -%365 = OpLoad %bool %_0_ok -OpSelectionMerge %367 None -OpBranchConditional %365 %366 %367 -%366 = OpLabel -%369 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%370 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%371 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 -%368 = OpCompositeConstruct %mat3v3float %369 %370 %371 -%372 = OpMatrixTimesScalar %mat3v3float %368 %float_4 -%374 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4 -%375 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4 -%376 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6 -%373 = OpCompositeConstruct %mat3v3float %374 %375 %376 -%377 = OpCompositeExtract %v3float %372 0 -%378 = OpCompositeExtract %v3float %373 0 -%379 = OpFOrdEqual %v3bool %377 %378 -%380 = OpAll %bool %379 -%381 = OpCompositeExtract %v3float %372 1 -%382 = OpCompositeExtract %v3float %373 1 -%383 = OpFOrdEqual %v3bool %381 %382 -%384 = OpAll %bool %383 -%385 = OpLogicalAnd %bool %380 %384 -%386 = OpCompositeExtract %v3float %372 2 -%387 = OpCompositeExtract %v3float %373 2 -%388 = OpFOrdEqual %v3bool %386 %387 -%389 = OpAll %bool %388 -%390 = OpLogicalAnd %bool %385 %389 -OpBranch %367 -%367 = OpLabel -%391 = OpPhi %bool %false %340 %390 %366 -OpStore %_0_ok %391 -%392 = OpLoad %bool %_0_ok -OpSelectionMerge %394 None -OpBranchConditional %392 %393 %394 -%393 = OpLabel -%396 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%397 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%398 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 -%395 = OpCompositeConstruct %mat3v3float %396 %397 %398 -%399 = OpMatrixTimesScalar %mat3v3float %395 %float_4 -%401 = OpCompositeConstruct %v3float %float_2 %float_4 %float_4 -%402 = OpCompositeConstruct %v3float %float_4 %float_2 %float_4 -%403 = OpCompositeConstruct %v3float %float_4 %float_4 %float_2 -%400 = OpCompositeConstruct %mat3v3float %401 %402 %403 -%404 = OpCompositeExtract %v3float %399 0 -%405 = OpCompositeExtract %v3float %400 0 -%406 = OpFOrdEqual %v3bool %404 %405 -%407 = OpAll %bool %406 -%408 = OpCompositeExtract %v3float %399 1 -%409 = OpCompositeExtract %v3float %400 1 -%410 = OpFOrdEqual %v3bool %408 %409 -%411 = OpAll %bool %410 -%412 = OpLogicalAnd %bool %407 %411 -%413 = OpCompositeExtract %v3float %399 2 -%414 = OpCompositeExtract %v3float %400 2 -%415 = OpFOrdEqual %v3bool %413 %414 -%416 = OpAll %bool %415 -%417 = OpLogicalAnd %bool %412 %416 -OpBranch %394 -%394 = OpLabel -%418 = OpPhi %bool %false %367 %417 %393 -OpStore %_0_ok %418 -%419 = OpLoad %bool %_0_ok -OpSelectionMerge %421 None -OpBranchConditional %419 %420 %421 -%420 = OpLabel -%423 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 -%424 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 -%425 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 -%422 = OpCompositeConstruct %mat3v3float %423 %424 %425 -%426 = OpMatrixTimesScalar %mat3v3float %422 %float_4 -%428 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0 -%429 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0 -%430 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8 -%427 = OpCompositeConstruct %mat3v3float %428 %429 %430 -%431 = OpCompositeExtract %v3float %426 0 -%432 = OpCompositeExtract %v3float %427 0 -%433 = OpFOrdEqual %v3bool %431 %432 -%434 = OpAll %bool %433 -%435 = OpCompositeExtract %v3float %426 1 -%436 = OpCompositeExtract %v3float %427 1 -%437 = OpFOrdEqual %v3bool %435 %436 -%438 = OpAll %bool %437 -%439 = OpLogicalAnd %bool %434 %438 -%440 = OpCompositeExtract %v3float %426 2 -%441 = OpCompositeExtract %v3float %427 2 -%442 = OpFOrdEqual %v3bool %440 %441 -%443 = OpAll %bool %442 -%444 = OpLogicalAnd %bool %439 %443 -OpBranch %421 -%421 = OpLabel -%445 = OpPhi %bool %false %394 %444 %420 -OpStore %_0_ok %445 -%446 = OpLoad %bool %_0_ok -OpSelectionMerge %448 None -OpBranchConditional %446 %447 %448 -%447 = OpLabel -%450 = OpCompositeConstruct %v2float %float_2 %float_2 -%451 = OpCompositeConstruct %v2float %float_2 %float_2 -%449 = OpCompositeConstruct %mat2v2float %450 %451 -%452 = OpMatrixTimesScalar %mat2v2float %449 %float_4 -%454 = OpCompositeConstruct %v2float %float_2 %float_2 -%455 = OpCompositeConstruct %v2float %float_2 %float_2 -%453 = OpCompositeConstruct %mat2v2float %454 %455 -%456 = OpCompositeExtract %v2float %452 0 -%457 = OpCompositeExtract %v2float %453 0 -%458 = OpFOrdEqual %v2bool %456 %457 +%303 = OpLoad %bool %_0_ok +OpSelectionMerge %305 None +OpBranchConditional %303 %304 %305 +%304 = OpLabel +%307 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%308 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%309 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%306 = OpCompositeConstruct %mat3v3float %307 %308 %309 +%310 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 +%311 = OpCompositeConstruct %mat3v3float %310 %310 %310 +%312 = OpCompositeExtract %v3float %306 0 +%313 = OpCompositeExtract %v3float %311 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 +%321 = OpCompositeConstruct %mat3v3float %314 %317 %320 +%323 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4 +%324 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4 +%325 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6 +%322 = OpCompositeConstruct %mat3v3float %323 %324 %325 +%326 = OpCompositeExtract %v3float %321 0 +%327 = OpCompositeExtract %v3float %322 0 +%328 = OpFOrdEqual %v3bool %326 %327 +%329 = OpAll %bool %328 +%330 = OpCompositeExtract %v3float %321 1 +%331 = OpCompositeExtract %v3float %322 1 +%332 = OpFOrdEqual %v3bool %330 %331 +%333 = OpAll %bool %332 +%334 = OpLogicalAnd %bool %329 %333 +%335 = OpCompositeExtract %v3float %321 2 +%336 = OpCompositeExtract %v3float %322 2 +%337 = OpFOrdEqual %v3bool %335 %336 +%338 = OpAll %bool %337 +%339 = OpLogicalAnd %bool %334 %338 +OpBranch %305 +%305 = OpLabel +%340 = OpPhi %bool %false %301 %339 %304 +OpStore %_0_ok %340 +%341 = OpLoad %bool %_0_ok +OpSelectionMerge %343 None +OpBranchConditional %341 %342 %343 +%342 = OpLabel +%345 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%346 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%347 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%344 = OpCompositeConstruct %mat3v3float %345 %346 %347 +%348 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 +%349 = OpCompositeConstruct %mat3v3float %348 %348 %348 +%350 = OpCompositeExtract %v3float %344 0 +%351 = OpCompositeExtract %v3float %349 0 +%352 = OpFSub %v3float %350 %351 +%353 = OpCompositeExtract %v3float %344 1 +%354 = OpCompositeExtract %v3float %349 1 +%355 = OpFSub %v3float %353 %354 +%356 = OpCompositeExtract %v3float %344 2 +%357 = OpCompositeExtract %v3float %349 2 +%358 = OpFSub %v3float %356 %357 +%359 = OpCompositeConstruct %mat3v3float %352 %355 %358 +%361 = OpCompositeConstruct %v3float %float_n2 %float_n4 %float_n4 +%362 = OpCompositeConstruct %v3float %float_n4 %float_n2 %float_n4 +%363 = OpCompositeConstruct %v3float %float_n4 %float_n4 %float_n2 +%360 = OpCompositeConstruct %mat3v3float %361 %362 %363 +%364 = OpCompositeExtract %v3float %359 0 +%365 = OpCompositeExtract %v3float %360 0 +%366 = OpFOrdEqual %v3bool %364 %365 +%367 = OpAll %bool %366 +%368 = OpCompositeExtract %v3float %359 1 +%369 = OpCompositeExtract %v3float %360 1 +%370 = OpFOrdEqual %v3bool %368 %369 +%371 = OpAll %bool %370 +%372 = OpLogicalAnd %bool %367 %371 +%373 = OpCompositeExtract %v3float %359 2 +%374 = OpCompositeExtract %v3float %360 2 +%375 = OpFOrdEqual %v3bool %373 %374 +%376 = OpAll %bool %375 +%377 = OpLogicalAnd %bool %372 %376 +OpBranch %343 +%343 = OpLabel +%378 = OpPhi %bool %false %305 %377 %342 +OpStore %_0_ok %378 +%379 = OpLoad %bool %_0_ok +OpSelectionMerge %381 None +OpBranchConditional %379 %380 %381 +%380 = OpLabel +%383 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%384 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%385 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%382 = OpCompositeConstruct %mat3v3float %383 %384 %385 +%386 = OpMatrixTimesScalar %mat3v3float %382 %float_4 +%388 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0 +%389 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0 +%390 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8 +%387 = OpCompositeConstruct %mat3v3float %388 %389 %390 +%391 = OpCompositeExtract %v3float %386 0 +%392 = OpCompositeExtract %v3float %387 0 +%393 = OpFOrdEqual %v3bool %391 %392 +%394 = OpAll %bool %393 +%395 = OpCompositeExtract %v3float %386 1 +%396 = OpCompositeExtract %v3float %387 1 +%397 = OpFOrdEqual %v3bool %395 %396 +%398 = OpAll %bool %397 +%399 = OpLogicalAnd %bool %394 %398 +%400 = OpCompositeExtract %v3float %386 2 +%401 = OpCompositeExtract %v3float %387 2 +%402 = OpFOrdEqual %v3bool %400 %401 +%403 = OpAll %bool %402 +%404 = OpLogicalAnd %bool %399 %403 +OpBranch %381 +%381 = OpLabel +%405 = OpPhi %bool %false %343 %404 %380 +OpStore %_0_ok %405 +%406 = OpLoad %bool %_0_ok +OpSelectionMerge %408 None +OpBranchConditional %406 %407 %408 +%407 = OpLabel +%410 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%411 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%412 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%409 = OpCompositeConstruct %mat3v3float %410 %411 %412 +%413 = OpMatrixTimesScalar %mat3v3float %409 %float_0_25 +%415 = OpCompositeConstruct %v3float %float_0_5 %float_0 %float_0 +%416 = OpCompositeConstruct %v3float %float_0 %float_0_5 %float_0 +%417 = OpCompositeConstruct %v3float %float_0 %float_0 %float_0_5 +%414 = OpCompositeConstruct %mat3v3float %415 %416 %417 +%418 = OpCompositeExtract %v3float %413 0 +%419 = OpCompositeExtract %v3float %414 0 +%420 = OpFOrdEqual %v3bool %418 %419 +%421 = OpAll %bool %420 +%422 = OpCompositeExtract %v3float %413 1 +%423 = OpCompositeExtract %v3float %414 1 +%424 = OpFOrdEqual %v3bool %422 %423 +%425 = OpAll %bool %424 +%426 = OpLogicalAnd %bool %421 %425 +%427 = OpCompositeExtract %v3float %413 2 +%428 = OpCompositeExtract %v3float %414 2 +%429 = OpFOrdEqual %v3bool %427 %428 +%430 = OpAll %bool %429 +%431 = OpLogicalAnd %bool %426 %430 +OpBranch %408 +%408 = OpLabel +%432 = OpPhi %bool %false %381 %431 %407 +OpStore %_0_ok %432 +%433 = OpLoad %bool %_0_ok +OpSelectionMerge %435 None +OpBranchConditional %433 %434 %435 +%434 = OpLabel +%437 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%438 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%439 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%436 = OpCompositeConstruct %mat3v3float %437 %438 %439 +%440 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 +%441 = OpCompositeConstruct %mat3v3float %440 %440 %440 +%442 = OpCompositeExtract %v3float %441 0 +%443 = OpCompositeExtract %v3float %436 0 +%444 = OpFAdd %v3float %442 %443 +%445 = OpCompositeExtract %v3float %441 1 +%446 = OpCompositeExtract %v3float %436 1 +%447 = OpFAdd %v3float %445 %446 +%448 = OpCompositeExtract %v3float %441 2 +%449 = OpCompositeExtract %v3float %436 2 +%450 = OpFAdd %v3float %448 %449 +%451 = OpCompositeConstruct %mat3v3float %444 %447 %450 +%453 = OpCompositeConstruct %v3float %float_6 %float_4 %float_4 +%454 = OpCompositeConstruct %v3float %float_4 %float_6 %float_4 +%455 = OpCompositeConstruct %v3float %float_4 %float_4 %float_6 +%452 = OpCompositeConstruct %mat3v3float %453 %454 %455 +%456 = OpCompositeExtract %v3float %451 0 +%457 = OpCompositeExtract %v3float %452 0 +%458 = OpFOrdEqual %v3bool %456 %457 %459 = OpAll %bool %458 -%460 = OpCompositeExtract %v2float %452 1 -%461 = OpCompositeExtract %v2float %453 1 -%462 = OpFOrdEqual %v2bool %460 %461 +%460 = OpCompositeExtract %v3float %451 1 +%461 = OpCompositeExtract %v3float %452 1 +%462 = OpFOrdEqual %v3bool %460 %461 %463 = OpAll %bool %462 %464 = OpLogicalAnd %bool %459 %463 -OpBranch %448 -%448 = OpLabel -%465 = OpPhi %bool %false %421 %464 %447 -OpStore %_0_ok %465 -%466 = OpLoad %bool %_0_ok -OpSelectionMerge %468 None -OpBranchConditional %466 %467 %468 -%467 = OpLabel -%469 = OpFunctionCall %bool %test_half_b -OpBranch %468 -%468 = OpLabel -%470 = OpPhi %bool %false %448 %469 %467 -OpSelectionMerge %475 None -OpBranchConditional %470 %473 %474 +%465 = OpCompositeExtract %v3float %451 2 +%466 = OpCompositeExtract %v3float %452 2 +%467 = OpFOrdEqual %v3bool %465 %466 +%468 = OpAll %bool %467 +%469 = OpLogicalAnd %bool %464 %468 +OpBranch %435 +%435 = OpLabel +%470 = OpPhi %bool %false %408 %469 %434 +OpStore %_0_ok %470 +%471 = OpLoad %bool %_0_ok +OpSelectionMerge %473 None +OpBranchConditional %471 %472 %473 +%472 = OpLabel +%475 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%476 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%477 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%474 = OpCompositeConstruct %mat3v3float %475 %476 %477 +%478 = OpCompositeConstruct %v3float %float_4 %float_4 %float_4 +%479 = OpCompositeConstruct %mat3v3float %478 %478 %478 +%480 = OpCompositeExtract %v3float %479 0 +%481 = OpCompositeExtract %v3float %474 0 +%482 = OpFSub %v3float %480 %481 +%483 = OpCompositeExtract %v3float %479 1 +%484 = OpCompositeExtract %v3float %474 1 +%485 = OpFSub %v3float %483 %484 +%486 = OpCompositeExtract %v3float %479 2 +%487 = OpCompositeExtract %v3float %474 2 +%488 = OpFSub %v3float %486 %487 +%489 = OpCompositeConstruct %mat3v3float %482 %485 %488 +%491 = OpCompositeConstruct %v3float %float_2 %float_4 %float_4 +%492 = OpCompositeConstruct %v3float %float_4 %float_2 %float_4 +%493 = OpCompositeConstruct %v3float %float_4 %float_4 %float_2 +%490 = OpCompositeConstruct %mat3v3float %491 %492 %493 +%494 = OpCompositeExtract %v3float %489 0 +%495 = OpCompositeExtract %v3float %490 0 +%496 = OpFOrdEqual %v3bool %494 %495 +%497 = OpAll %bool %496 +%498 = OpCompositeExtract %v3float %489 1 +%499 = OpCompositeExtract %v3float %490 1 +%500 = OpFOrdEqual %v3bool %498 %499 +%501 = OpAll %bool %500 +%502 = OpLogicalAnd %bool %497 %501 +%503 = OpCompositeExtract %v3float %489 2 +%504 = OpCompositeExtract %v3float %490 2 +%505 = OpFOrdEqual %v3bool %503 %504 +%506 = OpAll %bool %505 +%507 = OpLogicalAnd %bool %502 %506 +OpBranch %473 %473 = OpLabel -%476 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0 -%480 = OpLoad %v4float %476 -OpStore %471 %480 -OpBranch %475 -%474 = OpLabel -%481 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1 -%483 = OpLoad %v4float %481 -OpStore %471 %483 -OpBranch %475 -%475 = OpLabel -%484 = OpLoad %v4float %471 -OpReturnValue %484 +%508 = OpPhi %bool %false %435 %507 %472 +OpStore %_0_ok %508 +%509 = OpLoad %bool %_0_ok +OpSelectionMerge %511 None +OpBranchConditional %509 %510 %511 +%510 = OpLabel +%513 = OpCompositeConstruct %v3float %float_2 %float_0 %float_0 +%514 = OpCompositeConstruct %v3float %float_0 %float_2 %float_0 +%515 = OpCompositeConstruct %v3float %float_0 %float_0 %float_2 +%512 = OpCompositeConstruct %mat3v3float %513 %514 %515 +%516 = OpMatrixTimesScalar %mat3v3float %512 %float_4 +%518 = OpCompositeConstruct %v3float %float_8 %float_0 %float_0 +%519 = OpCompositeConstruct %v3float %float_0 %float_8 %float_0 +%520 = OpCompositeConstruct %v3float %float_0 %float_0 %float_8 +%517 = OpCompositeConstruct %mat3v3float %518 %519 %520 +%521 = OpCompositeExtract %v3float %516 0 +%522 = OpCompositeExtract %v3float %517 0 +%523 = OpFOrdEqual %v3bool %521 %522 +%524 = OpAll %bool %523 +%525 = OpCompositeExtract %v3float %516 1 +%526 = OpCompositeExtract %v3float %517 1 +%527 = OpFOrdEqual %v3bool %525 %526 +%528 = OpAll %bool %527 +%529 = OpLogicalAnd %bool %524 %528 +%530 = OpCompositeExtract %v3float %516 2 +%531 = OpCompositeExtract %v3float %517 2 +%532 = OpFOrdEqual %v3bool %530 %531 +%533 = OpAll %bool %532 +%534 = OpLogicalAnd %bool %529 %533 +OpBranch %511 +%511 = OpLabel +%535 = OpPhi %bool %false %473 %534 %510 +OpStore %_0_ok %535 +%536 = OpLoad %bool %_0_ok +OpSelectionMerge %538 None +OpBranchConditional %536 %537 %538 +%537 = OpLabel +%540 = OpCompositeConstruct %v2float %float_2 %float_2 +%541 = OpCompositeConstruct %v2float %float_2 %float_2 +%539 = OpCompositeConstruct %mat2v2float %540 %541 +%542 = OpCompositeConstruct %v2float %float_4 %float_4 +%543 = OpCompositeConstruct %mat2v2float %542 %542 +%544 = OpFDiv %mat2v2float %543 %539 +%546 = OpCompositeConstruct %v2float %float_2 %float_2 +%547 = OpCompositeConstruct %v2float %float_2 %float_2 +%545 = OpCompositeConstruct %mat2v2float %546 %547 +%548 = OpCompositeExtract %v2float %544 0 +%549 = OpCompositeExtract %v2float %545 0 +%550 = OpFOrdEqual %v2bool %548 %549 +%551 = OpAll %bool %550 +%552 = OpCompositeExtract %v2float %544 1 +%553 = OpCompositeExtract %v2float %545 1 +%554 = OpFOrdEqual %v2bool %552 %553 +%555 = OpAll %bool %554 +%556 = OpLogicalAnd %bool %551 %555 +OpBranch %538 +%538 = OpLabel +%557 = OpPhi %bool %false %511 %556 %537 +OpStore %_0_ok %557 +%558 = OpLoad %bool %_0_ok +OpSelectionMerge %560 None +OpBranchConditional %558 %559 %560 +%559 = OpLabel +%561 = OpFunctionCall %bool %test_half_b +OpBranch %560 +%560 = OpLabel +%562 = OpPhi %bool %false %538 %561 %559 +OpSelectionMerge %567 None +OpBranchConditional %562 %565 %566 +%565 = OpLabel +%568 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0 +%572 = OpLoad %v4float %568 +OpStore %563 %572 +OpBranch %567 +%566 = OpLabel +%573 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1 +%575 = OpLoad %v4float %573 +OpStore %563 %575 +OpBranch %567 +%567 = OpLabel +%576 = OpLoad %v4float %563 +OpReturnValue %576 OpFunctionEnd + +1 error