From b92a75db2aab1adffe08ae0103cafb080f9795e2 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Tue, 14 Feb 2023 16:21:07 -0500 Subject: Preliminary debugBreak support (#2647) * #include an absolute path didn't work - because paths were taken to always be relative. * Preliminary support for debug break. * Add C++ debug break support. Add details about usage. * Improve debug break test details. * Make HLSL output a comment about no support. * Handle specialize for target assert, without a body if it has spv_instruction/target intrinsic --- source/slang/hlsl.meta.slang | 19 +++++++++++++++++-- source/slang/slang-check-decl.cpp | 10 +++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 306e0dbb9..464811a96 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -5688,10 +5688,10 @@ Ref __hitObjectAttributes() // Next is the custom intrinsic that will compute the hitObjectAttributes location // for GLSL-based targets. // -__generic +__generic __target_intrinsic(__glslRayTracing, "$XH") [__readNone] -int __hitObjectAttributesLocation(__ref Payload payload); +int __hitObjectAttributesLocation(__ref Attributes attributes); /// Immutable data type representing a ray hit or a miss. Can be used to invoke hit or miss shading, /// or as a key in ReorderThread. Created by one of several methods described below. HitObject @@ -6471,3 +6471,18 @@ __target_intrinsic(hlsl, "NvReorderThread") __glsl_extension(GL_NV_shader_invocation_reorder) __target_intrinsic(glsl, "reorderThreadNV") void ReorderThread( HitObject HitOrMiss ); + + +/// +/// DebugBreak support +/// +/// There doesn't appear to be an equivalent for debugBreak for HLSL + +__target_intrinsic(hlsl, "/* debugBreak() not currently supported for HLSL */") +__target_intrinsic(cuda,"__brkpt()") +__target_intrinsic(cpp, "SLANG_BREAKPOINT(0)") +void debugBreak(); + +__specialized_for_target(glsl) +[[vk::spirv_instruction(1, "NonSemantic.DebugBreak")]] +void debugBreak(); diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 7e8e94d95..837dcb8eb 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -5372,7 +5372,15 @@ namespace Slang // If it's specialized for target it should have a body... if (auto funcDecl = as(decl)) { - SLANG_ASSERT(funcDecl->body); + // Normally if we have specialization for target it must have a body. + if (funcDecl->body == nullptr) + { + // If it doesn't have a body but does have a target intrinsic/SPIRVInstructionOp + // it's probably ok + + SLANG_ASSERT(funcDecl->findModifier() || + funcDecl->findModifier()); + } } Name* targetName = specializedModifier->targetToken.getName(); -- cgit v1.2.3