Hi,

1) Patches 48 and 52 are missing code comments. I'd like to see code
comments about how things work and why it was designed like that.

2) There is a lot of code duplication regarding managing the resizable
arrays. I'd like to see some util module used here, e.g. u_vector or
you can add new macros for the array structure.

See also below.

On Fri, May 19, 2017 at 6:52 PM, Samuel Pitoiset
<samuel.pitoi...@gmail.com> wrote:
> This implements the Gallium interface. Decompression of resident
> textures/images will follow in the next patches.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
> ---
>  src/gallium/drivers/radeonsi/si_descriptors.c | 340 
> ++++++++++++++++++++++++++
>  src/gallium/drivers/radeonsi/si_pipe.c        |  12 +
>  src/gallium/drivers/radeonsi/si_pipe.h        |  26 ++
>  3 files changed, 378 insertions(+)
>
> diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c 
> b/src/gallium/drivers/radeonsi/si_descriptors.c
> index abe39de583..a687506f7f 100644
> --- a/src/gallium/drivers/radeonsi/si_descriptors.c
> +++ b/src/gallium/drivers/radeonsi/si_descriptors.c
> @@ -60,6 +60,7 @@
>  #include "sid.h"
>  #include "gfx9d.h"
>
> +#include "util/hash_table.h"
>  #include "util/u_format.h"
>  #include "util/u_memory.h"
>  #include "util/u_upload_mgr.h"
> @@ -2193,6 +2194,339 @@ void si_resident_descriptor_slab_free(void *priv, 
> struct pb_slab *pslab)
>         FREE(slab);
>  }
>
> +static int si_add_resident_tex_handle(struct si_context *sctx,
> +                                     struct si_texture_handle *tex_handle)
> +{
> +       int idx;
> +
> +       /* New resident handle, check if the backing array is large enough. */
> +       if (sctx->num_resident_tex_handles >= sctx->max_resident_tex_handles) 
> {
> +               unsigned new_max_handles =
> +                       MAX2(1, sctx->max_resident_tex_handles * 2);
> +               struct si_texture_handle **new_handles =
> +                       REALLOC(sctx->resident_tex_handles,
> +                               sctx->num_resident_tex_handles * 
> (sizeof(*new_handles)),
> +                               new_max_handles * sizeof(*new_handles));
> +
> +               if (new_handles) {
> +                       sctx->resident_tex_handles = new_handles;
> +                       sctx->max_resident_tex_handles = new_max_handles;
> +               } else {
> +                       fprintf(stderr, "si_add_resident_tex_handle: "
> +                               "allocation failed\n");
> +                       return -1;
> +               }
> +       }
> +
> +       idx = sctx->num_resident_tex_handles;
> +       sctx->resident_tex_handles[idx] = tex_handle;
> +       sctx->num_resident_tex_handles++;
> +
> +       return 0;
> +}
> +
> +static void si_del_resident_tex_handle(struct si_context *sctx,
> +                                      struct si_texture_handle *tex_handle)
> +{
> +       unsigned i;
> +       int size;
> +
> +       for (i = 0; i < sctx->num_resident_tex_handles; i++) {
> +               if (sctx->resident_tex_handles[i] != tex_handle)
> +                       continue;
> +
> +               if (i < sctx->num_resident_tex_handles - 1) {
> +                       size = sizeof(*sctx->resident_tex_handles) *
> +                               (sctx->num_resident_tex_handles - 1 - i);
> +
> +                       memmove(&sctx->resident_tex_handles[i],
> +                               &sctx->resident_tex_handles[i + 1], size);
> +               }
> +
> +               sctx->num_resident_tex_handles--;
> +               return;
> +       }
> +}
> +
> +static int si_add_resident_img_handle(struct si_context *sctx,
> +                                     struct si_image_handle *img_handle)
> +{
> +       int idx;
> +
> +       /* New resident handle, check if the backing array is large enough. */
> +       if (sctx->num_resident_img_handles >= sctx->max_resident_img_handles) 
> {
> +               unsigned new_max_handles =
> +                       MAX2(1, sctx->max_resident_img_handles * 2);
> +               struct si_image_handle **new_handles =
> +                       REALLOC(sctx->resident_img_handles,
> +                               sctx->num_resident_img_handles * 
> (sizeof(*new_handles)),
> +                               new_max_handles * sizeof(*new_handles));
> +
> +               if (new_handles) {
> +                       sctx->resident_img_handles = new_handles;
> +                       sctx->max_resident_img_handles = new_max_handles;
> +               } else {
> +                       fprintf(stderr, "si_add_resident_img_handle: "
> +                               "allocation failed\n");
> +                       return -1;
> +               }
> +       }
> +
> +       idx = sctx->num_resident_img_handles;
> +       sctx->resident_img_handles[idx] = img_handle;
> +       sctx->num_resident_img_handles++;
> +
> +       return 0;
> +}
> +
> +static void si_del_resident_img_handle(struct si_context *sctx,
> +                                      struct si_image_handle *img_handle)
> +{
> +       unsigned i;
> +       int size;
> +
> +       for (i = 0; i < sctx->num_resident_img_handles; i++) {
> +               if (sctx->resident_img_handles[i] != img_handle)
> +                       continue;
> +
> +               if (i < sctx->num_resident_img_handles - 1) {
> +                       size = sizeof(*sctx->resident_img_handles) *
> +                               (sctx->num_resident_img_handles - 1 - i);
> +
> +                       memmove(&sctx->resident_img_handles[i],
> +                               &sctx->resident_img_handles[i + 1], size);
> +               }
> +
> +               sctx->num_resident_img_handles--;
> +               return;
> +       }
> +}
> +
> +static struct si_resident_descriptor *
> +si_create_resident_descriptor(struct si_context *sctx, uint32_t *desc_list,
> +                             unsigned size)

This name is misleading, because the function is called by
si_create_texture_handle when the handle is not resident. This needs
code comments at least and maybe even some renaming if needed, because
I don't understand why the name "resident_descriptor" is used by
non-resident handles.

> +{
> +       struct si_screen *sscreen = sctx->screen;
> +       struct si_resident_descriptor *desc;
> +       struct pb_slab_entry *entry;
> +       void *ptr;
> +
> +       /* Sub-allocate the resident descriptor from slabs. */
> +       entry = pb_slab_alloc(&sctx->resident_descriptor_slabs, 64, 0);
> +       if (!entry)
> +               return NULL;
> +
> +       desc = NULL;
> +       desc = container_of(entry, desc, entry);
> +
> +       /* Upload the descriptor. */
> +       ptr = sscreen->b.ws->buffer_map(desc->buffer->buf, NULL,
> +                                       PIPE_TRANSFER_WRITE |
> +                                       PIPE_TRANSFER_UNSYNCHRONIZED);

This is using UNSYNCHRONIZED, but what guarantees that the buffer
isn't being used by the GPU?

can_reclaim_slab is only using cs_is_buffer_referenced, which only
guarantees that the buffer is not referenced by an unflushed command
buffer. It doesn't guarantee that the descriptor is not being used by
the GPU.

Marek
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to