From 4ee6962d043da1eb68dfac5ff98f164bf5fd0581 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 13 Oct 2023 01:48:07 +0800 Subject: [PATCH] added lot of debug output based VkDebugUtils --- CMSceneGraph | 2 +- example/common/VulkanAppFramework.h | 2 +- inc/hgl/graph/VKBuffer.h | 1 + inc/hgl/graph/VKDevice.h | 6 +-- inc/hgl/graph/VKTexture.h | 2 +- inc/hgl/graph/VKTextureCreateInfo.h | 2 +- src/SceneGraph/RenderAssignBuffer.cpp | 22 +++++--- src/SceneGraph/Vulkan/VKDevice.cpp | 22 +++++--- src/SceneGraph/Vulkan/VKDeviceCreater.cpp | 22 ++++++++ src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp | 7 +++ src/SceneGraph/Vulkan/VKDeviceSwapchain.cpp | 54 ++++++++++++++++++-- src/SceneGraph/Vulkan/VKPrimitive.cpp | 22 ++++++-- src/SceneGraph/Vulkan/VKRenderResource.cpp | 12 ++++- 13 files changed, 146 insertions(+), 30 deletions(-) diff --git a/CMSceneGraph b/CMSceneGraph index a2f5b2d3..dd6ffdeb 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit a2f5b2d3c65bf8136e3bd53b05164c4f72de23ac +Subproject commit dd6ffdebeceea0dfc03ee58314bedfae2fc17899 diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index b4292eb2..34429397 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -202,7 +202,7 @@ public: cmd_buf=hgl_zero_new(swap_chain_count); for(int32_t i=0;iCreateRenderCommandBuffer(); + cmd_buf[i]=device->CreateRenderCommandBuffer(device->GetPhysicalDevice()->GetDeviceName()+AnsiString(":RenderCmdBuffer_")+AnsiString::numberOf(i)); } } diff --git a/inc/hgl/graph/VKBuffer.h b/inc/hgl/graph/VKBuffer.h index f4ac8b6c..032f5d89 100644 --- a/inc/hgl/graph/VKBuffer.h +++ b/inc/hgl/graph/VKBuffer.h @@ -36,6 +36,7 @@ public: VkBuffer GetBuffer ()const{return buf.buffer;} DeviceMemory * GetMemory ()const{return buf.memory;} + VkDeviceMemory GetVkMemory ()const{return buf.memory->operator VkDeviceMemory();} const VkDescriptorBufferInfo * GetBufferInfo ()const{return &buf.info;} void * Map () {return buf.memory->Map();} diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index f6e1ca51..146928b9 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -47,7 +47,7 @@ private: private: - VkCommandBuffer CreateCommandBuffer(); + VkCommandBuffer CreateCommandBuffer(const AnsiString &); bool CreateSwapchainFBO(Swapchain *); @@ -212,8 +212,8 @@ public: //shader & material public: //Command Buffer 相关 - RenderCmdBuffer * CreateRenderCommandBuffer(); - TextureCmdBuffer *CreateTextureCommandBuffer(); + RenderCmdBuffer * CreateRenderCommandBuffer(const AnsiString &); + TextureCmdBuffer *CreateTextureCommandBuffer(const AnsiString &); public: diff --git a/inc/hgl/graph/VKTexture.h b/inc/hgl/graph/VKTexture.h index 7eec7f78..a322af3f 100644 --- a/inc/hgl/graph/VKTexture.h +++ b/inc/hgl/graph/VKTexture.h @@ -22,7 +22,7 @@ public: TextureData * GetData () {return data;} - VkDeviceMemory GetDeviceMemory () {return data?data->memory->operator VkDeviceMemory():VK_NULL_HANDLE;} + VkDeviceMemory GetDeviceMemory () {return data?(data->memory?data->memory->operator VkDeviceMemory():VK_NULL_HANDLE):VK_NULL_HANDLE;} VkImage GetImage () {return data?data->image:VK_NULL_HANDLE;} VkImageLayout GetImageLayout () {return data?data->image_layout:VK_IMAGE_LAYOUT_UNDEFINED;} VkImageView GetVulkanImageView () {return data?data->image_view->GetImageView():VK_NULL_HANDLE;} diff --git a/inc/hgl/graph/VKTextureCreateInfo.h b/inc/hgl/graph/VKTextureCreateInfo.h index d273aa64..8338e19d 100644 --- a/inc/hgl/graph/VKTextureCreateInfo.h +++ b/inc/hgl/graph/VKTextureCreateInfo.h @@ -292,7 +292,7 @@ struct SwapchainDepthTextureCreateInfo:public TextureCreateInfo struct TextureData { - DeviceMemory * memory; + DeviceMemory * memory; VkImage image; VkImageLayout image_layout; ImageView * image_view; diff --git a/src/SceneGraph/RenderAssignBuffer.cpp b/src/SceneGraph/RenderAssignBuffer.cpp index b55651d2..2d639733 100644 --- a/src/SceneGraph/RenderAssignBuffer.cpp +++ b/src/SceneGraph/RenderAssignBuffer.cpp @@ -70,22 +70,32 @@ void RenderAssignBuffer::Alloc(const uint nc,const uint mc) if(da->debug_maker) { - da->debug_maker->SetBuffer(ubo_l2w->GetBuffer(),"[debug maker] UBO:LocalToWorld"); + da->debug_maker->SetBuffer(ubo_l2w->GetBuffer(),"[debug maker] UBO:Buffer:LocalToWorld"); + da->debug_maker->SetDeviceMemory(ubo_l2w->GetVkMemory(),"[debug maker] UBO:Memory:LocalToWorld"); if(ubo_mi) - da->debug_maker->SetBuffer(ubo_mi->GetBuffer(),"[debug maker] UBO:MaterialInstance"); + { + da->debug_maker->SetBuffer(ubo_mi->GetBuffer(),"[debug maker] UBO:Buffer:MaterialInstance"); + da->debug_maker->SetDeviceMemory(ubo_mi->GetVkMemory(),"[debug maker] UBO:Memory:MaterialInstance"); + } - da->debug_maker->SetBuffer(vbo_assigns->GetBuffer(),"[debug maker] VBO:Assign"); + da->debug_maker->SetBuffer(vbo_assigns->GetBuffer(),"[debug maker] VBO:Buffer:Assign"); + da->debug_maker->SetDeviceMemory(vbo_assigns->GetVkMemory(),"[debug maker] VBO:Memory:Assign"); } if(da->debug_utils) { - da->debug_utils->SetBuffer(ubo_l2w->GetBuffer(),"[debug utils] UBO:LocalToWorld"); + da->debug_utils->SetBuffer(ubo_l2w->GetBuffer(),"[debug utils] UBO:Buffer:LocalToWorld"); + da->debug_utils->SetDeviceMemory(ubo_l2w->GetVkMemory(),"[debug utils] UBO:Memory:LocalToWorld"); if(ubo_mi) - da->debug_utils->SetBuffer(ubo_mi->GetBuffer(),"[debug utils] UBO:MaterialInstance"); + { + da->debug_utils->SetBuffer(ubo_mi->GetBuffer(),"[debug utils] UBO:Buffer:MaterialInstance"); + da->debug_utils->SetDeviceMemory(ubo_mi->GetVkMemory(),"[debug utils] UBO:Memory:MaterialInstance"); + } - da->debug_utils->SetBuffer(vbo_assigns->GetBuffer(),"[debug utils] VBO:Assign"); + da->debug_utils->SetBuffer(vbo_assigns->GetBuffer(),"[debug utils] VBO:Buffer:Assign"); + da->debug_utils->SetDeviceMemory(vbo_assigns->GetVkMemory(),"[debug utils] VBO:Memory:Assign"); } #endif//_DEBUG } diff --git a/src/SceneGraph/Vulkan/VKDevice.cpp b/src/SceneGraph/Vulkan/VKDevice.cpp index 1038ec72..1b9b0a7b 100644 --- a/src/SceneGraph/Vulkan/VKDevice.cpp +++ b/src/SceneGraph/Vulkan/VKDevice.cpp @@ -23,7 +23,7 @@ GPUDevice::GPUDevice(GPUDeviceAttribute *da) sc_rt=nullptr; Resize(attr->surface_caps.currentExtent); - texture_cmd_buf=CreateTextureCommandBuffer(); + texture_cmd_buf=CreateTextureCommandBuffer(attr->physical_device->GetDeviceName()+AnsiString(":TexCmdBuffer")); texture_queue=CreateQueue(); } @@ -50,7 +50,7 @@ bool GPUDevice::Resize(const VkExtent2D &extent) return(sc_rt); } -VkCommandBuffer GPUDevice::CreateCommandBuffer() +VkCommandBuffer GPUDevice::CreateCommandBuffer(const AnsiString &name) { if(!attr->cmd_pool) return(VK_NULL_HANDLE); @@ -68,21 +68,31 @@ VkCommandBuffer GPUDevice::CreateCommandBuffer() if(res!=VK_SUCCESS) return(VK_NULL_HANDLE); +#ifdef _DEBUG + + if(attr->debug_maker) + attr->debug_maker->SetCommandBuffer(cmd_buf,"[debug maker] "+name); + + if(attr->debug_utils) + attr->debug_utils->SetCommandBuffer(cmd_buf,"[debug utils] "+name); + +#endif//_DEBUG + return cmd_buf; } -RenderCmdBuffer *GPUDevice::CreateRenderCommandBuffer() +RenderCmdBuffer *GPUDevice::CreateRenderCommandBuffer(const AnsiString &name) { - VkCommandBuffer cb=CreateCommandBuffer(); + VkCommandBuffer cb=CreateCommandBuffer(name); if(cb==VK_NULL_HANDLE)return(nullptr); return(new RenderCmdBuffer(attr,cb)); } -TextureCmdBuffer *GPUDevice::CreateTextureCommandBuffer() +TextureCmdBuffer *GPUDevice::CreateTextureCommandBuffer(const AnsiString &name) { - VkCommandBuffer cb=CreateCommandBuffer(); + VkCommandBuffer cb=CreateCommandBuffer(name); if(cb==VK_NULL_HANDLE)return(nullptr); diff --git a/src/SceneGraph/Vulkan/VKDeviceCreater.cpp b/src/SceneGraph/Vulkan/VKDeviceCreater.cpp index 5236404e..51d96a8c 100644 --- a/src/SceneGraph/Vulkan/VKDeviceCreater.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceCreater.cpp @@ -321,6 +321,28 @@ GPUDevice *VulkanDeviceCreater::CreateRenderDevice() auto_delete.Discard(); //discard autodelete + #ifdef _DEBUG + if(device_attr->debug_maker) + { + device_attr->debug_maker->SetPhysicalDevice(*physical_device,"[debug maker] Physical Device:"+AnsiString(physical_device->GetDeviceName())); + device_attr->debug_maker->SetDevice(device_attr->device,"[debug maker] Device:"+AnsiString(physical_device->GetDeviceName())); + device_attr->debug_maker->SetSurfaceKHR(surface,"[debug maker] Surface"); + device_attr->debug_maker->SetCommandPool(device_attr->cmd_pool,"[debug maker] Main Command Pool"); + device_attr->debug_maker->SetDescriptorPool(device_attr->desc_pool,"[debug maker] Main Descriptor Pool"); + device_attr->debug_maker->SetPipelineCache(device_attr->pipeline_cache,"[debug maker] Main Pipeline Cache"); + } + + if(device_attr->debug_utils) + { + device_attr->debug_utils->SetPhysicalDevice(*physical_device,"[debug utils] Physical Device:"+AnsiString(physical_device->GetDeviceName())); + device_attr->debug_utils->SetDevice(device_attr->device,"[debug utils] Device:"+AnsiString(physical_device->GetDeviceName())); + device_attr->debug_utils->SetSurfaceKHR(surface,"[debug utils] Surface"); + device_attr->debug_utils->SetCommandPool(device_attr->cmd_pool,"[debug utils] Main Command Pool"); + device_attr->debug_utils->SetDescriptorPool(device_attr->desc_pool,"[debug utils] Main Descriptor Pool"); + device_attr->debug_utils->SetPipelineCache(device_attr->pipeline_cache,"[debug utils] Main Pipeline Cache"); + } + #endif//_DEBUG + return(new GPUDevice(device_attr)); } diff --git a/src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp b/src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp index 7df6b7e1..6a3749da 100644 --- a/src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceRenderPass.cpp @@ -11,6 +11,13 @@ void GPUDevice::InitRenderPassManage() SwapchainRenderbufferInfo rbi(attr->surface_format.format,attr->physical_device->GetDepthFormat()); device_render_pass=render_pass_manage->AcquireRenderPass(&rbi); + + #ifdef _DEBUG + if(attr->debug_maker) + attr->debug_maker->SetRenderPass(device_render_pass->GetVkRenderPass(),"[debug maker] MainDeviceRenderPass"); + if(attr->debug_utils) + attr->debug_utils->SetRenderPass(device_render_pass->GetVkRenderPass(),"[debug utils] MainDeviceRenderPass"); + #endif//_DEBUG } void GPUDevice::ClearRenderPassManage() diff --git a/src/SceneGraph/Vulkan/VKDeviceSwapchain.cpp b/src/SceneGraph/Vulkan/VKDeviceSwapchain.cpp index e0d0e920..a3d29f8e 100644 --- a/src/SceneGraph/Vulkan/VKDeviceSwapchain.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceSwapchain.cpp @@ -65,13 +65,23 @@ namespace result=vkCreateSwapchainKHR(dev_attr->device,&swapchain_ci,nullptr,&swap_chain); - if(result==VK_SUCCESS) - return(swap_chain); + if(result!=VK_SUCCESS) + { + //LOG_ERROR(OS_TEXT("vkCreateSwapchainKHR failed, result = ")+OSString(result)); + os_err<<"vkCreateSwapchainKHR failed, result="<debug_utils) + dev_attr->debug_utils->SetSwapchainKHR(swap_chain,"[debug utils] SwapChain"); + #endif//_DEBUG + + return(swap_chain); } }//namespace @@ -90,6 +100,21 @@ bool GPUDevice::CreateSwapchainFBO(Swapchain *swapchain) if(!swapchain->sc_depth) return(false); + #ifdef _DEBUG + if(attr->debug_maker) + { + attr->debug_maker->SetImage(swapchain->sc_depth->GetImage(),"[debug maker] SwapchainDepthImage"); + attr->debug_maker->SetDeviceMemory(swapchain->sc_depth->GetDeviceMemory(),"[debug maker] SwapchainDepthMemory"); + } + + if(attr->debug_utils) + { + attr->debug_utils->SetImage(swapchain->sc_depth->GetImage(),"[debug utils] SwapchainDepthImage"); + attr->debug_utils->SetImageView(swapchain->sc_depth->GetVulkanImageView(),"[debug utils] SwapchainDepthImageView"); + attr->debug_utils->SetDeviceMemory(swapchain->sc_depth->GetDeviceMemory(),"[debug utils] SwapchainDepthMemory"); + } + #endif//_DEBUG + swapchain->sc_color =hgl_zero_new(swapchain->color_count); swapchain->sc_fbo =hgl_zero_new(swapchain->color_count); @@ -103,6 +128,25 @@ bool GPUDevice::CreateSwapchainFBO(Swapchain *swapchain) swapchain->sc_fbo[i]=CreateFBO( device_render_pass, swapchain->sc_color[i]->GetImageView(), swapchain->sc_depth->GetImageView()); + + #ifdef _DEBUG + if(attr->debug_maker) + { + attr->debug_maker->SetImage(swapchain->sc_color[i]->GetImage(),"[debug maker] SwapchainColorImage_"+AnsiString::numberOf(i)); + attr->debug_maker->SetDeviceMemory(swapchain->sc_color[i]->GetDeviceMemory(),"[debug maker] SwapchainColorMemory_"+AnsiString::numberOf(i)); + + attr->debug_maker->SetFramebuffer(swapchain->sc_fbo[i]->GetFramebuffer(),"[debug maker] SwapchainFBO_"+AnsiString::numberOf(i)); + } + + if(attr->debug_utils) + { + attr->debug_utils->SetImage(swapchain->sc_color[i]->GetImage(),"[debug utils] SwapchainColorImage_"+AnsiString::numberOf(i)); + attr->debug_utils->SetImageView(swapchain->sc_color[i]->GetVulkanImageView(),"[debug utils] SwapchainColorImageView_"+AnsiString::numberOf(i)); + attr->debug_utils->SetDeviceMemory(swapchain->sc_color[i]->GetDeviceMemory(),"[debug utils] SwapchainColorMemory_"+AnsiString::numberOf(i)); + + attr->debug_utils->SetFramebuffer(swapchain->sc_fbo[i]->GetFramebuffer(),"[debug utils] SwapchainFBO_"+AnsiString::numberOf(i)); + } + #endif//_DEBUG } return(true); diff --git a/src/SceneGraph/Vulkan/VKPrimitive.cpp b/src/SceneGraph/Vulkan/VKPrimitive.cpp index c5d7abf1..6a5e9a8c 100644 --- a/src/SceneGraph/Vulkan/VKPrimitive.cpp +++ b/src/SceneGraph/Vulkan/VKPrimitive.cpp @@ -43,9 +43,16 @@ bool Primitive::Set(const AnsiString &name,VBO *vbo,VkDeviceSize offset) auto *da=device->GetDeviceAttribute(); if(da->debug_maker) - da->debug_maker->SetBuffer(vbo->GetBuffer(),"[debug maker] "+prim_name+":VBO:"+name); + { + da->debug_maker->SetBuffer(vbo->GetBuffer(),"[debug maker] "+prim_name+":VBO:Buffer:"+name); + da->debug_maker->SetDeviceMemory(vbo->GetVkMemory(),"[debug maker] "+prim_name+":VBO:Memory:"+name); + } + if(da->debug_utils) - da->debug_utils->SetBuffer(vbo->GetBuffer(),"[debug utils] "+prim_name+":VBO:"+name); + { + da->debug_utils->SetBuffer(vbo->GetBuffer(),"[debug utils] "+prim_name+":VBO:Buffer:"+name); + da->debug_utils->SetDeviceMemory(vbo->GetVkMemory(),"[debug utils] "+prim_name+":VBO:Memory:"+name); + } #endif//_DEBUG return(true); @@ -87,9 +94,16 @@ bool Primitive::Set(IndexBuffer *ib,VkDeviceSize offset) auto *da=device->GetDeviceAttribute(); if(da->debug_maker) - da->debug_maker->SetBuffer(ib->GetBuffer(),"[debug maker] "+prim_name+":IBO"); + { + da->debug_maker->SetBuffer(ib->GetBuffer(),"[debug maker] "+prim_name+":IBO:Buffer"); + da->debug_maker->SetDeviceMemory(ib->GetVkMemory(),"[debug maker] "+prim_name+":IBO:Memory"); + } + if(da->debug_utils) - da->debug_utils->SetBuffer(ib->GetBuffer(),"[debug utils] "+prim_name+":IBO"); + { + da->debug_utils->SetBuffer(ib->GetBuffer(),"[debug utils] "+prim_name+":IBO:Buffer"); + da->debug_utils->SetDeviceMemory(ib->GetVkMemory(),"[debug utils] "+prim_name+":IBO:Memory"); + } #endif//_DEBUG return(true); } diff --git a/src/SceneGraph/Vulkan/VKRenderResource.cpp b/src/SceneGraph/Vulkan/VKRenderResource.cpp index 2dee3bd1..eb1aca51 100644 --- a/src/SceneGraph/Vulkan/VKRenderResource.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResource.cpp @@ -174,9 +174,17 @@ Texture2DArray *RenderResource::CreateTexture2DArray(const AnsiString &name,cons GPUDeviceAttribute *da=device->GetDeviceAttribute(); if(da->debug_maker) - da->debug_maker->SetImage(ta->GetImage(),"[debug maker] Tex2DArray:"+name); + { + da->debug_maker->SetImage(ta->GetImage(),"[debug maker] Tex2DArrayImage:"+name); + da->debug_maker->SetDeviceMemory(ta->GetDeviceMemory(),"[debug maker] Tex2DArrayMemory:"+name); + } + if(da->debug_utils) - da->debug_utils->SetImage(ta->GetImage(),"[debug utils] Tex2DArray:"+name); + { + da->debug_utils->SetImage(ta->GetImage(),"[debug utils] Tex2DArrayImage:"+name); + da->debug_utils->SetImageView(ta->GetVulkanImageView(),"[debug utils] Tex2DArrayImageView:"+name); + da->debug_utils->SetDeviceMemory(ta->GetDeviceMemory(),"[debug utils] Tex2DArrayMemory:"+name); + } #endif//_DEBUG return ta;