summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker/st_texture.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/state_tracker/st_texture.h')
-rw-r--r--src/mesa/state_tracker/st_texture.h40
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