2015-05-15 18:44:16 +00:00
|
|
|
# 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
|
2016-01-20 16:54:11 +00:00
|
|
|
spv.for-complex-condition.vert
|
2015-05-15 18:44:16 +00:00
|
|
|
spv.for-continue-break.vert
|
|
|
|
spv.for-simple.vert
|
2016-01-11 19:48:36 +00:00
|
|
|
spv.for-notest.vert
|
|
|
|
spv.for-nobody.vert
|
2015-05-15 18:44:16 +00:00
|
|
|
spv.while-continue-break.vert
|
|
|
|
spv.while-simple.vert
|
2015-05-15 21:32:46 +00:00
|
|
|
# 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
|
2015-05-22 21:57:58 +00:00
|
|
|
spv.accessChain.frag
|
2015-05-15 21:32:46 +00:00
|
|
|
spv.aggOps.frag
|
|
|
|
spv.always-discard.frag
|
|
|
|
spv.always-discard2.frag
|
2015-12-15 08:03:10 +00:00
|
|
|
spv.bitCast.frag
|
2015-12-09 03:48:49 +00:00
|
|
|
spv.bool.vert
|
2016-02-23 09:51:09 +00:00
|
|
|
spv.boolInBlock.frag
|
2016-01-18 22:12:59 +00:00
|
|
|
spv.branch-return.vert
|
2015-05-15 21:32:46 +00:00
|
|
|
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
|
2015-12-08 09:12:09 +00:00
|
|
|
spv.interpOps.frag
|
2016-04-22 08:51:45 +00:00
|
|
|
spv.int64.frag
|
2015-12-19 20:57:10 +00:00
|
|
|
spv.layoutNested.vert
|
2015-05-15 21:32:46 +00:00
|
|
|
spv.length.frag
|
|
|
|
spv.localAggregates.frag
|
|
|
|
spv.loops.frag
|
|
|
|
spv.loopsArtificial.frag
|
|
|
|
spv.matFun.vert
|
|
|
|
spv.matrix.frag
|
|
|
|
spv.matrix2.frag
|
2016-02-21 12:59:01 +00:00
|
|
|
spv.memoryQualifier.frag
|
2016-01-19 15:01:27 +00:00
|
|
|
spv.merge-unreachable.frag
|
2015-05-15 21:32:46 +00:00
|
|
|
spv.newTexture.frag
|
2016-03-11 17:06:17 +00:00
|
|
|
spv.noDeadDecorations.vert
|
2015-05-15 21:32:46 +00:00
|
|
|
spv.nonSquare.vert
|
|
|
|
spv.Operations.frag
|
2015-11-16 04:33:39 +00:00
|
|
|
spv.intOps.vert
|
2015-05-15 21:32:46 +00:00
|
|
|
spv.precision.frag
|
|
|
|
spv.prepost.frag
|
|
|
|
spv.qualifiers.vert
|
2016-04-14 08:53:07 +00:00
|
|
|
spv.shaderBallot.comp
|
2016-05-05 12:38:33 +00:00
|
|
|
spv.shaderGroupVote.comp
|
2015-12-07 11:07:17 +00:00
|
|
|
spv.shiftOps.frag
|
2015-05-15 21:32:46 +00:00
|
|
|
spv.simpleFunctionCall.frag
|
|
|
|
spv.simpleMat.vert
|
2015-12-31 08:11:41 +00:00
|
|
|
spv.sparseTexture.frag
|
|
|
|
spv.sparseTextureClamp.frag
|
2015-05-15 21:32:46 +00:00
|
|
|
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
|
2015-09-16 09:48:22 +00:00
|
|
|
spv.image.frag
|
2015-05-15 21:32:46 +00:00
|
|
|
spv.types.frag
|
|
|
|
spv.uint.frag
|
|
|
|
spv.uniformArray.frag
|
|
|
|
spv.variableArrayIndex.frag
|
|
|
|
spv.varyingArray.frag
|
|
|
|
spv.varyingArrayIndirect.frag
|
|
|
|
spv.voidFunction.frag
|
|
|
|
spv.whileLoop.frag
|
2015-09-12 18:17:44 +00:00
|
|
|
spv.AofA.frag
|
2015-09-16 01:38:56 +00:00
|
|
|
spv.queryL.frag
|
2016-02-16 03:58:50 +00:00
|
|
|
spv.separate.frag
|
2015-10-15 19:29:11 +00:00
|
|
|
spv.shortCircuit.frag
|
2016-02-16 03:58:50 +00:00
|
|
|
spv.pushConstant.vert
|
|
|
|
spv.subpass.frag
|
|
|
|
spv.specConstant.vert
|
|
|
|
spv.specConstant.comp
|
2016-03-21 13:51:37 +00:00
|
|
|
spv.specConstantComposite.vert
|
Spec Constant Operations
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.
2016-03-21 13:51:37 +00:00
|
|
|
spv.specConstantOperations.vert
|
Precise and noContraction propagation
Reimplement the whole workflow to make that: precise'ness of struct
members won't spread to other non-precise members of the same struct
instance.
Approach:
1. Build the map from symbols to their defining nodes. And for each
object node (StructIndex, DirectIndex, Symbol nodes, etc), generates an
accesschain path. Different AST nodes that indicating a same object
should have the same accesschain path.
2. Along the building phase in step 1, collect the initial set of
'precise' (AST qualifier: 'noContraction') objects' accesschain paths.
3. Start with the initial set of 'precise' accesschain paths, use it as
a worklist, do as the following steps until the worklist is empty:
1) Pop an accesschain path from worklist.
2) Get the symbol part from the accesschain path.
3) Find the defining nodes of that symbol.
4) For each defining node, check whether it is defining a 'precise'
object, or its assignee has nested 'precise' object. Get the
incremental path from assignee to its nested 'precise' object (if
any).
5) Traverse the right side of the defining node, obtain the
accesschain paths of the corresponding involved 'precise' objects.
Update the worklist with those new objects' accesschain paths.
Label involved operations with 'noContraction'.
In each step, whenever we find the parent object of an nested object is
'precise' (has 'noContraction' qualifier), we let the nested object
inherit the 'precise'ness from its parent object.
2016-05-04 21:34:38 +00:00
|
|
|
spv.precise.tese
|
|
|
|
spv.precise.tesc
|
2016-02-16 03:58:50 +00:00
|
|
|
# GLSL-level semantics
|
|
|
|
vulkan.frag
|
|
|
|
vulkan.vert
|
|
|
|
vulkan.comp
|