1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** @file i915_tex_layout.c
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Code to layout images in a mipmap tree for i830M-GM915 and G945 and beyond.
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_mipmap_tree.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_tex_layout.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "intel_context.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FILE_DEBUG_FLAG DEBUG_TEXTURE
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint initial_offsets[6][2] = {
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_POS_X] = {0, 0},
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_POS_Y] = {1, 0},
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_POS_Z] = {1, 1},
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_NEG_X] = {0, 2},
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_NEG_Y] = {1, 2},
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_NEG_Z] = {1, 3},
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint step_offsets[6][2] = {
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_POS_X] = {0, 2},
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_POS_Y] = {-1, 2},
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_POS_Z] = {-1, 1},
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_NEG_X] = {0, 2},
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_NEG_Y] = {-1, 2},
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_NEG_Z] = {-1, 1},
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLint bottom_offsets[6] = {
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_POS_X] = 16 + 0 * 8,
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_POS_Y] = 16 + 1 * 8,
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_POS_Z] = 16 + 2 * 8,
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_NEG_X] = 16 + 3 * 8,
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_NEG_Y] = 16 + 4 * 8,
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   [FACE_NEG_Z] = 16 + 5 * 8,
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Cube texture map layout for i830M-GM915 and
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * non-compressed cube texture map on GM945.
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Hardware layout looks like:
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +-------+-------+
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |  +x   |  +y   |
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +---+---+-------+
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * | +x| +y|       |
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +-+-+---+  +z   |
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * | | |   |       |
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +-+-+ +z|       |
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   | |   |       |
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +-+-+---+-------+
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |  -x   |  -y   |
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +---+---+-------+
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * | -x| -y|       |
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +-+-+---+  -z   |
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * | | |   |       |
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +-+-+ -z|       |
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   | |   |       |
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   +-+---+-------+
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_miptree_layout_cube(struct intel_mipmap_tree * mt)
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint dim = mt->width0;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint face;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint lvlWidth = mt->width0, lvlHeight = mt->height0;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint level;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(lvlWidth == lvlHeight); /* cubemap images are square */
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* double pitch for cube layouts */
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->total_width = dim * 2;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->total_height = dim * 4;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (level = mt->first_level; level <= mt->last_level; level++) {
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_set_level_info(mt, level,
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   0, 0,
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   lvlWidth, lvlHeight,
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   6);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      lvlWidth /= 2;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      lvlHeight /= 2;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (face = 0; face < 6; face++) {
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint x = initial_offsets[face][0] * dim;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint y = initial_offsets[face][1] * dim;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint d = dim;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (level = mt->first_level; level <= mt->last_level; level++) {
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_miptree_set_image_offset(mt, level, face, x, y);
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (d == 0)
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    printf("cube mipmap %d/%d (%d..%d) is 0x0\n",
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   face, level, mt->first_level, mt->last_level);
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 d >>= 1;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 x += step_offsets[face][0] * d;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 y += step_offsets[face][1] * d;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_miptree_layout_3d(struct intel_mipmap_tree * mt)
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint width = mt->width0;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint height = mt->height0;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint depth = mt->depth0;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint stack_height = 0;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint level;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Calculate the size of a single slice. */
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->total_width = mt->width0;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX: hardware expects/requires 9 levels at minimum. */
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (level = mt->first_level; level <= MAX2(8, mt->last_level); level++) {
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_set_level_info(mt, level, 0, mt->total_height,
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   width, height, depth);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stack_height += MAX2(2, height);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      width = minify(width);
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      height = minify(height);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depth = minify(depth);
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Fixup depth image_offsets: */
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   depth = mt->depth0;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (level = mt->first_level; level <= mt->last_level; level++) {
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < depth; i++) {
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_miptree_set_image_offset(mt, level, i,
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					0, i * stack_height);
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depth = minify(depth);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Multiply slice size by texture depth for total size.  It's
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * remarkable how wasteful of memory the i915 texture layouts
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * are.  They are largely fixed in the i945.
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->total_height = stack_height * mt->depth0;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_miptree_layout_2d(struct intel_mipmap_tree * mt)
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint width = mt->width0;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint height = mt->height0;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint img_height;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint level;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->total_width = mt->width0;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->total_height = 0;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (level = mt->first_level; level <= mt->last_level; level++) {
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_set_level_info(mt, level,
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   0, mt->total_height,
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   width, height, 1);
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mt->compressed)
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 img_height = ALIGN(height, 4) / 4;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 img_height = ALIGN(height, 2);
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->total_height += img_height;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      width = minify(width);
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      height = minify(height);
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi915_miptree_layout(struct intel_mipmap_tree * mt)
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mt->target) {
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP:
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i915_miptree_layout_cube(mt);
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i915_miptree_layout_3d(mt);
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D:
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_RECTANGLE_ARB:
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i915_miptree_layout_2d(mt);
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(NULL, "Unexpected tex target in i915_miptree_layout()");
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s: %dx%dx%d\n", __FUNCTION__,
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       mt->total_width, mt->total_height, mt->cpp);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compressed cube texture map layout for GM945 and later.
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The hardware layout looks like the 830-915 layout, except for the small
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * sizes.  A zoomed in view of the layout for 945 is:
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +-------+-------+
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |  8x8  |  8x8  |
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |  +x   |  +y   |
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +---+---+-------+
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |4x4|   |  8x8  |
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * | +x|   |       |
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +---+   |  +z   |
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |4x4|   |       |
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * | +y|   |       |
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +---+   +-------+
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ...
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +-------+-------+
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |  8x8  |  8x8  |
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |  -x   |  -y   |
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |       |       |
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +---+---+-------+
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |4x4|   |  8x8  |
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * | -x|   |       |
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +---+   |  -z   |
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |4x4|   |       |
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * | -y|   |       |
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |       |
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +---+   +---+---+---+---+---+---+---+---+---+
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |4x4|   |4x4|   |2x2|   |2x2|   |2x2|   |2x2|
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * | +z|   | -z|   | +x|   | +y|   | +z|   | -x| ...
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * |   |   |   |   |   |   |   |   |   |   |   |
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * +---+   +---+   +---+   +---+   +---+   +---+
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The bottom row continues with the remaining 2x2 then the 1x1 mip contents
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in order, with each of them aligned to a 8x8 block boundary.  Thus, for
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 32x32 cube maps and smaller, the bottom row layout is going to dictate the
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pitch of the tree.  For a tree with 4x4 images, the pitch is at least
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14 * 8 = 112 texels, for 2x2 it is at least 12 * 8 texels, and for 1x1
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it is 6 * 8 texels.
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi945_miptree_layout_cube(struct intel_mipmap_tree * mt)
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint dim = mt->width0;
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint face;
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint lvlWidth = mt->width0, lvlHeight = mt->height0;
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint level;
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(lvlWidth == lvlHeight); /* cubemap images are square */
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Depending on the size of the largest images, pitch can be
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * determined either by the old-style packing of cubemap faces,
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * or the final row of 4x4, 2x2 and 1x1 faces below this.
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dim > 32)
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->total_width = dim * 2;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->total_width = 14 * 8;
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dim >= 4)
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->total_height = dim * 4 + 4;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->total_height = 4;
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Set all the levels to effectively occupy the whole rectangular region. */
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (level = mt->first_level; level <= mt->last_level; level++) {
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_set_level_info(mt, level,
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   0, 0,
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   lvlWidth, lvlHeight, 6);
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      lvlWidth /= 2;
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      lvlHeight /= 2;
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (face = 0; face < 6; face++) {
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint x = initial_offsets[face][0] * dim;
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint y = initial_offsets[face][1] * dim;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint d = dim;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dim == 4 && face >= 4) {
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 y = mt->total_height - 4;
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 x = (face - 4) * 8;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else if (dim < 4 && (face > 0 || mt->first_level > 0)) {
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 y = mt->total_height - 4;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 x = face * 8;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (level = mt->first_level; level <= mt->last_level; level++) {
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 intel_miptree_set_image_offset(mt, level, face, x, y);
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 d >>= 1;
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 switch (d) {
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case 4:
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    switch (face) {
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case FACE_POS_X:
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case FACE_NEG_X:
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       x += step_offsets[face][0] * d;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       y += step_offsets[face][1] * d;
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       break;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case FACE_POS_Y:
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case FACE_NEG_Y:
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       y += 12;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       x -= 8;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       break;
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case FACE_POS_Z:
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    case FACE_NEG_Z:
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       y = mt->total_height - 4;
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       x = (face - 4) * 8;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       break;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case 2:
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    y = mt->total_height - 4;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    x = bottom_offsets[face];
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case 1:
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    x += 48;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 default:
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    x += step_offsets[face][0] * d;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    y += step_offsets[face][1] * d;
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi945_miptree_layout_3d(struct intel_mipmap_tree * mt)
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint width = mt->width0;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint height = mt->height0;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint depth = mt->depth0;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint pack_x_pitch, pack_x_nr;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint pack_y_pitch;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint level;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->total_width = mt->width0;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mt->total_height = 0;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pack_y_pitch = MAX2(mt->height0, 2);
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pack_x_pitch = mt->total_width;
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pack_x_nr = 1;
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (level = mt->first_level; level <= mt->last_level; level++) {
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint x = 0;
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint y = 0;
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint q, j;
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      intel_miptree_set_level_info(mt, level,
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   0, mt->total_height,
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   width, height, depth);
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (q = 0; q < depth;) {
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (j = 0; j < pack_x_nr && q < depth; j++, q++) {
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    intel_miptree_set_image_offset(mt, level, q, x, y);
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    x += pack_x_pitch;
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 x = 0;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 y += pack_y_pitch;
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mt->total_height += y;
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pack_x_pitch > 4) {
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 pack_x_pitch >>= 1;
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 pack_x_nr <<= 1;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 assert(pack_x_pitch * pack_x_nr <= mt->total_width);
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (pack_y_pitch > 2) {
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 pack_y_pitch >>= 1;
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      width = minify(width);
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      height = minify(height);
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depth = minify(depth);
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgi945_miptree_layout(struct intel_mipmap_tree * mt)
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mt->target) {
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_CUBE_MAP:
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mt->compressed)
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 i945_miptree_layout_cube(mt);
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 i915_miptree_layout_cube(mt);
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_3D:
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i945_miptree_layout_3d(mt);
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_1D:
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_2D:
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_RECTANGLE_ARB:
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i945_miptree_layout_2d(mt);
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(NULL, "Unexpected tex target in i945_miptree_layout()");
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DBG("%s: %dx%dx%d\n", __FUNCTION__,
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       mt->total_width, mt->total_height, mt->cpp);
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
482