
Approach: Add a flag in `Builder` to indicate 'spec constant mode' and 'normal mode'. When the builder is in 'normal mode', nothing changed. When the builder is in 'spec constant mode', binary, unary and other instruction creation rountines will be redirected to `createSpecConstantOp()` to create instrution at module level with `OpSpecConstantOp <original opcode> <operands>`. 'spec constant mode' should be enabled if and only if we are creating spec constants. So a flager setter/recover guard is added when handling binary/unary nodes in `createSpvConstantsFromConstSubTree()`. Note when handling spec constants which are represented as ConstantUnion Node, we should not use `OpSpecConstantOp` to initialize the composite constant, so builder is set to 'normal mode'. Tests: Tests are added in Test/spv.specConstantOperations.vert, including: 1) Arithmetic, shift opeations for both scalar and composite type spec constants. 2) Size conversion from/to float and double for both scalar and vector. 3) Bitwise and/or/xor for both scalar and vector. 4) Unary negate/not for both scalar and vector. 5) Vector swizzles. 6) Comparisons for scalars. 7) == and != for composite type spec constants Issues: 1) To implement == and != for composite type spec constants, the Spec needs to allow OpAll, OpAny, OpFOrdEqual, OpFUnordEqual, OpOrdNotEqual, OpFUnordNotEqual. Currently none of them are allowed in the Spec.
111 lines
2.2 KiB
Plaintext
111 lines
2.2 KiB
Plaintext
# Test looping constructs.
|
|
# No tests yet for making sure break and continue from a nested loop
|
|
# goes to the innermost target.
|
|
spv.do-simple.vert
|
|
spv.do-while-continue-break.vert
|
|
spv.for-complex-condition.vert
|
|
spv.for-continue-break.vert
|
|
spv.for-simple.vert
|
|
spv.for-notest.vert
|
|
spv.for-nobody.vert
|
|
spv.while-continue-break.vert
|
|
spv.while-simple.vert
|
|
# vulkan-specific tests
|
|
spv.set.vert
|
|
spv.double.comp
|
|
spv.100ops.frag
|
|
spv.130.frag
|
|
spv.140.frag
|
|
spv.150.geom
|
|
spv.150.vert
|
|
spv.300BuiltIns.vert
|
|
spv.300layout.frag
|
|
spv.300layout.vert
|
|
spv.300layoutp.vert
|
|
spv.310.comp
|
|
spv.330.geom
|
|
spv.400.frag
|
|
spv.400.tesc
|
|
spv.400.tese
|
|
spv.420.geom
|
|
spv.430.vert
|
|
spv.accessChain.frag
|
|
spv.aggOps.frag
|
|
spv.always-discard.frag
|
|
spv.always-discard2.frag
|
|
spv.bitCast.frag
|
|
spv.bool.vert
|
|
spv.boolInBlock.frag
|
|
spv.branch-return.vert
|
|
spv.conditionalDiscard.frag
|
|
spv.conversion.frag
|
|
spv.dataOut.frag
|
|
spv.dataOutIndirect.frag
|
|
spv.dataOutIndirect.vert
|
|
spv.deepRvalue.frag
|
|
spv.depthOut.frag
|
|
spv.discard-dce.frag
|
|
spv.doWhileLoop.frag
|
|
spv.earlyReturnDiscard.frag
|
|
spv.flowControl.frag
|
|
spv.forLoop.frag
|
|
spv.forwardFun.frag
|
|
spv.functionCall.frag
|
|
spv.functionSemantics.frag
|
|
spv.interpOps.frag
|
|
spv.layoutNested.vert
|
|
spv.length.frag
|
|
spv.localAggregates.frag
|
|
spv.loops.frag
|
|
spv.loopsArtificial.frag
|
|
spv.matFun.vert
|
|
spv.matrix.frag
|
|
spv.matrix2.frag
|
|
spv.memoryQualifier.frag
|
|
spv.merge-unreachable.frag
|
|
spv.newTexture.frag
|
|
spv.noDeadDecorations.vert
|
|
spv.nonSquare.vert
|
|
spv.Operations.frag
|
|
spv.intOps.vert
|
|
spv.precision.frag
|
|
spv.prepost.frag
|
|
spv.qualifiers.vert
|
|
spv.shiftOps.frag
|
|
spv.simpleFunctionCall.frag
|
|
spv.simpleMat.vert
|
|
spv.sparseTexture.frag
|
|
spv.sparseTextureClamp.frag
|
|
spv.structAssignment.frag
|
|
spv.structDeref.frag
|
|
spv.structure.frag
|
|
spv.switch.frag
|
|
spv.swizzle.frag
|
|
spv.test.frag
|
|
spv.test.vert
|
|
spv.texture.frag
|
|
spv.texture.vert
|
|
spv.image.frag
|
|
spv.types.frag
|
|
spv.uint.frag
|
|
spv.uniformArray.frag
|
|
spv.variableArrayIndex.frag
|
|
spv.varyingArray.frag
|
|
spv.varyingArrayIndirect.frag
|
|
spv.voidFunction.frag
|
|
spv.whileLoop.frag
|
|
spv.AofA.frag
|
|
spv.queryL.frag
|
|
spv.separate.frag
|
|
spv.shortCircuit.frag
|
|
spv.pushConstant.vert
|
|
spv.subpass.frag
|
|
spv.specConstant.vert
|
|
spv.specConstant.comp
|
|
spv.specConstantComposite.vert
|
|
spv.specConstantOperations.vert
|
|
# GLSL-level semantics
|
|
vulkan.frag
|
|
vulkan.vert
|
|
vulkan.comp
|