st_texture.h revision 848b8605
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 38struct pipe_resource; 39 40 41struct 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 */ 54struct st_texture_image 55{ 56 struct gl_texture_image base; 57 58 /** Used to store texture data that doesn't fit in the parent 59 * object's mipmap buffer. 60 */ 61 GLubyte *TexData; 62 63 /* If stImage->pt != NULL, image data is stored here. 64 * Else if stImage->TexData != NULL, image is stored there. 65 * Else there is no image data. 66 */ 67 struct pipe_resource *pt; 68 69 /* List of transfers, allocated on demand. 70 * transfer[layer] is a mapping for that layer. 71 */ 72 struct st_texture_image_transfer *transfer; 73 unsigned num_transfers; 74}; 75 76 77/** 78 * Subclass of gl_texure_object. 79 */ 80struct st_texture_object 81{ 82 struct gl_texture_object base; /* The "parent" object */ 83 84 /* The texture must include at levels [0..lastLevel] once validated: 85 */ 86 GLuint lastLevel; 87 88 /** The size of the level=0 mipmap image. 89 * Note that the number of 1D array layers will be in height0 and the 90 * number of 2D array layers will be in depth0, as in GL. 91 */ 92 GLuint width0, height0, depth0; 93 94 /* On validation any active images held in main memory or in other 95 * textures will be copied to this texture and the old storage freed. 96 */ 97 struct pipe_resource *pt; 98 99 /* Number of views in sampler_views array */ 100 GLuint num_sampler_views; 101 102 /* Array of sampler views (one per context) attached to this texture 103 * object. Created lazily on first binding in context. 104 */ 105 struct pipe_sampler_view **sampler_views; 106 107 /* True if this texture comes from the window system. Such a texture 108 * cannot be reallocated and the format can only be changed with a sampler 109 * view or a surface. 110 */ 111 GLboolean surface_based; 112 113 /* If surface_based is true, this format should be used for all sampler 114 * views and surfaces instead of pt->format. 115 */ 116 enum pipe_format surface_format; 117}; 118 119 120static INLINE struct st_texture_image * 121st_texture_image(struct gl_texture_image *img) 122{ 123 return (struct st_texture_image *) img; 124} 125 126static INLINE struct st_texture_object * 127st_texture_object(struct gl_texture_object *obj) 128{ 129 return (struct st_texture_object *) obj; 130} 131 132static INLINE const struct st_texture_object * 133st_texture_object_const(const struct gl_texture_object *obj) 134{ 135 return (const struct st_texture_object *) obj; 136} 137 138 139static INLINE struct pipe_resource * 140st_get_texobj_resource(struct gl_texture_object *texObj) 141{ 142 struct st_texture_object *stObj = st_texture_object(texObj); 143 return stObj ? stObj->pt : NULL; 144} 145 146 147static INLINE struct pipe_resource * 148st_get_stobj_resource(struct st_texture_object *stObj) 149{ 150 return stObj ? stObj->pt : NULL; 151} 152 153 154static INLINE struct pipe_sampler_view * 155st_create_texture_sampler_view_format(struct pipe_context *pipe, 156 struct pipe_resource *texture, 157 enum pipe_format format) 158{ 159 struct pipe_sampler_view templ; 160 161 u_sampler_view_default_template(&templ, texture, format); 162 163 return pipe->create_sampler_view(pipe, texture, &templ); 164} 165 166static INLINE struct pipe_sampler_view * 167st_create_texture_sampler_view(struct pipe_context *pipe, 168 struct pipe_resource *texture) 169{ 170 return st_create_texture_sampler_view_format(pipe, texture, 171 texture->format); 172} 173 174 175 176extern struct pipe_resource * 177st_texture_create(struct st_context *st, 178 enum pipe_texture_target target, 179 enum pipe_format format, 180 GLuint last_level, 181 GLuint width0, 182 GLuint height0, 183 GLuint depth0, 184 GLuint layers, 185 GLuint nr_samples, 186 GLuint tex_usage ); 187 188 189extern void 190st_gl_texture_dims_to_pipe_dims(GLenum texture, 191 GLuint widthIn, 192 GLuint heightIn, 193 GLuint depthIn, 194 GLuint *widthOut, 195 GLuint *heightOut, 196 GLuint *depthOut, 197 GLuint *layersOut); 198 199/* Check if an image fits into an existing texture object. 200 */ 201extern GLboolean 202st_texture_match_image(struct st_context *st, 203 const struct pipe_resource *pt, 204 const struct gl_texture_image *image); 205 206/* Return a pointer to an image within a texture. Return image stride as 207 * well. 208 */ 209extern GLubyte * 210st_texture_image_map(struct st_context *st, struct st_texture_image *stImage, 211 enum pipe_transfer_usage usage, 212 GLuint x, GLuint y, GLuint z, 213 GLuint w, GLuint h, GLuint d, 214 struct pipe_transfer **transfer); 215 216extern void 217st_texture_image_unmap(struct st_context *st, 218 struct st_texture_image *stImage, unsigned slice); 219 220 221/* Return pointers to each 2d slice within an image. Indexed by depth 222 * value. 223 */ 224extern const GLuint * 225st_texture_depth_offsets(struct pipe_resource *pt, GLuint level); 226 227 228/* Upload an image into a texture 229 */ 230extern void 231st_texture_image_data(struct st_context *st, 232 struct pipe_resource *dst, 233 GLuint face, GLuint level, void *src, 234 GLuint src_row_pitch, GLuint src_image_pitch); 235 236 237/* Copy an image between two textures 238 */ 239extern void 240st_texture_image_copy(struct pipe_context *pipe, 241 struct pipe_resource *dst, GLuint dstLevel, 242 struct pipe_resource *src, GLuint srcLevel, 243 GLuint face); 244 245 246extern struct pipe_resource * 247st_create_color_map_texture(struct gl_context *ctx); 248 249extern struct pipe_sampler_view ** 250st_texture_get_sampler_view(struct st_context *st, 251 struct st_texture_object *stObj); 252 253extern void 254st_texture_release_sampler_view(struct st_context *st, 255 struct st_texture_object *stObj); 256 257extern void 258st_texture_release_all_sampler_views(struct st_context *st, 259 struct st_texture_object *stObj); 260 261void 262st_texture_free_sampler_views(struct st_texture_object *stObj); 263 264#endif 265