[Mesa-dev] [RFC 01/24] nvc0: add preliminary support for images

Samuel Pitoiset samuel.pitoiset at gmail.com
Thu Apr 14 21:58:01 UTC 2016



On 04/14/2016 07:48 PM, Pierre Moreau wrote:
> On 01:56 AM - Apr 13 2016, Samuel Pitoiset wrote:
>> This implements set_shader_images() and resource invalidation for
>> images. As OpenGL requires at least 8 images, we are going to expose
>> this minimum value even if this might be raised for Kepler, but this
>> limit is mainly for Fermi because the hardware only accepts 8 images.
>>
>> Based on original patch by Ilia Mirkin.
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>>   src/gallium/drivers/nouveau/nvc0/nvc0_context.c    | 17 +++++++
>>   src/gallium/drivers/nouveau/nvc0/nvc0_context.h    |  4 ++
>>   src/gallium/drivers/nouveau/nvc0/nvc0_screen.h     |  1 +
>>   src/gallium/drivers/nouveau/nvc0/nvc0_state.c      | 53 +++++++++++++++++++++-
>>   .../drivers/nouveau/nvc0/nvc0_state_validate.c     |  1 +
>>   5 files changed, 74 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c
>> index fcb8289..3e25572 100644
>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c
>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c
>> @@ -301,6 +301,23 @@ nvc0_invalidate_resource_storage(struct nouveau_context *ctx,
>>            }
>>         }
>>         }
>> +
>> +      for (s = 0; s < 5; ++s) {
>
> Should be `s < 6` here I guess, since you later test for `s == 5`.

Right.

>
>> +      for (i = 0; i < NVC0_MAX_IMAGES; ++i) {
>
> Any reason not to intend this second for loop?

Presumably you meant indent? The answer is no because it's the coding 
style in that function.

>
> Pierre
>
>> +         if (nvc0->images[s][i].resource == res) {
>> +            nvc0->images_dirty[s] |= 1 << i;
>> +            if (unlikely(s == 5)) {
>> +               nvc0->dirty_cp |= NVC0_NEW_CP_SURFACES;
>> +               nouveau_bufctx_reset(nvc0->bufctx_cp, NVC0_BIND_CP_SUF);
>> +            } else {
>> +               nvc0->dirty_3d |= NVC0_NEW_3D_SURFACES;
>> +               nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_SUF);
>> +            }
>> +         }
>> +         if (!--ref)
>> +            return ref;
>> +      }
>> +      }
>>      }
>>
>>      return ref;
>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
>> index 91dffa1..617f4c2 100644
>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
>> @@ -237,6 +237,10 @@ struct nvc0_context {
>>      uint32_t buffers_dirty[6];
>>      uint32_t buffers_valid[6];
>>
>> +   struct pipe_image_view images[6][NVC0_MAX_IMAGES];
>> +   uint16_t images_dirty[6];
>> +   uint16_t images_valid[6];
>> +
>>      struct util_dynarray global_residents;
>>   };
>>
>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h
>> index 0f78220..750bba0 100644
>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h
>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h
>> @@ -23,6 +23,7 @@
>>
>>   #define NVC0_MAX_BUFFERS 32
>>
>> +#define NVC0_MAX_IMAGES 8
>>
>>   struct nvc0_context;
>>
>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
>> index a100fc4..e437a64 100644
>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
>> @@ -1232,10 +1232,59 @@ nvc0_set_compute_resources(struct pipe_context *pipe,
>>   }
>>
>>   static void
>> +nvc0_bind_images_range(struct nvc0_context *nvc0, const unsigned s,
>> +                       unsigned start, unsigned nr,
>> +                       struct pipe_image_view *pimages)
>> +{
>> +   const unsigned end = start + nr;
>> +   const unsigned mask = ((1 << nr) - 1) << start;
>> +   unsigned i;
>> +
>> +   assert(s < 6);
>> +
>> +   if (pimages) {
>> +      for (i = start; i < end; ++i) {
>> +         const unsigned p = i - start;
>> +         if (pimages[p].resource)
>> +            nvc0->images_valid[s] |= (1 << i);
>> +         else
>> +            nvc0->images_valid[s] &= ~(1 << i);
>> +
>> +         nvc0->images[s][i].format = pimages[p].format;
>> +         nvc0->images[s][i].access = pimages[p].access;
>> +         if (pimages[p].resource->target == PIPE_BUFFER)
>> +            nvc0->images[s][i].u.buf = pimages[p].u.buf;
>> +         else
>> +            nvc0->images[s][i].u.tex = pimages[p].u.tex;
>> +
>> +         pipe_resource_reference(
>> +               &nvc0->images[s][i].resource, pimages[p].resource);
>> +      }
>> +   } else {
>> +      for (i = start; i < end; ++i)
>> +         pipe_resource_reference(&nvc0->images[s][i].resource, NULL);
>> +      nvc0->images_valid[s] &= ~mask;
>> +   }
>> +   nvc0->images_dirty[s] |= mask;
>> +
>> +   if (s == 5)
>> +      nouveau_bufctx_reset(nvc0->bufctx_cp, NVC0_BIND_CP_SUF);
>> +   else
>> +      nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_SUF);
>> +}
>> +
>> +static void
>>   nvc0_set_shader_images(struct pipe_context *pipe, unsigned shader,
>> -                       unsigned start_slot, unsigned count,
>> -                       struct pipe_image_view *views)
>> +                       unsigned start, unsigned nr,
>> +                       struct pipe_image_view *images)
>>   {
>> +   const unsigned s = nvc0_shader_stage(shader);
>> +   nvc0_bind_images_range(nvc0_context(pipe), s, start, nr, images);
>> +
>> +   if (s == 5)
>> +      nvc0_context(pipe)->dirty_cp |= NVC0_NEW_CP_SURFACES;
>> +   else
>> +      nvc0_context(pipe)->dirty_3d |= NVC0_NEW_3D_SURFACES;
>>   }
>>
>>   static void
>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
>> index d0d9315..b57db46 100644
>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
>> @@ -665,6 +665,7 @@ nvc0_switch_pipe_context(struct nvc0_context *ctx_to)
>>         ctx_to->textures_dirty[s] = ~0;
>>         ctx_to->constbuf_dirty[s] = (1 << NVC0_MAX_PIPE_CONSTBUFS) - 1;
>>         ctx_to->buffers_dirty[s]  = ~0;
>> +      ctx_to->images_dirty[s]   = ~0;
>>      }
>>
>>      /* Reset tfb as the shader that owns it may have been deleted. */
>> --
>> 2.8.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list