diff options
Diffstat (limited to 'src/mesa/state_tracker/st_texture.h')
-rw-r--r-- | src/mesa/state_tracker/st_texture.h | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h index 8b549b86085..c10a2753104 100644 --- a/src/mesa/state_tracker/st_texture.h +++ b/src/mesa/state_tracker/st_texture.h @@ -31,6 +31,7 @@ #include "pipe/p_context.h" #include "util/u_sampler.h" +#include "util/simple_mtx.h" #include "main/mtypes.h" @@ -62,6 +63,16 @@ struct st_sampler_view { /** + * Container for per-context sampler views of a texture. + */ +struct st_sampler_views { + struct st_sampler_views *next; + uint32_t max; + uint32_t count; + struct st_sampler_view views[0]; +}; + +/** * Subclass of gl_texure_image. */ struct st_texture_image @@ -105,13 +116,34 @@ struct st_texture_object */ struct pipe_resource *pt; - /* Number of views in sampler_views array */ - GLuint num_sampler_views; + /* Protect modifications of the sampler_views array */ + simple_mtx_t validate_mutex; - /* Array of sampler views (one per context) attached to this texture + /* Container of sampler views (one per context) attached to this texture * object. Created lazily on first binding in context. + * + * Purely read-only accesses to the current context's own sampler view + * require no locking. Another thread may simultaneously replace the + * container object in order to grow the array, but the old container will + * be kept alive. + * + * Writing to the container (even for modifying the current context's own + * sampler view) always requires taking the validate_mutex to protect against + * concurrent container switches. + * + * NULL'ing another context's sampler view is allowed only while + * implementing an API call that modifies the texture: an application which + * calls those while simultaneously reading the texture in another context + * invokes undefined behavior. (TODO: a dubious violation of this rule is + * st_finalize_texture, which is a lazy operation that corresponds to a + * texture modification.) + */ + struct st_sampler_views *sampler_views; + + /* Old sampler views container objects that have not been freed yet because + * other threads/contexts may still be reading from them. */ - struct st_sampler_view *sampler_views; + struct st_sampler_views *sampler_views_old; /* True if this texture comes from the window system. Such a texture * cannot be reallocated and the format can only be changed with a sampler |