1 #include "swrast/swrast.h"
2 #include "main/texobj.h"
3 #include "main/teximage.h"
4 #include "main/mipmap.h"
5 #include "drivers/common/meta.h"
6 #include "intel_context.h"
7 #include "intel_mipmap_tree.h"
10 #define FILE_DEBUG_FLAG DEBUG_TEXTURE
12 static struct gl_texture_image
*
13 intelNewTextureImage(GLcontext
* ctx
)
15 DBG("%s\n", __FUNCTION__
);
17 return (struct gl_texture_image
*) CALLOC_STRUCT(intel_texture_image
);
21 static struct gl_texture_object
*
22 intelNewTextureObject(GLcontext
* ctx
, GLuint name
, GLenum target
)
24 struct intel_texture_object
*obj
= CALLOC_STRUCT(intel_texture_object
);
26 DBG("%s\n", __FUNCTION__
);
27 _mesa_initialize_texture_object(&obj
->base
, name
, target
);
33 intelDeleteTextureObject(GLcontext
*ctx
,
34 struct gl_texture_object
*texObj
)
36 struct intel_context
*intel
= intel_context(ctx
);
37 struct intel_texture_object
*intelObj
= intel_texture_object(texObj
);
40 intel_miptree_release(intel
, &intelObj
->mt
);
42 _mesa_delete_texture_object(ctx
, texObj
);
47 intelFreeTextureImageData(GLcontext
* ctx
, struct gl_texture_image
*texImage
)
49 struct intel_context
*intel
= intel_context(ctx
);
50 struct intel_texture_image
*intelImage
= intel_texture_image(texImage
);
52 DBG("%s\n", __FUNCTION__
);
55 intel_miptree_release(intel
, &intelImage
->mt
);
59 _mesa_free_texmemory(texImage
->Data
);
60 texImage
->Data
= NULL
;
65 /* The system memcpy (at least on ubuntu 5.10) has problems copying
66 * to agp (writecombined) memory from a source which isn't 64-byte
67 * aligned - there is a 4x performance falloff.
69 * The x86 __memcpy is immune to this but is slightly slower
70 * (10%-ish) than the system memcpy.
72 * The sse_memcpy seems to have a slight cliff at 64/32 bytes, but
73 * isn't much faster than x86_memcpy for agp copies.
75 * TODO: switch dynamically.
78 do_memcpy(void *dest
, const void *src
, size_t n
)
80 if ((((unsigned long) src
) & 63) || (((unsigned long) dest
) & 63)) {
81 return __memcpy(dest
, src
, n
);
84 return memcpy(dest
, src
, n
);
88 #if DO_DEBUG && !defined(__ia64__)
95 __asm__
volatile ("\t"
97 "cpuid\n\t" ".byte 0x0f, 0x31\n\t"
98 "popl %%ebx\n":"=a" (eax
)
100 :"ecx", "edx", "cc");
109 __asm__
volatile ("\t" "cpuid\n\t" ".byte 0x0f, 0x31\n\t":"=a" (eax
)
111 :"ecx", "edx", "ebx", "cc");
118 time_diff(unsigned t
, unsigned t2
)
120 return ((t
< t2
) ? t2
- t
: 0xFFFFFFFFU
- (t
- t2
- 1));
125 timed_memcpy(void *dest
, const void *src
, size_t n
)
131 if ((((unsigned) src
) & 63) || (((unsigned) dest
) & 63))
132 printf("Warning - non-aligned texture copy!\n");
135 ret
= do_memcpy(dest
, src
, n
);
138 rate
= time_diff(t1
, t2
);
140 printf("timed_memcpy: %u %u --> %f clocks/byte\n", t1
, t2
, rate
);
143 #endif /* DO_DEBUG */
147 * Called via ctx->Driver.GenerateMipmap()
148 * This is basically a wrapper for _mesa_meta_GenerateMipmap() which checks
149 * if we'll be using software mipmap generation. In that case, we need to
150 * map/unmap the base level texture image.
153 intelGenerateMipmap(GLcontext
*ctx
, GLenum target
,
154 struct gl_texture_object
*texObj
)
156 if (_mesa_meta_check_generate_mipmap_fallback(ctx
, target
, texObj
)) {
157 /* sw path: need to map texture images */
158 struct intel_context
*intel
= intel_context(ctx
);
159 struct intel_texture_object
*intelObj
= intel_texture_object(texObj
);
160 intel_tex_map_level_images(intel
, intelObj
, texObj
->BaseLevel
);
161 _mesa_generate_mipmap(ctx
, target
, texObj
);
162 intel_tex_unmap_level_images(intel
, intelObj
, texObj
->BaseLevel
);
165 GLuint nr_faces
= (texObj
->Target
== GL_TEXTURE_CUBE_MAP
) ? 6 : 1;
167 /* Update the level information in our private data in the new images,
168 * since it didn't get set as part of a normal TexImage path.
170 for (face
= 0; face
< nr_faces
; face
++) {
171 for (i
= texObj
->BaseLevel
+ 1; i
< texObj
->MaxLevel
; i
++) {
172 struct intel_texture_image
*intelImage
=
173 intel_texture_image(texObj
->Image
[face
][i
]);
176 intelImage
->level
= i
;
177 intelImage
->face
= face
;
178 /* Unreference the miptree to signal that the new Data is a
179 * bare pointer from mesa.
181 intel_miptree_release(intel
, &intelImage
->mt
);
187 _mesa_meta_GenerateMipmap(ctx
, target
, texObj
);
193 intelInitTextureFuncs(struct dd_function_table
*functions
)
195 functions
->ChooseTextureFormat
= intelChooseTextureFormat
;
196 functions
->GenerateMipmap
= intelGenerateMipmap
;
198 functions
->NewTextureObject
= intelNewTextureObject
;
199 functions
->NewTextureImage
= intelNewTextureImage
;
200 functions
->DeleteTexture
= intelDeleteTextureObject
;
201 functions
->FreeTexImageData
= intelFreeTextureImageData
;
202 functions
->UpdateTexturePalette
= 0;
204 #if DO_DEBUG && !defined(__ia64__)
205 if (INTEL_DEBUG
& DEBUG_BUFMGR
)
206 functions
->TextureMemCpy
= timed_memcpy
;
209 functions
->TextureMemCpy
= do_memcpy
;