summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/i915/intel_tex.c
blob: fb542ed7b5cca1843acf78cf208ac8f298270445 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "texobj.h"
#include "intel_context.h"
#include "intel_mipmap_tree.h"
#include "intel_tex.h"


static GLboolean intelIsTextureResident(GLcontext *ctx,
                                      struct gl_texture_object *texObj)
{
#if 0
   struct intel_context *intel = intel_context(ctx);
   struct intel_texture_object *intelObj = intel_texture_object(texObj);
   
   return 
      intelObj->mt && 
      intelObj->mt->region && 
      intel_is_region_resident(intel, intelObj->mt->region);
#endif
   return 1;
}



static struct gl_texture_image *intelNewTextureImage( GLcontext *ctx )
{
   (void) ctx;
   return (struct gl_texture_image *)CALLOC_STRUCT(intel_texture_image);
}


static struct gl_texture_object *intelNewTextureObject( GLcontext *ctx, 
							GLuint name, 
							GLenum target )
{
   struct intel_texture_object *obj = CALLOC_STRUCT(intel_texture_object);

   _mesa_initialize_texture_object(&obj->base, name, target);

   return &obj->base;
}


static void intelFreeTextureImageData( GLcontext *ctx, 
				     struct gl_texture_image *texImage )
{
   struct intel_context *intel = intel_context(ctx);
   struct intel_texture_image *intelImage = intel_texture_image(texImage);

   if (intelImage->mt) {
      intel_miptree_release(intel, intelImage->mt);
      intelImage->mt = NULL;
   }
   
   if (texImage->Data) {
      free(texImage->Data);
      texImage->Data = NULL;
   }
}


void intelInitTextureFuncs(struct dd_function_table * functions)
{
   functions->ChooseTextureFormat = intelChooseTextureFormat;
   functions->TexImage1D = intelTexImage1D;
   functions->TexImage2D = intelTexImage2D;
   functions->TexSubImage1D = intelTexSubImage1D;
   functions->TexSubImage2D = intelTexSubImage2D;
   functions->CopyTexImage1D = intelCopyTexImage1D;
   functions->CopyTexImage2D = intelCopyTexImage2D;
   functions->CopyTexSubImage1D = intelCopyTexSubImage1D;
   functions->CopyTexSubImage2D = intelCopyTexSubImage2D;
   functions->NewTextureObject = intelNewTextureObject;
   functions->NewTextureImage = intelNewTextureImage;
   functions->DeleteTexture = _mesa_delete_texture_object;
   functions->FreeTexImageData = intelFreeTextureImageData;
   functions->UpdateTexturePalette = 0;
   functions->IsTextureResident = intelIsTextureResident;

   /* The system memcpy (at least on ubuntu 5.10) has problems copying
    * to agp (writecombined) memory from a source which isn't 64-byte
    * aligned - there is a 4x performance falloff.
    *
    * The x86 __memcpy is immune to this but is slightly slower
    * (10%-ish) than the system memcpy.
    *
    * The sse_memcpy seems to have a slight cliff at 64/32 bytes, but
    * isn't much faster than x86_memcpy for agp copies.
    * 
    * TODO: switch dynamically.
    */
   functions->TextureMemCpy = __memcpy;	
}