Skip to content

Commit

Permalink
Fix deferred pipeline compilation & naming on vulkan
Browse files Browse the repository at this point in the history
  • Loading branch information
baldurk committed Sep 4, 2024
1 parent 1402c5c commit bb6c6d8
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 139 deletions.
72 changes: 72 additions & 0 deletions renderdoc/driver/vulkan/vk_core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3284,6 +3284,78 @@ RDResult WrappedVulkan::ContextReplayLog(CaptureState readType, uint32_t startEv
if(m_DeferredResult != ResultCode::Succeeded)
return m_DeferredResult;

// apply names to objects now that deferred wrappers are resolved. Only use debug_utils - this
// is replay time only for the benefit of other tools (mostly self-capture) so we don't have to use debug marker.
if(ObjDisp(m_Device)->SetDebugUtilsObjectNameEXT)
{
for(auto it = m_CreationInfo.m_Names.begin(); it != m_CreationInfo.m_Names.end(); ++it)
{
VkDebugUtilsObjectNameInfoEXT name = {VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT};
name.pObjectName = it->second.c_str();
WrappedVkRes *res = GetResourceManager()->GetCurrentResource(it->first);

if(res)
{
if(IsDispatchableRes(res))
{
WrappedVkDispRes *disp = (WrappedVkDispRes *)res;
name.objectHandle = disp->real.handle;
}
else
{
WrappedVkNonDispRes *nondisp = (WrappedVkNonDispRes *)res;
name.objectHandle = nondisp->real.handle;
}

VkObjectType type = VK_OBJECT_TYPE_UNKNOWN;

switch(IdentifyTypeByPtr(res))
{
case eResUnknown: type = VK_OBJECT_TYPE_UNKNOWN; break;
case eResPhysicalDevice: type = VK_OBJECT_TYPE_PHYSICAL_DEVICE; break;
case eResInstance: type = VK_OBJECT_TYPE_INSTANCE; break;
case eResDevice: type = VK_OBJECT_TYPE_DEVICE; break;
case eResQueue: type = VK_OBJECT_TYPE_QUEUE; break;
case eResDeviceMemory: type = VK_OBJECT_TYPE_DEVICE_MEMORY; break;
case eResBuffer: type = VK_OBJECT_TYPE_BUFFER; break;
case eResBufferView: type = VK_OBJECT_TYPE_BUFFER_VIEW; break;
case eResImage: type = VK_OBJECT_TYPE_IMAGE; break;
case eResImageView: type = VK_OBJECT_TYPE_IMAGE_VIEW; break;
case eResFramebuffer: type = VK_OBJECT_TYPE_FRAMEBUFFER; break;
case eResRenderPass: type = VK_OBJECT_TYPE_RENDER_PASS; break;
case eResShaderModule: type = VK_OBJECT_TYPE_SHADER_MODULE; break;
case eResPipelineCache: type = VK_OBJECT_TYPE_PIPELINE_CACHE; break;
case eResPipelineLayout: type = VK_OBJECT_TYPE_PIPELINE_LAYOUT; break;
case eResPipeline: type = VK_OBJECT_TYPE_PIPELINE; break;
case eResSampler: type = VK_OBJECT_TYPE_SAMPLER; break;
case eResDescriptorPool: type = VK_OBJECT_TYPE_DESCRIPTOR_POOL; break;
case eResDescriptorSetLayout: type = VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT; break;
case eResDescriptorSet: type = VK_OBJECT_TYPE_DESCRIPTOR_SET; break;
case eResCommandPool: type = VK_OBJECT_TYPE_COMMAND_POOL; break;
case eResCommandBuffer: type = VK_OBJECT_TYPE_COMMAND_BUFFER; break;
case eResFence: type = VK_OBJECT_TYPE_FENCE; break;
case eResEvent: type = VK_OBJECT_TYPE_EVENT; break;
case eResQueryPool: type = VK_OBJECT_TYPE_QUERY_POOL; break;
case eResSemaphore: type = VK_OBJECT_TYPE_SEMAPHORE; break;
case eResSwapchain: type = VK_OBJECT_TYPE_SWAPCHAIN_KHR; break;
case eResSurface: type = VK_OBJECT_TYPE_SURFACE_KHR; break;
case eResDescUpdateTemplate: type = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE; break;
case eResSamplerConversion: type = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION; break;
case eResAccelerationStructureKHR:
type = VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR;
break;
case eResShaderEXT: type = VK_OBJECT_TYPE_SHADER_EXT; break;
}

if(type != VK_OBJECT_TYPE_UNKNOWN && type != VK_OBJECT_TYPE_PHYSICAL_DEVICE)
{
name.objectType = type;
ObjDisp(m_Device)->SetDebugUtilsObjectNameEXT(Unwrap(m_Device), &name);
}
}
}
}

SetDebugMessageSink(sink);
}

Expand Down
136 changes: 0 additions & 136 deletions renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2235,79 +2235,6 @@ bool WrappedVulkan::Serialise_vkDebugMarkerSetObjectNameEXT(
else
m_CreationInfo.m_Names[GetResourceManager()->GetLiveID(Object)] = ObjectName;

VkDebugMarkerObjectNameInfoEXT name = {VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT};
name.pObjectName = ObjectName;
WrappedVkRes *res = GetResourceManager()->GetLiveResource(Object);

if(res)
{
if(IsDispatchableRes(res))
{
WrappedVkDispRes *disp = (WrappedVkDispRes *)res;
name.object = disp->real.handle;
}
else
{
WrappedVkNonDispRes *nondisp = (WrappedVkNonDispRes *)res;
name.object = nondisp->real.handle;
}

VkDebugReportObjectTypeEXT type = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;

switch(IdentifyTypeByPtr(res))
{
case eResUnknown: type = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT; break;
case eResPhysicalDevice: type = VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT; break;
case eResInstance: type = VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT; break;
case eResDevice: type = VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT; break;
case eResQueue: type = VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT; break;
case eResDeviceMemory: type = VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT; break;
case eResBuffer: type = VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT; break;
case eResBufferView: type = VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT; break;
case eResImage: type = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT; break;
case eResImageView: type = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT; break;
case eResFramebuffer: type = VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT; break;
case eResRenderPass: type = VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT; break;
case eResShaderModule: type = VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT; break;
case eResPipelineCache: type = VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT; break;
case eResPipelineLayout: type = VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT; break;
case eResPipeline: type = VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT; break;
case eResSampler: type = VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT; break;
case eResDescriptorPool: type = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT; break;
case eResDescriptorSetLayout:
type = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT;
break;
case eResDescriptorSet: type = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT; break;
case eResCommandPool: type = VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT; break;
case eResCommandBuffer: type = VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT; break;
case eResFence: type = VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT; break;
case eResEvent: type = VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT; break;
case eResQueryPool: type = VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT; break;
case eResSemaphore: type = VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT; break;
case eResSwapchain: type = VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT; break;
case eResSurface: type = VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT; break;
case eResDescUpdateTemplate:
type = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT;
break;
case eResSamplerConversion:
type = VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT;
break;
case eResAccelerationStructureKHR:
type = VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR_EXT;
break;
case eResShaderEXT:
RDCWARN("There is no VkDebugReportObjectTypeEXT for VkShaderEXT");
break;
}

if(ObjDisp(m_Device)->DebugMarkerSetObjectNameEXT &&
type != VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT)
{
name.objectType = type;
ObjDisp(m_Device)->DebugMarkerSetObjectNameEXT(Unwrap(m_Device), &name);
}
}

ResourceDescription &descr = GetResourceDesc(Object);

AddResourceCurChunk(descr);
Expand Down Expand Up @@ -2436,69 +2363,6 @@ bool WrappedVulkan::Serialise_vkSetDebugUtilsObjectNameEXT(
else
m_CreationInfo.m_Names[GetResourceManager()->GetLiveID(Object)] = ObjectName;

VkDebugUtilsObjectNameInfoEXT name = {VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT};
name.pObjectName = ObjectName;
WrappedVkRes *res = GetResourceManager()->GetLiveResource(Object, true);

if(res)
{
if(IsDispatchableRes(res))
{
WrappedVkDispRes *disp = (WrappedVkDispRes *)res;
name.objectHandle = disp->real.handle;
}
else
{
WrappedVkNonDispRes *nondisp = (WrappedVkNonDispRes *)res;
name.objectHandle = nondisp->real.handle;
}

VkObjectType type = VK_OBJECT_TYPE_UNKNOWN;

switch(IdentifyTypeByPtr(res))
{
case eResUnknown: type = VK_OBJECT_TYPE_UNKNOWN; break;
case eResPhysicalDevice: type = VK_OBJECT_TYPE_PHYSICAL_DEVICE; break;
case eResInstance: type = VK_OBJECT_TYPE_INSTANCE; break;
case eResDevice: type = VK_OBJECT_TYPE_DEVICE; break;
case eResQueue: type = VK_OBJECT_TYPE_QUEUE; break;
case eResDeviceMemory: type = VK_OBJECT_TYPE_DEVICE_MEMORY; break;
case eResBuffer: type = VK_OBJECT_TYPE_BUFFER; break;
case eResBufferView: type = VK_OBJECT_TYPE_BUFFER_VIEW; break;
case eResImage: type = VK_OBJECT_TYPE_IMAGE; break;
case eResImageView: type = VK_OBJECT_TYPE_IMAGE_VIEW; break;
case eResFramebuffer: type = VK_OBJECT_TYPE_FRAMEBUFFER; break;
case eResRenderPass: type = VK_OBJECT_TYPE_RENDER_PASS; break;
case eResShaderModule: type = VK_OBJECT_TYPE_SHADER_MODULE; break;
case eResPipelineCache: type = VK_OBJECT_TYPE_PIPELINE_CACHE; break;
case eResPipelineLayout: type = VK_OBJECT_TYPE_PIPELINE_LAYOUT; break;
case eResPipeline: type = VK_OBJECT_TYPE_PIPELINE; break;
case eResSampler: type = VK_OBJECT_TYPE_SAMPLER; break;
case eResDescriptorPool: type = VK_OBJECT_TYPE_DESCRIPTOR_POOL; break;
case eResDescriptorSetLayout: type = VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT; break;
case eResDescriptorSet: type = VK_OBJECT_TYPE_DESCRIPTOR_SET; break;
case eResCommandPool: type = VK_OBJECT_TYPE_COMMAND_POOL; break;
case eResCommandBuffer: type = VK_OBJECT_TYPE_COMMAND_BUFFER; break;
case eResFence: type = VK_OBJECT_TYPE_FENCE; break;
case eResEvent: type = VK_OBJECT_TYPE_EVENT; break;
case eResQueryPool: type = VK_OBJECT_TYPE_QUERY_POOL; break;
case eResSemaphore: type = VK_OBJECT_TYPE_SEMAPHORE; break;
case eResSwapchain: type = VK_OBJECT_TYPE_SWAPCHAIN_KHR; break;
case eResSurface: type = VK_OBJECT_TYPE_SURFACE_KHR; break;
case eResDescUpdateTemplate: type = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE; break;
case eResSamplerConversion: type = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION; break;
case eResAccelerationStructureKHR: type = VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR; break;
case eResShaderEXT: type = VK_OBJECT_TYPE_SHADER_EXT; break;
}

if(ObjDisp(m_Device)->SetDebugUtilsObjectNameEXT && type != VK_OBJECT_TYPE_UNKNOWN &&
type != VK_OBJECT_TYPE_PHYSICAL_DEVICE)
{
name.objectType = type;
ObjDisp(m_Device)->SetDebugUtilsObjectNameEXT(Unwrap(m_Device), &name);
}
}

ResourceDescription &descr = GetResourceDesc(Object);

AddResourceCurChunk(descr);
Expand Down
11 changes: 8 additions & 3 deletions renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -891,12 +891,13 @@ bool WrappedVulkan::Serialise_vkCreateGraphicsPipelines(
DeferredPipelineCompile(device, deferredPipe.first, GetWrapped(deferredPipe.second));

if(res != ResultCode::Succeeded)
{
m_FailedReplayResult = res;
Deserialise(OrigCreateInfo);
return false;
}
}

if(m_FailedReplayResult != ResultCode::Succeeded)
return false;

Deserialise(OrigCreateInfo);
}
else
Expand Down Expand Up @@ -1102,6 +1103,8 @@ bool WrappedVulkan::Serialise_vkCreateComputePipelines(SerialiserType &ser, VkDe
VkComputePipelineCreateInfo OrigCreateInfo = CreateInfo;
CreateInfo = {};

pipe = GetResourceManager()->CreateDeferredHandle<VkPipeline>();

AddResource(Pipeline, ResourceType::PipelineState, "Compute Pipeline");

ResourceId live = GetResourceManager()->WrapResource(Unwrap(device), pipe);
Expand Down Expand Up @@ -1375,6 +1378,8 @@ bool WrappedVulkan::Serialise_vkCreateRayTracingPipelinesKHR(
CreateInfo = {};
OrigReplayHandles->swap(captureReplayHandles);

pipe = GetResourceManager()->CreateDeferredHandle<VkPipeline>();

AddResource(Pipeline, ResourceType::PipelineState, "RT Pipeline");

ResourceId live = GetResourceManager()->WrapResource(Unwrap(device), pipe);
Expand Down

0 comments on commit bb6c6d8

Please sign in to comment.