diff options
author | Jason Ekstrand <[email protected]> | 2017-12-01 04:25:05 -0800 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2017-12-08 15:43:25 -0800 |
commit | 1968cd07a220f38f1655ea946e25a882312bdb32 (patch) | |
tree | e71516375f40285bd31732fedd54f4f6fbc4f084 | |
parent | 1bce04deb8e62e7fc1c19b1ecc7b6484e33ecf20 (diff) |
anv/cmd_buffer: Add some helpers for working with descriptor sets
Reviewed-by: Jordan Justen <[email protected]>
-rw-r--r-- | src/intel/vulkan/genX_cmd_buffer.c | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index ab5590d7cee..e4362d12059 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -1432,6 +1432,35 @@ cmd_buffer_alloc_push_constants(struct anv_cmd_buffer *cmd_buffer) cmd_buffer->state.push_constants_dirty |= VK_SHADER_STAGE_ALL_GRAPHICS; } +static const struct anv_descriptor * +anv_descriptor_for_binding(const struct anv_cmd_buffer *cmd_buffer, + const struct anv_pipeline_binding *binding) +{ + assert(binding->set < MAX_SETS); + const struct anv_descriptor_set *set = + cmd_buffer->state.descriptors[binding->set]; + const uint32_t offset = + set->layout->binding[binding->binding].descriptor_index; + return &set->descriptors[offset + binding->index]; +} + +static uint32_t +dynamic_offset_for_binding(const struct anv_cmd_buffer *cmd_buffer, + const struct anv_pipeline *pipeline, + const struct anv_pipeline_binding *binding) +{ + assert(binding->set < MAX_SETS); + const struct anv_descriptor_set *set = + cmd_buffer->state.descriptors[binding->set]; + + uint32_t dynamic_offset_idx = + pipeline->layout->set[binding->set].dynamic_offset_start + + set->layout->binding[binding->binding].dynamic_offset_index + + binding->index; + + return cmd_buffer->state.dynamic_offsets[dynamic_offset_idx]; +} + static VkResult emit_binding_table(struct anv_cmd_buffer *cmd_buffer, gl_shader_stage stage, @@ -1534,10 +1563,8 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, continue; } - struct anv_descriptor_set *set = - cmd_buffer->state.descriptors[binding->set]; - uint32_t offset = set->layout->binding[binding->binding].descriptor_index; - struct anv_descriptor *desc = &set->descriptors[offset + binding->index]; + const struct anv_descriptor *desc = + anv_descriptor_for_binding(cmd_buffer, binding); switch (desc->type) { case VK_DESCRIPTOR_TYPE_SAMPLER: @@ -1611,14 +1638,10 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { - uint32_t dynamic_offset_idx = - pipeline->layout->set[binding->set].dynamic_offset_start + - set->layout->binding[binding->binding].dynamic_offset_index + - binding->index; - /* Compute the offset within the buffer */ - uint64_t offset = desc->offset + - cmd_buffer->state.dynamic_offsets[dynamic_offset_idx]; + uint32_t dynamic_offset = + dynamic_offset_for_binding(cmd_buffer, pipeline, binding); + uint64_t offset = desc->offset + dynamic_offset; /* Clamp to the buffer size */ offset = MIN2(offset, desc->buffer->size); /* Clamp the range to the buffer size */ |