diff --git a/debugmarker/debugmarker.cpp b/debugmarker/debugmarker.cpp index 48ac4532..b886f432 100644 --- a/debugmarker/debugmarker.cpp +++ b/debugmarker/debugmarker.cpp @@ -31,23 +31,24 @@ // Setup and functions for the VK_EXT_debug_marker_extension // Extension spec can be found at https://github.com/KhronosGroup/Vulkan-Docs/blob/1.0-VK_EXT_debug_marker/doc/specs/vulkan/appendices/VK_EXT_debug_marker.txt // Note that the extension will only be present if run from an offline debugging application -namespace DebugReportExt +namespace DebugMarker { bool active = false; + PFN_vkDebugMarkerSetObjectTagEXT pfnDebugMarkerSetObjectTag = VK_NULL_HANDLE; PFN_vkDebugMarkerSetObjectNameEXT pfnDebugMarkerSetObjectName = VK_NULL_HANDLE; PFN_vkCmdDebugMarkerBeginEXT pfnCmdDebugMarkerBegin = VK_NULL_HANDLE; PFN_vkCmdDebugMarkerEndEXT pfnCmdDebugMarkerEnd = VK_NULL_HANDLE; PFN_vkCmdDebugMarkerInsertEXT pfnCmdDebugMarkerInsert = VK_NULL_HANDLE; - // Get fcuntion pointers for the debug report extensions from the device (avoids instance dispatch) - void setupDebugMarkers(VkDevice device) + // Get function pointers for the debug report extensions from the device + void setup(VkDevice device) { // Debug marker extension will be enabled by the base class on the device if // VK_EXT_debug_marker is present (see vulkanexamplebae.cpp) // If the extension is present, the "enableDebugMarkers" property will be set - // todo : not public yet! // todo : assert(enableDebugMarkers) + pfnDebugMarkerSetObjectTag = (PFN_vkDebugMarkerSetObjectTagEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectTagEXT"); pfnDebugMarkerSetObjectName = (PFN_vkDebugMarkerSetObjectNameEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT"); pfnCmdDebugMarkerBegin = (PFN_vkCmdDebugMarkerBeginEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT"); pfnCmdDebugMarkerEnd = (PFN_vkCmdDebugMarkerEndEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT"); @@ -75,7 +76,7 @@ namespace DebugReportExt } // Start a new debug marker region - void beginDebugMarkerRegion(VkCommandBuffer cmdbuffer, const char* pMarkerName, glm::vec4 color) + void beginRegion(VkCommandBuffer cmdbuffer, const char* pMarkerName, glm::vec4 color) { // Check for valid function (may not be present if not runnin in a debugging application) if (pfnCmdDebugMarkerBegin) @@ -89,7 +90,7 @@ namespace DebugReportExt } // Insert a new debug marker into the command buffer - void insertDebugMarker(VkCommandBuffer cmdbuffer, std::string markerName, glm::vec4 color) + void insert(VkCommandBuffer cmdbuffer, std::string markerName, glm::vec4 color) { // Check for valid function (may not be present if not runnin in a debugging application) if (pfnCmdDebugMarkerInsert) @@ -103,7 +104,7 @@ namespace DebugReportExt } // End the current debug marker region - void endDebugMarkerRegion(VkCommandBuffer cmdBuffer) + void endRegion(VkCommandBuffer cmdBuffer) { // Check for valid function (may not be present if not runnin in a debugging application) if (pfnCmdDebugMarkerEnd) @@ -148,7 +149,7 @@ struct Scene { for (auto mesh : meshes) { // Add debug marker for mesh name - DebugReportExt::insertDebugMarker(cmdBuffer, "Draw \"" + mesh.name + "\"", glm::vec4(0.0f)); + DebugMarker::insert(cmdBuffer, "Draw \"" + mesh.name + "\"", glm::vec4(0.0f)); vkCmdDrawIndexed(cmdBuffer, mesh.indexCount, 1, mesh.indexStart, 0, 0); } } @@ -338,8 +339,8 @@ public: VK_CHECK_RESULT(vkCreateImageView(device, &view, nullptr, &tex->view)); // Name for debugging - DebugReportExt::setObjectName(device, (uint64_t)tex->image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "Off-screen texture target image"); - DebugReportExt::setObjectName(device, (uint64_t)tex->sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, "Off-screen texture target sampler"); + DebugMarker::setObjectName(device, (uint64_t)tex->image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "Off-screen texture target image"); + DebugMarker::setObjectName(device, (uint64_t)tex->sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, "Off-screen texture target sampler"); // Frame buffer offScreenFrameBuf.width = OFFSCREEN_DIM; @@ -444,8 +445,8 @@ public: offScreenCmdBuffer = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, false); // Name for debugging - DebugReportExt::setObjectName(device, (uint64_t)offScreenFrameBuf.color.image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "Off-screen color framebuffer"); - DebugReportExt::setObjectName(device, (uint64_t)offScreenFrameBuf.depth.image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "Off-screen depth framebuffer"); + DebugMarker::setObjectName(device, (uint64_t)offScreenFrameBuf.color.image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "Off-screen color framebuffer"); + DebugMarker::setObjectName(device, (uint64_t)offScreenFrameBuf.depth.image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "Off-screen depth framebuffer"); } // Command buffer for rendering color only scene for glow @@ -468,7 +469,7 @@ public: VK_CHECK_RESULT(vkBeginCommandBuffer(offScreenCmdBuffer, &cmdBufInfo)); // Start a new debug marker region - DebugReportExt::beginDebugMarkerRegion(offScreenCmdBuffer, "Off-screen scene rendering", glm::vec4(1.0f, 0.0f, 0.0f, 0.0f)); + DebugMarker::beginRegion(offScreenCmdBuffer, "Off-screen scene rendering", glm::vec4(1.0f, 0.0f, 0.0f, 0.0f)); VkViewport viewport = vkTools::initializers::viewport((float)offScreenFrameBuf.width, (float)offScreenFrameBuf.height, 0.0f, 1.0f); vkCmdSetViewport(offScreenCmdBuffer, 0, 1, &viewport); @@ -556,7 +557,7 @@ public: VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - DebugReportExt::endDebugMarkerRegion(offScreenCmdBuffer); + DebugMarker::endRegion(offScreenCmdBuffer); VK_CHECK_RESULT(vkEndCommandBuffer(offScreenCmdBuffer)); } @@ -724,11 +725,11 @@ public: // Name the buffers for debugging // Scene - DebugReportExt::setObjectName(device, (uint64_t)scene.vertices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene vertex buffer"); - DebugReportExt::setObjectName(device, (uint64_t)scene.indices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene index buffer"); + DebugMarker::setObjectName(device, (uint64_t)scene.vertices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene vertex buffer"); + DebugMarker::setObjectName(device, (uint64_t)scene.indices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene index buffer"); // Glow - DebugReportExt::setObjectName(device, (uint64_t)sceneGlow.vertices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Glow vertex buffer"); - DebugReportExt::setObjectName(device, (uint64_t)sceneGlow.indices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Glow index buffer"); + DebugMarker::setObjectName(device, (uint64_t)sceneGlow.vertices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Glow vertex buffer"); + DebugMarker::setObjectName(device, (uint64_t)sceneGlow.indices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Glow index buffer"); } void reBuildCommandBuffers() @@ -766,7 +767,7 @@ public: VK_CHECK_RESULT(vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo)); // Start a new debug marker region - DebugReportExt::beginDebugMarkerRegion(drawCmdBuffers[i], "Render scene", glm::vec4(1.0f, 0.0f, 0.0f, 0.0f)); + DebugMarker::beginRegion(drawCmdBuffers[i], "Render scene", glm::vec4(1.0f, 0.0f, 0.0f, 0.0f)); vkCmdBeginRenderPass(drawCmdBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); @@ -781,18 +782,18 @@ public: // Solid rendering // Start a new debug marker region - DebugReportExt::beginDebugMarkerRegion(drawCmdBuffers[i], "Toon shading draw", glm::vec4(1.0f, 0.0f, 0.0f, 0.0f)); + DebugMarker::beginRegion(drawCmdBuffers[i], "Toon shading draw", glm::vec4(1.0f, 0.0f, 0.0f, 0.0f)); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.toonshading); scene.draw(drawCmdBuffers[i]); - DebugReportExt::endDebugMarkerRegion(drawCmdBuffers[i]); + DebugMarker::endRegion(drawCmdBuffers[i]); // Wireframe rendering if (wireframe) { // Insert debug marker - DebugReportExt::beginDebugMarkerRegion(drawCmdBuffers[i], "Wireframe draw", glm::vec4(1.0f, 0.0f, 0.0f, 0.0f)); + DebugMarker::beginRegion(drawCmdBuffers[i], "Wireframe draw", glm::vec4(1.0f, 0.0f, 0.0f, 0.0f)); scissor.offset.x = width / 2; vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor); @@ -800,7 +801,7 @@ public: vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.wireframe); scene.draw(drawCmdBuffers[i]); - DebugReportExt::endDebugMarkerRegion(drawCmdBuffers[i]); + DebugMarker::endRegion(drawCmdBuffers[i]); scissor.offset.x = 0; scissor.extent.width = width; @@ -810,20 +811,20 @@ public: // Post processing if (glow) { - DebugReportExt::beginDebugMarkerRegion(drawCmdBuffers[i], "Apply post processing", glm::vec4(1.0f, 0.0f, 0.0f, 0.0f)); + DebugMarker::beginRegion(drawCmdBuffers[i], "Apply post processing", glm::vec4(1.0f, 0.0f, 0.0f, 0.0f)); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.postprocess); // Full screen quad is generated by the vertex shaders, so we reuse four vertices (for four invocations) from current vertex buffer vkCmdDraw(drawCmdBuffers[i], 4, 1, 0, 0); - DebugReportExt::endDebugMarkerRegion(drawCmdBuffers[i]); + DebugMarker::endRegion(drawCmdBuffers[i]); } vkCmdEndRenderPass(drawCmdBuffers[i]); // End current debug marker region - DebugReportExt::endDebugMarkerRegion(drawCmdBuffers[i]); + DebugMarker::endRegion(drawCmdBuffers[i]); VK_CHECK_RESULT(vkEndCommandBuffer(drawCmdBuffers[i])); } @@ -1019,8 +1020,8 @@ public: shaderStages[1] = loadShader(getAssetPath() + "shaders/debugmarker/toon.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); // Name shader moduels for debugging - DebugReportExt::setObjectName(device, (uint64_t)shaderModules[0], VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, "Mesh rendering vertex shader"); - DebugReportExt::setObjectName(device, (uint64_t)shaderModules[1], VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, "Mesh rendering fragment shader"); + DebugMarker::setObjectName(device, (uint64_t)shaderModules[0], VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, "Mesh rendering vertex shader"); + DebugMarker::setObjectName(device, (uint64_t)shaderModules[1], VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, "Mesh rendering fragment shader"); VkGraphicsPipelineCreateInfo pipelineCreateInfo = vkTools::initializers::pipelineCreateInfo( @@ -1075,10 +1076,10 @@ public: VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.postprocess)); // Name pipelines for debugging - DebugReportExt::setObjectName(device, (uint64_t)pipelines.toonshading, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, "Toon shading pipeline"); - DebugReportExt::setObjectName(device, (uint64_t)pipelines.color, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, "Color only pipeline"); - DebugReportExt::setObjectName(device, (uint64_t)pipelines.wireframe, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, "Wireframe rendering pipeline"); - DebugReportExt::setObjectName(device, (uint64_t)pipelines.postprocess, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, "Post processing pipeline"); + DebugMarker::setObjectName(device, (uint64_t)pipelines.toonshading, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, "Toon shading pipeline"); + DebugMarker::setObjectName(device, (uint64_t)pipelines.color, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, "Color only pipeline"); + DebugMarker::setObjectName(device, (uint64_t)pipelines.wireframe, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, "Wireframe rendering pipeline"); + DebugMarker::setObjectName(device, (uint64_t)pipelines.postprocess, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, "Post processing pipeline"); } // Prepare and initialize uniform buffer containing shader uniforms @@ -1095,7 +1096,7 @@ public: &uniformData.vsScene.descriptor); // Name uniform buffer for debugging - DebugReportExt::setObjectName(device, (uint64_t)uniformData.vsScene.buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene uniform buffer block"); + DebugMarker::setObjectName(device, (uint64_t)uniformData.vsScene.buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene uniform buffer block"); updateUniformBuffers(); } @@ -1140,7 +1141,7 @@ public: void prepare() { VulkanExampleBase::prepare(); - DebugReportExt::setupDebugMarkers(device); + DebugMarker::setup(device); loadScene(); prepareOffscreen(); setupVertexDescriptions(); @@ -1186,7 +1187,7 @@ public: virtual void getOverlayText(VulkanTextOverlay *textOverlay) { - if (DebugReportExt::active) + if (DebugMarker::active) { textOverlay->addText("VK_EXT_debug_marker active", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); } diff --git a/vulkanExamples.sln b/vulkanExamples.sln index e85bbbe0..08457b1e 100644 --- a/vulkanExamples.sln +++ b/vulkanExamples.sln @@ -65,6 +65,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multisampling", "multisampl EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "textoverlay", "textoverlay\textoverlay.vcxproj", "{9462DD15-5A1D-460A-B502-C9250D98D7A3}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "debugmarker", "debugmarker\debugmarker.vcxproj", "{146FD6F8-5CB4-478E-A823-7350A0ACCF1D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -195,6 +197,10 @@ Global {9462DD15-5A1D-460A-B502-C9250D98D7A3}.Debug|x64.Build.0 = Debug|x64 {9462DD15-5A1D-460A-B502-C9250D98D7A3}.Release|x64.ActiveCfg = Release|x64 {9462DD15-5A1D-460A-B502-C9250D98D7A3}.Release|x64.Build.0 = Release|x64 + {146FD6F8-5CB4-478E-A823-7350A0ACCF1D}.Debug|x64.ActiveCfg = Debug|x64 + {146FD6F8-5CB4-478E-A823-7350A0ACCF1D}.Debug|x64.Build.0 = Debug|x64 + {146FD6F8-5CB4-478E-A823-7350A0ACCF1D}.Release|x64.ActiveCfg = Release|x64 + {146FD6F8-5CB4-478E-A823-7350A0ACCF1D}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE