1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009 Maciej Cencora.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2008 Nicolai Haehnle.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The Weather Channel (TM) funded Tungsten Graphics to develop the
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * initial release of the Radeon 8500 driver under the XFree86 license.
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This notice must be preserved.
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a copy of this software and associated documentation files (the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sublicense, and/or sell copies of the Software, and to
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * portions of the Software.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mfeatures.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mipmap.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/pbo.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texcompress.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texstore.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/teximage.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texobj.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "drivers/common/meta.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xmlpool.h"		/* for symbolic values of enum-type options */
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_common.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_mipmap_tree.h"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void teximage_assign_miptree(radeonContextPtr rmesa,
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    struct gl_texture_object *texObj,
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    struct gl_texture_image *texImage);
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic radeon_mipmap_tree *radeon_miptree_create_for_teximage(radeonContextPtr rmesa,
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							      struct gl_texture_object *texObj,
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							      struct gl_texture_image *texImage);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid copy_rows(void* dst, GLuint dststride, const void* src, GLuint srcstride,
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLuint numrows, GLuint rowsize)
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(rowsize <= dststride);
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(rowsize <= srcstride);
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_print(RADEON_TEXTURE, RADEON_TRACE,
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		"%s dst %p, stride %u, src %p, stride %u, "
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		"numrows %u, rowsize %u.\n",
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		__func__, dst, dststride,
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		src, srcstride,
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		numrows, rowsize);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (rowsize == srcstride && rowsize == dststride) {
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memcpy(dst, src, numrows*rowsize);
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		GLuint i;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for(i = 0; i < numrows; ++i) {
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memcpy(dst, src, rowsize);
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			dst += dststride;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			src += srcstride;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* textures */
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocate an empty texture image object.
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_image *radeonNewTextureImage(struct gl_context *ctx)
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return CALLOC(sizeof(radeon_texture_image));
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Delete a texture image object.
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeonDeleteTextureImage(struct gl_context *ctx, struct gl_texture_image *img)
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* nothing special (yet) for radeon_texture_image */
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_mesa_delete_texture_image(ctx, img);
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeonAllocTextureImageBuffer(struct gl_context *ctx,
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      struct gl_texture_image *timage)
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_texture_image *image = get_radeon_texture_image(timage);
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct gl_texture_object *texobj = timage->TexObject;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int slices;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ctx->Driver.FreeTextureImageBuffer(ctx, timage);
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (texobj->Target) {
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_TEXTURE_3D:
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		slices = timage->Depth;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		break;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		slices = 1;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(!image->base.ImageOffsets);
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	image->base.ImageOffsets = malloc(slices * sizeof(GLuint));
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	teximage_assign_miptree(rmesa, texobj, timage);
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return GL_TRUE;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free memory associated with this texture image.
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid radeonFreeTextureImageBuffer(struct gl_context *ctx, struct gl_texture_image *timage)
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_texture_image* image = get_radeon_texture_image(timage);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (image->mt) {
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_miptree_unreference(&image->mt);
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_swrast_free_texture_image_buffer(ctx, timage);
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (image->bo) {
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_bo_unref(image->bo);
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		image->bo = NULL;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (image->base.Buffer) {
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_mesa_align_free(image->base.Buffer);
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		image->base.Buffer = NULL;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (image->base.ImageOffsets) {
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		free(image->base.ImageOffsets);
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		image->base.ImageOffsets = NULL;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Set Data pointer and additional data for mapped texture image */
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void teximage_set_map_data(radeon_texture_image *image)
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_mipmap_level *lvl;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!image->mt) {
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_warning("%s(%p) Trying to set map data without miptree.\n",
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				__func__, image);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	lvl = &image->mt->levels[image->base.Base.Level];
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	image->base.Map = image->mt->bo->ptr + lvl->faces[image->base.Base.Face].offset;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	image->base.RowStride = lvl->rowstride / _mesa_get_format_bytes(image->base.Base.TexFormat);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map a single texture image for glTexImage and friends.
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid radeon_teximage_map(radeon_texture_image *image, GLboolean write_enable)
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"%s(img %p), write_enable %s.\n",
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			__func__, image,
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			write_enable ? "true": "false");
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (image->mt) {
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(!image->base.Map);
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_bo_map(image->mt->bo, write_enable);
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		teximage_set_map_data(image);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid radeon_teximage_unmap(radeon_texture_image *image)
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"%s(img %p)\n",
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			__func__, image);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (image->mt) {
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(image->base.Map);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		image->base.Map = 0;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_bo_unmap(image->mt->bo);
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map texture memory/buffer into user space.
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: the region of interest parameters are ignored here.
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param mapOut  returns start of mapping of region of interest
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param rowStrideOut  returns row stride in bytes
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_map_texture_image(struct gl_context *ctx,
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 struct gl_texture_image *texImage,
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 GLuint slice,
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 GLuint x, GLuint y, GLuint w, GLuint h,
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 GLbitfield mode,
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 GLubyte **map,
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 GLint *stride)
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_texture_image *image = get_radeon_texture_image(texImage);
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_mipmap_tree *mt = image->mt;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLuint texel_size = _mesa_get_format_bytes(texImage->TexFormat);
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLuint width = texImage->Width;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLuint height = texImage->Height;
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct radeon_bo *bo = !image->mt ? image->bo : image->mt->bo;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int bw, bh;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLboolean write = (mode & GL_MAP_WRITE_BIT) != 0;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_mesa_get_format_block_size(texImage->TexFormat, &bw, &bh);
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	assert(y % bh == 0);
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	y /= bh;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	texel_size /= bw;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (bo && radeon_bo_is_referenced_by_cs(bo, rmesa->cmdbuf.cs)) {
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     "%s for texture that is "
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     "queued for GPU processing.\n",
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     __func__);
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_firevertices(rmesa);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (image->bo) {
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* TFP case */
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_bo_map(image->bo, write);
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*stride = get_texture_image_row_stride(rmesa, texImage->TexFormat, width, 0, texImage->TexObject->Target);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*map = bo->ptr;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if (likely(mt)) {
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		void *base;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_mipmap_level *lvl = &image->mt->levels[texImage->Level];
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_bo_map(mt->bo, write);
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		base = mt->bo->ptr + lvl->faces[image->base.Base.Face].offset;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*stride = lvl->rowstride;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*map = base + (slice * height) * *stride;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* texture data is in malloc'd memory */
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(map);
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*stride = _mesa_format_row_stride(texImage->TexFormat, width);
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*map = image->base.Buffer + (slice * height) * *stride;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	*map += y * *stride + x * texel_size;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_unmap_texture_image(struct gl_context *ctx,
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   struct gl_texture_image *texImage, GLuint slice)
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_texture_image *image = get_radeon_texture_image(texImage);
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (image->bo)
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_bo_unmap(image->bo);
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	else if (image->mt)
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_bo_unmap(image->mt->bo);
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* try to find a format which will only need a memcopy */
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic gl_format radeonChoose8888TexFormat(radeonContextPtr rmesa,
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   GLenum srcFormat,
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   GLenum srcType, GLboolean fbo)
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(RADEON_R100)
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* r100 can only do this */
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return _radeon_texformat_argb8888;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#elif defined(RADEON_R200)
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const GLuint ui = 1;
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const GLubyte littleEndian = *((const GLubyte *)&ui);
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (fbo)
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return _radeon_texformat_argb8888;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian)) {
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_RGBA8888;
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else if ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) ||
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian)) {
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_RGBA8888_REV;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return _radeon_texformat_argb8888;
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format radeonChooseTextureFormat_mesa(struct gl_context * ctx,
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLenum target,
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLint internalFormat,
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLenum format,
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLenum type)
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return radeonChooseTextureFormat(ctx, internalFormat, format,
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 type, 0);
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format radeonChooseTextureFormat(struct gl_context * ctx,
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLint internalFormat,
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLenum format,
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLenum type, GLboolean fbo)
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const GLboolean do32bpt =
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    (rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_32);
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const GLboolean force16bpt =
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    (rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_FORCE_16);
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	(void)format;
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_print(RADEON_TEXTURE, RADEON_TRACE,
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		"%s InternalFormat=%s(%d) type=%s format=%s\n",
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		__func__,
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_mesa_lookup_enum_by_nr(internalFormat), internalFormat,
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_mesa_lookup_enum_by_nr(type), _mesa_lookup_enum_by_nr(format));
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_print(RADEON_TEXTURE, RADEON_TRACE,
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			"%s do32bpt=%d force16bpt=%d\n",
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			__func__, do32bpt, force16bpt);
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (internalFormat) {
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 4:
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGBA:
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_RGBA:
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (type) {
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_INT_10_10_10_2:
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_INT_2_10_10_10_REV:
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return do32bpt ? _radeon_texformat_argb8888 :
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    _radeon_texformat_argb1555;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_SHORT_4_4_4_4:
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_SHORT_4_4_4_4_REV:
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return _radeon_texformat_argb4444;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_SHORT_5_5_5_1:
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_SHORT_1_5_5_5_REV:
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return _radeon_texformat_argb1555;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return do32bpt ? radeonChoose8888TexFormat(rmesa, format, type, fbo) :
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    _radeon_texformat_argb4444;
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 3:
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB:
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_RGB:
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch (type) {
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_SHORT_4_4_4_4:
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_SHORT_4_4_4_4_REV:
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return _radeon_texformat_argb4444;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_SHORT_5_5_5_1:
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_SHORT_1_5_5_5_REV:
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return _radeon_texformat_argb1555;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_SHORT_5_6_5:
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case GL_UNSIGNED_SHORT_5_6_5_REV:
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return _radeon_texformat_rgb565;
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return do32bpt ? _radeon_texformat_argb8888 :
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    _radeon_texformat_rgb565;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGBA8:
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB10_A2:
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGBA12:
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGBA16:
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return !force16bpt ?
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			radeonChoose8888TexFormat(rmesa, format, type, fbo) :
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			_radeon_texformat_argb4444;
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGBA4:
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGBA2:
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return _radeon_texformat_argb4444;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB5_A1:
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return _radeon_texformat_argb1555;
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB8:
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB10:
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB12:
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB16:
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return !force16bpt ? _radeon_texformat_argb8888 :
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    _radeon_texformat_rgb565;
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB5:
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB4:
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_R3_G3_B2:
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return _radeon_texformat_rgb565;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_ALPHA:
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_ALPHA4:
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_ALPHA8:
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_ALPHA12:
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_ALPHA16:
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_ALPHA:
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(RADEON_R200)
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* r200: can't use a8 format since interpreting hw I8 as a8 would result
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		   in wrong rgb values (same as alpha value instead of 0). */
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return _radeon_texformat_al88;
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_A8;
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 1:
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE:
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE4:
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE8:
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE12:
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE16:
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_LUMINANCE:
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_L8;
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case 2:
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE_ALPHA:
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE4_ALPHA4:
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE6_ALPHA2:
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE8_ALPHA8:
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE12_ALPHA4:
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE12_ALPHA12:
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE16_ALPHA16:
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_LUMINANCE_ALPHA:
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return _radeon_texformat_al88;
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_INTENSITY:
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_INTENSITY4:
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_INTENSITY8:
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_INTENSITY12:
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_INTENSITY16:
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_INTENSITY:
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_I8;
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_YCBCR_MESA:
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (type == GL_UNSIGNED_SHORT_8_8_APPLE ||
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    type == GL_UNSIGNED_BYTE)
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return MESA_FORMAT_YCBCR;
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return MESA_FORMAT_YCBCR_REV;
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB_S3TC:
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB4_S3TC:
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_RGB_DXT1;
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_RGBA_DXT1;
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGBA_S3TC:
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGBA4_S3TC:
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_RGBA_DXT3;
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_RGBA_DXT5;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_ALPHA16F_ARB:
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_ALPHA_FLOAT16;
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_ALPHA32F_ARB:
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_ALPHA_FLOAT32;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE16F_ARB:
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_LUMINANCE_FLOAT16;
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE32F_ARB:
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_LUMINANCE_FLOAT32;
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE_ALPHA16F_ARB:
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_LUMINANCE_ALPHA32F_ARB:
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_INTENSITY16F_ARB:
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_INTENSITY_FLOAT16;
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_INTENSITY32F_ARB:
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_INTENSITY_FLOAT32;
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB16F_ARB:
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_RGBA_FLOAT16;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGB32F_ARB:
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_RGBA_FLOAT32;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGBA16F_ARB:
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_RGBA_FLOAT16;
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_RGBA32F_ARB:
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_RGBA_FLOAT32;
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_DEPTH_COMPONENT:
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_DEPTH_COMPONENT16:
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_DEPTH_COMPONENT24:
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_DEPTH_COMPONENT32:
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_DEPTH_STENCIL_EXT:
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_DEPTH24_STENCIL8_EXT:
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_S8_Z24;
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* EXT_texture_sRGB */
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_SRGB:
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_SRGB8:
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_SRGB_ALPHA:
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_SRGB8_ALPHA8:
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_SRGB:
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_SRGB_ALPHA:
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_SARGB8;
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_SLUMINANCE:
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_SLUMINANCE8:
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_SLUMINANCE:
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_SL8;
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_SLUMINANCE_ALPHA:
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_SLUMINANCE8_ALPHA8:
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_SLUMINANCE_ALPHA:
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_SLA8;
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_SRGB_DXT1;
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_SRGBA_DXT1;
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_SRGBA_DXT3;
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_SRGBA_DXT5;
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	default:
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_mesa_problem(ctx,
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      "unexpected internalFormat 0x%x in %s",
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      (int)internalFormat, __func__);
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return MESA_FORMAT_NONE;
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return MESA_FORMAT_NONE;		/* never get here */
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Check if given image is valid within current texture object.
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void teximage_assign_miptree(radeonContextPtr rmesa,
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    struct gl_texture_object *texObj,
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    struct gl_texture_image *texImage)
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonTexObj *t = radeon_tex_obj(texObj);
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_texture_image* image = get_radeon_texture_image(texImage);
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Try using current miptree, or create new if there isn't any */
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!t->mt || !radeon_miptree_matches_image(t->mt, texImage)) {
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_miptree_unreference(&t->mt);
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		t->mt = radeon_miptree_create_for_teximage(rmesa,
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							   texObj,
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							   texImage);
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     "%s: texObj %p, texImage %p, "
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				"texObj miptree doesn't match, allocated new miptree %p\n",
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				__FUNCTION__, texObj, texImage, t->mt);
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Miptree alocation may have failed,
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * when there was no image for baselevel specified */
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (t->mt) {
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_miptree_reference(t->mt, &image->mt);
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				"%s Failed to allocate miptree.\n", __func__);
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned radeonIsFormatRenderable(gl_format mesa_format)
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (mesa_format == _radeon_texformat_argb8888 || mesa_format == _radeon_texformat_rgb565 ||
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		mesa_format == _radeon_texformat_argb1555 || mesa_format == _radeon_texformat_argb4444)
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return 1;
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	switch (mesa_format)
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case MESA_FORMAT_Z16:
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case MESA_FORMAT_S8_Z24:
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return 1;
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return 0;
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_OES_EGL_image
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid radeon_image_target_texture_2d(struct gl_context *ctx, GLenum target,
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    struct gl_texture_object *texObj,
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    struct gl_texture_image *texImage,
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLeglImageOES image_handle)
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonContextPtr radeon = RADEON_CONTEXT(ctx);
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonTexObj *t = radeon_tex_obj(texObj);
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_texture_image *radeonImage = get_radeon_texture_image(texImage);
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	__DRIscreen *screen;
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	__DRIimage *image;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	screen = radeon->dri.screen;
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	image = screen->dri2.image->lookupEGLImage(screen, image_handle,
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						   screen->loaderPrivate);
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (image == NULL)
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonFreeTextureImageBuffer(ctx, texImage);
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	texImage->Width = image->width;
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	texImage->Height = image->height;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	texImage->Depth = 1;
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	texImage->_BaseFormat = GL_RGBA;
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	texImage->TexFormat = image->format;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonImage->base.RowStride = image->pitch;
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	texImage->InternalFormat = image->internal_format;
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if(t->mt)
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_miptree_unreference(&t->mt);
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		t->mt = NULL;
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* NOTE: The following is *very* ugly and will probably break. But
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   I don't know how to deal with it, without creating a whole new
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   function like radeon_miptree_from_bo() so I'm going with the
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   easy but error-prone way. */
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_try_alloc_miptree(radeon, t);
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_miptree_reference(t->mt, &radeonImage->mt);
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (t->mt == NULL)
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     "%s Failed to allocate miptree.\n", __func__);
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* Particularly ugly: this is guaranteed to break, if image->bo is
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   not of the required size for a miptree. */
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_bo_unref(t->mt->bo);
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_bo_ref(image->bo);
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	t->mt->bo = image->bo;
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!radeon_miptree_matches_image(t->mt, &radeonImage->base.Base))
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		fprintf(stderr, "miptree doesn't match image\n");
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_rgba8888 = MESA_FORMAT_NONE;
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_argb8888 = MESA_FORMAT_NONE;
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_rgb565 = MESA_FORMAT_NONE;
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_argb4444 = MESA_FORMAT_NONE;
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_argb1555 = MESA_FORMAT_NONE;
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format _radeon_texformat_al88 = MESA_FORMAT_NONE;
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*@}*/
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeonInitTextureFormats(void)
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_little_endian()) {
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_rgba8888	= MESA_FORMAT_RGBA8888;
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_argb8888	= MESA_FORMAT_ARGB8888;
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_rgb565		= MESA_FORMAT_RGB565;
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_argb4444	= MESA_FORMAT_ARGB4444;
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_argb1555	= MESA_FORMAT_ARGB1555;
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_al88		= MESA_FORMAT_AL88;
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_rgba8888	= MESA_FORMAT_RGBA8888_REV;
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_argb8888	= MESA_FORMAT_ARGB8888_REV;
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_rgb565		= MESA_FORMAT_RGB565_REV;
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_argb4444	= MESA_FORMAT_ARGB4444_REV;
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_argb1555	= MESA_FORMAT_ARGB1555_REV;
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _radeon_texformat_al88		= MESA_FORMAT_AL88_REV;
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_init_common_texture_funcs(radeonContextPtr radeon,
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 struct dd_function_table *functions)
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	functions->NewTextureImage = radeonNewTextureImage;
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	functions->DeleteTextureImage = radeonDeleteTextureImage;
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	functions->AllocTextureImageBuffer = radeonAllocTextureImageBuffer;
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	functions->FreeTextureImageBuffer = radeonFreeTextureImageBuffer;
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	functions->MapTextureImage = radeon_map_texture_image;
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	functions->UnmapTextureImage = radeon_unmap_texture_image;
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	functions->ChooseTextureFormat	= radeonChooseTextureFormat_mesa;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	functions->CopyTexSubImage = radeonCopyTexSubImage;
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	functions->Bitmap = _mesa_meta_Bitmap;
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_OES_EGL_image
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	functions->EGLImageTargetTexture2D = radeon_image_target_texture_2d;
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonInitTextureFormats();
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_swrast_map_image(radeonContextPtr rmesa,
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			radeon_texture_image *image)
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLuint level, face;
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_mipmap_tree *mt;
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLuint texel_size;
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_mipmap_level *lvl;
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int rs;
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (!image || !image->mt)
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return;
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	texel_size = _mesa_get_format_bytes(image->base.Base.TexFormat);
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	level = image->base.Base.Level;
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	face = image->base.Base.Face;
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	mt = image->mt;
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	lvl = &image->mt->levels[level];
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	rs = lvl->rowstride / texel_size;
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeon_bo_map(mt->bo, 1);
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	image->base.Map = mt->bo->ptr + lvl->faces[face].offset;
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (mt->target == GL_TEXTURE_3D) {
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		int i;
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i = 0; i < mt->levels[level].depth; i++)
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			image->base.ImageOffsets[i] = rs * lvl->height * i;
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	image->base.RowStride = rs;
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_swrast_unmap_image(radeonContextPtr rmesa,
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  radeon_texture_image *image)
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (image && image->mt) {
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		image->base.Map = NULL;
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		radeon_bo_unmap(image->mt->bo);
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_swrast_map_texture_images(struct gl_context *ctx,
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 struct gl_texture_object *texObj)
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLuint nr_faces = _mesa_num_tex_faces(texObj->Target);
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, face;
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = texObj->BaseLevel; i <= texObj->_MaxLevel; i++) {
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (face = 0; face < nr_faces; face++) {
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			radeon_texture_image *image = get_radeon_texture_image(texObj->Image[face][i]);
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			radeon_swrast_map_image(rmesa, image);
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradeon_swrast_unmap_texture_images(struct gl_context *ctx,
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   struct gl_texture_object *texObj)
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLuint nr_faces = _mesa_num_tex_faces(texObj->Target);
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i, face;
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	for (i = texObj->BaseLevel; i <= texObj->_MaxLevel; i++) {
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (face = 0; face < nr_faces; face++) {
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			radeon_texture_image *image = get_radeon_texture_image(texObj->Image[face][i]);
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			radeon_swrast_unmap_image(rmesa, image);
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic radeon_mipmap_tree *radeon_miptree_create_for_teximage(radeonContextPtr rmesa,
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						       struct gl_texture_object *texObj,
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						       struct gl_texture_image *texImage)
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	radeonTexObj *t = radeon_tex_obj(texObj);
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLuint firstLevel;
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GLuint lastLevel;
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int width, height, depth;
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int i;
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	width = texImage->Width;
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	height = texImage->Height;
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	depth = texImage->Depth;
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	if (texImage->Level > texObj->BaseLevel &&
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    (width == 1 ||
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     (texObj->Target != GL_TEXTURE_1D && height == 1) ||
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     (texObj->Target == GL_TEXTURE_3D && depth == 1))) {
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* For this combination, we're at some lower mipmap level and
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * some important dimension is 1.  We can't extrapolate up to a
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * likely base level width/height/depth for a full mipmap stack
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * from this info, so just allocate this one level.
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		firstLevel = texImage->Level;
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		lastLevel = texImage->Level;
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} else {
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if (texImage->Level < texObj->BaseLevel)
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			firstLevel = 0;
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			firstLevel = texObj->BaseLevel;
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for (i = texImage->Level; i > firstLevel; i--) {
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			width <<= 1;
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (height != 1)
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				height <<= 1;
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (depth != 1)
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				depth <<= 1;
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if ((texObj->Sampler.MinFilter == GL_NEAREST ||
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     texObj->Sampler.MinFilter == GL_LINEAR) &&
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    texImage->Level == firstLevel) {
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			lastLevel = firstLevel;
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} else {
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			lastLevel = firstLevel + _mesa_logbase2(MAX2(MAX2(width, height), depth));
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	return  radeon_miptree_create(rmesa, texObj->Target,
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      texImage->TexFormat, firstLevel, lastLevel - firstLevel + 1,
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      width, height, depth,
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      t->tile_bits);
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
834