mesa: Switch generate_mipmaps_compressed() to using TexImage2D to upload.
[mesa.git] / src / mesa / drivers / dri / radeon / radeon_texture.c
1 /*
2 * Copyright (C) 2009 Maciej Cencora.
3 * Copyright (C) 2008 Nicolai Haehnle.
4 * Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
5 *
6 * The Weather Channel (TM) funded Tungsten Graphics to develop the
7 * initial release of the Radeon 8500 driver under the XFree86 license.
8 * This notice must be preserved.
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining
11 * a copy of this software and associated documentation files (the
12 * "Software"), to deal in the Software without restriction, including
13 * without limitation the rights to use, copy, modify, merge, publish,
14 * distribute, sublicense, and/or sell copies of the Software, and to
15 * permit persons to whom the Software is furnished to do so, subject to
16 * the following conditions:
17 *
18 * The above copyright notice and this permission notice (including the
19 * next paragraph) shall be included in all copies or substantial
20 * portions of the Software.
21 *
22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
26 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 *
30 */
31
32 #include "main/glheader.h"
33 #include "main/imports.h"
34 #include "main/context.h"
35 #include "main/enums.h"
36 #include "main/mfeatures.h"
37 #include "main/mipmap.h"
38 #include "main/pbo.h"
39 #include "main/texcompress.h"
40 #include "main/texstore.h"
41 #include "main/teximage.h"
42 #include "main/texobj.h"
43 #include "drivers/common/meta.h"
44
45 #include "xmlpool.h" /* for symbolic values of enum-type options */
46
47 #include "radeon_common.h"
48
49 #include "radeon_mipmap_tree.h"
50
51
52 void copy_rows(void* dst, GLuint dststride, const void* src, GLuint srcstride,
53 GLuint numrows, GLuint rowsize)
54 {
55 assert(rowsize <= dststride);
56 assert(rowsize <= srcstride);
57
58 radeon_print(RADEON_TEXTURE, RADEON_TRACE,
59 "%s dst %p, stride %u, src %p, stride %u, "
60 "numrows %u, rowsize %u.\n",
61 __func__, dst, dststride,
62 src, srcstride,
63 numrows, rowsize);
64
65 if (rowsize == srcstride && rowsize == dststride) {
66 memcpy(dst, src, numrows*rowsize);
67 } else {
68 GLuint i;
69 for(i = 0; i < numrows; ++i) {
70 memcpy(dst, src, rowsize);
71 dst += dststride;
72 src += srcstride;
73 }
74 }
75 }
76
77 /* textures */
78 /**
79 * Allocate an empty texture image object.
80 */
81 struct gl_texture_image *radeonNewTextureImage(struct gl_context *ctx)
82 {
83 return CALLOC(sizeof(radeon_texture_image));
84 }
85
86 /**
87 * Free memory associated with this texture image.
88 */
89 void radeonFreeTexImageData(struct gl_context *ctx, struct gl_texture_image *timage)
90 {
91 radeon_texture_image* image = get_radeon_texture_image(timage);
92
93 if (image->mt) {
94 radeon_miptree_unreference(&image->mt);
95 assert(!image->base.Data);
96 } else {
97 _mesa_free_texture_image_data(ctx, timage);
98 }
99 if (image->bo) {
100 radeon_bo_unref(image->bo);
101 image->bo = NULL;
102 }
103 if (timage->Data) {
104 _mesa_free_texmemory(timage->Data);
105 timage->Data = NULL;
106 }
107 }
108
109 /* Set Data pointer and additional data for mapped texture image */
110 static void teximage_set_map_data(radeon_texture_image *image)
111 {
112 radeon_mipmap_level *lvl;
113
114 if (!image->mt) {
115 radeon_warning("%s(%p) Trying to set map data without miptree.\n",
116 __func__, image);
117
118 return;
119 }
120
121 lvl = &image->mt->levels[image->mtlevel];
122
123 image->base.Data = image->mt->bo->ptr + lvl->faces[image->mtface].offset;
124 image->base.RowStride = lvl->rowstride / _mesa_get_format_bytes(image->base.TexFormat);
125 }
126
127
128 /**
129 * Map a single texture image for glTexImage and friends.
130 */
131 void radeon_teximage_map(radeon_texture_image *image, GLboolean write_enable)
132 {
133 radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
134 "%s(img %p), write_enable %s.\n",
135 __func__, image,
136 write_enable ? "true": "false");
137 if (image->mt) {
138 assert(!image->base.Data);
139
140 radeon_bo_map(image->mt->bo, write_enable);
141 teximage_set_map_data(image);
142 }
143 }
144
145
146 void radeon_teximage_unmap(radeon_texture_image *image)
147 {
148 radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
149 "%s(img %p)\n",
150 __func__, image);
151 if (image->mt) {
152 assert(image->base.Data);
153
154 image->base.Data = 0;
155 radeon_bo_unmap(image->mt->bo);
156 }
157 }
158
159 static void map_override(struct gl_context *ctx, radeonTexObj *t)
160 {
161 radeon_texture_image *img = get_radeon_texture_image(t->base.Image[0][0]);
162
163 radeon_bo_map(t->bo, GL_FALSE);
164
165 img->base.Data = t->bo->ptr;
166 }
167
168 static void unmap_override(struct gl_context *ctx, radeonTexObj *t)
169 {
170 radeon_texture_image *img = get_radeon_texture_image(t->base.Image[0][0]);
171
172 radeon_bo_unmap(t->bo);
173
174 img->base.Data = NULL;
175 }
176
177 /**
178 * Map a validated texture for reading during software rendering.
179 */
180 void radeonMapTexture(struct gl_context *ctx, struct gl_texture_object *texObj)
181 {
182 radeonTexObj* t = radeon_tex_obj(texObj);
183 int face, level;
184
185 radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
186 "%s(%p, tex %p)\n",
187 __func__, ctx, texObj);
188
189 if (!radeon_validate_texture_miptree(ctx, texObj)) {
190 radeon_error("%s(%p, tex %p) Failed to validate miptree for "
191 "sw fallback.\n",
192 __func__, ctx, texObj);
193 return;
194 }
195
196 if (t->image_override && t->bo) {
197 radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
198 "%s(%p, tex %p) Work around for missing miptree in r100.\n",
199 __func__, ctx, texObj);
200
201 map_override(ctx, t);
202 }
203
204 /* for r100 3D sw fallbacks don't have mt */
205 if (!t->mt) {
206 radeon_warning("%s(%p, tex %p) No miptree in texture.\n",
207 __func__, ctx, texObj);
208 return;
209 }
210
211 radeon_bo_map(t->mt->bo, GL_FALSE);
212 for(face = 0; face < t->mt->faces; ++face) {
213 for(level = t->minLod; level <= t->maxLod; ++level)
214 teximage_set_map_data(get_radeon_texture_image(texObj->Image[face][level]));
215 }
216 }
217
218 void radeonUnmapTexture(struct gl_context *ctx, struct gl_texture_object *texObj)
219 {
220 radeonTexObj* t = radeon_tex_obj(texObj);
221 int face, level;
222
223 radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
224 "%s(%p, tex %p)\n",
225 __func__, ctx, texObj);
226
227 if (t->image_override && t->bo)
228 unmap_override(ctx, t);
229 /* for r100 3D sw fallbacks don't have mt */
230 if (!t->mt)
231 return;
232
233 for(face = 0; face < t->mt->faces; ++face) {
234 for(level = t->minLod; level <= t->maxLod; ++level)
235 texObj->Image[face][level]->Data = 0;
236 }
237 radeon_bo_unmap(t->mt->bo);
238 }
239
240 /**
241 * Wraps Mesa's implementation to ensure that the base level image is mapped.
242 *
243 * This relies on internal details of _mesa_generate_mipmap, in particular
244 * the fact that the memory for recreated texture images is always freed.
245 */
246 static void radeon_generate_mipmap(struct gl_context *ctx, GLenum target,
247 struct gl_texture_object *texObj)
248 {
249 radeonTexObj* t = radeon_tex_obj(texObj);
250 GLuint nr_faces = (t->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
251 int i, face;
252 struct gl_texture_image *first_image;
253
254 radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
255 "%s(%p, tex %p) Target type %s.\n",
256 __func__, ctx, texObj,
257 _mesa_lookup_enum_by_nr(target));
258
259 _mesa_generate_mipmap(ctx, target, texObj);
260
261 /* For the compressed case, we don't need to do the
262 * non-TexImage recovery path below.
263 */
264 first_image = texObj->Image[0][texObj->BaseLevel];
265 if (_mesa_is_format_compressed(first_image->TexFormat))
266 return;
267
268 for (face = 0; face < nr_faces; face++) {
269 for (i = texObj->BaseLevel + 1; i < texObj->MaxLevel; i++) {
270 radeon_texture_image *image;
271
272 image = get_radeon_texture_image(texObj->Image[face][i]);
273
274 if (image == NULL)
275 break;
276
277 image->mtlevel = i;
278 image->mtface = face;
279
280 radeon_miptree_unreference(&image->mt);
281 }
282 }
283
284 }
285
286 void radeonGenerateMipmap(struct gl_context* ctx, GLenum target, struct gl_texture_object *texObj)
287 {
288 radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
289 struct radeon_bo *bo;
290 GLuint face = _mesa_tex_target_to_face(target);
291 radeon_texture_image *baseimage = get_radeon_texture_image(texObj->Image[face][texObj->BaseLevel]);
292 bo = !baseimage->mt ? baseimage->bo : baseimage->mt->bo;
293
294 radeon_print(RADEON_TEXTURE, RADEON_TRACE,
295 "%s(%p, target %s, tex %p)\n",
296 __func__, ctx, _mesa_lookup_enum_by_nr(target),
297 texObj);
298
299 if (bo && radeon_bo_is_referenced_by_cs(bo, rmesa->cmdbuf.cs)) {
300 radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
301 "%s(%p, tex %p) Trying to generate mipmap for texture "
302 "in processing by GPU.\n",
303 __func__, ctx, texObj);
304 radeon_firevertices(rmesa);
305 }
306
307 if (_mesa_meta_check_generate_mipmap_fallback(ctx, target, texObj)) {
308 radeon_teximage_map(baseimage, GL_FALSE);
309 radeon_generate_mipmap(ctx, target, texObj);
310 radeon_teximage_unmap(baseimage);
311 } else {
312 _mesa_meta_GenerateMipmap(ctx, target, texObj);
313 }
314 }
315
316
317 /* try to find a format which will only need a memcopy */
318 static gl_format radeonChoose8888TexFormat(radeonContextPtr rmesa,
319 GLenum srcFormat,
320 GLenum srcType, GLboolean fbo)
321 {
322 const GLuint ui = 1;
323 const GLubyte littleEndian = *((const GLubyte *)&ui);
324
325 /* r100 can only do this */
326 if (IS_R100_CLASS(rmesa->radeonScreen) || fbo)
327 return _dri_texformat_argb8888;
328
329 if ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
330 (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
331 (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
332 (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian)) {
333 return MESA_FORMAT_RGBA8888;
334 } else if ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
335 (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) ||
336 (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
337 (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian)) {
338 return MESA_FORMAT_RGBA8888_REV;
339 } else if (IS_R200_CLASS(rmesa->radeonScreen)) {
340 return _dri_texformat_argb8888;
341 } else if (srcFormat == GL_BGRA && ((srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
342 srcType == GL_UNSIGNED_INT_8_8_8_8)) {
343 return MESA_FORMAT_ARGB8888_REV;
344 } else if (srcFormat == GL_BGRA && ((srcType == GL_UNSIGNED_BYTE && littleEndian) ||
345 srcType == GL_UNSIGNED_INT_8_8_8_8_REV)) {
346 return MESA_FORMAT_ARGB8888;
347 } else
348 return _dri_texformat_argb8888;
349 }
350
351 gl_format radeonChooseTextureFormat_mesa(struct gl_context * ctx,
352 GLint internalFormat,
353 GLenum format,
354 GLenum type)
355 {
356 return radeonChooseTextureFormat(ctx, internalFormat, format,
357 type, 0);
358 }
359
360 gl_format radeonChooseTextureFormat(struct gl_context * ctx,
361 GLint internalFormat,
362 GLenum format,
363 GLenum type, GLboolean fbo)
364 {
365 radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
366 const GLboolean do32bpt =
367 (rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_32);
368 const GLboolean force16bpt =
369 (rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_FORCE_16);
370 (void)format;
371
372 radeon_print(RADEON_TEXTURE, RADEON_TRACE,
373 "%s InternalFormat=%s(%d) type=%s format=%s\n",
374 __func__,
375 _mesa_lookup_enum_by_nr(internalFormat), internalFormat,
376 _mesa_lookup_enum_by_nr(type), _mesa_lookup_enum_by_nr(format));
377 radeon_print(RADEON_TEXTURE, RADEON_TRACE,
378 "%s do32bpt=%d force16bpt=%d\n",
379 __func__, do32bpt, force16bpt);
380
381 switch (internalFormat) {
382 case 4:
383 case GL_RGBA:
384 case GL_COMPRESSED_RGBA:
385 switch (type) {
386 case GL_UNSIGNED_INT_10_10_10_2:
387 case GL_UNSIGNED_INT_2_10_10_10_REV:
388 return do32bpt ? _dri_texformat_argb8888 :
389 _dri_texformat_argb1555;
390 case GL_UNSIGNED_SHORT_4_4_4_4:
391 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
392 return _dri_texformat_argb4444;
393 case GL_UNSIGNED_SHORT_5_5_5_1:
394 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
395 return _dri_texformat_argb1555;
396 default:
397 return do32bpt ? radeonChoose8888TexFormat(rmesa, format, type, fbo) :
398 _dri_texformat_argb4444;
399 }
400
401 case 3:
402 case GL_RGB:
403 case GL_COMPRESSED_RGB:
404 switch (type) {
405 case GL_UNSIGNED_SHORT_4_4_4_4:
406 case GL_UNSIGNED_SHORT_4_4_4_4_REV:
407 return _dri_texformat_argb4444;
408 case GL_UNSIGNED_SHORT_5_5_5_1:
409 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
410 return _dri_texformat_argb1555;
411 case GL_UNSIGNED_SHORT_5_6_5:
412 case GL_UNSIGNED_SHORT_5_6_5_REV:
413 return _dri_texformat_rgb565;
414 default:
415 return do32bpt ? _dri_texformat_argb8888 :
416 _dri_texformat_rgb565;
417 }
418
419 case GL_RGBA8:
420 case GL_RGB10_A2:
421 case GL_RGBA12:
422 case GL_RGBA16:
423 return !force16bpt ?
424 radeonChoose8888TexFormat(rmesa, format, type, fbo) :
425 _dri_texformat_argb4444;
426
427 case GL_RGBA4:
428 case GL_RGBA2:
429 return _dri_texformat_argb4444;
430
431 case GL_RGB5_A1:
432 return _dri_texformat_argb1555;
433
434 case GL_RGB8:
435 case GL_RGB10:
436 case GL_RGB12:
437 case GL_RGB16:
438 return !force16bpt ? _dri_texformat_argb8888 :
439 _dri_texformat_rgb565;
440
441 case GL_RGB5:
442 case GL_RGB4:
443 case GL_R3_G3_B2:
444 return _dri_texformat_rgb565;
445
446 case GL_ALPHA:
447 case GL_ALPHA4:
448 case GL_ALPHA8:
449 case GL_ALPHA12:
450 case GL_ALPHA16:
451 case GL_COMPRESSED_ALPHA:
452 /* r200: can't use a8 format since interpreting hw I8 as a8 would result
453 in wrong rgb values (same as alpha value instead of 0). */
454 if (IS_R200_CLASS(rmesa->radeonScreen))
455 return _dri_texformat_al88;
456 else
457 return _dri_texformat_a8;
458 case 1:
459 case GL_LUMINANCE:
460 case GL_LUMINANCE4:
461 case GL_LUMINANCE8:
462 case GL_LUMINANCE12:
463 case GL_LUMINANCE16:
464 case GL_COMPRESSED_LUMINANCE:
465 return _dri_texformat_l8;
466
467 case 2:
468 case GL_LUMINANCE_ALPHA:
469 case GL_LUMINANCE4_ALPHA4:
470 case GL_LUMINANCE6_ALPHA2:
471 case GL_LUMINANCE8_ALPHA8:
472 case GL_LUMINANCE12_ALPHA4:
473 case GL_LUMINANCE12_ALPHA12:
474 case GL_LUMINANCE16_ALPHA16:
475 case GL_COMPRESSED_LUMINANCE_ALPHA:
476 return _dri_texformat_al88;
477
478 case GL_INTENSITY:
479 case GL_INTENSITY4:
480 case GL_INTENSITY8:
481 case GL_INTENSITY12:
482 case GL_INTENSITY16:
483 case GL_COMPRESSED_INTENSITY:
484 return _dri_texformat_i8;
485
486 case GL_YCBCR_MESA:
487 if (type == GL_UNSIGNED_SHORT_8_8_APPLE ||
488 type == GL_UNSIGNED_BYTE)
489 return MESA_FORMAT_YCBCR;
490 else
491 return MESA_FORMAT_YCBCR_REV;
492
493 case GL_RGB_S3TC:
494 case GL_RGB4_S3TC:
495 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
496 return MESA_FORMAT_RGB_DXT1;
497
498 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
499 return MESA_FORMAT_RGBA_DXT1;
500
501 case GL_RGBA_S3TC:
502 case GL_RGBA4_S3TC:
503 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
504 return MESA_FORMAT_RGBA_DXT3;
505
506 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
507 return MESA_FORMAT_RGBA_DXT5;
508
509 case GL_ALPHA16F_ARB:
510 return MESA_FORMAT_ALPHA_FLOAT16;
511 case GL_ALPHA32F_ARB:
512 return MESA_FORMAT_ALPHA_FLOAT32;
513 case GL_LUMINANCE16F_ARB:
514 return MESA_FORMAT_LUMINANCE_FLOAT16;
515 case GL_LUMINANCE32F_ARB:
516 return MESA_FORMAT_LUMINANCE_FLOAT32;
517 case GL_LUMINANCE_ALPHA16F_ARB:
518 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
519 case GL_LUMINANCE_ALPHA32F_ARB:
520 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
521 case GL_INTENSITY16F_ARB:
522 return MESA_FORMAT_INTENSITY_FLOAT16;
523 case GL_INTENSITY32F_ARB:
524 return MESA_FORMAT_INTENSITY_FLOAT32;
525 case GL_RGB16F_ARB:
526 return MESA_FORMAT_RGBA_FLOAT16;
527 case GL_RGB32F_ARB:
528 return MESA_FORMAT_RGBA_FLOAT32;
529 case GL_RGBA16F_ARB:
530 return MESA_FORMAT_RGBA_FLOAT16;
531 case GL_RGBA32F_ARB:
532 return MESA_FORMAT_RGBA_FLOAT32;
533
534 #ifdef RADEON_R300
535 case GL_DEPTH_COMPONENT:
536 case GL_DEPTH_COMPONENT16:
537 return MESA_FORMAT_Z16;
538 case GL_DEPTH_COMPONENT24:
539 case GL_DEPTH_COMPONENT32:
540 case GL_DEPTH_STENCIL_EXT:
541 case GL_DEPTH24_STENCIL8_EXT:
542 if (rmesa->radeonScreen->chip_family >= CHIP_FAMILY_RV515)
543 return MESA_FORMAT_S8_Z24;
544 else
545 return MESA_FORMAT_Z16;
546 #else
547 case GL_DEPTH_COMPONENT:
548 case GL_DEPTH_COMPONENT16:
549 case GL_DEPTH_COMPONENT24:
550 case GL_DEPTH_COMPONENT32:
551 case GL_DEPTH_STENCIL_EXT:
552 case GL_DEPTH24_STENCIL8_EXT:
553 return MESA_FORMAT_S8_Z24;
554 #endif
555
556 /* EXT_texture_sRGB */
557 case GL_SRGB:
558 case GL_SRGB8:
559 case GL_SRGB_ALPHA:
560 case GL_SRGB8_ALPHA8:
561 case GL_COMPRESSED_SRGB:
562 case GL_COMPRESSED_SRGB_ALPHA:
563 return MESA_FORMAT_SARGB8;
564
565 case GL_SLUMINANCE:
566 case GL_SLUMINANCE8:
567 case GL_COMPRESSED_SLUMINANCE:
568 return MESA_FORMAT_SL8;
569
570 case GL_SLUMINANCE_ALPHA:
571 case GL_SLUMINANCE8_ALPHA8:
572 case GL_COMPRESSED_SLUMINANCE_ALPHA:
573 return MESA_FORMAT_SLA8;
574
575 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
576 return MESA_FORMAT_SRGB_DXT1;
577 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
578 return MESA_FORMAT_SRGBA_DXT1;
579 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
580 return MESA_FORMAT_SRGBA_DXT3;
581 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
582 return MESA_FORMAT_SRGBA_DXT5;
583
584 default:
585 _mesa_problem(ctx,
586 "unexpected internalFormat 0x%x in %s",
587 (int)internalFormat, __func__);
588 return MESA_FORMAT_NONE;
589 }
590
591 return MESA_FORMAT_NONE; /* never get here */
592 }
593
594 /** Check if given image is valid within current texture object.
595 */
596 static int image_matches_texture_obj(struct gl_texture_object *texObj,
597 struct gl_texture_image *texImage,
598 unsigned level)
599 {
600 const struct gl_texture_image *baseImage = texObj->Image[0][texObj->BaseLevel];
601
602 if (!baseImage)
603 return 0;
604
605 if (level < texObj->BaseLevel || level > texObj->MaxLevel)
606 return 0;
607
608 const unsigned levelDiff = level - texObj->BaseLevel;
609 const unsigned refWidth = MAX2(baseImage->Width >> levelDiff, 1);
610 const unsigned refHeight = MAX2(baseImage->Height >> levelDiff, 1);
611 const unsigned refDepth = MAX2(baseImage->Depth >> levelDiff, 1);
612
613 return (texImage->Width == refWidth &&
614 texImage->Height == refHeight &&
615 texImage->Depth == refDepth);
616 }
617
618 static void teximage_assign_miptree(radeonContextPtr rmesa,
619 struct gl_texture_object *texObj,
620 struct gl_texture_image *texImage,
621 unsigned face,
622 unsigned level)
623 {
624 radeonTexObj *t = radeon_tex_obj(texObj);
625 radeon_texture_image* image = get_radeon_texture_image(texImage);
626
627 /* Since miptree holds only images for levels <BaseLevel..MaxLevel>
628 * don't allocate the miptree if the teximage won't fit.
629 */
630 if (!image_matches_texture_obj(texObj, texImage, level))
631 return;
632
633 /* Try using current miptree, or create new if there isn't any */
634 if (!t->mt || !radeon_miptree_matches_image(t->mt, texImage, face, level)) {
635 radeon_miptree_unreference(&t->mt);
636 radeon_try_alloc_miptree(rmesa, t);
637 radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
638 "%s: texObj %p, texImage %p, face %d, level %d, "
639 "texObj miptree doesn't match, allocated new miptree %p\n",
640 __FUNCTION__, texObj, texImage, face, level, t->mt);
641 }
642
643 /* Miptree alocation may have failed,
644 * when there was no image for baselevel specified */
645 if (t->mt) {
646 image->mtface = face;
647 image->mtlevel = level;
648 radeon_miptree_reference(t->mt, &image->mt);
649 } else
650 radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
651 "%s Failed to allocate miptree.\n", __func__);
652 }
653
654 static GLuint * allocate_image_offsets(struct gl_context *ctx,
655 unsigned alignedWidth,
656 unsigned height,
657 unsigned depth)
658 {
659 int i;
660 GLuint *offsets;
661
662 offsets = malloc(depth * sizeof(GLuint)) ;
663 if (!offsets) {
664 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTex[Sub]Image");
665 return NULL;
666 }
667
668 for (i = 0; i < depth; ++i) {
669 offsets[i] = alignedWidth * height * i;
670 }
671
672 return offsets;
673 }
674
675 /**
676 * Update a subregion of the given texture image.
677 */
678 static void radeon_store_teximage(struct gl_context* ctx, int dims,
679 GLint xoffset, GLint yoffset, GLint zoffset,
680 GLsizei width, GLsizei height, GLsizei depth,
681 GLsizei imageSize,
682 GLenum format, GLenum type,
683 const GLvoid * pixels,
684 const struct gl_pixelstore_attrib *packing,
685 struct gl_texture_object *texObj,
686 struct gl_texture_image *texImage,
687 int compressed)
688 {
689 radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
690 radeonTexObj *t = radeon_tex_obj(texObj);
691 radeon_texture_image* image = get_radeon_texture_image(texImage);
692
693 GLuint dstRowStride;
694 GLuint *dstImageOffsets;
695
696 radeon_print(RADEON_TEXTURE, RADEON_TRACE,
697 "%s(%p, tex %p, image %p) compressed %d\n",
698 __func__, ctx, texObj, texImage, compressed);
699
700 if (image->mt) {
701 dstRowStride = image->mt->levels[image->mtlevel].rowstride;
702 } else if (t->bo) {
703 /* TFP case */
704 dstRowStride = get_texture_image_row_stride(rmesa, texImage->TexFormat, width, 0);
705 } else {
706 dstRowStride = _mesa_format_row_stride(texImage->TexFormat, texImage->Width);
707 }
708
709 assert(dstRowStride);
710
711 if (dims == 3) {
712 unsigned alignedWidth = dstRowStride/_mesa_get_format_bytes(texImage->TexFormat);
713 dstImageOffsets = allocate_image_offsets(ctx, alignedWidth, texImage->Height, texImage->Depth);
714 if (!dstImageOffsets) {
715 radeon_warning("%s Failed to allocate dstImaeOffset.\n", __func__);
716 return;
717 }
718 } else {
719 dstImageOffsets = texImage->ImageOffsets;
720 }
721
722 radeon_teximage_map(image, GL_TRUE);
723
724 if (compressed) {
725 uint32_t srcRowStride, bytesPerRow, rows, block_width, block_height;
726 GLubyte *img_start;
727
728 _mesa_get_format_block_size(texImage->TexFormat, &block_width, &block_height);
729
730 if (!image->mt) {
731 dstRowStride = _mesa_format_row_stride(texImage->TexFormat, texImage->Width);
732 img_start = _mesa_compressed_image_address(xoffset, yoffset, 0,
733 texImage->TexFormat,
734 texImage->Width, texImage->Data);
735 }
736 else {
737 uint32_t offset;
738 offset = dstRowStride / _mesa_get_format_bytes(texImage->TexFormat) * yoffset / block_height + xoffset / block_width;
739 offset *= _mesa_get_format_bytes(texImage->TexFormat);
740 img_start = texImage->Data + offset;
741 }
742 srcRowStride = _mesa_format_row_stride(texImage->TexFormat, width);
743 bytesPerRow = srcRowStride;
744 rows = (height + block_height - 1) / block_height;
745
746 copy_rows(img_start, dstRowStride, pixels, srcRowStride, rows, bytesPerRow);
747 }
748 else {
749 if (!_mesa_texstore(ctx, dims, texImage->_BaseFormat,
750 texImage->TexFormat, texImage->Data,
751 xoffset, yoffset, zoffset,
752 dstRowStride,
753 dstImageOffsets,
754 width, height, depth,
755 format, type, pixels, packing)) {
756 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage");
757 }
758 }
759
760 if (dims == 3) {
761 free(dstImageOffsets);
762 }
763
764 radeon_teximage_unmap(image);
765 }
766
767 /**
768 * All glTexImage calls go through this function.
769 */
770 static void radeon_teximage(
771 struct gl_context *ctx, int dims,
772 GLenum target, GLint level,
773 GLint internalFormat,
774 GLint width, GLint height, GLint depth,
775 GLsizei imageSize,
776 GLenum format, GLenum type, const GLvoid * pixels,
777 const struct gl_pixelstore_attrib *packing,
778 struct gl_texture_object *texObj,
779 struct gl_texture_image *texImage,
780 int compressed)
781 {
782 radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
783 radeonTexObj* t = radeon_tex_obj(texObj);
784 radeon_texture_image* image = get_radeon_texture_image(texImage);
785 GLuint face = _mesa_tex_target_to_face(target);
786
787 radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
788 "%s %dd: texObj %p, texImage %p, face %d, level %d\n",
789 __func__, dims, texObj, texImage, face, level);
790 {
791 struct radeon_bo *bo;
792 bo = !image->mt ? image->bo : image->mt->bo;
793 if (bo && radeon_bo_is_referenced_by_cs(bo, rmesa->cmdbuf.cs)) {
794 radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
795 "%s Calling teximage for texture that is "
796 "queued for GPU processing.\n",
797 __func__);
798 radeon_firevertices(rmesa);
799 }
800 }
801
802
803 t->validated = GL_FALSE;
804
805 /* Mesa core only clears texImage->Data but not image->mt */
806 radeonFreeTexImageData(ctx, texImage);
807
808 if (!t->bo) {
809 teximage_assign_miptree(rmesa, texObj, texImage, face, level);
810 if (!image->mt) {
811 int size = _mesa_format_image_size(texImage->TexFormat,
812 texImage->Width,
813 texImage->Height,
814 texImage->Depth);
815 texImage->Data = _mesa_alloc_texmemory(size);
816 radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
817 "%s %dd: texObj %p, texImage %p, "
818 " no miptree assigned, using local memory %p\n",
819 __func__, dims, texObj, texImage, texImage->Data);
820 }
821 }
822
823 /* Upload texture image; note that the spec allows pixels to be NULL */
824 if (compressed) {
825 pixels = _mesa_validate_pbo_compressed_teximage(
826 ctx, imageSize, pixels, packing, "glCompressedTexImage");
827 } else {
828 pixels = _mesa_validate_pbo_teximage(
829 ctx, dims, width, height, depth,
830 format, type, pixels, packing, "glTexImage");
831 }
832
833 if (pixels) {
834 radeon_store_teximage(ctx, dims,
835 0, 0, 0,
836 width, height, depth,
837 imageSize, format, type,
838 pixels, packing,
839 texObj, texImage,
840 compressed);
841 }
842
843 _mesa_unmap_teximage_pbo(ctx, packing);
844 }
845
846 void radeonTexImage1D(struct gl_context * ctx, GLenum target, GLint level,
847 GLint internalFormat,
848 GLint width, GLint border,
849 GLenum format, GLenum type, const GLvoid * pixels,
850 const struct gl_pixelstore_attrib *packing,
851 struct gl_texture_object *texObj,
852 struct gl_texture_image *texImage)
853 {
854 radeon_teximage(ctx, 1, target, level, internalFormat, width, 1, 1,
855 0, format, type, pixels, packing, texObj, texImage, 0);
856 }
857
858 void radeonTexImage2D(struct gl_context * ctx, GLenum target, GLint level,
859 GLint internalFormat,
860 GLint width, GLint height, GLint border,
861 GLenum format, GLenum type, const GLvoid * pixels,
862 const struct gl_pixelstore_attrib *packing,
863 struct gl_texture_object *texObj,
864 struct gl_texture_image *texImage)
865
866 {
867 radeon_teximage(ctx, 2, target, level, internalFormat, width, height, 1,
868 0, format, type, pixels, packing, texObj, texImage, 0);
869 }
870
871 void radeonCompressedTexImage2D(struct gl_context * ctx, GLenum target,
872 GLint level, GLint internalFormat,
873 GLint width, GLint height, GLint border,
874 GLsizei imageSize, const GLvoid * data,
875 struct gl_texture_object *texObj,
876 struct gl_texture_image *texImage)
877 {
878 radeon_teximage(ctx, 2, target, level, internalFormat, width, height, 1,
879 imageSize, 0, 0, data, &ctx->Unpack, texObj, texImage, 1);
880 }
881
882 void radeonTexImage3D(struct gl_context * ctx, GLenum target, GLint level,
883 GLint internalFormat,
884 GLint width, GLint height, GLint depth,
885 GLint border,
886 GLenum format, GLenum type, const GLvoid * pixels,
887 const struct gl_pixelstore_attrib *packing,
888 struct gl_texture_object *texObj,
889 struct gl_texture_image *texImage)
890 {
891 radeon_teximage(ctx, 3, target, level, internalFormat, width, height, depth,
892 0, format, type, pixels, packing, texObj, texImage, 0);
893 }
894
895 /**
896 * All glTexSubImage calls go through this function.
897 */
898 static void radeon_texsubimage(struct gl_context* ctx, int dims, GLenum target, int level,
899 GLint xoffset, GLint yoffset, GLint zoffset,
900 GLsizei width, GLsizei height, GLsizei depth,
901 GLsizei imageSize,
902 GLenum format, GLenum type,
903 const GLvoid * pixels,
904 const struct gl_pixelstore_attrib *packing,
905 struct gl_texture_object *texObj,
906 struct gl_texture_image *texImage,
907 int compressed)
908 {
909 radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
910 radeonTexObj* t = radeon_tex_obj(texObj);
911 radeon_texture_image* image = get_radeon_texture_image(texImage);
912
913 radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
914 "%s %dd: texObj %p, texImage %p, face %d, level %d\n",
915 __func__, dims, texObj, texImage,
916 _mesa_tex_target_to_face(target), level);
917 {
918 struct radeon_bo *bo;
919 bo = !image->mt ? image->bo : image->mt->bo;
920 if (bo && radeon_bo_is_referenced_by_cs(bo, rmesa->cmdbuf.cs)) {
921 radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
922 "%s Calling texsubimage for texture that is "
923 "queued for GPU processing.\n",
924 __func__);
925 radeon_firevertices(rmesa);
926 }
927 }
928
929
930 t->validated = GL_FALSE;
931 if (compressed) {
932 pixels = _mesa_validate_pbo_compressed_teximage(
933 ctx, imageSize, pixels, packing, "glCompressedTexSubImage");
934 } else {
935 pixels = _mesa_validate_pbo_teximage(ctx, dims,
936 width, height, depth, format, type, pixels, packing, "glTexSubImage");
937 }
938
939 if (pixels) {
940 radeon_store_teximage(ctx, dims,
941 xoffset, yoffset, zoffset,
942 width, height, depth,
943 imageSize, format, type,
944 pixels, packing,
945 texObj, texImage,
946 compressed);
947 }
948
949 _mesa_unmap_teximage_pbo(ctx, packing);
950 }
951
952 void radeonTexSubImage1D(struct gl_context * ctx, GLenum target, GLint level,
953 GLint xoffset,
954 GLsizei width,
955 GLenum format, GLenum type,
956 const GLvoid * pixels,
957 const struct gl_pixelstore_attrib *packing,
958 struct gl_texture_object *texObj,
959 struct gl_texture_image *texImage)
960 {
961 radeon_texsubimage(ctx, 1, target, level, xoffset, 0, 0, width, 1, 1, 0,
962 format, type, pixels, packing, texObj, texImage, 0);
963 }
964
965 void radeonTexSubImage2D(struct gl_context * ctx, GLenum target, GLint level,
966 GLint xoffset, GLint yoffset,
967 GLsizei width, GLsizei height,
968 GLenum format, GLenum type,
969 const GLvoid * pixels,
970 const struct gl_pixelstore_attrib *packing,
971 struct gl_texture_object *texObj,
972 struct gl_texture_image *texImage)
973 {
974 radeon_texsubimage(ctx, 2, target, level, xoffset, yoffset, 0, width, height, 1,
975 0, format, type, pixels, packing, texObj, texImage,
976 0);
977 }
978
979 void radeonCompressedTexSubImage2D(struct gl_context * ctx, GLenum target,
980 GLint level, GLint xoffset,
981 GLint yoffset, GLsizei width,
982 GLsizei height, GLenum format,
983 GLsizei imageSize, const GLvoid * data,
984 struct gl_texture_object *texObj,
985 struct gl_texture_image *texImage)
986 {
987 radeon_texsubimage(ctx, 2, target, level, xoffset, yoffset, 0, width, height, 1,
988 imageSize, format, 0, data, &ctx->Unpack, texObj, texImage, 1);
989 }
990
991
992 void radeonTexSubImage3D(struct gl_context * ctx, GLenum target, GLint level,
993 GLint xoffset, GLint yoffset, GLint zoffset,
994 GLsizei width, GLsizei height, GLsizei depth,
995 GLenum format, GLenum type,
996 const GLvoid * pixels,
997 const struct gl_pixelstore_attrib *packing,
998 struct gl_texture_object *texObj,
999 struct gl_texture_image *texImage)
1000 {
1001 radeon_texsubimage(ctx, 3, target, level, xoffset, yoffset, zoffset, width, height, depth, 0,
1002 format, type, pixels, packing, texObj, texImage, 0);
1003 }
1004
1005 unsigned radeonIsFormatRenderable(gl_format mesa_format)
1006 {
1007 if (mesa_format == _dri_texformat_argb8888 || mesa_format == _dri_texformat_rgb565 ||
1008 mesa_format == _dri_texformat_argb1555 || mesa_format == _dri_texformat_argb4444)
1009 return 1;
1010
1011 switch (mesa_format)
1012 {
1013 case MESA_FORMAT_Z16:
1014 case MESA_FORMAT_S8_Z24:
1015 return 1;
1016 default:
1017 return 0;
1018 }
1019 }
1020
1021 #if FEATURE_OES_EGL_image
1022 void radeon_image_target_texture_2d(struct gl_context *ctx, GLenum target,
1023 struct gl_texture_object *texObj,
1024 struct gl_texture_image *texImage,
1025 GLeglImageOES image_handle)
1026 {
1027 radeonContextPtr radeon = RADEON_CONTEXT(ctx);
1028 radeonTexObj *t = radeon_tex_obj(texObj);
1029 radeon_texture_image *radeonImage = get_radeon_texture_image(texImage);
1030 __DRIscreen *screen;
1031 __DRIimage *image;
1032
1033 screen = radeon->dri.screen;
1034 image = screen->dri2.image->lookupEGLImage(screen, image_handle,
1035 screen->loaderPrivate);
1036 if (image == NULL)
1037 return;
1038
1039 radeonFreeTexImageData(ctx, texImage);
1040
1041 texImage->Width = image->width;
1042 texImage->Height = image->height;
1043 texImage->Depth = 1;
1044 texImage->_BaseFormat = GL_RGBA;
1045 texImage->TexFormat = image->format;
1046 texImage->RowStride = image->pitch;
1047 texImage->InternalFormat = image->internal_format;
1048
1049 if(t->mt)
1050 {
1051 radeon_miptree_unreference(&t->mt);
1052 t->mt = NULL;
1053 }
1054
1055 /* NOTE: The following is *very* ugly and will probably break. But
1056 I don't know how to deal with it, without creating a whole new
1057 function like radeon_miptree_from_bo() so I'm going with the
1058 easy but error-prone way. */
1059
1060 radeon_try_alloc_miptree(radeon, t);
1061
1062 radeonImage->mtface = _mesa_tex_target_to_face(target);
1063 radeonImage->mtlevel = 0;
1064 radeon_miptree_reference(t->mt, &radeonImage->mt);
1065
1066 if (t->mt == NULL)
1067 {
1068 radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
1069 "%s Failed to allocate miptree.\n", __func__);
1070 return;
1071 }
1072
1073 /* Particularly ugly: this is guaranteed to break, if image->bo is
1074 not of the required size for a miptree. */
1075 radeon_bo_unref(t->mt->bo);
1076 radeon_bo_ref(image->bo);
1077 t->mt->bo = image->bo;
1078
1079 if (!radeon_miptree_matches_image(t->mt, &radeonImage->base,
1080 radeonImage->mtface, 0))
1081 fprintf(stderr, "miptree doesn't match image\n");
1082 }
1083 #endif