disable _glapi_set_warning_func() call as it's not present in older libGLs
[mesa.git] / src / mesa / main / texutil_tmp.h
1 /* $Id: texutil_tmp.h,v 1.11 2002/09/21 16:51:25 brianp Exp $ */
2
3 /*
4 * Mesa 3-D graphics library
5 * Version: 4.0.2
6 *
7 * Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 * Author:
27 * Gareth Hughes <gareth@valinux.com>
28 */
29
30
31 /*
32 * For 2D and 3D texture images, we generate functions for
33 * - conversion without pixel unpacking and standard stride
34 * - conversion without pixel unpacking and non-standard stride
35 * - conversion with pixel unpacking and standard stride
36 * - conversion with pixel unpacking and non-standard stride
37 *
38 *
39 * Macros which need to be defined before including this file:
40 * TAG(x) - the function name wrapper
41 * DST_TYPE - the destination texel datatype (GLuint, GLushort, etc)
42 * DST_TEXELS_PER_DWORD - number of dest texels that'll fit in 4 bytes
43 * CONVERT_TEXEL - code to convert from source to dest texel
44 * CONVER_TEXEL_DWORD - if multiple texels fit in 4 bytes, this macros
45 * will convert/store multiple texels at once
46 * CONVERT_DIRECT - if defined, just memcpy texels from src to dest
47 * SRC_TEXEL_BYTES - bytes per source texel
48 * PRESERVE_DST_TYPE - if defined, don't undefined these macros at end
49 */
50
51
52 #define DST_TEXEL_BYTES (4 / DST_TEXELS_PER_DWORD)
53 #define DST_ROW_BYTES (convert->width * DST_TEXEL_BYTES)
54 #define DST_ROW_STRIDE (convert->dstImageWidth * DST_TEXEL_BYTES)
55 #define DST_IMG_STRIDE (convert->dstImageWidth * \
56 convert->dstImageHeight * DST_TEXEL_BYTES)
57
58
59 /* =============================================================
60 * PRE: No pixelstore attribs, width == dstImageWidth.
61 */
62 static GLboolean
63 TAG(texsubimage2d)( const struct convert_info *convert )
64 {
65 const GLubyte *src = (const GLubyte *)convert->srcImage;
66 GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
67 (convert->yoffset * convert->dstImageWidth +
68 convert->xoffset) * DST_TEXEL_BYTES);
69
70 #if DEBUG_TEXUTIL
71 _mesa_debug( NULL, __FUNCTION__ "\n" );
72 #endif
73
74 #ifdef CONVERT_DIRECT
75 MEMCPY( dst, src, convert->height * DST_ROW_BYTES );
76 #else
77 {
78 const GLint texels = convert->width * convert->height;
79 const GLint dwords = texels / DST_TEXELS_PER_DWORD;
80 const GLint leftover = texels - dwords * DST_TEXELS_PER_DWORD;
81 GLint i;
82 for ( i = 0 ; i < dwords ; i++ ) {
83 CONVERT_TEXEL_DWORD( *dst++, src );
84 src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
85 }
86 for ( i = 0; i < leftover; i++ ) {
87 CONVERT_TEXEL( *dst++, src );
88 src += SRC_TEXEL_BYTES;
89 }
90 }
91 #endif
92
93 return GL_TRUE;
94 }
95
96 /* PRE: As above, height == dstImageHeight also.
97 */
98 static GLboolean
99 TAG(texsubimage3d)( const struct convert_info *convert )
100 {
101 const GLubyte *src = (const GLubyte *)convert->srcImage;
102 GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
103 ((convert->zoffset * convert->height +
104 convert->yoffset) * convert->width +
105 convert->xoffset) * DST_TEXEL_BYTES);
106 #if DEBUG_TEXUTIL
107 _mesa_debug( NULL, __FUNCTION__ "\n" );
108 #endif
109
110 #ifdef CONVERT_DIRECT
111 MEMCPY( dst, src, convert->depth * convert->height * DST_ROW_BYTES );
112 #else
113 {
114 const GLint texels = convert->width * convert->height * convert->depth;
115 const GLint dwords = texels / DST_TEXELS_PER_DWORD;
116 const GLint leftover = texels - dwords * DST_TEXELS_PER_DWORD;
117 GLint i;
118 for ( i = 0 ; i < dwords ; i++ ) {
119 CONVERT_TEXEL_DWORD( *dst++, src );
120 src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
121 }
122 for ( i = 0; i < leftover; i++ ) {
123 CONVERT_TEXEL( *dst++, src );
124 src += SRC_TEXEL_BYTES;
125 }
126 }
127 #endif
128
129 return GL_TRUE;
130 }
131
132
133
134 /* =============================================================
135 * PRE: No pixelstore attribs, width != dstImageWidth.
136 */
137 static GLboolean
138 TAG(texsubimage2d_stride)( const struct convert_info *convert )
139 {
140 const GLubyte *src = (const GLubyte *)convert->srcImage;
141 DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
142 (convert->yoffset * convert->dstImageWidth +
143 convert->xoffset) * DST_TEXEL_BYTES);
144 GLint adjust;
145 GLint row, col;
146
147 adjust = convert->dstImageWidth - convert->width;
148
149 #if DEBUG_TEXUTIL
150 _mesa_debug( NULL, __FUNCTION__ ":\n" );
151 _mesa_debug( NULL, " x=%d y=%d w=%d h=%d s=%d\n",
152 convert->xoffset, convert->yoffset, convert->width,
153 convert->height, convert->dstImageWidth );
154 _mesa_debug( NULL, " adjust=%d\n", adjust );
155 #endif
156
157 for ( row = 0 ; row < convert->height ; row++ ) {
158 for ( col = 0 ; col < convert->width ; col++ ) {
159 CONVERT_TEXEL( *dst++, src );
160 src += SRC_TEXEL_BYTES;
161 }
162 dst += adjust;
163 }
164
165 return GL_TRUE;
166 }
167
168 /* PRE: As above, or height != dstImageHeight also.
169 */
170 static GLboolean
171 TAG(texsubimage3d_stride)( const struct convert_info *convert )
172 {
173 const GLubyte *src = (const GLubyte *)convert->srcImage;
174 DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
175 ((convert->zoffset * convert->dstImageHeight +
176 convert->yoffset) * convert->dstImageWidth +
177 convert->xoffset) * DST_TEXEL_BYTES);
178 GLint adjust;
179 GLint row, col, img;
180
181 adjust = convert->dstImageWidth - convert->width;
182
183 #if DEBUG_TEXUTIL
184 _mesa_debug( NULL, __FUNCTION__ ":\n" );
185 _mesa_debug( NULL, " x=%d y=%d w=%d h=%d s=%d\n",
186 convert->xoffset, convert->yoffset, convert->width,
187 convert->height, convert->dstImageWidth );
188 _mesa_debug( NULL, " adjust=%d\n", adjust );
189 #endif
190
191 for ( img = 0 ; img < convert->depth ; img++ ) {
192 for ( row = 0 ; row < convert->height ; row++ ) {
193 for ( col = 0 ; col < convert->width ; col++ ) {
194 CONVERT_TEXEL( *dst++, src );
195 src += SRC_TEXEL_BYTES;
196 }
197 dst += adjust;
198 }
199 /* FIXME: ... */
200 }
201
202 return GL_TRUE;
203 }
204
205
206
207 /* =============================================================
208 * PRE: Require pixelstore attribs, width == dstImageWidth.
209 */
210 static GLboolean
211 TAG(texsubimage2d_unpack)( const struct convert_info *convert )
212 {
213 const GLubyte *src = (const GLubyte *)
214 _mesa_image_address( convert->unpacking, convert->srcImage,
215 convert->width, convert->height,
216 convert->format, convert->type, 0, 0, 0 );
217 const GLint srcRowStride =
218 _mesa_image_row_stride( convert->unpacking, convert->width,
219 convert->format, convert->type );
220 GLint row, col;
221
222 #if DEBUG_TEXUTIL
223 _mesa_debug( NULL, __FUNCTION__ "\n" );
224 #endif
225
226 if (convert->width & (DST_TEXELS_PER_DWORD - 1)) {
227 /* Can't use dword conversion (i.e. when width = 1 and texels/dword = 2
228 * or width = 2 and texels/dword = 4).
229 */
230 DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
231 (convert->yoffset * convert->width +
232 convert->xoffset) * DST_TEXEL_BYTES);
233 for ( row = 0 ; row < convert->height ; row++ ) {
234 const GLubyte *srcRow = src;
235 for ( col = 0; col < convert->width; col++ ) {
236 CONVERT_TEXEL(*dst, src);
237 src += SRC_TEXEL_BYTES;
238 }
239 src = srcRow + srcRowStride;
240 }
241 }
242 else {
243 /* the common case */
244 GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
245 (convert->yoffset * convert->width +
246 convert->xoffset) * DST_TEXEL_BYTES);
247 for ( row = 0 ; row < convert->height ; row++ ) {
248 #ifdef CONVERT_DIRECT
249 MEMCPY( dst, src, DST_ROW_STRIDE );
250 src += srcRowStride;
251 dst = (GLuint *)((GLubyte *)dst + DST_ROW_STRIDE);
252 #else
253 const GLubyte *srcRow = src;
254 for ( col = convert->width / DST_TEXELS_PER_DWORD ; col ; col-- ) {
255 CONVERT_TEXEL_DWORD( *dst++, src );
256 src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
257 }
258 src = srcRow + srcRowStride;
259 #endif
260 }
261 }
262
263 return GL_TRUE;
264 }
265
266 /* PRE: as above, height == dstImageHeight also.
267 */
268 static GLboolean
269 TAG(texsubimage3d_unpack)( const struct convert_info *convert )
270 {
271 const GLubyte *src = (const GLubyte *)
272 _mesa_image_address( convert->unpacking, convert->srcImage,
273 convert->width, convert->height,
274 convert->format, convert->type, 0, 0, 0 );
275 const GLint srcImgStride = (const GLubyte *)
276 _mesa_image_address( convert->unpacking, convert->srcImage,
277 convert->width, convert->height,
278 convert->format, convert->type, 1, 0, 0 ) - src;
279 const GLint srcRowStride =
280 _mesa_image_row_stride( convert->unpacking, convert->width,
281 convert->format, convert->type );
282 GLint row, col, img;
283
284 #if DEBUG_TEXUTIL
285 _mesa_debug( NULL, __FUNCTION__ "\n" );
286 #endif
287
288 if (convert->width & (DST_TEXELS_PER_DWORD - 1)) {
289 /* Can't use dword conversion (i.e. when width = 1 and texels/dword = 2
290 * or width = 2 and texels/dword = 4).
291 */
292 DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
293 ((convert->zoffset * convert->height +
294 convert->yoffset) * convert->width +
295 convert->xoffset) * DST_TEXEL_BYTES);
296 for ( img = 0 ; img < convert->depth ; img++ ) {
297 const GLubyte *srcImage = src;
298 for ( row = 0 ; row < convert->height ; row++ ) {
299 const GLubyte *srcRow = src;
300 for ( col = 0; col < convert->width; col++ ) {
301 CONVERT_TEXEL(*dst, src);
302 src += SRC_TEXEL_BYTES;
303 }
304 src = srcRow + srcRowStride;
305 }
306 src = srcImage + srcImgStride;
307 }
308 }
309 else {
310 /* the common case */
311 GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
312 ((convert->zoffset * convert->height +
313 convert->yoffset) * convert->width +
314 convert->xoffset) * DST_TEXEL_BYTES);
315 for ( img = 0 ; img < convert->depth ; img++ ) {
316 const GLubyte *srcImage = src;
317 for ( row = 0 ; row < convert->height ; row++ ) {
318 #ifdef CONVERT_DIRECT
319 MEMCPY( dst, src, DST_ROW_STRIDE );
320 src += srcRowStride;
321 dst = (GLuint *)((GLubyte *)dst + DST_ROW_STRIDE);
322 #else
323 const GLubyte *srcRow = src;
324 for ( col = convert->width / DST_TEXELS_PER_DWORD ; col ; col-- ) {
325 CONVERT_TEXEL_DWORD( *dst++, src );
326 src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
327 }
328 src = srcRow + srcRowStride;
329 #endif
330 }
331 src = srcImage + srcImgStride;
332 }
333 }
334
335 return GL_TRUE;
336 }
337
338
339
340 /* =============================================================
341 * PRE: Require pixelstore attribs, width != dstImageWidth.
342 */
343 static GLboolean
344 TAG(texsubimage2d_stride_unpack)( const struct convert_info *convert )
345 {
346 const GLubyte *src = (const GLubyte *)
347 _mesa_image_address( convert->unpacking, convert->srcImage,
348 convert->width, convert->height,
349 convert->format, convert->type, 0, 0, 0 );
350 const GLint srcRowStride =
351 _mesa_image_row_stride( convert->unpacking, convert->width,
352 convert->format, convert->type );
353 DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
354 (convert->yoffset * convert->dstImageWidth +
355 convert->xoffset) * DST_TEXEL_BYTES);
356 GLint adjust;
357 GLint row, col;
358 (void) col;
359
360 adjust = convert->dstImageWidth - convert->width;
361
362 #if DEBUG_TEXUTIL
363 _mesa_debug( NULL, __FUNCTION__ ":\n" );
364 _mesa_debug( NULL, " x=%d y=%d w=%d h=%d s=%d\n",
365 convert->xoffset, convert->yoffset, convert->width,
366 convert->height, convert->dstImageWidth );
367 _mesa_debug( NULL, " adjust=%d\n", adjust );
368 #endif
369
370 for ( row = 0 ; row < convert->height ; row++ ) {
371 #ifdef CONVERT_DIRECT
372 MEMCPY( dst, src, DST_ROW_BYTES );
373 src += srcRowStride;
374 dst += convert->dstImageWidth;
375 #else
376 const GLubyte *srcRow = src;
377 for ( col = 0 ; col < convert->width ; col++ ) {
378 CONVERT_TEXEL( *dst++, src );
379 src += SRC_TEXEL_BYTES;
380 }
381 src = srcRow + srcRowStride;
382 dst += adjust;
383 #endif
384 }
385
386 return GL_TRUE;
387 }
388
389 /* PRE: As above, or height != dstImageHeight also.
390 */
391 static GLboolean
392 TAG(texsubimage3d_stride_unpack)( const struct convert_info *convert )
393 {
394 const GLubyte *src = (const GLubyte *)
395 _mesa_image_address( convert->unpacking, convert->srcImage,
396 convert->width, convert->height,
397 convert->format, convert->type, 0, 0, 0 );
398 const GLint srcImgStride = (const GLubyte *)
399 _mesa_image_address( convert->unpacking, convert->srcImage,
400 convert->width, convert->height,
401 convert->format, convert->type, 1, 0, 0 ) - src;
402 const GLint srcRowStride =
403 _mesa_image_row_stride( convert->unpacking, convert->width,
404 convert->format, convert->type );
405 DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
406 ((convert->zoffset * convert->dstImageHeight +
407 convert->yoffset) * convert->dstImageWidth +
408 convert->xoffset) * DST_TEXEL_BYTES);
409 GLint adjust;
410 GLint row, col, img;
411 (void) col;
412
413 adjust = convert->dstImageWidth - convert->width;
414
415 #if DEBUG_TEXUTIL
416 _mesa_debug( NULL, __FUNCTION__ ":\n" );
417 _mesa_debug( NULL, " x=%d y=%d w=%d h=%d s=%d\n",
418 convert->xoffset, convert->yoffset, convert->width,
419 convert->height, convert->dstImageWidth );
420 _mesa_debug( NULL, " adjust=%d\n", adjust );
421 #endif
422
423 for ( img = 0 ; img < convert->depth ; img++ ) {
424 const GLubyte *srcImage = src;
425 for ( row = 0 ; row < convert->height ; row++ ) {
426 #ifdef CONVERT_DIRECT
427 MEMCPY( dst, src, DST_ROW_BYTES );
428 src += srcRowStride;
429 dst += convert->dstImageWidth;
430 #else
431 const GLubyte *srcRow = src;
432 for ( col = 0 ; col < convert->width ; col++ ) {
433 CONVERT_TEXEL( *dst++, src );
434 src += SRC_TEXEL_BYTES;
435 }
436 src = srcRow + srcRowStride;
437 dst += adjust;
438 #endif
439 }
440 src = srcImage + srcImgStride;
441 }
442
443 return GL_TRUE;
444 }
445
446
447
448 static convert_func TAG(texsubimage2d_tab)[] = {
449 TAG(texsubimage2d),
450 TAG(texsubimage2d_stride),
451 TAG(texsubimage2d_unpack),
452 TAG(texsubimage2d_stride_unpack),
453 };
454
455 static convert_func TAG(texsubimage3d_tab)[] = {
456 TAG(texsubimage3d),
457 TAG(texsubimage3d_stride),
458 TAG(texsubimage3d_unpack),
459 TAG(texsubimage3d_stride_unpack),
460 };
461
462
463 #ifndef PRESERVE_DST_TYPE
464 #undef DST_TYPE
465 #undef DST_TEXELS_PER_DWORD
466 #endif
467
468 #undef SRC_TEXEL_BYTES
469 #undef DST_TEXEL_BYTES
470 #undef DST_ROW_BYTES
471 #undef DST_ROW_STRIDE
472
473 #undef CONVERT_TEXEL
474 #undef CONVERT_TEXEL_DWORD
475 #undef CONVERT_DIRECT
476
477 #undef TAG
478
479 #undef PRESERVE_DST_TYPE