[Mesa-dev] [PATCH v3 44/63] st/mesa: add infrastructure for storing bound texture/image handles
Samuel Pitoiset
samuel.pitoiset at gmail.com
Tue Jun 13 17:17:21 UTC 2017
On 06/13/2017 04:23 PM, James Legg wrote:
> On Fri, 2017-06-09 at 15:35 +0200, Samuel Pitoiset wrote:
>> v2: - rename st_bound_handle to st_bound_handles
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com> (v1)
>> Reviewed-by: Marek Olšák <marek.olsak at amd.com> (v2)
>> ---
>> 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_texture.c
>> b/src/mesa/state_tracker/st_texture.c
>> index 7da111f39f..fdd727ec8e 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_handles *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;
>> +}
>
> Perhaps set bound_handles->handles to NULL here, otherwise the address
> of freed memory can be used by the realloc added in the following
> patch.
>
>> +
>> +
>> +/**
>> + * 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_handles *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;
>
> Same here.
>
> Thanks,
> James
Right, that seems better. Thanks for noticing this.
Samuel.
>
More information about the mesa-dev
mailing list