st/mesa: add infrastructure for storing bound texture/image handles
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
@@ -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++) {
|
||||
|
||||
@@ -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];
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user