blob: 0ce79895625a98c6b45e1ea36f2831a38ff71b92 [file] [log] [blame]
Brian307fe072007-08-06 12:40:51 -06001/**************************************************************************
2 *
José Fonseca87712852014-01-17 16:27:50 +00003 * Copyright 2007 VMware, Inc.
Brian307fe072007-08-06 12:40:51 -06004 * 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.
José Fonseca87712852014-01-17 16:27:50 +000021 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
Brian307fe072007-08-06 12:40:51 -060022 * 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
Michel Dänzer753db0d2007-11-30 20:48:03 +010028#ifndef ST_TEXTURE_H
29#define ST_TEXTURE_H
Brian307fe072007-08-06 12:40:51 -060030
31
Michal Krolb8030c62010-03-12 14:37:36 +010032#include "pipe/p_context.h"
33#include "util/u_sampler.h"
34
Brian307fe072007-08-06 12:40:51 -060035#include "main/mtypes.h"
36
Brian Paul5d3d63d2010-04-18 17:55:23 -060037
Keith Whitwell287c94e2010-04-10 16:05:54 +010038struct pipe_resource;
Brian307fe072007-08-06 12:40:51 -060039
40
Marek Olšák463b0ea2014-08-02 20:31:07 +020041struct 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
Brian Paule648d4a2010-04-29 15:32:36 -060051/**
52 * Subclass of gl_texure_image.
53 */
Brian58edb062008-02-20 11:20:25 -070054struct st_texture_image
55{
56 struct gl_texture_image base;
57
Brian58edb062008-02-20 11:20:25 -070058 /* If stImage->pt != NULL, image data is stored here.
Brian58edb062008-02-20 11:20:25 -070059 * Else there is no image data.
60 */
Keith Whitwell287c94e2010-04-10 16:05:54 +010061 struct pipe_resource *pt;
Brian58edb062008-02-20 11:20:25 -070062
Marek Olšák26c41392014-03-10 18:43:17 +010063 /* List of transfers, allocated on demand.
64 * transfer[layer] is a mapping for that layer.
65 */
Marek Olšák463b0ea2014-08-02 20:31:07 +020066 struct st_texture_image_transfer *transfer;
Marek Olšák26c41392014-03-10 18:43:17 +010067 unsigned num_transfers;
Ilia Mirkind816a512016-07-08 02:44:57 -040068
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 };
Brian58edb062008-02-20 11:20:25 -070074
75
Brian Paule648d4a2010-04-29 15:32:36 -060076/**
77 * Subclass of gl_texure_object.
78 */
Brian58edb062008-02-20 11:20:25 -070079struct 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 */
Keith Whitwell287c94e2010-04-10 16:05:54 +010090 struct pipe_resource *pt;
Brian58edb062008-02-20 11:20:25 -070091
Christian König6c59be72014-03-25 17:31:49 +010092 /* 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.
Michal Krolb8030c62010-03-12 14:37:36 +010097 */
Christian König6c59be72014-03-25 17:31:49 +010098 struct pipe_sampler_view **sampler_views;
Michal Krolb8030c62010-03-12 14:37:36 +010099
Marek Olšák639d0f72013-05-10 02:03:15 +0200100 /* 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.
Chia-I Wu54a71152009-08-05 16:07:19 -0600103 */
104 GLboolean surface_based;
Marek Olšák639d0f72013-05-10 02:03:15 +0200105
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;
Brian Paule5cc84d2016-09-30 16:41:46 -0600110
Nicolai Hähnle322483f2016-11-03 21:49:40 +0100111 /* 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
Brian Paule5cc84d2016-09-30 16:41:46 -0600120 /** 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;
Brian58edb062008-02-20 11:20:25 -0700124};
125
126
Brian Paul164b3cd2015-02-26 10:03:22 -0700127static inline struct st_texture_image *
Brian Paul9d9143d2008-09-01 13:09:31 -0600128st_texture_image(struct gl_texture_image *img)
129{
130 return (struct st_texture_image *) img;
131}
132
Brian Paul164b3cd2015-02-26 10:03:22 -0700133static inline const struct st_texture_image *
Brian Paul58e8dd62015-01-02 16:56:12 -0700134st_texture_image_const(const struct gl_texture_image *img)
135{
136 return (const struct st_texture_image *) img;
137}
138
Brian Paul164b3cd2015-02-26 10:03:22 -0700139static inline struct st_texture_object *
Brian58edb062008-02-20 11:20:25 -0700140st_texture_object(struct gl_texture_object *obj)
141{
142 return (struct st_texture_object *) obj;
143}
144
Brian Paul164b3cd2015-02-26 10:03:22 -0700145static inline const struct st_texture_object *
Brian Paul31b0e7d2013-12-13 09:33:49 -0700146st_texture_object_const(const struct gl_texture_object *obj)
147{
148 return (const struct st_texture_object *) obj;
149}
150
Brian58edb062008-02-20 11:20:25 -0700151
Brian Paul164b3cd2015-02-26 10:03:22 -0700152static inline struct pipe_resource *
Brian Paulc3016dc2010-04-18 17:58:44 -0600153st_get_texobj_resource(struct gl_texture_object *texObj)
Brian58edb062008-02-20 11:20:25 -0700154{
155 struct st_texture_object *stObj = st_texture_object(texObj);
156 return stObj ? stObj->pt : NULL;
157}
158
159
Brian Paul164b3cd2015-02-26 10:03:22 -0700160static inline struct pipe_resource *
Brian Paul1aaf41f2010-04-18 18:01:04 -0600161st_get_stobj_resource(struct st_texture_object *stObj)
Brian58edb062008-02-20 11:20:25 -0700162{
163 return stObj ? stObj->pt : NULL;
164}
165
Brian58edb062008-02-20 11:20:25 -0700166
Rob Clarkecd6fce2016-08-31 17:44:01 -0400167static inline struct st_texture_object *
168st_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
181static inline enum pipe_format
182st_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}
Brian Paul9600b072012-02-13 14:51:14 -0700188
Brian Paulf579a052011-01-20 08:38:19 -0700189
Keith Whitwell287c94e2010-04-10 16:05:54 +0100190extern struct pipe_resource *
Michel Dänzer753db0d2007-11-30 20:48:03 +0100191st_texture_create(struct st_context *st,
Michel Dänzer1c5f27a2008-01-04 17:06:55 +0100192 enum pipe_texture_target target,
193 enum pipe_format format,
Brian0790d9a2007-08-06 15:49:00 -0600194 GLuint last_level,
195 GLuint width0,
196 GLuint height0,
197 GLuint depth0,
Brian Pauldb3a8af2011-01-28 20:25:26 -0700198 GLuint layers,
Dave Airlief152da62013-03-04 06:17:11 +1000199 GLuint nr_samples,
Keith Whitwella73ae3d2008-05-02 16:46:31 +0100200 GLuint tex_usage );
Brian307fe072007-08-06 12:40:51 -0600201
Brian307fe072007-08-06 12:40:51 -0600202
Brian Paul1dd8e272011-01-28 20:25:27 -0700203extern void
204st_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
Briana4fbf092008-02-05 17:55:16 -0700213/* Check if an image fits into an existing texture object.
Brian307fe072007-08-06 12:40:51 -0600214 */
Brian0790d9a2007-08-06 15:49:00 -0600215extern GLboolean
Marek Olšák547e2882014-08-02 21:00:41 +0200216st_texture_match_image(struct st_context *st,
217 const struct pipe_resource *pt,
Brian Paul7276ab22011-09-22 16:32:49 -0600218 const struct gl_texture_image *image);
Brian307fe072007-08-06 12:40:51 -0600219
Michel Dänzer753db0d2007-11-30 20:48:03 +0100220/* Return a pointer to an image within a texture. Return image stride as
Brian307fe072007-08-06 12:40:51 -0600221 * well.
222 */
Brian0790d9a2007-08-06 15:49:00 -0600223extern GLubyte *
Marek Olšáked868092012-12-20 15:15:15 +0100224st_texture_image_map(struct st_context *st, struct st_texture_image *stImage,
Michel Dänzer46179812009-02-05 19:41:18 +0100225 enum pipe_transfer_usage usage,
Marek Olšáked868092012-12-20 15:15:15 +0100226 GLuint x, GLuint y, GLuint z,
Marek Olšák26c41392014-03-10 18:43:17 +0100227 GLuint w, GLuint h, GLuint d,
228 struct pipe_transfer **transfer);
Brian307fe072007-08-06 12:40:51 -0600229
Brian0790d9a2007-08-06 15:49:00 -0600230extern void
Keith Whitwellc9ed86a2008-05-01 11:07:21 +0100231st_texture_image_unmap(struct st_context *st,
Marek Olšák26c41392014-03-10 18:43:17 +0100232 struct st_texture_image *stImage, unsigned slice);
Brian0790d9a2007-08-06 15:49:00 -0600233
234
235/* Return pointers to each 2d slice within an image. Indexed by depth
236 * value.
237 */
238extern const GLuint *
Keith Whitwell287c94e2010-04-10 16:05:54 +0100239st_texture_depth_offsets(struct pipe_resource *pt, GLuint level);
Brian307fe072007-08-06 12:40:51 -0600240
Michel Dänzer753db0d2007-11-30 20:48:03 +0100241/* Copy an image between two textures
Brian307fe072007-08-06 12:40:51 -0600242 */
Brian0790d9a2007-08-06 15:49:00 -0600243extern void
Michel Dänzer753db0d2007-11-30 20:48:03 +0100244st_texture_image_copy(struct pipe_context *pipe,
Keith Whitwell287c94e2010-04-10 16:05:54 +0100245 struct pipe_resource *dst, GLuint dstLevel,
Brian Paulc6fdb952010-05-04 17:25:33 -0600246 struct pipe_resource *src, GLuint srcLevel,
Brian4da1cdf2008-02-12 14:53:25 -0700247 GLuint face);
Brian307fe072007-08-06 12:40:51 -0600248
Bryan Cain9adcab92011-08-04 10:15:54 -0500249
250extern struct pipe_resource *
251st_create_color_map_texture(struct gl_context *ctx);
252
Brian Paulf9985db2014-04-09 19:22:11 -0600253
Ilia Mirkin7727e6f2016-07-07 23:59:03 -0400254bool
255st_etc_fallback(struct st_context *st, struct gl_texture_image *texImage);
256
Brian307fe072007-08-06 12:40:51 -0600257#endif