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 35 #include "main/mtypes.h" 36 37 38 struct pipe_resource; 39 40 41 struct st_texture_image_transfer { 42 struct pipe_transfer *transfer; 43 44 /* For ETC fallback. */ 45 GLubyte *temp_data; /**< Temporary ETC texture storage. */ 46 unsigned temp_stride; /**< Stride of the ETC texture storage. */ 47 GLubyte *map; /**< Saved map pointer of the uncompressed transfer. */ 48 }; 49 50 51 /** 52 * Subclass of gl_texure_image. 53 */ 54 struct st_texture_image 55 { 56 struct gl_texture_image base; 57 58 /* If stImage->pt != NULL, image data is stored here. 59 * Else there is no image data. 60 */ 61 struct pipe_resource *pt; 62 63 /* List of transfers, allocated on demand. 64 * transfer[layer] is a mapping for that layer. 65 */ 66 struct st_texture_image_transfer *transfer; 67 unsigned num_transfers; 68 69 /* For ETC images, keep track of the original data. This is necessary for 70 * mapping/unmapping, as well as image copies. 71 */ 72 GLubyte *etc_data; 73 }; 74 75 76 /** 77 * Subclass of gl_texure_object. 78 */ 79 struct st_texture_object 80 { 81 struct gl_texture_object base; /* The "parent" object */ 82 83 /* The texture must include at levels [0..lastLevel] once validated: 84 */ 85 GLuint lastLevel; 86 87 /* On validation any active images held in main memory or in other 88 * textures will be copied to this texture and the old storage freed. 89 */ 90 struct pipe_resource *pt; 91 92 /* Number of views in sampler_views array */ 93 GLuint num_sampler_views; 94 95 /* Array of sampler views (one per context) attached to this texture 96 * object. Created lazily on first binding in context. 97 */ 98 struct pipe_sampler_view **sampler_views; 99 100 /* True if this texture comes from the window system. Such a texture 101 * cannot be reallocated and the format can only be changed with a sampler 102 * view or a surface. 103 */ 104 GLboolean surface_based; 105 106 /* If surface_based is true, this format should be used for all sampler 107 * views and surfaces instead of pt->format. 108 */ 109 enum pipe_format surface_format; 110 111 /* When non-zero, samplers should use this layer instead of the one 112 * specified by the GL state. 113 * 114 * This is used for VDPAU interop, where imported pipe_resources may be 115 * array textures (containing layers with different fields) even though the 116 * GL state describes one non-array texture per field. 117 */ 118 uint layer_override; 119 120 /** The glsl version of the shader seen during the previous validation */ 121 unsigned prev_glsl_version; 122 /** The value of the sampler's sRGBDecode state at the previous validation */ 123 GLenum prev_sRGBDecode; 124 }; 125 126 127 static inline struct st_texture_image * 128 st_texture_image(struct gl_texture_image *img) 129 { 130 return (struct st_texture_image *) img; 131 } 132 133 static inline const struct st_texture_image * 134 st_texture_image_const(const struct gl_texture_image *img) 135 { 136 return (const struct st_texture_image *) img; 137 } 138 139 static inline struct st_texture_object * 140 st_texture_object(struct gl_texture_object *obj) 141 { 142 return (struct st_texture_object *) obj; 143 } 144 145 static inline const struct st_texture_object * 146 st_texture_object_const(const struct gl_texture_object *obj) 147 { 148 return (const struct st_texture_object *) obj; 149 } 150 151 152 static inline struct pipe_resource * 153 st_get_texobj_resource(struct gl_texture_object *texObj) 154 { 155 struct st_texture_object *stObj = st_texture_object(texObj); 156 return stObj ? stObj->pt : NULL; 157 } 158 159 160 static inline struct pipe_resource * 161 st_get_stobj_resource(struct st_texture_object *stObj) 162 { 163 return stObj ? stObj->pt : NULL; 164 } 165 166 167 static inline struct st_texture_object * 168 st_get_texture_object(struct gl_context *ctx, 169 const struct gl_program *prog, 170 unsigned unit) 171 { 172 const GLuint texUnit = prog->SamplerUnits[unit]; 173 struct gl_texture_object *texObj = ctx->Texture.Unit[texUnit]._Current; 174 175 if (!texObj) 176 return NULL; 177 178 return st_texture_object(texObj); 179 } 180 181 static inline enum pipe_format 182 st_get_view_format(struct st_texture_object *stObj) 183 { 184 if (!stObj) 185 return PIPE_FORMAT_NONE; 186 return stObj->surface_based ? stObj->surface_format : stObj->pt->format; 187 } 188 189 190 extern struct pipe_resource * 191 st_texture_create(struct st_context *st, 192 enum pipe_texture_target target, 193 enum pipe_format format, 194 GLuint last_level, 195 GLuint width0, 196 GLuint height0, 197 GLuint depth0, 198 GLuint layers, 199 GLuint nr_samples, 200 GLuint tex_usage ); 201 202 203 extern void 204 st_gl_texture_dims_to_pipe_dims(GLenum texture, 205 GLuint widthIn, 206 GLuint heightIn, 207 GLuint depthIn, 208 GLuint *widthOut, 209 GLuint *heightOut, 210 GLuint *depthOut, 211 GLuint *layersOut); 212 213 /* Check if an image fits into an existing texture object. 214 */ 215 extern GLboolean 216 st_texture_match_image(struct st_context *st, 217 const struct pipe_resource *pt, 218 const struct gl_texture_image *image); 219 220 /* Return a pointer to an image within a texture. Return image stride as 221 * well. 222 */ 223 extern GLubyte * 224 st_texture_image_map(struct st_context *st, struct st_texture_image *stImage, 225 enum pipe_transfer_usage usage, 226 GLuint x, GLuint y, GLuint z, 227 GLuint w, GLuint h, GLuint d, 228 struct pipe_transfer **transfer); 229 230 extern void 231 st_texture_image_unmap(struct st_context *st, 232 struct st_texture_image *stImage, unsigned slice); 233 234 235 /* Return pointers to each 2d slice within an image. Indexed by depth 236 * value. 237 */ 238 extern const GLuint * 239 st_texture_depth_offsets(struct pipe_resource *pt, GLuint level); 240 241 /* Copy an image between two textures 242 */ 243 extern void 244 st_texture_image_copy(struct pipe_context *pipe, 245 struct pipe_resource *dst, GLuint dstLevel, 246 struct pipe_resource *src, GLuint srcLevel, 247 GLuint face); 248 249 250 extern struct pipe_resource * 251 st_create_color_map_texture(struct gl_context *ctx); 252 253 254 bool 255 st_etc_fallback(struct st_context *st, struct gl_texture_image *texImage); 256 257 #endif 258