They need to be in an array for pipeline layout creation anyway, and this is useful when more layouts are needed for unbounded arrays.
signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- libs/vkd3d/command.c | 4 +-- libs/vkd3d/state.c | 59 +++++++++++++++++--------------------- libs/vkd3d/vkd3d_private.h | 5 ++-- 3 files changed, 31 insertions(+), 37 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 8b84451..116a8a6 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -2582,7 +2582,7 @@ static void d3d12_command_list_prepare_descriptors(struct d3d12_command_list *li * and when the command completes executing on the queue." */ bindings->descriptor_set = d3d12_command_allocator_allocate_descriptor_set(list->allocator, - root_signature->vk_set_layout); + root_signature->vk_set_layouts[root_signature->main_set]); bindings->in_use = false;
bindings->descriptor_table_dirty_mask |= bindings->descriptor_table_active_mask & root_signature->descriptor_table_mask; @@ -2895,7 +2895,7 @@ static void d3d12_command_list_update_descriptors(struct d3d12_command_list *lis struct d3d12_desc *base_descriptor; unsigned int i;
- if (!rs || !rs->vk_set_layout) + if (!rs || !rs->vk_set_count) return;
if (bindings->descriptor_table_dirty_mask || bindings->push_descriptor_dirty_mask) diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c index c4fcde9..e459c99 100644 --- a/libs/vkd3d/state.c +++ b/libs/vkd3d/state.c @@ -65,10 +65,8 @@ static void d3d12_root_signature_cleanup(struct d3d12_root_signature *root_signa
if (root_signature->vk_pipeline_layout) VK_CALL(vkDestroyPipelineLayout(device->vk_device, root_signature->vk_pipeline_layout, NULL)); - if (root_signature->vk_set_layout) - VK_CALL(vkDestroyDescriptorSetLayout(device->vk_device, root_signature->vk_set_layout, NULL)); - if (root_signature->vk_push_set_layout) - VK_CALL(vkDestroyDescriptorSetLayout(device->vk_device, root_signature->vk_push_set_layout, NULL)); + for (i = 0; i < root_signature->vk_set_count; ++i) + VK_CALL(vkDestroyDescriptorSetLayout(device->vk_device, root_signature->vk_set_layouts[i], NULL));
if (root_signature->parameters) { @@ -514,7 +512,6 @@ struct vkd3d_descriptor_set_context { VkDescriptorSetLayoutBinding *current_binding; unsigned int descriptor_index; - uint32_t set_index; uint32_t descriptor_binding; };
@@ -531,7 +528,7 @@ static void d3d12_root_signature_append_vk_binding(struct d3d12_root_signature * mapping->register_index = register_idx; mapping->shader_visibility = shader_visibility; mapping->flags = buffer_descriptor ? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE; - mapping->binding.set = context->set_index; + mapping->binding.set = root_signature->vk_set_count; mapping->binding.binding = context->descriptor_binding++; mapping->binding.count = 1; } @@ -777,7 +774,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa struct vkd3d_descriptor_set_context context; VkDescriptorSetLayoutBinding *binding_desc; struct d3d12_root_signature_info info; - VkDescriptorSetLayout set_layouts[2]; HRESULT hr;
memset(&context, 0, sizeof(context)); @@ -787,8 +783,7 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa root_signature->refcount = 1;
root_signature->vk_pipeline_layout = VK_NULL_HANDLE; - root_signature->vk_push_set_layout = VK_NULL_HANDLE; - root_signature->vk_set_layout = VK_NULL_HANDLE; + root_signature->vk_set_count = 0; root_signature->parameters = NULL; root_signature->flags = desc->Flags; root_signature->descriptor_mapping = NULL; @@ -839,10 +834,10 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa { if (FAILED(hr = vkd3d_create_descriptor_set_layout(device, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, - context.descriptor_binding, binding_desc, &root_signature->vk_push_set_layout))) + context.descriptor_binding, binding_desc, &root_signature->vk_set_layouts[0]))) goto fail; + ++root_signature->vk_set_count;
- set_layouts[context.set_index++] = root_signature->vk_push_set_layout; context.current_binding = binding_desc; context.descriptor_binding = 0; } @@ -855,21 +850,21 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa if (FAILED(hr = d3d12_root_signature_init_static_samplers(root_signature, device, desc, &context))) goto fail;
- root_signature->main_set = context.set_index; + root_signature->main_set = root_signature->vk_set_count; if (context.descriptor_binding) { if (FAILED(hr = vkd3d_create_descriptor_set_layout(device, - 0, context.descriptor_binding, binding_desc, &root_signature->vk_set_layout))) + 0, context.descriptor_binding, binding_desc, + &root_signature->vk_set_layouts[root_signature->vk_set_count]))) goto fail; - - set_layouts[context.set_index++] = root_signature->vk_set_layout; + ++root_signature->vk_set_count; } vkd3d_free(binding_desc); binding_desc = NULL;
- if (FAILED(hr = vkd3d_create_pipeline_layout(device, context.set_index, set_layouts, - root_signature->push_constant_range_count, root_signature->push_constant_ranges, - &root_signature->vk_pipeline_layout))) + if (FAILED(hr = vkd3d_create_pipeline_layout(device, root_signature->vk_set_count, + root_signature->vk_set_layouts, root_signature->push_constant_range_count, + root_signature->push_constant_ranges, &root_signature->vk_pipeline_layout))) goto fail;
if (FAILED(hr = vkd3d_private_store_init(&root_signature->private_store))) @@ -1424,9 +1419,9 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel const struct vkd3d_shader_scan_descriptor_info *shader_info) { const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs; - struct vkd3d_descriptor_set_context context; + VkDescriptorSetLayout set_layouts[VKD3D_MAX_DESCRIPTOR_SETS + 1]; VkDescriptorSetLayoutBinding *binding_desc; - VkDescriptorSetLayout set_layouts[3]; + uint32_t set_index, descriptor_binding; unsigned int uav_counter_count = 0; unsigned int i, j; HRESULT hr; @@ -1452,11 +1447,9 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel } state->uav_counter_count = uav_counter_count;
- memset(&context, 0, sizeof(context)); - if (root_signature->vk_push_set_layout) - set_layouts[context.set_index++] = root_signature->vk_push_set_layout; - if (root_signature->vk_set_layout) - set_layouts[context.set_index++] = root_signature->vk_set_layout; + descriptor_binding = 0; + for (set_index = 0; set_index < root_signature->vk_set_count; ++set_index) + set_layouts[set_index] = root_signature->vk_set_layouts[set_index];
for (i = 0, j = 0; i < shader_info->descriptor_count; ++i) { @@ -1469,25 +1462,25 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel state->uav_counters[j].register_space = d->register_space; state->uav_counters[j].register_index = d->register_index; state->uav_counters[j].shader_visibility = VKD3D_SHADER_VISIBILITY_COMPUTE; - state->uav_counters[j].binding.set = context.set_index; - state->uav_counters[j].binding.binding = context.descriptor_binding; + state->uav_counters[j].binding.set = set_index; + state->uav_counters[j].binding.binding = descriptor_binding; state->uav_counters[j].binding.count = 1;
/* FIXME: For the graphics pipeline we have to take the shader * visibility into account. */ - binding_desc[j].binding = context.descriptor_binding; + binding_desc[j].binding = descriptor_binding; binding_desc[j].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; binding_desc[j].descriptorCount = 1; binding_desc[j].stageFlags = VK_SHADER_STAGE_ALL; binding_desc[j].pImmutableSamplers = NULL;
- ++context.descriptor_binding; + ++descriptor_binding; ++j; }
/* Create a descriptor set layout for UAV counters. */ hr = vkd3d_create_descriptor_set_layout(device, - 0, context.descriptor_binding, binding_desc, &state->vk_set_layout); + 0, descriptor_binding, binding_desc, &state->vk_set_layout); vkd3d_free(binding_desc); if (FAILED(hr)) { @@ -1498,9 +1491,9 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel /* Create a pipeline layout which is compatible for all other descriptor * sets with the root signature's pipeline layout. */ - state->set_index = context.set_index; - set_layouts[context.set_index++] = state->vk_set_layout; - if (FAILED(hr = vkd3d_create_pipeline_layout(device, context.set_index, set_layouts, + state->set_index = set_index; + set_layouts[set_index++] = state->vk_set_layout; + if (FAILED(hr = vkd3d_create_pipeline_layout(device, set_index, set_layouts, root_signature->push_constant_range_count, root_signature->push_constant_ranges, &state->vk_pipeline_layout))) { diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index b096a8c..b30e38e 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -54,6 +54,7 @@ #define VKD3D_MAX_SHADER_EXTENSIONS 1u #define VKD3D_MAX_SHADER_STAGES 5u #define VKD3D_MAX_VK_SYNC_OBJECTS 4u +#define VKD3D_MAX_DESCRIPTOR_SETS 2u
struct d3d12_command_list; struct d3d12_device; @@ -699,8 +700,8 @@ struct d3d12_root_signature LONG refcount;
VkPipelineLayout vk_pipeline_layout; - VkDescriptorSetLayout vk_push_set_layout; - VkDescriptorSetLayout vk_set_layout; + uint32_t vk_set_count; + VkDescriptorSetLayout vk_set_layouts[VKD3D_MAX_DESCRIPTOR_SETS];
struct d3d12_root_parameter *parameters; unsigned int parameter_count;