@@ -2698,9 +2698,13 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI
26982698 spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
26992699 length = builder.createCooperativeMatrixLengthNV(typeId);
27002700 }
2701- } else if (node->getOperand()->getType().isCoopVecNV ()) {
2701+ } else if (node->getOperand()->getType().isCoopVecOrLongVector ()) {
27022702 spv::Id typeId = convertGlslangToSpvType(node->getOperand()->getType());
2703- length = builder.getCooperativeVectorNumComponents(typeId);
2703+ if (builder.isCooperativeVectorType(typeId)) {
2704+ length = builder.getCooperativeVectorNumComponents(typeId);
2705+ } else {
2706+ length = builder.makeIntConstant(builder.getNumTypeConstituents(typeId));
2707+ }
27042708 } else {
27052709 glslang::TIntermTyped* block = node->getOperand()->getAsBinaryNode()->getLeft();
27062710 block->traverse(this);
@@ -3351,7 +3355,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
33513355 builder.addCapability(spv::Capability::CooperativeMatrixConversionsNV);
33523356 builder.addExtension(spv::E_SPV_NV_cooperative_matrix2);
33533357 constructed = builder.createCooperativeMatrixConversion(resultType(), arguments[0]);
3354- } else if (node->getOp() == glslang::EOpConstructCooperativeVectorNV &&
3358+ } else if (node->getType().isCoopVecOrLongVector() &&
33553359 arguments.size() == 1 &&
33563360 builder.getTypeId(arguments[0]) == resultType()) {
33573361 constructed = arguments[0];
@@ -3361,7 +3365,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
33613365 node->getType().isArray() ||
33623366 // Handle constructing coopvec from one component here, to avoid the component
33633367 // getting smeared
3364- (node->getOp() == glslang::EOpConstructCooperativeVectorNV && arguments.size() == 1 && builder.isScalar(arguments[0]))) {
3368+ (node->getType().hasSpecConstantVectorComponents() && arguments.size() == 1 && builder.isScalar(arguments[0]))) {
33653369 std::vector<spv::Id> constituents;
33663370 for (int c = 0; c < (int)arguments.size(); ++c)
33673371 constituents.push_back(arguments[c]);
@@ -3423,7 +3427,8 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
34233427 {
34243428 // for scalar dot product, use multiply
34253429 glslang::TIntermSequence& glslangOperands = node->getSequence();
3426- if (glslangOperands[0]->getAsTyped()->getVectorSize() == 1)
3430+ if (!glslangOperands[0]->getAsTyped()->getType().isLongVector() &&
3431+ glslangOperands[0]->getAsTyped()->getVectorSize() == 1)
34273432 binOp = glslang::EOpMul;
34283433 break;
34293434 }
@@ -5647,6 +5652,24 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty
56475652 spvType = builder.makeCooperativeVectorTypeNV(spvType, components);
56485653 }
56495654
5655+ if (type.isLongVector()) {
5656+ builder.addCapability(spv::Capability::LongVectorEXT);
5657+ builder.addExtension(spv::E_SPV_EXT_long_vector);
5658+
5659+ if (type.getBasicType() == glslang::EbtFloat16)
5660+ builder.addCapability(spv::Capability::Float16);
5661+ if (type.getBasicType() == glslang::EbtUint8 || type.getBasicType() == glslang::EbtInt8) {
5662+ builder.addCapability(spv::Capability::Int8);
5663+ }
5664+
5665+ if (type.hasSpecConstantVectorComponents()) {
5666+ spv::Id components = makeArraySizeId(*type.getTypeParameters()->arraySizes, 0);
5667+ spvType = builder.makeCooperativeVectorTypeNV(spvType, components);
5668+ } else {
5669+ spvType = builder.makeVectorType(spvType, type.getTypeParameters()->arraySizes->getDimSize(0));
5670+ }
5671+ }
5672+
56505673 if (type.isArray()) {
56515674 int stride = 0; // keep this 0 unless doing an explicit layout; 0 will mean no decoration, no stride
56525675
@@ -9843,9 +9866,12 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
98439866 builder.addExtension(spv::E_SPV_AMD_gpu_shader_int16);
98449867 if (builder.getNumComponents(operands[0]) == 1)
98459868 frexpIntType = builder.makeIntegerType(width, true);
9869+ else if (builder.isCooperativeVector(operands[0]))
9870+ frexpIntType = builder.makeCooperativeVectorTypeNV(builder.makeIntegerType(width, true),
9871+ builder.getCooperativeVectorNumComponents(builder.getTypeId(operands[0])));
98469872 else
98479873 frexpIntType = builder.makeVectorType(builder.makeIntegerType(width, true),
9848- builder.getNumComponents(operands[0]));
9874+ builder.getNumComponents(operands[0]));
98499875 typeId = builder.makeStructResultType(typeId0, frexpIntType);
98509876 consumedOperands = 1;
98519877 }
@@ -11149,8 +11175,8 @@ spv::Id TGlslangToSpvTraverser::createSpvConstantFromConstUnionArray(const glsla
1114911175 glslang::TVector<glslang::TTypeLoc>::const_iterator iter;
1115011176 for (iter = glslangType.getStruct()->begin(); iter != glslangType.getStruct()->end(); ++iter)
1115111177 spvConsts.push_back(createSpvConstantFromConstUnionArray(*iter->type, consts, nextConst, false));
11152- } else if (glslangType.getVectorSize() > 1 || glslangType.isCoopVecNV ()) {
11153- unsigned int numComponents = glslangType.isCoopVecNV () ? glslangType.getTypeParameters()->arraySizes->getDimSize(0) : glslangType.getVectorSize();
11178+ } else if (glslangType.getVectorSize() > 1 || glslangType.isCoopVecOrLongVector ()) {
11179+ unsigned int numComponents = glslangType.isCoopVecOrLongVector () ? glslangType.getTypeParameters()->arraySizes->getDimSize(0) : glslangType.getVectorSize();
1115411180 for (unsigned int i = 0; i < numComponents; ++i) {
1115511181 bool zero = nextConst >= consts.size();
1115611182 switch (glslangType.getBasicType()) {
0 commit comments