1 /* 2 * Mesa 3-D graphics library 3 * Version: 7.7 4 * 5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6 * Copyright (c) 2008-2009 VMware, Inc. 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a 9 * copy of this software and associated documentation files (the "Software"), 10 * to deal in the Software without restriction, including without limitation 11 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12 * and/or sell copies of the Software, and to permit persons to whom the 13 * Software is furnished to do so, subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be included 16 * in all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 27 /** 28 * \file texfetch_tmp.h 29 * Texel fetch functions template. 30 * 31 * This template file is used by texfetch.c to generate texel fetch functions 32 * for 1-D, 2-D and 3-D texture images. 33 * 34 * It should be expanded by defining \p DIM as the number texture dimensions 35 * (1, 2 or 3). According to the value of \p DIM a series of macros is defined 36 * for the texel lookup in the gl_texture_image::Data. 37 * 38 * \author Gareth Hughes 39 * \author Brian Paul 40 */ 41 42 43 #if DIM == 1 44 45 #define TEXEL_ADDR( type, image, i, j, k, size ) \ 46 ((void) (j), (void) (k), ((type *)(image)->Map + (i) * (size))) 47 48 #define FETCH(x) fetch_texel_1d_##x 49 50 #elif DIM == 2 51 52 #define TEXEL_ADDR( type, image, i, j, k, size ) \ 53 ((void) (k), \ 54 ((type *)(image)->Map + ((image)->RowStride * (j) + (i)) * (size))) 55 56 #define FETCH(x) fetch_texel_2d_##x 57 58 #elif DIM == 3 59 60 #define TEXEL_ADDR( type, image, i, j, k, size ) \ 61 ((type *)(image)->Map + ((image)->ImageOffsets[k] \ 62 + (image)->RowStride * (j) + (i)) * (size)) 63 64 #define FETCH(x) fetch_texel_3d_##x 65 66 #else 67 #error illegal number of texture dimensions 68 #endif 69 70 71 /* MESA_FORMAT_Z32 ***********************************************************/ 72 73 /* Fetch depth texel from 1D, 2D or 3D 32-bit depth texture, 74 * returning 1 GLfloat. 75 * Note: no GLchan version of this function. 76 */ 77 static void FETCH(f_z32)( const struct swrast_texture_image *texImage, 78 GLint i, GLint j, GLint k, GLfloat *texel ) 79 { 80 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 81 texel[0] = src[0] * (1.0F / 0xffffffff); 82 } 83 84 85 /* MESA_FORMAT_Z16 ***********************************************************/ 86 87 /* Fetch depth texel from 1D, 2D or 3D 16-bit depth texture, 88 * returning 1 GLfloat. 89 * Note: no GLchan version of this function. 90 */ 91 static void FETCH(f_z16)(const struct swrast_texture_image *texImage, 92 GLint i, GLint j, GLint k, GLfloat *texel ) 93 { 94 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 95 texel[0] = src[0] * (1.0F / 65535.0F); 96 } 97 98 99 100 /* MESA_FORMAT_RGBA_F32 ******************************************************/ 101 102 /* Fetch texel from 1D, 2D or 3D RGBA_FLOAT32 texture, returning 4 GLfloats. 103 */ 104 static void FETCH(f_rgba_f32)( const struct swrast_texture_image *texImage, 105 GLint i, GLint j, GLint k, GLfloat *texel ) 106 { 107 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 4); 108 texel[RCOMP] = src[0]; 109 texel[GCOMP] = src[1]; 110 texel[BCOMP] = src[2]; 111 texel[ACOMP] = src[3]; 112 } 113 114 115 116 117 /* MESA_FORMAT_RGBA_F16 ******************************************************/ 118 119 /* Fetch texel from 1D, 2D or 3D RGBA_FLOAT16 texture, 120 * returning 4 GLfloats. 121 */ 122 static void FETCH(f_rgba_f16)( const struct swrast_texture_image *texImage, 123 GLint i, GLint j, GLint k, GLfloat *texel ) 124 { 125 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 4); 126 texel[RCOMP] = _mesa_half_to_float(src[0]); 127 texel[GCOMP] = _mesa_half_to_float(src[1]); 128 texel[BCOMP] = _mesa_half_to_float(src[2]); 129 texel[ACOMP] = _mesa_half_to_float(src[3]); 130 } 131 132 133 134 /* MESA_FORMAT_RGB_F32 *******************************************************/ 135 136 /* Fetch texel from 1D, 2D or 3D RGB_FLOAT32 texture, 137 * returning 4 GLfloats. 138 */ 139 static void FETCH(f_rgb_f32)( const struct swrast_texture_image *texImage, 140 GLint i, GLint j, GLint k, GLfloat *texel ) 141 { 142 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 3); 143 texel[RCOMP] = src[0]; 144 texel[GCOMP] = src[1]; 145 texel[BCOMP] = src[2]; 146 texel[ACOMP] = 1.0F; 147 } 148 149 150 151 152 /* MESA_FORMAT_RGB_F16 *******************************************************/ 153 154 /* Fetch texel from 1D, 2D or 3D RGB_FLOAT16 texture, 155 * returning 4 GLfloats. 156 */ 157 static void FETCH(f_rgb_f16)( const struct swrast_texture_image *texImage, 158 GLint i, GLint j, GLint k, GLfloat *texel ) 159 { 160 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 3); 161 texel[RCOMP] = _mesa_half_to_float(src[0]); 162 texel[GCOMP] = _mesa_half_to_float(src[1]); 163 texel[BCOMP] = _mesa_half_to_float(src[2]); 164 texel[ACOMP] = 1.0F; 165 } 166 167 168 169 170 /* MESA_FORMAT_ALPHA_F32 *****************************************************/ 171 172 /* Fetch texel from 1D, 2D or 3D ALPHA_FLOAT32 texture, 173 * returning 4 GLfloats. 174 */ 175 static void FETCH(f_alpha_f32)( const struct swrast_texture_image *texImage, 176 GLint i, GLint j, GLint k, GLfloat *texel ) 177 { 178 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1); 179 texel[RCOMP] = 180 texel[GCOMP] = 181 texel[BCOMP] = 0.0F; 182 texel[ACOMP] = src[0]; 183 } 184 185 186 187 188 /* MESA_FORMAT_ALPHA_F32 *****************************************************/ 189 190 /* Fetch texel from 1D, 2D or 3D ALPHA_FLOAT16 texture, 191 * returning 4 GLfloats. 192 */ 193 static void FETCH(f_alpha_f16)( const struct swrast_texture_image *texImage, 194 GLint i, GLint j, GLint k, GLfloat *texel ) 195 { 196 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1); 197 texel[RCOMP] = 198 texel[GCOMP] = 199 texel[BCOMP] = 0.0F; 200 texel[ACOMP] = _mesa_half_to_float(src[0]); 201 } 202 203 204 205 206 /* MESA_FORMAT_LUMINANCE_F32 *************************************************/ 207 208 /* Fetch texel from 1D, 2D or 3D LUMINANCE_FLOAT32 texture, 209 * returning 4 GLfloats. 210 */ 211 static void FETCH(f_luminance_f32)( const struct swrast_texture_image *texImage, 212 GLint i, GLint j, GLint k, GLfloat *texel ) 213 { 214 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1); 215 texel[RCOMP] = 216 texel[GCOMP] = 217 texel[BCOMP] = src[0]; 218 texel[ACOMP] = 1.0F; 219 } 220 221 222 223 224 /* MESA_FORMAT_LUMINANCE_F16 *************************************************/ 225 226 /* Fetch texel from 1D, 2D or 3D LUMINANCE_FLOAT16 texture, 227 * returning 4 GLfloats. 228 */ 229 static void FETCH(f_luminance_f16)( const struct swrast_texture_image *texImage, 230 GLint i, GLint j, GLint k, GLfloat *texel ) 231 { 232 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1); 233 texel[RCOMP] = 234 texel[GCOMP] = 235 texel[BCOMP] = _mesa_half_to_float(src[0]); 236 texel[ACOMP] = 1.0F; 237 } 238 239 240 241 242 /* MESA_FORMAT_LUMINANCE_ALPHA_F32 *******************************************/ 243 244 /* Fetch texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT32 texture, 245 * returning 4 GLfloats. 246 */ 247 static void FETCH(f_luminance_alpha_f32)( const struct swrast_texture_image *texImage, 248 GLint i, GLint j, GLint k, GLfloat *texel ) 249 { 250 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2); 251 texel[RCOMP] = 252 texel[GCOMP] = 253 texel[BCOMP] = src[0]; 254 texel[ACOMP] = src[1]; 255 } 256 257 258 259 260 /* MESA_FORMAT_LUMINANCE_ALPHA_F16 *******************************************/ 261 262 /* Fetch texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT16 texture, 263 * returning 4 GLfloats. 264 */ 265 static void FETCH(f_luminance_alpha_f16)( const struct swrast_texture_image *texImage, 266 GLint i, GLint j, GLint k, GLfloat *texel ) 267 { 268 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 2); 269 texel[RCOMP] = 270 texel[GCOMP] = 271 texel[BCOMP] = _mesa_half_to_float(src[0]); 272 texel[ACOMP] = _mesa_half_to_float(src[1]); 273 } 274 275 276 277 278 /* MESA_FORMAT_INTENSITY_F32 *************************************************/ 279 280 /* Fetch texel from 1D, 2D or 3D INTENSITY_FLOAT32 texture, 281 * returning 4 GLfloats. 282 */ 283 static void FETCH(f_intensity_f32)( const struct swrast_texture_image *texImage, 284 GLint i, GLint j, GLint k, GLfloat *texel ) 285 { 286 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1); 287 texel[RCOMP] = 288 texel[GCOMP] = 289 texel[BCOMP] = 290 texel[ACOMP] = src[0]; 291 } 292 293 294 295 296 /* MESA_FORMAT_INTENSITY_F16 *************************************************/ 297 298 /* Fetch texel from 1D, 2D or 3D INTENSITY_FLOAT16 texture, 299 * returning 4 GLfloats. 300 */ 301 static void FETCH(f_intensity_f16)( const struct swrast_texture_image *texImage, 302 GLint i, GLint j, GLint k, GLfloat *texel ) 303 { 304 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1); 305 texel[RCOMP] = 306 texel[GCOMP] = 307 texel[BCOMP] = 308 texel[ACOMP] = _mesa_half_to_float(src[0]); 309 } 310 311 312 313 314 /* MESA_FORMAT_R_FLOAT32 *****************************************************/ 315 316 /* Fetch texel from 1D, 2D or 3D R_FLOAT32 texture, 317 * returning 4 GLfloats. 318 */ 319 static void FETCH(f_r_f32)( const struct swrast_texture_image *texImage, 320 GLint i, GLint j, GLint k, GLfloat *texel ) 321 { 322 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1); 323 texel[RCOMP] = src[0]; 324 texel[GCOMP] = 0.0F; 325 texel[BCOMP] = 0.0F; 326 texel[ACOMP] = 1.0F; 327 } 328 329 330 331 332 /* MESA_FORMAT_R_FLOAT16 *****************************************************/ 333 334 /* Fetch texel from 1D, 2D or 3D R_FLOAT16 texture, 335 * returning 4 GLfloats. 336 */ 337 static void FETCH(f_r_f16)( const struct swrast_texture_image *texImage, 338 GLint i, GLint j, GLint k, GLfloat *texel ) 339 { 340 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1); 341 texel[RCOMP] = _mesa_half_to_float(src[0]); 342 texel[GCOMP] = 0.0F; 343 texel[BCOMP] = 0.0F; 344 texel[ACOMP] = 1.0F; 345 } 346 347 348 349 350 /* MESA_FORMAT_RG_FLOAT32 ****************************************************/ 351 352 /* Fetch texel from 1D, 2D or 3D RG_FLOAT32 texture, 353 * returning 4 GLfloats. 354 */ 355 static void FETCH(f_rg_f32)( const struct swrast_texture_image *texImage, 356 GLint i, GLint j, GLint k, GLfloat *texel ) 357 { 358 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2); 359 texel[RCOMP] = src[0]; 360 texel[GCOMP] = src[1]; 361 texel[BCOMP] = 0.0F; 362 texel[ACOMP] = 1.0F; 363 } 364 365 366 367 368 /* MESA_FORMAT_RG_FLOAT16 ****************************************************/ 369 370 /* Fetch texel from 1D, 2D or 3D RG_FLOAT16 texture, 371 * returning 4 GLfloats. 372 */ 373 static void FETCH(f_rg_f16)( const struct swrast_texture_image *texImage, 374 GLint i, GLint j, GLint k, GLfloat *texel ) 375 { 376 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 2); 377 texel[RCOMP] = _mesa_half_to_float(src[0]); 378 texel[GCOMP] = _mesa_half_to_float(src[1]); 379 texel[BCOMP] = 0.0F; 380 texel[ACOMP] = 1.0F; 381 } 382 383 384 385 386 /* 387 * Begin Hardware formats 388 */ 389 390 /* MESA_FORMAT_RGBA8888 ******************************************************/ 391 392 /* Fetch texel from 1D, 2D or 3D rgba8888 texture, return 4 GLfloats */ 393 static void FETCH(f_rgba8888)( const struct swrast_texture_image *texImage, 394 GLint i, GLint j, GLint k, GLfloat *texel ) 395 { 396 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 397 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 24) ); 398 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff ); 399 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff ); 400 texel[ACOMP] = UBYTE_TO_FLOAT( (s ) & 0xff ); 401 } 402 403 404 405 406 407 408 /* MESA_FORMAT_RGBA888_REV ***************************************************/ 409 410 /* Fetch texel from 1D, 2D or 3D abgr8888 texture, return 4 GLchans */ 411 static void FETCH(f_rgba8888_rev)( const struct swrast_texture_image *texImage, 412 GLint i, GLint j, GLint k, GLfloat *texel ) 413 { 414 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 415 texel[RCOMP] = UBYTE_TO_FLOAT( (s ) & 0xff ); 416 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff ); 417 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff ); 418 texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24) ); 419 } 420 421 422 423 424 /* MESA_FORMAT_ARGB8888 ******************************************************/ 425 426 /* Fetch texel from 1D, 2D or 3D argb8888 texture, return 4 GLchans */ 427 static void FETCH(f_argb8888)( const struct swrast_texture_image *texImage, 428 GLint i, GLint j, GLint k, GLfloat *texel ) 429 { 430 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 431 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff ); 432 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff ); 433 texel[BCOMP] = UBYTE_TO_FLOAT( (s ) & 0xff ); 434 texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24) ); 435 } 436 437 438 439 440 /* MESA_FORMAT_ARGB8888_REV **************************************************/ 441 442 /* Fetch texel from 1D, 2D or 3D argb8888_rev texture, return 4 GLfloats */ 443 static void FETCH(f_argb8888_rev)( const struct swrast_texture_image *texImage, 444 GLint i, GLint j, GLint k, GLfloat *texel ) 445 { 446 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 447 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff ); 448 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff ); 449 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 24) ); 450 texel[ACOMP] = UBYTE_TO_FLOAT( (s ) & 0xff ); 451 } 452 453 454 455 456 /* MESA_FORMAT_RGBX8888 ******************************************************/ 457 458 /* Fetch texel from 1D, 2D or 3D rgbx8888 texture, return 4 GLfloats */ 459 static void FETCH(f_rgbx8888)( const struct swrast_texture_image *texImage, 460 GLint i, GLint j, GLint k, GLfloat *texel ) 461 { 462 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 463 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 24) ); 464 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff ); 465 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff ); 466 texel[ACOMP] = 1.0f; 467 } 468 469 470 471 472 /* MESA_FORMAT_RGBX888_REV ***************************************************/ 473 474 /* Fetch texel from 1D, 2D or 3D rgbx8888_rev texture, return 4 GLchans */ 475 static void FETCH(f_rgbx8888_rev)( const struct swrast_texture_image *texImage, 476 GLint i, GLint j, GLint k, GLfloat *texel ) 477 { 478 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 479 texel[RCOMP] = UBYTE_TO_FLOAT( (s ) & 0xff ); 480 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff ); 481 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff ); 482 texel[ACOMP] = 1.0f; 483 } 484 485 486 487 488 /* MESA_FORMAT_XRGB8888 ******************************************************/ 489 490 /* Fetch texel from 1D, 2D or 3D xrgb8888 texture, return 4 GLchans */ 491 static void FETCH(f_xrgb8888)( const struct swrast_texture_image *texImage, 492 GLint i, GLint j, GLint k, GLfloat *texel ) 493 { 494 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 495 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff ); 496 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff ); 497 texel[BCOMP] = UBYTE_TO_FLOAT( (s ) & 0xff ); 498 texel[ACOMP] = 1.0f; 499 } 500 501 502 503 504 /* MESA_FORMAT_XRGB8888_REV **************************************************/ 505 506 /* Fetch texel from 1D, 2D or 3D xrgb8888_rev texture, return 4 GLfloats */ 507 static void FETCH(f_xrgb8888_rev)( const struct swrast_texture_image *texImage, 508 GLint i, GLint j, GLint k, GLfloat *texel ) 509 { 510 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 511 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff ); 512 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff ); 513 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 24) ); 514 texel[ACOMP] = 1.0f; 515 } 516 517 518 519 520 /* MESA_FORMAT_RGB888 ********************************************************/ 521 522 /* Fetch texel from 1D, 2D or 3D rgb888 texture, return 4 GLchans */ 523 static void FETCH(f_rgb888)( const struct swrast_texture_image *texImage, 524 GLint i, GLint j, GLint k, GLfloat *texel ) 525 { 526 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3); 527 texel[RCOMP] = UBYTE_TO_FLOAT( src[2] ); 528 texel[GCOMP] = UBYTE_TO_FLOAT( src[1] ); 529 texel[BCOMP] = UBYTE_TO_FLOAT( src[0] ); 530 texel[ACOMP] = 1.0F; 531 } 532 533 534 535 536 /* MESA_FORMAT_BGR888 ********************************************************/ 537 538 /* Fetch texel from 1D, 2D or 3D bgr888 texture, return 4 GLchans */ 539 static void FETCH(f_bgr888)( const struct swrast_texture_image *texImage, 540 GLint i, GLint j, GLint k, GLfloat *texel ) 541 { 542 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3); 543 texel[RCOMP] = UBYTE_TO_FLOAT( src[0] ); 544 texel[GCOMP] = UBYTE_TO_FLOAT( src[1] ); 545 texel[BCOMP] = UBYTE_TO_FLOAT( src[2] ); 546 texel[ACOMP] = 1.0F; 547 } 548 549 550 551 552 /* use color expansion like (g << 2) | (g >> 4) (does somewhat random rounding) 553 instead of slow (g << 2) * 255 / 252 (always rounds down) */ 554 555 /* MESA_FORMAT_RGB565 ********************************************************/ 556 557 /* Fetch texel from 1D, 2D or 3D rgb565 texture, return 4 GLchans */ 558 static void FETCH(f_rgb565)( const struct swrast_texture_image *texImage, 559 GLint i, GLint j, GLint k, GLfloat *texel ) 560 { 561 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 562 const GLushort s = *src; 563 texel[RCOMP] = ((s >> 11) & 0x1f) * (1.0F / 31.0F); 564 texel[GCOMP] = ((s >> 5 ) & 0x3f) * (1.0F / 63.0F); 565 texel[BCOMP] = ((s ) & 0x1f) * (1.0F / 31.0F); 566 texel[ACOMP] = 1.0F; 567 } 568 569 570 571 572 /* MESA_FORMAT_RGB565_REV ****************************************************/ 573 574 /* Fetch texel from 1D, 2D or 3D rgb565_rev texture, return 4 GLchans */ 575 static void FETCH(f_rgb565_rev)( const struct swrast_texture_image *texImage, 576 GLint i, GLint j, GLint k, GLfloat *texel ) 577 { 578 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 579 const GLushort s = (*src >> 8) | (*src << 8); /* byte swap */ 580 texel[RCOMP] = UBYTE_TO_FLOAT( ((s >> 8) & 0xf8) | ((s >> 13) & 0x7) ); 581 texel[GCOMP] = UBYTE_TO_FLOAT( ((s >> 3) & 0xfc) | ((s >> 9) & 0x3) ); 582 texel[BCOMP] = UBYTE_TO_FLOAT( ((s << 3) & 0xf8) | ((s >> 2) & 0x7) ); 583 texel[ACOMP] = 1.0F; 584 } 585 586 587 588 589 /* MESA_FORMAT_ARGB4444 ******************************************************/ 590 591 /* Fetch texel from 1D, 2D or 3D argb444 texture, return 4 GLchans */ 592 static void FETCH(f_argb4444)( const struct swrast_texture_image *texImage, 593 GLint i, GLint j, GLint k, GLfloat *texel ) 594 { 595 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 596 const GLushort s = *src; 597 texel[RCOMP] = ((s >> 8) & 0xf) * (1.0F / 15.0F); 598 texel[GCOMP] = ((s >> 4) & 0xf) * (1.0F / 15.0F); 599 texel[BCOMP] = ((s ) & 0xf) * (1.0F / 15.0F); 600 texel[ACOMP] = ((s >> 12) & 0xf) * (1.0F / 15.0F); 601 } 602 603 604 605 606 /* MESA_FORMAT_ARGB4444_REV **************************************************/ 607 608 /* Fetch texel from 1D, 2D or 3D argb4444_rev texture, return 4 GLchans */ 609 static void FETCH(f_argb4444_rev)( const struct swrast_texture_image *texImage, 610 GLint i, GLint j, GLint k, GLfloat *texel ) 611 { 612 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 613 texel[RCOMP] = ((s ) & 0xf) * (1.0F / 15.0F); 614 texel[GCOMP] = ((s >> 12) & 0xf) * (1.0F / 15.0F); 615 texel[BCOMP] = ((s >> 8) & 0xf) * (1.0F / 15.0F); 616 texel[ACOMP] = ((s >> 4) & 0xf) * (1.0F / 15.0F); 617 } 618 619 620 621 /* MESA_FORMAT_RGBA5551 ******************************************************/ 622 623 /* Fetch texel from 1D, 2D or 3D argb1555 texture, return 4 GLchans */ 624 static void FETCH(f_rgba5551)( const struct swrast_texture_image *texImage, 625 GLint i, GLint j, GLint k, GLfloat *texel ) 626 { 627 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 628 const GLushort s = *src; 629 texel[RCOMP] = ((s >> 11) & 0x1f) * (1.0F / 31.0F); 630 texel[GCOMP] = ((s >> 6) & 0x1f) * (1.0F / 31.0F); 631 texel[BCOMP] = ((s >> 1) & 0x1f) * (1.0F / 31.0F); 632 texel[ACOMP] = ((s ) & 0x01) * 1.0F; 633 } 634 635 636 637 /* MESA_FORMAT_ARGB1555 ******************************************************/ 638 639 /* Fetch texel from 1D, 2D or 3D argb1555 texture, return 4 GLchans */ 640 static void FETCH(f_argb1555)( const struct swrast_texture_image *texImage, 641 GLint i, GLint j, GLint k, GLfloat *texel ) 642 { 643 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 644 const GLushort s = *src; 645 texel[RCOMP] = ((s >> 10) & 0x1f) * (1.0F / 31.0F); 646 texel[GCOMP] = ((s >> 5) & 0x1f) * (1.0F / 31.0F); 647 texel[BCOMP] = ((s >> 0) & 0x1f) * (1.0F / 31.0F); 648 texel[ACOMP] = ((s >> 15) & 0x01) * 1.0F; 649 } 650 651 652 653 654 /* MESA_FORMAT_ARGB1555_REV **************************************************/ 655 656 /* Fetch texel from 1D, 2D or 3D argb1555_rev texture, return 4 GLchans */ 657 static void FETCH(f_argb1555_rev)( const struct swrast_texture_image *texImage, 658 GLint i, GLint j, GLint k, GLfloat *texel ) 659 { 660 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 661 const GLushort s = (*src << 8) | (*src >> 8); /* byteswap */ 662 texel[RCOMP] = UBYTE_TO_FLOAT( ((s >> 7) & 0xf8) | ((s >> 12) & 0x7) ); 663 texel[GCOMP] = UBYTE_TO_FLOAT( ((s >> 2) & 0xf8) | ((s >> 7) & 0x7) ); 664 texel[BCOMP] = UBYTE_TO_FLOAT( ((s << 3) & 0xf8) | ((s >> 2) & 0x7) ); 665 texel[ACOMP] = UBYTE_TO_FLOAT( ((s >> 15) & 0x01) * 255 ); 666 } 667 668 669 670 671 /* MESA_FORMAT_ARGB2101010 ***************************************************/ 672 673 /* Fetch texel from 1D, 2D or 3D argb2101010 texture, return 4 GLchans */ 674 static void FETCH(f_argb2101010)( const struct swrast_texture_image *texImage, 675 GLint i, GLint j, GLint k, GLfloat *texel ) 676 { 677 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 678 const GLuint s = *src; 679 texel[RCOMP] = ((s >> 20) & 0x3ff) * (1.0F / 1023.0F); 680 texel[GCOMP] = ((s >> 10) & 0x3ff) * (1.0F / 1023.0F); 681 texel[BCOMP] = ((s >> 0) & 0x3ff) * (1.0F / 1023.0F); 682 texel[ACOMP] = ((s >> 30) & 0x03) * (1.0F / 3.0F); 683 } 684 685 686 687 688 /* MESA_FORMAT_GR88 **********************************************************/ 689 690 /* Fetch texel from 1D, 2D or 3D rg88 texture, return 4 GLchans */ 691 static void FETCH(f_gr88)( const struct swrast_texture_image *texImage, 692 GLint i, GLint j, GLint k, GLfloat *texel ) 693 { 694 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 695 texel[RCOMP] = UBYTE_TO_FLOAT( s & 0xff ); 696 texel[GCOMP] = UBYTE_TO_FLOAT( s >> 8 ); 697 texel[BCOMP] = 0.0; 698 texel[ACOMP] = 1.0; 699 } 700 701 702 703 704 /* MESA_FORMAT_RG88 ******************************************************/ 705 706 /* Fetch texel from 1D, 2D or 3D rg88_rev texture, return 4 GLchans */ 707 static void FETCH(f_rg88)( const struct swrast_texture_image *texImage, 708 GLint i, GLint j, GLint k, GLfloat *texel ) 709 { 710 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 711 texel[RCOMP] = UBYTE_TO_FLOAT( s >> 8 ); 712 texel[GCOMP] = UBYTE_TO_FLOAT( s & 0xff ); 713 texel[BCOMP] = 0.0; 714 texel[ACOMP] = 1.0; 715 } 716 717 718 719 720 /* MESA_FORMAT_AL44 **********************************************************/ 721 722 /* Fetch texel from 1D, 2D or 3D al44 texture, return 4 GLchans */ 723 static void FETCH(f_al44)( const struct swrast_texture_image *texImage, 724 GLint i, GLint j, GLint k, GLfloat *texel ) 725 { 726 const GLubyte s = *TEXEL_ADDR(GLubyte, texImage, i, j, k, 1); 727 texel[RCOMP] = 728 texel[GCOMP] = 729 texel[BCOMP] = (s & 0xf) * (1.0F / 15.0F); 730 texel[ACOMP] = ((s >> 4) & 0xf) * (1.0F / 15.0F); 731 } 732 733 734 735 736 /* MESA_FORMAT_AL88 **********************************************************/ 737 738 /* Fetch texel from 1D, 2D or 3D al88 texture, return 4 GLchans */ 739 static void FETCH(f_al88)( const struct swrast_texture_image *texImage, 740 GLint i, GLint j, GLint k, GLfloat *texel ) 741 { 742 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 743 texel[RCOMP] = 744 texel[GCOMP] = 745 texel[BCOMP] = UBYTE_TO_FLOAT( s & 0xff ); 746 texel[ACOMP] = UBYTE_TO_FLOAT( s >> 8 ); 747 } 748 749 750 751 752 /* MESA_FORMAT_R8 ************************************************************/ 753 754 /* Fetch texel from 1D, 2D or 3D rg88 texture, return 4 GLchans */ 755 static void FETCH(f_r8)(const struct swrast_texture_image *texImage, 756 GLint i, GLint j, GLint k, GLfloat *texel) 757 { 758 const GLubyte s = *TEXEL_ADDR(GLubyte, texImage, i, j, k, 1); 759 texel[RCOMP] = UBYTE_TO_FLOAT(s); 760 texel[GCOMP] = 0.0; 761 texel[BCOMP] = 0.0; 762 texel[ACOMP] = 1.0; 763 } 764 765 766 767 768 /* MESA_FORMAT_R16 ***********************************************************/ 769 770 /* Fetch texel from 1D, 2D or 3D r16 texture, return 4 GLchans */ 771 static void FETCH(f_r16)(const struct swrast_texture_image *texImage, 772 GLint i, GLint j, GLint k, GLfloat *texel) 773 { 774 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 775 texel[RCOMP] = USHORT_TO_FLOAT(s); 776 texel[GCOMP] = 0.0; 777 texel[BCOMP] = 0.0; 778 texel[ACOMP] = 1.0; 779 } 780 781 782 783 784 /* MESA_FORMAT_AL88_REV ******************************************************/ 785 786 /* Fetch texel from 1D, 2D or 3D al88_rev texture, return 4 GLchans */ 787 static void FETCH(f_al88_rev)( const struct swrast_texture_image *texImage, 788 GLint i, GLint j, GLint k, GLfloat *texel ) 789 { 790 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 791 texel[RCOMP] = 792 texel[GCOMP] = 793 texel[BCOMP] = UBYTE_TO_FLOAT( s >> 8 ); 794 texel[ACOMP] = UBYTE_TO_FLOAT( s & 0xff ); 795 } 796 797 798 799 800 /* MESA_FORMAT_RG1616 ********************************************************/ 801 802 /* Fetch texel from 1D, 2D or 3D rg1616 texture, return 4 GLchans */ 803 static void FETCH(f_rg1616)( const struct swrast_texture_image *texImage, 804 GLint i, GLint j, GLint k, GLfloat *texel ) 805 { 806 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 807 texel[RCOMP] = USHORT_TO_FLOAT( s & 0xffff ); 808 texel[GCOMP] = USHORT_TO_FLOAT( s >> 16 ); 809 texel[BCOMP] = 0.0; 810 texel[ACOMP] = 1.0; 811 } 812 813 814 815 816 /* MESA_FORMAT_RG1616_REV ****************************************************/ 817 818 /* Fetch texel from 1D, 2D or 3D rg1616_rev texture, return 4 GLchans */ 819 static void FETCH(f_rg1616_rev)( const struct swrast_texture_image *texImage, 820 GLint i, GLint j, GLint k, GLfloat *texel ) 821 { 822 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 823 texel[RCOMP] = USHORT_TO_FLOAT( s >> 16 ); 824 texel[GCOMP] = USHORT_TO_FLOAT( s & 0xffff ); 825 texel[BCOMP] = 0.0; 826 texel[ACOMP] = 1.0; 827 } 828 829 830 831 832 /* MESA_FORMAT_AL1616 ********************************************************/ 833 834 /* Fetch texel from 1D, 2D or 3D al1616 texture, return 4 GLchans */ 835 static void FETCH(f_al1616)( const struct swrast_texture_image *texImage, 836 GLint i, GLint j, GLint k, GLfloat *texel ) 837 { 838 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 839 texel[RCOMP] = 840 texel[GCOMP] = 841 texel[BCOMP] = USHORT_TO_FLOAT( s & 0xffff ); 842 texel[ACOMP] = USHORT_TO_FLOAT( s >> 16 ); 843 } 844 845 846 847 848 /* MESA_FORMAT_AL1616_REV ****************************************************/ 849 850 /* Fetch texel from 1D, 2D or 3D al1616_rev texture, return 4 GLchans */ 851 static void FETCH(f_al1616_rev)( const struct swrast_texture_image *texImage, 852 GLint i, GLint j, GLint k, GLfloat *texel ) 853 { 854 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 855 texel[RCOMP] = 856 texel[GCOMP] = 857 texel[BCOMP] = USHORT_TO_FLOAT( s >> 16 ); 858 texel[ACOMP] = USHORT_TO_FLOAT( s & 0xffff ); 859 } 860 861 862 863 864 /* MESA_FORMAT_RGB332 ********************************************************/ 865 866 /* Fetch texel from 1D, 2D or 3D rgb332 texture, return 4 GLchans */ 867 static void FETCH(f_rgb332)( const struct swrast_texture_image *texImage, 868 GLint i, GLint j, GLint k, GLfloat *texel ) 869 { 870 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1); 871 const GLubyte s = *src; 872 texel[RCOMP] = ((s >> 5) & 0x7) * (1.0F / 7.0F); 873 texel[GCOMP] = ((s >> 2) & 0x7) * (1.0F / 7.0F); 874 texel[BCOMP] = ((s ) & 0x3) * (1.0F / 3.0F); 875 texel[ACOMP] = 1.0F; 876 } 877 878 879 880 881 /* MESA_FORMAT_A8 ************************************************************/ 882 883 /* Fetch texel from 1D, 2D or 3D a8 texture, return 4 GLchans */ 884 static void FETCH(f_a8)( const struct swrast_texture_image *texImage, 885 GLint i, GLint j, GLint k, GLfloat *texel ) 886 { 887 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1); 888 texel[RCOMP] = 889 texel[GCOMP] = 890 texel[BCOMP] = 0.0F; 891 texel[ACOMP] = UBYTE_TO_FLOAT( src[0] ); 892 } 893 894 895 896 897 /* MESA_FORMAT_A16 ************************************************************/ 898 899 /* Fetch texel from 1D, 2D or 3D a8 texture, return 4 GLchans */ 900 static void FETCH(f_a16)( const struct swrast_texture_image *texImage, 901 GLint i, GLint j, GLint k, GLfloat *texel ) 902 { 903 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 904 texel[RCOMP] = 905 texel[GCOMP] = 906 texel[BCOMP] = 0.0F; 907 texel[ACOMP] = USHORT_TO_FLOAT( src[0] ); 908 } 909 910 911 912 913 /* MESA_FORMAT_L8 ************************************************************/ 914 915 /* Fetch texel from 1D, 2D or 3D l8 texture, return 4 GLchans */ 916 static void FETCH(f_l8)( const struct swrast_texture_image *texImage, 917 GLint i, GLint j, GLint k, GLfloat *texel ) 918 { 919 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1); 920 texel[RCOMP] = 921 texel[GCOMP] = 922 texel[BCOMP] = UBYTE_TO_FLOAT( src[0] ); 923 texel[ACOMP] = 1.0F; 924 } 925 926 927 928 929 /* MESA_FORMAT_L16 ***********************************************************/ 930 931 /* Fetch texel from 1D, 2D or 3D l16 texture, return 4 GLchans */ 932 static void FETCH(f_l16)( const struct swrast_texture_image *texImage, 933 GLint i, GLint j, GLint k, GLfloat *texel ) 934 { 935 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 936 texel[RCOMP] = 937 texel[GCOMP] = 938 texel[BCOMP] = USHORT_TO_FLOAT( src[0] ); 939 texel[ACOMP] = 1.0F; 940 } 941 942 943 944 945 /* MESA_FORMAT_I8 ************************************************************/ 946 947 /* Fetch texel from 1D, 2D or 3D i8 texture, return 4 GLchans */ 948 static void FETCH(f_i8)( const struct swrast_texture_image *texImage, 949 GLint i, GLint j, GLint k, GLfloat *texel ) 950 { 951 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1); 952 texel[RCOMP] = 953 texel[GCOMP] = 954 texel[BCOMP] = 955 texel[ACOMP] = UBYTE_TO_FLOAT( src[0] ); 956 } 957 958 959 960 961 /* MESA_FORMAT_I16 ***********************************************************/ 962 963 /* Fetch texel from 1D, 2D or 3D i16 texture, return 4 GLchans */ 964 static void FETCH(f_i16)( const struct swrast_texture_image *texImage, 965 GLint i, GLint j, GLint k, GLfloat *texel ) 966 { 967 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1); 968 texel[RCOMP] = 969 texel[GCOMP] = 970 texel[BCOMP] = 971 texel[ACOMP] = USHORT_TO_FLOAT( src[0] ); 972 } 973 974 975 976 977 /* Fetch texel from 1D, 2D or 3D srgb8 texture, return 4 GLfloats */ 978 /* Note: component order is same as for MESA_FORMAT_RGB888 */ 979 static void FETCH(srgb8)(const struct swrast_texture_image *texImage, 980 GLint i, GLint j, GLint k, GLfloat *texel ) 981 { 982 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3); 983 texel[RCOMP] = nonlinear_to_linear(src[2]); 984 texel[GCOMP] = nonlinear_to_linear(src[1]); 985 texel[BCOMP] = nonlinear_to_linear(src[0]); 986 texel[ACOMP] = 1.0F; 987 } 988 989 990 991 /* Fetch texel from 1D, 2D or 3D srgba8 texture, return 4 GLfloats */ 992 static void FETCH(srgba8)(const struct swrast_texture_image *texImage, 993 GLint i, GLint j, GLint k, GLfloat *texel ) 994 { 995 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 996 texel[RCOMP] = nonlinear_to_linear( (s >> 24) ); 997 texel[GCOMP] = nonlinear_to_linear( (s >> 16) & 0xff ); 998 texel[BCOMP] = nonlinear_to_linear( (s >> 8) & 0xff ); 999 texel[ACOMP] = UBYTE_TO_FLOAT( (s ) & 0xff ); /* linear! */ 1000 } 1001 1002 1003 1004 /* Fetch texel from 1D, 2D or 3D sargb8 texture, return 4 GLfloats */ 1005 static void FETCH(sargb8)(const struct swrast_texture_image *texImage, 1006 GLint i, GLint j, GLint k, GLfloat *texel ) 1007 { 1008 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 1009 texel[RCOMP] = nonlinear_to_linear( (s >> 16) & 0xff ); 1010 texel[GCOMP] = nonlinear_to_linear( (s >> 8) & 0xff ); 1011 texel[BCOMP] = nonlinear_to_linear( (s ) & 0xff ); 1012 texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24) ); /* linear! */ 1013 } 1014 1015 1016 1017 /* Fetch texel from 1D, 2D or 3D sl8 texture, return 4 GLfloats */ 1018 static void FETCH(sl8)(const struct swrast_texture_image *texImage, 1019 GLint i, GLint j, GLint k, GLfloat *texel ) 1020 { 1021 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1); 1022 texel[RCOMP] = 1023 texel[GCOMP] = 1024 texel[BCOMP] = nonlinear_to_linear(src[0]); 1025 texel[ACOMP] = 1.0F; 1026 } 1027 1028 1029 1030 /* Fetch texel from 1D, 2D or 3D sla8 texture, return 4 GLfloats */ 1031 static void FETCH(sla8)(const struct swrast_texture_image *texImage, 1032 GLint i, GLint j, GLint k, GLfloat *texel ) 1033 { 1034 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 2); 1035 texel[RCOMP] = 1036 texel[GCOMP] = 1037 texel[BCOMP] = nonlinear_to_linear(src[0]); 1038 texel[ACOMP] = UBYTE_TO_FLOAT(src[1]); /* linear */ 1039 } 1040 1041 1042 1043 1044 /* MESA_FORMAT_RGBA_INT8 **************************************************/ 1045 1046 static void 1047 FETCH(rgba_int8)(const struct swrast_texture_image *texImage, 1048 GLint i, GLint j, GLint k, GLfloat *texel ) 1049 { 1050 const GLbyte *src = TEXEL_ADDR(GLbyte, texImage, i, j, k, 4); 1051 texel[RCOMP] = (GLfloat) src[0]; 1052 texel[GCOMP] = (GLfloat) src[1]; 1053 texel[BCOMP] = (GLfloat) src[2]; 1054 texel[ACOMP] = (GLfloat) src[3]; 1055 } 1056 1057 1058 1059 1060 /* MESA_FORMAT_RGBA_INT16 **************************************************/ 1061 1062 static void 1063 FETCH(rgba_int16)(const struct swrast_texture_image *texImage, 1064 GLint i, GLint j, GLint k, GLfloat *texel ) 1065 { 1066 const GLshort *src = TEXEL_ADDR(GLshort, texImage, i, j, k, 4); 1067 texel[RCOMP] = (GLfloat) src[0]; 1068 texel[GCOMP] = (GLfloat) src[1]; 1069 texel[BCOMP] = (GLfloat) src[2]; 1070 texel[ACOMP] = (GLfloat) src[3]; 1071 } 1072 1073 1074 1075 1076 /* MESA_FORMAT_RGBA_INT32 **************************************************/ 1077 1078 static void 1079 FETCH(rgba_int32)(const struct swrast_texture_image *texImage, 1080 GLint i, GLint j, GLint k, GLfloat *texel ) 1081 { 1082 const GLint *src = TEXEL_ADDR(GLint, texImage, i, j, k, 4); 1083 texel[RCOMP] = (GLfloat) src[0]; 1084 texel[GCOMP] = (GLfloat) src[1]; 1085 texel[BCOMP] = (GLfloat) src[2]; 1086 texel[ACOMP] = (GLfloat) src[3]; 1087 } 1088 1089 1090 1091 1092 /* MESA_FORMAT_RGBA_UINT8 **************************************************/ 1093 1094 static void 1095 FETCH(rgba_uint8)(const struct swrast_texture_image *texImage, 1096 GLint i, GLint j, GLint k, GLfloat *texel ) 1097 { 1098 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 4); 1099 texel[RCOMP] = (GLfloat) src[0]; 1100 texel[GCOMP] = (GLfloat) src[1]; 1101 texel[BCOMP] = (GLfloat) src[2]; 1102 texel[ACOMP] = (GLfloat) src[3]; 1103 } 1104 1105 1106 1107 1108 /* MESA_FORMAT_RGBA_UINT16 **************************************************/ 1109 1110 static void 1111 FETCH(rgba_uint16)(const struct swrast_texture_image *texImage, 1112 GLint i, GLint j, GLint k, GLfloat *texel ) 1113 { 1114 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 4); 1115 texel[RCOMP] = (GLfloat) src[0]; 1116 texel[GCOMP] = (GLfloat) src[1]; 1117 texel[BCOMP] = (GLfloat) src[2]; 1118 texel[ACOMP] = (GLfloat) src[3]; 1119 } 1120 1121 1122 1123 1124 /* MESA_FORMAT_RGBA_UINT32 **************************************************/ 1125 1126 static void 1127 FETCH(rgba_uint32)(const struct swrast_texture_image *texImage, 1128 GLint i, GLint j, GLint k, GLfloat *texel ) 1129 { 1130 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 4); 1131 texel[RCOMP] = (GLfloat) src[0]; 1132 texel[GCOMP] = (GLfloat) src[1]; 1133 texel[BCOMP] = (GLfloat) src[2]; 1134 texel[ACOMP] = (GLfloat) src[3]; 1135 } 1136 1137 1138 1139 1140 /* MESA_FORMAT_DUDV8 ********************************************************/ 1141 1142 /* this format by definition produces 0,0,0,1 as rgba values, 1143 however we'll return the dudv values as rg and fix up elsewhere */ 1144 static void FETCH(dudv8)(const struct swrast_texture_image *texImage, 1145 GLint i, GLint j, GLint k, GLfloat *texel ) 1146 { 1147 const GLbyte *src = TEXEL_ADDR(GLbyte, texImage, i, j, k, 2); 1148 texel[RCOMP] = BYTE_TO_FLOAT(src[0]); 1149 texel[GCOMP] = BYTE_TO_FLOAT(src[1]); 1150 texel[BCOMP] = 0; 1151 texel[ACOMP] = 0; 1152 } 1153 1154 1155 /* MESA_FORMAT_SIGNED_R8 ***********************************************/ 1156 1157 static void FETCH(signed_r8)( const struct swrast_texture_image *texImage, 1158 GLint i, GLint j, GLint k, GLfloat *texel ) 1159 { 1160 const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1); 1161 texel[RCOMP] = BYTE_TO_FLOAT_TEX( s ); 1162 texel[GCOMP] = 0.0F; 1163 texel[BCOMP] = 0.0F; 1164 texel[ACOMP] = 1.0F; 1165 } 1166 1167 1168 1169 1170 /* MESA_FORMAT_SIGNED_A8 ***********************************************/ 1171 1172 static void FETCH(signed_a8)( const struct swrast_texture_image *texImage, 1173 GLint i, GLint j, GLint k, GLfloat *texel ) 1174 { 1175 const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1); 1176 texel[RCOMP] = 0.0F; 1177 texel[GCOMP] = 0.0F; 1178 texel[BCOMP] = 0.0F; 1179 texel[ACOMP] = BYTE_TO_FLOAT_TEX( s ); 1180 } 1181 1182 1183 1184 1185 /* MESA_FORMAT_SIGNED_L8 ***********************************************/ 1186 1187 static void FETCH(signed_l8)( const struct swrast_texture_image *texImage, 1188 GLint i, GLint j, GLint k, GLfloat *texel ) 1189 { 1190 const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1); 1191 texel[RCOMP] = 1192 texel[GCOMP] = 1193 texel[BCOMP] = BYTE_TO_FLOAT_TEX( s ); 1194 texel[ACOMP] = 1.0F; 1195 } 1196 1197 1198 1199 1200 /* MESA_FORMAT_SIGNED_I8 ***********************************************/ 1201 1202 static void FETCH(signed_i8)( const struct swrast_texture_image *texImage, 1203 GLint i, GLint j, GLint k, GLfloat *texel ) 1204 { 1205 const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1); 1206 texel[RCOMP] = 1207 texel[GCOMP] = 1208 texel[BCOMP] = 1209 texel[ACOMP] = BYTE_TO_FLOAT_TEX( s ); 1210 } 1211 1212 1213 1214 1215 /* MESA_FORMAT_SIGNED_RG88_REV ***********************************************/ 1216 1217 static void FETCH(signed_rg88_rev)( const struct swrast_texture_image *texImage, 1218 GLint i, GLint j, GLint k, GLfloat *texel ) 1219 { 1220 const GLushort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1); 1221 texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) ); 1222 texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) ); 1223 texel[BCOMP] = 0.0F; 1224 texel[ACOMP] = 1.0F; 1225 } 1226 1227 1228 1229 1230 /* MESA_FORMAT_SIGNED_AL88 ***********************************************/ 1231 1232 static void FETCH(signed_al88)( const struct swrast_texture_image *texImage, 1233 GLint i, GLint j, GLint k, GLfloat *texel ) 1234 { 1235 const GLushort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1); 1236 texel[RCOMP] = 1237 texel[GCOMP] = 1238 texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) ); 1239 texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) ); 1240 } 1241 1242 1243 1244 1245 /* MESA_FORMAT_SIGNED_RGBX8888 ***********************************************/ 1246 1247 static void FETCH(signed_rgbx8888)( const struct swrast_texture_image *texImage, 1248 GLint i, GLint j, GLint k, GLfloat *texel ) 1249 { 1250 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 1251 texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) ); 1252 texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) ); 1253 texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) ); 1254 texel[ACOMP] = 1.0f; 1255 } 1256 1257 1258 1259 1260 /* MESA_FORMAT_SIGNED_RGBA8888 ***********************************************/ 1261 1262 static void FETCH(signed_rgba8888)( const struct swrast_texture_image *texImage, 1263 GLint i, GLint j, GLint k, GLfloat *texel ) 1264 { 1265 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 1266 texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) ); 1267 texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) ); 1268 texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) ); 1269 texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s ) ); 1270 } 1271 1272 1273 1274 static void FETCH(signed_rgba8888_rev)( const struct swrast_texture_image *texImage, 1275 GLint i, GLint j, GLint k, GLfloat *texel ) 1276 { 1277 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 1278 texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s ) ); 1279 texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) ); 1280 texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) ); 1281 texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) ); 1282 } 1283 1284 1285 1286 1287 1288 /* MESA_FORMAT_SIGNED_R16 ***********************************************/ 1289 1290 static void 1291 FETCH(signed_r16)(const struct swrast_texture_image *texImage, 1292 GLint i, GLint j, GLint k, GLfloat *texel) 1293 { 1294 const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1); 1295 texel[RCOMP] = SHORT_TO_FLOAT_TEX( s ); 1296 texel[GCOMP] = 0.0F; 1297 texel[BCOMP] = 0.0F; 1298 texel[ACOMP] = 1.0F; 1299 } 1300 1301 1302 1303 1304 /* MESA_FORMAT_SIGNED_A16 ***********************************************/ 1305 1306 static void 1307 FETCH(signed_a16)(const struct swrast_texture_image *texImage, 1308 GLint i, GLint j, GLint k, GLfloat *texel) 1309 { 1310 const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1); 1311 texel[RCOMP] = 0.0F; 1312 texel[GCOMP] = 0.0F; 1313 texel[BCOMP] = 0.0F; 1314 texel[ACOMP] = SHORT_TO_FLOAT_TEX( s ); 1315 } 1316 1317 1318 1319 1320 /* MESA_FORMAT_SIGNED_L16 ***********************************************/ 1321 1322 static void 1323 FETCH(signed_l16)(const struct swrast_texture_image *texImage, 1324 GLint i, GLint j, GLint k, GLfloat *texel) 1325 { 1326 const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1); 1327 texel[RCOMP] = 1328 texel[GCOMP] = 1329 texel[BCOMP] = SHORT_TO_FLOAT_TEX( s ); 1330 texel[ACOMP] = 1.0F; 1331 } 1332 1333 1334 1335 1336 /* MESA_FORMAT_SIGNED_I16 ***********************************************/ 1337 1338 static void 1339 FETCH(signed_i16)(const struct swrast_texture_image *texImage, 1340 GLint i, GLint j, GLint k, GLfloat *texel) 1341 { 1342 const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1); 1343 texel[RCOMP] = 1344 texel[GCOMP] = 1345 texel[BCOMP] = 1346 texel[ACOMP] = SHORT_TO_FLOAT_TEX( s ); 1347 } 1348 1349 1350 1351 1352 /* MESA_FORMAT_SIGNED_RG1616 ***********************************************/ 1353 1354 static void 1355 FETCH(signed_rg1616)(const struct swrast_texture_image *texImage, 1356 GLint i, GLint j, GLint k, GLfloat *texel) 1357 { 1358 const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 2); 1359 texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] ); 1360 texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] ); 1361 texel[BCOMP] = 0.0F; 1362 texel[ACOMP] = 1.0F; 1363 } 1364 1365 1366 1367 1368 /* MESA_FORMAT_SIGNED_AL1616 ***********************************************/ 1369 1370 static void 1371 FETCH(signed_al1616)(const struct swrast_texture_image *texImage, 1372 GLint i, GLint j, GLint k, GLfloat *texel) 1373 { 1374 const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 2); 1375 texel[RCOMP] = 1376 texel[GCOMP] = 1377 texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[0] ); 1378 texel[ACOMP] = SHORT_TO_FLOAT_TEX( s[1] ); 1379 } 1380 1381 1382 1383 1384 /* MESA_FORMAT_SIGNED_RGB_16 ***********************************************/ 1385 1386 static void 1387 FETCH(signed_rgb_16)(const struct swrast_texture_image *texImage, 1388 GLint i, GLint j, GLint k, GLfloat *texel) 1389 { 1390 const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 3); 1391 texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] ); 1392 texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] ); 1393 texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[2] ); 1394 texel[ACOMP] = 1.0F; 1395 } 1396 1397 1398 1399 1400 /* MESA_FORMAT_SIGNED_RGBA_16 ***********************************************/ 1401 1402 static void 1403 FETCH(signed_rgba_16)(const struct swrast_texture_image *texImage, 1404 GLint i, GLint j, GLint k, GLfloat *texel) 1405 { 1406 const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 4); 1407 texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] ); 1408 texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] ); 1409 texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[2] ); 1410 texel[ACOMP] = SHORT_TO_FLOAT_TEX( s[3] ); 1411 } 1412 1413 1414 1415 1416 1417 /* MESA_FORMAT_RGBA_16 ***********************************************/ 1418 1419 static void 1420 FETCH(rgba_16)(const struct swrast_texture_image *texImage, 1421 GLint i, GLint j, GLint k, GLfloat *texel) 1422 { 1423 const GLushort *s = TEXEL_ADDR(GLushort, texImage, i, j, k, 4); 1424 texel[RCOMP] = USHORT_TO_FLOAT( s[0] ); 1425 texel[GCOMP] = USHORT_TO_FLOAT( s[1] ); 1426 texel[BCOMP] = USHORT_TO_FLOAT( s[2] ); 1427 texel[ACOMP] = USHORT_TO_FLOAT( s[3] ); 1428 } 1429 1430 1431 1432 1433 1434 /* MESA_FORMAT_YCBCR *********************************************************/ 1435 1436 /* Fetch texel from 1D, 2D or 3D ycbcr texture, return 4 GLfloats. 1437 * We convert YCbCr to RGB here. 1438 */ 1439 static void FETCH(f_ycbcr)( const struct swrast_texture_image *texImage, 1440 GLint i, GLint j, GLint k, GLfloat *texel ) 1441 { 1442 const GLushort *src0 = TEXEL_ADDR(GLushort, texImage, (i & ~1), j, k, 1); /* even */ 1443 const GLushort *src1 = src0 + 1; /* odd */ 1444 const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */ 1445 const GLubyte cb = *src0 & 0xff; /* chroma U */ 1446 const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */ 1447 const GLubyte cr = *src1 & 0xff; /* chroma V */ 1448 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */ 1449 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128); 1450 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128); 1451 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128); 1452 r *= (1.0F / 255.0F); 1453 g *= (1.0F / 255.0F); 1454 b *= (1.0F / 255.0F); 1455 texel[RCOMP] = CLAMP(r, 0.0F, 1.0F); 1456 texel[GCOMP] = CLAMP(g, 0.0F, 1.0F); 1457 texel[BCOMP] = CLAMP(b, 0.0F, 1.0F); 1458 texel[ACOMP] = 1.0F; 1459 } 1460 1461 1462 1463 1464 /* MESA_FORMAT_YCBCR_REV *****************************************************/ 1465 1466 /* Fetch texel from 1D, 2D or 3D ycbcr_rev texture, return 4 GLfloats. 1467 * We convert YCbCr to RGB here. 1468 */ 1469 static void FETCH(f_ycbcr_rev)( const struct swrast_texture_image *texImage, 1470 GLint i, GLint j, GLint k, GLfloat *texel ) 1471 { 1472 const GLushort *src0 = TEXEL_ADDR(GLushort, texImage, (i & ~1), j, k, 1); /* even */ 1473 const GLushort *src1 = src0 + 1; /* odd */ 1474 const GLubyte y0 = *src0 & 0xff; /* luminance */ 1475 const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */ 1476 const GLubyte y1 = *src1 & 0xff; /* luminance */ 1477 const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */ 1478 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */ 1479 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128); 1480 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128); 1481 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128); 1482 r *= (1.0F / 255.0F); 1483 g *= (1.0F / 255.0F); 1484 b *= (1.0F / 255.0F); 1485 texel[RCOMP] = CLAMP(r, 0.0F, 1.0F); 1486 texel[GCOMP] = CLAMP(g, 0.0F, 1.0F); 1487 texel[BCOMP] = CLAMP(b, 0.0F, 1.0F); 1488 texel[ACOMP] = 1.0F; 1489 } 1490 1491 1492 1493 1494 /* MESA_TEXFORMAT_Z24_S8 ***************************************************/ 1495 1496 static void FETCH(f_z24_s8)( const struct swrast_texture_image *texImage, 1497 GLint i, GLint j, GLint k, GLfloat *texel ) 1498 { 1499 /* only return Z, not stencil data */ 1500 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 1501 const GLdouble scale = 1.0 / (GLdouble) 0xffffff; 1502 texel[0] = ((*src) >> 8) * scale; 1503 ASSERT(texImage->Base.TexFormat == MESA_FORMAT_Z24_S8 || 1504 texImage->Base.TexFormat == MESA_FORMAT_Z24_X8); 1505 ASSERT(texel[0] >= 0.0F); 1506 ASSERT(texel[0] <= 1.0F); 1507 } 1508 1509 1510 1511 1512 /* MESA_TEXFORMAT_S8_Z24 ***************************************************/ 1513 1514 static void FETCH(f_s8_z24)( const struct swrast_texture_image *texImage, 1515 GLint i, GLint j, GLint k, GLfloat *texel ) 1516 { 1517 /* only return Z, not stencil data */ 1518 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 1519 const GLdouble scale = 1.0 / (GLdouble) 0xffffff; 1520 texel[0] = ((*src) & 0x00ffffff) * scale; 1521 ASSERT(texImage->Base.TexFormat == MESA_FORMAT_S8_Z24 || 1522 texImage->Base.TexFormat == MESA_FORMAT_X8_Z24); 1523 ASSERT(texel[0] >= 0.0F); 1524 ASSERT(texel[0] <= 1.0F); 1525 } 1526 1527 1528 1529 1530 /* MESA_FORMAT_RGB9_E5 ******************************************************/ 1531 1532 static void FETCH(rgb9_e5)( const struct swrast_texture_image *texImage, 1533 GLint i, GLint j, GLint k, GLfloat *texel ) 1534 { 1535 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 1536 rgb9e5_to_float3(*src, texel); 1537 texel[ACOMP] = 1.0F; 1538 } 1539 1540 1541 1542 1543 /* MESA_FORMAT_R11_G11_B10_FLOAT *********************************************/ 1544 1545 static void FETCH(r11_g11_b10f)( const struct swrast_texture_image *texImage, 1546 GLint i, GLint j, GLint k, GLfloat *texel ) 1547 { 1548 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1); 1549 r11g11b10f_to_float3(*src, texel); 1550 texel[ACOMP] = 1.0F; 1551 } 1552 1553 1554 1555 1556 /* MESA_FORMAT_Z32_FLOAT_X24S8 ***********************************************/ 1557 1558 static void FETCH(z32f_x24s8)(const struct swrast_texture_image *texImage, 1559 GLint i, GLint j, GLint k, GLfloat *texel) 1560 { 1561 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2); 1562 texel[RCOMP] = src[0]; 1563 texel[GCOMP] = 0.0F; 1564 texel[BCOMP] = 0.0F; 1565 texel[ACOMP] = 1.0F; 1566 } 1567 1568 1569 1570 #undef TEXEL_ADDR 1571 #undef DIM 1572 #undef FETCH 1573