vkd3d: Add detailed tracing for RTPSO creation.

So much state floating around ...

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2022-05-10 13:38:41 +02:00
parent 8a94c3ce0e
commit 7832eeb60d
1 changed files with 84 additions and 0 deletions

View File

@ -20,6 +20,8 @@
#include "vkd3d_private.h"
#include "vkd3d_string.h"
#define RT_TRACE TRACE
static inline struct d3d12_state_object *impl_from_ID3D12StateObjectProperties(ID3D12StateObjectProperties *iface)
{
return CONTAINING_RECORD(iface, struct d3d12_state_object, ID3D12StateObjectProperties_iface);
@ -465,6 +467,8 @@ static HRESULT d3d12_state_object_add_collection(
struct d3d12_state_object_pipeline_data *data,
const D3D12_EXPORT_DESC *exports, unsigned int num_exports)
{
VKD3D_UNUSED size_t i;
if (!vkd3d_array_reserve((void **)&data->collections, &data->collections_size,
data->collections_count + 1, sizeof(*data->collections)))
return E_OUTOFMEMORY;
@ -473,6 +477,17 @@ static HRESULT d3d12_state_object_add_collection(
data->associations_count + 3, sizeof(*data->associations)))
return E_OUTOFMEMORY;
RT_TRACE("EXISTING_COLLECTION:\n");
for (i = 0; i < collection->exports_count; i++)
{
if (collection->exports[i].plain_export)
RT_TRACE(" Plain export: %s\n", debugstr_w(collection->exports[i].plain_export));
if (collection->exports[i].mangled_export)
RT_TRACE(" Mangled export: %s\n", debugstr_w(collection->exports[i].mangled_export));
}
RT_TRACE(" Global Root Signature compat hash: %016"PRIx64".\n",
collection->global_root_signature->compatibility_hash);
/* If a PSO only declares collections, but no pipelines, just inherit various state.
* Also, validates later that we have a match across different PSOs if we end up with mismatches. */
data->associations[data->associations_count].kind = VKD3D_SHADER_SUBOBJECT_KIND_GLOBAL_ROOT_SIGNATURE;
@ -585,6 +600,8 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
FIXME("Object config flag #%x is not supported.\n", object->flags);
return E_INVALIDARG;
}
RT_TRACE("%p || STATE_OBJECT_CONFIG: #%x.\n", obj->pDesc, object_config->Flags);
break;
}
@ -612,6 +629,14 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
data->associations[data->associations_count].root_signature =
impl_from_ID3D12RootSignature(rs->pLocalRootSignature);
data->associations[data->associations_count].priority = association_priority;
RT_TRACE("%p || %s (compat hash %016"PRIx64") (prio %u).\n",
obj->pDesc,
obj->Type == D3D12_STATE_SUBOBJECT_TYPE_GLOBAL_ROOT_SIGNATURE ?
"GLOBAL_ROOT_SIGNATURE" : "LOCAL_ROOT_SIGNATURE",
data->associations[data->associations_count].root_signature->compatibility_hash,
association_priority);
data->associations_count++;
break;
}
@ -619,6 +644,11 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
case D3D12_STATE_SUBOBJECT_TYPE_DXIL_LIBRARY:
{
const D3D12_DXIL_LIBRARY_DESC *lib = obj->pDesc;
VKD3D_UNUSED size_t old_obj_count, old_count, j;
old_count = data->entry_points_count;
old_obj_count = data->subobjects_count;
if (vkd3d_shader_dxil_append_library_entry_points_and_subobjects(lib, data->dxil_libraries_count,
&data->entry_points, &data->entry_points_size,
&data->entry_points_count,
@ -631,6 +661,16 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
vkd3d_array_reserve((void**)&data->dxil_libraries, &data->dxil_libraries_size,
data->dxil_libraries_count + 1, sizeof(*data->dxil_libraries));
data->dxil_libraries[data->dxil_libraries_count++] = lib;
RT_TRACE("Adding DXIL library:\n");
for (j = old_count; j < data->entry_points_count; j++)
{
RT_TRACE(" Entry point: %s (stage #%x).\n",
data->entry_points[j].real_entry_point, data->entry_points[j].stage);
}
for (j = old_obj_count; j < data->subobjects_count; j++)
RT_TRACE(" RDAT subobject: %s (type #%x).\n", data->subobjects[j].name, data->subobjects[j].kind);
break;
}
@ -640,6 +680,12 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
vkd3d_array_reserve((void**)&data->hit_groups, &data->hit_groups_size,
data->hit_groups_count + 1, sizeof(*data->hit_groups));
data->hit_groups[data->hit_groups_count++] = group;
RT_TRACE("Adding HIT_GROUP:\n");
RT_TRACE(" Type: %s\n", group->Type == D3D12_HIT_GROUP_TYPE_TRIANGLES ? "Triangle" : "Procedural");
RT_TRACE(" Name: %s\n", debugstr_w(group->HitGroupExport));
RT_TRACE(" AnyHit: %s\n", debugstr_w(group->AnyHitShaderImport));
RT_TRACE(" ClosestHit: %s\n", debugstr_w(group->ClosestHitShaderImport));
RT_TRACE(" Intersection: %s\n", debugstr_w(group->IntersectionShaderImport));
break;
}
@ -655,6 +701,9 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
data->associations[data->associations_count].priority = association_priority;
data->associations[data->associations_count].shader_config = *config;
data->associations[data->associations_count].export = NULL;
RT_TRACE("%p || Adding SHADER_CONFIG: MaxPayloadSize = %u, MaxAttributeSize = %u\n",
obj->pDesc,
config->MaxPayloadSizeInBytes, config->MaxAttributeSizeInBytes);
data->associations_count++;
break;
}
@ -673,6 +722,7 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
pipeline_config->MaxTraceRecursionDepth;
data->associations[data->associations_count].pipeline_config.Flags = 0;
data->associations[data->associations_count].export = NULL;
RT_TRACE("%p || Adding PIPELINE_CONFIG: MaxRecursion = %u\n", obj->pDesc, pipeline_config->MaxTraceRecursionDepth);
data->associations_count++;
break;
}
@ -689,6 +739,9 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
data->associations[data->associations_count].priority = association_priority;
data->associations[data->associations_count].pipeline_config = *pipeline_config;
data->associations[data->associations_count].export = NULL;
RT_TRACE("%p || Adding PIPELINE_CONFIG1: MaxRecursion = %u, Flags = #%x\n",
obj->pDesc,
pipeline_config->MaxTraceRecursionDepth, pipeline_config->Flags);
data->associations_count++;
break;
}
@ -700,6 +753,8 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
const struct vkd3d_shader_library_subobject *subobject;
unsigned int root_signature_index = 0;
RT_TRACE("Adding DXIL_SUBOBJECT_TO_EXPORTS: %s\n", debugstr_w(association->SubobjectToAssociate));
for (i = 0; i < data->subobjects_count; i++)
{
if (vkd3d_export_strequal_mixed(association->SubobjectToAssociate, data->subobjects[i].name))
@ -771,6 +826,10 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
VKD3D_ASSOCIATION_PRIORITY_DXIL_SUBOBJECT_ASSIGNMENT_DEFAULT;
}
RT_TRACE(" Export: %s (prio %u)\n",
association->NumExports ? debugstr_w(association->pExports[i]) : "NULL",
data->associations[data->associations_count].priority);
data->associations_count++;
}
@ -786,6 +845,10 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
data->associations_count + num_associations,
sizeof(*data->associations));
RT_TRACE("SUBOBJECT_TO_EXPORTS: %p (type %u):\n",
association->pSubobjectToAssociate->pDesc,
association->pSubobjectToAssociate->Type);
switch (association->pSubobjectToAssociate->Type)
{
case D3D12_STATE_SUBOBJECT_TYPE_RAYTRACING_SHADER_CONFIG:
@ -803,6 +866,11 @@ static HRESULT d3d12_state_object_parse_subobject(struct d3d12_state_object *obj
data->associations[data->associations_count].priority = association->NumExports ?
VKD3D_ASSOCIATION_PRIORITY_EXPLICIT :
VKD3D_ASSOCIATION_PRIORITY_EXPLICIT_DEFAULT;
RT_TRACE(" Export: %s (priority %u):\n",
association->NumExports ? debugstr_w(association->pExports[i]) : "NULL",
data->associations[data->associations_count].priority);
data->associations_count++;
}
break;
@ -1566,6 +1634,9 @@ static HRESULT d3d12_state_object_compile_pipeline(struct d3d12_state_object *ob
ID3D12RootSignature_Release(&default_global_root_signature->ID3D12RootSignature_iface);
}
RT_TRACE("Selecting Global Root Signature compat hash %016"PRIx64".\n",
global_signature->compatibility_hash);
shader_interface_local_info.descriptor_size = VKD3D_RESOURCE_DESC_INCREMENT;
local_static_sampler_bindings = NULL;
@ -1577,12 +1648,16 @@ static HRESULT d3d12_state_object_compile_pipeline(struct d3d12_state_object *ob
{
entry = &data->entry_points[i];
RT_TRACE("Compiling entry point: %s (stage = #%x).\n", debugstr_w(entry->plain_entry_point), entry->stage);
local_signature = d3d12_state_object_pipeline_data_get_root_signature(
VKD3D_SHADER_SUBOBJECT_KIND_LOCAL_ROOT_SIGNATURE, data, entry);
local_bindings = NULL;
if (local_signature)
{
RT_TRACE(" Local root signature: %016"PRIx64".\n", local_signature->compatibility_hash);
shader_interface_local_info.local_root_parameters = local_signature->parameters;
shader_interface_local_info.local_root_parameter_count = local_signature->parameter_count;
shader_interface_local_info.shader_record_constant_buffers = local_signature->root_constants;
@ -1617,7 +1692,10 @@ static HRESULT d3d12_state_object_compile_pipeline(struct d3d12_state_object *ob
shader_interface_info.offset_buffer_binding = &local_signature->offset_buffer_binding;
}
else
{
RT_TRACE(" Local root signature: N/A\n");
memset(&shader_interface_local_info, 0, sizeof(shader_interface_local_info));
}
if (vkd3d_stage_is_global_group(entry->stage))
{
@ -1677,6 +1755,8 @@ static HRESULT d3d12_state_object_compile_pipeline(struct d3d12_state_object *ob
return E_OUTOFMEMORY;
}
RT_TRACE(" DXIL hash: %016"PRIx64".\n", spirv.meta.hash);
#ifdef VKD3D_ENABLE_BREADCRUMBS
vkd3d_array_reserve((void**)&object->breadcrumb_shaders, &object->breadcrumb_shaders_size,
object->breadcrumb_shaders_count + 1, sizeof(*object->breadcrumb_shaders));
@ -2065,7 +2145,11 @@ HRESULT d3d12_state_object_create(struct d3d12_device *device, const D3D12_STATE
if (!(object = vkd3d_calloc(1, sizeof(*object))))
return E_OUTOFMEMORY;
RT_TRACE("==== Create %s ====\n",
desc->Type == D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE ? "RTPSO" : "Collection");
hr = d3d12_state_object_init(object, device, desc, parent);
RT_TRACE("==== Done (hr = #%x) ====\n", hr);
if (FAILED(hr))
{
vkd3d_free(object);