nouveau_texture.c revision d47a6ada9ca9670c60fc141fabadf40c63031c08
1fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org/*
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * Copyright (C) 2009 Francisco Jerez.
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * All Rights Reserved.
4ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org *
5ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * Permission is hereby granted, free of charge, to any person obtaining
6ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * a copy of this software and associated documentation files (the
7ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * "Software"), to deal in the Software without restriction, including
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * distribute, sublicense, and/or sell copies of the Software, and to
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * permit persons to whom the Software is furnished to do so, subject to
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * the following conditions:
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org *
13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * The above copyright notice and this permission notice (including the
14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * next paragraph) shall be included in all copies or substantial
15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * portions of the Software.
16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org *
17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org *
25196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org */
26ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
27ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "nouveau_driver.h"
28ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "nouveau_context.h"
29ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "nouveau_texture.h"
30ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "nouveau_fbo.h"
3157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org#include "nouveau_util.h"
32ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
33ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "main/pbo.h"
34a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org#include "main/texobj.h"
35e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org#include "main/texstore.h"
36ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "main/texformat.h"
3757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org#include "main/texcompress.h"
38ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "main/texgetimage.h"
39ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "main/mipmap.h"
40ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "main/teximage.h"
41ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "drivers/common/meta.h"
42ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "swrast/s_texfetch.h"
43ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
44ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic struct gl_texture_object *
45c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.orgnouveau_texture_new(struct gl_context *ctx, GLuint name, GLenum target)
46ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
47ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_texture *nt = CALLOC_STRUCT(nouveau_texture);
48ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
49ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	_mesa_initialize_texture_object(&nt->base, name, target);
50ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
51750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org	return &nt->base;
52750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
53ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
54c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic void
5557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgnouveau_texture_free(struct gl_context *ctx, struct gl_texture_object *t)
5657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org{
575924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org	struct nouveau_texture *nt = to_nouveau_texture(t);
58c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org	int i;
59ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
60ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	for (i = 0; i < MAX_TEXTURE_LEVELS; i++)
61ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		nouveau_surface_ref(NULL, &nt->surfaces[i]);
62ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
63e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org	_mesa_delete_texture_object(ctx, t);
64ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
65ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
66ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic struct gl_texture_image *
6757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgnouveau_teximage_new(struct gl_context *ctx)
68ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org{
69ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_teximage *nti = CALLOC_STRUCT(nouveau_teximage);
70ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
71ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	return &nti->base.Base;
72ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
73ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
74ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void
75ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_teximage_free(struct gl_context *ctx, struct gl_texture_image *ti)
76ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
77ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_teximage *nti = to_nouveau_teximage(ti);
78ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
7993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org	nouveau_surface_ref(NULL, &nti->surface);
80fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org}
8193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
82ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void
83ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_teximage_map(struct gl_context *ctx, struct gl_texture_image *ti,
84ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		     int access, int x, int y, int w, int h)
85ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org	struct nouveau_teximage *nti = to_nouveau_teximage(ti);
87ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_surface *s = &nti->surface;
88ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_surface *st = &nti->transfer.surface;
89ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_client *client = context_client(ctx);
90ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
91ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (s->bo) {
92ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		if (!(access & GL_MAP_READ_BIT) &&
93ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		    nouveau_pushbuf_refd(context_push(ctx), s->bo)) {
94ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			unsigned size;
958496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org			/*
96fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org			 * Heuristic: use a bounce buffer to pipeline
97fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org			 * teximage transfers.
98fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org			 */
99fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org			st->layout = LINEAR;
100fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org			st->format = s->format;
101fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org			st->cpp = s->cpp;
102ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			st->width = w;
103255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org			st->height = h;
104255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org			st->pitch = s->pitch;
105255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org			nti->transfer.x = x;
106255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org			nti->transfer.y = y;
107255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
108255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org			size = get_format_blocksy(st->format, h) * st->pitch;
109255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org			nti->base.Map = nouveau_get_scratch(ctx, size,
110255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org						       &st->bo, &st->offset);
111255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
112255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org		} else {
113255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org			int ret, flags = 0;
114255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
115255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org			if (access & GL_MAP_READ_BIT)
116255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org				flags |= NOUVEAU_BO_RD;
117255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org			if (access & GL_MAP_WRITE_BIT)
118255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org				flags |= NOUVEAU_BO_WR;
119255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
120255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org			if (!s->bo->map) {
121255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org				ret = nouveau_bo_map(s->bo, flags, client);
122255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org				assert(!ret);
123a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org			}
124a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org
125255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org			nti->base.Map = s->bo->map +
126255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org				get_format_blocksy(s->format, y) * s->pitch +
127255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org				get_format_blocksx(s->format, x) * s->cpp;
128255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
1298f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org		}
130255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org	}
131255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org}
132255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
133255043f8054e713a64509c707cfabadd42344683machenbach@chromium.orgstatic void
134255043f8054e713a64509c707cfabadd42344683machenbach@chromium.orgnouveau_teximage_unmap(struct gl_context *ctx, struct gl_texture_image *ti)
135255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org{
136255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org	struct nouveau_teximage *nti = to_nouveau_teximage(ti);
137255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org	struct nouveau_surface *s = &nti->surface;
138a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org	struct nouveau_surface *st = &nti->transfer.surface;
139255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
140255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org	if (st->bo) {
1418f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org		context_drv(ctx)->surface_copy(ctx, s, st, nti->transfer.x,
142255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org					       nti->transfer.y, 0, 0,
143255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org					       st->width, st->height);
14483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org		nouveau_surface_ref(NULL, st);
14583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org
14683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org	}
14783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org	nti->base.Map = NULL;
14883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org}
14983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org
15083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org
151ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void
152ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_map_texture_image(struct gl_context *ctx,
153a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			  struct gl_texture_image *ti,
154a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			  GLuint slice,
155a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			  GLuint x, GLuint y, GLuint w, GLuint h,
156a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			  GLbitfield mode,
157a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			  GLubyte **map,
158a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			  GLint *stride)
159a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org{
160a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org	struct nouveau_teximage *nti = to_nouveau_teximage(ti);
161a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org	struct nouveau_surface *s = &nti->surface;
162a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org	struct nouveau_surface *st = &nti->transfer.surface;
163a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org	struct nouveau_client *client = context_client(ctx);
164a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
165a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org	/* Nouveau has no support for 3D or cubemap textures. */
166a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org	assert(slice == 0);
167a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
168a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org	if (s->bo) {
169a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org		if (!(mode & GL_MAP_READ_BIT) &&
170a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org		    nouveau_pushbuf_refd(context_push(ctx), s->bo)) {
171a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			unsigned size;
172a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			/*
173a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			 * Heuristic: use a bounce buffer to pipeline
174a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			 * teximage transfers.
175a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			 */
176a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			st->layout = LINEAR;
177a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			st->format = s->format;
178a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			st->cpp = s->cpp;
179a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			st->width = w;
180a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			st->height = h;
181a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			st->pitch = s->pitch;
182a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			nti->transfer.x = x;
183a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			nti->transfer.y = y;
184a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
185a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			size = get_format_blocksy(st->format, h) * st->pitch;
186a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			*map = nouveau_get_scratch(ctx, size,
187a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org					  &st->bo, &st->offset);
188a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			*stride = st->pitch;
189a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org		} else {
190a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			int ret, flags = 0;
191a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
192a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			if (mode & GL_MAP_READ_BIT)
193a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org				flags |= NOUVEAU_BO_RD;
194a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			if (mode & GL_MAP_WRITE_BIT)
195a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org				flags |= NOUVEAU_BO_WR;
196a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
197a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			if (!s->bo->map) {
198a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org				ret = nouveau_bo_map(s->bo, flags, client);
199a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org				assert(!ret);
200f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org			}
201f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
202f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org			*map = s->bo->map +
203f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org				get_format_blocksy(s->format, y) * s->pitch +
204f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org				get_format_blocksx(s->format, x) * s->cpp;
205ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			*stride = s->pitch;
206ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		}
2075523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org	} else {
2085523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org		*map = nti->base.Map +
2095523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org			get_format_blocksy(s->format, y) * s->pitch +
2105523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org			get_format_blocksx(s->format, x) * s->cpp;
211ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		*stride = s->pitch;
212ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	}
213ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
214ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
215ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void
2166a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgnouveau_unmap_texture_image(struct gl_context *ctx, struct gl_texture_image *ti,
217ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			    GLuint slice)
218ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
2196a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org	struct nouveau_teximage *nti = to_nouveau_teximage(ti);
220ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_surface *s = &nti->surface;
221ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_surface *st = &nti->transfer.surface;
222ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
223ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (st->bo) {
224ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		context_drv(ctx)->surface_copy(ctx, s, st, nti->transfer.x,
225ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org					       nti->transfer.y, 0, 0,
226ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org					       st->width, st->height);
227ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		nouveau_surface_ref(NULL, st);
228ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
229ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	}
230ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2316a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org	nti->base.Map = NULL;
2326a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org}
2336a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org
2346a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.orgstatic gl_format
235ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_choose_tex_format(struct gl_context *ctx, GLenum target,
236ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                          GLint internalFormat,
237ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			  GLenum srcFormat, GLenum srcType)
238ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
2396a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org	switch (internalFormat) {
240ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case 4:
241ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGBA:
2421c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org	case GL_RGBA2:
243ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGBA4:
244ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGBA8:
245ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGBA12:
246a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org	case GL_RGBA16:
2479e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org	case GL_RGB10_A2:
248ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_COMPRESSED_RGBA:
24993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org		return MESA_FORMAT_ARGB8888;
250ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGB5_A1:
25193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org		return MESA_FORMAT_ARGB1555;
252ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
253ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGB:
254ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGB8:
255ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGB10:
256ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGB12:
2579e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org	case GL_RGB16:
258ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_COMPRESSED_RGB:
259ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return MESA_FORMAT_XRGB8888;
260ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case 3:
261ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_R3_G3_B2:
262ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGB4:
263ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGB5:
264ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return MESA_FORMAT_RGB565;
265ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
266ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case 2:
267ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_LUMINANCE_ALPHA:
268ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_LUMINANCE4_ALPHA4:
269ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_LUMINANCE6_ALPHA2:
2702efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org	case GL_LUMINANCE12_ALPHA4:
271c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org	case GL_LUMINANCE12_ALPHA12:
272c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org	case GL_LUMINANCE16_ALPHA16:
273ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_LUMINANCE8_ALPHA8:
274ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_COMPRESSED_LUMINANCE_ALPHA:
275ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return MESA_FORMAT_ARGB8888;
276ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
277ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case 1:
278ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_LUMINANCE:
279ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_LUMINANCE4:
280ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_LUMINANCE12:
281394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com	case GL_LUMINANCE16:
282394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com	case GL_LUMINANCE8:
283394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com	case GL_COMPRESSED_LUMINANCE:
284ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return MESA_FORMAT_L8;
2855523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org
2865523ec3bee8180775e7a6fff2b57c04ef707ad3bvitalyr@chromium.org	case GL_ALPHA:
2876a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org	case GL_ALPHA4:
288ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_ALPHA12:
289ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_ALPHA16:
290ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_ALPHA8:
2916b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	case GL_COMPRESSED_ALPHA:
292fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org		return MESA_FORMAT_A8;
2936b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
2946b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	case GL_INTENSITY:
2956b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	case GL_INTENSITY4:
2966b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	case GL_INTENSITY12:
2976b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	case GL_INTENSITY16:
2986b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	case GL_INTENSITY8:
2996b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org		return MESA_FORMAT_I8;
3006b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
3016b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	case GL_RGB_S3TC:
3026b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	case GL_RGB4_S3TC:
3036b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
3046b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org		return MESA_FORMAT_RGB_DXT1;
3056b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org
306ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
307ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return MESA_FORMAT_RGBA_DXT1;
308ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
309ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_RGBA_S3TC:
3106b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	case GL_RGBA4_S3TC:
3116b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
312ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return MESA_FORMAT_RGBA_DXT3;
313ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
314ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
315ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return MESA_FORMAT_RGBA_DXT5;
316ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
317ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	default:
318ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		assert(0);
319ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	}
320355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org}
321ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
322ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic GLboolean
323ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgteximage_fits(struct gl_texture_object *t, int level)
3244f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org{
325ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_surface *s = &to_nouveau_texture(t)->surfaces[level];
326ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct gl_texture_image *ti = t->Image[0][level];
3277ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org
328ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (!ti || !to_nouveau_teximage(ti)->surface.bo)
329ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return GL_FALSE;
330ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
331ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (level == t->BaseLevel && (s->offset & 0x7f))
3325a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org		return GL_FALSE;
3335a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
334ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	return t->Target == GL_TEXTURE_RECTANGLE ||
335ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		(s->bo && s->format == ti->TexFormat &&
336ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		 s->width == ti->Width && s->height == ti->Height);
337ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
338ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
339fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.orgstatic GLboolean
340ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvalidate_teximage(struct gl_context *ctx, struct gl_texture_object *t,
34146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org		  int level, int x, int y, int z,
342ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		  int width, int height, int depth)
343ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
344ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct gl_texture_image *ti = t->Image[0][level];
345ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
346ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (teximage_fits(t, level)) {
347ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		struct nouveau_surface *ss = to_nouveau_texture(t)->surfaces;
348ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface;
349ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
350ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		if (t->Target == GL_TEXTURE_RECTANGLE)
351ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			nouveau_surface_ref(s, &ss[level]);
352ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		else
353b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org			context_drv(ctx)->surface_copy(ctx, &ss[level], s,
354ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org						       x, y, x, y,
35554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org						       width, height);
356f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
357750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org		return GL_TRUE;
358750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org	}
359e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
3606b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org	return GL_FALSE;
3616b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org}
3625697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org
3633c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgstatic int
3643c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgget_last_level(struct gl_texture_object *t)
365865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org{
366ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct gl_texture_image *base = t->Image[0][t->BaseLevel];
367f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
368f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org	if (t->Sampler.MinFilter == GL_NEAREST ||
369f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org	    t->Sampler.MinFilter == GL_LINEAR || !base)
370f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org		return t->BaseLevel;
371f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org	else
372ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return MIN2(t->BaseLevel + base->MaxLog2, t->MaxLevel);
373ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
374ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
375ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void
376ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgrelayout_texture(struct gl_context *ctx, struct gl_texture_object *t)
377ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
378ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct gl_texture_image *base = t->Image[0][t->BaseLevel];
379ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
380ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (base && t->Target != GL_TEXTURE_RECTANGLE) {
381ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		struct nouveau_surface *ss = to_nouveau_texture(t)->surfaces;
382ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		struct nouveau_surface *s = &to_nouveau_teximage(base)->surface;
383ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		int i, ret, last = get_last_level(t);
384ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		enum nouveau_surface_layout layout =
385ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			(_mesa_is_format_compressed(s->format) ? LINEAR : SWIZZLED);
386ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		unsigned size, pitch, offset = 0,
387ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			width = s->width,
388ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			height = s->height;
389ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
39093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org		/* Deallocate the old storage. */
391fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org		for (i = 0; i < MAX_TEXTURE_LEVELS; i++)
39293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org			nouveau_bo_ref(NULL, &ss[i].bo);
393ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
394ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		/* Relayout the mipmap tree. */
395ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		for (i = t->BaseLevel; i <= last; i++) {
396ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			pitch = _mesa_format_row_stride(s->format, width);
397f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org			size = get_format_blocksy(s->format, height) * pitch;
398ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
399ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			/* Images larger than 16B have to be aligned. */
400f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org			if (size > 16)
401f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org				offset = align(offset, 64);
402f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
403ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			ss[i] = (struct nouveau_surface) {
40493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org				.offset = offset,
405fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org				.layout = layout,
40693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org				.format = s->format,
407f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org				.width = width,
408ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org				.height = height,
409ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org				.cpp = s->cpp,
410ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org				.pitch = pitch,
411a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org			};
412ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
413ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			offset += size;
414ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			width = MAX2(1, width / 2);
415ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			height = MAX2(1, height / 2);
416ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		}
417ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
418ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		/* Get new storage. */
419ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		size = align(offset, 64);
42093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
421fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org		ret = nouveau_bo_new(context_dev(ctx), NOUVEAU_BO_MAP |
42293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org				     NOUVEAU_BO_GART | NOUVEAU_BO_VRAM,
423ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org				     0, size, NULL, &ss[last].bo);
424ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		assert(!ret);
425ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
426ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		for (i = t->BaseLevel; i < last; i++)
427ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			nouveau_bo_ref(ss[last].bo, &ss[i].bo);
428ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	}
429ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
430ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
431ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgGLboolean
432ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_texture_validate(struct gl_context *ctx, struct gl_texture_object *t)
433ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
434ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_texture *nt = to_nouveau_texture(t);
435ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	int i, last = get_last_level(t);
436ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
437ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (!teximage_fits(t, t->BaseLevel) ||
43883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org	    !teximage_fits(t, last))
43983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org		return GL_FALSE;
440efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
44183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org	if (nt->dirty) {
442ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		nt->dirty = GL_FALSE;
443ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
444ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		/* Copy the teximages to the actual miptree. */
445ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		for (i = t->BaseLevel; i <= last; i++) {
446ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			struct nouveau_surface *s = &nt->surfaces[i];
447ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4488c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org			validate_teximage(ctx, t, i, 0, 0, 0,
449ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org					  s->width, s->height, 1);
450ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		}
451ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
452ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		PUSH_KICK(context_push(ctx));
4537979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org	}
4548c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org
455ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	return GL_TRUE;
456ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
457ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
458ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid
459ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_texture_reallocate(struct gl_context *ctx, struct gl_texture_object *t)
4608c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org{
461ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (!teximage_fits(t, t->BaseLevel) ||
462ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	    !teximage_fits(t, get_last_level(t))) {
4637c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org		texture_dirty(t);
4647c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org		relayout_texture(ctx, t);
4657c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org		nouveau_texture_validate(ctx, t);
4667c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org	}
4677c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org}
4687c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
4697c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgstatic unsigned
470ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgget_teximage_placement(struct gl_texture_image *ti)
471ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
472ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (ti->TexFormat == MESA_FORMAT_A8 ||
473ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	    ti->TexFormat == MESA_FORMAT_L8 ||
474ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	    ti->TexFormat == MESA_FORMAT_I8)
475ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		/* 1 cpp formats will have to be swizzled by the CPU,
476ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		 * so leave them in system RAM for now. */
477ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return NOUVEAU_BO_MAP;
478ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	else
479ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return NOUVEAU_BO_GART | NOUVEAU_BO_MAP;
480ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
481ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4827c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgstatic void
4837c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgnouveau_teximage(struct gl_context *ctx, GLint dims,
484528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org		 struct gl_texture_image *ti,
485ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		 GLsizei imageSize,
4862efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org		 GLenum format, GLenum type, const GLvoid *pixels,
487ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		 const struct gl_pixelstore_attrib *packing,
488ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		 GLboolean compressed)
489ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
490ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct gl_texture_object *t = ti->TexObject;
4911c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org	const GLuint level = ti->Level;
4921c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org	struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface;
4931c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org	struct nouveau_teximage *nti = to_nouveau_teximage(ti);
4941c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org	int ret;
495e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org	GLuint depth = compressed ? 1 : ti->Depth;
496e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
497e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org	/* Allocate a new bo for the image. */
498e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org	nouveau_surface_alloc(ctx, s, LINEAR, get_teximage_placement(ti),
499ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			      ti->TexFormat, ti->Width, ti->Height);
500ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	nti->base.RowStride = s->pitch / s->cpp;
501ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
5028c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org	if (compressed)
5038c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org		pixels = _mesa_validate_pbo_compressed_teximage(ctx,
5048c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org			imageSize,
505ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			pixels, packing, "glCompressedTexImage");
506ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	else
5078c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org		pixels = _mesa_validate_pbo_teximage(ctx,
5088c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org			dims, ti->Width, ti->Height, depth, format, type,
5098c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org			pixels, packing, "glTexImage");
5101456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org
5111456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org	if (pixels) {
512ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		/* Store the pixel data. */
513ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		nouveau_teximage_map(ctx, ti, GL_MAP_WRITE_BIT,
514dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org				     0, 0, ti->Width, ti->Height);
515ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
516ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		ret = _mesa_texstore(ctx, dims, ti->_BaseFormat,
517ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org				     ti->TexFormat,
518ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org				     s->pitch,
519ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                                     &nti->base.Map,
520ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org				     ti->Width, ti->Height, depth,
521e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org				     format, type, pixels, packing);
522ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		assert(ret);
523ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
524ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		nouveau_teximage_unmap(ctx, ti);
525ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		_mesa_unmap_teximage_pbo(ctx, packing);
526f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
527ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		if (!validate_teximage(ctx, t, level, 0, 0, 0,
528ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org				       ti->Width, ti->Height, depth))
529f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org			/* It doesn't fit, mark it as dirty. */
530ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			texture_dirty(t);
531ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	}
5329e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
533ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (level == t->BaseLevel) {
534a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org		if (!teximage_fits(t, level))
535ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			relayout_texture(ctx, t);
536ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		nouveau_texture_validate(ctx, t);
537f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org	}
538a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org
539a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org	context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit);
540a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org	context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit);
541ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
542f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
543ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
544a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgstatic void
545ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_teximage_123d(struct gl_context *ctx, GLuint dims,
546ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                      struct gl_texture_image *ti,
547f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                      GLenum format, GLenum type, const GLvoid *pixels,
5489e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                      const struct gl_pixelstore_attrib *packing)
549ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
550ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	nouveau_teximage(ctx, dims, ti, 0, format, type, pixels,
551f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org			 packing, GL_FALSE);
552ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
553a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org
554ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void
555ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_compressed_teximage(struct gl_context *ctx, GLuint dims,
556f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org		    struct gl_texture_image *ti,
557f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org		    GLsizei imageSize, const GLvoid *data)
558f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org{
559ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	nouveau_teximage(ctx, 2, ti, imageSize, 0, 0, data,
560ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			 &ctx->Unpack, GL_TRUE);
561ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
56293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
563ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void
564ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_texsubimage(struct gl_context *ctx, GLint dims,
5656a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org		    struct gl_texture_image *ti,
566ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		    GLint xoffset, GLint yoffset, GLint zoffset,
567ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		    GLint width, GLint height, GLint depth,
568ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		    GLsizei imageSize,
569ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		    GLenum format, GLenum type, const void *pixels,
570ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		    const struct gl_pixelstore_attrib *packing,
571ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		    GLboolean compressed)
572ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
573f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org	struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface;
574f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org	struct nouveau_teximage *nti = to_nouveau_teximage(ti);
575ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	int ret;
5769e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
577ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (compressed)
578ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		pixels = _mesa_validate_pbo_compressed_teximage(ctx,
5797028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org				imageSize,
5807028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org				pixels, packing, "glCompressedTexSubImage");
5817028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org	else
5827028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org		pixels = _mesa_validate_pbo_teximage(ctx,
5837028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org				dims, width, height, depth, format, type,
5847028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org				pixels, packing, "glTexSubImage");
5857028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
5867028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org	if (pixels) {
5877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org		nouveau_teximage_map(ctx, ti, GL_MAP_WRITE_BIT,
5887028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org				     xoffset, yoffset, width, height);
5897028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
5907028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org		ret = _mesa_texstore(ctx, dims, ti->_BaseFormat, ti->TexFormat,
5917028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org                                     s->pitch,
5927028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org				     &nti->base.Map,
5939e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                                     width, height, depth,
594ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org				     format, type, pixels, packing);
595a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org		assert(ret);
596ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
597ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		nouveau_teximage_unmap(ctx, ti);
598ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		_mesa_unmap_teximage_pbo(ctx, packing);
599a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org	}
6006d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
601ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (!to_nouveau_texture(ti->TexObject)->dirty)
602ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		validate_teximage(ctx, ti->TexObject, ti->Level,
603a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org				  xoffset, yoffset, zoffset,
604ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org				  width, height, depth);
605ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
606ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
607ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void
608ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_texsubimage_123d(struct gl_context *ctx, GLuint dims,
6099e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                         struct gl_texture_image *ti,
610a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                         GLint xoffset, GLint yoffset, GLint zoffset,
611ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                         GLint width, GLint height, GLint depth,
612ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                         GLenum format, GLenum type, const void *pixels,
6135a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org                         const struct gl_pixelstore_attrib *packing)
6145a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org{
6155a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org	nouveau_texsubimage(ctx, dims, ti, xoffset, yoffset, zoffset,
616ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			    width, height, depth, 0, format, type, pixels,
617ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			    packing, GL_FALSE);
618ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
619ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
620ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void
621ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_compressed_texsubimage(struct gl_context *ctx, GLuint dims,
622ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		       struct gl_texture_image *ti,
623ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		       GLint xoffset, GLint yoffset, GLint zoffset,
624ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		       GLsizei width, GLint height, GLint depth,
625ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		       GLenum format,
626ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		       GLint imageSize, const void *data)
627594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org{
628594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org	nouveau_texsubimage(ctx, dims, ti, xoffset, yoffset, zoffset,
629594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org			  width, height, depth, imageSize, format, 0, data,
630ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org			  &ctx->Unpack, GL_TRUE);
631ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
632ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
633ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic void
634ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_bind_texture(struct gl_context *ctx, GLenum target,
635ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		     struct gl_texture_object *t)
636ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
637ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit);
638ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit);
6392efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org}
64046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
64146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgstatic gl_format
642ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgget_texbuffer_format(struct gl_renderbuffer *rb, GLint format)
643ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
644ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_surface *s = &to_nouveau_renderbuffer(rb)->surface;
645ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
646ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (s->cpp < 4)
647ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return s->format;
648ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	else if (format == __DRI_TEXTURE_FORMAT_RGBA)
649ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return MESA_FORMAT_ARGB8888;
650ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	else
651ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		return MESA_FORMAT_XRGB8888;
652ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
653ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
654ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid
655ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_set_texbuffer(__DRIcontext *dri_ctx,
656ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		      GLint target, GLint format,
657ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		      __DRIdrawable *draw)
658ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
659ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct nouveau_context *nctx = dri_ctx->driverPrivate;
660ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct gl_context *ctx = &nctx->base;
661ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	struct gl_framebuffer *fb = draw->driverPrivate;
66244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	struct gl_renderbuffer *rb =
66344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org		fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
66444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	struct gl_texture_object *t = _mesa_get_current_tex_object(ctx, target);
665a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org	struct gl_texture_image *ti;
666a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org	struct nouveau_teximage *nti;
66744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	struct nouveau_surface *s;
6689e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
66944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	_mesa_lock_texture(ctx, t);
67044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	ti = _mesa_get_tex_image(ctx, t, target, 0);
67144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	nti = to_nouveau_teximage(ti);
67244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	s = &to_nouveau_teximage(ti)->surface;
67344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
67444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	/* Update the texture surface with the given drawable. */
67544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	nouveau_update_renderbuffers(dri_ctx, draw);
67644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	nouveau_surface_ref(&to_nouveau_renderbuffer(rb)->surface, s);
67744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
67844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org        s->format = get_texbuffer_format(rb, format);
67944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
68044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	/* Update the image fields. */
68144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org	_mesa_init_teximage_fields(ctx, ti, s->width, s->height,
68244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org				   1, 0, s->cpp, s->format);
683ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	nti->base.RowStride = s->pitch / s->cpp;
684ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
685ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	/* Try to validate it. */
686ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	if (!validate_teximage(ctx, t, 0, 0, 0, 0, s->width, s->height, 1))
687ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org		nouveau_texture_reallocate(ctx, t);
688ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
689ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit);
690bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org	context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit);
691ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
69267255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org	_mesa_unlock_texture(ctx, t);
69367255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org}
69467255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org
69567255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.orgvoid
696ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnouveau_texture_functions_init(struct dd_function_table *functions)
697ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{
698ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	functions->NewTextureObject = nouveau_texture_new;
699ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	functions->DeleteTexture = nouveau_texture_free;
700eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org	functions->NewTextureImage = nouveau_teximage_new;
701eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org	functions->FreeTextureImageBuffer = nouveau_teximage_free;
702eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org	functions->ChooseTextureFormat = nouveau_choose_tex_format;
703eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org	functions->TexImage = nouveau_teximage_123d;
704ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org	functions->TexSubImage = nouveau_texsubimage_123d;
705ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	functions->CompressedTexImage = nouveau_compressed_teximage;
706ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	functions->CompressedTexSubImage = nouveau_compressed_texsubimage;
707ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org	functions->BindTexture = nouveau_bind_texture;
708fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org	functions->MapTextureImage = nouveau_map_texture_image;
709c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org	functions->UnmapTextureImage = nouveau_unmap_texture_image;
710c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org}
711ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org