On Mon, Jan 15, 2018 at 7:11 AM, Pohjolainen, Topi <
topi.pohjolai...@gmail.com> wrote:

> On Fri, Dec 15, 2017 at 05:09:09PM -0800, Jason Ekstrand wrote:
> > The Vulkan spec says:
> >
> >     "pipelineBindPoint is a VkPipelineBindPoint indicating whether the
> >     descriptors will be used by graphics pipelines or compute pipelines.
> >     There is a separate set of bind points for each of graphics and
> >     compute, so binding one does not disturb the other."
> >
> > Up until now, we've been ignoring the pipeline bind point and had just
> > one bind point for everything.  This commit separates things out into
> > separate bind points.
> >
> > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102897
> > ---
> >  src/intel/vulkan/anv_cmd_buffer.c     | 65
> ++++++++++++++++++++++++++---------
> >  src/intel/vulkan/anv_descriptor_set.c |  2 ++
> >  src/intel/vulkan/anv_private.h        | 11 +++---
> >  src/intel/vulkan/genX_cmd_buffer.c    | 24 +++++++------
> >  4 files changed, 70 insertions(+), 32 deletions(-)
> >
> > diff --git a/src/intel/vulkan/anv_cmd_buffer.c
> b/src/intel/vulkan/anv_cmd_buffer.c
> > index 636f515..9720e7e 100644
> > --- a/src/intel/vulkan/anv_cmd_buffer.c
> > +++ b/src/intel/vulkan/anv_cmd_buffer.c
> > @@ -124,12 +124,20 @@ anv_cmd_state_init(struct anv_cmd_buffer
> *cmd_buffer)
> >  }
> >
> >  static void
> > +anv_cmd_pipeline_state_finish(struct anv_cmd_buffer *cmd_buffer,
> > +                              struct anv_cmd_pipeline_state *pipe_state)
> > +{
> > +   for (uint32_t i = 0; i < ARRAY_SIZE(pipe_state->push_descriptors);
> i++)
> > +      vk_free(&cmd_buffer->pool->alloc, pipe_state->push_descriptors[
> i]);
> > +}
> > +
> > +static void
> >  anv_cmd_state_finish(struct anv_cmd_buffer *cmd_buffer)
> >  {
> >     struct anv_cmd_state *state = &cmd_buffer->state;
> >
> > -   for (uint32_t i = 0; i < ARRAY_SIZE(state->push_descriptors); i++)
> > -      vk_free(&cmd_buffer->pool->alloc, state->push_descriptors[i]);
> > +   anv_cmd_pipeline_state_finish(cmd_buffer, &state->gfx.base);
> > +   anv_cmd_pipeline_state_finish(cmd_buffer, &state->compute.base);
> >
> >     for (uint32_t i = 0; i < MESA_SHADER_STAGES; i++)
> >        vk_free(&cmd_buffer->pool->alloc, state->push_constants[i]);
> > @@ -495,6 +503,7 @@ void anv_CmdSetStencilReference(
> >
> >  static void
> >  anv_cmd_buffer_bind_descriptor_set(struct anv_cmd_buffer *cmd_buffer,
> > +                                   VkPipelineBindPoint bind_point,
> >                                     struct anv_pipeline_layout *layout,
> >                                     uint32_t set_index,
> >                                     struct anv_descriptor_set *set,
> > @@ -504,7 +513,14 @@ anv_cmd_buffer_bind_descriptor_set(struct
> anv_cmd_buffer *cmd_buffer,
> >     struct anv_descriptor_set_layout *set_layout =
> >        layout->set[set_index].layout;
> >
> > -   cmd_buffer->state.descriptors[set_index] = set;
> > +   struct anv_cmd_pipeline_state *pipe_state;
> > +   if (bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) {
> > +      pipe_state = &cmd_buffer->state.compute.base;
> > +   } else {
> > +      assert(bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS);
> > +      pipe_state = &cmd_buffer->state.gfx.base;
> > +   }
> > +   pipe_state->descriptors[set_index] = set;
> >
> >     if (dynamic_offsets) {
> >        if (set_layout->dynamic_offset_count > 0) {
> > @@ -514,9 +530,9 @@ anv_cmd_buffer_bind_descriptor_set(struct
> anv_cmd_buffer *cmd_buffer,
> >           /* 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));
> > +                ARRAY_SIZE(pipe_state->dynamic_offsets));
> >
> > -         typed_memcpy(&cmd_buffer->state.dynamic_offsets[dynamic_
> offset_start],
> > +         typed_memcpy(&pipe_state->dynamic_offsets[dynamic_
> offset_start],
> >                        *dynamic_offsets, set_layout->dynamic_offset_
> count);
> >
> >           *dynamic_offsets += set_layout->dynamic_offset_count;
> > @@ -524,7 +540,13 @@ anv_cmd_buffer_bind_descriptor_set(struct
> anv_cmd_buffer *cmd_buffer,
> >        }
> >     }
> >
> > -   cmd_buffer->state.descriptors_dirty |= set_layout->shader_stages;
> > +   if (bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) {
> > +      cmd_buffer->state.descriptors_dirty |=
> VK_SHADER_STAGE_COMPUTE_BIT;
> > +   } else {
> > +      assert(bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS);
> > +      cmd_buffer->state.descriptors_dirty |=
> > +         set_layout->shader_stages & VK_SHADER_STAGE_ALL_GRAPHICS;
>
> Should we put () around the right hand side? We seem to be using that
> elsewhere.
>

Meh.  I think it's fairly obvious what's going on.  I do sometimes insist
on wraping == statements in () because a = b == c is something I find hard
to read but a = b & c seems obvious to me.


> > +   }
> >  }
> >
> >  void anv_CmdBindDescriptorSets(
> > @@ -544,8 +566,8 @@ void anv_CmdBindDescriptorSets(
> >
> >     for (uint32_t i = 0; i < descriptorSetCount; i++) {
> >        ANV_FROM_HANDLE(anv_descriptor_set, set, pDescriptorSets[i]);
> > -      anv_cmd_buffer_bind_descriptor_set(cmd_buffer, layout,
> > -                                         firstSet + i, set,
> > +      anv_cmd_buffer_bind_descriptor_set(cmd_buffer, pipelineBindPoint,
> > +                                         layout, firstSet + i, set,
> >                                           &dynamicOffsetCount,
> >                                           &pDynamicOffsets);
> >     }
> > @@ -851,10 +873,19 @@ anv_cmd_buffer_get_depth_stencil_view(const
> struct anv_cmd_buffer *cmd_buffer)
> >
> >  static struct anv_push_descriptor_set *
> >  anv_cmd_buffer_get_push_descriptor_set(struct anv_cmd_buffer
> *cmd_buffer,
> > +                                       VkPipelineBindPoint bind_point,
> >                                         uint32_t set)
> >  {
> > +   struct anv_cmd_pipeline_state *pipe_state;
> > +   if (bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) {
> > +      pipe_state = &cmd_buffer->state.compute.base;
> > +   } else {
> > +      assert(bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS);
> > +      pipe_state = &cmd_buffer->state.gfx.base;
> > +   }
> > +
> >     struct anv_push_descriptor_set **push_set =
> > -      &cmd_buffer->state.push_descriptors[set];
> > +      &pipe_state->push_descriptors[set];
> >
> >     if (*push_set == NULL) {
> >        *push_set = vk_alloc(&cmd_buffer->pool->alloc,
> > @@ -880,15 +911,14 @@ void anv_CmdPushDescriptorSetKHR(
> >     ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
> >     ANV_FROM_HANDLE(anv_pipeline_layout, layout, _layout);
> >
> > -   assert(pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS ||
> > -          pipelineBindPoint == VK_PIPELINE_BIND_POINT_COMPUTE);
> >     assert(_set < MAX_SETS);
> >
> >     const struct anv_descriptor_set_layout *set_layout =
> >        layout->set[_set].layout;
> >
> >     struct anv_push_descriptor_set *push_set =
> > -      anv_cmd_buffer_get_push_descriptor_set(cmd_buffer, _set);
> > +      anv_cmd_buffer_get_push_descriptor_set(cmd_buffer,
> > +                                             pipelineBindPoint, _set);
> >     if (!push_set)
> >        return;
> >
> > @@ -958,8 +988,8 @@ void anv_CmdPushDescriptorSetKHR(
> >        }
> >     }
> >
> > -   anv_cmd_buffer_bind_descriptor_set(cmd_buffer, layout, _set,
> > -                                      set, NULL, NULL);
> > +   anv_cmd_buffer_bind_descriptor_set(cmd_buffer, pipelineBindPoint,
> > +                                      layout, _set, set, NULL, NULL);
> >  }
> >
> >  void anv_CmdPushDescriptorSetWithTemplateKHR(
> > @@ -980,7 +1010,8 @@ void anv_CmdPushDescriptorSetWithTemplateKHR(
> >        layout->set[_set].layout;
> >
> >     struct anv_push_descriptor_set *push_set =
> > -      anv_cmd_buffer_get_push_descriptor_set(cmd_buffer, _set);
> > +      anv_cmd_buffer_get_push_descriptor_set(cmd_buffer,
> > +                                             template->bind_point,
> _set);
> >     if (!push_set)
> >        return;
> >
> > @@ -997,6 +1028,6 @@ void anv_CmdPushDescriptorSetWithTemplateKHR(
> >                                       template,
> >                                       pData);
> >
> > -   anv_cmd_buffer_bind_descriptor_set(cmd_buffer, layout, _set,
> > -                                      set, NULL, NULL);
> > +   anv_cmd_buffer_bind_descriptor_set(cmd_buffer, template->bind_point,
> > +                                      layout, _set, set, NULL, NULL);
> >  }
> > diff --git a/src/intel/vulkan/anv_descriptor_set.c
> b/src/intel/vulkan/anv_descriptor_set.c
> > index 629c041..63557ab 100644
> > --- a/src/intel/vulkan/anv_descriptor_set.c
> > +++ b/src/intel/vulkan/anv_descriptor_set.c
> > @@ -891,6 +891,8 @@ VkResult anv_CreateDescriptorUpdateTemplateKHR(
> >     if (template == NULL)
> >        return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
> >
> > +   template->bind_point = pCreateInfo->pipelineBindPoint;
> > +
> >     if (pCreateInfo->templateType == VK_DESCRIPTOR_UPDATE_TEMPLATE_
> TYPE_DESCRIPTOR_SET_KHR)
> >        template->set = pCreateInfo->set;
> >
> > diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_
> private.h
> > index e8d0d27..f1868a3 100644
> > --- a/src/intel/vulkan/anv_private.h
> > +++ b/src/intel/vulkan/anv_private.h
> > @@ -1319,6 +1319,8 @@ struct anv_descriptor_template_entry {
> >  };
> >
> >  struct anv_descriptor_update_template {
> > +    VkPipelineBindPoint bind_point;
> > +
> >     /* The descriptor set this template corresponds to. This value is
> only
> >      * valid if the template was created with the templateType
> >      * VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR.
> > @@ -1686,6 +1688,11 @@ struct anv_attachment_state {
> >   */
> >  struct anv_cmd_pipeline_state {
> >     struct anv_pipeline *pipeline;
> > +
> > +   struct anv_descriptor_set *descriptors[MAX_SETS];
> > +   uint32_t dynamic_offsets[MAX_DYNAMIC_BUFFERS];
> > +
> > +   struct anv_push_descriptor_set *push_descriptors[MAX_SETS];
> >  };
> >
> >  /** State tracking for graphics pipeline
> > @@ -1734,16 +1741,12 @@ struct anv_cmd_state {
> >     VkRect2D                                     render_area;
> >     uint32_t                                     restart_index;
> >     struct anv_vertex_binding
> vertex_bindings[MAX_VBS];
> > -   struct anv_descriptor_set *                  descriptors[MAX_SETS];
> > -   uint32_t
>  dynamic_offsets[MAX_DYNAMIC_BUFFERS];
> >     VkShaderStageFlags                           push_constant_stages;
> >     struct anv_push_constants *
> push_constants[MESA_SHADER_STAGES];
> >     struct anv_state
>  binding_tables[MESA_SHADER_STAGES];
> >     struct anv_state
>  samplers[MESA_SHADER_STAGES];
> >     struct anv_dynamic_state                     dynamic;
> >
> > -   struct anv_push_descriptor_set *
>  push_descriptors[MAX_SETS];
> > -
> >     /**
> >      * Whether or not the gen8 PMA fix is enabled.  We ensure that, at
> the top
> >      * of any command buffer it is disabled by disabling it in
> EndCommandBuffer
> > diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> b/src/intel/vulkan/genX_cmd_buffer.c
> > index 994c996..75aa40a 100644
> > --- a/src/intel/vulkan/genX_cmd_buffer.c
> > +++ b/src/intel/vulkan/genX_cmd_buffer.c
> > @@ -1434,32 +1434,32 @@ cmd_buffer_alloc_push_constants(struct
> anv_cmd_buffer *cmd_buffer)
> >  }
> >
> >  static const struct anv_descriptor *
> > -anv_descriptor_for_binding(const struct anv_cmd_buffer *cmd_buffer,
> > +anv_descriptor_for_binding(const struct anv_cmd_pipeline_state
> *pipe_state,
> >                             const struct anv_pipeline_binding *binding)
> >  {
> >     assert(binding->set < MAX_SETS);
> >     const struct anv_descriptor_set *set =
> > -      cmd_buffer->state.descriptors[binding->set];
> > +      pipe_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,
> > +dynamic_offset_for_binding(const struct anv_cmd_pipeline_state
> *pipe_state,
> >                             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];
> > +      pipe_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];
> > +   return pipe_state->dynamic_offsets[dynamic_offset_idx];
> >  }
> >
> >  static VkResult
> > @@ -1567,7 +1567,7 @@ emit_binding_table(struct anv_cmd_buffer
> *cmd_buffer,
> >        }
> >
> >        const struct anv_descriptor *desc =
> > -         anv_descriptor_for_binding(cmd_buffer, binding);
> > +         anv_descriptor_for_binding(pipe_state, binding);
> >
> >        switch (desc->type) {
> >        case VK_DESCRIPTOR_TYPE_SAMPLER:
> > @@ -1643,7 +1643,7 @@ emit_binding_table(struct anv_cmd_buffer
> *cmd_buffer,
> >        case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: {
> >           /* Compute the offset within the buffer */
> >           uint32_t dynamic_offset =
> > -            dynamic_offset_for_binding(cmd_buffer, pipeline, binding);
> > +            dynamic_offset_for_binding(pipe_state, pipeline, binding);
> >           uint64_t offset = desc->offset + dynamic_offset;
> >           /* Clamp to the buffer size */
> >           offset = MIN2(offset, desc->buffer->size);
> > @@ -1724,7 +1724,7 @@ emit_samplers(struct anv_cmd_buffer *cmd_buffer,
> >     for (uint32_t s = 0; s < map->sampler_count; s++) {
> >        struct anv_pipeline_binding *binding =
> &map->sampler_to_descriptor[s];
> >        const struct anv_descriptor *desc =
> > -         anv_descriptor_for_binding(cmd_buffer, binding);
> > +         anv_descriptor_for_binding(pipe_state, binding);
> >
> >        if (desc->type != VK_DESCRIPTOR_TYPE_SAMPLER &&
> >            desc->type != VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
> > @@ -1848,7 +1848,8 @@ static void
> >  cmd_buffer_flush_push_constants(struct anv_cmd_buffer *cmd_buffer,
> >                                  VkShaderStageFlags dirty_stages)
> >  {
> > -   const struct anv_pipeline *pipeline = cmd_buffer->state.gfx.base.
> pipeline;
> > +   const struct anv_cmd_graphics_state *gfx_state =
> &cmd_buffer->state.gfx;
> > +   const struct anv_pipeline *pipeline = gfx_state->base.pipeline;
> >
> >     static const uint32_t push_constant_opcodes[] = {
> >        [MESA_SHADER_VERTEX]                      = 21,
> > @@ -1901,7 +1902,7 @@ cmd_buffer_flush_push_constants(struct
> anv_cmd_buffer *cmd_buffer,
> >                    &bind_map->surface_to_descriptor[surface];
> >
> >                 const struct anv_descriptor *desc =
> > -                  anv_descriptor_for_binding(cmd_buffer, binding);
> > +                  anv_descriptor_for_binding(&gfx_state->base,
> binding);
> >
> >                 struct anv_address read_addr;
> >                 uint32_t read_len;
> > @@ -1917,7 +1918,8 @@ cmd_buffer_flush_push_constants(struct
> anv_cmd_buffer *cmd_buffer,
> >                    assert(desc->type == VK_DESCRIPTOR_TYPE_UNIFORM_
> BUFFER_DYNAMIC);
> >
> >                    uint32_t dynamic_offset =
> > -                     dynamic_offset_for_binding(cmd_buffer, pipeline,
> binding);
> > +                     dynamic_offset_for_binding(&gfx_state->base,
> > +                                                pipeline, binding);
> >                    uint32_t buf_offset =
> >                       MIN2(desc->offset + dynamic_offset,
> desc->buffer->size);
> >                    uint32_t buf_range =
> > --
> > 2.5.0.400.gff86faf
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to