Skip to content

Commit

Permalink
vkd3d: Enable promoted VK_EXT_mutable_descriptor_type.
Browse files Browse the repository at this point in the history
Trivial alias, support both variants for now.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
  • Loading branch information
HansKristian-Work committed Sep 15, 2022
1 parent a782d7b commit 6c133a2
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 21 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ These extensions will likely become mandatory later.
- `VK_KHR_buffer_device_address`
- `VK_EXT_image_view_min_lod`

`VK_VALVE_mutable_descriptor_type` is also highly recommended, but not mandatory.
`VK_EXT_mutable_descriptor_type` (or the vendor `VALVE` alias) is also highly recommended, but not mandatory.

### AMD (RADV)

Expand Down
5 changes: 3 additions & 2 deletions libs/vkd3d/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ static const struct vkd3d_optional_extension_info optional_device_extensions[] =
VK_EXTENSION(EXT_SCALAR_BLOCK_LAYOUT, EXT_scalar_block_layout),
VK_EXTENSION(EXT_PIPELINE_CREATION_FEEDBACK, EXT_pipeline_creation_feedback),
VK_EXTENSION(EXT_MESH_SHADER, EXT_mesh_shader),
VK_EXTENSION(EXT_MUTABLE_DESCRIPTOR_TYPE, EXT_mutable_descriptor_type),
/* AMD extensions */
VK_EXTENSION(AMD_BUFFER_MARKER, AMD_buffer_marker),
VK_EXTENSION(AMD_DEVICE_COHERENT_MEMORY, AMD_device_coherent_memory),
Expand Down Expand Up @@ -1380,9 +1381,9 @@ static void vkd3d_physical_device_info_init(struct vkd3d_physical_device_info *i
vk_prepend_struct(&info->properties2, &info->shader_sm_builtins_properties);
}

if (vulkan_info->VALVE_mutable_descriptor_type)
if (vulkan_info->VALVE_mutable_descriptor_type || vulkan_info->EXT_mutable_descriptor_type)
{
info->mutable_descriptor_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE;
info->mutable_descriptor_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT;
vk_prepend_struct(&info->features2, &info->mutable_descriptor_features);
}

Expand Down
8 changes: 4 additions & 4 deletions libs/vkd3d/resource.c
Original file line number Diff line number Diff line change
Expand Up @@ -3907,7 +3907,7 @@ static void d3d12_descriptor_heap_write_null_descriptor_template(vkd3d_cpu_descr
for (i = 0; i < num_writes; i++)
{
writes[i] = desc.heap->null_descriptor_template.writes[i];
if (writes[i].descriptorType == VK_DESCRIPTOR_TYPE_MUTABLE_VALVE)
if (writes[i].descriptorType == VK_DESCRIPTOR_TYPE_MUTABLE_EXT)
writes[i].descriptorType = vk_mutable_descriptor_type;
writes[i].dstArrayElement = offset;
}
Expand Down Expand Up @@ -5520,7 +5520,7 @@ static HRESULT d3d12_descriptor_heap_create_descriptor_pool(struct d3d12_descrip
vk_pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT;
if (!(descriptor_heap->desc.Flags & D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE) &&
(descriptor_heap->device->bindless_state.flags & VKD3D_BINDLESS_MUTABLE_TYPE))
vk_pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE;
vk_pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_EXT;

vk_pool_info.maxSets = pool_count;
vk_pool_info.poolSizeCount = pool_count;
Expand Down Expand Up @@ -5550,7 +5550,7 @@ static void d3d12_descriptor_heap_zero_initialize(struct d3d12_descriptor_heap *

/* Clear out descriptor heap with the largest possible descriptor type we know of when using mutable descriptor type.
* Purely for defensive purposes. */
if (vk_descriptor_type == VK_DESCRIPTOR_TYPE_MUTABLE_VALVE)
if (vk_descriptor_type == VK_DESCRIPTOR_TYPE_MUTABLE_EXT)
vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;

write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Expand Down Expand Up @@ -5890,7 +5890,7 @@ static void d3d12_descriptor_heap_add_null_descriptor_template(
descriptor_heap->null_descriptor_template.image.imageView = VK_NULL_HANDLE;
descriptor_heap->null_descriptor_template.buffer_view = VK_NULL_HANDLE;
descriptor_heap->null_descriptor_template.has_mutable_descriptors =
descriptor_heap->device->vk_info.VALVE_mutable_descriptor_type;
descriptor_heap->device->device_info.mutable_descriptor_features.mutableDescriptorType;
}

descriptor_heap->null_descriptor_template.num_writes++;
Expand Down
25 changes: 13 additions & 12 deletions libs/vkd3d/state.c
Original file line number Diff line number Diff line change
Expand Up @@ -4730,7 +4730,7 @@ static pfn_vkd3d_host_mapping_copy_template_single vkd3d_bindless_find_copy_temp
static HRESULT vkd3d_bindless_state_add_binding(struct vkd3d_bindless_state *bindless_state,
struct d3d12_device *device, uint32_t flags, VkDescriptorType vk_descriptor_type)
{
VkMutableDescriptorTypeListVALVE mutable_descriptor_list[VKD3D_BINDLESS_SET_MAX_EXTRA_BINDINGS + 1];
VkMutableDescriptorTypeListEXT mutable_descriptor_list[VKD3D_BINDLESS_SET_MAX_EXTRA_BINDINGS + 1];
struct vkd3d_bindless_set_info *set_info = &bindless_state->set_info[bindless_state->set_count++];
VkDescriptorSetLayoutBinding vk_binding_info[VKD3D_BINDLESS_SET_MAX_EXTRA_BINDINGS + 1];
VkDescriptorBindingFlagsEXT vk_binding_flags[VKD3D_BINDLESS_SET_MAX_EXTRA_BINDINGS + 1];
Expand All @@ -4739,8 +4739,8 @@ static HRESULT vkd3d_bindless_state_add_binding(struct vkd3d_bindless_state *bin
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
VkDescriptorSetLayoutHostMappingInfoVALVE mapping_info;
VkDescriptorSetBindingReferenceVALVE binding_reference;
VkMutableDescriptorTypeCreateInfoVALVE mutable_info;
VkDescriptorSetLayoutCreateInfo vk_set_layout_info;
VkMutableDescriptorTypeCreateInfoEXT mutable_info;
VkDescriptorSetLayoutBinding *vk_binding;
unsigned int i;
VkResult vr;
Expand Down Expand Up @@ -4792,11 +4792,11 @@ static HRESULT vkd3d_bindless_state_add_binding(struct vkd3d_bindless_state *bin
vk_set_layout_info.bindingCount = set_info->binding_index + 1;
vk_set_layout_info.pBindings = vk_binding_info;

if (vk_descriptor_type == VK_DESCRIPTOR_TYPE_MUTABLE_VALVE)
if (vk_descriptor_type == VK_DESCRIPTOR_TYPE_MUTABLE_EXT)
{
vk_binding_flags_info.pNext = &mutable_info;

mutable_info.sType = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE;
mutable_info.sType = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT;
mutable_info.pNext = NULL;
mutable_info.pMutableDescriptorTypeLists = mutable_descriptor_list;
mutable_info.mutableDescriptorTypeListCount = set_info->binding_index + 1;
Expand Down Expand Up @@ -4852,7 +4852,7 @@ static HRESULT vkd3d_bindless_state_add_binding(struct vkd3d_bindless_state *bin
/* If we have mutable descriptor extension, we will allocate these descriptors with
* HOST_BIT and not UPDATE_AFTER_BIND, since that is enough to get threading guarantees. */
vk_binding_flags[set_info->binding_index] = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT;
vk_set_layout_info.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE;
vk_set_layout_info.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT;
}

if ((vr = VK_CALL(vkCreateDescriptorSetLayout(device->vk_device,
Expand All @@ -4867,7 +4867,7 @@ static bool vkd3d_bindless_supports_mutable_type(struct d3d12_device *device, ui
VkDescriptorType descriptor_types[VKD3D_MAX_MUTABLE_DESCRIPTOR_TYPES];
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
VkDescriptorSetLayoutBindingFlagsCreateInfoEXT binding_flags;
VkMutableDescriptorTypeCreateInfoVALVE mutable_info;
VkMutableDescriptorTypeCreateInfoEXT mutable_info;
VkDescriptorSetLayoutCreateInfo set_layout_info;
VkMutableDescriptorTypeListVALVE mutable_list;
VkDescriptorSetLayoutSupport supported;
Expand All @@ -4882,7 +4882,7 @@ static bool vkd3d_bindless_supports_mutable_type(struct d3d12_device *device, ui
if (!device->device_info.mutable_descriptor_features.mutableDescriptorType)
return false;

mutable_info.sType = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE;
mutable_info.sType = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT;
mutable_info.pNext = NULL;
mutable_info.pMutableDescriptorTypeLists = &mutable_list;
mutable_info.mutableDescriptorTypeListCount = 1;
Expand All @@ -4891,7 +4891,7 @@ static bool vkd3d_bindless_supports_mutable_type(struct d3d12_device *device, ui
mutable_list.pDescriptorTypes = descriptor_types;

binding.binding = 0;
binding.descriptorType = VK_DESCRIPTOR_TYPE_MUTABLE_VALVE;
binding.descriptorType = VK_DESCRIPTOR_TYPE_MUTABLE_EXT;
binding.descriptorCount = d3d12_max_descriptor_count_from_heap_type(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
binding.pImmutableSamplers = NULL;
binding.stageFlags = VK_SHADER_STAGE_ALL;
Expand All @@ -4913,7 +4913,7 @@ static bool vkd3d_bindless_supports_mutable_type(struct d3d12_device *device, ui
if (!supported.supported)
return false;

set_layout_info.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE;
set_layout_info.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT;
binding_flag = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT;
VK_CALL(vkGetDescriptorSetLayoutSupport(device->vk_device, &set_layout_info, &supported));
return supported.supported == VK_TRUE;
Expand Down Expand Up @@ -5008,12 +5008,13 @@ static uint32_t vkd3d_bindless_state_get_bindless_flags(struct d3d12_device *dev

if (vkd3d_bindless_supports_mutable_type(device, flags))
{
INFO("Device supports VK_VALVE_mutable_descriptor_type.\n");
INFO("Device supports VK_%s_mutable_descriptor_type.\n",
device->vk_info.EXT_mutable_descriptor_type ? "EXT" : "VALVE");
flags |= VKD3D_BINDLESS_MUTABLE_TYPE;
}
else
{
INFO("Device does not support VK_VALVE_mutable_descriptor_type.\n");
INFO("Device does not support VK_EXT_mutable_descriptor_type (or VALVE).\n");
flags &= ~VKD3D_BINDLESS_MUTABLE_TYPE_RAW_SSBO;
}

Expand Down Expand Up @@ -5067,7 +5068,7 @@ HRESULT vkd3d_bindless_state_init(struct vkd3d_bindless_state *bindless_state,
VKD3D_BINDLESS_SET_BUFFER | VKD3D_BINDLESS_SET_IMAGE |
(use_raw_ssbo_binding ? VKD3D_BINDLESS_SET_RAW_SSBO : 0) |
VKD3D_BINDLESS_SET_MUTABLE | extra_bindings,
VK_DESCRIPTOR_TYPE_MUTABLE_VALVE)))
VK_DESCRIPTOR_TYPE_MUTABLE_EXT)))
goto fail;

use_raw_ssbo_binding = !use_raw_ssbo_binding && (bindless_state->flags & VKD3D_BINDLESS_RAW_SSBO);
Expand Down
3 changes: 2 additions & 1 deletion libs/vkd3d/vkd3d_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ struct vkd3d_vulkan_info
bool EXT_scalar_block_layout;
bool EXT_pipeline_creation_feedback;
bool EXT_mesh_shader;
bool EXT_mutable_descriptor_type; /* EXT promotion of VALVE one. */
/* AMD device extensions */
bool AMD_buffer_marker;
bool AMD_device_coherent_memory;
Expand Down Expand Up @@ -3363,7 +3364,7 @@ struct vkd3d_physical_device_info
VkPhysicalDeviceRobustness2FeaturesEXT robustness2_features;
VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extended_dynamic_state_features;
VkPhysicalDeviceExtendedDynamicState2FeaturesEXT extended_dynamic_state2_features;
VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE mutable_descriptor_features;
VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT mutable_descriptor_features;
VkPhysicalDeviceRayTracingPipelineFeaturesKHR ray_tracing_pipeline_features;
VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features;
VkPhysicalDeviceFragmentShadingRateFeaturesKHR fragment_shading_rate_features;
Expand Down

0 comments on commit 6c133a2

Please sign in to comment.