Merge pull request #1761 from KhronosGroup/SPIR-V_1.4
SPV 1.4: Add code generation for SPIR-V 1.4 features
This commit is contained in:
commit
b03da6edd8
@ -135,7 +135,7 @@ protected:
|
|||||||
spv::ImageFormat TranslateImageFormat(const glslang::TType& type);
|
spv::ImageFormat TranslateImageFormat(const glslang::TType& type);
|
||||||
spv::SelectionControlMask TranslateSelectionControl(const glslang::TIntermSelection&) const;
|
spv::SelectionControlMask TranslateSelectionControl(const glslang::TIntermSelection&) const;
|
||||||
spv::SelectionControlMask TranslateSwitchControl(const glslang::TIntermSwitch&) const;
|
spv::SelectionControlMask TranslateSwitchControl(const glslang::TIntermSwitch&) const;
|
||||||
spv::LoopControlMask TranslateLoopControl(const glslang::TIntermLoop&, unsigned int& dependencyLength) const;
|
spv::LoopControlMask TranslateLoopControl(const glslang::TIntermLoop&, std::vector<unsigned int>& operands) const;
|
||||||
spv::StorageClass TranslateStorageClass(const glslang::TType&);
|
spv::StorageClass TranslateStorageClass(const glslang::TType&);
|
||||||
void addIndirectionIndexCapabilities(const glslang::TType& baseType, const glslang::TType& indexType);
|
void addIndirectionIndexCapabilities(const glslang::TType& baseType, const glslang::TType& indexType);
|
||||||
spv::Id createSpvVariable(const glslang::TIntermSymbol*);
|
spv::Id createSpvVariable(const glslang::TIntermSymbol*);
|
||||||
@ -1055,7 +1055,7 @@ spv::SelectionControlMask TGlslangToSpvTraverser::TranslateSwitchControl(const g
|
|||||||
|
|
||||||
// return a non-0 dependency if the dependency argument must be set
|
// return a non-0 dependency if the dependency argument must be set
|
||||||
spv::LoopControlMask TGlslangToSpvTraverser::TranslateLoopControl(const glslang::TIntermLoop& loopNode,
|
spv::LoopControlMask TGlslangToSpvTraverser::TranslateLoopControl(const glslang::TIntermLoop& loopNode,
|
||||||
unsigned int& dependencyLength) const
|
std::vector<unsigned int>& operands) const
|
||||||
{
|
{
|
||||||
spv::LoopControlMask control = spv::LoopControlMaskNone;
|
spv::LoopControlMask control = spv::LoopControlMaskNone;
|
||||||
|
|
||||||
@ -1067,7 +1067,29 @@ spv::LoopControlMask TGlslangToSpvTraverser::TranslateLoopControl(const glslang:
|
|||||||
control = control | spv::LoopControlDependencyInfiniteMask;
|
control = control | spv::LoopControlDependencyInfiniteMask;
|
||||||
else if (loopNode.getLoopDependency() > 0) {
|
else if (loopNode.getLoopDependency() > 0) {
|
||||||
control = control | spv::LoopControlDependencyLengthMask;
|
control = control | spv::LoopControlDependencyLengthMask;
|
||||||
dependencyLength = loopNode.getLoopDependency();
|
operands.push_back((unsigned int)loopNode.getLoopDependency());
|
||||||
|
}
|
||||||
|
if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4) {
|
||||||
|
if (loopNode.getMinIterations() > 0) {
|
||||||
|
control = control | spv::LoopControlMinIterationsMask;
|
||||||
|
operands.push_back(loopNode.getMinIterations());
|
||||||
|
}
|
||||||
|
if (loopNode.getMaxIterations() < glslang::TIntermLoop::iterationsInfinite) {
|
||||||
|
control = control | spv::LoopControlMaxIterationsMask;
|
||||||
|
operands.push_back(loopNode.getMaxIterations());
|
||||||
|
}
|
||||||
|
if (loopNode.getIterationMultiple() > 1) {
|
||||||
|
control = control | spv::LoopControlIterationMultipleMask;
|
||||||
|
operands.push_back(loopNode.getIterationMultiple());
|
||||||
|
}
|
||||||
|
if (loopNode.getPeelCount() > 0) {
|
||||||
|
control = control | spv::LoopControlPeelCountMask;
|
||||||
|
operands.push_back(loopNode.getPeelCount());
|
||||||
|
}
|
||||||
|
if (loopNode.getPartialCount() > 0) {
|
||||||
|
control = control | spv::LoopControlPartialCountMask;
|
||||||
|
operands.push_back(loopNode.getPartialCount());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return control;
|
return control;
|
||||||
@ -1552,12 +1574,18 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol)
|
|||||||
|
|
||||||
// Include all "static use" and "linkage only" interface variables on the OpEntryPoint instruction
|
// Include all "static use" and "linkage only" interface variables on the OpEntryPoint instruction
|
||||||
if (builder.isPointer(id)) {
|
if (builder.isPointer(id)) {
|
||||||
|
// Consider adding to the OpEntryPoint interface list.
|
||||||
|
// Only looking at structures if they have at least one member.
|
||||||
|
if (!symbol->getType().isStruct() || symbol->getType().getStruct()->size() > 0) {
|
||||||
spv::StorageClass sc = builder.getStorageClass(id);
|
spv::StorageClass sc = builder.getStorageClass(id);
|
||||||
if (sc == spv::StorageClassInput || sc == spv::StorageClassOutput) {
|
// Before SPIR-V 1.4, we only want to include Input and Output.
|
||||||
if (!symbol->getType().isStruct() || symbol->getType().getStruct()->size() > 0)
|
// Starting with SPIR-V 1.4, we want all globals.
|
||||||
|
if ((glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4 && sc != spv::StorageClassFunction) ||
|
||||||
|
(sc == spv::StorageClassInput || sc == spv::StorageClassOutput)) {
|
||||||
iOSet.insert(id);
|
iOSet.insert(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Only process non-linkage-only nodes for generating actual static uses
|
// Only process non-linkage-only nodes for generating actual static uses
|
||||||
if (! linkageOnly || symbol->getQualifier().isSpecConstant()) {
|
if (! linkageOnly || symbol->getQualifier().isSpecConstant()) {
|
||||||
@ -1683,6 +1711,7 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T
|
|||||||
case glslang::EOpIndexDirect:
|
case glslang::EOpIndexDirect:
|
||||||
case glslang::EOpIndexDirectStruct:
|
case glslang::EOpIndexDirectStruct:
|
||||||
{
|
{
|
||||||
|
// Structure, array, matrix, or vector indirection with statically known index.
|
||||||
// Get the left part of the access chain.
|
// Get the left part of the access chain.
|
||||||
node->getLeft()->traverse(this);
|
node->getLeft()->traverse(this);
|
||||||
|
|
||||||
@ -1737,8 +1766,8 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T
|
|||||||
return false;
|
return false;
|
||||||
case glslang::EOpIndexIndirect:
|
case glslang::EOpIndexIndirect:
|
||||||
{
|
{
|
||||||
// Structure or array or vector indirection.
|
// Array, matrix, or vector indirection with variable index.
|
||||||
// Will use native SPIR-V access-chain for struct and array indirection;
|
// Will use native SPIR-V access-chain for and array indirection;
|
||||||
// matrices are arrays of vectors, so will also work for a matrix.
|
// matrices are arrays of vectors, so will also work for a matrix.
|
||||||
// Will use the access chain's 'component' for variable index into a vector.
|
// Will use the access chain's 'component' for variable index into a vector.
|
||||||
|
|
||||||
@ -2609,6 +2638,19 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|||||||
// next layer copies r-values into memory to use the access-chain mechanism
|
// next layer copies r-values into memory to use the access-chain mechanism
|
||||||
bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang::TIntermSelection* node)
|
bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang::TIntermSelection* node)
|
||||||
{
|
{
|
||||||
|
// see if OpSelect can handle it
|
||||||
|
const auto isOpSelectable = [&]() {
|
||||||
|
if (node->getBasicType() == glslang::EbtVoid)
|
||||||
|
return false;
|
||||||
|
// OpSelect can do all other types starting with SPV 1.4
|
||||||
|
if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_4) {
|
||||||
|
// pre-1.4, only scalars and vectors can be handled
|
||||||
|
if ((!node->getType().isScalar() && !node->getType().isVector()))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
// See if it simple and safe, or required, to execute both sides.
|
// See if it simple and safe, or required, to execute both sides.
|
||||||
// Crucially, side effects must be either semantically required or avoided,
|
// Crucially, side effects must be either semantically required or avoided,
|
||||||
// and there are performance trade-offs.
|
// and there are performance trade-offs.
|
||||||
@ -2627,9 +2669,7 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang
|
|||||||
|
|
||||||
// if not required to execute both, decide based on performance/practicality...
|
// if not required to execute both, decide based on performance/practicality...
|
||||||
|
|
||||||
// see if OpSelect can handle it
|
if (!isOpSelectable())
|
||||||
if ((!node->getType().isScalar() && !node->getType().isVector()) ||
|
|
||||||
node->getBasicType() == glslang::EbtVoid)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
assert(node->getType() == node->getTrueBlock() ->getAsTyped()->getType() &&
|
assert(node->getType() == node->getTrueBlock() ->getAsTyped()->getType() &&
|
||||||
@ -2666,14 +2706,16 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang
|
|||||||
// emit code to select between trueValue and falseValue
|
// emit code to select between trueValue and falseValue
|
||||||
|
|
||||||
// see if OpSelect can handle it
|
// see if OpSelect can handle it
|
||||||
if (node->getType().isScalar() || node->getType().isVector()) {
|
if (isOpSelectable()) {
|
||||||
// Emit OpSelect for this selection.
|
// Emit OpSelect for this selection.
|
||||||
|
|
||||||
// smear condition to vector, if necessary (AST is always scalar)
|
// smear condition to vector, if necessary (AST is always scalar)
|
||||||
if (builder.isVector(trueValue))
|
// Before 1.4, smear like for mix(), starting with 1.4, keep it scalar
|
||||||
|
if (glslangIntermediate->getSpv().spv < glslang::EShTargetSpv_1_4 && builder.isVector(trueValue)) {
|
||||||
condition = builder.smearScalar(spv::NoPrecision, condition,
|
condition = builder.smearScalar(spv::NoPrecision, condition,
|
||||||
builder.makeVectorType(builder.makeBoolType(),
|
builder.makeVectorType(builder.makeBoolType(),
|
||||||
builder.getNumComponents(trueValue)));
|
builder.getNumComponents(trueValue)));
|
||||||
|
}
|
||||||
|
|
||||||
// OpSelect
|
// OpSelect
|
||||||
result = builder.createTriOp(spv::OpSelect,
|
result = builder.createTriOp(spv::OpSelect,
|
||||||
@ -2822,8 +2864,8 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn
|
|||||||
builder.createBranch(&blocks.head);
|
builder.createBranch(&blocks.head);
|
||||||
|
|
||||||
// Loop control:
|
// Loop control:
|
||||||
unsigned int dependencyLength = glslang::TIntermLoop::dependencyInfinite;
|
std::vector<unsigned int> operands;
|
||||||
const spv::LoopControlMask control = TranslateLoopControl(*node, dependencyLength);
|
const spv::LoopControlMask control = TranslateLoopControl(*node, operands);
|
||||||
|
|
||||||
// Spec requires back edges to target header blocks, and every header block
|
// Spec requires back edges to target header blocks, and every header block
|
||||||
// must dominate its merge block. Make a header block first to ensure these
|
// must dominate its merge block. Make a header block first to ensure these
|
||||||
@ -2833,7 +2875,7 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn
|
|||||||
// including merges of its own.
|
// including merges of its own.
|
||||||
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
builder.setLine(node->getLoc().line, node->getLoc().getFilename());
|
||||||
builder.setBuildPoint(&blocks.head);
|
builder.setBuildPoint(&blocks.head);
|
||||||
builder.createLoopMerge(&blocks.merge, &blocks.continue_target, control, dependencyLength);
|
builder.createLoopMerge(&blocks.merge, &blocks.continue_target, control, operands);
|
||||||
if (node->testFirst() && node->getTest()) {
|
if (node->testFirst() && node->getTest()) {
|
||||||
spv::Block& test = builder.makeNewBlock();
|
spv::Block& test = builder.makeNewBlock();
|
||||||
builder.createBranch(&test);
|
builder.createBranch(&test);
|
||||||
@ -3615,6 +3657,20 @@ void TGlslangToSpvTraverser::multiTypeStore(const glslang::TType& type, spv::Id
|
|||||||
// where the two types were the same type in GLSL. This requires member
|
// where the two types were the same type in GLSL. This requires member
|
||||||
// by member copy, recursively.
|
// by member copy, recursively.
|
||||||
|
|
||||||
|
// SPIR-V 1.4 added an instruction to do help do this.
|
||||||
|
if (glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4) {
|
||||||
|
// However, bool in uniform space is changed to int, so
|
||||||
|
// OpCopyLogical does not work for that.
|
||||||
|
// TODO: It would be more robust to do a full recursive verification of the types satisfying SPIR-V rules.
|
||||||
|
bool rBool = builder.containsType(builder.getTypeId(rValue), spv::OpTypeBool, 0);
|
||||||
|
bool lBool = builder.containsType(lType, spv::OpTypeBool, 0);
|
||||||
|
if (lBool == rBool) {
|
||||||
|
spv::Id logicalCopy = builder.createUnaryOp(spv::OpCopyLogical, lType, rValue);
|
||||||
|
accessChainStore(type, logicalCopy);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If an array, copy element by element.
|
// If an array, copy element by element.
|
||||||
if (type.isArray()) {
|
if (type.isArray()) {
|
||||||
glslang::TType glslangElementType(type, 0);
|
glslang::TType glslangElementType(type, 0);
|
||||||
@ -4126,7 +4182,8 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
|
|
||||||
// Process a GLSL texturing op (will be SPV image)
|
// Process a GLSL texturing op (will be SPV image)
|
||||||
|
|
||||||
const glslang::TType &imageType = node->getAsAggregate() ? node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType()
|
const glslang::TType &imageType = node->getAsAggregate()
|
||||||
|
? node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType()
|
||||||
: node->getAsUnaryNode()->getOperand()->getAsTyped()->getType();
|
: node->getAsUnaryNode()->getOperand()->getAsTyped()->getType();
|
||||||
const glslang::TSampler sampler = imageType.getSampler();
|
const glslang::TSampler sampler = imageType.getSampler();
|
||||||
#ifdef AMD_EXTENSIONS
|
#ifdef AMD_EXTENSIONS
|
||||||
@ -4135,6 +4192,16 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
: false;
|
: false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const auto signExtensionMask = [&]() {
|
||||||
|
if (builder.getSpvVersion() >= spv::Spv_1_4) {
|
||||||
|
if (sampler.type == glslang::EbtUint)
|
||||||
|
return spv::ImageOperandsZeroExtendMask;
|
||||||
|
else if (sampler.type == glslang::EbtInt)
|
||||||
|
return spv::ImageOperandsSignExtendMask;
|
||||||
|
}
|
||||||
|
return spv::ImageOperandsMaskNone;
|
||||||
|
};
|
||||||
|
|
||||||
std::vector<spv::Id> arguments;
|
std::vector<spv::Id> arguments;
|
||||||
if (node->getAsAggregate())
|
if (node->getAsAggregate())
|
||||||
translateArguments(*node->getAsAggregate(), arguments);
|
translateArguments(*node->getAsAggregate(), arguments);
|
||||||
@ -4213,12 +4280,18 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
spv::IdImmediate coord = { true,
|
spv::IdImmediate coord = { true,
|
||||||
builder.makeCompositeConstant(builder.makeVectorType(builder.makeIntType(32), 2), comps) };
|
builder.makeCompositeConstant(builder.makeVectorType(builder.makeIntType(32), 2), comps) };
|
||||||
operands.push_back(coord);
|
operands.push_back(coord);
|
||||||
|
spv::IdImmediate imageOperands = { false, spv::ImageOperandsMaskNone };
|
||||||
|
imageOperands.word = imageOperands.word | signExtensionMask();
|
||||||
if (sampler.ms) {
|
if (sampler.ms) {
|
||||||
spv::IdImmediate imageOperands = { false, spv::ImageOperandsSampleMask };
|
imageOperands.word = imageOperands.word | spv::ImageOperandsSampleMask;
|
||||||
|
}
|
||||||
|
if (imageOperands.word != spv::ImageOperandsMaskNone) {
|
||||||
operands.push_back(imageOperands);
|
operands.push_back(imageOperands);
|
||||||
|
if (sampler.ms) {
|
||||||
spv::IdImmediate imageOperand = { true, *(opIt++) };
|
spv::IdImmediate imageOperand = { true, *(opIt++) };
|
||||||
operands.push_back(imageOperand);
|
operands.push_back(imageOperand);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
spv::Id result = builder.createOp(spv::OpImageRead, resultType(), operands);
|
spv::Id result = builder.createOp(spv::OpImageRead, resultType(), operands);
|
||||||
builder.setPrecision(result, precision);
|
builder.setPrecision(result, precision);
|
||||||
return result;
|
return result;
|
||||||
@ -4244,7 +4317,8 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
#endif
|
#endif
|
||||||
mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
|
mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
|
||||||
mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelAvailableKHRMask);
|
mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelAvailableKHRMask);
|
||||||
if (mask) {
|
mask = mask | signExtensionMask();
|
||||||
|
if (mask != spv::MemoryAccessMaskNone) {
|
||||||
spv::IdImmediate imageOperands = { false, (unsigned int)mask };
|
spv::IdImmediate imageOperands = { false, (unsigned int)mask };
|
||||||
operands.push_back(imageOperands);
|
operands.push_back(imageOperands);
|
||||||
}
|
}
|
||||||
@ -4259,7 +4333,8 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (mask & spv::ImageOperandsMakeTexelVisibleKHRMask) {
|
if (mask & spv::ImageOperandsMakeTexelVisibleKHRMask) {
|
||||||
spv::IdImmediate imageOperand = { true, builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };
|
spv::IdImmediate imageOperand = { true,
|
||||||
|
builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };
|
||||||
operands.push_back(imageOperand);
|
operands.push_back(imageOperand);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4306,7 +4381,8 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
#endif
|
#endif
|
||||||
mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
|
mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
|
||||||
mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelVisibleKHRMask);
|
mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelVisibleKHRMask);
|
||||||
if (mask) {
|
mask = mask | signExtensionMask();
|
||||||
|
if (mask != spv::MemoryAccessMaskNone) {
|
||||||
spv::IdImmediate imageOperands = { false, (unsigned int)mask };
|
spv::IdImmediate imageOperands = { false, (unsigned int)mask };
|
||||||
operands.push_back(imageOperands);
|
operands.push_back(imageOperands);
|
||||||
}
|
}
|
||||||
@ -4321,7 +4397,8 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (mask & spv::ImageOperandsMakeTexelAvailableKHRMask) {
|
if (mask & spv::ImageOperandsMakeTexelAvailableKHRMask) {
|
||||||
spv::IdImmediate imageOperand = { true, builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };
|
spv::IdImmediate imageOperand = { true,
|
||||||
|
builder.makeUintConstant(TranslateMemoryScope(TranslateCoherent(imageType))) };
|
||||||
operands.push_back(imageOperand);
|
operands.push_back(imageOperand);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4330,7 +4407,8 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
builder.addCapability(spv::CapabilityStorageImageWriteWithoutFormat);
|
builder.addCapability(spv::CapabilityStorageImageWriteWithoutFormat);
|
||||||
return spv::NoResult;
|
return spv::NoResult;
|
||||||
#ifdef AMD_EXTENSIONS
|
#ifdef AMD_EXTENSIONS
|
||||||
} else if (node->getOp() == glslang::EOpSparseImageLoad || node->getOp() == glslang::EOpSparseImageLoadLod) {
|
} else if (node->getOp() == glslang::EOpSparseImageLoad ||
|
||||||
|
node->getOp() == glslang::EOpSparseImageLoadLod) {
|
||||||
#else
|
#else
|
||||||
} else if (node->getOp() == glslang::EOpSparseImageLoad) {
|
} else if (node->getOp() == glslang::EOpSparseImageLoad) {
|
||||||
#endif
|
#endif
|
||||||
@ -4352,7 +4430,8 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
#endif
|
#endif
|
||||||
mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
|
mask = mask | TranslateImageOperands(TranslateCoherent(imageType));
|
||||||
mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelAvailableKHRMask);
|
mask = (spv::ImageOperandsMask)(mask & ~spv::ImageOperandsMakeTexelAvailableKHRMask);
|
||||||
if (mask) {
|
mask = mask | signExtensionMask();
|
||||||
|
if (mask != spv::MemoryAccessMaskNone) {
|
||||||
spv::IdImmediate imageOperands = { false, (unsigned int)mask };
|
spv::IdImmediate imageOperands = { false, (unsigned int)mask };
|
||||||
operands.push_back(imageOperands);
|
operands.push_back(imageOperands);
|
||||||
}
|
}
|
||||||
@ -4654,7 +4733,8 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
spv::Id resType = builder.makeStructType(members, "ResType");
|
spv::Id resType = builder.makeStructType(members, "ResType");
|
||||||
|
|
||||||
//call ImageFootprintNV
|
//call ImageFootprintNV
|
||||||
spv::Id res = builder.createTextureCall(precision, resType, sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params);
|
spv::Id res = builder.createTextureCall(precision, resType, sparse, cracked.fetch, cracked.proj,
|
||||||
|
cracked.gather, noImplicitLod, params, signExtensionMask());
|
||||||
|
|
||||||
//copy resType (SPIR-V type) to resultStructType(OpenGL type)
|
//copy resType (SPIR-V type) to resultStructType(OpenGL type)
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
@ -4707,7 +4787,8 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<spv::Id> result( 1,
|
std::vector<spv::Id> result( 1,
|
||||||
builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params)
|
builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather,
|
||||||
|
noImplicitLod, params, signExtensionMask())
|
||||||
);
|
);
|
||||||
|
|
||||||
if (components != node->getType().getVectorSize())
|
if (components != node->getType().getVectorSize())
|
||||||
|
|||||||
@ -1306,11 +1306,13 @@ void Builder::makeDiscard()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Comments in header
|
// Comments in header
|
||||||
Id Builder::createVariable(StorageClass storageClass, Id type, const char* name)
|
Id Builder::createVariable(StorageClass storageClass, Id type, const char* name, Id initializer)
|
||||||
{
|
{
|
||||||
Id pointerType = makePointer(storageClass, type);
|
Id pointerType = makePointer(storageClass, type);
|
||||||
Instruction* inst = new Instruction(getUniqueId(), pointerType, OpVariable);
|
Instruction* inst = new Instruction(getUniqueId(), pointerType, OpVariable);
|
||||||
inst->addImmediateOperand(storageClass);
|
inst->addImmediateOperand(storageClass);
|
||||||
|
if (initializer != NoResult)
|
||||||
|
inst->addIdOperand(initializer);
|
||||||
|
|
||||||
switch (storageClass) {
|
switch (storageClass) {
|
||||||
case StorageClassFunction:
|
case StorageClassFunction:
|
||||||
@ -1806,7 +1808,7 @@ Id Builder::createBuiltinCall(Id resultType, Id builtins, int entryPoint, const
|
|||||||
// Accept all parameters needed to create a texture instruction.
|
// Accept all parameters needed to create a texture instruction.
|
||||||
// Create the correct instruction based on the inputs, and make the call.
|
// Create the correct instruction based on the inputs, and make the call.
|
||||||
Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather,
|
Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather,
|
||||||
bool noImplicitLod, const TextureParameters& parameters)
|
bool noImplicitLod, const TextureParameters& parameters, ImageOperandsMask signExtensionMask)
|
||||||
{
|
{
|
||||||
static const int maxTextureArgs = 10;
|
static const int maxTextureArgs = 10;
|
||||||
Id texArgs[maxTextureArgs] = {};
|
Id texArgs[maxTextureArgs] = {};
|
||||||
@ -1887,6 +1889,7 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool sparse,
|
|||||||
if (parameters.volatil) {
|
if (parameters.volatil) {
|
||||||
mask = mask | ImageOperandsVolatileTexelKHRMask;
|
mask = mask | ImageOperandsVolatileTexelKHRMask;
|
||||||
}
|
}
|
||||||
|
mask = mask | signExtensionMask;
|
||||||
if (mask == ImageOperandsMaskNone)
|
if (mask == ImageOperandsMaskNone)
|
||||||
--numArgs; // undo speculative reservation for the mask argument
|
--numArgs; // undo speculative reservation for the mask argument
|
||||||
else
|
else
|
||||||
@ -2649,12 +2652,19 @@ Id Builder::accessChainLoad(Decoration precision, Decoration nonUniform, Id resu
|
|||||||
if (constant) {
|
if (constant) {
|
||||||
id = createCompositeExtract(accessChain.base, swizzleBase, indexes);
|
id = createCompositeExtract(accessChain.base, swizzleBase, indexes);
|
||||||
} else {
|
} else {
|
||||||
// make a new function variable for this r-value
|
Id lValue = NoResult;
|
||||||
Id lValue = createVariable(StorageClassFunction, getTypeId(accessChain.base), "indexable");
|
if (spvVersion >= Spv_1_4) {
|
||||||
|
// make a new function variable for this r-value, using an initializer,
|
||||||
|
// and mark it as NonWritable so that downstream it can be detected as a lookup
|
||||||
|
// table
|
||||||
|
lValue = createVariable(StorageClassFunction, getTypeId(accessChain.base), "indexable",
|
||||||
|
accessChain.base);
|
||||||
|
addDecoration(lValue, DecorationNonWritable);
|
||||||
|
} else {
|
||||||
|
lValue = createVariable(StorageClassFunction, getTypeId(accessChain.base), "indexable");
|
||||||
// store into it
|
// store into it
|
||||||
createStore(accessChain.base, lValue);
|
createStore(accessChain.base, lValue);
|
||||||
|
}
|
||||||
// move base to the new variable
|
// move base to the new variable
|
||||||
accessChain.base = lValue;
|
accessChain.base = lValue;
|
||||||
accessChain.isRValue = false;
|
accessChain.isRValue = false;
|
||||||
@ -2956,14 +2966,14 @@ void Builder::createSelectionMerge(Block* mergeBlock, unsigned int control)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Builder::createLoopMerge(Block* mergeBlock, Block* continueBlock, unsigned int control,
|
void Builder::createLoopMerge(Block* mergeBlock, Block* continueBlock, unsigned int control,
|
||||||
unsigned int dependencyLength)
|
const std::vector<unsigned int>& operands)
|
||||||
{
|
{
|
||||||
Instruction* merge = new Instruction(OpLoopMerge);
|
Instruction* merge = new Instruction(OpLoopMerge);
|
||||||
merge->addIdOperand(mergeBlock->getId());
|
merge->addIdOperand(mergeBlock->getId());
|
||||||
merge->addIdOperand(continueBlock->getId());
|
merge->addIdOperand(continueBlock->getId());
|
||||||
merge->addImmediateOperand(control);
|
merge->addImmediateOperand(control);
|
||||||
if ((control & LoopControlDependencyLengthMask) != 0)
|
for (int op = 0; op < (int)operands.size(); ++op)
|
||||||
merge->addImmediateOperand(dependencyLength);
|
merge->addImmediateOperand(operands[op]);
|
||||||
buildPoint->addInstruction(std::unique_ptr<Instruction>(merge));
|
buildPoint->addInstruction(std::unique_ptr<Instruction>(merge));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -61,6 +61,14 @@
|
|||||||
|
|
||||||
namespace spv {
|
namespace spv {
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
Spv_1_0 = (1 << 16),
|
||||||
|
Spv_1_1 = (1 << 16) | (1 << 8),
|
||||||
|
Spv_1_2 = (1 << 16) | (2 << 8),
|
||||||
|
Spv_1_3 = (1 << 16) | (3 << 8),
|
||||||
|
Spv_1_4 = (1 << 16) | (4 << 8),
|
||||||
|
} SpvVersion;
|
||||||
|
|
||||||
class Builder {
|
class Builder {
|
||||||
public:
|
public:
|
||||||
Builder(unsigned int spvVersion, unsigned int userNumber, SpvBuildLogger* logger);
|
Builder(unsigned int spvVersion, unsigned int userNumber, SpvBuildLogger* logger);
|
||||||
@ -300,7 +308,7 @@ public:
|
|||||||
void makeDiscard();
|
void makeDiscard();
|
||||||
|
|
||||||
// Create a global or function local or IO variable.
|
// Create a global or function local or IO variable.
|
||||||
Id createVariable(StorageClass, Id type, const char* name = 0);
|
Id createVariable(StorageClass, Id type, const char* name = 0, Id initializer = NoResult);
|
||||||
|
|
||||||
// Create an intermediate with an undefined value.
|
// Create an intermediate with an undefined value.
|
||||||
Id createUndefined(Id type);
|
Id createUndefined(Id type);
|
||||||
@ -408,7 +416,8 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Select the correct texture operation based on all inputs, and emit the correct instruction
|
// Select the correct texture operation based on all inputs, and emit the correct instruction
|
||||||
Id createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather, bool noImplicit, const TextureParameters&);
|
Id createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather,
|
||||||
|
bool noImplicit, const TextureParameters&, ImageOperandsMask);
|
||||||
|
|
||||||
// Emit the OpTextureQuery* instruction that was passed in.
|
// Emit the OpTextureQuery* instruction that was passed in.
|
||||||
// Figure out the right return value and type, and return it.
|
// Figure out the right return value and type, and return it.
|
||||||
@ -662,7 +671,7 @@ public:
|
|||||||
|
|
||||||
void createBranch(Block* block);
|
void createBranch(Block* block);
|
||||||
void createConditionalBranch(Id condition, Block* thenBlock, Block* elseBlock);
|
void createConditionalBranch(Id condition, Block* thenBlock, Block* elseBlock);
|
||||||
void createLoopMerge(Block* mergeBlock, Block* continueBlock, unsigned int control, unsigned int dependencyLength);
|
void createLoopMerge(Block* mergeBlock, Block* continueBlock, unsigned int control, const std::vector<unsigned int>& operands);
|
||||||
|
|
||||||
// Sets to generate opcode for specialization constants.
|
// Sets to generate opcode for specialization constants.
|
||||||
void setToSpecConstCodeGenMode() { generatingOpCodeForSpecConst = true; }
|
void setToSpecConstCodeGenMode() { generatingOpCodeForSpecConst = true; }
|
||||||
|
|||||||
@ -52,8 +52,21 @@ namespace glslang {
|
|||||||
spv_target_env MapToSpirvToolsEnv(const SpvVersion& spvVersion, spv::SpvBuildLogger* logger)
|
spv_target_env MapToSpirvToolsEnv(const SpvVersion& spvVersion, spv::SpvBuildLogger* logger)
|
||||||
{
|
{
|
||||||
switch (spvVersion.vulkan) {
|
switch (spvVersion.vulkan) {
|
||||||
case glslang::EShTargetVulkan_1_0: return spv_target_env::SPV_ENV_VULKAN_1_0;
|
case glslang::EShTargetVulkan_1_0:
|
||||||
case glslang::EShTargetVulkan_1_1: return spv_target_env::SPV_ENV_VULKAN_1_1;
|
return spv_target_env::SPV_ENV_VULKAN_1_0;
|
||||||
|
case glslang::EShTargetVulkan_1_1:
|
||||||
|
switch (spvVersion.spv) {
|
||||||
|
case EShTargetSpv_1_0:
|
||||||
|
case EShTargetSpv_1_1:
|
||||||
|
case EShTargetSpv_1_2:
|
||||||
|
case EShTargetSpv_1_3:
|
||||||
|
return spv_target_env::SPV_ENV_VULKAN_1_1;
|
||||||
|
case EShTargetSpv_1_4:
|
||||||
|
return spv_target_env::SPV_ENV_VULKAN_1_1_SPIRV_1_4;
|
||||||
|
default:
|
||||||
|
logger->missingFunctionality("Target version for SPIRV-Tools validator");
|
||||||
|
return spv_target_env::SPV_ENV_VULKAN_1_1;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -575,7 +575,7 @@ const char* ImageChannelDataTypeString(int type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const int ImageOperandsCeiling = 12;
|
const int ImageOperandsCeiling = 14;
|
||||||
|
|
||||||
const char* ImageOperandsString(int format)
|
const char* ImageOperandsString(int format)
|
||||||
{
|
{
|
||||||
@ -592,6 +592,8 @@ const char* ImageOperandsString(int format)
|
|||||||
case ImageOperandsMakeTexelVisibleKHRShift: return "MakeTexelVisibleKHR";
|
case ImageOperandsMakeTexelVisibleKHRShift: return "MakeTexelVisibleKHR";
|
||||||
case ImageOperandsNonPrivateTexelKHRShift: return "NonPrivateTexelKHR";
|
case ImageOperandsNonPrivateTexelKHRShift: return "NonPrivateTexelKHR";
|
||||||
case ImageOperandsVolatileTexelKHRShift: return "VolatileTexelKHR";
|
case ImageOperandsVolatileTexelKHRShift: return "VolatileTexelKHR";
|
||||||
|
case ImageOperandsSignExtendShift: return "SignExtend";
|
||||||
|
case ImageOperandsZeroExtendShift: return "ZeroExtend";
|
||||||
|
|
||||||
case ImageOperandsCeiling:
|
case ImageOperandsCeiling:
|
||||||
default:
|
default:
|
||||||
@ -674,15 +676,20 @@ const char* SelectControlString(int cont)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const int LoopControlCeiling = 4;
|
const int LoopControlCeiling = LoopControlPartialCountShift + 1;
|
||||||
|
|
||||||
const char* LoopControlString(int cont)
|
const char* LoopControlString(int cont)
|
||||||
{
|
{
|
||||||
switch (cont) {
|
switch (cont) {
|
||||||
case 0: return "Unroll";
|
case LoopControlUnrollShift: return "Unroll";
|
||||||
case 1: return "DontUnroll";
|
case LoopControlDontUnrollShift: return "DontUnroll";
|
||||||
case 2: return "DependencyInfinite";
|
case LoopControlDependencyInfiniteShift: return "DependencyInfinite";
|
||||||
case 3: return "DependencyLength";
|
case LoopControlDependencyLengthShift: return "DependencyLength";
|
||||||
|
case LoopControlMinIterationsShift: return "MinIterations";
|
||||||
|
case LoopControlMaxIterationsShift: return "MaxIterations";
|
||||||
|
case LoopControlIterationMultipleShift: return "IterationMultiple";
|
||||||
|
case LoopControlPeelCountShift: return "PeelCount";
|
||||||
|
case LoopControlPartialCountShift: return "PartialCount";
|
||||||
|
|
||||||
case LoopControlCeiling:
|
case LoopControlCeiling:
|
||||||
default: return "Bad";
|
default: return "Bad";
|
||||||
@ -1026,6 +1033,7 @@ const char* OpcodeString(int op)
|
|||||||
case 82: return "OpCompositeInsert";
|
case 82: return "OpCompositeInsert";
|
||||||
case 83: return "OpCopyObject";
|
case 83: return "OpCopyObject";
|
||||||
case 84: return "OpTranspose";
|
case 84: return "OpTranspose";
|
||||||
|
case OpCopyLogical: return "OpCopyLogical";
|
||||||
case 85: return "Bad";
|
case 85: return "Bad";
|
||||||
case 86: return "OpSampledImage";
|
case 86: return "OpSampledImage";
|
||||||
case 87: return "OpImageSampleImplicitLod";
|
case 87: return "OpImageSampleImplicitLod";
|
||||||
@ -1933,6 +1941,8 @@ void Parameterize()
|
|||||||
|
|
||||||
InstructionDesc[OpTranspose].operands.push(OperandId, "'Matrix'");
|
InstructionDesc[OpTranspose].operands.push(OperandId, "'Matrix'");
|
||||||
|
|
||||||
|
InstructionDesc[OpCopyLogical].operands.push(OperandId, "'Operand'");
|
||||||
|
|
||||||
InstructionDesc[OpIsNan].operands.push(OperandId, "'x'");
|
InstructionDesc[OpIsNan].operands.push(OperandId, "'x'");
|
||||||
|
|
||||||
InstructionDesc[OpIsInf].operands.push(OperandId, "'x'");
|
InstructionDesc[OpIsInf].operands.push(OperandId, "'x'");
|
||||||
|
|||||||
@ -56,7 +56,7 @@ ERROR: node is still EOpNull!
|
|||||||
0:28 Function Definition: attExt( ( global void)
|
0:28 Function Definition: attExt( ( global void)
|
||||||
0:28 Function Parameters:
|
0:28 Function Parameters:
|
||||||
0:30 Sequence
|
0:30 Sequence
|
||||||
0:30 Loop with condition not tested first: Dependency -3
|
0:30 Loop with condition not tested first
|
||||||
0:30 Loop Condition
|
0:30 Loop Condition
|
||||||
0:30 Constant:
|
0:30 Constant:
|
||||||
0:30 true (const bool)
|
0:30 true (const bool)
|
||||||
|
|||||||
109
Test/baseResults/spv.1.4.LoopControl.frag.out
Normal file
109
Test/baseResults/spv.1.4.LoopControl.frag.out
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
spv.1.4.LoopControl.frag
|
||||||
|
WARNING: 0:15: 'min_iterations' : expected a single integer argument
|
||||||
|
WARNING: 0:15: 'max_iterations' : expected a single integer argument
|
||||||
|
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 54
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 53
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source GLSL 450
|
||||||
|
SourceExtension "GL_EXT_control_flow_attributes"
|
||||||
|
Name 4 "main"
|
||||||
|
Name 8 "i"
|
||||||
|
Name 32 "i"
|
||||||
|
Name 42 "i"
|
||||||
|
Name 53 "cond"
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeInt 32 1
|
||||||
|
7: TypePointer Function 6(int)
|
||||||
|
9: 6(int) Constant 0
|
||||||
|
16: 6(int) Constant 8
|
||||||
|
17: TypeBool
|
||||||
|
20: 6(int) Constant 1
|
||||||
|
27: 17(bool) ConstantTrue
|
||||||
|
52: TypePointer Private 17(bool)
|
||||||
|
53(cond): 52(ptr) Variable Private
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
8(i): 7(ptr) Variable Function
|
||||||
|
32(i): 7(ptr) Variable Function
|
||||||
|
42(i): 7(ptr) Variable Function
|
||||||
|
Store 8(i) 9
|
||||||
|
Branch 10
|
||||||
|
10: Label
|
||||||
|
LoopMerge 12 13 MinIterations MaxIterations 3 7
|
||||||
|
Branch 14
|
||||||
|
14: Label
|
||||||
|
15: 6(int) Load 8(i)
|
||||||
|
18: 17(bool) SLessThan 15 16
|
||||||
|
BranchConditional 18 11 12
|
||||||
|
11: Label
|
||||||
|
Branch 13
|
||||||
|
13: Label
|
||||||
|
19: 6(int) Load 8(i)
|
||||||
|
21: 6(int) IAdd 19 20
|
||||||
|
Store 8(i) 21
|
||||||
|
Branch 10
|
||||||
|
12: Label
|
||||||
|
Branch 22
|
||||||
|
22: Label
|
||||||
|
LoopMerge 24 25 IterationMultiple 2
|
||||||
|
Branch 26
|
||||||
|
26: Label
|
||||||
|
BranchConditional 27 23 24
|
||||||
|
23: Label
|
||||||
|
Branch 25
|
||||||
|
25: Label
|
||||||
|
Branch 22
|
||||||
|
24: Label
|
||||||
|
Branch 28
|
||||||
|
28: Label
|
||||||
|
LoopMerge 30 31 PeelCount 5
|
||||||
|
Branch 29
|
||||||
|
29: Label
|
||||||
|
Branch 31
|
||||||
|
31: Label
|
||||||
|
BranchConditional 27 28 30
|
||||||
|
30: Label
|
||||||
|
Store 32(i) 9
|
||||||
|
Branch 33
|
||||||
|
33: Label
|
||||||
|
LoopMerge 35 36 PartialCount 4
|
||||||
|
Branch 37
|
||||||
|
37: Label
|
||||||
|
38: 6(int) Load 32(i)
|
||||||
|
39: 17(bool) SLessThan 38 16
|
||||||
|
BranchConditional 39 34 35
|
||||||
|
34: Label
|
||||||
|
Branch 36
|
||||||
|
36: Label
|
||||||
|
40: 6(int) Load 32(i)
|
||||||
|
41: 6(int) IAdd 40 20
|
||||||
|
Store 32(i) 41
|
||||||
|
Branch 33
|
||||||
|
35: Label
|
||||||
|
Store 42(i) 9
|
||||||
|
Branch 43
|
||||||
|
43: Label
|
||||||
|
LoopMerge 45 46 None
|
||||||
|
Branch 47
|
||||||
|
47: Label
|
||||||
|
48: 6(int) Load 42(i)
|
||||||
|
49: 17(bool) SLessThan 48 16
|
||||||
|
BranchConditional 49 44 45
|
||||||
|
44: Label
|
||||||
|
Branch 46
|
||||||
|
46: Label
|
||||||
|
50: 6(int) Load 42(i)
|
||||||
|
51: 6(int) IAdd 50 20
|
||||||
|
Store 42(i) 51
|
||||||
|
Branch 43
|
||||||
|
45: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
58
Test/baseResults/spv.1.4.NonWritable.frag.out
Executable file
58
Test/baseResults/spv.1.4.NonWritable.frag.out
Executable file
@ -0,0 +1,58 @@
|
|||||||
|
spv.1.4.NonWritable.frag
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 38
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 8 31
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 8 "color"
|
||||||
|
Name 31 "index"
|
||||||
|
Name 34 "indexable"
|
||||||
|
Decorate 8(color) Location 0
|
||||||
|
Decorate 31(index) Flat
|
||||||
|
Decorate 31(index) Location 0
|
||||||
|
Decorate 34(indexable) NonWritable
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypePointer Output 6(float)
|
||||||
|
8(color): 7(ptr) Variable Output
|
||||||
|
9: TypeInt 32 0
|
||||||
|
10: 9(int) Constant 16
|
||||||
|
11: TypeArray 6(float) 10
|
||||||
|
12: 6(float) Constant 1065353216
|
||||||
|
13: 6(float) Constant 1073741824
|
||||||
|
14: 6(float) Constant 1077936128
|
||||||
|
15: 6(float) Constant 1082130432
|
||||||
|
16: 6(float) Constant 1084227584
|
||||||
|
17: 6(float) Constant 1086324736
|
||||||
|
18: 6(float) Constant 1088421888
|
||||||
|
19: 6(float) Constant 1090519040
|
||||||
|
20: 6(float) Constant 1091567616
|
||||||
|
21: 6(float) Constant 1092616192
|
||||||
|
22: 6(float) Constant 1093664768
|
||||||
|
23: 6(float) Constant 1094713344
|
||||||
|
24: 6(float) Constant 1095761920
|
||||||
|
25: 6(float) Constant 1096810496
|
||||||
|
26: 6(float) Constant 1097859072
|
||||||
|
27: 6(float) Constant 1098907648
|
||||||
|
28: 11 ConstantComposite 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
||||||
|
29: TypeInt 32 1
|
||||||
|
30: TypePointer Input 29(int)
|
||||||
|
31(index): 30(ptr) Variable Input
|
||||||
|
33: TypePointer Function 11
|
||||||
|
35: TypePointer Function 6(float)
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
34(indexable): 33(ptr) Variable Function 28
|
||||||
|
32: 29(int) Load 31(index)
|
||||||
|
36: 35(ptr) AccessChain 34(indexable) 32
|
||||||
|
37: 6(float) Load 36
|
||||||
|
Store 8(color) 37
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
150
Test/baseResults/spv.1.4.OpCopyLogical.comp.out
Normal file
150
Test/baseResults/spv.1.4.OpCopyLogical.comp.out
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
spv.1.4.OpCopyLogical.comp
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 65
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint GLCompute 4 "main" 19 27 35 51 60
|
||||||
|
ExecutionMode 4 LocalSize 1 1 1
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 12 "MyStruct"
|
||||||
|
MemberName 12(MyStruct) 0 "foo"
|
||||||
|
MemberName 12(MyStruct) 1 "sb"
|
||||||
|
Name 14 "t"
|
||||||
|
Name 16 "MyStruct"
|
||||||
|
MemberName 16(MyStruct) 0 "foo"
|
||||||
|
MemberName 16(MyStruct) 1 "sb"
|
||||||
|
Name 17 "SSBO0"
|
||||||
|
MemberName 17(SSBO0) 0 "a"
|
||||||
|
Name 19 "inBuf"
|
||||||
|
Name 25 "SSBO1"
|
||||||
|
MemberName 25(SSBO1) 0 "b"
|
||||||
|
Name 27 "outBuf"
|
||||||
|
Name 32 "MyStruct"
|
||||||
|
MemberName 32(MyStruct) 0 "foo"
|
||||||
|
MemberName 32(MyStruct) 1 "sb"
|
||||||
|
Name 33 "UBO"
|
||||||
|
MemberName 33(UBO) 0 "c"
|
||||||
|
Name 35 "uBuf"
|
||||||
|
Name 44 "Nested"
|
||||||
|
MemberName 44(Nested) 0 "f"
|
||||||
|
MemberName 44(Nested) 1 "S"
|
||||||
|
Name 46 "n"
|
||||||
|
Name 48 "Nested"
|
||||||
|
MemberName 48(Nested) 0 "f"
|
||||||
|
MemberName 48(Nested) 1 "S"
|
||||||
|
Name 49 "UBON"
|
||||||
|
MemberName 49(UBON) 0 "N1"
|
||||||
|
Name 51 "uBufN"
|
||||||
|
Name 57 "Nested"
|
||||||
|
MemberName 57(Nested) 0 "f"
|
||||||
|
MemberName 57(Nested) 1 "S"
|
||||||
|
Name 58 "SSBO1N"
|
||||||
|
MemberName 58(SSBO1N) 0 "N2"
|
||||||
|
Name 60 "outBufN"
|
||||||
|
Decorate 15 ArrayStride 8
|
||||||
|
MemberDecorate 16(MyStruct) 0 Offset 0
|
||||||
|
MemberDecorate 16(MyStruct) 1 Offset 16
|
||||||
|
MemberDecorate 17(SSBO0) 0 Offset 0
|
||||||
|
Decorate 17(SSBO0) Block
|
||||||
|
Decorate 19(inBuf) DescriptorSet 0
|
||||||
|
Decorate 19(inBuf) Binding 0
|
||||||
|
MemberDecorate 25(SSBO1) 0 Offset 0
|
||||||
|
Decorate 25(SSBO1) Block
|
||||||
|
Decorate 27(outBuf) DescriptorSet 0
|
||||||
|
Decorate 27(outBuf) Binding 1
|
||||||
|
Decorate 31 ArrayStride 16
|
||||||
|
MemberDecorate 32(MyStruct) 0 Offset 0
|
||||||
|
MemberDecorate 32(MyStruct) 1 Offset 32
|
||||||
|
MemberDecorate 33(UBO) 0 Offset 0
|
||||||
|
Decorate 33(UBO) Block
|
||||||
|
Decorate 35(uBuf) DescriptorSet 0
|
||||||
|
Decorate 35(uBuf) Binding 2
|
||||||
|
Decorate 47 ArrayStride 48
|
||||||
|
MemberDecorate 48(Nested) 0 Offset 0
|
||||||
|
MemberDecorate 48(Nested) 1 Offset 16
|
||||||
|
MemberDecorate 49(UBON) 0 Offset 0
|
||||||
|
Decorate 49(UBON) Block
|
||||||
|
Decorate 51(uBufN) DescriptorSet 0
|
||||||
|
Decorate 51(uBufN) Binding 2
|
||||||
|
Decorate 56 ArrayStride 24
|
||||||
|
MemberDecorate 57(Nested) 0 Offset 0
|
||||||
|
MemberDecorate 57(Nested) 1 Offset 8
|
||||||
|
MemberDecorate 58(SSBO1N) 0 Offset 0
|
||||||
|
Decorate 58(SSBO1N) Block
|
||||||
|
Decorate 60(outBufN) DescriptorSet 0
|
||||||
|
Decorate 60(outBufN) Binding 1
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 2
|
||||||
|
8: TypeInt 32 0
|
||||||
|
9: 8(int) Constant 2
|
||||||
|
10: TypeArray 7(fvec2) 9
|
||||||
|
11: TypeInt 32 1
|
||||||
|
12(MyStruct): TypeStruct 10 11(int)
|
||||||
|
13: TypePointer Function 12(MyStruct)
|
||||||
|
15: TypeArray 7(fvec2) 9
|
||||||
|
16(MyStruct): TypeStruct 15 11(int)
|
||||||
|
17(SSBO0): TypeStruct 16(MyStruct)
|
||||||
|
18: TypePointer StorageBuffer 17(SSBO0)
|
||||||
|
19(inBuf): 18(ptr) Variable StorageBuffer
|
||||||
|
20: 11(int) Constant 0
|
||||||
|
21: TypePointer StorageBuffer 16(MyStruct)
|
||||||
|
25(SSBO1): TypeStruct 16(MyStruct)
|
||||||
|
26: TypePointer StorageBuffer 25(SSBO1)
|
||||||
|
27(outBuf): 26(ptr) Variable StorageBuffer
|
||||||
|
31: TypeArray 7(fvec2) 9
|
||||||
|
32(MyStruct): TypeStruct 31 11(int)
|
||||||
|
33(UBO): TypeStruct 32(MyStruct)
|
||||||
|
34: TypePointer Uniform 33(UBO)
|
||||||
|
35(uBuf): 34(ptr) Variable Uniform
|
||||||
|
36: TypePointer Uniform 32(MyStruct)
|
||||||
|
43: TypeArray 12(MyStruct) 9
|
||||||
|
44(Nested): TypeStruct 6(float) 43
|
||||||
|
45: TypePointer Function 44(Nested)
|
||||||
|
47: TypeArray 32(MyStruct) 9
|
||||||
|
48(Nested): TypeStruct 6(float) 47
|
||||||
|
49(UBON): TypeStruct 48(Nested)
|
||||||
|
50: TypePointer Uniform 49(UBON)
|
||||||
|
51(uBufN): 50(ptr) Variable Uniform
|
||||||
|
52: TypePointer Uniform 48(Nested)
|
||||||
|
56: TypeArray 16(MyStruct) 9
|
||||||
|
57(Nested): TypeStruct 6(float) 56
|
||||||
|
58(SSBO1N): TypeStruct 57(Nested)
|
||||||
|
59: TypePointer StorageBuffer 58(SSBO1N)
|
||||||
|
60(outBufN): 59(ptr) Variable StorageBuffer
|
||||||
|
62: TypePointer StorageBuffer 57(Nested)
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
14(t): 13(ptr) Variable Function
|
||||||
|
46(n): 45(ptr) Variable Function
|
||||||
|
22: 21(ptr) AccessChain 19(inBuf) 20
|
||||||
|
23:16(MyStruct) Load 22
|
||||||
|
24:12(MyStruct) CopyLogical 23
|
||||||
|
Store 14(t) 24
|
||||||
|
28:12(MyStruct) Load 14(t)
|
||||||
|
29: 21(ptr) AccessChain 27(outBuf) 20
|
||||||
|
30:16(MyStruct) CopyLogical 28
|
||||||
|
Store 29 30
|
||||||
|
37: 36(ptr) AccessChain 35(uBuf) 20
|
||||||
|
38:32(MyStruct) Load 37
|
||||||
|
39:12(MyStruct) CopyLogical 38
|
||||||
|
Store 14(t) 39
|
||||||
|
40:12(MyStruct) Load 14(t)
|
||||||
|
41: 21(ptr) AccessChain 27(outBuf) 20
|
||||||
|
42:16(MyStruct) CopyLogical 40
|
||||||
|
Store 41 42
|
||||||
|
53: 52(ptr) AccessChain 51(uBufN) 20
|
||||||
|
54: 48(Nested) Load 53
|
||||||
|
55: 44(Nested) CopyLogical 54
|
||||||
|
Store 46(n) 55
|
||||||
|
61: 44(Nested) Load 46(n)
|
||||||
|
63: 62(ptr) AccessChain 60(outBufN) 20
|
||||||
|
64: 57(Nested) CopyLogical 61
|
||||||
|
Store 63 64
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
114
Test/baseResults/spv.1.4.OpCopyLogical.funcall.frag.out
Normal file
114
Test/baseResults/spv.1.4.OpCopyLogical.funcall.frag.out
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
spv.1.4.OpCopyLogical.funcall.frag
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 60
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 25 37
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 9 "S"
|
||||||
|
MemberName 9(S) 0 "m"
|
||||||
|
Name 12 "fooConst(struct-S-mf441;"
|
||||||
|
Name 11 "s"
|
||||||
|
Name 17 "foo(struct-S-mf441;"
|
||||||
|
Name 16 "s"
|
||||||
|
Name 20 "fooOut(struct-S-mf441;"
|
||||||
|
Name 19 "s"
|
||||||
|
Name 22 "S"
|
||||||
|
MemberName 22(S) 0 "m"
|
||||||
|
Name 23 "blockName"
|
||||||
|
MemberName 23(blockName) 0 "s1"
|
||||||
|
Name 25 ""
|
||||||
|
Name 31 "S"
|
||||||
|
MemberName 31(S) 0 "m"
|
||||||
|
Name 32 "arg"
|
||||||
|
Name 37 "s2"
|
||||||
|
Name 40 "param"
|
||||||
|
Name 45 "param"
|
||||||
|
Name 48 "param"
|
||||||
|
Name 56 "param"
|
||||||
|
MemberDecorate 22(S) 0 ColMajor
|
||||||
|
MemberDecorate 22(S) 0 Offset 0
|
||||||
|
MemberDecorate 22(S) 0 MatrixStride 16
|
||||||
|
MemberDecorate 23(blockName) 0 Offset 0
|
||||||
|
Decorate 23(blockName) Block
|
||||||
|
Decorate 25 DescriptorSet 0
|
||||||
|
Decorate 25 Binding 0
|
||||||
|
MemberDecorate 31(S) 0 ColMajor
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 4
|
||||||
|
8: TypeMatrix 7(fvec4) 4
|
||||||
|
9(S): TypeStruct 8
|
||||||
|
10: TypeFunction 2 9(S)
|
||||||
|
14: TypePointer Function 9(S)
|
||||||
|
15: TypeFunction 2 14(ptr)
|
||||||
|
22(S): TypeStruct 8
|
||||||
|
23(blockName): TypeStruct 22(S)
|
||||||
|
24: TypePointer StorageBuffer 23(blockName)
|
||||||
|
25: 24(ptr) Variable StorageBuffer
|
||||||
|
26: TypeInt 32 1
|
||||||
|
27: 26(int) Constant 0
|
||||||
|
28: TypePointer StorageBuffer 22(S)
|
||||||
|
31(S): TypeStruct 8
|
||||||
|
36: TypePointer Private 9(S)
|
||||||
|
37(s2): 36(ptr) Variable Private
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
32(arg): 14(ptr) Variable Function
|
||||||
|
40(param): 14(ptr) Variable Function
|
||||||
|
45(param): 14(ptr) Variable Function
|
||||||
|
48(param): 14(ptr) Variable Function
|
||||||
|
56(param): 14(ptr) Variable Function
|
||||||
|
29: 28(ptr) AccessChain 25 27
|
||||||
|
30: 22(S) Load 29
|
||||||
|
33: 9(S) CopyLogical 30
|
||||||
|
Store 32(arg) 33
|
||||||
|
34: 9(S) Load 32(arg)
|
||||||
|
35: 2 FunctionCall 12(fooConst(struct-S-mf441;) 34
|
||||||
|
38: 9(S) Load 37(s2)
|
||||||
|
39: 2 FunctionCall 12(fooConst(struct-S-mf441;) 38
|
||||||
|
41: 28(ptr) AccessChain 25 27
|
||||||
|
42: 22(S) Load 41
|
||||||
|
43: 9(S) CopyLogical 42
|
||||||
|
Store 40(param) 43
|
||||||
|
44: 2 FunctionCall 17(foo(struct-S-mf441;) 40(param)
|
||||||
|
46: 9(S) Load 37(s2)
|
||||||
|
Store 45(param) 46
|
||||||
|
47: 2 FunctionCall 17(foo(struct-S-mf441;) 45(param)
|
||||||
|
49: 28(ptr) AccessChain 25 27
|
||||||
|
50: 22(S) Load 49
|
||||||
|
51: 9(S) CopyLogical 50
|
||||||
|
Store 48(param) 51
|
||||||
|
52: 2 FunctionCall 20(fooOut(struct-S-mf441;) 48(param)
|
||||||
|
53: 9(S) Load 48(param)
|
||||||
|
54: 28(ptr) AccessChain 25 27
|
||||||
|
55: 22(S) CopyLogical 53
|
||||||
|
Store 54 55
|
||||||
|
57: 9(S) Load 37(s2)
|
||||||
|
Store 56(param) 57
|
||||||
|
58: 2 FunctionCall 20(fooOut(struct-S-mf441;) 56(param)
|
||||||
|
59: 9(S) Load 56(param)
|
||||||
|
Store 37(s2) 59
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
12(fooConst(struct-S-mf441;): 2 Function None 10
|
||||||
|
11(s): 9(S) FunctionParameter
|
||||||
|
13: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
17(foo(struct-S-mf441;): 2 Function None 15
|
||||||
|
16(s): 14(ptr) FunctionParameter
|
||||||
|
18: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
20(fooOut(struct-S-mf441;): 2 Function None 15
|
||||||
|
19(s): 14(ptr) FunctionParameter
|
||||||
|
21: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
232
Test/baseResults/spv.1.4.OpCopyLogicalBool.comp.out
Normal file
232
Test/baseResults/spv.1.4.OpCopyLogicalBool.comp.out
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
spv.1.4.OpCopyLogicalBool.comp
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 135
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint GLCompute 4 "main" 19 37 53 79 109
|
||||||
|
ExecutionMode 4 LocalSize 1 1 1
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 12 "MyStruct"
|
||||||
|
MemberName 12(MyStruct) 0 "foo"
|
||||||
|
MemberName 12(MyStruct) 1 "sb"
|
||||||
|
Name 14 "t"
|
||||||
|
Name 16 "MyStruct"
|
||||||
|
MemberName 16(MyStruct) 0 "foo"
|
||||||
|
MemberName 16(MyStruct) 1 "sb"
|
||||||
|
Name 17 "SSBO0"
|
||||||
|
MemberName 17(SSBO0) 0 "a"
|
||||||
|
Name 19 "inBuf"
|
||||||
|
Name 35 "SSBO1"
|
||||||
|
MemberName 35(SSBO1) 0 "b"
|
||||||
|
Name 37 "outBuf"
|
||||||
|
Name 50 "MyStruct"
|
||||||
|
MemberName 50(MyStruct) 0 "foo"
|
||||||
|
MemberName 50(MyStruct) 1 "sb"
|
||||||
|
Name 51 "UBO"
|
||||||
|
MemberName 51(UBO) 0 "c"
|
||||||
|
Name 53 "uBuf"
|
||||||
|
Name 72 "Nested"
|
||||||
|
MemberName 72(Nested) 0 "b"
|
||||||
|
MemberName 72(Nested) 1 "S"
|
||||||
|
Name 74 "n"
|
||||||
|
Name 76 "Nested"
|
||||||
|
MemberName 76(Nested) 0 "b"
|
||||||
|
MemberName 76(Nested) 1 "S"
|
||||||
|
Name 77 "UBON"
|
||||||
|
MemberName 77(UBON) 0 "N1"
|
||||||
|
Name 79 "uBufN"
|
||||||
|
Name 106 "Nested"
|
||||||
|
MemberName 106(Nested) 0 "b"
|
||||||
|
MemberName 106(Nested) 1 "S"
|
||||||
|
Name 107 "SSBO1N"
|
||||||
|
MemberName 107(SSBO1N) 0 "N2"
|
||||||
|
Name 109 "outBufN"
|
||||||
|
Decorate 15 ArrayStride 8
|
||||||
|
MemberDecorate 16(MyStruct) 0 Offset 0
|
||||||
|
MemberDecorate 16(MyStruct) 1 Offset 16
|
||||||
|
MemberDecorate 17(SSBO0) 0 Offset 0
|
||||||
|
Decorate 17(SSBO0) Block
|
||||||
|
Decorate 19(inBuf) DescriptorSet 0
|
||||||
|
Decorate 19(inBuf) Binding 0
|
||||||
|
MemberDecorate 35(SSBO1) 0 Offset 0
|
||||||
|
Decorate 35(SSBO1) Block
|
||||||
|
Decorate 37(outBuf) DescriptorSet 0
|
||||||
|
Decorate 37(outBuf) Binding 1
|
||||||
|
Decorate 49 ArrayStride 16
|
||||||
|
MemberDecorate 50(MyStruct) 0 Offset 0
|
||||||
|
MemberDecorate 50(MyStruct) 1 Offset 32
|
||||||
|
MemberDecorate 51(UBO) 0 Offset 0
|
||||||
|
Decorate 51(UBO) Block
|
||||||
|
Decorate 53(uBuf) DescriptorSet 0
|
||||||
|
Decorate 53(uBuf) Binding 2
|
||||||
|
Decorate 75 ArrayStride 48
|
||||||
|
MemberDecorate 76(Nested) 0 Offset 0
|
||||||
|
MemberDecorate 76(Nested) 1 Offset 16
|
||||||
|
MemberDecorate 77(UBON) 0 Offset 0
|
||||||
|
Decorate 77(UBON) Block
|
||||||
|
Decorate 79(uBufN) DescriptorSet 0
|
||||||
|
Decorate 79(uBufN) Binding 2
|
||||||
|
Decorate 105 ArrayStride 24
|
||||||
|
MemberDecorate 106(Nested) 0 Offset 0
|
||||||
|
MemberDecorate 106(Nested) 1 Offset 8
|
||||||
|
MemberDecorate 107(SSBO1N) 0 Offset 0
|
||||||
|
Decorate 107(SSBO1N) Block
|
||||||
|
Decorate 109(outBufN) DescriptorSet 0
|
||||||
|
Decorate 109(outBufN) Binding 1
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 2
|
||||||
|
8: TypeInt 32 0
|
||||||
|
9: 8(int) Constant 2
|
||||||
|
10: TypeArray 7(fvec2) 9
|
||||||
|
11: TypeBool
|
||||||
|
12(MyStruct): TypeStruct 10 11(bool)
|
||||||
|
13: TypePointer Function 12(MyStruct)
|
||||||
|
15: TypeArray 7(fvec2) 9
|
||||||
|
16(MyStruct): TypeStruct 15 8(int)
|
||||||
|
17(SSBO0): TypeStruct 16(MyStruct)
|
||||||
|
18: TypePointer StorageBuffer 17(SSBO0)
|
||||||
|
19(inBuf): 18(ptr) Variable StorageBuffer
|
||||||
|
20: TypeInt 32 1
|
||||||
|
21: 20(int) Constant 0
|
||||||
|
22: TypePointer StorageBuffer 16(MyStruct)
|
||||||
|
26: TypePointer Function 10
|
||||||
|
30: 20(int) Constant 1
|
||||||
|
31: 8(int) Constant 0
|
||||||
|
33: TypePointer Function 11(bool)
|
||||||
|
35(SSBO1): TypeStruct 16(MyStruct)
|
||||||
|
36: TypePointer StorageBuffer 35(SSBO1)
|
||||||
|
37(outBuf): 36(ptr) Variable StorageBuffer
|
||||||
|
41: TypePointer StorageBuffer 15
|
||||||
|
45: 8(int) Constant 1
|
||||||
|
47: TypePointer StorageBuffer 8(int)
|
||||||
|
49: TypeArray 7(fvec2) 9
|
||||||
|
50(MyStruct): TypeStruct 49 8(int)
|
||||||
|
51(UBO): TypeStruct 50(MyStruct)
|
||||||
|
52: TypePointer Uniform 51(UBO)
|
||||||
|
53(uBuf): 52(ptr) Variable Uniform
|
||||||
|
54: TypePointer Uniform 50(MyStruct)
|
||||||
|
71: TypeArray 12(MyStruct) 9
|
||||||
|
72(Nested): TypeStruct 11(bool) 71
|
||||||
|
73: TypePointer Function 72(Nested)
|
||||||
|
75: TypeArray 50(MyStruct) 9
|
||||||
|
76(Nested): TypeStruct 8(int) 75
|
||||||
|
77(UBON): TypeStruct 76(Nested)
|
||||||
|
78: TypePointer Uniform 77(UBON)
|
||||||
|
79(uBufN): 78(ptr) Variable Uniform
|
||||||
|
80: TypePointer Uniform 76(Nested)
|
||||||
|
87: TypePointer Function 71
|
||||||
|
105: TypeArray 16(MyStruct) 9
|
||||||
|
106(Nested): TypeStruct 8(int) 105
|
||||||
|
107(SSBO1N): TypeStruct 106(Nested)
|
||||||
|
108: TypePointer StorageBuffer 107(SSBO1N)
|
||||||
|
109(outBufN): 108(ptr) Variable StorageBuffer
|
||||||
|
111: TypePointer StorageBuffer 106(Nested)
|
||||||
|
117: TypePointer StorageBuffer 105
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
14(t): 13(ptr) Variable Function
|
||||||
|
74(n): 73(ptr) Variable Function
|
||||||
|
23: 22(ptr) AccessChain 19(inBuf) 21
|
||||||
|
24:16(MyStruct) Load 23
|
||||||
|
25: 15 CompositeExtract 24 0
|
||||||
|
27: 26(ptr) AccessChain 14(t) 21
|
||||||
|
28: 10 CopyLogical 25
|
||||||
|
Store 27 28
|
||||||
|
29: 8(int) CompositeExtract 24 1
|
||||||
|
32: 11(bool) INotEqual 29 31
|
||||||
|
34: 33(ptr) AccessChain 14(t) 30
|
||||||
|
Store 34 32
|
||||||
|
38:12(MyStruct) Load 14(t)
|
||||||
|
39: 22(ptr) AccessChain 37(outBuf) 21
|
||||||
|
40: 10 CompositeExtract 38 0
|
||||||
|
42: 41(ptr) AccessChain 39 21
|
||||||
|
43: 15 CopyLogical 40
|
||||||
|
Store 42 43
|
||||||
|
44: 11(bool) CompositeExtract 38 1
|
||||||
|
46: 8(int) Select 44 45 31
|
||||||
|
48: 47(ptr) AccessChain 39 30
|
||||||
|
Store 48 46
|
||||||
|
55: 54(ptr) AccessChain 53(uBuf) 21
|
||||||
|
56:50(MyStruct) Load 55
|
||||||
|
57: 49 CompositeExtract 56 0
|
||||||
|
58: 26(ptr) AccessChain 14(t) 21
|
||||||
|
59: 10 CopyLogical 57
|
||||||
|
Store 58 59
|
||||||
|
60: 8(int) CompositeExtract 56 1
|
||||||
|
61: 11(bool) INotEqual 60 31
|
||||||
|
62: 33(ptr) AccessChain 14(t) 30
|
||||||
|
Store 62 61
|
||||||
|
63:12(MyStruct) Load 14(t)
|
||||||
|
64: 22(ptr) AccessChain 37(outBuf) 21
|
||||||
|
65: 10 CompositeExtract 63 0
|
||||||
|
66: 41(ptr) AccessChain 64 21
|
||||||
|
67: 15 CopyLogical 65
|
||||||
|
Store 66 67
|
||||||
|
68: 11(bool) CompositeExtract 63 1
|
||||||
|
69: 8(int) Select 68 45 31
|
||||||
|
70: 47(ptr) AccessChain 64 30
|
||||||
|
Store 70 69
|
||||||
|
81: 80(ptr) AccessChain 79(uBufN) 21
|
||||||
|
82: 76(Nested) Load 81
|
||||||
|
83: 8(int) CompositeExtract 82 0
|
||||||
|
84: 11(bool) INotEqual 83 31
|
||||||
|
85: 33(ptr) AccessChain 74(n) 21
|
||||||
|
Store 85 84
|
||||||
|
86: 75 CompositeExtract 82 1
|
||||||
|
88: 87(ptr) AccessChain 74(n) 30
|
||||||
|
89:50(MyStruct) CompositeExtract 86 0
|
||||||
|
90: 13(ptr) AccessChain 88 21
|
||||||
|
91: 49 CompositeExtract 89 0
|
||||||
|
92: 26(ptr) AccessChain 90 21
|
||||||
|
93: 10 CopyLogical 91
|
||||||
|
Store 92 93
|
||||||
|
94: 8(int) CompositeExtract 89 1
|
||||||
|
95: 11(bool) INotEqual 94 31
|
||||||
|
96: 33(ptr) AccessChain 90 30
|
||||||
|
Store 96 95
|
||||||
|
97:50(MyStruct) CompositeExtract 86 1
|
||||||
|
98: 13(ptr) AccessChain 88 30
|
||||||
|
99: 49 CompositeExtract 97 0
|
||||||
|
100: 26(ptr) AccessChain 98 21
|
||||||
|
101: 10 CopyLogical 99
|
||||||
|
Store 100 101
|
||||||
|
102: 8(int) CompositeExtract 97 1
|
||||||
|
103: 11(bool) INotEqual 102 31
|
||||||
|
104: 33(ptr) AccessChain 98 30
|
||||||
|
Store 104 103
|
||||||
|
110: 72(Nested) Load 74(n)
|
||||||
|
112: 111(ptr) AccessChain 109(outBufN) 21
|
||||||
|
113: 11(bool) CompositeExtract 110 0
|
||||||
|
114: 8(int) Select 113 45 31
|
||||||
|
115: 47(ptr) AccessChain 112 21
|
||||||
|
Store 115 114
|
||||||
|
116: 71 CompositeExtract 110 1
|
||||||
|
118: 117(ptr) AccessChain 112 30
|
||||||
|
119:12(MyStruct) CompositeExtract 116 0
|
||||||
|
120: 22(ptr) AccessChain 118 21
|
||||||
|
121: 10 CompositeExtract 119 0
|
||||||
|
122: 41(ptr) AccessChain 120 21
|
||||||
|
123: 15 CopyLogical 121
|
||||||
|
Store 122 123
|
||||||
|
124: 11(bool) CompositeExtract 119 1
|
||||||
|
125: 8(int) Select 124 45 31
|
||||||
|
126: 47(ptr) AccessChain 120 30
|
||||||
|
Store 126 125
|
||||||
|
127:12(MyStruct) CompositeExtract 116 1
|
||||||
|
128: 22(ptr) AccessChain 118 30
|
||||||
|
129: 10 CompositeExtract 127 0
|
||||||
|
130: 41(ptr) AccessChain 128 21
|
||||||
|
131: 15 CopyLogical 129
|
||||||
|
Store 130 131
|
||||||
|
132: 11(bool) CompositeExtract 127 1
|
||||||
|
133: 8(int) Select 132 45 31
|
||||||
|
134: 47(ptr) AccessChain 128 30
|
||||||
|
Store 134 133
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
106
Test/baseResults/spv.1.4.OpEntryPoint.frag.out
Normal file
106
Test/baseResults/spv.1.4.OpEntryPoint.frag.out
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
spv.1.4.OpEntryPoint.frag
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 64
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 11 14 17 25 33 41
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 9 "functionv"
|
||||||
|
Name 11 "inv"
|
||||||
|
Name 14 "globalv"
|
||||||
|
Name 17 "outv"
|
||||||
|
Name 23 "ubt"
|
||||||
|
MemberName 23(ubt) 0 "v"
|
||||||
|
Name 25 "uniformv"
|
||||||
|
Name 31 "pushB"
|
||||||
|
MemberName 31(pushB) 0 "a"
|
||||||
|
Name 33 "pushv"
|
||||||
|
Name 39 "bbt"
|
||||||
|
MemberName 39(bbt) 0 "f"
|
||||||
|
Name 41 "bufferv"
|
||||||
|
Decorate 11(inv) Location 0
|
||||||
|
Decorate 17(outv) Location 0
|
||||||
|
MemberDecorate 23(ubt) 0 Offset 0
|
||||||
|
Decorate 23(ubt) Block
|
||||||
|
Decorate 25(uniformv) DescriptorSet 0
|
||||||
|
Decorate 25(uniformv) Binding 0
|
||||||
|
MemberDecorate 31(pushB) 0 Offset 0
|
||||||
|
Decorate 31(pushB) Block
|
||||||
|
Decorate 33(pushv) Binding 2
|
||||||
|
MemberDecorate 39(bbt) 0 Offset 0
|
||||||
|
Decorate 39(bbt) Block
|
||||||
|
Decorate 41(bufferv) DescriptorSet 0
|
||||||
|
Decorate 41(bufferv) Binding 1
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 4
|
||||||
|
8: TypePointer Function 7(fvec4)
|
||||||
|
10: TypePointer Input 7(fvec4)
|
||||||
|
11(inv): 10(ptr) Variable Input
|
||||||
|
13: TypePointer Private 7(fvec4)
|
||||||
|
14(globalv): 13(ptr) Variable Private
|
||||||
|
16: TypePointer Output 7(fvec4)
|
||||||
|
17(outv): 16(ptr) Variable Output
|
||||||
|
23(ubt): TypeStruct 7(fvec4)
|
||||||
|
24: TypePointer Uniform 23(ubt)
|
||||||
|
25(uniformv): 24(ptr) Variable Uniform
|
||||||
|
26: TypeInt 32 1
|
||||||
|
27: 26(int) Constant 0
|
||||||
|
28: TypePointer Uniform 7(fvec4)
|
||||||
|
31(pushB): TypeStruct 26(int)
|
||||||
|
32: TypePointer PushConstant 31(pushB)
|
||||||
|
33(pushv): 32(ptr) Variable PushConstant
|
||||||
|
34: TypePointer PushConstant 26(int)
|
||||||
|
39(bbt): TypeStruct 6(float)
|
||||||
|
40: TypePointer StorageBuffer 39(bbt)
|
||||||
|
41(bufferv): 40(ptr) Variable StorageBuffer
|
||||||
|
42: TypePointer StorageBuffer 6(float)
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
9(functionv): 8(ptr) Variable Function
|
||||||
|
12: 7(fvec4) Load 11(inv)
|
||||||
|
Store 9(functionv) 12
|
||||||
|
15: 7(fvec4) Load 11(inv)
|
||||||
|
Store 14(globalv) 15
|
||||||
|
18: 7(fvec4) Load 9(functionv)
|
||||||
|
19: 7(fvec4) Load 11(inv)
|
||||||
|
20: 7(fvec4) FAdd 18 19
|
||||||
|
21: 7(fvec4) Load 14(globalv)
|
||||||
|
22: 7(fvec4) FAdd 20 21
|
||||||
|
29: 28(ptr) AccessChain 25(uniformv) 27
|
||||||
|
30: 7(fvec4) Load 29
|
||||||
|
35: 34(ptr) AccessChain 33(pushv) 27
|
||||||
|
36: 26(int) Load 35
|
||||||
|
37: 6(float) ConvertSToF 36
|
||||||
|
38: 7(fvec4) VectorTimesScalar 30 37
|
||||||
|
43: 42(ptr) AccessChain 41(bufferv) 27
|
||||||
|
44: 6(float) Load 43
|
||||||
|
45: 7(fvec4) VectorTimesScalar 38 44
|
||||||
|
46: 7(fvec4) FAdd 22 45
|
||||||
|
Store 17(outv) 46
|
||||||
|
47: 7(fvec4) Load 9(functionv)
|
||||||
|
48: 7(fvec4) Load 11(inv)
|
||||||
|
49: 7(fvec4) FAdd 47 48
|
||||||
|
50: 7(fvec4) Load 14(globalv)
|
||||||
|
51: 7(fvec4) FAdd 49 50
|
||||||
|
52: 28(ptr) AccessChain 25(uniformv) 27
|
||||||
|
53: 7(fvec4) Load 52
|
||||||
|
54: 34(ptr) AccessChain 33(pushv) 27
|
||||||
|
55: 26(int) Load 54
|
||||||
|
56: 6(float) ConvertSToF 55
|
||||||
|
57: 7(fvec4) VectorTimesScalar 53 56
|
||||||
|
58: 42(ptr) AccessChain 41(bufferv) 27
|
||||||
|
59: 6(float) Load 58
|
||||||
|
60: 7(fvec4) VectorTimesScalar 57 59
|
||||||
|
61: 7(fvec4) FAdd 51 60
|
||||||
|
62: 7(fvec4) Load 17(outv)
|
||||||
|
63: 7(fvec4) FAdd 62 61
|
||||||
|
Store 17(outv) 63
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
152
Test/baseResults/spv.1.4.OpSelect.frag.out
Executable file
152
Test/baseResults/spv.1.4.OpSelect.frag.out
Executable file
@ -0,0 +1,152 @@
|
|||||||
|
spv.1.4.OpSelect.frag
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 98
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 17 20 82 84
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 6 "fun1("
|
||||||
|
Name 8 "fun2("
|
||||||
|
Name 12 "f1"
|
||||||
|
Name 14 "f2"
|
||||||
|
Name 17 "outv"
|
||||||
|
Name 20 "cond"
|
||||||
|
Name 30 "iv1"
|
||||||
|
Name 34 "iv2"
|
||||||
|
Name 53 "m1"
|
||||||
|
Name 59 "m2"
|
||||||
|
Name 75 "S1"
|
||||||
|
MemberName 75(S1) 0 "a"
|
||||||
|
MemberName 75(S1) 1 "b"
|
||||||
|
Name 77 "fv"
|
||||||
|
Name 82 "in1"
|
||||||
|
Name 84 "in2"
|
||||||
|
Decorate 17(outv) Location 0
|
||||||
|
Decorate 20(cond) Flat
|
||||||
|
Decorate 20(cond) Location 4
|
||||||
|
Decorate 82(in1) Flat
|
||||||
|
Decorate 82(in1) Location 0
|
||||||
|
Decorate 84(in2) Flat
|
||||||
|
Decorate 84(in2) Location 2
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
10: TypeFloat 32
|
||||||
|
11: TypePointer Function 10(float)
|
||||||
|
13: 10(float) Constant 1065353216
|
||||||
|
15: 10(float) Constant 1073741824
|
||||||
|
16: TypePointer Output 10(float)
|
||||||
|
17(outv): 16(ptr) Variable Output
|
||||||
|
18: TypeInt 32 1
|
||||||
|
19: TypePointer Input 18(int)
|
||||||
|
20(cond): 19(ptr) Variable Input
|
||||||
|
22: 18(int) Constant 8
|
||||||
|
23: TypeBool
|
||||||
|
28: TypeVector 18(int) 4
|
||||||
|
29: TypePointer Function 28(ivec4)
|
||||||
|
39: 18(int) Constant 0
|
||||||
|
44: TypeInt 32 0
|
||||||
|
45: 44(int) Constant 2
|
||||||
|
50: TypeVector 10(float) 3
|
||||||
|
51: TypeMatrix 50(fvec3) 3
|
||||||
|
52: TypePointer Function 51
|
||||||
|
54: 10(float) Constant 0
|
||||||
|
55: 50(fvec3) ConstantComposite 13 54 54
|
||||||
|
56: 50(fvec3) ConstantComposite 54 13 54
|
||||||
|
57: 50(fvec3) ConstantComposite 54 54 13
|
||||||
|
58: 51 ConstantComposite 55 56 57
|
||||||
|
60: 50(fvec3) ConstantComposite 15 54 54
|
||||||
|
61: 50(fvec3) ConstantComposite 54 15 54
|
||||||
|
62: 50(fvec3) ConstantComposite 54 54 15
|
||||||
|
63: 51 ConstantComposite 60 61 62
|
||||||
|
65: 18(int) Constant 20
|
||||||
|
70: 18(int) Constant 2
|
||||||
|
71: 44(int) Constant 1
|
||||||
|
75(S1): TypeStruct 10(float) 18(int)
|
||||||
|
76: TypePointer Function 75(S1)
|
||||||
|
79: 18(int) Constant 5
|
||||||
|
81: TypePointer Input 75(S1)
|
||||||
|
82(in1): 81(ptr) Variable Input
|
||||||
|
84(in2): 81(ptr) Variable Input
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
12(f1): 11(ptr) Variable Function
|
||||||
|
14(f2): 11(ptr) Variable Function
|
||||||
|
30(iv1): 29(ptr) Variable Function
|
||||||
|
34(iv2): 29(ptr) Variable Function
|
||||||
|
53(m1): 52(ptr) Variable Function
|
||||||
|
59(m2): 52(ptr) Variable Function
|
||||||
|
77(fv): 76(ptr) Variable Function
|
||||||
|
Store 12(f1) 13
|
||||||
|
Store 14(f2) 15
|
||||||
|
21: 18(int) Load 20(cond)
|
||||||
|
24: 23(bool) SLessThan 21 22
|
||||||
|
25: 10(float) Load 12(f1)
|
||||||
|
26: 10(float) Load 14(f2)
|
||||||
|
27: 10(float) Select 24 25 26
|
||||||
|
Store 17(outv) 27
|
||||||
|
31: 10(float) Load 12(f1)
|
||||||
|
32: 18(int) ConvertFToS 31
|
||||||
|
33: 28(ivec4) CompositeConstruct 32 32 32 32
|
||||||
|
Store 30(iv1) 33
|
||||||
|
35: 10(float) Load 14(f2)
|
||||||
|
36: 18(int) ConvertFToS 35
|
||||||
|
37: 28(ivec4) CompositeConstruct 36 36 36 36
|
||||||
|
Store 34(iv2) 37
|
||||||
|
38: 18(int) Load 20(cond)
|
||||||
|
40: 23(bool) SGreaterThan 38 39
|
||||||
|
41: 28(ivec4) Load 30(iv1)
|
||||||
|
42: 28(ivec4) Load 34(iv2)
|
||||||
|
43: 28(ivec4) Select 40 41 42
|
||||||
|
46: 18(int) CompositeExtract 43 2
|
||||||
|
47: 10(float) ConvertSToF 46
|
||||||
|
48: 10(float) Load 17(outv)
|
||||||
|
49: 10(float) FMul 48 47
|
||||||
|
Store 17(outv) 49
|
||||||
|
Store 53(m1) 58
|
||||||
|
Store 59(m2) 63
|
||||||
|
64: 18(int) Load 20(cond)
|
||||||
|
66: 23(bool) SLessThan 64 65
|
||||||
|
67: 51 Load 53(m1)
|
||||||
|
68: 51 Load 59(m2)
|
||||||
|
69: 51 Select 66 67 68
|
||||||
|
72: 10(float) CompositeExtract 69 2 1
|
||||||
|
73: 10(float) Load 17(outv)
|
||||||
|
74: 10(float) FMul 73 72
|
||||||
|
Store 17(outv) 74
|
||||||
|
78: 18(int) Load 20(cond)
|
||||||
|
80: 23(bool) SGreaterThan 78 79
|
||||||
|
83: 75(S1) Load 82(in1)
|
||||||
|
85: 75(S1) Load 84(in2)
|
||||||
|
86: 75(S1) Select 80 83 85
|
||||||
|
Store 77(fv) 86
|
||||||
|
87: 11(ptr) AccessChain 77(fv) 39
|
||||||
|
88: 10(float) Load 87
|
||||||
|
89: 10(float) Load 17(outv)
|
||||||
|
90: 10(float) FMul 89 88
|
||||||
|
Store 17(outv) 90
|
||||||
|
91: 18(int) Load 20(cond)
|
||||||
|
92: 23(bool) SGreaterThan 91 39
|
||||||
|
SelectionMerge 94 None
|
||||||
|
BranchConditional 92 93 96
|
||||||
|
93: Label
|
||||||
|
95: 2 FunctionCall 6(fun1()
|
||||||
|
Branch 94
|
||||||
|
96: Label
|
||||||
|
97: 2 FunctionCall 8(fun2()
|
||||||
|
Branch 94
|
||||||
|
94: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
6(fun1(): 2 Function None 3
|
||||||
|
7: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
|
8(fun2(): 2 Function None 3
|
||||||
|
9: Label
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
159
Test/baseResults/spv.1.4.image.frag.out
Executable file
159
Test/baseResults/spv.1.4.image.frag.out
Executable file
@ -0,0 +1,159 @@
|
|||||||
|
spv.1.4.image.frag
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 104
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
Capability StorageImageMultisample
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 26 30 40 52 64 77 89 100 103
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 9 "v"
|
||||||
|
Name 15 "iv"
|
||||||
|
Name 21 "uv"
|
||||||
|
Name 26 "i2D"
|
||||||
|
Name 30 "ic2D"
|
||||||
|
Name 40 "ii2D"
|
||||||
|
Name 52 "ui2D"
|
||||||
|
Name 64 "i2DMS"
|
||||||
|
Name 77 "ii2DMS"
|
||||||
|
Name 89 "ui2DMS"
|
||||||
|
Name 100 "fragData"
|
||||||
|
Name 103 "value"
|
||||||
|
Decorate 26(i2D) DescriptorSet 0
|
||||||
|
Decorate 26(i2D) Binding 1
|
||||||
|
Decorate 30(ic2D) Flat
|
||||||
|
Decorate 40(ii2D) DescriptorSet 0
|
||||||
|
Decorate 40(ii2D) Binding 12
|
||||||
|
Decorate 52(ui2D) DescriptorSet 0
|
||||||
|
Decorate 52(ui2D) Binding 12
|
||||||
|
Decorate 64(i2DMS) DescriptorSet 0
|
||||||
|
Decorate 64(i2DMS) Binding 9
|
||||||
|
Decorate 77(ii2DMS) DescriptorSet 0
|
||||||
|
Decorate 77(ii2DMS) Binding 13
|
||||||
|
Decorate 89(ui2DMS) DescriptorSet 0
|
||||||
|
Decorate 89(ui2DMS) Binding 13
|
||||||
|
Decorate 103(value) Flat
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 4
|
||||||
|
8: TypePointer Function 7(fvec4)
|
||||||
|
10: 6(float) Constant 0
|
||||||
|
11: 7(fvec4) ConstantComposite 10 10 10 10
|
||||||
|
12: TypeInt 32 1
|
||||||
|
13: TypeVector 12(int) 4
|
||||||
|
14: TypePointer Function 13(ivec4)
|
||||||
|
16: 12(int) Constant 0
|
||||||
|
17: 13(ivec4) ConstantComposite 16 16 16 16
|
||||||
|
18: TypeInt 32 0
|
||||||
|
19: TypeVector 18(int) 4
|
||||||
|
20: TypePointer Function 19(ivec4)
|
||||||
|
22: 18(int) Constant 0
|
||||||
|
23: 19(ivec4) ConstantComposite 22 22 22 22
|
||||||
|
24: TypeImage 6(float) 2D nonsampled format:Rgba32f
|
||||||
|
25: TypePointer UniformConstant 24
|
||||||
|
26(i2D): 25(ptr) Variable UniformConstant
|
||||||
|
28: TypeVector 12(int) 2
|
||||||
|
29: TypePointer Input 28(ivec2)
|
||||||
|
30(ic2D): 29(ptr) Variable Input
|
||||||
|
38: TypeImage 12(int) 2D nonsampled format:R32i
|
||||||
|
39: TypePointer UniformConstant 38
|
||||||
|
40(ii2D): 39(ptr) Variable UniformConstant
|
||||||
|
50: TypeImage 18(int) 2D nonsampled format:R32ui
|
||||||
|
51: TypePointer UniformConstant 50
|
||||||
|
52(ui2D): 51(ptr) Variable UniformConstant
|
||||||
|
62: TypeImage 6(float) 2D multi-sampled nonsampled format:Rgba32f
|
||||||
|
63: TypePointer UniformConstant 62
|
||||||
|
64(i2DMS): 63(ptr) Variable UniformConstant
|
||||||
|
67: 12(int) Constant 1
|
||||||
|
73: 12(int) Constant 2
|
||||||
|
75: TypeImage 12(int) 2D multi-sampled nonsampled format:R32i
|
||||||
|
76: TypePointer UniformConstant 75
|
||||||
|
77(ii2DMS): 76(ptr) Variable UniformConstant
|
||||||
|
87: TypeImage 18(int) 2D multi-sampled nonsampled format:R32ui
|
||||||
|
88: TypePointer UniformConstant 87
|
||||||
|
89(ui2DMS): 88(ptr) Variable UniformConstant
|
||||||
|
99: TypePointer Output 7(fvec4)
|
||||||
|
100(fragData): 99(ptr) Variable Output
|
||||||
|
102: TypePointer Input 18(int)
|
||||||
|
103(value): 102(ptr) Variable Input
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
9(v): 8(ptr) Variable Function
|
||||||
|
15(iv): 14(ptr) Variable Function
|
||||||
|
21(uv): 20(ptr) Variable Function
|
||||||
|
Store 9(v) 11
|
||||||
|
Store 15(iv) 17
|
||||||
|
Store 21(uv) 23
|
||||||
|
27: 24 Load 26(i2D)
|
||||||
|
31: 28(ivec2) Load 30(ic2D)
|
||||||
|
32: 7(fvec4) ImageRead 27 31
|
||||||
|
33: 7(fvec4) Load 9(v)
|
||||||
|
34: 7(fvec4) FAdd 33 32
|
||||||
|
Store 9(v) 34
|
||||||
|
35: 24 Load 26(i2D)
|
||||||
|
36: 28(ivec2) Load 30(ic2D)
|
||||||
|
37: 7(fvec4) Load 9(v)
|
||||||
|
ImageWrite 35 36 37
|
||||||
|
41: 38 Load 40(ii2D)
|
||||||
|
42: 28(ivec2) Load 30(ic2D)
|
||||||
|
43: 13(ivec4) ImageRead 41 42 SignExtend
|
||||||
|
44: 7(fvec4) ConvertSToF 43
|
||||||
|
45: 7(fvec4) Load 9(v)
|
||||||
|
46: 7(fvec4) FAdd 45 44
|
||||||
|
Store 9(v) 46
|
||||||
|
47: 38 Load 40(ii2D)
|
||||||
|
48: 28(ivec2) Load 30(ic2D)
|
||||||
|
49: 13(ivec4) Load 15(iv)
|
||||||
|
ImageWrite 47 48 49 SignExtend
|
||||||
|
53: 50 Load 52(ui2D)
|
||||||
|
54: 28(ivec2) Load 30(ic2D)
|
||||||
|
55: 19(ivec4) ImageRead 53 54 ZeroExtend
|
||||||
|
56: 7(fvec4) ConvertUToF 55
|
||||||
|
57: 7(fvec4) Load 9(v)
|
||||||
|
58: 7(fvec4) FAdd 57 56
|
||||||
|
Store 9(v) 58
|
||||||
|
59: 50 Load 52(ui2D)
|
||||||
|
60: 28(ivec2) Load 30(ic2D)
|
||||||
|
61: 19(ivec4) Load 21(uv)
|
||||||
|
ImageWrite 59 60 61 ZeroExtend
|
||||||
|
65: 62 Load 64(i2DMS)
|
||||||
|
66: 28(ivec2) Load 30(ic2D)
|
||||||
|
68: 7(fvec4) ImageRead 65 66 Sample 67
|
||||||
|
69: 7(fvec4) Load 9(v)
|
||||||
|
70: 7(fvec4) FAdd 69 68
|
||||||
|
Store 9(v) 70
|
||||||
|
71: 62 Load 64(i2DMS)
|
||||||
|
72: 28(ivec2) Load 30(ic2D)
|
||||||
|
74: 7(fvec4) Load 9(v)
|
||||||
|
ImageWrite 71 72 74 Sample 73
|
||||||
|
78: 75 Load 77(ii2DMS)
|
||||||
|
79: 28(ivec2) Load 30(ic2D)
|
||||||
|
80: 13(ivec4) ImageRead 78 79 Sample SignExtend 67
|
||||||
|
81: 7(fvec4) ConvertSToF 80
|
||||||
|
82: 7(fvec4) Load 9(v)
|
||||||
|
83: 7(fvec4) FAdd 82 81
|
||||||
|
Store 9(v) 83
|
||||||
|
84: 75 Load 77(ii2DMS)
|
||||||
|
85: 28(ivec2) Load 30(ic2D)
|
||||||
|
86: 13(ivec4) Load 15(iv)
|
||||||
|
ImageWrite 84 85 86 Sample SignExtend 73
|
||||||
|
90: 87 Load 89(ui2DMS)
|
||||||
|
91: 28(ivec2) Load 30(ic2D)
|
||||||
|
92: 19(ivec4) ImageRead 90 91 Sample ZeroExtend 67
|
||||||
|
93: 7(fvec4) ConvertUToF 92
|
||||||
|
94: 7(fvec4) Load 9(v)
|
||||||
|
95: 7(fvec4) FAdd 94 93
|
||||||
|
Store 9(v) 95
|
||||||
|
96: 87 Load 89(ui2DMS)
|
||||||
|
97: 28(ivec2) Load 30(ic2D)
|
||||||
|
98: 19(ivec4) Load 21(uv)
|
||||||
|
ImageWrite 96 97 98 Sample ZeroExtend 73
|
||||||
|
101: 7(fvec4) Load 9(v)
|
||||||
|
Store 100(fragData) 101
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
326
Test/baseResults/spv.1.4.sparseTexture.frag.out
Executable file
326
Test/baseResults/spv.1.4.sparseTexture.frag.out
Executable file
@ -0,0 +1,326 @@
|
|||||||
|
spv.1.4.sparseTexture.frag
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 213
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
Capability StorageImageMultisample
|
||||||
|
Capability SparseResidency
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 29 33 42 46 59 63 84 96 119 133 149 152 159 162 177 181 189 206 208 212
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source GLSL 450
|
||||||
|
SourceExtension "GL_ARB_sparse_texture2"
|
||||||
|
Name 4 "main"
|
||||||
|
Name 8 "resident"
|
||||||
|
Name 13 "texel"
|
||||||
|
Name 18 "itexel"
|
||||||
|
Name 23 "utexel"
|
||||||
|
Name 29 "s2D"
|
||||||
|
Name 33 "c2"
|
||||||
|
Name 35 "ResType"
|
||||||
|
Name 42 "tempReturn"
|
||||||
|
Name 46 "is2D"
|
||||||
|
Name 49 "tempArg"
|
||||||
|
Name 50 "ResType"
|
||||||
|
Name 59 "tempReturn"
|
||||||
|
Name 63 "us2D"
|
||||||
|
Name 66 "tempArg"
|
||||||
|
Name 67 "ResType"
|
||||||
|
Name 84 "tempReturn"
|
||||||
|
Name 87 "tempArg"
|
||||||
|
Name 96 "tempReturn"
|
||||||
|
Name 99 "tempArg"
|
||||||
|
Name 119 "tempReturn"
|
||||||
|
Name 123 "tempArg"
|
||||||
|
Name 133 "tempReturn"
|
||||||
|
Name 137 "tempArg"
|
||||||
|
Name 149 "i2D"
|
||||||
|
Name 152 "ic2"
|
||||||
|
Name 159 "tempReturn"
|
||||||
|
Name 162 "ii2DMS"
|
||||||
|
Name 166 "tempArg"
|
||||||
|
Name 177 "ui3D"
|
||||||
|
Name 181 "ic3"
|
||||||
|
Name 189 "outColor"
|
||||||
|
Name 206 "c3"
|
||||||
|
Name 208 "c4"
|
||||||
|
Name 212 "offsets"
|
||||||
|
Decorate 29(s2D) DescriptorSet 0
|
||||||
|
Decorate 29(s2D) Binding 0
|
||||||
|
Decorate 46(is2D) DescriptorSet 0
|
||||||
|
Decorate 46(is2D) Binding 0
|
||||||
|
Decorate 63(us2D) DescriptorSet 0
|
||||||
|
Decorate 63(us2D) Binding 0
|
||||||
|
Decorate 149(i2D) DescriptorSet 0
|
||||||
|
Decorate 149(i2D) Binding 0
|
||||||
|
Decorate 152(ic2) Flat
|
||||||
|
Decorate 162(ii2DMS) DescriptorSet 0
|
||||||
|
Decorate 162(ii2DMS) Binding 0
|
||||||
|
Decorate 177(ui3D) DescriptorSet 0
|
||||||
|
Decorate 177(ui3D) Binding 0
|
||||||
|
Decorate 181(ic3) Flat
|
||||||
|
Decorate 212(offsets) Flat
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeInt 32 1
|
||||||
|
7: TypePointer Function 6(int)
|
||||||
|
9: 6(int) Constant 0
|
||||||
|
10: TypeFloat 32
|
||||||
|
11: TypeVector 10(float) 4
|
||||||
|
12: TypePointer Function 11(fvec4)
|
||||||
|
14: 10(float) Constant 0
|
||||||
|
15: 11(fvec4) ConstantComposite 14 14 14 14
|
||||||
|
16: TypeVector 6(int) 4
|
||||||
|
17: TypePointer Function 16(ivec4)
|
||||||
|
19: 16(ivec4) ConstantComposite 9 9 9 9
|
||||||
|
20: TypeInt 32 0
|
||||||
|
21: TypeVector 20(int) 4
|
||||||
|
22: TypePointer Function 21(ivec4)
|
||||||
|
24: 20(int) Constant 0
|
||||||
|
25: 21(ivec4) ConstantComposite 24 24 24 24
|
||||||
|
26: TypeImage 10(float) 2D sampled format:Unknown
|
||||||
|
27: TypeSampledImage 26
|
||||||
|
28: TypePointer UniformConstant 27
|
||||||
|
29(s2D): 28(ptr) Variable UniformConstant
|
||||||
|
31: TypeVector 10(float) 2
|
||||||
|
32: TypePointer Input 31(fvec2)
|
||||||
|
33(c2): 32(ptr) Variable Input
|
||||||
|
35(ResType): TypeStruct 6(int) 11(fvec4)
|
||||||
|
41: TypePointer Private 6(int)
|
||||||
|
42(tempReturn): 41(ptr) Variable Private
|
||||||
|
43: TypeImage 6(int) 2D sampled format:Unknown
|
||||||
|
44: TypeSampledImage 43
|
||||||
|
45: TypePointer UniformConstant 44
|
||||||
|
46(is2D): 45(ptr) Variable UniformConstant
|
||||||
|
50(ResType): TypeStruct 6(int) 16(ivec4)
|
||||||
|
59(tempReturn): 41(ptr) Variable Private
|
||||||
|
60: TypeImage 20(int) 2D sampled format:Unknown
|
||||||
|
61: TypeSampledImage 60
|
||||||
|
62: TypePointer UniformConstant 61
|
||||||
|
63(us2D): 62(ptr) Variable UniformConstant
|
||||||
|
67(ResType): TypeStruct 6(int) 21(ivec4)
|
||||||
|
78: 10(float) Constant 1073741824
|
||||||
|
84(tempReturn): 41(ptr) Variable Private
|
||||||
|
96(tempReturn): 41(ptr) Variable Private
|
||||||
|
110: TypeVector 6(int) 2
|
||||||
|
112: 6(int) Constant 2
|
||||||
|
119(tempReturn): 41(ptr) Variable Private
|
||||||
|
133(tempReturn): 41(ptr) Variable Private
|
||||||
|
147: TypeImage 10(float) 2D nonsampled format:Rgba32f
|
||||||
|
148: TypePointer UniformConstant 147
|
||||||
|
149(i2D): 148(ptr) Variable UniformConstant
|
||||||
|
151: TypePointer Input 110(ivec2)
|
||||||
|
152(ic2): 151(ptr) Variable Input
|
||||||
|
159(tempReturn): 41(ptr) Variable Private
|
||||||
|
160: TypeImage 6(int) 2D multi-sampled nonsampled format:Rgba32i
|
||||||
|
161: TypePointer UniformConstant 160
|
||||||
|
162(ii2DMS): 161(ptr) Variable UniformConstant
|
||||||
|
165: 6(int) Constant 3
|
||||||
|
175: TypeImage 20(int) 3D nonsampled format:Rgba32ui
|
||||||
|
176: TypePointer UniformConstant 175
|
||||||
|
177(ui3D): 176(ptr) Variable UniformConstant
|
||||||
|
179: TypeVector 6(int) 3
|
||||||
|
180: TypePointer Input 179(ivec3)
|
||||||
|
181(ic3): 180(ptr) Variable Input
|
||||||
|
188: TypePointer Output 11(fvec4)
|
||||||
|
189(outColor): 188(ptr) Variable Output
|
||||||
|
191: TypeBool
|
||||||
|
204: TypeVector 10(float) 3
|
||||||
|
205: TypePointer Input 204(fvec3)
|
||||||
|
206(c3): 205(ptr) Variable Input
|
||||||
|
207: TypePointer Input 11(fvec4)
|
||||||
|
208(c4): 207(ptr) Variable Input
|
||||||
|
209: 20(int) Constant 4
|
||||||
|
210: TypeArray 110(ivec2) 209
|
||||||
|
211: TypePointer Input 210
|
||||||
|
212(offsets): 211(ptr) Variable Input
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
8(resident): 7(ptr) Variable Function
|
||||||
|
13(texel): 12(ptr) Variable Function
|
||||||
|
18(itexel): 17(ptr) Variable Function
|
||||||
|
23(utexel): 22(ptr) Variable Function
|
||||||
|
49(tempArg): 17(ptr) Variable Function
|
||||||
|
66(tempArg): 22(ptr) Variable Function
|
||||||
|
87(tempArg): 17(ptr) Variable Function
|
||||||
|
99(tempArg): 22(ptr) Variable Function
|
||||||
|
123(tempArg): 17(ptr) Variable Function
|
||||||
|
137(tempArg): 22(ptr) Variable Function
|
||||||
|
166(tempArg): 17(ptr) Variable Function
|
||||||
|
193: 12(ptr) Variable Function
|
||||||
|
Store 8(resident) 9
|
||||||
|
Store 13(texel) 15
|
||||||
|
Store 18(itexel) 19
|
||||||
|
Store 23(utexel) 25
|
||||||
|
30: 27 Load 29(s2D)
|
||||||
|
34: 31(fvec2) Load 33(c2)
|
||||||
|
36: 35(ResType) ImageSparseSampleImplicitLod 30 34
|
||||||
|
37: 11(fvec4) CompositeExtract 36 1
|
||||||
|
Store 13(texel) 37
|
||||||
|
38: 6(int) CompositeExtract 36 0
|
||||||
|
39: 6(int) Load 8(resident)
|
||||||
|
40: 6(int) BitwiseOr 39 38
|
||||||
|
Store 8(resident) 40
|
||||||
|
47: 44 Load 46(is2D)
|
||||||
|
48: 31(fvec2) Load 33(c2)
|
||||||
|
51: 50(ResType) ImageSparseSampleImplicitLod 47 48 SignExtend
|
||||||
|
52: 16(ivec4) CompositeExtract 51 1
|
||||||
|
Store 49(tempArg) 52
|
||||||
|
53: 6(int) CompositeExtract 51 0
|
||||||
|
Store 42(tempReturn) 53
|
||||||
|
54: 16(ivec4) Load 49(tempArg)
|
||||||
|
55: 11(fvec4) ConvertSToF 54
|
||||||
|
Store 13(texel) 55
|
||||||
|
56: 6(int) Load 42(tempReturn)
|
||||||
|
57: 6(int) Load 8(resident)
|
||||||
|
58: 6(int) BitwiseOr 57 56
|
||||||
|
Store 8(resident) 58
|
||||||
|
64: 61 Load 63(us2D)
|
||||||
|
65: 31(fvec2) Load 33(c2)
|
||||||
|
68: 67(ResType) ImageSparseSampleImplicitLod 64 65 ZeroExtend
|
||||||
|
69: 21(ivec4) CompositeExtract 68 1
|
||||||
|
Store 66(tempArg) 69
|
||||||
|
70: 6(int) CompositeExtract 68 0
|
||||||
|
Store 59(tempReturn) 70
|
||||||
|
71: 21(ivec4) Load 66(tempArg)
|
||||||
|
72: 11(fvec4) ConvertUToF 71
|
||||||
|
Store 13(texel) 72
|
||||||
|
73: 6(int) Load 59(tempReturn)
|
||||||
|
74: 6(int) Load 8(resident)
|
||||||
|
75: 6(int) BitwiseOr 74 73
|
||||||
|
Store 8(resident) 75
|
||||||
|
76: 27 Load 29(s2D)
|
||||||
|
77: 31(fvec2) Load 33(c2)
|
||||||
|
79: 35(ResType) ImageSparseSampleExplicitLod 76 77 Lod 78
|
||||||
|
80: 11(fvec4) CompositeExtract 79 1
|
||||||
|
Store 13(texel) 80
|
||||||
|
81: 6(int) CompositeExtract 79 0
|
||||||
|
82: 6(int) Load 8(resident)
|
||||||
|
83: 6(int) BitwiseOr 82 81
|
||||||
|
Store 8(resident) 83
|
||||||
|
85: 44 Load 46(is2D)
|
||||||
|
86: 31(fvec2) Load 33(c2)
|
||||||
|
88: 50(ResType) ImageSparseSampleExplicitLod 85 86 Lod SignExtend 78
|
||||||
|
89: 16(ivec4) CompositeExtract 88 1
|
||||||
|
Store 87(tempArg) 89
|
||||||
|
90: 6(int) CompositeExtract 88 0
|
||||||
|
Store 84(tempReturn) 90
|
||||||
|
91: 16(ivec4) Load 87(tempArg)
|
||||||
|
92: 11(fvec4) ConvertSToF 91
|
||||||
|
Store 13(texel) 92
|
||||||
|
93: 6(int) Load 84(tempReturn)
|
||||||
|
94: 6(int) Load 8(resident)
|
||||||
|
95: 6(int) BitwiseOr 94 93
|
||||||
|
Store 8(resident) 95
|
||||||
|
97: 61 Load 63(us2D)
|
||||||
|
98: 31(fvec2) Load 33(c2)
|
||||||
|
100: 67(ResType) ImageSparseSampleExplicitLod 97 98 Lod ZeroExtend 78
|
||||||
|
101: 21(ivec4) CompositeExtract 100 1
|
||||||
|
Store 99(tempArg) 101
|
||||||
|
102: 6(int) CompositeExtract 100 0
|
||||||
|
Store 96(tempReturn) 102
|
||||||
|
103: 21(ivec4) Load 99(tempArg)
|
||||||
|
104: 11(fvec4) ConvertUToF 103
|
||||||
|
Store 13(texel) 104
|
||||||
|
105: 6(int) Load 96(tempReturn)
|
||||||
|
106: 6(int) Load 8(resident)
|
||||||
|
107: 6(int) BitwiseOr 106 105
|
||||||
|
Store 8(resident) 107
|
||||||
|
108: 27 Load 29(s2D)
|
||||||
|
109: 31(fvec2) Load 33(c2)
|
||||||
|
111: 110(ivec2) ConvertFToS 109
|
||||||
|
113: 26 Image 108
|
||||||
|
114: 35(ResType) ImageSparseFetch 113 111 Lod 112
|
||||||
|
115: 11(fvec4) CompositeExtract 114 1
|
||||||
|
Store 13(texel) 115
|
||||||
|
116: 6(int) CompositeExtract 114 0
|
||||||
|
117: 6(int) Load 8(resident)
|
||||||
|
118: 6(int) BitwiseOr 117 116
|
||||||
|
Store 8(resident) 118
|
||||||
|
120: 44 Load 46(is2D)
|
||||||
|
121: 31(fvec2) Load 33(c2)
|
||||||
|
122: 110(ivec2) ConvertFToS 121
|
||||||
|
124: 43 Image 120
|
||||||
|
125: 50(ResType) ImageSparseFetch 124 122 Lod SignExtend 112
|
||||||
|
126: 16(ivec4) CompositeExtract 125 1
|
||||||
|
Store 123(tempArg) 126
|
||||||
|
127: 6(int) CompositeExtract 125 0
|
||||||
|
Store 119(tempReturn) 127
|
||||||
|
128: 16(ivec4) Load 123(tempArg)
|
||||||
|
129: 11(fvec4) ConvertSToF 128
|
||||||
|
Store 13(texel) 129
|
||||||
|
130: 6(int) Load 119(tempReturn)
|
||||||
|
131: 6(int) Load 8(resident)
|
||||||
|
132: 6(int) BitwiseOr 131 130
|
||||||
|
Store 8(resident) 132
|
||||||
|
134: 61 Load 63(us2D)
|
||||||
|
135: 31(fvec2) Load 33(c2)
|
||||||
|
136: 110(ivec2) ConvertFToS 135
|
||||||
|
138: 60 Image 134
|
||||||
|
139: 67(ResType) ImageSparseFetch 138 136 Lod ZeroExtend 112
|
||||||
|
140: 21(ivec4) CompositeExtract 139 1
|
||||||
|
Store 137(tempArg) 140
|
||||||
|
141: 6(int) CompositeExtract 139 0
|
||||||
|
Store 133(tempReturn) 141
|
||||||
|
142: 21(ivec4) Load 137(tempArg)
|
||||||
|
143: 11(fvec4) ConvertUToF 142
|
||||||
|
Store 13(texel) 143
|
||||||
|
144: 6(int) Load 133(tempReturn)
|
||||||
|
145: 6(int) Load 8(resident)
|
||||||
|
146: 6(int) BitwiseOr 145 144
|
||||||
|
Store 8(resident) 146
|
||||||
|
150: 147 Load 149(i2D)
|
||||||
|
153: 110(ivec2) Load 152(ic2)
|
||||||
|
154: 35(ResType) ImageSparseRead 150 153
|
||||||
|
155: 11(fvec4) CompositeExtract 154 1
|
||||||
|
Store 13(texel) 155
|
||||||
|
156: 6(int) CompositeExtract 154 0
|
||||||
|
157: 6(int) Load 8(resident)
|
||||||
|
158: 6(int) BitwiseOr 157 156
|
||||||
|
Store 8(resident) 158
|
||||||
|
163: 160 Load 162(ii2DMS)
|
||||||
|
164: 110(ivec2) Load 152(ic2)
|
||||||
|
167: 50(ResType) ImageSparseRead 163 164 Sample SignExtend 165
|
||||||
|
168: 16(ivec4) CompositeExtract 167 1
|
||||||
|
Store 166(tempArg) 168
|
||||||
|
169: 6(int) CompositeExtract 167 0
|
||||||
|
Store 159(tempReturn) 169
|
||||||
|
170: 16(ivec4) Load 166(tempArg)
|
||||||
|
171: 11(fvec4) ConvertSToF 170
|
||||||
|
Store 13(texel) 171
|
||||||
|
172: 6(int) Load 159(tempReturn)
|
||||||
|
173: 6(int) Load 8(resident)
|
||||||
|
174: 6(int) BitwiseOr 173 172
|
||||||
|
Store 8(resident) 174
|
||||||
|
178: 175 Load 177(ui3D)
|
||||||
|
182: 179(ivec3) Load 181(ic3)
|
||||||
|
183: 67(ResType) ImageSparseRead 178 182 ZeroExtend
|
||||||
|
184: 21(ivec4) CompositeExtract 183 1
|
||||||
|
Store 23(utexel) 184
|
||||||
|
185: 6(int) CompositeExtract 183 0
|
||||||
|
186: 6(int) Load 8(resident)
|
||||||
|
187: 6(int) BitwiseOr 186 185
|
||||||
|
Store 8(resident) 187
|
||||||
|
190: 6(int) Load 8(resident)
|
||||||
|
192: 191(bool) ImageSparseTexelsResident 190
|
||||||
|
SelectionMerge 195 None
|
||||||
|
BranchConditional 192 194 197
|
||||||
|
194: Label
|
||||||
|
196: 11(fvec4) Load 13(texel)
|
||||||
|
Store 193 196
|
||||||
|
Branch 195
|
||||||
|
197: Label
|
||||||
|
198: 16(ivec4) Load 18(itexel)
|
||||||
|
199: 11(fvec4) ConvertSToF 198
|
||||||
|
200: 21(ivec4) Load 23(utexel)
|
||||||
|
201: 11(fvec4) ConvertUToF 200
|
||||||
|
202: 11(fvec4) FAdd 199 201
|
||||||
|
Store 193 202
|
||||||
|
Branch 195
|
||||||
|
195: Label
|
||||||
|
203: 11(fvec4) Load 193
|
||||||
|
Store 189(outColor) 203
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
115
Test/baseResults/spv.1.4.texture.frag.out
Executable file
115
Test/baseResults/spv.1.4.texture.frag.out
Executable file
@ -0,0 +1,115 @@
|
|||||||
|
spv.1.4.texture.frag
|
||||||
|
// Module Version 10400
|
||||||
|
// Generated by (magic number): 80007
|
||||||
|
// Id's are bound by 79
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 15 19 28 40 51 54 76 78
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source GLSL 450
|
||||||
|
Name 4 "main"
|
||||||
|
Name 9 "color"
|
||||||
|
Name 15 "texSampler2D"
|
||||||
|
Name 19 "coords2D"
|
||||||
|
Name 28 "itexSampler2D"
|
||||||
|
Name 40 "utexSampler2D"
|
||||||
|
Name 51 "iCoords2D"
|
||||||
|
Name 54 "iLod"
|
||||||
|
Name 76 "t"
|
||||||
|
Name 78 "color"
|
||||||
|
Decorate 15(texSampler2D) DescriptorSet 0
|
||||||
|
Decorate 15(texSampler2D) Binding 0
|
||||||
|
Decorate 28(itexSampler2D) DescriptorSet 0
|
||||||
|
Decorate 28(itexSampler2D) Binding 0
|
||||||
|
Decorate 40(utexSampler2D) DescriptorSet 0
|
||||||
|
Decorate 40(utexSampler2D) Binding 0
|
||||||
|
Decorate 51(iCoords2D) Flat
|
||||||
|
Decorate 54(iLod) Flat
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 4
|
||||||
|
8: TypePointer Function 7(fvec4)
|
||||||
|
10: 6(float) Constant 0
|
||||||
|
11: 7(fvec4) ConstantComposite 10 10 10 10
|
||||||
|
12: TypeImage 6(float) 2D sampled format:Unknown
|
||||||
|
13: TypeSampledImage 12
|
||||||
|
14: TypePointer UniformConstant 13
|
||||||
|
15(texSampler2D): 14(ptr) Variable UniformConstant
|
||||||
|
17: TypeVector 6(float) 2
|
||||||
|
18: TypePointer Input 17(fvec2)
|
||||||
|
19(coords2D): 18(ptr) Variable Input
|
||||||
|
24: TypeInt 32 1
|
||||||
|
25: TypeImage 24(int) 2D sampled format:Unknown
|
||||||
|
26: TypeSampledImage 25
|
||||||
|
27: TypePointer UniformConstant 26
|
||||||
|
28(itexSampler2D): 27(ptr) Variable UniformConstant
|
||||||
|
31: TypeVector 24(int) 4
|
||||||
|
36: TypeInt 32 0
|
||||||
|
37: TypeImage 36(int) 2D sampled format:Unknown
|
||||||
|
38: TypeSampledImage 37
|
||||||
|
39: TypePointer UniformConstant 38
|
||||||
|
40(utexSampler2D): 39(ptr) Variable UniformConstant
|
||||||
|
43: TypeVector 36(int) 4
|
||||||
|
49: TypeVector 24(int) 2
|
||||||
|
50: TypePointer Input 49(ivec2)
|
||||||
|
51(iCoords2D): 50(ptr) Variable Input
|
||||||
|
53: TypePointer Input 24(int)
|
||||||
|
54(iLod): 53(ptr) Variable Input
|
||||||
|
76(t): 18(ptr) Variable Input
|
||||||
|
77: TypePointer Output 7(fvec4)
|
||||||
|
78(color): 77(ptr) Variable Output
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
9(color): 8(ptr) Variable Function
|
||||||
|
Store 9(color) 11
|
||||||
|
16: 13 Load 15(texSampler2D)
|
||||||
|
20: 17(fvec2) Load 19(coords2D)
|
||||||
|
21: 7(fvec4) ImageSampleImplicitLod 16 20
|
||||||
|
22: 7(fvec4) Load 9(color)
|
||||||
|
23: 7(fvec4) FAdd 22 21
|
||||||
|
Store 9(color) 23
|
||||||
|
29: 26 Load 28(itexSampler2D)
|
||||||
|
30: 17(fvec2) Load 19(coords2D)
|
||||||
|
32: 31(ivec4) ImageSampleImplicitLod 29 30 SignExtend
|
||||||
|
33: 7(fvec4) ConvertSToF 32
|
||||||
|
34: 7(fvec4) Load 9(color)
|
||||||
|
35: 7(fvec4) FAdd 34 33
|
||||||
|
Store 9(color) 35
|
||||||
|
41: 38 Load 40(utexSampler2D)
|
||||||
|
42: 17(fvec2) Load 19(coords2D)
|
||||||
|
44: 43(ivec4) ImageSampleImplicitLod 41 42 ZeroExtend
|
||||||
|
45: 7(fvec4) ConvertUToF 44
|
||||||
|
46: 7(fvec4) Load 9(color)
|
||||||
|
47: 7(fvec4) FAdd 46 45
|
||||||
|
Store 9(color) 47
|
||||||
|
48: 13 Load 15(texSampler2D)
|
||||||
|
52: 49(ivec2) Load 51(iCoords2D)
|
||||||
|
55: 24(int) Load 54(iLod)
|
||||||
|
56: 12 Image 48
|
||||||
|
57: 7(fvec4) ImageFetch 56 52 Lod 55
|
||||||
|
58: 7(fvec4) Load 9(color)
|
||||||
|
59: 7(fvec4) FAdd 58 57
|
||||||
|
Store 9(color) 59
|
||||||
|
60: 26 Load 28(itexSampler2D)
|
||||||
|
61: 49(ivec2) Load 51(iCoords2D)
|
||||||
|
62: 24(int) Load 54(iLod)
|
||||||
|
63: 25 Image 60
|
||||||
|
64: 31(ivec4) ImageFetch 63 61 Lod SignExtend 62
|
||||||
|
65: 7(fvec4) ConvertSToF 64
|
||||||
|
66: 7(fvec4) Load 9(color)
|
||||||
|
67: 7(fvec4) FAdd 66 65
|
||||||
|
Store 9(color) 67
|
||||||
|
68: 38 Load 40(utexSampler2D)
|
||||||
|
69: 49(ivec2) Load 51(iCoords2D)
|
||||||
|
70: 24(int) Load 54(iLod)
|
||||||
|
71: 37 Image 68
|
||||||
|
72: 43(ivec4) ImageFetch 71 69 Lod ZeroExtend 70
|
||||||
|
73: 7(fvec4) ConvertUToF 72
|
||||||
|
74: 7(fvec4) Load 9(color)
|
||||||
|
75: 7(fvec4) FAdd 74 73
|
||||||
|
Store 9(color) 75
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
@ -1,7 +1,7 @@
|
|||||||
spv.controlFlowAttributes.frag
|
spv.controlFlowAttributes.frag
|
||||||
WARNING: 0:20: '' : attribute with arguments not recognized, skipping
|
WARNING: 0:20: 'unroll' : expected no arguments
|
||||||
WARNING: 0:21: '' : attribute with arguments not recognized, skipping
|
WARNING: 0:21: 'dont_unroll' : expected no arguments
|
||||||
WARNING: 0:22: '' : attribute with arguments not recognized, skipping
|
WARNING: 0:22: 'dependency_infinite' : expected no arguments
|
||||||
WARNING: 0:23: 'dependency_length' : expected a single integer argument
|
WARNING: 0:23: 'dependency_length' : expected a single integer argument
|
||||||
WARNING: 0:24: '' : attribute with arguments not recognized, skipping
|
WARNING: 0:24: '' : attribute with arguments not recognized, skipping
|
||||||
WARNING: 0:25: '' : attribute with arguments not recognized, skipping
|
WARNING: 0:25: '' : attribute with arguments not recognized, skipping
|
||||||
|
|||||||
19
Test/spv.1.4.LoopControl.frag
Normal file
19
Test/spv.1.4.LoopControl.frag
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
#extension GL_EXT_control_flow_attributes : enable
|
||||||
|
|
||||||
|
bool cond;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
[[min_iterations(3), max_iterations(7)]] for (int i = 0; i < 8; ++i) { }
|
||||||
|
[[iteration_multiple(2)]] while(true) { }
|
||||||
|
[[peel_count(5)]] do { } while(true);
|
||||||
|
[[partial_count(4)]] for (int i = 0; i < 8; ++i) { }
|
||||||
|
|
||||||
|
// warnings on all these
|
||||||
|
[[min_iterations, max_iterations]] for (int i = 0; i < 8; ++i) { }
|
||||||
|
//[[iteration_multiple(0)]] while(true) { }
|
||||||
|
//[[peel_count]] do { } while(true);
|
||||||
|
//[[partial_count]] for (int i = 0; i < 8; ++i) { }
|
||||||
|
}
|
||||||
13
Test/spv.1.4.NonWritable.frag
Executable file
13
Test/spv.1.4.NonWritable.frag
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(location = 0) flat in int index;
|
||||||
|
|
||||||
|
layout(location = 0) out float color;
|
||||||
|
|
||||||
|
// lookup table
|
||||||
|
const float table[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
color = table[index];
|
||||||
|
}
|
||||||
48
Test/spv.1.4.OpCopyLogical.comp
Normal file
48
Test/spv.1.4.OpCopyLogical.comp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#version 450 core
|
||||||
|
|
||||||
|
struct MyStruct
|
||||||
|
{
|
||||||
|
vec2 foo[2];
|
||||||
|
int sb;
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(binding = 0, std430) buffer SSBO0
|
||||||
|
{
|
||||||
|
MyStruct a;
|
||||||
|
} inBuf;
|
||||||
|
|
||||||
|
layout(binding = 1, std430) buffer SSBO1
|
||||||
|
{
|
||||||
|
MyStruct b;
|
||||||
|
} outBuf;
|
||||||
|
|
||||||
|
layout(binding = 2, std140) uniform UBO
|
||||||
|
{
|
||||||
|
MyStruct c;
|
||||||
|
} uBuf;
|
||||||
|
|
||||||
|
struct Nested {
|
||||||
|
float f;
|
||||||
|
MyStruct S[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(binding = 2, std140) uniform UBON
|
||||||
|
{
|
||||||
|
Nested N1;
|
||||||
|
} uBufN;
|
||||||
|
|
||||||
|
layout(binding = 1, std430) buffer SSBO1N
|
||||||
|
{
|
||||||
|
Nested N2;
|
||||||
|
} outBufN;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
MyStruct t = inBuf.a;
|
||||||
|
outBuf.b = t;
|
||||||
|
t = uBuf.c;
|
||||||
|
outBuf.b = t;
|
||||||
|
|
||||||
|
Nested n = uBufN.N1;
|
||||||
|
outBufN.N2 = n;
|
||||||
|
}
|
||||||
21
Test/spv.1.4.OpCopyLogical.funcall.frag
Normal file
21
Test/spv.1.4.OpCopyLogical.funcall.frag
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
struct S { mat4 m; };
|
||||||
|
buffer blockName { S s1; }; // need an S with decoration
|
||||||
|
S s2; // no decorations on S
|
||||||
|
|
||||||
|
void fooConst(const in S s) { }
|
||||||
|
void foo(in S s) { }
|
||||||
|
void fooOut(inout S s) { }
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
fooConst(s1);
|
||||||
|
fooConst(s2);
|
||||||
|
|
||||||
|
foo(s1);
|
||||||
|
foo(s2);
|
||||||
|
|
||||||
|
fooOut(s1);
|
||||||
|
fooOut(s2);
|
||||||
|
}
|
||||||
48
Test/spv.1.4.OpCopyLogicalBool.comp
Normal file
48
Test/spv.1.4.OpCopyLogicalBool.comp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#version 450 core
|
||||||
|
|
||||||
|
struct MyStruct
|
||||||
|
{
|
||||||
|
vec2 foo[2];
|
||||||
|
bool sb;
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(binding = 0, std430) buffer SSBO0
|
||||||
|
{
|
||||||
|
MyStruct a;
|
||||||
|
} inBuf;
|
||||||
|
|
||||||
|
layout(binding = 1, std430) buffer SSBO1
|
||||||
|
{
|
||||||
|
MyStruct b;
|
||||||
|
} outBuf;
|
||||||
|
|
||||||
|
layout(binding = 2, std140) uniform UBO
|
||||||
|
{
|
||||||
|
MyStruct c;
|
||||||
|
} uBuf;
|
||||||
|
|
||||||
|
struct Nested {
|
||||||
|
bool b;
|
||||||
|
MyStruct S[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(binding = 2, std140) uniform UBON
|
||||||
|
{
|
||||||
|
Nested N1;
|
||||||
|
} uBufN;
|
||||||
|
|
||||||
|
layout(binding = 1, std430) buffer SSBO1N
|
||||||
|
{
|
||||||
|
Nested N2;
|
||||||
|
} outBufN;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
MyStruct t = inBuf.a;
|
||||||
|
outBuf.b = t;
|
||||||
|
t = uBuf.c;
|
||||||
|
outBuf.b = t;
|
||||||
|
|
||||||
|
Nested n = uBufN.N1;
|
||||||
|
outBufN.N2 = n;
|
||||||
|
}
|
||||||
27
Test/spv.1.4.OpEntryPoint.frag
Normal file
27
Test/spv.1.4.OpEntryPoint.frag
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(location = 0) in vec4 inv;
|
||||||
|
layout(location = 0) out vec4 outv;
|
||||||
|
|
||||||
|
vec4 globalv;
|
||||||
|
|
||||||
|
layout(binding = 0) uniform ubt {
|
||||||
|
vec4 v;
|
||||||
|
} uniformv;
|
||||||
|
|
||||||
|
layout(binding = 1) buffer bbt {
|
||||||
|
float f;
|
||||||
|
} bufferv;
|
||||||
|
|
||||||
|
layout(binding = 2, push_constant) uniform pushB {
|
||||||
|
int a;
|
||||||
|
} pushv;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 functionv;
|
||||||
|
functionv = inv;
|
||||||
|
globalv = inv;
|
||||||
|
outv = functionv + inv + globalv + uniformv.v * pushv.a * bufferv.f;
|
||||||
|
outv += functionv + inv + globalv + uniformv.v * pushv.a * bufferv.f;
|
||||||
|
}
|
||||||
37
Test/spv.1.4.OpSelect.frag
Executable file
37
Test/spv.1.4.OpSelect.frag
Executable file
@ -0,0 +1,37 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
struct S1 {
|
||||||
|
float a;
|
||||||
|
int b;
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(location = 0) flat in S1 in1;
|
||||||
|
layout(location = 2) flat in S1 in2;
|
||||||
|
layout(location = 4) flat in int cond;
|
||||||
|
|
||||||
|
layout(location = 0) out float outv;
|
||||||
|
|
||||||
|
void fun1(){}
|
||||||
|
void fun2(){}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// glslang will only make OpSelect for very trivial looking expressions
|
||||||
|
|
||||||
|
float f1 = 1.0;
|
||||||
|
float f2 = 2.0;
|
||||||
|
outv = cond < 8 ? f1 : f2; // in all versions
|
||||||
|
|
||||||
|
ivec4 iv1 = ivec4(f1);
|
||||||
|
ivec4 iv2 = ivec4(f2);
|
||||||
|
outv *= (cond > 0 ? iv1 : iv2).z; // in all versions, but in 1.4 as scalar condition, not smeared ala mix()
|
||||||
|
|
||||||
|
mat3 m1 = mat3(1.0);
|
||||||
|
mat3 m2 = mat3(2.0);
|
||||||
|
outv *= (cond < 20 ? m1 : m2)[2][1]; // in 1.4, but not before
|
||||||
|
|
||||||
|
S1 fv = cond > 5 ? in1 : in2; // in 1.4, but not before
|
||||||
|
outv *= fv.a;
|
||||||
|
|
||||||
|
cond > 0 ? fun1() : fun2(); // not allowed by any version
|
||||||
|
}
|
||||||
38
Test/spv.1.4.image.frag
Normal file
38
Test/spv.1.4.image.frag
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(rgba32f, binding = 1) uniform image2D i2D;
|
||||||
|
layout(r32i, binding = 12) uniform iimage2D ii2D;
|
||||||
|
layout(r32ui, binding = 12) uniform uimage2D ui2D;
|
||||||
|
|
||||||
|
layout(rgba32f, binding = 9) uniform image2DMS i2DMS;
|
||||||
|
layout(r32i, binding = 13) uniform iimage2DMS ii2DMS;
|
||||||
|
layout(r32ui, binding = 13) uniform uimage2DMS ui2DMS;
|
||||||
|
|
||||||
|
flat in ivec2 ic2D;
|
||||||
|
flat in uint value;
|
||||||
|
|
||||||
|
out vec4 fragData;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 v = vec4(0.0);
|
||||||
|
ivec4 iv = ivec4(0.0);
|
||||||
|
uvec4 uv = uvec4(0.0);
|
||||||
|
|
||||||
|
v += imageLoad(i2D, ic2D);
|
||||||
|
imageStore(i2D, ic2D, v);
|
||||||
|
v += imageLoad(ii2D, ic2D);
|
||||||
|
imageStore(ii2D, ic2D, iv);
|
||||||
|
v += imageLoad(ui2D, ic2D);
|
||||||
|
imageStore(ui2D, ic2D, uv);
|
||||||
|
|
||||||
|
v += imageLoad(i2DMS, ic2D, 1);
|
||||||
|
imageStore(i2DMS, ic2D, 2, v);
|
||||||
|
v += imageLoad(ii2DMS, ic2D, 1);
|
||||||
|
imageStore(ii2DMS, ic2D, 2, iv);
|
||||||
|
v += imageLoad(ui2DMS, ic2D, 1);
|
||||||
|
imageStore(ui2DMS, ic2D, 2, uv);
|
||||||
|
|
||||||
|
fragData = v;
|
||||||
|
}
|
||||||
|
|
||||||
47
Test/spv.1.4.sparseTexture.frag
Normal file
47
Test/spv.1.4.sparseTexture.frag
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#version 450
|
||||||
|
#extension GL_ARB_sparse_texture2: enable
|
||||||
|
|
||||||
|
uniform sampler2D s2D;
|
||||||
|
uniform isampler2D is2D;
|
||||||
|
uniform usampler2D us2D;
|
||||||
|
|
||||||
|
layout(rgba32f) uniform image2D i2D;
|
||||||
|
layout(rgba32i) uniform iimage2DMS ii2DMS;
|
||||||
|
layout(rgba32ui) uniform uimage3D ui3D;
|
||||||
|
|
||||||
|
in vec2 c2;
|
||||||
|
in vec3 c3;
|
||||||
|
in vec4 c4;
|
||||||
|
|
||||||
|
in flat ivec2 ic2;
|
||||||
|
in flat ivec3 ic3;
|
||||||
|
|
||||||
|
in flat ivec2 offsets[4];
|
||||||
|
|
||||||
|
out vec4 outColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
int resident = 0;
|
||||||
|
vec4 texel = vec4(0.0);
|
||||||
|
ivec4 itexel = ivec4(0);
|
||||||
|
uvec4 utexel = uvec4(0);
|
||||||
|
|
||||||
|
resident |= sparseTextureARB(s2D, c2, texel);
|
||||||
|
resident |= sparseTextureARB(is2D, c2, texel);
|
||||||
|
resident |= sparseTextureARB(us2D, c2, texel);
|
||||||
|
|
||||||
|
resident |= sparseTextureLodARB( s2D, c2, 2.0, texel);
|
||||||
|
resident |= sparseTextureLodARB(is2D, c2, 2.0, texel);
|
||||||
|
resident |= sparseTextureLodARB(us2D, c2, 2.0, texel);
|
||||||
|
|
||||||
|
resident |= sparseTexelFetchARB( s2D, ivec2(c2), 2, texel);
|
||||||
|
resident |= sparseTexelFetchARB(is2D, ivec2(c2), 2, texel);
|
||||||
|
resident |= sparseTexelFetchARB(us2D, ivec2(c2), 2, texel);
|
||||||
|
|
||||||
|
resident |= sparseImageLoadARB(i2D, ic2, texel);
|
||||||
|
resident |= sparseImageLoadARB(ii2DMS, ic2, 3, texel);
|
||||||
|
resident |= sparseImageLoadARB(ui3D, ic3, utexel);
|
||||||
|
|
||||||
|
outColor = sparseTexelsResidentARB(resident) ? texel : vec4(itexel) + vec4(utexel);
|
||||||
|
}
|
||||||
26
Test/spv.1.4.texture.frag
Normal file
26
Test/spv.1.4.texture.frag
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
uniform sampler2D texSampler2D;
|
||||||
|
uniform isampler2D itexSampler2D;
|
||||||
|
uniform usampler2D utexSampler2D;
|
||||||
|
|
||||||
|
in vec2 t;
|
||||||
|
in vec2 coords2D;
|
||||||
|
flat in ivec2 iCoords2D;
|
||||||
|
|
||||||
|
out vec4 color;
|
||||||
|
|
||||||
|
flat in int iLod;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 color = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
|
|
||||||
|
color += texture( texSampler2D, coords2D);
|
||||||
|
color += texture(itexSampler2D, coords2D);
|
||||||
|
color += texture(utexSampler2D, coords2D);
|
||||||
|
|
||||||
|
color += texelFetch( texSampler2D, iCoords2D, iLod);
|
||||||
|
color += texelFetch(itexSampler2D, iCoords2D, iLod);
|
||||||
|
color += texelFetch(utexSampler2D, iCoords2D, iLod);
|
||||||
|
}
|
||||||
@ -1116,7 +1116,12 @@ public:
|
|||||||
first(testFirst),
|
first(testFirst),
|
||||||
unroll(false),
|
unroll(false),
|
||||||
dontUnroll(false),
|
dontUnroll(false),
|
||||||
dependency(0)
|
dependency(0),
|
||||||
|
minIterations(0),
|
||||||
|
maxIterations(iterationsInfinite),
|
||||||
|
iterationMultiple(1),
|
||||||
|
peelCount(0),
|
||||||
|
partialCount(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual TIntermLoop* getAsLoopNode() { return this; }
|
virtual TIntermLoop* getAsLoopNode() { return this; }
|
||||||
@ -1128,14 +1133,36 @@ public:
|
|||||||
bool testFirst() const { return first; }
|
bool testFirst() const { return first; }
|
||||||
|
|
||||||
void setUnroll() { unroll = true; }
|
void setUnroll() { unroll = true; }
|
||||||
void setDontUnroll() { dontUnroll = true; }
|
void setDontUnroll() {
|
||||||
|
dontUnroll = true;
|
||||||
|
peelCount = 0;
|
||||||
|
partialCount = 0;
|
||||||
|
}
|
||||||
bool getUnroll() const { return unroll; }
|
bool getUnroll() const { return unroll; }
|
||||||
bool getDontUnroll() const { return dontUnroll; }
|
bool getDontUnroll() const { return dontUnroll; }
|
||||||
|
|
||||||
static const unsigned int dependencyInfinite = 0xFFFFFFFF;
|
static const unsigned int dependencyInfinite = 0xFFFFFFFF;
|
||||||
|
static const unsigned int iterationsInfinite = 0xFFFFFFFF;
|
||||||
void setLoopDependency(int d) { dependency = d; }
|
void setLoopDependency(int d) { dependency = d; }
|
||||||
int getLoopDependency() const { return dependency; }
|
int getLoopDependency() const { return dependency; }
|
||||||
|
|
||||||
|
void setMinIterations(unsigned int v) { minIterations = v; }
|
||||||
|
unsigned int getMinIterations() const { return minIterations; }
|
||||||
|
void setMaxIterations(unsigned int v) { maxIterations = v; }
|
||||||
|
unsigned int getMaxIterations() const { return maxIterations; }
|
||||||
|
void setIterationMultiple(unsigned int v) { iterationMultiple = v; }
|
||||||
|
unsigned int getIterationMultiple() const { return iterationMultiple; }
|
||||||
|
void setPeelCount(unsigned int v) {
|
||||||
|
peelCount = v;
|
||||||
|
dontUnroll = false;
|
||||||
|
}
|
||||||
|
unsigned int getPeelCount() const { return peelCount; }
|
||||||
|
void setPartialCount(unsigned int v) {
|
||||||
|
partialCount = v;
|
||||||
|
dontUnroll = false;
|
||||||
|
}
|
||||||
|
unsigned int getPartialCount() const { return partialCount; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TIntermNode* body; // code to loop over
|
TIntermNode* body; // code to loop over
|
||||||
TIntermTyped* test; // exit condition associated with loop, could be 0 for 'for' loops
|
TIntermTyped* test; // exit condition associated with loop, could be 0 for 'for' loops
|
||||||
@ -1144,6 +1171,11 @@ protected:
|
|||||||
bool unroll; // true if unroll requested
|
bool unroll; // true if unroll requested
|
||||||
bool dontUnroll; // true if request to not unroll
|
bool dontUnroll; // true if request to not unroll
|
||||||
unsigned int dependency; // loop dependency hint; 0 means not set or unknown
|
unsigned int dependency; // loop dependency hint; 0 means not set or unknown
|
||||||
|
unsigned int minIterations; // as per the SPIR-V specification
|
||||||
|
unsigned int maxIterations; // as per the SPIR-V specification
|
||||||
|
unsigned int iterationMultiple; // as per the SPIR-V specification
|
||||||
|
unsigned int peelCount; // as per the SPIR-V specification
|
||||||
|
unsigned int partialCount; // as per the SPIR-V specification
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
// This header is generated by the make-revision script.
|
// This header is generated by the make-revision script.
|
||||||
|
|
||||||
#define GLSLANG_PATCH_LEVEL 3216
|
#define GLSLANG_PATCH_LEVEL 3226
|
||||||
|
|||||||
@ -52,6 +52,7 @@ bool TAttributeArgs::getInt(int& value, int argNum) const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// extract strings out of attribute arguments stored in attribute aggregate.
|
// extract strings out of attribute arguments stored in attribute aggregate.
|
||||||
// convert to lower case if converToLower is true (for case-insensitive compare convenience)
|
// convert to lower case if converToLower is true (for case-insensitive compare convenience)
|
||||||
bool TAttributeArgs::getString(TString& value, int argNum, bool convertToLower) const
|
bool TAttributeArgs::getString(TString& value, int argNum, bool convertToLower) const
|
||||||
@ -110,6 +111,16 @@ TAttributeType TParseContext::attributeFromName(const TString& name) const
|
|||||||
return EatDependencyInfinite;
|
return EatDependencyInfinite;
|
||||||
else if (name == "dependency_length")
|
else if (name == "dependency_length")
|
||||||
return EatDependencyLength;
|
return EatDependencyLength;
|
||||||
|
else if (name == "min_iterations")
|
||||||
|
return EatMinIterations;
|
||||||
|
else if (name == "max_iterations")
|
||||||
|
return EatMaxIterations;
|
||||||
|
else if (name == "iteration_multiple")
|
||||||
|
return EatIterationMultiple;
|
||||||
|
else if (name == "peel_count")
|
||||||
|
return EatPeelCount;
|
||||||
|
else if (name == "partial_count")
|
||||||
|
return EatPartialCount;
|
||||||
else
|
else
|
||||||
return EatNone;
|
return EatNone;
|
||||||
}
|
}
|
||||||
@ -225,29 +236,101 @@ void TParseContext::handleLoopAttributes(const TAttributes& attributes, TIntermN
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (auto it = attributes.begin(); it != attributes.end(); ++it) {
|
for (auto it = attributes.begin(); it != attributes.end(); ++it) {
|
||||||
if (it->name != EatDependencyLength && it->size() > 0) {
|
|
||||||
warn(node->getLoc(), "attribute with arguments not recognized, skipping", "", "");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
const auto noArgument = [&](const char* feature) {
|
||||||
|
if (it->size() > 0) {
|
||||||
|
warn(node->getLoc(), "expected no arguments", feature, "");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto positiveSignedArgument = [&](const char* feature, int& value) {
|
||||||
|
if (it->size() == 1 && it->getInt(value)) {
|
||||||
|
if (value <= 0) {
|
||||||
|
error(node->getLoc(), "must be positive", feature, "");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
warn(node->getLoc(), "expected a single integer argument", feature, "");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto unsignedArgument = [&](const char* feature, unsigned int& uiValue) {
|
||||||
int value;
|
int value;
|
||||||
|
if (!(it->size() == 1 && it->getInt(value))) {
|
||||||
|
warn(node->getLoc(), "expected a single integer argument", feature, "");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uiValue = (unsigned int)value;
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto positiveUnsignedArgument = [&](const char* feature, unsigned int& uiValue) {
|
||||||
|
int value;
|
||||||
|
if (it->size() == 1 && it->getInt(value)) {
|
||||||
|
if (value == 0) {
|
||||||
|
error(node->getLoc(), "must be greater than or equal to 1", feature, "");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
warn(node->getLoc(), "expected a single integer argument", feature, "");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uiValue = (unsigned int)value;
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto spirv14 = [&](const char* feature) {
|
||||||
|
if (spvVersion.spv > 0 && spvVersion.spv < EShTargetSpv_1_4)
|
||||||
|
warn(node->getLoc(), "attribute requires a SPIR-V 1.4 target-env", feature, "");
|
||||||
|
};
|
||||||
|
|
||||||
|
int value = 0;
|
||||||
|
unsigned uiValue = 0;
|
||||||
switch (it->name) {
|
switch (it->name) {
|
||||||
case EatUnroll:
|
case EatUnroll:
|
||||||
|
if (noArgument("unroll"))
|
||||||
loop->setUnroll();
|
loop->setUnroll();
|
||||||
break;
|
break;
|
||||||
case EatLoop:
|
case EatLoop:
|
||||||
|
if (noArgument("dont_unroll"))
|
||||||
loop->setDontUnroll();
|
loop->setDontUnroll();
|
||||||
break;
|
break;
|
||||||
case EatDependencyInfinite:
|
case EatDependencyInfinite:
|
||||||
|
if (noArgument("dependency_infinite"))
|
||||||
loop->setLoopDependency(TIntermLoop::dependencyInfinite);
|
loop->setLoopDependency(TIntermLoop::dependencyInfinite);
|
||||||
break;
|
break;
|
||||||
case EatDependencyLength:
|
case EatDependencyLength:
|
||||||
if (it->size() == 1 && it->getInt(value)) {
|
if (positiveSignedArgument("dependency_length", value))
|
||||||
if (value <= 0)
|
|
||||||
error(node->getLoc(), "must be positive", "dependency_length", "");
|
|
||||||
loop->setLoopDependency(value);
|
loop->setLoopDependency(value);
|
||||||
} else
|
break;
|
||||||
warn(node->getLoc(), "expected a single integer argument", "dependency_length", "");
|
case EatMinIterations:
|
||||||
|
spirv14("min_iterations");
|
||||||
|
if (unsignedArgument("min_iterations", uiValue))
|
||||||
|
loop->setMinIterations(uiValue);
|
||||||
|
break;
|
||||||
|
case EatMaxIterations:
|
||||||
|
spirv14("max_iterations");
|
||||||
|
if (unsignedArgument("max_iterations", uiValue))
|
||||||
|
loop->setMaxIterations(uiValue);
|
||||||
|
break;
|
||||||
|
case EatIterationMultiple:
|
||||||
|
spirv14("iteration_multiple");
|
||||||
|
if (positiveUnsignedArgument("iteration_multiple", uiValue))
|
||||||
|
loop->setIterationMultiple(uiValue);
|
||||||
|
break;
|
||||||
|
case EatPeelCount:
|
||||||
|
spirv14("peel_count");
|
||||||
|
if (unsignedArgument("peel_count", uiValue))
|
||||||
|
loop->setPeelCount(uiValue);
|
||||||
|
break;
|
||||||
|
case EatPartialCount:
|
||||||
|
spirv14("partial_count");
|
||||||
|
if (unsignedArgument("partial_count", uiValue))
|
||||||
|
loop->setPartialCount(uiValue);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
warn(node->getLoc(), "attribute does not apply to a loop", "", "");
|
warn(node->getLoc(), "attribute does not apply to a loop", "", "");
|
||||||
|
|||||||
@ -71,7 +71,12 @@ namespace glslang {
|
|||||||
EatPushConstant,
|
EatPushConstant,
|
||||||
EatConstantId,
|
EatConstantId,
|
||||||
EatDependencyInfinite,
|
EatDependencyInfinite,
|
||||||
EatDependencyLength
|
EatDependencyLength,
|
||||||
|
EatMinIterations,
|
||||||
|
EatMaxIterations,
|
||||||
|
EatIterationMultiple,
|
||||||
|
EatPeelCount,
|
||||||
|
EatPartialCount
|
||||||
};
|
};
|
||||||
|
|
||||||
class TIntermAggregate;
|
class TIntermAggregate;
|
||||||
|
|||||||
@ -68,7 +68,7 @@
|
|||||||
// This should always increase, as some paths to do not consume
|
// This should always increase, as some paths to do not consume
|
||||||
// a more major number.
|
// a more major number.
|
||||||
// It should increment by one when new functionality is added.
|
// It should increment by one when new functionality is added.
|
||||||
#define GLSLANG_MINOR_VERSION 11
|
#define GLSLANG_MINOR_VERSION 12
|
||||||
|
|
||||||
//
|
//
|
||||||
// Call before doing any other compiler/linker operations.
|
// Call before doing any other compiler/linker operations.
|
||||||
|
|||||||
@ -48,7 +48,7 @@ using CompileToAstTestNV = GlslangTest<::testing::TestWithParam<std::string>>;
|
|||||||
TEST_P(CompileToAstTest, FromFile)
|
TEST_P(CompileToAstTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0,
|
Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::AST);
|
Target::AST);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ TEST_P(CompileToAstTest, FromFile)
|
|||||||
TEST_P(CompileToAstTestNV, FromFile)
|
TEST_P(CompileToAstTestNV, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0,
|
Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::AST);
|
Target::AST);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -70,14 +70,14 @@ using HlslLegalDebugTest = GlslangTest<::testing::TestWithParam<FileNameEntryPoi
|
|||||||
TEST_P(HlslCompileTest, FromFile)
|
TEST_P(HlslCompileTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
||||||
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
|
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::BothASTAndSpv, true, GetParam().entryPoint);
|
Target::BothASTAndSpv, true, GetParam().entryPoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(HlslVulkan1_1CompileTest, FromFile)
|
TEST_P(HlslVulkan1_1CompileTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
||||||
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1,
|
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1, glslang::EShTargetSpv_1_3,
|
||||||
Target::BothASTAndSpv, true, GetParam().entryPoint);
|
Target::BothASTAndSpv, true, GetParam().entryPoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ TEST_P(HlslCompileAndFlattenTest, FromFile)
|
|||||||
TEST_P(HlslLegalizeTest, FromFile)
|
TEST_P(HlslLegalizeTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
||||||
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
|
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::Spv, true, GetParam().entryPoint,
|
Target::Spv, true, GetParam().entryPoint,
|
||||||
"/baseLegalResults/", true);
|
"/baseLegalResults/", true);
|
||||||
}
|
}
|
||||||
@ -103,7 +103,7 @@ TEST_P(HlslLegalizeTest, FromFile)
|
|||||||
TEST_P(HlslDebugTest, FromFile)
|
TEST_P(HlslDebugTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
||||||
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
|
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::Spv, true, GetParam().entryPoint,
|
Target::Spv, true, GetParam().entryPoint,
|
||||||
"/baseResults/", false, true);
|
"/baseResults/", false, true);
|
||||||
}
|
}
|
||||||
@ -111,7 +111,8 @@ TEST_P(HlslDebugTest, FromFile)
|
|||||||
TEST_P(HlslDX9CompatibleTest, FromFile)
|
TEST_P(HlslDX9CompatibleTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheckWithOptions(GlobalTestSettings.testRoot, GetParam().fileName, Source::HLSL,
|
loadFileCompileAndCheckWithOptions(GlobalTestSettings.testRoot, GetParam().fileName, Source::HLSL,
|
||||||
Semantics::Vulkan, glslang::EShTargetVulkan_1_0, Target::BothASTAndSpv, true,
|
Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
|
Target::BothASTAndSpv, true,
|
||||||
GetParam().entryPoint, "/baseResults/",
|
GetParam().entryPoint, "/baseResults/",
|
||||||
EShMessages::EShMsgHlslDX9Compatible);
|
EShMessages::EShMsgHlslDX9Compatible);
|
||||||
}
|
}
|
||||||
@ -122,7 +123,7 @@ TEST_P(HlslDX9CompatibleTest, FromFile)
|
|||||||
TEST_P(HlslLegalDebugTest, FromFile)
|
TEST_P(HlslLegalDebugTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
|
||||||
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
|
Source::HLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::Spv, true, GetParam().entryPoint,
|
Target::Spv, true, GetParam().entryPoint,
|
||||||
"/baseResults/", true, true);
|
"/baseResults/", true, true);
|
||||||
}
|
}
|
||||||
|
|||||||
44
gtests/Spv.FromFile.cpp
Normal file → Executable file
44
gtests/Spv.FromFile.cpp
Normal file → Executable file
@ -65,6 +65,7 @@ std::string FileNameAsCustomTestSuffixIoMap(
|
|||||||
using CompileVulkanToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
using CompileVulkanToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using CompileVulkanToDebugSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
using CompileVulkanToDebugSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
|
using CompileToSpirv14Test = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using CompileOpenGLToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
using CompileOpenGLToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using VulkanSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
|
using VulkanSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
using OpenGLSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
|
using OpenGLSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
|
||||||
@ -84,7 +85,7 @@ using CompileUpgradeTextureToSampledTextureAndDropSamplersTest = GlslangTest<::t
|
|||||||
TEST_P(CompileVulkanToSpirvTest, FromFile)
|
TEST_P(CompileVulkanToSpirvTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
|
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::Spv);
|
Target::Spv);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,7 +95,7 @@ TEST_P(CompileVulkanToDebugSpirvTest, FromFile)
|
|||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
Source::GLSL, Semantics::Vulkan,
|
Source::GLSL, Semantics::Vulkan,
|
||||||
glslang::EShTargetVulkan_1_0,
|
glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::Spv, true, "",
|
Target::Spv, true, "",
|
||||||
"/baseResults/", false, true);
|
"/baseResults/", false, true);
|
||||||
}
|
}
|
||||||
@ -102,7 +103,14 @@ TEST_P(CompileVulkanToDebugSpirvTest, FromFile)
|
|||||||
TEST_P(CompileVulkan1_1ToSpirvTest, FromFile)
|
TEST_P(CompileVulkan1_1ToSpirvTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1,
|
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1, glslang::EShTargetSpv_1_3,
|
||||||
|
Target::Spv);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(CompileToSpirv14Test, FromFile)
|
||||||
|
{
|
||||||
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
|
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1, glslang::EShTargetSpv_1_4,
|
||||||
Target::Spv);
|
Target::Spv);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,7 +119,7 @@ TEST_P(CompileVulkan1_1ToSpirvTest, FromFile)
|
|||||||
TEST_P(CompileOpenGLToSpirvTest, FromFile)
|
TEST_P(CompileOpenGLToSpirvTest, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0,
|
Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::Spv);
|
Target::Spv);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +128,7 @@ TEST_P(CompileOpenGLToSpirvTest, FromFile)
|
|||||||
TEST_P(VulkanSemantics, FromFile)
|
TEST_P(VulkanSemantics, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
|
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::Spv, false);
|
Target::Spv, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,7 +137,7 @@ TEST_P(VulkanSemantics, FromFile)
|
|||||||
TEST_P(OpenGLSemantics, FromFile)
|
TEST_P(OpenGLSemantics, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0,
|
Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::Spv, false);
|
Target::Spv, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +145,7 @@ TEST_P(OpenGLSemantics, FromFile)
|
|||||||
TEST_P(VulkanAstSemantics, FromFile)
|
TEST_P(VulkanAstSemantics, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
|
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::AST);
|
Target::AST);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,7 +185,7 @@ TEST_P(GlslIoMap, FromFile)
|
|||||||
TEST_P(CompileVulkanToSpirvTestAMD, FromFile)
|
TEST_P(CompileVulkanToSpirvTestAMD, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
|
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::Spv);
|
Target::Spv);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -188,7 +196,7 @@ TEST_P(CompileVulkanToSpirvTestAMD, FromFile)
|
|||||||
TEST_P(CompileVulkanToSpirvTestNV, FromFile)
|
TEST_P(CompileVulkanToSpirvTestNV, FromFile)
|
||||||
{
|
{
|
||||||
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
|
||||||
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0,
|
Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
|
||||||
Target::Spv);
|
Target::Spv);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -453,6 +461,24 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
FileNameAsCustomTestSuffix
|
FileNameAsCustomTestSuffix
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
INSTANTIATE_TEST_CASE_P(
|
||||||
|
Glsl, CompileToSpirv14Test,
|
||||||
|
::testing::ValuesIn(std::vector<std::string>({
|
||||||
|
"spv.1.4.LoopControl.frag",
|
||||||
|
"spv.1.4.NonWritable.frag",
|
||||||
|
"spv.1.4.OpEntryPoint.frag",
|
||||||
|
"spv.1.4.OpSelect.frag",
|
||||||
|
"spv.1.4.OpCopyLogical.comp",
|
||||||
|
"spv.1.4.OpCopyLogicalBool.comp",
|
||||||
|
"spv.1.4.OpCopyLogical.funcall.frag",
|
||||||
|
"spv.1.4.image.frag",
|
||||||
|
"spv.1.4.sparseTexture.frag",
|
||||||
|
"spv.1.4.texture.frag",
|
||||||
|
})),
|
||||||
|
FileNameAsCustomTestSuffix
|
||||||
|
);
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
INSTANTIATE_TEST_CASE_P(
|
INSTANTIATE_TEST_CASE_P(
|
||||||
Hlsl, HlslIoMap,
|
Hlsl, HlslIoMap,
|
||||||
|
|||||||
19
gtests/TestFixture.h
Normal file → Executable file
19
gtests/TestFixture.h
Normal file → Executable file
@ -212,6 +212,7 @@ public:
|
|||||||
const std::string& shaderName, const std::string& code,
|
const std::string& shaderName, const std::string& code,
|
||||||
const std::string& entryPointName, EShMessages controls,
|
const std::string& entryPointName, EShMessages controls,
|
||||||
glslang::EShTargetClientVersion clientTargetVersion,
|
glslang::EShTargetClientVersion clientTargetVersion,
|
||||||
|
glslang::EShTargetLanguageVersion targetLanguageVersion,
|
||||||
bool flattenUniformArrays = false,
|
bool flattenUniformArrays = false,
|
||||||
EShTextureSamplerTransformMode texSampTransMode = EShTexSampTransKeep,
|
EShTextureSamplerTransformMode texSampTransMode = EShTexSampTransKeep,
|
||||||
bool enableOptimizer = false,
|
bool enableOptimizer = false,
|
||||||
@ -234,9 +235,7 @@ public:
|
|||||||
: glslang::EShSourceGlsl,
|
: glslang::EShSourceGlsl,
|
||||||
stage, glslang::EShClientVulkan, 100);
|
stage, glslang::EShClientVulkan, 100);
|
||||||
shader.setEnvClient(glslang::EShClientVulkan, clientTargetVersion);
|
shader.setEnvClient(glslang::EShClientVulkan, clientTargetVersion);
|
||||||
shader.setEnvTarget(glslang::EShTargetSpv,
|
shader.setEnvTarget(glslang::EShTargetSpv, targetLanguageVersion);
|
||||||
clientTargetVersion == glslang::EShTargetVulkan_1_1 ? glslang::EShTargetSpv_1_3
|
|
||||||
: glslang::EShTargetSpv_1_0);
|
|
||||||
} else {
|
} else {
|
||||||
shader.setEnvInput((controls & EShMsgReadHlsl) ? glslang::EShSourceHlsl
|
shader.setEnvInput((controls & EShMsgReadHlsl) ? glslang::EShSourceHlsl
|
||||||
: glslang::EShSourceGlsl,
|
: glslang::EShSourceGlsl,
|
||||||
@ -429,6 +428,7 @@ public:
|
|||||||
Source source,
|
Source source,
|
||||||
Semantics semantics,
|
Semantics semantics,
|
||||||
glslang::EShTargetClientVersion clientTargetVersion,
|
glslang::EShTargetClientVersion clientTargetVersion,
|
||||||
|
glslang::EShTargetLanguageVersion targetLanguageVersion,
|
||||||
Target target,
|
Target target,
|
||||||
bool automap = true,
|
bool automap = true,
|
||||||
const std::string& entryPointName="",
|
const std::string& entryPointName="",
|
||||||
@ -449,8 +449,8 @@ public:
|
|||||||
controls = static_cast<EShMessages>(controls & ~EShMsgHlslLegalization);
|
controls = static_cast<EShMessages>(controls & ~EShMsgHlslLegalization);
|
||||||
if (enableDebug)
|
if (enableDebug)
|
||||||
controls = static_cast<EShMessages>(controls | EShMsgDebugInfo);
|
controls = static_cast<EShMessages>(controls | EShMsgDebugInfo);
|
||||||
GlslangResult result = compileAndLink(testName, input, entryPointName, controls, clientTargetVersion, false,
|
GlslangResult result = compileAndLink(testName, input, entryPointName, controls, clientTargetVersion,
|
||||||
EShTexSampTransKeep, enableOptimizer, enableDebug, automap);
|
targetLanguageVersion, false, EShTexSampTransKeep, enableOptimizer, enableDebug, automap);
|
||||||
|
|
||||||
// Generate the hybrid output in the way of glslangValidator.
|
// Generate the hybrid output in the way of glslangValidator.
|
||||||
std::ostringstream stream;
|
std::ostringstream stream;
|
||||||
@ -465,6 +465,7 @@ public:
|
|||||||
Source source,
|
Source source,
|
||||||
Semantics semantics,
|
Semantics semantics,
|
||||||
glslang::EShTargetClientVersion clientTargetVersion,
|
glslang::EShTargetClientVersion clientTargetVersion,
|
||||||
|
glslang::EShTargetLanguageVersion targetLanguageVersion,
|
||||||
Target target, bool automap = true, const std::string &entryPointName = "",
|
Target target, bool automap = true, const std::string &entryPointName = "",
|
||||||
const std::string &baseDir = "/baseResults/",
|
const std::string &baseDir = "/baseResults/",
|
||||||
const EShMessages additionalOptions = EShMessages::EShMsgDefault)
|
const EShMessages additionalOptions = EShMessages::EShMsgDefault)
|
||||||
@ -478,8 +479,8 @@ public:
|
|||||||
|
|
||||||
EShMessages controls = DeriveOptions(source, semantics, target);
|
EShMessages controls = DeriveOptions(source, semantics, target);
|
||||||
controls = static_cast<EShMessages>(controls | additionalOptions);
|
controls = static_cast<EShMessages>(controls | additionalOptions);
|
||||||
GlslangResult result = compileAndLink(testName, input, entryPointName, controls, clientTargetVersion, false,
|
GlslangResult result = compileAndLink(testName, input, entryPointName, controls, clientTargetVersion,
|
||||||
EShTexSampTransKeep, false, automap);
|
targetLanguageVersion, false, EShTexSampTransKeep, false, automap);
|
||||||
|
|
||||||
// Generate the hybrid output in the way of glslangValidator.
|
// Generate the hybrid output in the way of glslangValidator.
|
||||||
std::ostringstream stream;
|
std::ostringstream stream;
|
||||||
@ -505,7 +506,7 @@ public:
|
|||||||
|
|
||||||
const EShMessages controls = DeriveOptions(source, semantics, target);
|
const EShMessages controls = DeriveOptions(source, semantics, target);
|
||||||
GlslangResult result = compileAndLink(testName, input, entryPointName, controls,
|
GlslangResult result = compileAndLink(testName, input, entryPointName, controls,
|
||||||
glslang::EShTargetVulkan_1_0, true);
|
glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0, true);
|
||||||
|
|
||||||
// Generate the hybrid output in the way of glslangValidator.
|
// Generate the hybrid output in the way of glslangValidator.
|
||||||
std::ostringstream stream;
|
std::ostringstream stream;
|
||||||
@ -675,7 +676,7 @@ public:
|
|||||||
|
|
||||||
const EShMessages controls = DeriveOptions(source, semantics, target);
|
const EShMessages controls = DeriveOptions(source, semantics, target);
|
||||||
GlslangResult result = compileAndLink(testName, input, entryPointName, controls,
|
GlslangResult result = compileAndLink(testName, input, entryPointName, controls,
|
||||||
glslang::EShTargetVulkan_1_0, false,
|
glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0, false,
|
||||||
EShTexSampTransUpgradeTextureRemoveSampler);
|
EShTexSampTransUpgradeTextureRemoveSampler);
|
||||||
|
|
||||||
// Generate the hybrid output in the way of glslangValidator.
|
// Generate the hybrid output in the way of glslangValidator.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user