diff options
-rw-r--r-- | src/mesa/state_tracker/st_context.c | 2 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_context.h | 11 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_texture.c | 79 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_texture.h | 5 |
4 files changed, 97 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index b99a53b3c7f..80811f6cf43 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -291,6 +291,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 770477a9bbb..f8e9bf96c52 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_handles +{ + unsigned num_handles; + uint64_t *handles; +}; + struct st_context { struct st_context_iface iface; @@ -274,6 +280,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_handles bound_texture_handles[PIPE_SHADER_TYPES]; + struct st_bound_handles 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 7da111f39f3..0f72eb778ad 100644 --- a/src/mesa/state_tracker/st_texture.c +++ b/src/mesa/state_tracker/st_texture.c @@ -421,6 +421,85 @@ 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->handles = NULL; + 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_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->handles = NULL; + 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 4bfec0bed27..18b5870b393 100644 --- a/src/mesa/state_tracker/st_texture.h +++ b/src/mesa/state_tracker/st_texture.h @@ -259,6 +259,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); |