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 <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2022-06-30 12:19:25 +02:00
parent 2c42c0da93
commit 876447f254
3 changed files with 60 additions and 0 deletions

View File

@ -82,6 +82,22 @@ static const char *vkd3d_breadcrumb_command_type_to_str(enum vkd3d_breadcrumb_co
return "root_desc"; return "root_desc";
case VKD3D_BREADCRUMB_COMMAND_ROOT_CONST: case VKD3D_BREADCRUMB_COMMAND_ROOT_CONST:
return "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: default:
return "?"; 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); 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 else
{ {
ERR(" Command: %s\n", vkd3d_breadcrumb_command_type_to_str(cmd->type)); ERR(" Command: %s\n", vkd3d_breadcrumb_command_type_to_str(cmd->type));

View File

@ -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]); 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) if (!rtv_desc || !rtv_desc->resource)
{ {
WARN("RTV descriptor %u is not initialized.\n", i); 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"); 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)) 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, d3d12_command_list_clear_attachment(list, dsv_desc->resource, dsv_desc->view,
clear_aspects, &clear_value, rect_count, rects); 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, 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, d3d12_command_list_clear_attachment(list, rtv_desc->resource, rtv_desc->view,
VK_IMAGE_ASPECT_COLOR_BIT, &clear_value, rect_count, rects); 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 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, d3d12_command_list_clear_uav_with_copy(list, &d, resource_impl,
&args, &color, uint_format, rect_count, rects); &args, &color, uint_format, rect_count, rects);
VKD3D_BREADCRUMB_COMMAND(CLEAR_UAV_FALLBACK);
return; return;
} }
} }
@ -8968,6 +8982,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3
d3d12_command_allocator_add_view(list->allocator, inline_view); d3d12_command_allocator_add_view(list->allocator, inline_view);
vkd3d_view_decref(inline_view, list->device); 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, 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); 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); 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, 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) if (!max_command_count)
return; 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) if ((count_buffer || list->predicate_va) && !list->device->vk_info.KHR_draw_indirect_count)
{ {
FIXME("Count buffers not supported by Vulkan implementation.\n"); FIXME("Count buffers not supported by Vulkan implementation.\n");

View File

@ -2572,6 +2572,14 @@ enum vkd3d_breadcrumb_command_type
VKD3D_BREADCRUMB_COMMAND_IBO, VKD3D_BREADCRUMB_COMMAND_IBO,
VKD3D_BREADCRUMB_COMMAND_ROOT_DESC, VKD3D_BREADCRUMB_COMMAND_ROOT_DESC,
VKD3D_BREADCRUMB_COMMAND_ROOT_CONST, 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 #ifdef VKD3D_ENABLE_BREADCRUMBS
@ -2682,6 +2690,15 @@ void vkd3d_breadcrumb_tracer_unregister_placed_resource(struct d3d12_heap *heap,
} \ } \
} while(0) } 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. */ /* Remember to kick debug ring as well. */
#define VKD3D_DEVICE_REPORT_BREADCRUMB_IF(device, cond) do { \ #define VKD3D_DEVICE_REPORT_BREADCRUMB_IF(device, cond) do { \
if ((vkd3d_config_flags & VKD3D_CONFIG_FLAG_BREADCRUMBS) && (cond)) { \ 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_COMMAND_STATE(type) ((void)(VKD3D_BREADCRUMB_COMMAND_##type))
#define VKD3D_BREADCRUMB_AUX32(v) ((void)(v)) #define VKD3D_BREADCRUMB_AUX32(v) ((void)(v))
#define VKD3D_BREADCRUMB_AUX64(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)) #define VKD3D_DEVICE_REPORT_BREADCRUMB_IF(device, cond) ((void)(device), (void)(cond))
#endif /* VKD3D_ENABLE_BREADCRUMBS */ #endif /* VKD3D_ENABLE_BREADCRUMBS */