vkd3d: Introduce root signature flag to determine push descriptor usage.

For now this is enbaled based on device capabilities, but future changes
may require this to be disabled for certain root signatures.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-03-12 15:10:43 +01:00 committed by Hans-Kristian Arntzen
parent d515e3efa7
commit e899b96c10
3 changed files with 22 additions and 11 deletions

View File

@ -2947,16 +2947,15 @@ static void d3d12_command_list_update_root_descriptors(struct d3d12_command_list
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
const struct d3d12_root_signature *root_signature = bindings->root_signature;
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
const struct vkd3d_vulkan_info *vk_info = &list->device->vk_info;
VkWriteDescriptorSet descriptor_writes[D3D12_MAX_ROOT_COST / 2];
const struct d3d12_root_parameter *root_parameter;
VkDescriptorSet descriptor_set = VK_NULL_HANDLE;
unsigned int descriptor_write_count = 0;
unsigned int root_parameter_index;
if (!vk_info->KHR_push_descriptor)
if (!(root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS))
{
/* Ensure that we populate all descriptors if VK_KHR_push_descriptor is unavailable */
/* Ensure that we populate all descriptors if push descriptors cannot be used */
bindings->root_descriptor_dirty_mask |= bindings->root_descriptor_active_mask & root_signature->root_descriptor_mask;
descriptor_set = d3d12_command_allocator_allocate_descriptor_set(
@ -2981,7 +2980,7 @@ static void d3d12_command_list_update_root_descriptors(struct d3d12_command_list
if (!descriptor_write_count)
return;
if (vk_info->KHR_push_descriptor)
if (root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS)
{
VK_CALL(vkCmdPushDescriptorSetKHR(list->vk_command_buffer, bind_point,
root_signature->vk_pipeline_layout, root_signature->root_descriptor_set,

View File

@ -723,9 +723,9 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign
const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info,
struct vkd3d_descriptor_set_context *context, VkDescriptorSetLayout *vk_set_layout)
{
const struct vkd3d_vulkan_info *vk_info = &root_signature->device->vk_info;
VkDescriptorSetLayoutBinding *vk_binding_info, *vk_binding;
struct vkd3d_shader_resource_binding *binding;
VkDescriptorSetLayoutCreateFlags vk_flags;
struct d3d12_root_parameter *param;
unsigned int i, j;
HRESULT hr;
@ -775,8 +775,10 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign
context->vk_binding += 1;
}
hr = vkd3d_create_descriptor_set_layout(root_signature->device,
vk_info->KHR_push_descriptor ? VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR : 0,
vk_flags = root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS
? VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR : 0;
hr = vkd3d_create_descriptor_set_layout(root_signature->device, vk_flags,
info->root_descriptor_count, vk_binding_info, vk_set_layout);
vkd3d_free(vk_binding_info);
@ -841,6 +843,7 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
{
const struct vkd3d_bindless_state *bindless_state = &device->bindless_state;
VkDescriptorSetLayout set_layouts[VKD3D_MAX_DESCRIPTOR_SETS];
const struct vkd3d_vulkan_info *vk_info = &device->vk_info;
struct vkd3d_descriptor_set_context context;
struct d3d12_root_signature_info info;
unsigned int i;
@ -906,6 +909,13 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
context.vk_set += 1;
}
if (FAILED(hr = d3d12_root_signature_init_push_constants(root_signature, desc, &info,
&root_signature->push_constant_range)))
goto fail;
if (vk_info->KHR_push_descriptor)
root_signature->flags |= VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS;
if (FAILED(hr = d3d12_root_signature_init_root_descriptors(root_signature, desc,
&info, &context, &root_signature->vk_root_descriptor_layout)))
goto fail;
@ -920,10 +930,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
context.vk_set += 1;
}
if (FAILED(hr = d3d12_root_signature_init_push_constants(root_signature, desc, &info,
&root_signature->push_constant_range)))
goto fail;
if (FAILED(hr = d3d12_root_signature_init_root_descriptor_tables(root_signature, desc,
&info, &context, &root_signature->vk_packed_descriptor_layout)))
goto fail;

View File

@ -702,6 +702,11 @@ enum vkd3d_root_descriptor_table_flag
VKD3D_ROOT_DESCRIPTOR_TABLE_HAS_PACKED_DESCRIPTORS = 0x00000001u,
};
enum vkd3d_root_signature_flag
{
VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS = 0x00000001u,
};
struct d3d12_root_descriptor_table
{
uint32_t table_index;
@ -757,6 +762,7 @@ struct d3d12_root_signature
uint64_t root_descriptor_mask;
D3D12_ROOT_SIGNATURE_FLAGS d3d12_flags;
unsigned int flags; /* vkd3d_root_signature_flag */
unsigned int binding_count;
struct vkd3d_shader_resource_binding *bindings;