From 3ac150d2730642e06b17f86401f1bc629f72cdb1 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 25 Aug 2023 16:29:43 +0100 Subject: [PATCH] Improve SPIR-V code generation * Prefer vendor-neutral extension aliases for enums over vendor-specific. * When disassembling opcodes with optional parameters, only include the parameters when present. --- .../driver/shaders/spirv/gen_spirv_code.py | 38 +- renderdoc/driver/shaders/spirv/spirv_gen.cpp | 3535 ++++++++++++++--- 2 files changed, 3013 insertions(+), 560 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/gen_spirv_code.py b/renderdoc/driver/shaders/spirv/gen_spirv_code.py index 450a008e5..456c803e5 100644 --- a/renderdoc/driver/shaders/spirv/gen_spirv_code.py +++ b/renderdoc/driver/shaders/spirv/gen_spirv_code.py @@ -314,6 +314,9 @@ for operand_kind in spirv['operand_kinds']: used = [] + official_suffixes = ['KHR', 'EXT'] + vendor_suffixes = ['AMD', 'NV', 'INTEL', 'ARM', 'QCOM', 'GOOGLE'] + for value in operand_kind['enumerants']: value_name = value['enumerant'] if value_name[0].isdigit(): @@ -323,6 +326,19 @@ for operand_kind in spirv['operand_kinds']: if value['value'] in used: continue + wait_for_official = False + for off in official_suffixes: + for vend in vendor_suffixes: + if value_name[-len(vend):] == vend: + off_name = value_name[:-len(vend)] + off + + for search in operand_kind['enumerants']: + if search['enumerant'] == off_name and search['value']: + wait_for_official = True + + if wait_for_official: + continue + used.append(value['value']) if value_name != value['enumerant']: @@ -959,7 +975,7 @@ for inst in spirv['instructions']: elif resultType == -1 and result > 0: disassemble += ' ret += idName(decoded.result) + " = ";\n' - disassemble += ' ret += "{}("'.format(inst['opname'][2:]) + disassemble += ' ret += rdcstr("{}("_lit)\n'.format(inst['opname'][2:]) disassemble_params = False @@ -1016,17 +1032,19 @@ for inst in spirv['instructions']: if i+1 != resultType and i+1 != result: if quantifier == '*': - disassemble += ' + ParamsToStr(idName, decoded.{})'.format(opName) + disassemble += ' + ParamsToStr(idName, decoded.{})\n'.format(opName) + elif quantifier == '?': + disassemble += ' + ({} < size ? ", " + ParamToStr(idName, decoded.{}) : "")\n'.format(all_size, opName) else: if opType == 'IdScope': - disassemble += ' + ToStr(Scope(constIntVal(decoded.{})))'.format(opName) + disassemble += ' + ToStr(Scope(constIntVal(decoded.{})))\n'.format(opName) elif opType == 'IdMemorySemantics': - disassemble += ' + ToStr(MemorySemantics(constIntVal(decoded.{})))'.format(opName) + disassemble += ' + ToStr(MemorySemantics(constIntVal(decoded.{})))\n'.format(opName) else: - disassemble += ' + ParamToStr(idName, decoded.{})'.format(opName) + disassemble += ' + ParamToStr(idName, decoded.{})\n'.format(opName) - if i+1 < len(operands): - disassemble += ' + ", "' + if i+1 < len(operands) and ('quantifier' not in operands[i+1] or operands[i+1]['quantifier'] != '?'): + disassemble += ' + ", "\n' disassemble_params = True @@ -1097,10 +1115,7 @@ for inst in spirv['instructions']: if params != '': params = params[0:-2] - if disassemble_params: - disassemble += ' + ")";\n' - else: - disassemble += ' ")";\n' + disassemble += ' + ")";\n' disassemble += ' break;\n' disassemble += ' }\n' @@ -1276,6 +1291,7 @@ void OpDecoder::ForEachID(const ConstIter &it, const std::function &declName, const std::function &idName, const std::function &constIntVal) {{ + size_t size = it.size(); rdcstr ret; switch(it.opcode()) {{ diff --git a/renderdoc/driver/shaders/spirv/spirv_gen.cpp b/renderdoc/driver/shaders/spirv/spirv_gen.cpp index 54f22dc36..2d282fca8 100644 --- a/renderdoc/driver/shaders/spirv/spirv_gen.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_gen.cpp @@ -285,14 +285,12 @@ rdcstr DoStringise(const rdcspv::ExecutionModel &el) STRINGISE_ENUM_CLASS(Fragment); STRINGISE_ENUM_CLASS(GLCompute); STRINGISE_ENUM_CLASS(Kernel); - STRINGISE_ENUM_CLASS(TaskNV); - STRINGISE_ENUM_CLASS(MeshNV); - STRINGISE_ENUM_CLASS(RayGenerationNV); - STRINGISE_ENUM_CLASS(IntersectionNV); - STRINGISE_ENUM_CLASS(AnyHitNV); - STRINGISE_ENUM_CLASS(ClosestHitNV); - STRINGISE_ENUM_CLASS(MissNV); - STRINGISE_ENUM_CLASS(CallableNV); + STRINGISE_ENUM_CLASS(RayGenerationKHR); + STRINGISE_ENUM_CLASS(IntersectionKHR); + STRINGISE_ENUM_CLASS(AnyHitKHR); + STRINGISE_ENUM_CLASS(ClosestHitKHR); + STRINGISE_ENUM_CLASS(MissKHR); + STRINGISE_ENUM_CLASS(CallableKHR); STRINGISE_ENUM_CLASS(TaskEXT); STRINGISE_ENUM_CLASS(MeshEXT); } @@ -386,11 +384,11 @@ rdcstr DoStringise(const rdcspv::ExecutionMode &el) STRINGISE_ENUM_CLASS(StencilRefUnchangedBackAMD); STRINGISE_ENUM_CLASS(StencilRefGreaterBackAMD); STRINGISE_ENUM_CLASS(StencilRefLessBackAMD); - STRINGISE_ENUM_CLASS(OutputLinesNV); - STRINGISE_ENUM_CLASS(OutputPrimitivesNV); + STRINGISE_ENUM_CLASS(OutputLinesEXT); + STRINGISE_ENUM_CLASS(OutputPrimitivesEXT); STRINGISE_ENUM_CLASS(DerivativeGroupQuadsNV); STRINGISE_ENUM_CLASS(DerivativeGroupLinearNV); - STRINGISE_ENUM_CLASS(OutputTrianglesNV); + STRINGISE_ENUM_CLASS(OutputTrianglesEXT); STRINGISE_ENUM_CLASS(PixelInterlockOrderedEXT); STRINGISE_ENUM_CLASS(PixelInterlockUnorderedEXT); STRINGISE_ENUM_CLASS(SampleInterlockOrderedEXT); @@ -433,12 +431,12 @@ rdcstr DoStringise(const rdcspv::StorageClass &el) STRINGISE_ENUM_CLASS(Image); STRINGISE_ENUM_CLASS(StorageBuffer); STRINGISE_ENUM_CLASS(TileImageEXT); - STRINGISE_ENUM_CLASS(CallableDataNV); - STRINGISE_ENUM_CLASS(IncomingCallableDataNV); - STRINGISE_ENUM_CLASS(RayPayloadNV); - STRINGISE_ENUM_CLASS(HitAttributeNV); - STRINGISE_ENUM_CLASS(IncomingRayPayloadNV); - STRINGISE_ENUM_CLASS(ShaderRecordBufferNV); + STRINGISE_ENUM_CLASS(CallableDataKHR); + STRINGISE_ENUM_CLASS(IncomingCallableDataKHR); + STRINGISE_ENUM_CLASS(RayPayloadKHR); + STRINGISE_ENUM_CLASS(HitAttributeKHR); + STRINGISE_ENUM_CLASS(IncomingRayPayloadKHR); + STRINGISE_ENUM_CLASS(ShaderRecordBufferKHR); STRINGISE_ENUM_CLASS(PhysicalStorageBuffer); STRINGISE_ENUM_CLASS(HitObjectAttributeNV); STRINGISE_ENUM_CLASS(TaskPayloadWorkgroupEXT); @@ -765,7 +763,7 @@ rdcstr DoStringise(const rdcspv::Decoration &el) STRINGISE_ENUM_CLASS(PassthroughNV); STRINGISE_ENUM_CLASS(ViewportRelativeNV); STRINGISE_ENUM_CLASS(SecondaryViewportRelativeNV); - STRINGISE_ENUM_CLASS(PerPrimitiveNV); + STRINGISE_ENUM_CLASS(PerPrimitiveEXT); STRINGISE_ENUM_CLASS(PerViewNV); STRINGISE_ENUM_CLASS(PerTaskNV); STRINGISE_ENUM_CLASS(PerVertexKHR); @@ -899,7 +897,6 @@ rdcstr DoStringise(const rdcspv::BuiltIn &el) STRINGISE_ENUM_CLASS(DeviceIndex); STRINGISE_ENUM_CLASS(ViewIndex); STRINGISE_ENUM_CLASS(ShadingRateKHR); - STRINGISE_ENUM_CLASS(BaryCoordNoPerspAMD); STRINGISE_ENUM_CLASS(BaryCoordNoPerspCentroidAMD); STRINGISE_ENUM_CLASS(BaryCoordNoPerspSampleAMD); STRINGISE_ENUM_CLASS(BaryCoordSmoothAMD); @@ -929,22 +926,22 @@ rdcstr DoStringise(const rdcspv::BuiltIn &el) STRINGISE_ENUM_CLASS(PrimitiveLineIndicesEXT); STRINGISE_ENUM_CLASS(PrimitiveTriangleIndicesEXT); STRINGISE_ENUM_CLASS(CullPrimitiveEXT); - STRINGISE_ENUM_CLASS(LaunchIdNV); - STRINGISE_ENUM_CLASS(LaunchSizeNV); - STRINGISE_ENUM_CLASS(WorldRayOriginNV); - STRINGISE_ENUM_CLASS(WorldRayDirectionNV); - STRINGISE_ENUM_CLASS(ObjectRayOriginNV); - STRINGISE_ENUM_CLASS(ObjectRayDirectionNV); - STRINGISE_ENUM_CLASS(RayTminNV); - STRINGISE_ENUM_CLASS(RayTmaxNV); - STRINGISE_ENUM_CLASS(InstanceCustomIndexNV); - STRINGISE_ENUM_CLASS(ObjectToWorldNV); - STRINGISE_ENUM_CLASS(WorldToObjectNV); + STRINGISE_ENUM_CLASS(LaunchIdKHR); + STRINGISE_ENUM_CLASS(LaunchSizeKHR); + STRINGISE_ENUM_CLASS(WorldRayOriginKHR); + STRINGISE_ENUM_CLASS(WorldRayDirectionKHR); + STRINGISE_ENUM_CLASS(ObjectRayOriginKHR); + STRINGISE_ENUM_CLASS(ObjectRayDirectionKHR); + STRINGISE_ENUM_CLASS(RayTminKHR); + STRINGISE_ENUM_CLASS(RayTmaxKHR); + STRINGISE_ENUM_CLASS(InstanceCustomIndexKHR); + STRINGISE_ENUM_CLASS(ObjectToWorldKHR); + STRINGISE_ENUM_CLASS(WorldToObjectKHR); STRINGISE_ENUM_CLASS(HitTNV); - STRINGISE_ENUM_CLASS(HitKindNV); + STRINGISE_ENUM_CLASS(HitKindKHR); STRINGISE_ENUM_CLASS(CurrentRayTimeNV); STRINGISE_ENUM_CLASS(HitTriangleVertexPositionsKHR); - STRINGISE_ENUM_CLASS(IncomingRayFlagsNV); + STRINGISE_ENUM_CLASS(IncomingRayFlagsKHR); STRINGISE_ENUM_CLASS(RayGeometryIndexKHR); STRINGISE_ENUM_CLASS(WarpsPerSMNV); STRINGISE_ENUM_CLASS(SMCountNV); @@ -1124,7 +1121,6 @@ rdcstr DoStringise(const rdcspv::Capability &el) STRINGISE_ENUM_CLASS(ShaderStereoViewNV); STRINGISE_ENUM_CLASS(PerViewAttributesNV); STRINGISE_ENUM_CLASS(FragmentFullyCoveredEXT); - STRINGISE_ENUM_CLASS(MeshShadingNV); STRINGISE_ENUM_CLASS(ImageFootprintNV); STRINGISE_ENUM_CLASS(MeshShadingEXT); STRINGISE_ENUM_CLASS(FragmentBarycentricKHR); @@ -1144,7 +1140,6 @@ rdcstr DoStringise(const rdcspv::Capability &el) STRINGISE_ENUM_CLASS(UniformTexelBufferArrayNonUniformIndexing); STRINGISE_ENUM_CLASS(StorageTexelBufferArrayNonUniformIndexing); STRINGISE_ENUM_CLASS(RayTracingPositionFetchKHR); - STRINGISE_ENUM_CLASS(RayTracingNV); STRINGISE_ENUM_CLASS(RayTracingMotionBlurNV); STRINGISE_ENUM_CLASS(VulkanMemoryModel); STRINGISE_ENUM_CLASS(VulkanMemoryModelDeviceScope); @@ -5080,76 +5075,111 @@ void OpDecoder::ForEachID(const ConstIter &it, const std::function &declName, const std::function &idName, const std::function &constIntVal) { + size_t size = it.size(); rdcstr ret; switch(it.opcode()) { case rdcspv::Op::Nop: { OpNop decoded(it); - ret += "Nop(" ")"; + ret += rdcstr("Nop("_lit) + + ")"; break; } case rdcspv::Op::Undef: { OpUndef decoded(it); ret += declName(decoded.resultType, decoded.result) + " = "; - ret += "Undef(" ")"; + ret += rdcstr("Undef("_lit) + + ")"; break; } case rdcspv::Op::SourceContinued: { OpSourceContinued decoded(it); - ret += "SourceContinued(" + ParamToStr(idName, decoded.continuedSource) + ")"; + ret += rdcstr("SourceContinued("_lit) + + ParamToStr(idName, decoded.continuedSource) + + ")"; break; } case rdcspv::Op::Source: { OpSource decoded(it); - ret += "Source(" + ParamToStr(idName, decoded.sourceLanguage) + ", " + ParamToStr(idName, decoded.version) + ", " + ParamToStr(idName, decoded.file) + ", " + ParamToStr(idName, decoded.source) + ")"; + ret += rdcstr("Source("_lit) + + ParamToStr(idName, decoded.sourceLanguage) + + ", " + + ParamToStr(idName, decoded.version) + + (3 < size ? ", " + ParamToStr(idName, decoded.file) : "") + + (4 < size ? ", " + ParamToStr(idName, decoded.source) : "") + + ")"; break; } case rdcspv::Op::SourceExtension: { OpSourceExtension decoded(it); - ret += "SourceExtension(" + ParamToStr(idName, decoded.extension) + ")"; + ret += rdcstr("SourceExtension("_lit) + + ParamToStr(idName, decoded.extension) + + ")"; break; } case rdcspv::Op::Name: { OpName decoded(it); - ret += "Name(" + ParamToStr(idName, decoded.target) + ", " + ParamToStr(idName, decoded.name) + ")"; + ret += rdcstr("Name("_lit) + + ParamToStr(idName, decoded.target) + + ", " + + ParamToStr(idName, decoded.name) + + ")"; break; } case rdcspv::Op::MemberName: { OpMemberName decoded(it); - ret += "MemberName(" + ParamToStr(idName, decoded.type) + ", " + ParamToStr(idName, decoded.member) + ", " + ParamToStr(idName, decoded.name) + ")"; + ret += rdcstr("MemberName("_lit) + + ParamToStr(idName, decoded.type) + + ", " + + ParamToStr(idName, decoded.member) + + ", " + + ParamToStr(idName, decoded.name) + + ")"; break; } case rdcspv::Op::String: { OpString decoded(it); ret += idName(decoded.result) + " = "; - ret += "String(" + ParamToStr(idName, decoded.string) + ")"; + ret += rdcstr("String("_lit) + + ParamToStr(idName, decoded.string) + + ")"; break; } case rdcspv::Op::Line: { OpLine decoded(it); - ret += "Line(" + ParamToStr(idName, decoded.file) + ", " + ParamToStr(idName, decoded.line) + ", " + ParamToStr(idName, decoded.column) + ")"; + ret += rdcstr("Line("_lit) + + ParamToStr(idName, decoded.file) + + ", " + + ParamToStr(idName, decoded.line) + + ", " + + ParamToStr(idName, decoded.column) + + ")"; break; } case rdcspv::Op::Extension: { OpExtension decoded(it); - ret += "Extension(" + ParamToStr(idName, decoded.name) + ")"; + ret += rdcstr("Extension("_lit) + + ParamToStr(idName, decoded.name) + + ")"; break; } case rdcspv::Op::ExtInstImport: { OpExtInstImport decoded(it); ret += idName(decoded.result) + " = "; - ret += "ExtInstImport(" + ParamToStr(idName, decoded.name) + ")"; + ret += rdcstr("ExtInstImport("_lit) + + ParamToStr(idName, decoded.name) + + ")"; break; } case rdcspv::Op::ExtInst: @@ -5162,185 +5192,267 @@ rdcstr OpDecoder::Disassemble(const ConstIter &it, const std::function