X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_texture.h;h=d66afcb560bc47b6abf0c81c57baea3707cb43d6;hb=bd502139290ea902cbc4b5f535c102f8f98774b1;hp=d50c3c9af79a01b743d0f109b1afa58b548bd5d8;hpb=213b9004a6ee033a16af3dcd187aa68b56c39858;p=mesa.git diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h index d50c3c9af79..d66afcb560b 100644 --- a/src/mesa/state_tracker/st_texture.h +++ b/src/mesa/state_tracker/st_texture.h @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. + * Copyright 2007 VMware, Inc. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a @@ -18,7 +18,7 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -38,6 +38,16 @@ struct pipe_resource; +struct st_texture_image_transfer { + struct pipe_transfer *transfer; + + /* For ETC fallback. */ + GLubyte *temp_data; /**< Temporary ETC texture storage. */ + unsigned temp_stride; /**< Stride of the ETC texture storage. */ + GLubyte *map; /**< Saved map pointer of the uncompressed transfer. */ +}; + + /** * Subclass of gl_texure_image. */ @@ -45,18 +55,22 @@ struct st_texture_image { struct gl_texture_image base; - /* These aren't stored in gl_texture_image + /** Used to store texture data that doesn't fit in the parent + * object's mipmap buffer. */ - GLuint level; - GLuint face; + GLubyte *TexData; /* If stImage->pt != NULL, image data is stored here. - * Else if stImage->base.Data != NULL, image is stored there. + * Else if stImage->TexData != NULL, image is stored there. * Else there is no image data. */ struct pipe_resource *pt; - struct pipe_transfer *transfer; + /* List of transfers, allocated on demand. + * transfer[layer] is a mapping for that layer. + */ + struct st_texture_image_transfer *transfer; + unsigned num_transfers; }; @@ -82,15 +96,24 @@ struct st_texture_object */ struct pipe_resource *pt; - /* Default sampler view attached to this texture object. Created lazily - * on first binding. + /* Number of views in sampler_views array */ + GLuint num_sampler_views; + + /* Array of sampler views (one per context) attached to this texture + * object. Created lazily on first binding in context. */ - struct pipe_sampler_view *sampler_view; + struct pipe_sampler_view **sampler_views; - /* True if there is/was a surface bound to this texture object. It helps - * track whether the texture object is surface based or not. + /* 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 + * view or a surface. */ GLboolean surface_based; + + /* If surface_based is true, this format should be used for all sampler + * views and surfaces instead of pt->format. + */ + enum pipe_format surface_format; }; @@ -106,6 +129,12 @@ st_texture_object(struct gl_texture_object *obj) return (struct st_texture_object *) obj; } +static INLINE const struct st_texture_object * +st_texture_object_const(const struct gl_texture_object *obj) +{ + return (const struct st_texture_object *) obj; +} + static INLINE struct pipe_resource * st_get_texobj_resource(struct gl_texture_object *texObj) @@ -122,18 +151,6 @@ st_get_stobj_resource(struct st_texture_object *stObj) } -static INLINE struct pipe_sampler_view * -st_create_texture_sampler_view(struct pipe_context *pipe, - struct pipe_resource *texture) -{ - struct pipe_sampler_view templ; - - u_sampler_view_default_template(&templ, texture, texture->format); - - return pipe->create_sampler_view(pipe, texture, &templ); -} - - static INLINE struct pipe_sampler_view * st_create_texture_sampler_view_format(struct pipe_context *pipe, struct pipe_resource *texture, @@ -146,23 +163,16 @@ st_create_texture_sampler_view_format(struct pipe_context *pipe, return pipe->create_sampler_view(pipe, texture, &templ); } - static INLINE struct pipe_sampler_view * -st_get_texture_sampler_view(struct st_texture_object *stObj, - struct pipe_context *pipe) +st_create_texture_sampler_view(struct pipe_context *pipe, + struct pipe_resource *texture) { - if (!stObj || !stObj->pt) { - return NULL; - } - - if (!stObj->sampler_view) { - stObj->sampler_view = st_create_texture_sampler_view(pipe, stObj->pt); - } - - return stObj->sampler_view; + return st_create_texture_sampler_view_format(pipe, texture, + texture->format); } + extern struct pipe_resource * st_texture_create(struct st_context *st, enum pipe_texture_target target, @@ -172,6 +182,7 @@ st_texture_create(struct st_context *st, GLuint height0, GLuint depth0, GLuint layers, + GLuint nr_samples, GLuint tex_usage ); @@ -188,24 +199,23 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, /* Check if an image fits into an existing texture object. */ extern GLboolean -st_texture_match_image(const struct pipe_resource *pt, - const struct gl_texture_image *image, - GLuint face, GLuint level); +st_texture_match_image(struct st_context *st, + const struct pipe_resource *pt, + const struct gl_texture_image *image); /* Return a pointer to an image within a texture. Return image stride as * well. */ extern GLubyte * -st_texture_image_map(struct st_context *st, - struct st_texture_image *stImage, - GLuint zoffset, +st_texture_image_map(struct st_context *st, struct st_texture_image *stImage, enum pipe_transfer_usage usage, - unsigned x, unsigned y, - unsigned w, unsigned h); + GLuint x, GLuint y, GLuint z, + GLuint w, GLuint h, GLuint d, + struct pipe_transfer **transfer); extern void st_texture_image_unmap(struct st_context *st, - struct st_texture_image *stImage); + struct st_texture_image *stImage, unsigned slice); /* Return pointers to each 2d slice within an image. Indexed by depth @@ -232,4 +242,23 @@ st_texture_image_copy(struct pipe_context *pipe, struct pipe_resource *src, GLuint srcLevel, GLuint face); + +extern struct pipe_resource * +st_create_color_map_texture(struct gl_context *ctx); + +extern struct pipe_sampler_view ** +st_texture_get_sampler_view(struct st_context *st, + struct st_texture_object *stObj); + +extern void +st_texture_release_sampler_view(struct st_context *st, + struct st_texture_object *stObj); + +extern void +st_texture_release_all_sampler_views(struct st_context *st, + struct st_texture_object *stObj); + +void +st_texture_free_sampler_views(struct st_texture_object *stObj); + #endif