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:
parent
d515e3efa7
commit
e899b96c10
|
@ -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];
|
struct vkd3d_pipeline_bindings *bindings = &list->pipeline_bindings[bind_point];
|
||||||
const struct d3d12_root_signature *root_signature = bindings->root_signature;
|
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_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];
|
VkWriteDescriptorSet descriptor_writes[D3D12_MAX_ROOT_COST / 2];
|
||||||
const struct d3d12_root_parameter *root_parameter;
|
const struct d3d12_root_parameter *root_parameter;
|
||||||
VkDescriptorSet descriptor_set = VK_NULL_HANDLE;
|
VkDescriptorSet descriptor_set = VK_NULL_HANDLE;
|
||||||
unsigned int descriptor_write_count = 0;
|
unsigned int descriptor_write_count = 0;
|
||||||
unsigned int root_parameter_index;
|
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;
|
bindings->root_descriptor_dirty_mask |= bindings->root_descriptor_active_mask & root_signature->root_descriptor_mask;
|
||||||
|
|
||||||
descriptor_set = d3d12_command_allocator_allocate_descriptor_set(
|
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)
|
if (!descriptor_write_count)
|
||||||
return;
|
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,
|
VK_CALL(vkCmdPushDescriptorSetKHR(list->vk_command_buffer, bind_point,
|
||||||
root_signature->vk_pipeline_layout, root_signature->root_descriptor_set,
|
root_signature->vk_pipeline_layout, root_signature->root_descriptor_set,
|
||||||
|
|
|
@ -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,
|
const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info,
|
||||||
struct vkd3d_descriptor_set_context *context, VkDescriptorSetLayout *vk_set_layout)
|
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;
|
VkDescriptorSetLayoutBinding *vk_binding_info, *vk_binding;
|
||||||
struct vkd3d_shader_resource_binding *binding;
|
struct vkd3d_shader_resource_binding *binding;
|
||||||
|
VkDescriptorSetLayoutCreateFlags vk_flags;
|
||||||
struct d3d12_root_parameter *param;
|
struct d3d12_root_parameter *param;
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -775,8 +775,10 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign
|
||||||
context->vk_binding += 1;
|
context->vk_binding += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = vkd3d_create_descriptor_set_layout(root_signature->device,
|
vk_flags = root_signature->flags & VKD3D_ROOT_SIGNATURE_USE_PUSH_DESCRIPTORS
|
||||||
vk_info->KHR_push_descriptor ? VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR : 0,
|
? 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);
|
info->root_descriptor_count, vk_binding_info, vk_set_layout);
|
||||||
|
|
||||||
vkd3d_free(vk_binding_info);
|
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;
|
const struct vkd3d_bindless_state *bindless_state = &device->bindless_state;
|
||||||
VkDescriptorSetLayout set_layouts[VKD3D_MAX_DESCRIPTOR_SETS];
|
VkDescriptorSetLayout set_layouts[VKD3D_MAX_DESCRIPTOR_SETS];
|
||||||
|
const struct vkd3d_vulkan_info *vk_info = &device->vk_info;
|
||||||
struct vkd3d_descriptor_set_context context;
|
struct vkd3d_descriptor_set_context context;
|
||||||
struct d3d12_root_signature_info info;
|
struct d3d12_root_signature_info info;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -906,6 +909,13 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
|
||||||
context.vk_set += 1;
|
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,
|
if (FAILED(hr = d3d12_root_signature_init_root_descriptors(root_signature, desc,
|
||||||
&info, &context, &root_signature->vk_root_descriptor_layout)))
|
&info, &context, &root_signature->vk_root_descriptor_layout)))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -920,10 +930,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
|
||||||
context.vk_set += 1;
|
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,
|
if (FAILED(hr = d3d12_root_signature_init_root_descriptor_tables(root_signature, desc,
|
||||||
&info, &context, &root_signature->vk_packed_descriptor_layout)))
|
&info, &context, &root_signature->vk_packed_descriptor_layout)))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
|
@ -702,6 +702,11 @@ enum vkd3d_root_descriptor_table_flag
|
||||||
VKD3D_ROOT_DESCRIPTOR_TABLE_HAS_PACKED_DESCRIPTORS = 0x00000001u,
|
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
|
struct d3d12_root_descriptor_table
|
||||||
{
|
{
|
||||||
uint32_t table_index;
|
uint32_t table_index;
|
||||||
|
@ -757,6 +762,7 @@ struct d3d12_root_signature
|
||||||
uint64_t root_descriptor_mask;
|
uint64_t root_descriptor_mask;
|
||||||
|
|
||||||
D3D12_ROOT_SIGNATURE_FLAGS d3d12_flags;
|
D3D12_ROOT_SIGNATURE_FLAGS d3d12_flags;
|
||||||
|
unsigned int flags; /* vkd3d_root_signature_flag */
|
||||||
|
|
||||||
unsigned int binding_count;
|
unsigned int binding_count;
|
||||||
struct vkd3d_shader_resource_binding *bindings;
|
struct vkd3d_shader_resource_binding *bindings;
|
||||||
|
|
Loading…
Reference in New Issue