intel_tex.c revision 3e0164aabb48a99fce58964cad99fd3978ee84f6
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "swrast/swrast.h"
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/texobj.h"
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/teximage.h"
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/mipmap.h"
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "intel_context.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "intel_mipmap_tree.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "intel_tex.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FILE_DEBUG_FLAG DEBUG_TEXTURE
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static GLboolean
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)intelIsTextureResident(GLcontext * ctx, struct gl_texture_object *texObj)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if 0
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct intel_context *intel = intel_context(ctx);
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct intel_texture_object *intelObj = intel_texture_object(texObj);
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   return
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      intelObj->mt &&
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      intelObj->mt->region &&
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      intel_is_region_resident(intel, intelObj->mt->region);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return 1;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct gl_texture_image *
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)intelNewTextureImage(GLcontext * ctx)
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   DBG("%s\n", __FUNCTION__);
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   (void) ctx;
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)   return (struct gl_texture_image *) CALLOC_STRUCT(intel_texture_image);
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static struct gl_texture_object *
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)intelNewTextureObject(GLcontext * ctx, GLuint name, GLenum target)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct intel_texture_object *obj = CALLOC_STRUCT(intel_texture_object);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   DBG("%s\n", __FUNCTION__);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   _mesa_initialize_texture_object(&obj->base, name, target);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return &obj->base;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)intelDeleteTextureObject(GLcontext *ctx,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 struct gl_texture_object *texObj)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct intel_context *intel = intel_context(ctx);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct intel_texture_object *intelObj = intel_texture_object(texObj);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (intelObj->mt)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      intel_miptree_release(intel, &intelObj->mt);
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   _mesa_delete_texture_object(ctx, texObj);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)intelFreeTextureImageData(GLcontext * ctx, struct gl_texture_image *texImage)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct intel_context *intel = intel_context(ctx);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct intel_texture_image *intelImage = intel_texture_image(texImage);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   DBG("%s\n", __FUNCTION__);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   if (intelImage->mt) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      intel_miptree_release(intel, &intelImage->mt);
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   }
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   if (texImage->Data) {
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      _mesa_free_texmemory(texImage->Data);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      texImage->Data = NULL;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* The system memcpy (at least on ubuntu 5.10) has problems copying
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to agp (writecombined) memory from a source which isn't 64-byte
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * aligned - there is a 4x performance falloff.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The x86 __memcpy is immune to this but is slightly slower
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (10%-ish) than the system memcpy.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The sse_memcpy seems to have a slight cliff at 64/32 bytes, but
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * isn't much faster than x86_memcpy for agp copies.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: switch dynamically.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_memcpy(void *dest, const void *src, size_t n)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ((((unsigned) src) & 63) || (((unsigned) dest) & 63)) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return __memcpy(dest, src, n);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return memcpy(dest, src, n);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if DO_DEBUG && !defined(__ia64__)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef __x86_64__
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fastrdtsc(void)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned eax;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __asm__ volatile ("\t"
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "pushl  %%ebx\n\t"
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "cpuid\n\t" ".byte 0x0f, 0x31\n\t"
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "popl %%ebx\n":"=a" (eax)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :"0"(0)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :"ecx", "edx", "cc");
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return eax;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fastrdtsc(void)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned eax;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   __asm__ volatile ("\t" "cpuid\n\t" ".byte 0x0f, 0x31\n\t":"=a" (eax)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :"0"(0)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     :"ecx", "edx", "ebx", "cc");
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return eax;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static unsigned
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)time_diff(unsigned t, unsigned t2)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return ((t < t2) ? t2 - t : 0xFFFFFFFFU - (t - t2 - 1));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void *
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)timed_memcpy(void *dest, const void *src, size_t n)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   void *ret;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   unsigned t1, t2;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   double rate;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if ((((unsigned) src) & 63) || (((unsigned) dest) & 63))
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _mesa_printf("Warning - non-aligned texture copy!\n");
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   t1 = fastrdtsc();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ret = do_memcpy(dest, src, n);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   t2 = fastrdtsc();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   rate = time_diff(t1, t2);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   rate /= (double) n;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   _mesa_printf("timed_memcpy: %u %u --> %f clocks/byte\n", t1, t2, rate);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return ret;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* DO_DEBUG */
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Generate new mipmap data from BASE+1 to BASE+p (the minimally-sized mipmap
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * level).
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * The texture object's miptree must be mapped.
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It would be really nice if this was just called by Mesa whenever mipmaps
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * needed to be regenerated, rather than us having to remember to do so in
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * each texture image modification path.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This function should also include an accelerated path.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)intel_generate_mipmap(GLcontext *ctx, GLenum target,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      struct gl_texture_object *texObj)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct intel_context *intel = intel_context(ctx);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct intel_texture_object *intelObj = intel_texture_object(texObj);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   GLuint nr_faces = (intelObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   int face, i;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   _mesa_generate_mipmap(ctx, target, texObj);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   /* Update the level information in our private data in the new images, since
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    * it didn't get set as part of a normal TexImage path.
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    */
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   for (face = 0; face < nr_faces; face++) {
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (i = texObj->BaseLevel + 1; i < texObj->MaxLevel; i++) {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         struct intel_texture_image *intelImage;
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	 intelImage = intel_texture_image(texObj->Image[face][i]);
1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	 if (intelImage == NULL)
1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	    break;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 intelImage->level = i;
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)	 intelImage->face = face;
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	 /* Unreference the miptree to signal that the new Data is a bare
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	  * pointer from mesa.
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	  */
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 intel_miptree_release(intel, &intelImage->mt);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   }
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic void intelGenerateMipmap(GLcontext *ctx, GLenum target, struct gl_texture_object *texObj)
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   struct intel_context *intel = intel_context(ctx);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   struct intel_texture_object *intelObj = intel_texture_object(texObj);
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   intel_tex_map_level_images(intel, intelObj, texObj->BaseLevel);
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   intel_generate_mipmap(ctx, target, texObj);
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   intel_tex_unmap_level_images(intel, intelObj, texObj->BaseLevel);
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)intelInitTextureFuncs(struct dd_function_table *functions)
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->ChooseTextureFormat = intelChooseTextureFormat;
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->TexImage1D = intelTexImage1D;
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->TexImage2D = intelTexImage2D;
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->TexImage3D = intelTexImage3D;
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->TexSubImage1D = intelTexSubImage1D;
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->TexSubImage2D = intelTexSubImage2D;
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->TexSubImage3D = intelTexSubImage3D;
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->CopyTexImage1D = intelCopyTexImage1D;
2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   functions->CopyTexImage2D = intelCopyTexImage2D;
2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   functions->CopyTexSubImage1D = intelCopyTexSubImage1D;
2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   functions->CopyTexSubImage2D = intelCopyTexSubImage2D;
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   functions->GetTexImage = intelGetTexImage;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   functions->GenerateMipmap = intelGenerateMipmap;
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   /* compressed texture functions */
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->CompressedTexImage2D = intelCompressedTexImage2D;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   functions->GetCompressedTexImage = intelGetCompressedTexImage;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->NewTextureObject = intelNewTextureObject;
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->NewTextureImage = intelNewTextureImage;
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->DeleteTexture = intelDeleteTextureObject;
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   functions->FreeTexImageData = intelFreeTextureImageData;
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->UpdateTexturePalette = 0;
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   functions->IsTextureResident = intelIsTextureResident;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if DO_DEBUG && !defined(__ia64__)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (INTEL_DEBUG & DEBUG_BUFMGR)
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      functions->TextureMemCpy = timed_memcpy;
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   else
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      functions->TextureMemCpy = do_memcpy;
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)