Support for SPV_QCOM_image_processing2 (#3539)
This commit is contained in:
parent
be0d1cb452
commit
10ee92feb0
18 changed files with 822 additions and 8 deletions
|
|
@ -63,6 +63,7 @@ set(HEADERS
|
|||
GLSL.ext.AMD.h
|
||||
GLSL.ext.NV.h
|
||||
GLSL.ext.ARM.h
|
||||
GLSL.ext.QCOM.h
|
||||
NonSemanticDebugPrintf.h
|
||||
NonSemanticShaderDebugInfo100.h)
|
||||
|
||||
|
|
|
|||
|
|
@ -37,5 +37,7 @@ static const int GLSLextQCOMRevision = 1;
|
|||
|
||||
//SPV_QCOM_image_processing
|
||||
const char* const E_SPV_QCOM_image_processing = "SPV_QCOM_image_processing";
|
||||
//SPV_QCOM_image_processing2
|
||||
const char* const E_SPV_QCOM_image_processing2 = "SPV_QCOM_image_processing2";
|
||||
|
||||
#endif // #ifndef GLSLextQCOM_H
|
||||
|
|
|
|||
|
|
@ -228,6 +228,7 @@ protected:
|
|||
spv::Id getSymbolId(const glslang::TIntermSymbol* node);
|
||||
void addMeshNVDecoration(spv::Id id, int member, const glslang::TQualifier & qualifier);
|
||||
void addImageProcessingQCOMDecoration(spv::Id id, spv::Decoration decor);
|
||||
void addImageProcessing2QCOMDecoration(spv::Id id, bool isForGather);
|
||||
spv::Id createSpvConstant(const glslang::TIntermTyped&);
|
||||
spv::Id createSpvConstantFromConstUnionArray(const glslang::TType& type, const glslang::TConstUnionArray&,
|
||||
int& nextConst, bool specConstant);
|
||||
|
|
@ -3370,6 +3371,20 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|||
builder.addExtension(spv::E_SPV_QCOM_image_processing);
|
||||
break;
|
||||
|
||||
case glslang::EOpImageBlockMatchWindowSSDQCOM:
|
||||
case glslang::EOpImageBlockMatchWindowSADQCOM:
|
||||
builder.addCapability(spv::CapabilityTextureBlockMatchQCOM);
|
||||
builder.addExtension(spv::E_SPV_QCOM_image_processing);
|
||||
builder.addCapability(spv::CapabilityTextureBlockMatch2QCOM);
|
||||
builder.addExtension(spv::E_SPV_QCOM_image_processing2);
|
||||
break;
|
||||
|
||||
case glslang::EOpImageBlockMatchGatherSSDQCOM:
|
||||
case glslang::EOpImageBlockMatchGatherSADQCOM:
|
||||
builder.addCapability(spv::CapabilityTextureBlockMatch2QCOM);
|
||||
builder.addExtension(spv::E_SPV_QCOM_image_processing2);
|
||||
break;
|
||||
|
||||
case glslang::EOpFetchMicroTriangleVertexPositionNV:
|
||||
case glslang::EOpFetchMicroTriangleVertexBarycentricNV:
|
||||
builder.addExtension(spv::E_SPV_NV_displacement_micromap);
|
||||
|
|
@ -9268,6 +9283,30 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
|
|||
opCode = spv::OpFetchMicroTriangleVertexPositionNV;
|
||||
break;
|
||||
|
||||
case glslang::EOpImageBlockMatchWindowSSDQCOM:
|
||||
typeId = builder.makeVectorType(builder.makeFloatType(32), 4);
|
||||
opCode = spv::OpImageBlockMatchWindowSSDQCOM;
|
||||
addImageProcessing2QCOMDecoration(operands[0], false);
|
||||
addImageProcessing2QCOMDecoration(operands[2], false);
|
||||
break;
|
||||
case glslang::EOpImageBlockMatchWindowSADQCOM:
|
||||
typeId = builder.makeVectorType(builder.makeFloatType(32), 4);
|
||||
opCode = spv::OpImageBlockMatchWindowSADQCOM;
|
||||
addImageProcessing2QCOMDecoration(operands[0], false);
|
||||
addImageProcessing2QCOMDecoration(operands[2], false);
|
||||
break;
|
||||
case glslang::EOpImageBlockMatchGatherSSDQCOM:
|
||||
typeId = builder.makeVectorType(builder.makeFloatType(32), 4);
|
||||
opCode = spv::OpImageBlockMatchGatherSSDQCOM;
|
||||
addImageProcessing2QCOMDecoration(operands[0], true);
|
||||
addImageProcessing2QCOMDecoration(operands[2], true);
|
||||
break;
|
||||
case glslang::EOpImageBlockMatchGatherSADQCOM:
|
||||
typeId = builder.makeVectorType(builder.makeFloatType(32), 4);
|
||||
opCode = spv::OpImageBlockMatchGatherSADQCOM;
|
||||
addImageProcessing2QCOMDecoration(operands[0], true);
|
||||
addImageProcessing2QCOMDecoration(operands[2], true);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -9788,6 +9827,36 @@ void TGlslangToSpvTraverser::addImageProcessingQCOMDecoration(spv::Id id, spv::D
|
|||
}
|
||||
}
|
||||
|
||||
void TGlslangToSpvTraverser::addImageProcessing2QCOMDecoration(spv::Id id, bool isForGather)
|
||||
{
|
||||
if (isForGather) {
|
||||
return addImageProcessingQCOMDecoration(id, spv::DecorationBlockMatchTextureQCOM);
|
||||
}
|
||||
|
||||
auto addDecor =
|
||||
[this](spv::Id id, spv::Decoration decor) {
|
||||
spv::Id tsopc = this->builder.getOpCode(id);
|
||||
if (tsopc == spv::OpLoad) {
|
||||
spv::Id tsid = this->builder.getIdOperand(id, 0);
|
||||
if (this->glslangIntermediate->getSpv().spv >= glslang::EShTargetSpv_1_4) {
|
||||
assert(iOSet.count(tsid) > 0);
|
||||
}
|
||||
this->builder.addDecoration(tsid, decor);
|
||||
}
|
||||
};
|
||||
|
||||
spv::Id opc = builder.getOpCode(id);
|
||||
bool isInterfaceObject = (opc != spv::OpSampledImage);
|
||||
|
||||
if (!isInterfaceObject) {
|
||||
addDecor(builder.getIdOperand(id, 0), spv::DecorationBlockMatchTextureQCOM);
|
||||
addDecor(builder.getIdOperand(id, 1), spv::DecorationBlockMatchSamplerQCOM);
|
||||
} else {
|
||||
addDecor(id, spv::DecorationBlockMatchTextureQCOM);
|
||||
addDecor(id, spv::DecorationBlockMatchSamplerQCOM);
|
||||
}
|
||||
}
|
||||
|
||||
// Make a full tree of instructions to build a SPIR-V specialization constant,
|
||||
// or regular constant if possible.
|
||||
//
|
||||
|
|
|
|||
|
|
@ -319,6 +319,7 @@ const char* DecorationString(int decoration)
|
|||
|
||||
case DecorationWeightTextureQCOM: return "DecorationWeightTextureQCOM";
|
||||
case DecorationBlockMatchTextureQCOM: return "DecorationBlockMatchTextureQCOM";
|
||||
case DecorationBlockMatchSamplerQCOM: return "DecorationBlockMatchSamplerQCOM";
|
||||
case DecorationExplicitInterpAMD: return "ExplicitInterpAMD";
|
||||
case DecorationOverrideCoverageNV: return "OverrideCoverageNV";
|
||||
case DecorationPassthroughNV: return "PassthroughNV";
|
||||
|
|
@ -1577,6 +1578,10 @@ const char* OpcodeString(int op)
|
|||
case OpImageBoxFilterQCOM: return "OpImageBoxFilterQCOM";
|
||||
case OpImageBlockMatchSADQCOM: return "OpImageBlockMatchSADQCOM";
|
||||
case OpImageBlockMatchSSDQCOM: return "OpImageBlockMatchSSDQCOM";
|
||||
case OpImageBlockMatchWindowSSDQCOM: return "OpImageBlockMatchWindowSSDQCOM";
|
||||
case OpImageBlockMatchWindowSADQCOM: return "OpImageBlockMatchWindowSADQCOM";
|
||||
case OpImageBlockMatchGatherSSDQCOM: return "OpImageBlockMatchGatherSSDQCOM";
|
||||
case OpImageBlockMatchGatherSADQCOM: return "OpImageBlockMatchGatherSADQCOM";
|
||||
|
||||
default:
|
||||
return "Bad";
|
||||
|
|
@ -3433,6 +3438,38 @@ void Parameterize()
|
|||
InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandId, "'block size'");
|
||||
InstructionDesc[OpImageBlockMatchSSDQCOM].operands.push(OperandImageOperands, "", true);
|
||||
InstructionDesc[OpImageBlockMatchSSDQCOM].setResultAndType(true, true);
|
||||
|
||||
InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandId, "'target texture'");
|
||||
InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandId, "'target coordinates'");
|
||||
InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandId, "'reference texture'");
|
||||
InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandId, "'reference coordinates'");
|
||||
InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandId, "'block size'");
|
||||
InstructionDesc[OpImageBlockMatchWindowSSDQCOM].operands.push(OperandImageOperands, "", true);
|
||||
InstructionDesc[OpImageBlockMatchWindowSSDQCOM].setResultAndType(true, true);
|
||||
|
||||
InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandId, "'target texture'");
|
||||
InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandId, "'target coordinates'");
|
||||
InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandId, "'reference texture'");
|
||||
InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandId, "'reference coordinates'");
|
||||
InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandId, "'block size'");
|
||||
InstructionDesc[OpImageBlockMatchWindowSADQCOM].operands.push(OperandImageOperands, "", true);
|
||||
InstructionDesc[OpImageBlockMatchWindowSADQCOM].setResultAndType(true, true);
|
||||
|
||||
InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandId, "'target texture'");
|
||||
InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandId, "'target coordinates'");
|
||||
InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandId, "'reference texture'");
|
||||
InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandId, "'reference coordinates'");
|
||||
InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandId, "'block size'");
|
||||
InstructionDesc[OpImageBlockMatchGatherSSDQCOM].operands.push(OperandImageOperands, "", true);
|
||||
InstructionDesc[OpImageBlockMatchGatherSSDQCOM].setResultAndType(true, true);
|
||||
|
||||
InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandId, "'target texture'");
|
||||
InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandId, "'target coordinates'");
|
||||
InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandId, "'reference texture'");
|
||||
InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandId, "'reference coordinates'");
|
||||
InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandId, "'block size'");
|
||||
InstructionDesc[OpImageBlockMatchGatherSADQCOM].operands.push(OperandImageOperands, "", true);
|
||||
InstructionDesc[OpImageBlockMatchGatherSADQCOM].setResultAndType(true, true);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright (c) 2014-2020 The Khronos Group Inc.
|
||||
// Copyright (c) 2014-2024 The Khronos Group Inc.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and/or associated documentation files (the "Materials"),
|
||||
|
|
@ -174,7 +174,7 @@ enum ExecutionMode {
|
|||
ExecutionModeStencilRefUnchangedBackAMD = 5082,
|
||||
ExecutionModeStencilRefGreaterBackAMD = 5083,
|
||||
ExecutionModeStencilRefLessBackAMD = 5084,
|
||||
ExecutionModeQuadDerivativesKHR = 5088,
|
||||
ExecutionModeQuadDerivativesKHR = 5088,
|
||||
ExecutionModeRequireFullQuadsKHR = 5089,
|
||||
ExecutionModeOutputLinesEXT = 5269,
|
||||
ExecutionModeOutputLinesNV = 5269,
|
||||
|
|
@ -200,7 +200,7 @@ enum ExecutionMode {
|
|||
ExecutionModeNoGlobalOffsetINTEL = 5895,
|
||||
ExecutionModeNumSIMDWorkitemsINTEL = 5896,
|
||||
ExecutionModeSchedulerTargetFmaxMhzINTEL = 5903,
|
||||
ExecutionModeMaximallyReconvergesKHR = 6023,
|
||||
ExecutionModeMaximallyReconvergesKHR = 6023,
|
||||
ExecutionModeStreamingInterfaceINTEL = 6154,
|
||||
ExecutionModeNamedBarrierCountINTEL = 6417,
|
||||
ExecutionModeMax = 0x7fffffff,
|
||||
|
|
@ -518,6 +518,7 @@ enum Decoration {
|
|||
DecorationNoUnsignedWrap = 4470,
|
||||
DecorationWeightTextureQCOM = 4487,
|
||||
DecorationBlockMatchTextureQCOM = 4488,
|
||||
DecorationBlockMatchSamplerQCOM = 4499,
|
||||
DecorationExplicitInterpAMD = 4999,
|
||||
DecorationOverrideCoverageNV = 5248,
|
||||
DecorationPassthroughNV = 5250,
|
||||
|
|
@ -725,8 +726,6 @@ enum BuiltIn {
|
|||
BuiltInHitTriangleVertexPositionsKHR = 5335,
|
||||
BuiltInHitMicroTriangleVertexPositionsNV = 5337,
|
||||
BuiltInHitMicroTriangleVertexBarycentricsNV = 5344,
|
||||
BuiltInHitKindFrontFacingMicroTriangleNV = 5405,
|
||||
BuiltInHitKindBackFacingMicroTriangleNV = 5406,
|
||||
BuiltInIncomingRayFlagsKHR = 5351,
|
||||
BuiltInIncomingRayFlagsNV = 5351,
|
||||
BuiltInRayGeometryIndexKHR = 5352,
|
||||
|
|
@ -734,6 +733,8 @@ enum BuiltIn {
|
|||
BuiltInSMCountNV = 5375,
|
||||
BuiltInWarpIDNV = 5376,
|
||||
BuiltInSMIDNV = 5377,
|
||||
BuiltInHitKindFrontFacingMicroTriangleNV = 5405,
|
||||
BuiltInHitKindBackFacingMicroTriangleNV = 5406,
|
||||
BuiltInCullMaskKHR = 6021,
|
||||
BuiltInMax = 0x7fffffff,
|
||||
};
|
||||
|
|
@ -1035,6 +1036,7 @@ enum Capability {
|
|||
CapabilityTextureSampleWeightedQCOM = 4484,
|
||||
CapabilityTextureBoxFilterQCOM = 4485,
|
||||
CapabilityTextureBlockMatchQCOM = 4486,
|
||||
CapabilityTextureBlockMatch2QCOM = 4498,
|
||||
CapabilityFloat16ImageAMD = 5008,
|
||||
CapabilityImageGatherBiasLodAMD = 5009,
|
||||
CapabilityFragmentMaskAMD = 5010,
|
||||
|
|
@ -1103,12 +1105,12 @@ enum Capability {
|
|||
CapabilityDemoteToHelperInvocation = 5379,
|
||||
CapabilityDemoteToHelperInvocationEXT = 5379,
|
||||
CapabilityDisplacementMicromapNV = 5380,
|
||||
CapabilityRayTracingDisplacementMicromapNV = 5409,
|
||||
CapabilityRayTracingOpacityMicromapEXT = 5381,
|
||||
CapabilityShaderInvocationReorderNV = 5383,
|
||||
CapabilityBindlessTextureNV = 5390,
|
||||
CapabilityRayQueryPositionFetchKHR = 5391,
|
||||
CapabilityAtomicFloat16VectorNV = 5404,
|
||||
CapabilityRayTracingDisplacementMicromapNV = 5409,
|
||||
CapabilitySubgroupShuffleINTEL = 5568,
|
||||
CapabilitySubgroupBufferBlockIOINTEL = 5569,
|
||||
CapabilitySubgroupImageBlockIOINTEL = 5570,
|
||||
|
|
@ -1698,6 +1700,10 @@ enum Op {
|
|||
OpImageBoxFilterQCOM = 4481,
|
||||
OpImageBlockMatchSSDQCOM = 4482,
|
||||
OpImageBlockMatchSADQCOM = 4483,
|
||||
OpImageBlockMatchWindowSSDQCOM = 4500,
|
||||
OpImageBlockMatchWindowSADQCOM = 4501,
|
||||
OpImageBlockMatchGatherSSDQCOM = 4502,
|
||||
OpImageBlockMatchGatherSADQCOM = 4503,
|
||||
OpGroupIAddNonUniformAMD = 5000,
|
||||
OpGroupFAddNonUniformAMD = 5001,
|
||||
OpGroupFMinNonUniformAMD = 5002,
|
||||
|
|
@ -2381,8 +2387,6 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
|||
case OpGroupNonUniformLogicalXor: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupNonUniformQuadBroadcast: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupNonUniformQuadSwap: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupNonUniformQuadAllKHR: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupNonUniformQuadAnyKHR: *hasResult = true; *hasResultType = true; break;
|
||||
case OpCopyLogical: *hasResult = true; *hasResultType = true; break;
|
||||
case OpPtrEqual: *hasResult = true; *hasResultType = true; break;
|
||||
case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break;
|
||||
|
|
@ -2425,6 +2429,10 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
|||
case OpImageBoxFilterQCOM: *hasResult = true; *hasResultType = true; break;
|
||||
case OpImageBlockMatchSSDQCOM: *hasResult = true; *hasResultType = true; break;
|
||||
case OpImageBlockMatchSADQCOM: *hasResult = true; *hasResultType = true; break;
|
||||
case OpImageBlockMatchWindowSSDQCOM: *hasResult = true; *hasResultType = true; break;
|
||||
case OpImageBlockMatchWindowSADQCOM: *hasResult = true; *hasResultType = true; break;
|
||||
case OpImageBlockMatchGatherSSDQCOM: *hasResult = true; *hasResultType = true; break;
|
||||
case OpImageBlockMatchGatherSADQCOM: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupIAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupFAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupFMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;
|
||||
|
|
@ -2436,6 +2444,8 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
|||
case OpFragmentMaskFetchAMD: *hasResult = true; *hasResultType = true; break;
|
||||
case OpFragmentFetchAMD: *hasResult = true; *hasResultType = true; break;
|
||||
case OpReadClockKHR: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupNonUniformQuadAllKHR: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupNonUniformQuadAnyKHR: *hasResult = true; *hasResultType = true; break;
|
||||
case OpHitObjectRecordHitMotionNV: *hasResult = false; *hasResultType = false; break;
|
||||
case OpHitObjectRecordHitWithIndexMotionNV: *hasResult = false; *hasResultType = false; break;
|
||||
case OpHitObjectRecordMissMotionNV: *hasResult = false; *hasResultType = false; break;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue