Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Highly experimental evil descriptor hoisting #1786

Closed
wants to merge 27 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
4662c78
frog: Begin sketching out descriptor hoisting idea.
HansKristian-Work Nov 17, 2023
d722e64
frog: Add metadata entries for hoisted descriptors.
HansKristian-Work Nov 20, 2023
2e28d92
Tear down hoist layouts.
HansKristian-Work Nov 20, 2023
6ca089e
Add helper to create augmented pipeline layout.
HansKristian-Work Nov 21, 2023
dad54a2
Create hoisted pipeline layout.
HansKristian-Work Nov 21, 2023
605fa6b
Hook up hoisting logic for DXIL.
HansKristian-Work Nov 21, 2023
f7415f2
Fix some hoisting bugs.
HansKristian-Work Nov 21, 2023
e217877
Bind scratch descriptor buffer.
HansKristian-Work Nov 21, 2023
0811541
fix alloc size.
HansKristian-Work Nov 21, 2023
f808982
Add separate bit for hoisted buffer descriptors.
HansKristian-Work Nov 22, 2023
7749b49
Build batch data structures.
HansKristian-Work Nov 22, 2023
3ceef75
Clean up copy batch lists.
HansKristian-Work Nov 22, 2023
2c98f66
Only invalidate buffer descriptors when heap is invalidated.
HansKristian-Work Nov 22, 2023
42837e2
Resolve hoist on CPU timeline.
HansKristian-Work Nov 22, 2023
d9dc4df
Add hoist flag.
HansKristian-Work Nov 22, 2023
d0d3622
Add layout to graphics as well.
HansKristian-Work Nov 22, 2023
ac1e40a
Handle unbound state more gracefully.
HansKristian-Work Nov 22, 2023
71394d2
Fix table index computation.
HansKristian-Work Nov 22, 2023
d82fd5a
Move heap info to a buffer.
HansKristian-Work Nov 22, 2023
aa046f6
Refactor the copy batch into an initial transition.
HansKristian-Work Nov 23, 2023
1d0905a
Add meta shader for copy descriptors.
HansKristian-Work Nov 23, 2023
10721f0
Add meta path for descriptor copy.
HansKristian-Work Nov 23, 2023
dcf9e20
Implement GPU side copy.
HansKristian-Work Nov 23, 2023
97255aa
Fix some warnings.
HansKristian-Work Nov 23, 2023
7dddd0f
Use default heap.
HansKristian-Work Nov 23, 2023
ca9accf
Add config flag for hoisting.
HansKristian-Work Nov 23, 2023
3c2afcd
Do initial transition on async queue when appropriate.
HansKristian-Work Nov 24, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions include/vkd3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ extern "C" {
#define VKD3D_CONFIG_FLAG_DISABLE_UAV_COMPRESSION (1ull << 43)
#define VKD3D_CONFIG_FLAG_DISABLE_DEPTH_COMPRESSION (1ull << 44)
#define VKD3D_CONFIG_FLAG_DISABLE_COLOR_COMPRESSION (1ull << 45)
#define VKD3D_CONFIG_FLAG_DESCRIPTOR_HOISTING (1ull << 46)

struct vkd3d_instance;

Expand Down
17 changes: 16 additions & 1 deletion include/vkd3d_shader.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,15 +77,28 @@ enum vkd3d_shader_meta_flags
VKD3D_SHADER_META_FLAG_FORCE_COMPUTE_BARRIER_AFTER_DISPATCH = 1 << 16,
};

/* Tweaked to make the meta struct a nice and round 64 bytes. */
#define VKD3D_MAX_HOISTED_DESCRIPTORS 15
#define VKD3D_MAX_HOISTED_DESCRIPTOR_CONSTANT_OFFSET (1 << 7)

struct vkd3d_shader_meta_hoisted_desc
{
uint16_t table_index : 6; /* API limit */
uint16_t constant_offset : 7; /* 128 offset from table should be more than enough ... */
uint16_t vk_descriptor_type : 3; /* The standard descriptor types we care about fit into 3 bits as-is. */
};

struct vkd3d_shader_meta
{
vkd3d_shader_hash_t hash;
unsigned int cs_workgroup_size[3]; /* Only contains valid data if uses_subgroup_size is true. */
unsigned int patch_vertex_count; /* Relevant for HS. May be 0, in which case the patch vertex count is not known. */
unsigned int cs_required_wave_size; /* If non-zero, force a specific CS subgroup size. */
uint32_t flags; /* vkd3d_shader_meta_flags */
struct vkd3d_shader_meta_hoisted_desc hoist_desc[VKD3D_MAX_HOISTED_DESCRIPTORS];
uint16_t num_hoisted_descriptors;
};
STATIC_ASSERT(sizeof(struct vkd3d_shader_meta) == 32);
STATIC_ASSERT(sizeof(struct vkd3d_shader_meta) == 64);

struct vkd3d_shader_code
{
Expand Down Expand Up @@ -220,6 +233,7 @@ enum vkd3d_shader_interface_flag
VKD3D_SHADER_INTERFACE_DESCRIPTOR_QA_BUFFER = 0x00000010u,
/* In this model, use descriptor_size_cbv_srv_uav as array stride for raw VA buffer. */
VKD3D_SHADER_INTERFACE_RAW_VA_ALIAS_DESCRIPTOR_BUFFER = 0x00000020u,
VKD3D_SHADER_INTERFACE_HOIST_DESCRIPTORS = 0x00000040u,
};

struct vkd3d_shader_stage_io_entry
Expand Down Expand Up @@ -278,6 +292,7 @@ struct vkd3d_shader_interface_info
/* Used for either VKD3D_SHADER_INTERFACE_RAW_VA_ALIAS_DESCRIPTOR_BUFFER or local root signatures. */
uint32_t descriptor_size_cbv_srv_uav;
uint32_t descriptor_size_sampler;
uint32_t hoist_descriptor_set_index;
};

struct vkd3d_shader_descriptor_table
Expand Down
80 changes: 74 additions & 6 deletions libs/vkd3d-shader/dxil.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ struct vkd3d_dxil_remap_userdata
const struct vkd3d_shader_interface_info *shader_interface_info;
const struct vkd3d_shader_interface_local_info *shader_interface_local_info;
unsigned int num_root_descriptors;
struct vkd3d_shader_meta *meta;
};

struct vkd3d_dxil_remap_info
Expand Down Expand Up @@ -253,6 +254,32 @@ static dxil_spv_bool dxil_remap(const struct vkd3d_dxil_remap_userdata *remap,
return DXIL_SPV_TRUE;
}

static void dxil_remap_check_hoist(
const struct vkd3d_shader_interface_info *shader_interface_info,
const struct vkd3d_dxil_remap_userdata *remap, const dxil_spv_d3d_binding *d3d_binding,
dxil_spv_vulkan_binding *vk_binding,
VkDescriptorType vk_descriptor_type)
{
struct vkd3d_shader_meta_hoisted_desc *hoisted;

if ((shader_interface_info->flags & VKD3D_SHADER_INTERFACE_HOIST_DESCRIPTORS) &&
vk_binding->bindless.use_heap == DXIL_SPV_TRUE &&
remap->meta->num_hoisted_descriptors < VKD3D_MAX_HOISTED_DESCRIPTORS &&
d3d_binding->range_size == 1 &&
vk_binding->bindless.heap_root_offset < VKD3D_MAX_HOISTED_DESCRIPTOR_CONSTANT_OFFSET)
{
hoisted = &remap->meta->hoist_desc[remap->meta->num_hoisted_descriptors];
hoisted->table_index = vk_binding->root_constant_index + remap->num_root_descriptors * 2 -
shader_interface_info->descriptor_tables.offset / sizeof(uint32_t);
hoisted->constant_offset = vk_binding->bindless.heap_root_offset;
hoisted->vk_descriptor_type = vk_descriptor_type;
vk_binding->bindless.use_heap = DXIL_SPV_FALSE;
vk_binding->set = shader_interface_info->hoist_descriptor_set_index;
vk_binding->binding = remap->meta->num_hoisted_descriptors;
remap->meta->num_hoisted_descriptors++;
}
}

static dxil_spv_bool dxil_srv_remap(void *userdata, const dxil_spv_d3d_binding *d3d_binding,
dxil_spv_srv_vulkan_binding *vk_binding)
{
Expand All @@ -275,6 +302,12 @@ static dxil_spv_bool dxil_srv_remap(void *userdata, const dxil_spv_d3d_binding *
vk_binding->offset_binding.set = shader_interface_info->offset_buffer_binding->set;
vk_binding->offset_binding.binding = shader_interface_info->offset_buffer_binding->binding;
}
else
{
dxil_remap_check_hoist(shader_interface_info, remap, d3d_binding, &vk_binding->buffer_binding,
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
}

return DXIL_SPV_TRUE;
}
else
Expand All @@ -287,16 +320,31 @@ static dxil_spv_bool dxil_srv_remap(void *userdata, const dxil_spv_d3d_binding *
}
}

return dxil_remap(remap, VKD3D_SHADER_DESCRIPTOR_TYPE_SRV,
d3d_binding, &vk_binding->buffer_binding, resource_flags);
if (!dxil_remap(remap, VKD3D_SHADER_DESCRIPTOR_TYPE_SRV,
d3d_binding, &vk_binding->buffer_binding, resource_flags))
return DXIL_SPV_FALSE;

if (!(shader_interface_info->flags & VKD3D_SHADER_INTERFACE_TYPED_OFFSET_BUFFER))
{
dxil_remap_check_hoist(shader_interface_info, remap, d3d_binding, &vk_binding->buffer_binding,
d3d_binding->kind == DXIL_SPV_RESOURCE_KIND_TYPED_BUFFER ?
VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE);
}

return DXIL_SPV_TRUE;
}

static dxil_spv_bool dxil_sampler_remap(void *userdata, const dxil_spv_d3d_binding *d3d_binding,
dxil_spv_vulkan_binding *vk_binding)
{
const struct vkd3d_dxil_remap_userdata *remap = userdata;
return dxil_remap(remap, VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER,
d3d_binding, vk_binding, VKD3D_SHADER_BINDING_FLAG_IMAGE);

if (!dxil_remap(remap, VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER,
d3d_binding, vk_binding, VKD3D_SHADER_BINDING_FLAG_IMAGE))
return DXIL_SPV_FALSE;

dxil_remap_check_hoist(remap->shader_interface_info, remap, d3d_binding, vk_binding, VK_DESCRIPTOR_TYPE_SAMPLER);
return DXIL_SPV_TRUE;
}

static dxil_spv_bool dxil_input_remap(void *userdata, const dxil_spv_d3d_vertex_input *d3d_input,
Expand Down Expand Up @@ -421,6 +469,12 @@ static dxil_spv_bool dxil_uav_remap(void *userdata, const dxil_spv_uav_d3d_bindi
vk_binding->offset_binding.set = shader_interface_info->offset_buffer_binding->set;
vk_binding->offset_binding.binding = shader_interface_info->offset_buffer_binding->binding;
}
else if (!d3d_binding->has_counter)
{
dxil_remap_check_hoist(shader_interface_info, remap,
&d3d_binding->d3d_binding, &vk_binding->buffer_binding,
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
}
}
else if (!dxil_remap(remap, VKD3D_SHADER_DESCRIPTOR_TYPE_UAV, &d3d_binding->d3d_binding,
&vk_binding->buffer_binding, resource_flags))
Expand Down Expand Up @@ -453,6 +507,13 @@ static dxil_spv_bool dxil_uav_remap(void *userdata, const dxil_spv_uav_d3d_bindi
vk_binding->offset_binding.set = shader_interface_info->offset_buffer_binding->set;
vk_binding->offset_binding.binding = shader_interface_info->offset_buffer_binding->binding;
}
else if (!d3d_binding->has_counter)
{
dxil_remap_check_hoist(shader_interface_info, remap,
&d3d_binding->d3d_binding, &vk_binding->buffer_binding,
d3d_binding->d3d_binding.kind == DXIL_SPV_RESOURCE_KIND_TYPED_BUFFER ?
VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_STORAGE_IMAGE);
}
}

if (d3d_binding->has_counter)
Expand Down Expand Up @@ -499,9 +560,14 @@ static dxil_spv_bool dxil_cbv_remap(void *userdata, const dxil_spv_d3d_binding *
}

vk_binding->push_constant = DXIL_SPV_FALSE;
return dxil_remap(remap, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV,
if (!dxil_remap(remap, VKD3D_SHADER_DESCRIPTOR_TYPE_CBV,
d3d_binding, &vk_binding->vulkan.uniform_binding,
VKD3D_SHADER_BINDING_FLAG_BUFFER);
VKD3D_SHADER_BINDING_FLAG_BUFFER))
return DXIL_SPV_FALSE;

dxil_remap_check_hoist(remap->shader_interface_info, remap, d3d_binding,
&vk_binding->vulkan.uniform_binding, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
return DXIL_SPV_TRUE;
}

static void vkd3d_dxil_log_callback(void *userdata, dxil_spv_log_level level, const char *msg)
Expand Down Expand Up @@ -1011,6 +1077,7 @@ int vkd3d_shader_compile_dxil(const struct vkd3d_shader_code *dxbc,
remap_userdata.shader_interface_info = shader_interface_info;
remap_userdata.shader_interface_local_info = NULL;
remap_userdata.num_root_descriptors = num_root_descriptors;
remap_userdata.meta = &spirv->meta;

dxil_spv_converter_set_root_constant_word_count(converter, root_constant_words);
dxil_spv_converter_set_root_descriptor_count(converter, num_root_descriptors);
Expand Down Expand Up @@ -1564,6 +1631,7 @@ int vkd3d_shader_compile_dxil_export(const struct vkd3d_shader_code *dxil,
remap_userdata.shader_interface_info = shader_interface_info;
remap_userdata.shader_interface_local_info = shader_interface_local_info;
remap_userdata.num_root_descriptors = num_root_descriptors;
remap_userdata.meta = &spirv->meta;

dxil_spv_converter_set_root_constant_word_count(converter, root_constant_words);
dxil_spv_converter_set_root_descriptor_count(converter, num_root_descriptors);
Expand Down
6 changes: 3 additions & 3 deletions libs/vkd3d/cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ VkResult vkd3d_create_pipeline_cache(struct d3d12_device *device,
return VK_CALL(vkCreatePipelineCache(device->vk_device, &info, NULL, cache));
}

#define VKD3D_CACHE_BLOB_VERSION MAKE_MAGIC('V','K','B',3)
#define VKD3D_CACHE_BLOB_VERSION MAKE_MAGIC('V','K','B',4)

enum vkd3d_pipeline_blob_chunk_type
{
Expand Down Expand Up @@ -1314,8 +1314,8 @@ struct vkd3d_serialized_pipeline_toc_entry
};
STATIC_ASSERT(sizeof(struct vkd3d_serialized_pipeline_toc_entry) == 16);

#define VKD3D_PIPELINE_LIBRARY_VERSION_TOC MAKE_MAGIC('V','K','L',4)
#define VKD3D_PIPELINE_LIBRARY_VERSION_STREAM MAKE_MAGIC('V','K','S',4)
#define VKD3D_PIPELINE_LIBRARY_VERSION_TOC MAKE_MAGIC('V','K','L',5)
#define VKD3D_PIPELINE_LIBRARY_VERSION_STREAM MAKE_MAGIC('V','K','S',5)

struct vkd3d_serialized_pipeline_library_toc
{
Expand Down
Loading
Loading