diff --git a/include/shady/grammar.json b/include/shady/grammar.json index 470df9fd..55a0429d 100644 --- a/include/shady/grammar.json +++ b/include/shady/grammar.json @@ -718,6 +718,15 @@ { "name": "values", "class": "value", "list": true } ] }, + { + "name": "DebugMarker", + "class": "annotation", + "type": false, + "ops": [ + { "name": "name", "class": "string" }, + { "name": "marker", "class": "value" } + ] + }, { "name": "BasicBlock", "recursive": true, diff --git a/src/backend/spirv/emit_spv.c b/src/backend/spirv/emit_spv.c index e3de0279..6d308c73 100644 --- a/src/backend/spirv/emit_spv.c +++ b/src/backend/spirv/emit_spv.c @@ -197,6 +197,13 @@ SpvId spv_emit_decl(Emitter* emitter, const Node* decl) { size_t loc = shd_get_int_literal_value(*shd_resolve_to_int_literal(shd_get_annotation_value(a)), false); assert(loc >= 0); spvb_decorate(emitter->file_builder, given_id, SpvDecorationBinding, 1, (uint32_t[]) { loc }); + } else if (a->tag == DebugMarker_TAG) { + String debug_marker = shd_get_string_literal(emitter->arena, a->payload.debug_marker.marker); + assert(debug_marker); + spvb_name(emitter->file_builder, given_id, shd_fmt_string_irarena(emitter->arena, "DEBUG_%s", debug_marker)); + String debugged_node_name = shd_get_node_name_safe(a); + shd_log_fmt(DEBUGVV, "Emitting debug marker '%s' for SPIR-V ID '%d' for node '%s'\n", debug_marker, + given_id, debugged_node_name); } } diff --git a/src/frontend/llvm/l2s_annotations.c b/src/frontend/llvm/l2s_annotations.c index bec710af..b224d0f6 100644 --- a/src/frontend/llvm/l2s_annotations.c +++ b/src/frontend/llvm/l2s_annotations.c @@ -150,6 +150,20 @@ void l2s_process_llvm_annotations(Parser* p, LLVMValueRef global) { .value = shd_int32_literal(a, as) }) }); + } else if (strcmp(keyword, "debug_marker") == 0) { + char *marker_name = strtok(NULL, "::"); + if (marker_name) { + shd_log_fmt(DEBUGVV, "Adding DebugMarker '%s' to '%s' (type: %s)\n", marker_name, + shd_get_node_name_safe(target), + shd_get_node_tag_string(target->tag)); + + add_annotation(p, target, (ParsedAnnotation) { + .payload = debug_marker(a, (DebugMarker) { + .name = "DebugMarker", + .marker = string_lit_helper(a, marker_name), + }) + }); + } } else { shd_error_print("Unrecognised shady annotation '%s'\n", keyword); shd_error_die(); diff --git a/src/shady/print.c b/src/shady/print.c index d34b366a..377762d0 100644 --- a/src/shady/print.c +++ b/src/shady/print.c @@ -798,6 +798,16 @@ static void print_annotation(PrinterCtx* ctx, const Node* node) { print_args_list(ctx, annotation->values); break; } + case DebugMarker_TAG: { + const DebugMarker* debug_marker = &node->payload.debug_marker; + printf(ANNOTATION_COLOR); + printf("@%s", debug_marker->name); + printf(RESET); + printf("("); + print_node(debug_marker->marker); + printf(")"); + break; + } case NotAnAnnotation: SHADY_UNKNOWN_ENUM("annotation node, tag = %s", shd_get_node_tag_string(node->tag)); } } diff --git a/test/vcc/CMakeLists.txt b/test/vcc/CMakeLists.txt index 3be14df1..6077cec1 100644 --- a/test/vcc/CMakeLists.txt +++ b/test/vcc/CMakeLists.txt @@ -27,6 +27,7 @@ shady_unit_test(COMPILER vcc NAME vcc_simple_frag FILES simple.frag.c ARGS ${VCC shady_unit_test(COMPILER vcc NAME vcc_flat_decoration_frag FILES flat_decoration.frag.c ARGS ${VCC_TEST_ARGS} --entry-point main --execution-model Fragment VALSPV SPV_VAL_ARGS ${SHADY_SPV_VAL_VK_ARGS}) shady_unit_test(COMPILER vcc NAME vcc_checker_frag FILES checkerboard.frag.c ARGS ${VCC_TEST_ARGS} --entry-point main --execution-model Fragment VALSPV SPV_VAL_ARGS ${SHADY_SPV_VAL_VK_ARGS}) shady_unit_test(COMPILER vcc NAME vcc_textured_frag FILES textured.frag.c ARGS ${VCC_TEST_ARGS} --entry-point main --execution-model Fragment VALSPV SPV_VAL_ARGS ${SHADY_SPV_VAL_VK_ARGS}) +shady_unit_test(COMPILER vcc NAME vcc_debug_marker_frag FILES debug_marker.frag.c ARGS ${VCC_TEST_ARGS} --entry-point main --execution-model Fragment VALSPV SPV_VAL_ARGS ${SHADY_SPV_VAL_VK_ARGS}) shady_unit_test(COMPILER vcc NAME vcc_linkage FILES linkage.frag.c lib.c ARGS ${VCC_TEST_ARGS} --entry-point main --execution-model Fragment VALSPV SPV_VAL_ARGS ${SHADY_SPV_VAL_VK_ARGS}) shady_unit_test(COMPILER vcc NAME vcc_linkage_type FILES linkage2.frag.c lib2.c ARGS ${VCC_TEST_ARGS} --entry-point main --execution-model Fragment VALSPV SPV_VAL_ARGS ${SHADY_SPV_VAL_VK_ARGS}) diff --git a/test/vcc/debug_marker.frag.c b/test/vcc/debug_marker.frag.c new file mode 100644 index 00000000..e294ab4c --- /dev/null +++ b/test/vcc/debug_marker.frag.c @@ -0,0 +1,13 @@ +#include +#include + +descriptor_set(0) descriptor_binding(1) uniform_constant sampler2D texSampler; + +location(0) input native_vec3 fragColor; +debug_marker(albedo_texture) location(1) input native_vec2 fragTexCoord; + +location(0) output native_vec4 outColor; + +fragment_shader void main() { + outColor = texture2D(texSampler, fragTexCoord) * (native_vec4) { fragColor.x * 2.5f, fragColor.y * 2.5f, fragColor.z * 2.5f, 1.0f }; +} diff --git a/vcc/include/shady.h b/vcc/include/shady.h index e4c6a31d..8acbd49f 100644 --- a/vcc/include/shady.h +++ b/vcc/include/shady.h @@ -19,6 +19,8 @@ namespace vcc { #define descriptor_binding(i) __attribute__((annotate("shady::descriptor_binding::"#i))) #define local_size(x, y, z) __attribute__((annotate("shady::workgroup_size::"#x"::"#y"::"#z))) +#define debug_marker(name) __attribute__((annotate("shady::debug_marker::"#name))) + #define input __attribute__((annotate("shady::io::389"))) #define output __attribute__((annotate("shady::io::390"))) // maybe deprecate it ?