anv/cmd_buffer: Add a helper for binding descriptor sets

This lets us unify some code between push descriptors and regular
descriptors.  It doesn't do much for us yet but it will.

Tested-by: Józef Kucia <joseph.kucia@gmail.com>
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
Cc: "18.0" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
Jason Ekstrand 2017-12-15 13:47:53 -08:00
parent 90cceaa9dd
commit b9e1ca16f8
1 changed files with 42 additions and 28 deletions

View File

@ -493,6 +493,40 @@ void anv_CmdSetStencilReference(
cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE;
}
static void
anv_cmd_buffer_bind_descriptor_set(struct anv_cmd_buffer *cmd_buffer,
struct anv_pipeline_layout *layout,
uint32_t set_index,
struct anv_descriptor_set *set,
uint32_t *dynamic_offset_count,
const uint32_t **dynamic_offsets)
{
struct anv_descriptor_set_layout *set_layout =
layout->set[set_index].layout;
cmd_buffer->state.descriptors[set_index] = set;
if (dynamic_offsets) {
if (set_layout->dynamic_offset_count > 0) {
uint32_t dynamic_offset_start =
layout->set[set_index].dynamic_offset_start;
/* Assert that everything is in range */
assert(set_layout->dynamic_offset_count <= *dynamic_offset_count);
assert(dynamic_offset_start + set_layout->dynamic_offset_count <=
ARRAY_SIZE(cmd_buffer->state.dynamic_offsets));
typed_memcpy(&cmd_buffer->state.dynamic_offsets[dynamic_offset_start],
*dynamic_offsets, set_layout->dynamic_offset_count);
*dynamic_offsets += set_layout->dynamic_offset_count;
*dynamic_offset_count -= set_layout->dynamic_offset_count;
}
}
cmd_buffer->state.descriptors_dirty |= set_layout->shader_stages;
}
void anv_CmdBindDescriptorSets(
VkCommandBuffer commandBuffer,
VkPipelineBindPoint pipelineBindPoint,
@ -505,35 +539,15 @@ void anv_CmdBindDescriptorSets(
{
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
ANV_FROM_HANDLE(anv_pipeline_layout, layout, _layout);
struct anv_descriptor_set_layout *set_layout;
assert(firstSet + descriptorSetCount < MAX_SETS);
uint32_t dynamic_slot = 0;
for (uint32_t i = 0; i < descriptorSetCount; i++) {
ANV_FROM_HANDLE(anv_descriptor_set, set, pDescriptorSets[i]);
set_layout = layout->set[firstSet + i].layout;
cmd_buffer->state.descriptors[firstSet + i] = set;
if (set_layout->dynamic_offset_count > 0) {
uint32_t dynamic_offset_start =
layout->set[firstSet + i].dynamic_offset_start;
/* Assert that everything is in range */
assert(dynamic_offset_start + set_layout->dynamic_offset_count <=
ARRAY_SIZE(cmd_buffer->state.dynamic_offsets));
assert(dynamic_slot + set_layout->dynamic_offset_count <=
dynamicOffsetCount);
typed_memcpy(&cmd_buffer->state.dynamic_offsets[dynamic_offset_start],
&pDynamicOffsets[dynamic_slot],
set_layout->dynamic_offset_count);
dynamic_slot += set_layout->dynamic_offset_count;
}
cmd_buffer->state.descriptors_dirty |= set_layout->shader_stages;
anv_cmd_buffer_bind_descriptor_set(cmd_buffer, layout,
firstSet + i, set,
&dynamicOffsetCount,
&pDynamicOffsets);
}
}
@ -944,8 +958,8 @@ void anv_CmdPushDescriptorSetKHR(
}
}
cmd_buffer->state.descriptors[_set] = set;
cmd_buffer->state.descriptors_dirty |= set_layout->shader_stages;
anv_cmd_buffer_bind_descriptor_set(cmd_buffer, layout, _set,
set, NULL, NULL);
}
void anv_CmdPushDescriptorSetWithTemplateKHR(
@ -983,6 +997,6 @@ void anv_CmdPushDescriptorSetWithTemplateKHR(
template,
pData);
cmd_buffer->state.descriptors[_set] = set;
cmd_buffer->state.descriptors_dirty |= set_layout->shader_stages;
anv_cmd_buffer_bind_descriptor_set(cmd_buffer, layout, _set,
set, NULL, NULL);
}