summaryrefslogtreecommitdiff
path: root/src/mesa/pipe/nv40/nv40_miptree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/pipe/nv40/nv40_miptree.c')
-rw-r--r--src/mesa/pipe/nv40/nv40_miptree.c69
1 files changed, 38 insertions, 31 deletions
diff --git a/src/mesa/pipe/nv40/nv40_miptree.c b/src/mesa/pipe/nv40/nv40_miptree.c
index 2d8ef8ced7..15639f01e9 100644
--- a/src/mesa/pipe/nv40/nv40_miptree.c
+++ b/src/mesa/pipe/nv40/nv40_miptree.c
@@ -8,53 +8,60 @@ boolean
nv40_miptree_layout(struct pipe_context *pipe, struct pipe_mipmap_tree *mt)
{
struct nv40_context *nv40 = (struct nv40_context *)pipe;
- uint width, height, depth, offset;
boolean swizzled = FALSE;
- int l;
+ uint width = mt->width0, height = mt->height0, depth = mt->depth0;
+ uint offset;
+ int nr_faces, l, f;
mt->pitch = mt->width0;
mt->total_height = 0;
- width = mt->width0;
- height = mt->height0;
- depth = mt->depth0;
- offset = 0;
- for (l = mt->first_level; l <= mt->last_level; l++) {
- uint pitch, f;
+ if (mt->target == PIPE_TEXTURE_CUBE) {
+ nr_faces = 6;
+ } else
+ if (mt->target == PIPE_TEXTURE_3D) {
+ nr_faces = mt->depth0;
+ } else {
+ nr_faces = 1;
+ }
+ for (l = mt->first_level; l <= mt->last_level; l++) {
mt->level[l].width = width;
mt->level[l].height = height;
mt->level[l].depth = depth;
- mt->level[l].level_offset = offset;
-
- if (!swizzled)
- pitch = mt->width0;
- else
- pitch = width;
-
- if (mt->target == PIPE_TEXTURE_CUBE)
- mt->level[l].nr_images = 6;
- else
- if (mt->target == PIPE_TEXTURE_3D)
- mt->level[l].nr_images = mt->level[l].depth;
- else
- mt->level[l].nr_images = 1;
- mt->level[l].image_offset =
- malloc(mt->level[l].nr_images * sizeof(unsigned));
-
- for (f = 0; f < mt->level[l].nr_images; f++) {
- mt->level[l].image_offset[f] =
- (offset - mt->level[l].level_offset) / mt->cpp;
- mt->total_height += height;
+ mt->level[l].level_offset = 0;
- offset += (pitch * mt->cpp * height);
- }
+ mt->level[l].nr_images = nr_faces;
+ mt->level[l].image_offset = malloc(nr_faces * sizeof(unsigned));
+ for (f = 0; f < nr_faces; f++)
+ mt->total_height += height;
width = MAX2(1, width >> 1);
height = MAX2(1, height >> 1);
depth = MAX2(1, depth >> 1);
}
+ offset = 0;
+ for (f = 0; f < nr_faces; f++) {
+ for (l = mt->first_level; l <= mt->last_level; l++) {
+ if (f == 0) {
+ mt->level[l].level_offset = offset;
+ }
+
+ uint pitch;
+
+ if (swizzled)
+ pitch = mt->level[l].width * mt->cpp;
+ else
+ pitch = mt->width0 * mt->cpp;
+ pitch = (pitch + 63) & ~63;
+
+ mt->level[l].image_offset[f] =
+ (offset - mt->level[l].level_offset) / mt->cpp;
+ offset += pitch * mt->level[l].height;
+ }
+ }
+
return TRUE;
}