Renamed namespace and functions for debug marker

This commit is contained in:
saschawillems 2016-05-27 19:42:32 +02:00
parent 321b5915cb
commit 5545a37441
2 changed files with 42 additions and 35 deletions

View file

@ -31,23 +31,24 @@
// Setup and functions for the VK_EXT_debug_marker_extension // 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 // 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 // Note that the extension will only be present if run from an offline debugging application
namespace DebugReportExt namespace DebugMarker
{ {
bool active = false; bool active = false;
PFN_vkDebugMarkerSetObjectTagEXT pfnDebugMarkerSetObjectTag = VK_NULL_HANDLE;
PFN_vkDebugMarkerSetObjectNameEXT pfnDebugMarkerSetObjectName = VK_NULL_HANDLE; PFN_vkDebugMarkerSetObjectNameEXT pfnDebugMarkerSetObjectName = VK_NULL_HANDLE;
PFN_vkCmdDebugMarkerBeginEXT pfnCmdDebugMarkerBegin = VK_NULL_HANDLE; PFN_vkCmdDebugMarkerBeginEXT pfnCmdDebugMarkerBegin = VK_NULL_HANDLE;
PFN_vkCmdDebugMarkerEndEXT pfnCmdDebugMarkerEnd = VK_NULL_HANDLE; PFN_vkCmdDebugMarkerEndEXT pfnCmdDebugMarkerEnd = VK_NULL_HANDLE;
PFN_vkCmdDebugMarkerInsertEXT pfnCmdDebugMarkerInsert = VK_NULL_HANDLE; PFN_vkCmdDebugMarkerInsertEXT pfnCmdDebugMarkerInsert = VK_NULL_HANDLE;
// Get fcuntion pointers for the debug report extensions from the device (avoids instance dispatch) // Get function pointers for the debug report extensions from the device
void setupDebugMarkers(VkDevice device) void setup(VkDevice device)
{ {
// Debug marker extension will be enabled by the base class on the device if // Debug marker extension will be enabled by the base class on the device if
// VK_EXT_debug_marker is present (see vulkanexamplebae.cpp) // VK_EXT_debug_marker is present (see vulkanexamplebae.cpp)
// If the extension is present, the "enableDebugMarkers" property will be set // If the extension is present, the "enableDebugMarkers" property will be set
// todo : not public yet!
// todo : assert(enableDebugMarkers) // todo : assert(enableDebugMarkers)
pfnDebugMarkerSetObjectTag = (PFN_vkDebugMarkerSetObjectTagEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectTagEXT");
pfnDebugMarkerSetObjectName = (PFN_vkDebugMarkerSetObjectNameEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT"); pfnDebugMarkerSetObjectName = (PFN_vkDebugMarkerSetObjectNameEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT");
pfnCmdDebugMarkerBegin = (PFN_vkCmdDebugMarkerBeginEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT"); pfnCmdDebugMarkerBegin = (PFN_vkCmdDebugMarkerBeginEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT");
pfnCmdDebugMarkerEnd = (PFN_vkCmdDebugMarkerEndEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT"); pfnCmdDebugMarkerEnd = (PFN_vkCmdDebugMarkerEndEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT");
@ -75,7 +76,7 @@ namespace DebugReportExt
} }
// Start a new debug marker region // 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) // Check for valid function (may not be present if not runnin in a debugging application)
if (pfnCmdDebugMarkerBegin) if (pfnCmdDebugMarkerBegin)
@ -89,7 +90,7 @@ namespace DebugReportExt
} }
// Insert a new debug marker into the command buffer // 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) // Check for valid function (may not be present if not runnin in a debugging application)
if (pfnCmdDebugMarkerInsert) if (pfnCmdDebugMarkerInsert)
@ -103,7 +104,7 @@ namespace DebugReportExt
} }
// End the current debug marker region // 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) // Check for valid function (may not be present if not runnin in a debugging application)
if (pfnCmdDebugMarkerEnd) if (pfnCmdDebugMarkerEnd)
@ -148,7 +149,7 @@ struct Scene {
for (auto mesh : meshes) for (auto mesh : meshes)
{ {
// Add debug marker for mesh name // 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); vkCmdDrawIndexed(cmdBuffer, mesh.indexCount, 1, mesh.indexStart, 0, 0);
} }
} }
@ -338,8 +339,8 @@ public:
VK_CHECK_RESULT(vkCreateImageView(device, &view, nullptr, &tex->view)); VK_CHECK_RESULT(vkCreateImageView(device, &view, nullptr, &tex->view));
// Name for debugging // Name for debugging
DebugReportExt::setObjectName(device, (uint64_t)tex->image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "Off-screen texture target image"); DebugMarker::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->sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, "Off-screen texture target sampler");
// Frame buffer // Frame buffer
offScreenFrameBuf.width = OFFSCREEN_DIM; offScreenFrameBuf.width = OFFSCREEN_DIM;
@ -444,8 +445,8 @@ public:
offScreenCmdBuffer = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, false); offScreenCmdBuffer = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, false);
// Name for debugging // Name for debugging
DebugReportExt::setObjectName(device, (uint64_t)offScreenFrameBuf.color.image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "Off-screen color framebuffer"); DebugMarker::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.depth.image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "Off-screen depth framebuffer");
} }
// Command buffer for rendering color only scene for glow // Command buffer for rendering color only scene for glow
@ -468,7 +469,7 @@ public:
VK_CHECK_RESULT(vkBeginCommandBuffer(offScreenCmdBuffer, &cmdBufInfo)); VK_CHECK_RESULT(vkBeginCommandBuffer(offScreenCmdBuffer, &cmdBufInfo));
// Start a new debug marker region // 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); VkViewport viewport = vkTools::initializers::viewport((float)offScreenFrameBuf.width, (float)offScreenFrameBuf.height, 0.0f, 1.0f);
vkCmdSetViewport(offScreenCmdBuffer, 0, 1, &viewport); vkCmdSetViewport(offScreenCmdBuffer, 0, 1, &viewport);
@ -556,7 +557,7 @@ public:
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
DebugReportExt::endDebugMarkerRegion(offScreenCmdBuffer); DebugMarker::endRegion(offScreenCmdBuffer);
VK_CHECK_RESULT(vkEndCommandBuffer(offScreenCmdBuffer)); VK_CHECK_RESULT(vkEndCommandBuffer(offScreenCmdBuffer));
} }
@ -724,11 +725,11 @@ public:
// Name the buffers for debugging // Name the buffers for debugging
// Scene // Scene
DebugReportExt::setObjectName(device, (uint64_t)scene.vertices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene vertex buffer"); DebugMarker::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.indices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene index buffer");
// Glow // Glow
DebugReportExt::setObjectName(device, (uint64_t)sceneGlow.vertices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Glow vertex buffer"); DebugMarker::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.indices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Glow index buffer");
} }
void reBuildCommandBuffers() void reBuildCommandBuffers()
@ -766,7 +767,7 @@ public:
VK_CHECK_RESULT(vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo)); VK_CHECK_RESULT(vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo));
// Start a new debug marker region // 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); vkCmdBeginRenderPass(drawCmdBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
@ -781,18 +782,18 @@ public:
// Solid rendering // Solid rendering
// Start a new debug marker region // 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); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.toonshading);
scene.draw(drawCmdBuffers[i]); scene.draw(drawCmdBuffers[i]);
DebugReportExt::endDebugMarkerRegion(drawCmdBuffers[i]); DebugMarker::endRegion(drawCmdBuffers[i]);
// Wireframe rendering // Wireframe rendering
if (wireframe) if (wireframe)
{ {
// Insert debug marker // 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; scissor.offset.x = width / 2;
vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor); vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor);
@ -800,7 +801,7 @@ public:
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.wireframe); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.wireframe);
scene.draw(drawCmdBuffers[i]); scene.draw(drawCmdBuffers[i]);
DebugReportExt::endDebugMarkerRegion(drawCmdBuffers[i]); DebugMarker::endRegion(drawCmdBuffers[i]);
scissor.offset.x = 0; scissor.offset.x = 0;
scissor.extent.width = width; scissor.extent.width = width;
@ -810,20 +811,20 @@ public:
// Post processing // Post processing
if (glow) 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); 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 // 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); vkCmdDraw(drawCmdBuffers[i], 4, 1, 0, 0);
DebugReportExt::endDebugMarkerRegion(drawCmdBuffers[i]); DebugMarker::endRegion(drawCmdBuffers[i]);
} }
vkCmdEndRenderPass(drawCmdBuffers[i]); vkCmdEndRenderPass(drawCmdBuffers[i]);
// End current debug marker region // End current debug marker region
DebugReportExt::endDebugMarkerRegion(drawCmdBuffers[i]); DebugMarker::endRegion(drawCmdBuffers[i]);
VK_CHECK_RESULT(vkEndCommandBuffer(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); shaderStages[1] = loadShader(getAssetPath() + "shaders/debugmarker/toon.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
// Name shader moduels for debugging // Name shader moduels for debugging
DebugReportExt::setObjectName(device, (uint64_t)shaderModules[0], VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, "Mesh rendering vertex shader"); DebugMarker::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[1], VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, "Mesh rendering fragment shader");
VkGraphicsPipelineCreateInfo pipelineCreateInfo = VkGraphicsPipelineCreateInfo pipelineCreateInfo =
vkTools::initializers::pipelineCreateInfo( vkTools::initializers::pipelineCreateInfo(
@ -1075,10 +1076,10 @@ public:
VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.postprocess)); VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.postprocess));
// Name pipelines for debugging // Name pipelines for debugging
DebugReportExt::setObjectName(device, (uint64_t)pipelines.toonshading, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, "Toon shading pipeline"); DebugMarker::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"); DebugMarker::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"); DebugMarker::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.postprocess, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, "Post processing pipeline");
} }
// Prepare and initialize uniform buffer containing shader uniforms // Prepare and initialize uniform buffer containing shader uniforms
@ -1095,7 +1096,7 @@ public:
&uniformData.vsScene.descriptor); &uniformData.vsScene.descriptor);
// Name uniform buffer for debugging // 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(); updateUniformBuffers();
} }
@ -1140,7 +1141,7 @@ public:
void prepare() void prepare()
{ {
VulkanExampleBase::prepare(); VulkanExampleBase::prepare();
DebugReportExt::setupDebugMarkers(device); DebugMarker::setup(device);
loadScene(); loadScene();
prepareOffscreen(); prepareOffscreen();
setupVertexDescriptions(); setupVertexDescriptions();
@ -1186,7 +1187,7 @@ public:
virtual void getOverlayText(VulkanTextOverlay *textOverlay) virtual void getOverlayText(VulkanTextOverlay *textOverlay)
{ {
if (DebugReportExt::active) if (DebugMarker::active)
{ {
textOverlay->addText("VK_EXT_debug_marker active", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); textOverlay->addText("VK_EXT_debug_marker active", 5.0f, 85.0f, VulkanTextOverlay::alignLeft);
} }

View file

@ -65,6 +65,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multisampling", "multisampl
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "textoverlay", "textoverlay\textoverlay.vcxproj", "{9462DD15-5A1D-460A-B502-C9250D98D7A3}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "textoverlay", "textoverlay\textoverlay.vcxproj", "{9462DD15-5A1D-460A-B502-C9250D98D7A3}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "debugmarker", "debugmarker\debugmarker.vcxproj", "{146FD6F8-5CB4-478E-A823-7350A0ACCF1D}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64 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}.Debug|x64.Build.0 = Debug|x64
{9462DD15-5A1D-460A-B502-C9250D98D7A3}.Release|x64.ActiveCfg = Release|x64 {9462DD15-5A1D-460A-B502-C9250D98D7A3}.Release|x64.ActiveCfg = Release|x64
{9462DD15-5A1D-460A-B502-C9250D98D7A3}.Release|x64.Build.0 = 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 EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE