[Mesa-dev] [RFC PATCH 43/65] st/mesa: add infrastructure for storing bound texture/image handles

Nicolai Hähnle nhaehnle at gmail.com
Wed May 24 11:45:50 UTC 2017


On 19.05.2017 18:52, Samuel Pitoiset wrote:
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>   src/mesa/state_tracker/st_context.c |  2 +
>   src/mesa/state_tracker/st_context.h | 11 ++++++
>   src/mesa/state_tracker/st_texture.c | 77 +++++++++++++++++++++++++++++++++++++
>   src/mesa/state_tracker/st_texture.h |  5 +++
>   4 files changed, 95 insertions(+)
> 
> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
> index c901764668..4dcc160b50 100644
> --- a/src/mesa/state_tracker/st_context.c
> +++ b/src/mesa/state_tracker/st_context.c
> @@ -292,6 +292,8 @@ st_destroy_context_priv(struct st_context *st, bool destroy_pipe)
>      st_destroy_drawtex(st);
>      st_destroy_perfmon(st);
>      st_destroy_pbo_helpers(st);
> +   st_destroy_bound_texture_handles(st);
> +   st_destroy_bound_image_handles(st);
>   
>      for (shader = 0; shader < ARRAY_SIZE(st->state.sampler_views); shader++) {
>         for (i = 0; i < ARRAY_SIZE(st->state.sampler_views[0]); i++) {
> diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
> index 520cd8d462..16f29669be 100644
> --- a/src/mesa/state_tracker/st_context.h
> +++ b/src/mesa/state_tracker/st_context.h
> @@ -79,6 +79,12 @@ struct st_bitmap_cache
>      ubyte *buffer;
>   };
>   
> +struct st_bound_handle
> +{
> +   unsigned num_handles;
> +   uint64_t *handles;
> +};

Not super important, but maybe call this st_bound_handles (plural)? But 
that's a nitpick, and either way, patches 32 (possibly with 
inst->bindless removed) and 34-43 are

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


> +
>   struct st_context
>   {
>      struct st_context_iface iface;
> @@ -271,6 +277,11 @@ struct st_context
>      struct st_perf_monitor_group *perfmon;
>   
>      enum pipe_reset_status reset_status;
> +
> +   /* Array of bound texture/image handles which are resident in the context.
> +    */
> +   struct st_bound_handle bound_texture_handles[PIPE_SHADER_TYPES];
> +   struct st_bound_handle bound_image_handles[PIPE_SHADER_TYPES];
>   };
>   
>   
> diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c
> index 65f86f2b4f..cde7759a61 100644
> --- a/src/mesa/state_tracker/st_texture.c
> +++ b/src/mesa/state_tracker/st_texture.c
> @@ -421,6 +421,83 @@ st_create_color_map_texture(struct gl_context *ctx)
>      return pt;
>   }
>   
> +/**
> + * Destroy bound texture handles for the given stage.
> + */
> +static void
> +st_destroy_bound_texture_handles_per_stage(struct st_context *st,
> +                                           enum pipe_shader_type shader)
> +{
> +   struct st_bound_handle *bound_handles = &st->bound_texture_handles[shader];
> +   struct pipe_context *pipe = st->pipe;
> +   unsigned i;
> +
> +   if (likely(!bound_handles->num_handles))
> +      return;
> +
> +   for (i = 0; i < bound_handles->num_handles; i++) {
> +      uint64_t handle = bound_handles->handles[i];
> +
> +      pipe->make_texture_handle_resident(pipe, handle, false);
> +      pipe->delete_texture_handle(pipe, handle);
> +   }
> +   free(bound_handles->handles);
> +   bound_handles->num_handles = 0;
> +}
> +
> +
> +/**
> + * Destroy all bound texture handles in the context.
> + */
> +void
> +st_destroy_bound_texture_handles(struct st_context *st)
> +{
> +   unsigned i;
> +
> +   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
> +      st_destroy_bound_texture_handles_per_stage(st, i);
> +   }
> +}
> +
> +
> +/**
> + * Destroy bound image handles for the given stage.
> + */
> +static void
> +st_destroy_bound_image_handles_per_stage(struct st_context *st,
> +                                         enum pipe_shader_type shader)
> +{
> +   struct st_bound_handle *bound_handles = &st->bound_image_handles[shader];
> +   struct pipe_context *pipe = st->pipe;
> +   unsigned i;
> +
> +   if (likely(!bound_handles->num_handles))
> +      return;
> +
> +   for (i = 0; i < bound_handles->num_handles; i++) {
> +      uint64_t handle = bound_handles->handles[i];
> +
> +      pipe->make_image_handle_resident(pipe, handle, GL_READ_WRITE, false);
> +      pipe->delete_image_handle(pipe, handle);
> +   }
> +   free(bound_handles->handles);
> +   bound_handles->num_handles = 0;
> +}
> +
> +
> +/**
> + * Destroy all bound image handles in the context.
> + */
> +void
> +st_destroy_bound_image_handles(struct st_context *st)
> +{
> +   unsigned i;
> +
> +   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
> +      st_destroy_bound_image_handles_per_stage(st, i);
> +   }
> +}
> +
>   
>   /**
>    * Create a texture handle from a texture unit.
> diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h
> index 7f8a0cb841..b97814cb16 100644
> --- a/src/mesa/state_tracker/st_texture.h
> +++ b/src/mesa/state_tracker/st_texture.h
> @@ -250,6 +250,11 @@ st_texture_image_copy(struct pipe_context *pipe,
>   extern struct pipe_resource *
>   st_create_color_map_texture(struct gl_context *ctx);
>   
> +void
> +st_destroy_bound_texture_handles(struct st_context *st);
> +
> +void
> +st_destroy_bound_image_handles(struct st_context *st);
>   
>   bool
>   st_etc_fallback(struct st_context *st, struct gl_texture_image *texImage);
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list