diff options
Diffstat (limited to 'src/mesa/pipe/nv40/nv40_miptree.c')
-rw-r--r-- | src/mesa/pipe/nv40/nv40_miptree.c | 69 |
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; } |