1 /************************************************************************** 2 * 3 * Copyright 2007 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 #ifndef ST_TEXTURE_H 29 #define ST_TEXTURE_H 30 31 32 #include "pipe/p_context.h" 33 #include "util/u_sampler.h" 34 #include "util/simple_mtx.h" 35 36 #include "main/mtypes.h" 37 38 39 struct pipe_resource; 40 41 42 struct st_texture_image_transfer { 43 struct pipe_transfer *transfer; 44 45 /* For ETC fallback. */ 46 GLubyte *temp_data; /**< Temporary ETC texture storage. */ 47 unsigned temp_stride; /**< Stride of the ETC texture storage. */ 48 GLubyte *map; /**< Saved map pointer of the uncompressed transfer. */ 49 }; 50 51 52 /** 53 * Container for one context's validated sampler view. 54 */ 55 struct st_sampler_view { 56 struct pipe_sampler_view *view; 57 58 /** The glsl version of the shader seen during validation */ 59 bool glsl130_or_later; 60 /** Derived from the sampler's sRGBDecode state during validation */ 61 bool srgb_skip_decode; 62 }; 63 64 65 /** 66 * Container for per-context sampler views of a texture. 67 */ 68 struct st_sampler_views { 69 struct st_sampler_views *next; 70 uint32_t max; 71 uint32_t count; 72 struct st_sampler_view views[0]; 73 }; 74 75 /** 76 * Subclass of gl_texure_image. 77 */ 78 struct st_texture_image 79 { 80 struct gl_texture_image base; 81 82 /* If stImage->pt != NULL, image data is stored here. 83 * Else there is no image data. 84 */ 85 struct pipe_resource *pt; 86 87 /* List of transfers, allocated on demand. 88 * transfer[layer] is a mapping for that layer. 89 */ 90 struct st_texture_image_transfer *transfer; 91 unsigned num_transfers; 92 93 /* For ETC images, keep track of the original data. This is necessary for 94 * mapping/unmapping, as well as image copies. 95 */ 96 GLubyte *etc_data; 97 }; 98 99 100 /** 101 * Subclass of gl_texure_object. 102 */ 103 struct st_texture_object 104 { 105 struct gl_texture_object base; /* The "parent" object */ 106 107 /* The texture must include at levels [0..lastLevel] once validated: 108 */ 109 GLuint lastLevel; 110 111 unsigned int validated_first_level; 112 unsigned int validated_last_level; 113 114 /* On validation any active images held in main memory or in other 115 * textures will be copied to this texture and the old storage freed. 116 */ 117 struct pipe_resource *pt; 118 119 /* Protect modifications of the sampler_views array */ 120 simple_mtx_t validate_mutex; 121 122 /* Container of sampler views (one per context) attached to this texture 123 * object. Created lazily on first binding in context. 124 * 125 * Purely read-only accesses to the current context's own sampler view 126 * require no locking. Another thread may simultaneously replace the 127 * container object in order to grow the array, but the old container will 128 * be kept alive. 129 * 130 * Writing to the container (even for modifying the current context's own 131 * sampler view) always requires taking the validate_mutex to protect against 132 * concurrent container switches. 133 * 134 * NULL'ing another context's sampler view is allowed only while 135 * implementing an API call that modifies the texture: an application which 136 * calls those while simultaneously reading the texture in another context 137 * invokes undefined behavior. (TODO: a dubious violation of this rule is 138 * st_finalize_texture, which is a lazy operation that corresponds to a 139 * texture modification.) 140 */ 141 struct st_sampler_views *sampler_views; 142 143 /* Old sampler views container objects that have not been freed yet because 144 * other threads/contexts may still be reading from them. 145 */ 146 struct st_sampler_views *sampler_views_old; 147 148 /* True if this texture comes from the window system. Such a texture 149 * cannot be reallocated and the format can only be changed with a sampler 150 * view or a surface. 151 */ 152 GLboolean surface_based; 153 154 /* If surface_based is true, this format should be used for all sampler 155 * views and surfaces instead of pt->format. 156 */ 157 enum pipe_format surface_format; 158 159 /* When non-zero, samplers should use this level instead of the level 160 * range specified by the GL state. 161 * 162 * This is used for EGL images, which may correspond to a single level out 163 * of an imported pipe_resources with multiple mip levels. 164 */ 165 uint level_override; 166 167 /* When non-zero, samplers should use this layer instead of the one 168 * specified by the GL state. 169 * 170 * This is used for EGL images and VDPAU interop, where imported 171 * pipe_resources may be cube, 3D, or array textures (containing layers 172 * with different fields in the case of VDPAU) even though the GL state 173 * describes one non-array texture per field. 174 */ 175 uint layer_override; 176 177 /** 178 * Set when the texture images of this texture object might not all be in 179 * the pipe_resource *pt above. 180 */ 181 bool needs_validation; 182 }; 183 184 185 static inline struct st_texture_image * 186 st_texture_image(struct gl_texture_image *img) 187 { 188 return (struct st_texture_image *) img; 189 } 190 191 static inline const struct st_texture_image * 192 st_texture_image_const(const struct gl_texture_image *img) 193 { 194 return (const struct st_texture_image *) img; 195 } 196 197 static inline struct st_texture_object * 198 st_texture_object(struct gl_texture_object *obj) 199 { 200 return (struct st_texture_object *) obj; 201 } 202 203 static inline const struct st_texture_object * 204 st_texture_object_const(const struct gl_texture_object *obj) 205 { 206 return (const struct st_texture_object *) obj; 207 } 208 209 210 static inline struct pipe_resource * 211 st_get_texobj_resource(struct gl_texture_object *texObj) 212 { 213 struct st_texture_object *stObj = st_texture_object(texObj); 214 return stObj ? stObj->pt : NULL; 215 } 216 217 218 static inline struct pipe_resource * 219 st_get_stobj_resource(struct st_texture_object *stObj) 220 { 221 return stObj ? stObj->pt : NULL; 222 } 223 224 225 static inline struct st_texture_object * 226 st_get_texture_object(struct gl_context *ctx, 227 const struct gl_program *prog, 228 unsigned unit) 229 { 230 const GLuint texUnit = prog->SamplerUnits[unit]; 231 struct gl_texture_object *texObj = ctx->Texture.Unit[texUnit]._Current; 232 233 if (!texObj) 234 return NULL; 235 236 return st_texture_object(texObj); 237 } 238 239 static inline enum pipe_format 240 st_get_view_format(struct st_texture_object *stObj) 241 { 242 if (!stObj) 243 return PIPE_FORMAT_NONE; 244 return stObj->surface_based ? stObj->surface_format : stObj->pt->format; 245 } 246 247 248 extern struct pipe_resource * 249 st_texture_create(struct st_context *st, 250 enum pipe_texture_target target, 251 enum pipe_format format, 252 GLuint last_level, 253 GLuint width0, 254 GLuint height0, 255 GLuint depth0, 256 GLuint layers, 257 GLuint nr_samples, 258 GLuint tex_usage ); 259 260 261 extern void 262 st_gl_texture_dims_to_pipe_dims(GLenum texture, 263 unsigned widthIn, 264 uint16_t heightIn, 265 uint16_t depthIn, 266 unsigned *widthOut, 267 uint16_t *heightOut, 268 uint16_t *depthOut, 269 uint16_t *layersOut); 270 271 /* Check if an image fits into an existing texture object. 272 */ 273 extern GLboolean 274 st_texture_match_image(struct st_context *st, 275 const struct pipe_resource *pt, 276 const struct gl_texture_image *image); 277 278 /* Return a pointer to an image within a texture. Return image stride as 279 * well. 280 */ 281 extern GLubyte * 282 st_texture_image_map(struct st_context *st, struct st_texture_image *stImage, 283 enum pipe_transfer_usage usage, 284 GLuint x, GLuint y, GLuint z, 285 GLuint w, GLuint h, GLuint d, 286 struct pipe_transfer **transfer); 287 288 extern void 289 st_texture_image_unmap(struct st_context *st, 290 struct st_texture_image *stImage, unsigned slice); 291 292 293 /* Return pointers to each 2d slice within an image. Indexed by depth 294 * value. 295 */ 296 extern const GLuint * 297 st_texture_depth_offsets(struct pipe_resource *pt, GLuint level); 298 299 /* Copy an image between two textures 300 */ 301 extern void 302 st_texture_image_copy(struct pipe_context *pipe, 303 struct pipe_resource *dst, GLuint dstLevel, 304 struct pipe_resource *src, GLuint srcLevel, 305 GLuint face); 306 307 308 extern struct pipe_resource * 309 st_create_color_map_texture(struct gl_context *ctx); 310 311 void 312 st_destroy_bound_texture_handles(struct st_context *st); 313 314 void 315 st_destroy_bound_image_handles(struct st_context *st); 316 317 bool 318 st_etc_fallback(struct st_context *st, struct gl_texture_image *texImage); 319 320 void 321 st_convert_image(const struct st_context *st, const struct gl_image_unit *u, 322 struct pipe_image_view *img); 323 324 void 325 st_convert_image_from_unit(const struct st_context *st, 326 struct pipe_image_view *img, 327 GLuint imgUnit); 328 329 void 330 st_convert_sampler(const struct st_context *st, 331 const struct gl_texture_object *texobj, 332 const struct gl_sampler_object *msamp, 333 float tex_unit_lod_bias, 334 struct pipe_sampler_state *sampler); 335 336 void 337 st_convert_sampler_from_unit(const struct st_context *st, 338 struct pipe_sampler_state *sampler, 339 GLuint texUnit); 340 341 void 342 st_update_single_texture(struct st_context *st, 343 struct pipe_sampler_view **sampler_view, 344 GLuint texUnit, bool glsl130_or_later, 345 bool ignore_srgb_decode); 346 347 void 348 st_make_bound_samplers_resident(struct st_context *st, 349 struct gl_program *prog); 350 351 void 352 st_make_bound_images_resident(struct st_context *st, 353 struct gl_program *prog); 354 355 #endif 356