X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_texture.h;h=c10a2753104b012d994dbd7c813af5e571e77d0c;hb=be5153fbee4925b0e6e46e008f49e36606215dc8;hp=730843ae321e9f3194a21d71112bdce7d5432237;hpb=6963f94e98e9b0a1432bc0071d495c9e31b899ae;p=mesa.git diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h index 730843ae321..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" @@ -48,6 +49,29 @@ struct st_texture_image_transfer { }; +/** + * Container for one context's validated sampler view. + */ +struct st_sampler_view { + struct pipe_sampler_view *view; + + /** The glsl version of the shader seen during validation */ + bool glsl130_or_later; + /** Derived from the sampler's sRGBDecode state during validation */ + bool srgb_skip_decode; +}; + + +/** + * 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. */ @@ -70,7 +94,7 @@ struct st_texture_image * mapping/unmapping, as well as image copies. */ GLubyte *etc_data; - }; +}; /** @@ -84,18 +108,42 @@ struct st_texture_object */ GLuint lastLevel; + unsigned int validated_first_level; + unsigned int validated_last_level; + /* On validation any active images held in main memory or in other * textures will be copied to this texture and the old storage freed. */ 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 pipe_sampler_view **sampler_views; + 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_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 @@ -108,10 +156,29 @@ struct st_texture_object */ enum pipe_format surface_format; - /** The glsl version of the shader seen during the previous validation */ - unsigned prev_glsl_version; - /** The value of the sampler's sRGBDecode state at the previous validation */ - GLenum prev_sRGBDecode; + /* When non-zero, samplers should use this level instead of the level + * range specified by the GL state. + * + * This is used for EGL images, which may correspond to a single level out + * of an imported pipe_resources with multiple mip levels. + */ + uint level_override; + + /* When non-zero, samplers should use this layer instead of the one + * specified by the GL state. + * + * This is used for EGL images and VDPAU interop, where imported + * pipe_resources may be cube, 3D, or array textures (containing layers + * with different fields in the case of VDPAU) even though the GL state + * describes one non-array texture per field. + */ + uint layer_override; + + /** + * Set when the texture images of this texture object might not all be in + * the pipe_resource *pt above. + */ + bool needs_validation; }; @@ -193,13 +260,13 @@ st_texture_create(struct st_context *st, extern void st_gl_texture_dims_to_pipe_dims(GLenum texture, - GLuint widthIn, - GLuint heightIn, - GLuint depthIn, - GLuint *widthOut, - GLuint *heightOut, - GLuint *depthOut, - GLuint *layersOut); + unsigned widthIn, + uint16_t heightIn, + uint16_t depthIn, + unsigned *widthOut, + uint16_t *heightOut, + uint16_t *depthOut, + uint16_t *layersOut); /* Check if an image fits into an existing texture object. */ @@ -241,8 +308,48 @@ 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); +void +st_convert_image(const struct st_context *st, const struct gl_image_unit *u, + struct pipe_image_view *img); + +void +st_convert_image_from_unit(const struct st_context *st, + struct pipe_image_view *img, + GLuint imgUnit); + +void +st_convert_sampler(const struct st_context *st, + const struct gl_texture_object *texobj, + const struct gl_sampler_object *msamp, + float tex_unit_lod_bias, + struct pipe_sampler_state *sampler); + +void +st_convert_sampler_from_unit(const struct st_context *st, + struct pipe_sampler_state *sampler, + GLuint texUnit); + +void +st_update_single_texture(struct st_context *st, + struct pipe_sampler_view **sampler_view, + GLuint texUnit, bool glsl130_or_later, + bool ignore_srgb_decode); + +void +st_make_bound_samplers_resident(struct st_context *st, + struct gl_program *prog); + +void +st_make_bound_images_resident(struct st_context *st, + struct gl_program *prog); + #endif