9afbb0c865bc79f0b7500d5e3b371fdca7beba91
[mesa.git] / src / mesa / drivers / dri / common / texmem.h
1 /*
2 * Copyright 2000-2001 VA Linux Systems, Inc.
3 * (c) Copyright IBM Corporation 2002
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 "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * on the rights to use, copy, modify, merge, publish, distribute, sub
10 * license, and/or sell copies of the Software, and to permit persons to whom
11 * the Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
15 * Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
20 * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
23 * USE OR OTHER DEALINGS IN THE SOFTWARE.
24 *
25 * Authors:
26 * Ian Romanick <idr@us.ibm.com>
27 * Keith Whitwell <keithw@tungstengraphics.com>
28 * Kevin E. Martin <kem@users.sourceforge.net>
29 * Gareth Hughes <gareth@nvidia.com>
30 */
31 /* $XFree86:$ */
32
33 /** \file texmem.h
34 * Public interface to the DRI texture memory management routines.
35 *
36 * \sa texmem.c
37 */
38
39 #ifndef DRI_TEXMEM_H
40 #define DRI_TEXMEM_H
41
42 #include "mtypes.h"
43 #include "mm.h"
44 #include "xf86drm.h"
45
46 struct dri_tex_heap;
47 typedef struct dri_tex_heap driTexHeap;
48
49 struct dri_texture_object;
50 typedef struct dri_texture_object driTextureObject;
51
52
53 /**
54 * Base texture object type. Each driver will extend this type with its own
55 * private data members.
56 */
57
58 struct dri_texture_object {
59 struct dri_texture_object * next;
60 struct dri_texture_object * prev;
61
62 driTexHeap * heap; /**< Texture heap currently stored in */
63 struct gl_texture_object * tObj;/**< Pointer to Mesa texture object
64 * If NULL, this texture object is a
65 * "placeholder" object representing
66 * texture memory in use by another context.
67 * A placeholder should have a heap and a memBlock.
68 */
69 PMemBlock memBlock; /**< Memory block containing texture */
70 unsigned bound; /**< Texture unit currently bound to */
71
72 unsigned totalSize; /**< Total size of the texture,
73 * including all mipmap levels
74 */
75
76 unsigned dirty_images[6]; /**< Flags for whether or not images
77 * need to be uploaded to local or
78 * AGP texture space. One flag set
79 * for each cube face for cubic
80 * textures. Bit zero corresponds to
81 * the base-level, which may or may
82 * not be the level zero mipmap.
83 */
84
85 unsigned timestamp; /**< Timestamp used to
86 * synchronize with 3d engine
87 * in hardware where textures
88 * are uploaded directly to
89 * the framebuffer.
90 */
91
92 unsigned firstLevel; /**< Image in \c tObj->Image that
93 * corresponds to the base-level of
94 * this texture object.
95 */
96
97 unsigned lastLevel; /**< Last image in \c tObj->Image used
98 * by the current LOD settings of this
99 * texture object. This value must be
100 * greater than or equal to
101 * \c firstLevel.
102 */
103 };
104
105
106 typedef void (destroy_texture_object_t)( void * driverContext,
107 driTextureObject * t );
108
109 /**
110 * Client-private representation of texture memory state.
111 *
112 * Clients will place one or more of these structs in their driver
113 * context struct to manage one or more global texture heaps.
114 */
115
116 struct dri_tex_heap {
117
118 /** Client-supplied heap identifier
119 */
120 unsigned heapId;
121
122 /** Pointer to the client's private context
123 */
124 void *driverContext;
125
126 /** Total size of the heap, in bytes
127 */
128 unsigned size;
129
130 /** \brief \f$log_2\f$ of size of single heap region
131 *
132 * Each context takes memory from the global texture heap in
133 * \f$2^{logGranularity}\f$ byte blocks. The value of
134 * \a logGranularity is based on the amount of memory represented
135 * by the heap and the maximum number of regions in the SAREA. Given
136 * \a b bytes of texture memory an \a n regions in the SAREA,
137 * \a logGranularity will be \f$\lfloor\log_2( b / n )\rfloor\f$.
138 */
139 unsigned logGranularity;
140
141 /** \brief Required alignment of allocations in this heap
142 *
143 * The alignment shift is supplied to \a mmAllocMem when memory is
144 * allocated from this heap. The value of \a alignmentShift will
145 * typically reflect some require of the hardware. This value has
146 * \b no \b relation to \a logGranularity. \a alignmentShift is a
147 * per-context value.
148 *
149 * \sa mmAllocMem
150 */
151 unsigned alignmentShift;
152
153 /** Number of elements in global list (the SAREA).
154 */
155 unsigned nrRegions;
156
157 /** Pointer to SAREA \a driTexRegion array
158 */
159 drmTextureRegionPtr global_regions;
160
161 /** Pointer to the texture state age (generation number) in the SAREA
162 */
163 unsigned * global_age;
164
165 /** Local age (generation number) of texture state
166 */
167 unsigned local_age;
168
169 /** Memory heap used to manage texture memory represented by
170 * this texture heap.
171 */
172 memHeap_t * memory_heap;
173
174 /** List of objects that we currently believe to be in texture
175 * memory.
176 */
177 driTextureObject texture_objects;
178
179 /** Pointer to the list of texture objects that are not in
180 * texture memory.
181 */
182 driTextureObject * swapped_objects;
183
184 /** Size of the driver-speicific texture object.
185 */
186 unsigned texture_object_size;
187
188
189 /**
190 * \brief Function to destroy driver-specific texture object data.
191 *
192 * This function is supplied by the driver so that the texture manager
193 * can release all resources associated with a texture object. This
194 * function should only release driver-specific data. That is,
195 * \a driDestroyTextureObject will release the texture memory
196 * associated with the texture object, it will release the memory
197 * for the texture object itself, and it will unlink the texture
198 * object from the texture object lists.
199 *
200 * \param driverContext Pointer to the driver supplied context
201 * \param t Texture object that is to be destroyed
202 * \sa driDestroyTextureObject
203 */
204
205 destroy_texture_object_t * destroy_texture_object;
206
207
208 /**
209 */
210 unsigned * texture_swaps;
211
212 /**
213 * Timestamp used to synchronize with 3d engine in hardware
214 * where textures are uploaded directly to the
215 * framebuffer.
216 */
217 unsigned timestamp;
218 };
219
220
221
222
223 /**
224 * Called by the client on lock contention to determine whether textures have
225 * been stolen. If another client has modified a region in which we have
226 * textures, then we need to figure out which of our textures have been
227 * removed and update our global LRU.
228 *
229 * \param heap Texture heap to be updated
230 * \hideinitializer
231 */
232
233 #define DRI_AGE_TEXTURES( heap ) \
234 do { \
235 if ( ((heap) != NULL) \
236 && ((heap)->local_age != (heap)->global_age[0]) ) \
237 driAgeTextures( heap ); \
238 } while( 0 )
239
240
241
242
243 /* This should be called whenever there has been contention on the hardware
244 * lock. driAgeTextures should not be called directly. Instead, clients
245 * should use DRI_AGE_TEXTURES, above.
246 */
247
248 void driAgeTextures( driTexHeap * heap );
249
250 void driUpdateTextureLRU( driTextureObject * t );
251 void driSwapOutTextureObject( driTextureObject * t );
252 void driDestroyTextureObject( driTextureObject * t );
253 int driAllocateTexture( driTexHeap * const * heap_array, unsigned nr_heaps,
254 driTextureObject * t );
255
256 GLboolean driIsTextureResident( GLcontext * ctx,
257 struct gl_texture_object * texObj );
258
259 driTexHeap * driCreateTextureHeap( unsigned heap_id, void * context,
260 unsigned size, unsigned alignmentShift, unsigned nr_regions,
261 drmTextureRegionPtr global_regions, unsigned * global_age,
262 driTextureObject * swapped_objects, unsigned texture_object_size,
263 destroy_texture_object_t * destroy_tex_obj );
264 void driDestroyTextureHeap( driTexHeap * heap );
265
266 void
267 driCalculateMaxTextureLevels( driTexHeap * const * heaps,
268 unsigned nr_heaps,
269 struct gl_constants * limits,
270 unsigned max_bytes_per_texel,
271 unsigned max_2D_size,
272 unsigned max_3D_size,
273 unsigned max_cube_size,
274 unsigned max_rect_size,
275 unsigned mipmaps_at_once,
276 int all_textures_one_heap );
277
278 void
279 driSetTextureSwapCounterLocation( driTexHeap * heap, unsigned * counter );
280
281 #define DRI_TEXMGR_DO_TEXTURE_1D 0x0001
282 #define DRI_TEXMGR_DO_TEXTURE_2D 0x0002
283 #define DRI_TEXMGR_DO_TEXTURE_3D 0x0004
284 #define DRI_TEXMGR_DO_TEXTURE_CUBE 0x0008
285 #define DRI_TEXMGR_DO_TEXTURE_RECT 0x0010
286
287 void driInitTextureObjects( GLcontext *ctx, driTextureObject * swapped,
288 GLuint targets );
289
290 GLboolean driValidateTextureHeaps( driTexHeap * const * texture_heaps,
291 unsigned nr_heaps, const driTextureObject * swapped );
292
293 extern void driCalculateTextureFirstLastLevel( driTextureObject * t );
294
295 #endif /* DRI_TEXMEM_H */