From 876447f25404fe16e63bc9ff53bbdfb78e040d32 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Thu, 30 Jun 2022 12:19:25 +0200 Subject: [PATCH] vkd3d: Add more breadcrumb tracing around RTV/DSV/Indirect usage. Report resource cookies so that it's easier to track down aliasing issues. Signed-off-by: Hans-Kristian Arntzen --- libs/vkd3d/breadcrumbs.c | 20 ++++++++++++++++++++ libs/vkd3d/command.c | 22 ++++++++++++++++++++++ libs/vkd3d/vkd3d_private.h | 18 ++++++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/libs/vkd3d/breadcrumbs.c b/libs/vkd3d/breadcrumbs.c index 659743c8..ea02f495 100644 --- a/libs/vkd3d/breadcrumbs.c +++ b/libs/vkd3d/breadcrumbs.c @@ -82,6 +82,22 @@ static const char *vkd3d_breadcrumb_command_type_to_str(enum vkd3d_breadcrumb_co return "root_desc"; case VKD3D_BREADCRUMB_COMMAND_ROOT_CONST: return "root_const"; + case VKD3D_BREADCRUMB_COMMAND_BIND_RTV: + return "bind_rtv"; + case VKD3D_BREADCRUMB_COMMAND_BIND_DSV: + return "bind_dsv"; + case VKD3D_BREADCRUMB_COMMAND_COOKIE: + return "cookie"; + case VKD3D_BREADCRUMB_COMMAND_CLEAR_UAV_FLOAT: + return "clear_uav_float"; + case VKD3D_BREADCRUMB_COMMAND_CLEAR_UAV_UINT: + return "clear_uav_uint"; + case VKD3D_BREADCRUMB_COMMAND_CLEAR_UAV_FALLBACK: + return "clear_uav_fallback"; + case VKD3D_BREADCRUMB_COMMAND_CLEAR_RTV: + return "clear_rtv"; + case VKD3D_BREADCRUMB_COMMAND_CLEAR_DSV: + return "clear_dsv"; default: return "?"; @@ -306,6 +322,10 @@ static void vkd3d_breadcrumb_tracer_report_command_list( { ERR(" Set arg: %"PRIu64" (#%"PRIx64")\n", cmd->word_64bit, cmd->word_64bit); } + else if (cmd->type == VKD3D_BREADCRUMB_COMMAND_COOKIE) + { + ERR(" Set resource cookie: %"PRIu64"\n", cmd->word_64bit); + } else { ERR(" Command: %s\n", vkd3d_breadcrumb_command_type_to_str(cmd->type)); diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 671b86ca..f64f0495 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -8173,6 +8173,10 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(d3d12_comman rtv_desc = d3d12_rtv_desc_from_cpu_handle(render_target_descriptors[i]); } + VKD3D_BREADCRUMB_COOKIE(rtv_desc && rtv_desc->resource ? rtv_desc->resource->res.cookie : 0); + VKD3D_BREADCRUMB_AUX32(i); + VKD3D_BREADCRUMB_COMMAND_STATE(BIND_RTV); + if (!rtv_desc || !rtv_desc->resource) { WARN("RTV descriptor %u is not initialized.\n", i); @@ -8204,6 +8208,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(d3d12_comman { WARN("DSV descriptor is not initialized.\n"); } + + VKD3D_BREADCRUMB_COOKIE(rtv_desc && rtv_desc->resource ? rtv_desc->resource->res.cookie : 0); + VKD3D_BREADCRUMB_COMMAND_STATE(BIND_DSV); } if (d3d12_pipeline_state_is_graphics(list->state)) @@ -8301,6 +8308,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearDepthStencilView(d3d12_com d3d12_command_list_clear_attachment(list, dsv_desc->resource, dsv_desc->view, clear_aspects, &clear_value, rect_count, rects); + + VKD3D_BREADCRUMB_COOKIE(dsv_desc->resource->res.cookie); + VKD3D_BREADCRUMB_COMMAND(CLEAR_DSV); } static void STDMETHODCALLTYPE d3d12_command_list_ClearRenderTargetView(d3d12_command_list_iface *iface, @@ -8339,6 +8349,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearRenderTargetView(d3d12_com d3d12_command_list_clear_attachment(list, rtv_desc->resource, rtv_desc->view, VK_IMAGE_ASPECT_COLOR_BIT, &clear_value, rect_count, rects); + + VKD3D_BREADCRUMB_COOKIE(rtv_desc->resource->res.cookie); + VKD3D_BREADCRUMB_COMMAND(CLEAR_RTV); } struct vkd3d_clear_uav_info @@ -8931,6 +8944,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3 { d3d12_command_list_clear_uav_with_copy(list, &d, resource_impl, &args, &color, uint_format, rect_count, rects); + VKD3D_BREADCRUMB_COMMAND(CLEAR_UAV_FALLBACK); return; } } @@ -8968,6 +8982,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3 d3d12_command_allocator_add_view(list->allocator, inline_view); vkd3d_view_decref(inline_view, list->device); } + + VKD3D_BREADCRUMB_COMMAND(CLEAR_UAV_UINT); } static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewFloat(d3d12_command_list_iface *iface, @@ -8994,6 +9010,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewFloat(d color = vkd3d_fixup_clear_uav_swizzle(list->device, d.view->info.view->format->dxgi_format, color); d3d12_command_list_clear_uav(list, &d, resource_impl, &args, &color, rect_count, rects); + VKD3D_BREADCRUMB_COMMAND(CLEAR_UAV_FLOAT); } static void STDMETHODCALLTYPE d3d12_command_list_DiscardResource(d3d12_command_list_iface *iface, @@ -9879,6 +9896,11 @@ static void STDMETHODCALLTYPE d3d12_command_list_ExecuteIndirect(d3d12_command_l if (!max_command_count) return; + VKD3D_BREADCRUMB_COOKIE(arg_impl ? arg_impl->res.cookie : 0); + VKD3D_BREADCRUMB_AUX64(arg_buffer_offset); + VKD3D_BREADCRUMB_COOKIE(count_impl ? count_impl->res.cookie : 0); + VKD3D_BREADCRUMB_AUX64(count_buffer_offset); + if ((count_buffer || list->predicate_va) && !list->device->vk_info.KHR_draw_indirect_count) { FIXME("Count buffers not supported by Vulkan implementation.\n"); diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 442a2aa2..556cb22e 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -2572,6 +2572,14 @@ enum vkd3d_breadcrumb_command_type VKD3D_BREADCRUMB_COMMAND_IBO, VKD3D_BREADCRUMB_COMMAND_ROOT_DESC, VKD3D_BREADCRUMB_COMMAND_ROOT_CONST, + VKD3D_BREADCRUMB_COMMAND_BIND_RTV, + VKD3D_BREADCRUMB_COMMAND_BIND_DSV, + VKD3D_BREADCRUMB_COMMAND_COOKIE, + VKD3D_BREADCRUMB_COMMAND_CLEAR_UAV_FLOAT, + VKD3D_BREADCRUMB_COMMAND_CLEAR_UAV_UINT, + VKD3D_BREADCRUMB_COMMAND_CLEAR_UAV_FALLBACK, + VKD3D_BREADCRUMB_COMMAND_CLEAR_RTV, + VKD3D_BREADCRUMB_COMMAND_CLEAR_DSV, }; #ifdef VKD3D_ENABLE_BREADCRUMBS @@ -2682,6 +2690,15 @@ void vkd3d_breadcrumb_tracer_unregister_placed_resource(struct d3d12_heap *heap, } \ } while(0) +#define VKD3D_BREADCRUMB_COOKIE(v) do { \ + if (vkd3d_config_flags & VKD3D_CONFIG_FLAG_BREADCRUMBS) { \ + struct vkd3d_breadcrumb_command breadcrumb_cmd; \ + breadcrumb_cmd.type = VKD3D_BREADCRUMB_COMMAND_COOKIE; \ + breadcrumb_cmd.word_64bit = v; \ + vkd3d_breadcrumb_tracer_add_command(list, &breadcrumb_cmd); \ + } \ +} while(0) + /* Remember to kick debug ring as well. */ #define VKD3D_DEVICE_REPORT_BREADCRUMB_IF(device, cond) do { \ if ((vkd3d_config_flags & VKD3D_CONFIG_FLAG_BREADCRUMBS) && (cond)) { \ @@ -2694,6 +2711,7 @@ void vkd3d_breadcrumb_tracer_unregister_placed_resource(struct d3d12_heap *heap, #define VKD3D_BREADCRUMB_COMMAND_STATE(type) ((void)(VKD3D_BREADCRUMB_COMMAND_##type)) #define VKD3D_BREADCRUMB_AUX32(v) ((void)(v)) #define VKD3D_BREADCRUMB_AUX64(v) ((void)(v)) +#define VKD3D_BREADCRUMB_COOKIE(v) ((void)(v)) #define VKD3D_DEVICE_REPORT_BREADCRUMB_IF(device, cond) ((void)(device), (void)(cond)) #endif /* VKD3D_ENABLE_BREADCRUMBS */