/* * Geforce NV2A PGRAPH Vulkan Renderer * * Copyright (c) 2024 Matt Borgerson * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see . */ #include "renderer.h" #include "debug.h" #ifndef _WIN32 #include #endif #ifdef CONFIG_RENDERDOC #pragma GCC diagnostic ignored "-Wstrict-prototypes" #include "thirdparty/renderdoc_app.h" #endif int nv2a_vk_dgroup_indent = 0; void pgraph_vk_debug_init(void) { #ifdef CONFIG_RENDERDOC nv2a_dbg_renderdoc_init(); #endif } void pgraph_vk_debug_frame_terminator(void) { #ifdef CONFIG_RENDERDOC if (nv2a_dbg_renderdoc_available()) { RENDERDOC_API_1_6_0 *rdoc_api = nv2a_dbg_renderdoc_get_api(); PGRAPHVkState *r = g_nv2a->pgraph.vk_renderer_state; if (rdoc_api->IsTargetControlConnected()) { if (rdoc_api->IsFrameCapturing()) { rdoc_api->EndFrameCapture(RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(r->instance), 0); } if (renderdoc_capture_frames > 0) { rdoc_api->StartFrameCapture(RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(r->instance), 0); --renderdoc_capture_frames; } } } #endif } void pgraph_vk_insert_debug_marker(PGRAPHVkState *r, VkCommandBuffer cmd, float color[4], const char *format, ...) { if (!r->debug_utils_extension_enabled) { return; } char *buf = NULL; va_list args; va_start(args, format); int err = vasprintf(&buf, format, args); assert(err >= 0); va_end(args); VkDebugUtilsLabelEXT label_info = { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, .pLabelName = buf, }; memcpy(label_info.color, color, 4 * sizeof(float)); vkCmdInsertDebugUtilsLabelEXT(cmd, &label_info); free(buf); } void pgraph_vk_begin_debug_marker(PGRAPHVkState *r, VkCommandBuffer cmd, float color[4], const char *format, ...) { if (!r->debug_utils_extension_enabled) { return; } char *buf = NULL; va_list args; va_start(args, format); int err = vasprintf(&buf, format, args); assert(err >= 0); va_end(args); VkDebugUtilsLabelEXT label_info = { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, .pLabelName = buf, }; memcpy(label_info.color, color, 4 * sizeof(float)); vkCmdBeginDebugUtilsLabelEXT(cmd, &label_info); free(buf); r->debug_depth += 1; assert(r->debug_depth < 10 && "Missing pgraph_vk_debug_marker_end?"); } void pgraph_vk_end_debug_marker(PGRAPHVkState *r, VkCommandBuffer cmd) { if (!r->debug_utils_extension_enabled) { return; } vkCmdEndDebugUtilsLabelEXT(cmd); assert(r->debug_depth > 0); r->debug_depth -= 1; }