2 * GLX Hardware Device Driver for Intel i810
3 * Copyright (C) 1999 Keith Whitwell
4 * Texmem interface changes (C) 2003 Dave Airlie
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
22 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #include "main/glheader.h"
27 #include "main/macros.h"
28 #include "main/mtypes.h"
29 #include "main/simple_list.h"
30 #include "main/enums.h"
31 #include "main/colormac.h"
33 #include "main/texformat.h"
35 #include "i810screen.h"
37 #include "i810context.h"
39 #include "i810state.h"
40 #include "i810ioctl.h"
43 void i810DestroyTexObj(i810ContextPtr imesa
, i810TextureObjectPtr t
)
45 /* See if it was the driver's current object.
47 if ( imesa
!= NULL
) {
48 if (imesa
->CurrentTexObj
[0] == t
) {
49 imesa
->CurrentTexObj
[0] = 0;
50 imesa
->dirty
&= ~I810_UPLOAD_TEX0
;
53 if (imesa
->CurrentTexObj
[1] == t
) {
54 imesa
->CurrentTexObj
[1] = 0;
55 imesa
->dirty
&= ~I810_UPLOAD_TEX1
;
62 #if defined(i386) || defined(__i386__)
63 /* From linux kernel i386 header files, copes with odd sizes better
64 * than COPY_DWORDS would:
66 static INLINE
void * __memcpy(void * to
, const void * from
, size_t n
)
74 "1:\ttestb $1,%b4\n\t"
78 : "=&c" (d0
), "=&D" (d1
), "=&S" (d2
)
79 :"0" (n
/4), "q" (n
),"1" ((long) to
),"2" ((long) from
)
84 /* Allow compilation on other architectures */
85 #define __memcpy memcpy
88 /* Upload an image from mesa's internal copy.
90 static void i810UploadTexLevel( i810ContextPtr imesa
,
91 i810TextureObjectPtr t
, int hwlevel
)
93 const struct gl_texture_image
*image
= t
->image
[hwlevel
].image
;
96 if (!image
|| !image
->Data
)
99 if (image
->Width
* image
->TexFormat
->TexelBytes
== t
->Pitch
) {
100 GLubyte
*dst
= (GLubyte
*)(t
->BufAddr
+ t
->image
[hwlevel
].offset
);
101 GLubyte
*src
= (GLubyte
*)image
->Data
;
103 memcpy( dst
, src
, t
->Pitch
* image
->Height
);
105 else switch (image
->TexFormat
->TexelBytes
) {
108 GLubyte
*dst
= (GLubyte
*)(t
->BufAddr
+ t
->image
[hwlevel
].offset
);
109 GLubyte
*src
= (GLubyte
*)image
->Data
;
111 for (j
= 0 ; j
< image
->Height
; j
++, dst
+= t
->Pitch
) {
112 __memcpy(dst
, src
, image
->Width
);
120 GLushort
*dst
= (GLushort
*)(t
->BufAddr
+ t
->image
[hwlevel
].offset
);
121 GLushort
*src
= (GLushort
*)image
->Data
;
123 for (j
= 0 ; j
< image
->Height
; j
++, dst
+= (t
->Pitch
/2)) {
124 __memcpy(dst
, src
, image
->Width
* 2 );
131 fprintf(stderr
, "%s: Not supported texel size %d\n",
132 __FUNCTION__
, image
->TexFormat
->TexelBytes
);
136 /* This is called with the lock held. May have to eject our own and/or
137 * other client's texture objects to make room for the upload.
139 int i810UploadTexImagesLocked( i810ContextPtr imesa
, i810TextureObjectPtr t
)
145 /* Do we need to eject LRU texture objects?
147 if (!t
->base
.memBlock
) {
150 heap
= driAllocateTexture( imesa
->texture_heaps
, imesa
->nr_heaps
,
151 (driTextureObject
*) t
);
157 ofs
= t
->base
.memBlock
->ofs
;
158 t
->BufAddr
= imesa
->i810Screen
->tex
.map
+ ofs
;
159 t
->Setup
[I810_TEXREG_MI3
] = imesa
->i810Screen
->textureOffset
+ ofs
;
161 if (t
== imesa
->CurrentTexObj
[0])
162 I810_STATECHANGE(imesa
, I810_UPLOAD_TEX0
);
164 if (t
== imesa
->CurrentTexObj
[1])
165 I810_STATECHANGE(imesa
, I810_UPLOAD_TEX1
);
167 /* i810UpdateTexLRU( imesa, t );*/
169 driUpdateTextureLRU( (driTextureObject
*) t
);
171 if (imesa
->texture_heaps
[0]->timestamp
>= GET_DISPATCH_AGE(imesa
))
172 i810WaitAgeLocked( imesa
, imesa
->texture_heaps
[0]->timestamp
);
174 numLevels
= t
->base
.lastLevel
- t
->base
.firstLevel
+ 1;
175 for (i
= 0 ; i
< numLevels
; i
++)
176 if (t
->base
.dirty_images
[0] & (1<<i
))
177 i810UploadTexLevel( imesa
, t
, i
);
179 t
->base
.dirty_images
[0] = 0;