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.pitoi...@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> (v1)
Reviewed-by: Marek Olšák <marek.ol...@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.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev