2 * NOTE: All 3D code is untested and most definitely broken...
5 #define DST_TEXEL_BYTES (4 / DST_TEXELS_PER_DWORD)
6 #define DST_ROW_WIDTH (convert->width * DST_TEXEL_BYTES)
7 #define DST_ROW_STRIDE (convert->imageWidth * DST_TEXEL_BYTES)
8 #define DST_IMG_STRIDE (convert->imageWidth * \
9 convert->imageHeight * DST_TEXEL_BYTES)
12 /* ================================================================
13 * PRE: No pixelstore attribs, width == imageWidth.
16 TAG(texsubimage2d
)( struct gl_texture_convert
*convert
)
18 const GLubyte
*src
= (const GLubyte
*)convert
->srcImage
;
19 GLuint
*dst
= (GLuint
*)((GLubyte
*)convert
->dstImage
+
20 (convert
->yoffset
* convert
->imageWidth
+
21 convert
->xoffset
) * DST_TEXEL_BYTES
);
23 (void) dwords
; (void) i
;
26 fprintf( stderr
, __FUNCTION__
"\n" );
29 MEMCPY( dst
, src
, convert
->height
* DST_ROW_WIDTH
);
31 dwords
= (convert
->width
* convert
->height
+
32 DST_TEXELS_PER_DWORD
- 1) / DST_TEXELS_PER_DWORD
;
34 for ( i
= 0 ; i
< dwords
; i
++ ) {
35 *dst
++ = CONVERT_TEXEL_DWORD( src
);
36 src
+= SRC_TEXEL_BYTES
* DST_TEXELS_PER_DWORD
;
43 /* PRE: As above, height == imageHeight also.
46 TAG(texsubimage3d
)( struct gl_texture_convert
*convert
)
48 const GLubyte
*src
= (const GLubyte
*)convert
->srcImage
;
49 GLuint
*dst
= (GLuint
*)((GLubyte
*)convert
->dstImage
+
50 ((convert
->zoffset
* convert
->height
+
51 convert
->yoffset
) * convert
->width
+
52 convert
->xoffset
) * DST_TEXEL_BYTES
);
54 (void) dwords
; (void) i
;
57 fprintf( stderr
, __FUNCTION__
"\n" );
60 MEMCPY( dst
, src
, convert
->depth
* convert
->height
* DST_ROW_WIDTH
);
62 dwords
= (convert
->width
* convert
->height
* convert
->depth
+
63 DST_TEXELS_PER_DWORD
- 1) / DST_TEXELS_PER_DWORD
;
65 for ( i
= 0 ; i
< dwords
; i
++ ) {
66 *dst
++ = CONVERT_TEXEL_DWORD( src
);
67 src
+= SRC_TEXEL_BYTES
* DST_TEXELS_PER_DWORD
;
76 /* ================================================================
77 * PRE: No pixelstore attribs, width != imageWidth.
80 TAG(texsubimage2d_stride
)( struct gl_texture_convert
*convert
)
82 const GLubyte
*src
= (const GLubyte
*)convert
->srcImage
;
83 DST_TYPE
*dst
= (DST_TYPE
*)((GLubyte
*)convert
->dstImage
+
84 (convert
->yoffset
* convert
->imageWidth
+
85 convert
->xoffset
) * DST_TEXEL_BYTES
);
89 adjust
= convert
->imageWidth
- convert
->width
;
92 fprintf( stderr
, __FUNCTION__
":\n" );
93 fprintf( stderr
, " x=%d y=%d w=%d h=%d s=%d\n",
94 convert
->xoffset
, convert
->yoffset
, convert
->width
,
95 convert
->height
, convert
->imageWidth
);
96 fprintf( stderr
, " adjust=%d\n", adjust
);
99 for ( row
= 0 ; row
< convert
->height
; row
++ ) {
100 for ( col
= 0 ; col
< convert
->width
; col
++ ) {
101 *dst
++ = CONVERT_TEXEL( src
);
102 src
+= SRC_TEXEL_BYTES
;
110 /* PRE: As above, or height != imageHeight also.
113 TAG(texsubimage3d_stride
)( struct gl_texture_convert
*convert
)
115 const GLubyte
*src
= (const GLubyte
*)convert
->srcImage
;
116 DST_TYPE
*dst
= (DST_TYPE
*)((GLubyte
*)convert
->dstImage
+
117 ((convert
->zoffset
* convert
->imageHeight
+
118 convert
->yoffset
) * convert
->imageWidth
+
119 convert
->xoffset
) * DST_TEXEL_BYTES
);
123 adjust
= convert
->imageWidth
- convert
->width
;
126 fprintf( stderr
, __FUNCTION__
":\n" );
127 fprintf( stderr
, " x=%d y=%d w=%d h=%d s=%d\n",
128 convert
->xoffset
, convert
->yoffset
, convert
->width
,
129 convert
->height
, convert
->imageWidth
);
130 fprintf( stderr
, " adjust=%d\n", adjust
);
133 for ( img
= 0 ; img
< convert
->depth
; img
++ ) {
134 for ( row
= 0 ; row
< convert
->height
; row
++ ) {
135 for ( col
= 0 ; col
< convert
->width
; col
++ ) {
136 *dst
++ = CONVERT_TEXEL( src
);
137 src
+= SRC_TEXEL_BYTES
;
149 /* ================================================================
150 * PRE: Require pixelstore attribs, width == imageWidth.
153 TAG(texsubimage2d_pack
)( struct gl_texture_convert
*convert
)
155 const GLubyte
*src
= (const GLubyte
*)
156 _mesa_image_address( convert
->packing
, convert
->srcImage
,
157 convert
->width
, convert
->height
,
158 convert
->format
, convert
->type
, 0, 0, 0 );
159 const GLint srcRowStride
=
160 _mesa_image_row_stride( convert
->packing
, convert
->width
,
161 convert
->format
, convert
->type
);
162 GLuint
*dst
= (GLuint
*)((GLubyte
*)convert
->dstImage
+
163 (convert
->yoffset
* convert
->width
+
164 convert
->xoffset
) * DST_TEXEL_BYTES
);
170 fprintf( stderr
, __FUNCTION__
"\n" );
172 width
= ((convert
->width
+ DST_TEXELS_PER_DWORD
- 1)
173 & ~(DST_TEXELS_PER_DWORD
- 1));
175 for ( row
= 0 ; row
< convert
->height
; row
++ ) {
176 #ifdef CONVERT_DIRECT
177 MEMCPY( dst
, src
, DST_ROW_STRIDE
);
179 dst
= (GLuint
*)((GLubyte
*)dst
+ DST_ROW_STRIDE
);
181 const GLubyte
*srcRow
= src
;
182 for ( col
= width
/ DST_TEXELS_PER_DWORD
; col
; col
-- ) {
183 *dst
++ = CONVERT_TEXEL_DWORD( src
);
184 src
+= SRC_TEXEL_BYTES
* DST_TEXELS_PER_DWORD
;
186 src
= srcRow
+ srcRowStride
;
193 /* PRE: as above, height == imageHeight also.
196 TAG(texsubimage3d_pack
)( struct gl_texture_convert
*convert
)
198 const GLubyte
*src
= (const GLubyte
*)
199 _mesa_image_address( convert
->packing
, convert
->srcImage
,
200 convert
->width
, convert
->height
,
201 convert
->format
, convert
->type
, 0, 0, 0 );
202 const GLint srcRowStride
=
203 _mesa_image_row_stride( convert
->packing
, convert
->width
,
204 convert
->format
, convert
->type
);
205 GLuint
*dst
= (GLuint
*)((GLubyte
*)convert
->dstImage
+
206 ((convert
->zoffset
* convert
->height
+
207 convert
->yoffset
) * convert
->width
+
208 convert
->xoffset
) * DST_TEXEL_BYTES
);
214 fprintf( stderr
, __FUNCTION__
"\n" );
216 width
= ((convert
->width
+ DST_TEXELS_PER_DWORD
- 1)
217 & ~(DST_TEXELS_PER_DWORD
- 1));
219 for ( img
= 0 ; img
< convert
->depth
; img
++ ) {
220 for ( row
= 0 ; row
< convert
->height
; row
++ ) {
221 #ifdef CONVERT_DIRECT
222 MEMCPY( dst
, src
, DST_ROW_STRIDE
);
224 dst
= (GLuint
*)((GLubyte
*)dst
+ DST_ROW_STRIDE
);
226 const GLubyte
*srcRow
= src
;
227 for ( col
= width
/ DST_TEXELS_PER_DWORD
; col
; col
-- ) {
228 *dst
++ = CONVERT_TEXEL_DWORD( src
);
229 src
+= SRC_TEXEL_BYTES
* DST_TEXELS_PER_DWORD
;
231 src
= srcRow
+ srcRowStride
;
241 /* ================================================================
242 * PRE: Require pixelstore attribs, width != imageWidth.
245 TAG(texsubimage2d_stride_pack
)( struct gl_texture_convert
*convert
)
247 const GLubyte
*src
= (const GLubyte
*)
248 _mesa_image_address( convert
->packing
, convert
->srcImage
,
249 convert
->width
, convert
->height
,
250 convert
->format
, convert
->type
, 0, 0, 0 );
251 const GLint srcRowStride
=
252 _mesa_image_row_stride( convert
->packing
, convert
->width
,
253 convert
->format
, convert
->type
);
254 DST_TYPE
*dst
= (DST_TYPE
*)((GLubyte
*)convert
->dstImage
+
255 (convert
->yoffset
* convert
->imageWidth
+
256 convert
->xoffset
) * DST_TEXEL_BYTES
);
261 adjust
= convert
->imageWidth
- convert
->width
;
264 fprintf( stderr
, __FUNCTION__
":\n" );
265 fprintf( stderr
, " x=%d y=%d w=%d h=%d s=%d\n",
266 convert
->xoffset
, convert
->yoffset
, convert
->width
,
267 convert
->height
, convert
->imageWidth
);
268 fprintf( stderr
, " adjust=%d\n", adjust
);
271 for ( row
= 0 ; row
< convert
->height
; row
++ ) {
272 #ifdef CONVERT_DIRECT
273 MEMCPY( dst
, src
, DST_ROW_WIDTH
);
275 dst
+= convert
->imageWidth
;
277 const GLubyte
*srcRow
= src
;
278 for ( col
= 0 ; col
< convert
->width
; col
++ ) {
279 *dst
++ = CONVERT_TEXEL( src
);
280 src
+= SRC_TEXEL_BYTES
;
282 src
= srcRow
+ srcRowStride
;
290 /* PRE: As above, or height != imageHeight also.
293 TAG(texsubimage3d_stride_pack
)( struct gl_texture_convert
*convert
)
295 const GLubyte
*src
= (const GLubyte
*)
296 _mesa_image_address( convert
->packing
, convert
->srcImage
,
297 convert
->width
, convert
->height
,
298 convert
->format
, convert
->type
, 0, 0, 0 );
299 const GLint srcRowStride
=
300 _mesa_image_row_stride( convert
->packing
, convert
->width
,
301 convert
->format
, convert
->type
);
302 DST_TYPE
*dst
= (DST_TYPE
*)((GLubyte
*)convert
->dstImage
+
303 ((convert
->zoffset
* convert
->imageHeight
+
304 convert
->yoffset
) * convert
->imageWidth
+
305 convert
->xoffset
) * DST_TEXEL_BYTES
);
310 adjust
= convert
->imageWidth
- convert
->width
;
313 fprintf( stderr
, __FUNCTION__
":\n" );
314 fprintf( stderr
, " x=%d y=%d w=%d h=%d s=%d\n",
315 convert
->xoffset
, convert
->yoffset
, convert
->width
,
316 convert
->height
, convert
->imageWidth
);
317 fprintf( stderr
, " adjust=%d\n", adjust
);
320 for ( img
= 0 ; img
< convert
->depth
; img
++ ) {
321 for ( row
= 0 ; row
< convert
->height
; row
++ ) {
322 #ifdef CONVERT_DIRECT
323 MEMCPY( dst
, src
, DST_ROW_WIDTH
);
325 dst
+= convert
->imageWidth
;
327 const GLubyte
*srcRow
= src
;
328 for ( col
= 0 ; col
< convert
->width
; col
++ ) {
329 *dst
++ = CONVERT_TEXEL( src
);
330 src
+= SRC_TEXEL_BYTES
;
332 src
= srcRow
+ srcRowStride
;
344 static convert_func
TAG(texsubimage2d_tab
)[] = {
346 TAG(texsubimage2d_stride
),
347 TAG(texsubimage2d_pack
),
348 TAG(texsubimage2d_stride_pack
),
351 static convert_func
TAG(texsubimage3d_tab
)[] = {
353 TAG(texsubimage3d_stride
),
354 TAG(texsubimage3d_pack
),
355 TAG(texsubimage3d_stride_pack
),
359 #ifndef PRESERVE_DST_TYPE
361 #undef DST_TEXELS_PER_DWORD
364 #undef SRC_TEXEL_BYTES
365 #undef DST_TEXEL_BYTES
367 #undef DST_ROW_STRIDE
370 #undef CONVERT_TEXEL_DWORD
371 #undef CONVERT_DIRECT
375 #undef PRESERVE_DST_TYPE