ecdb7be244f3b779987527819b9dc4218c385596
[mesa.git] / src / mesa / drivers / dri / intel / intel_mipmap_tree.h
1 /**************************************************************************
2 *
3 * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
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 TUNGSTEN GRAPHICS 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 INTEL_MIPMAP_TREE_H
29 #define INTEL_MIPMAP_TREE_H
30
31 #include "intel_regions.h"
32
33 /* A layer on top of the intel_regions code which adds:
34 *
35 * - Code to size and layout a region to hold a set of mipmaps.
36 * - Query to determine if a new image fits in an existing tree.
37 * - More refcounting
38 * - maybe able to remove refcounting from intel_region?
39 * - ?
40 *
41 * The fixed mipmap layout of intel hardware where one offset
42 * specifies the position of all images in a mipmap hierachy
43 * complicates the implementation of GL texture image commands,
44 * compared to hardware where each image is specified with an
45 * independent offset.
46 *
47 * In an ideal world, each texture object would be associated with a
48 * single bufmgr buffer or 2d intel_region, and all the images within
49 * the texture object would slot into the tree as they arrive. The
50 * reality can be a little messier, as images can arrive from the user
51 * with sizes that don't fit in the existing tree, or in an order
52 * where the tree layout cannot be guessed immediately.
53 *
54 * This structure encodes an idealized mipmap tree. The GL image
55 * commands build these where possible, otherwise store the images in
56 * temporary system buffers.
57 */
58
59
60 /**
61 * Describes the location of each texture image within a texture region.
62 */
63 struct intel_mipmap_level
64 {
65 GLuint level_offset;
66 GLuint width;
67 GLuint height;
68 GLuint depth;
69 GLuint nr_images;
70
71 /* Explicitly store the offset of each image for each cube face or
72 * depth value. Pretty much have to accept that hardware formats
73 * are going to be so diverse that there is no unified way to
74 * compute the offsets of depth/cube images within a mipmap level,
75 * so have to store them as a lookup table:
76 */
77 GLuint *image_offset;
78 };
79
80 struct intel_mipmap_tree
81 {
82 /* Effectively the key:
83 */
84 GLenum target;
85 GLenum internal_format;
86
87 GLuint first_level;
88 GLuint last_level;
89
90 GLuint width0, height0, depth0; /**< Level zero image dimensions */
91 GLuint cpp;
92 GLboolean compressed;
93
94 /* Derived from the above:
95 */
96 GLuint pitch;
97 GLuint depth_pitch; /* per-image on i945? */
98 GLuint total_height;
99
100 /* Includes image offset tables:
101 */
102 struct intel_mipmap_level level[MAX_TEXTURE_LEVELS];
103
104 /* The data is held here:
105 */
106 struct intel_region *region;
107
108 /* These are also refcounted:
109 */
110 GLuint refcount;
111 };
112
113
114
115 struct intel_mipmap_tree *intel_miptree_create(struct intel_context *intel,
116 GLenum target,
117 GLenum internal_format,
118 GLuint first_level,
119 GLuint last_level,
120 GLuint width0,
121 GLuint height0,
122 GLuint depth0,
123 GLuint cpp,
124 GLuint compress_byte);
125
126 void intel_miptree_reference(struct intel_mipmap_tree **dst,
127 struct intel_mipmap_tree *src);
128
129 void intel_miptree_release(struct intel_context *intel,
130 struct intel_mipmap_tree **mt);
131
132 /* Check if an image fits an existing mipmap tree layout
133 */
134 GLboolean intel_miptree_match_image(struct intel_mipmap_tree *mt,
135 struct gl_texture_image *image,
136 GLuint face, GLuint level);
137
138 /* Return a pointer to an image within a tree. Return image stride as
139 * well.
140 */
141 GLubyte *intel_miptree_image_map(struct intel_context *intel,
142 struct intel_mipmap_tree *mt,
143 GLuint face,
144 GLuint level,
145 GLuint * row_stride, GLuint * image_stride);
146
147 void intel_miptree_image_unmap(struct intel_context *intel,
148 struct intel_mipmap_tree *mt);
149
150
151 /* Return the linear offset of an image relative to the start of the
152 * tree:
153 */
154 GLuint intel_miptree_image_offset(struct intel_mipmap_tree *mt,
155 GLuint face, GLuint level);
156
157 /* Return pointers to each 2d slice within an image. Indexed by depth
158 * value.
159 */
160 const GLuint *intel_miptree_depth_offsets(struct intel_mipmap_tree *mt,
161 GLuint level);
162
163
164 void intel_miptree_set_level_info(struct intel_mipmap_tree *mt,
165 GLuint level,
166 GLuint nr_images,
167 GLuint x, GLuint y,
168 GLuint w, GLuint h, GLuint d);
169
170 void intel_miptree_set_image_offset(struct intel_mipmap_tree *mt,
171 GLuint level,
172 GLuint img, GLuint x, GLuint y);
173
174
175 /* Upload an image into a tree
176 */
177 void intel_miptree_image_data(struct intel_context *intel,
178 struct intel_mipmap_tree *dst,
179 GLuint face,
180 GLuint level,
181 void *src,
182 GLuint src_row_pitch, GLuint src_image_pitch);
183
184 /* Copy an image between two trees
185 */
186 void intel_miptree_image_copy(struct intel_context *intel,
187 struct intel_mipmap_tree *dst,
188 GLuint face, GLuint level,
189 struct intel_mipmap_tree *src);
190
191 /* i915_mipmap_tree.c:
192 */
193 GLboolean i915_miptree_layout(struct intel_mipmap_tree *mt);
194 GLboolean i945_miptree_layout(struct intel_mipmap_tree *mt);
195
196
197
198 #endif