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