|
|
1.1 ! root 1: #! /bin/sh ! 2: ! 3: # $Id: fb-xlat-auto.sh,v 1.5 2003/09/29 11:42:56 fredette Exp $ ! 4: ! 5: # generic/fb-xlat-auto.sh - automatically generates C code ! 6: # for many framebuffer translation functions: ! 7: ! 8: # ! 9: # Copyright (c) 2003 Matt Fredette ! 10: # All rights reserved. ! 11: # ! 12: # Redistribution and use in source and binary forms, with or without ! 13: # modification, are permitted provided that the following conditions ! 14: # are met: ! 15: # 1. Redistributions of source code must retain the above copyright ! 16: # notice, this list of conditions and the following disclaimer. ! 17: # 2. Redistributions in binary form must reproduce the above copyright ! 18: # notice, this list of conditions and the following disclaimer in the ! 19: # documentation and/or other materials provided with the distribution. ! 20: # 3. All advertising materials mentioning features or use of this software ! 21: # must display the following acknowledgement: ! 22: # This product includes software developed by Matt Fredette. ! 23: # 4. The name of the author may not be used to endorse or promote products ! 24: # derived from this software without specific prior written permission. ! 25: # ! 26: # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ! 27: # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ! 28: # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ! 29: # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, ! 30: # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ! 31: # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ! 32: # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 33: # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, ! 34: # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ! 35: # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ! 36: # POSSIBILITY OF SUCH DAMAGE. ! 37: # ! 38: ! 39: # this script generates one or more C functions. each function ! 40: # translates an image from a source image format into a destination ! 41: # image format, optionally halving or doubling the image size in the ! 42: # process. ! 43: # ! 44: # the source and destination image formats are represented by "keys", ! 45: # strings that describe the different attributes of a format. ! 46: # ! 47: # a source image format key has the form: WxHdDbBsSpPoO[_X] ! 48: # ! 49: # a destination image format key has the form: dDbBsSpPoO ! 50: # ! 51: # all of the lowercase letters and underscores are literals, and all ! 52: # of the uppercase letters represent attribute values. the different ! 53: # attributes are: ! 54: # ! 55: # W is the width of the source image. if zero, the generated function ! 56: # will be able to translate source images of any width, but it will be ! 57: # suboptimal. if nonzero, the generated function will only be able to ! 58: # translate source images of that width, but it will have some ! 59: # optimization. this attribute is only used in source keys, since the ! 60: # destination width is always the scaled source width. ! 61: # ! 62: # H is the height of the source image. if zero, the generated ! 63: # function will be able to translate source images of any height, but ! 64: # it will be suboptimal. if nonzero, the generated function will only ! 65: # be able to translate source images of that height, but it will have ! 66: # some optimization. this attribute is only used in source keys, ! 67: # since the destination height is always the scaled source height. ! 68: # ! 69: # D is the color (d)epth, in bits, of the source/destination image. ! 70: # if zero, the generated function will be able to handle ! 71: # source/destination images of any depth, but it will be suboptimal. ! 72: # if nonzero, the generated function will only be able to handle ! 73: # source/destination images of that depth, but it will have some ! 74: # optimization. ! 75: # ! 76: # B is the (b)its-per-pixel of the source/destination image. this ! 77: # must be at least as large as the depth, and it may be larger. if ! 78: # zero, the generated function will be able to handle ! 79: # source/destination images of any bits-per-pixel, but it will be ! 80: # suboptimal. if nonzero, the generated function will only be able to ! 81: # handle source/destination images of that bits-per-pixel, but it will ! 82: # have some optimization. ! 83: # ! 84: # S is the (s)kip-x-bits of the source/destination image. this is the ! 85: # number of bits at the beginning of each image scanline that are not ! 86: # displayed. if an underscore, the generated function will be able to ! 87: # handle source/destination images with any skip-x-bits, but it will ! 88: # be suboptimal. if not an underscore, the generated function will ! 89: # only be able to handle source/destination images with that many ! 90: # skip-x-bits, but it will have some optimization. ! 91: # ! 92: # P is the (p)adding of the source/destination image. this is how ! 93: # many bits each image scanline is padded to. if zero, the generated ! 94: # function will be able to handle source/destination images with any ! 95: # padding, but it will be suboptimal. if nonzero, the generated ! 96: # function will only be able to handle source/destination images with ! 97: # that padding, but it will have some optimization. ! 98: # ! 99: # O is the byte and bit (o)rder of the source/destination image. this ! 100: # is always m or l for most- or least-significant, respectively. ! 101: # there is no "any" wildcard value. this script cannot handle image ! 102: # formats where a word-unit of pixels has one order for its bytes in ! 103: # memory, but the opposite order for its pixels within the word-unit. ! 104: # ! 105: # X is the optional scaling. it is `h' to halve the source image, ! 106: # or `d' to double it. this attribute is only used in source keys. ! 107: ! 108: # this script generates a set of functions for the product of all ! 109: # source image formats and all destination image formats. ! 110: # ! 111: # "all source image formats" includes all source image formats given ! 112: # on the command line, plus: ! 113: # ! 114: # the "any" source image format, unscaled ! 115: # the "any" source image format, halved ! 116: # the "any" source image format, doubled ! 117: # ! 118: # "all destination image formats" includes all destination ! 119: # image formats given on the command line, plus: ! 120: # ! 121: # the "any" destination image format ! 122: # ! 123: src_all= ! 124: dst_all= ! 125: for order in m l; do ! 126: src_key="0x0d0b0s_p0o${order}" ! 127: src_all="${src_all} ${src_key} ${src_key}_h ${src_key}_d" ! 128: dst_all="${dst_all} d0b0s_p0o${order}" ! 129: done ! 130: ! 131: which= ! 132: for arg ! 133: do ! 134: case $arg in ! 135: src|dst) which=$arg ;; ! 136: *) ! 137: if test "x${which}" != x; then ! 138: eval "${which}_all=\"$arg \$${which}_all\"" ! 139: fi ! 140: ;; ! 141: esac ! 142: done ! 143: ! 144: PROG=`basename $0` ! 145: cat <<EOF ! 146: /* automatically generated by $PROG, do not edit! */ ! 147: ! 148: /* ! 149: * Copyright (c) 2003 Matt Fredette ! 150: * All rights reserved. ! 151: * ! 152: * Redistribution and use in source and binary forms, with or without ! 153: * modification, are permitted provided that the following conditions ! 154: * are met: ! 155: * 1. Redistributions of source code must retain the above copyright ! 156: * notice, this list of conditions and the following disclaimer. ! 157: * 2. Redistributions in binary form must reproduce the above copyright ! 158: * notice, this list of conditions and the following disclaimer in the ! 159: * documentation and/or other materials provided with the distribution. ! 160: * 3. All advertising materials mentioning features or use of this software ! 161: * must display the following acknowledgement: ! 162: * This product includes software developed by Matt Fredette. ! 163: * 4. The name of the author may not be used to endorse or promote products ! 164: * derived from this software without specific prior written permission. ! 165: * ! 166: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ! 167: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ! 168: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ! 169: * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, ! 170: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ! 171: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ! 172: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 173: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, ! 174: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ! 175: * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ! 176: * POSSIBILITY OF SUCH DAMAGE. ! 177: */ ! 178: ! 179: _TME_RCSID("\$Id: fb-xlat-auto.sh,v 1.5 2003/09/29 11:42:56 fredette Exp $"); ! 180: ! 181: /* the central feature of these translation functions is the "bit ! 182: FIFO", a first-in, first-out stream of bits. source bit FIFOs are ! 183: used to read pixel bits out of source images, and destination bit ! 184: FIFOs are used to write pixel bits into destination images. ! 185: ! 186: a bit FIFO has a visible part and an invisible part. ! 187: ! 188: the visible part of a bit FIFO is 32 bits wide, meaning the ! 189: translation code can read (for a source bit FIFO) or write (for a ! 190: destination bit FIFO) up to 32 bits of pixel data before a bit ! 191: FIFO shift. ! 192: ! 193: the invisible part of a source bit FIFO contains pixel bits that ! 194: have already been read from the source image memory, but that have ! 195: yet to be shifted in to the visible part. ! 196: ! 197: the invisible part of a destination bit FIFO contains the pixel ! 198: bits that have been shifted out of the visible part, but that have ! 199: yet to be written to the destination image memory. ! 200: ! 201: depending on various attributes of an image format, it may be ! 202: possible for the translation code to always read or write the ! 203: entire 32 visible bits of a bit FIFO at a time, and as a result ! 204: always shift the bit FIFO 32 bits at a time. this is desirable ! 205: because it minimizes bit FIFO shifts. ! 206: ! 207: when this does happen, it may also be the case that the visible ! 208: part of the bit FIFO always perfectly corresponds to an aligned ! 209: 32-bit word in the image buffer. ! 210: ! 211: this is the optimal situation, as it makes it unnecessary to track ! 212: the invisible part in C local variables at all - each 32-bit FIFO ! 213: shift of a source bit FIFO just reads the next 32-bit word directly ! 214: into the visible part, and each 32-bit FIFO shift of a destination ! 215: bit FIFO just writes the next 32-bit word directly out of the ! 216: visible part. ! 217: ! 218: within the visible part of a bit FIFO, which bits belong to which ! 219: pixels depends on the "order" of the image format. most-significant ! 220: (big-endian) images have earlier (more to the left on the screen) ! 221: pixels in more-significant bit positions. least-significant ! 222: (little-endian) images have earlier pixels in less-significant bit ! 223: bit positions. ! 224: ! 225: bit significance *within* a pixel never depends on image order. ! 226: once the bits belonging to a pixel have been identified according ! 227: to image order, the least significant bit in that pixel's value is ! 228: always the bit with the least absolute value. ! 229: ! 230: some pictures may help explain this better. each picture shows the ! 231: 32 bit visible part of a bit FIFO, with the bits marked from 0 ! 232: (least significant) to 31 (most significant). all of these ! 233: examples are for a two-bit-deep/two-bits-per-pixel image, and in ! 234: the visible part sixteen pixels are numbered. lesser numbered ! 235: pixels are earlier (more to the left on the screen). some of the ! 236: invisible part is also shown, along with the direction that the bit ! 237: FIFO shifts in: ! 238: ! 239: a source bit FIFO for a little-endian source image with two bits ! 240: per pixel looks like: ! 241: ! 242: | ! 243: | 31 30 29 28 7 6 5 4 3 2 1 0 ! 244: --+--+--+--+--+--+|+--+--+--+--+- --+--+--+--+--+--+--+--+ ! 245: .. p18 | p17 | p16 ||| p15 | p14 | .. p3 | p2 | p1 | p0 | ! 246: --+--+--+--+--+--+|+--+--+--+--+- --+--+--+--+--+--+--+--+ ! 247: | ! 248: invisible part | visible part ! 249: ! 250: shift -> shift -> shift -> shift -> shift -> ! 251: ! 252: a source bit FIFO for a big-endian source image with two bits per ! 253: pixel looks like: ! 254: ! 255: | ! 256: 31 30 29 28 27 26 25 26 4 3 2 1 0 | ! 257: +--+--+--+--+--+--+--+-- -+--+--+--+--+|+--+--+--+--+--+-- ! 258: | p0 | p1 | p2 | p3 .. | p14 | p15 ||| p16 | p17 | p18 .. ! 259: +--+--+--+--+--+--+--+-- -+--+--+--+--+|+--+--+--+--+--+-- ! 260: | ! 261: visible part | invisible part ! 262: ! 263: <- shift <- shift <- shift <- shift <- shift ! 264: ! 265: a destination bit FIFO for a little-endian destination image with ! 266: two bits per pixel looks like: ! 267: ! 268: | ! 269: 31 30 29 28 27 26 25 26 4 3 2 1 0 | ! 270: +--+--+--+--+--+--+--+-- -+--+--+--+--+|+--+--+--+--+--+-- ! 271: | p23 | p22 | p21 | p20 .. | p9 | p8 ||| p7 | p6 | p5 .. ! 272: +--+--+--+--+--+--+--+-- -+--+--+--+--+|+--+--+--+--+--+-- ! 273: | ! 274: visible part | invisible part ! 275: ! 276: shift -> shift -> shift -> shift -> shift -> ! 277: ! 278: a destination bit FIFO for a big-endian destination image with ! 279: two bits per pixel looks like: ! 280: ! 281: | ! 282: | 31 30 29 28 7 6 5 4 3 2 1 0 ! 283: --+--+--+--+--+--+|+--+--+--+--+- --+--+--+--+--+--+--+--+ ! 284: .. p5 | p6 | p7 ||| p8 | p9 | .. p20 | p21 | p22 | p23 | ! 285: --+--+--+--+--+--+|+--+--+--+--+- --+--+--+--+--+--+--+--+ ! 286: | ! 287: invisible part | visible part ! 288: ! 289: <- shift <- shift <- shift <- shift <- shift ! 290: ! 291: each translation function has at least one source bit FIFO and at ! 292: least one destination bit FIFO. the general idea is to read source ! 293: pixel value(s) from the source image, map those source pixel ! 294: value(s) somehow into destination pixel value(s), and write those ! 295: destination pixel value(s) to the destination image. ! 296: ! 297: translation functions that do not scale the image have exactly one ! 298: source bit FIFO and exactly one destination bit FIFO. one pixel ! 299: read from the source bit FIFO becomes one pixel written to the ! 300: destination bit FIFO. ! 301: ! 302: translation functions that halve the image size have two source bit ! 303: FIFOs and one destination bit FIFO. one source bit FIFO sources ! 304: bits from an even-numbered scanline, and the other sources bits from ! 305: an odd-numbered scanline. four pixels read from the source bit ! 306: FIFOs - two from each source bit FIFO, making a 2x2 square - become ! 307: one pixel written to the destination bit FIFO. ! 308: ! 309: translation functions that double the image size have one source ! 310: bit FIFO and two destination bit FIFOs. one destination bit FIFO ! 311: sinks bits for an even-numbered scanline, and the other sinks bits ! 312: for an odd-numbered scanline. one pixel read from the source bit ! 313: FIFO becomes four pixels written to the destination bit FIFOs - ! 314: two to each destination bit FIFO, making a 2x2 square. ! 315: ! 316: translation functions don't necessarily always translate the entire ! 317: source image into the entire destination image. instead, the buffer ! 318: holding the current source image is expected to be twice as large as ! 319: necessary (plus some overhead), with the second half of the buffer ! 320: holding a copy of the last translated ("old") source image. ! 321: ! 322: before setting up and translating pixels using bit FIFOs, a ! 323: translation function treats the the current and old source images as ! 324: an array of aligned 32-bit words and compares them. if it finds no ! 325: 32-bit word that has changed, no translation is done and the ! 326: function returns. ! 327: ! 328: otherwise, initial source pixel x and y coordinates are derived from ! 329: the offset of the 32-bit word that failed comparison, and the source ! 330: primary bit FIFO is primed. if this translation function halves the ! 331: image size, the source secondary bit FIFO is primed from the same x ! 332: coordinate on the "other" (think y ^ 1) scanline. ! 333: ! 334: then, initial destination pixel x and y coordinates are derived from ! 335: the initial source x and y coordinates, and the destination primary ! 336: bit FIFO is primed. if this translation function doubles the image ! 337: size, the destination secondary bit FIFO is primed from the same x ! 338: coordinate on the "other" (think y ^ 1) scanline. ! 339: ! 340: as mentioned previously, the buffer holding the current source image ! 341: is expected to be twice as large as necessary (plus some overhead), ! 342: with the second half of the buffer holding a copy of the last ! 343: translated ("old") source image. ! 344: ! 345: this "overhead" is approximately two extra scanlines worth of data, ! 346: that is initialized to all-bits-zero and must always remain zero. ! 347: this extra data is present at the end of both the current ("new") ! 348: and last translated ("old") source images. ! 349: ! 350: these extra, always-blank scanlines guarantee that the pixel ! 351: translation loop terminates. the pixel translation loop *never* ! 352: checks for the end of the image buffer. instead, it terminates only ! 353: after it has read in TME_FB_XLAT_RUN consecutive aligned 32-bit ! 354: words that have *not* changed between the new and old source images. ! 355: this small amount of extra memory overhead simplifies the pixel ! 356: translation loop, because it doesn't have to worry about going past ! 357: the end of the actual image. ! 358: */ ! 359: ! 360: ! 361: /* macros: */ ! 362: ! 363: /* given a 32-bit aligned pointer into the current source image, this ! 364: returns the corresponding 32-bit aligned pointer in the last ! 365: translated ("old") source image. since the old source image ! 366: follows the current source image, this is simple pointer arithmetic ! 367: using src_bypb: */ ! 368: #define TME_FB_XLAT_SRC_OLD(raw) \\ ! 369: ((tme_uint32_t *) (((tme_uint8_t *) (raw)) + src_bypb)) ! 370: ! 371: /* when the fast, aligned 32-bit word comparison loop finds a word ! 372: that has changed in the source image, pixels are translated until ! 373: TME_FB_XLAT_RUN consecutive aligned 32-bit words are processed that ! 374: have *not* changed in the source image, at which point the fast ! 375: comparison loop resumes. ! 376: ! 377: the idea is that after you've started translating pixels, once the ! 378: FIFO shift operation has read TME_FB_XLAT_RUN consecutive raw, ! 379: unchanged 32-bit words, all of the pixels from previous, changed ! 380: 32-bit words have been translated and shifted out of the source bit ! 381: FIFO(s), and all bits remaining in the source bit FIFO(s) are for ! 382: pixels in those unchanged 32-bit words. since the pixels are ! 383: unchanged, pixel translation can stop, and the entire state of the ! 384: source bit FIFO(s) can be discarded. ! 385: ! 386: so, each time a raw, changed 32-bit word is read, xlat_run is ! 387: reloaded with TME_FB_XLAT_RUN, and each time 32 bits worth of ! 388: source image pixels are processed, it is decremented. when it ! 389: reaches zero, the source bit FIFO(s) are discarded, the destination ! 390: bit FIFO(s) are flushed, the pixel translation loop breaks and the ! 391: fast comparison loop continues: */ ! 392: #define TME_FB_XLAT_RUN (2) ! 393: ! 394: /* this shifts a source FIFO: */ ! 395: #define TME_FB_XLAT_SHIFT_SRC(unaligned, fifo, next, bits, shift, raw, order)\\ ! 396: do { \\ ! 397: \\ ! 398: /* if the source FIFO may not be 32-bit aligned: */ \\ ! 399: if (unaligned) { \\ ! 400: \\ ! 401: /* we must be shifting between 1 and 32 bits: */ \\ ! 402: assert ((shift) >= 1 && (shift) <= 32); \\ ! 403: \\ ! 404: /* the FIFO must have more than 32 bits in it already: */ \\ ! 405: assert (bits > 32); \\ ! 406: \\ ! 407: /* shift the FIFO: */ \\ ! 408: if ((shift) == 32) { \\ ! 409: fifo = next; \\ ! 410: } \\ ! 411: else if (order == TME_ENDIAN_BIG) { \\ ! 412: fifo = (fifo << ((shift) & 31)) | (next >> (32 - (shift)));\\ ! 413: next <<= ((shift) & 31); \\ ! 414: } \\ ! 415: else { \\ ! 416: fifo = (fifo >> ((shift) & 31)) | (next << (32 - (shift)));\\ ! 417: next >>= ((shift) & 31); \\ ! 418: } \\ ! 419: bits -= (shift); \\ ! 420: \\ ! 421: /* if we have a new 32-bit word to read: */ \\ ! 422: if (bits <= 32) { \\ ! 423: next = *raw; \\ ! 424: if (*TME_FB_XLAT_SRC_OLD(raw) != next) { \\ ! 425: *TME_FB_XLAT_SRC_OLD(raw) = next; \\ ! 426: xlat_run = TME_FB_XLAT_RUN; \\ ! 427: } \\ ! 428: raw++; \\ ! 429: next = (order == TME_ENDIAN_BIG \\ ! 430: ? tme_betoh_u32(next) \\ ! 431: : tme_letoh_u32(next)); \\ ! 432: \\ ! 433: /* before the load, if there were fewer than 32 bits \\ ! 434: remaining in the FIFO, shift bits from the word \\ ! 435: we just loaded into their proper positions: */ \\ ! 436: if (bits < 32) { \\ ! 437: if (order == TME_ENDIAN_BIG) { \\ ! 438: fifo |= (next >> bits); \\ ! 439: next <<= (32 - bits); \\ ! 440: } \\ ! 441: else { \\ ! 442: fifo |= (next << bits); \\ ! 443: next >>= (32 - bits); \\ ! 444: } \\ ! 445: } \\ ! 446: \\ ! 447: /* there are now 32 more bits in the FIFO: */ \\ ! 448: bits += 32; \\ ! 449: } \\ ! 450: } \\ ! 451: \\ ! 452: /* otherwise, if the source FIFO is always 32-bit aligned: */ \\ ! 453: else { \\ ! 454: \\ ! 455: /* we must be shifting exactly 32 bits: */ \\ ! 456: assert((shift) == 32); \\ ! 457: \\ ! 458: /* load the next 32-bit word: */ \\ ! 459: fifo = *raw; \\ ! 460: if (*TME_FB_XLAT_SRC_OLD(raw) != fifo) { \\ ! 461: *TME_FB_XLAT_SRC_OLD(raw) = fifo; \\ ! 462: xlat_run = TME_FB_XLAT_RUN; \\ ! 463: } \\ ! 464: raw++; \\ ! 465: fifo = (order == TME_ENDIAN_BIG \\ ! 466: ? tme_betoh_u32(fifo) \\ ! 467: : tme_letoh_u32(fifo)); \\ ! 468: } \\ ! 469: } while (/* CONSTCOND */ 0) ! 470: ! 471: /* this shifts a destination FIFO: */ ! 472: #define TME_FB_XLAT_SHIFT_DST(unaligned, fifo, next, bits, shift, raw, order)\\ ! 473: do { \\ ! 474: \\ ! 475: /* if the destination FIFO may not be 32-bit aligned: */ \\ ! 476: if (unaligned) { \\ ! 477: \\ ! 478: /* we must be shifting between 1 and 32 bits: */ \\ ! 479: assert ((shift) >= 1 && (shift) <= 32); \\ ! 480: \\ ! 481: /* the FIFO must have fewer than 32 bits in it: */ \\ ! 482: assert (bits < 32); \\ ! 483: \\ ! 484: /* shift the FIFO: */ \\ ! 485: if (order == TME_ENDIAN_BIG) { \\ ! 486: next |= (fifo >> bits); \\ ! 487: fifo <<= (32 - bits); \\ ! 488: } \\ ! 489: else { \\ ! 490: next |= (fifo << bits); \\ ! 491: fifo >>= (32 - bits); \\ ! 492: } \\ ! 493: bits += (shift); \\ ! 494: \\ ! 495: /* if we have a completed 32-bit word to write: */ \\ ! 496: if (bits >= 32) { \\ ! 497: *(raw++) = (order == TME_ENDIAN_BIG \\ ! 498: ? tme_htobe_u32(next) \\ ! 499: : tme_htole_u32(next)); \\ ! 500: bits -= 32; \\ ! 501: assert(bits != 0 || fifo == 0); \\ ! 502: next = fifo; \\ ! 503: } \\ ! 504: } \\ ! 505: \\ ! 506: /* the destination FIFO is always 32-bit aligned: */ \\ ! 507: else { \\ ! 508: \\ ! 509: /* we must be shifting exactly 32 bits: */ \\ ! 510: assert((shift) == 32); \\ ! 511: \\ ! 512: /* store the next 32-bit word: */ \\ ! 513: *(raw++) = (order == TME_ENDIAN_BIG \\ ! 514: ? tme_htobe_u32(fifo) \\ ! 515: : tme_htole_u32(fifo)); \\ ! 516: \\ ! 517: } \\ ! 518: \\ ! 519: /* clear the writable part of the FIFO: */ \\ ! 520: fifo = 0; \\ ! 521: } while (/* CONSTCOND */ 0) ! 522: EOF ! 523: ! 524: # the next function number: ! 525: xlat_next=0 ! 526: xlat_array= ! 527: ! 528: # permute over the source possibilities: ! 529: for src_key in ${src_all}; do ! 530: ! 531: # take apart the source possibility: ! 532: src_parts=${src_key} ! 533: ! 534: # get the width: ! 535: width=`echo ${src_parts} | sed -e 's/^\([0-9][0-9]*\)\(.*\)$/\1/'` ! 536: src_parts=`echo ${src_parts} | sed -e 's/^\([0-9][0-9]*\)\(.*\)$/\2/'` ! 537: ! 538: # get the height: ! 539: height=`echo ${src_parts} | sed -e 's/^x\([0-9][0-9]*\)\(.*\)$/\1/'` ! 540: src_parts=`echo ${src_parts} | sed -e 's/^x\([0-9][0-9]*\)\(.*\)$/\2/'` ! 541: ! 542: # get the source depth: ! 543: src_depth=`echo ${src_parts} | sed -e 's/^d\([0-9][0-9]*\)\(.*\)$/\1/'` ! 544: src_parts=`echo ${src_parts} | sed -e 's/^d\([0-9][0-9]*\)\(.*\)$/\2/'` ! 545: ! 546: # get the source bits per pixel: ! 547: src_bipp=`echo ${src_parts} | sed -e 's/^b\([0-9][0-9]*\)\(.*\)$/\1/'` ! 548: src_parts=`echo ${src_parts} | sed -e 's/^b\([0-9][0-9]*\)\(.*\)$/\2/'` ! 549: ! 550: # get the source skip pixel count: ! 551: src_skipx=`echo ${src_parts} | sed -e 's/^s\([_0-9][0-9]*\)\(.*\)$/\1/'` ! 552: src_parts=`echo ${src_parts} | sed -e 's/^s\([_0-9][0-9]*\)\(.*\)$/\2/'` ! 553: ! 554: # get the source scanline pad: ! 555: src_pad=`echo ${src_parts} | sed -e 's/^p\([0-9][0-9]*\)\(.*\)$/\1/'` ! 556: src_parts=`echo ${src_parts} | sed -e 's/^p\([0-9][0-9]*\)\(.*\)$/\2/'` ! 557: ! 558: # get the source "order" - i.e., byte order and leftmost (first) ! 559: # pixel significance: ! 560: src_order=`echo ${src_parts} | sed -e 's/^o\([ml]\)\(.*\)$/\1/'` ! 561: src_parts=`echo ${src_parts} | sed -e 's/^o\([ml]\)\(.*\)$/\2/'` ! 562: ! 563: # get the source scaling: ! 564: scale="${src_parts}_" ! 565: ! 566: # permute over the destination possibilities: ! 567: for dst_key in ${dst_all}; do ! 568: ! 569: # take apart the destination possibility: ! 570: dst_parts=${dst_key} ! 571: ! 572: # get the destination depth: ! 573: dst_depth=`echo ${dst_parts} | sed -e 's/^d\([0-9][0-9]*\)\(.*\)$/\1/'` ! 574: dst_parts=`echo ${dst_parts} | sed -e 's/^d\([0-9][0-9]*\)\(.*\)$/\2/'` ! 575: ! 576: # get the destination bits per pixel: ! 577: dst_bipp=`echo ${dst_parts} | sed -e 's/^b\([0-9][0-9]*\)\(.*\)$/\1/'` ! 578: dst_parts=`echo ${dst_parts} | sed -e 's/^b\([0-9][0-9]*\)\(.*\)$/\2/'` ! 579: ! 580: # get the destination skip pixel count: ! 581: dst_skipx=`echo ${dst_parts} | sed -e 's/^s\([_0-9][0-9]*\)\(.*\)$/\1/'` ! 582: dst_parts=`echo ${dst_parts} | sed -e 's/^s\([_0-9][0-9]*\)\(.*\)$/\2/'` ! 583: ! 584: # get the destination scanline pad: ! 585: dst_pad=`echo ${dst_parts} | sed -e 's/^p\([0-9][0-9]*\)\(.*\)$/\1/'` ! 586: dst_parts=`echo ${dst_parts} | sed -e 's/^p\([0-9][0-9]*\)\(.*\)$/\2/'` ! 587: ! 588: # get the destination "order" - i.e., byte order and leftmost ! 589: # (first) pixel significance: ! 590: dst_order=`echo ${dst_parts} | sed -e 's/^o\([ml]\)\(.*\)$/\1/'` ! 591: dst_parts=`echo ${dst_parts} | sed -e 's/^o\([ml]\)\(.*\)$/\2/'` ! 592: ! 593: # when both source and destination depth are known, ignore ! 594: # this permutation if the source depth is greater: ! 595: if test $src_depth != 0 \ ! 596: && test $dst_depth != 0 \ ! 597: && test `expr ${src_depth} \> ${dst_depth}` = 1; then ! 598: continue ! 599: fi ! 600: ! 601: # allocate the xlat number: ! 602: xlat=${xlat_next} ! 603: xlat_next=`expr ${xlat_next} + 1` ! 604: xlat_info="tme_fb_xlat${xlat}" ! 605: ! 606: # start the function: ! 607: echo "" ! 608: echo "/* this translates frame buffer contents from this source format:" ! 609: case "${width}x${height}" in ! 610: 0x0) echo -n " any dimensions" ;; ! 611: *x0) echo -n " width $width, any height" ;; ! 612: 0x*) echo -n " any width, height ${height}" ;; ! 613: *) echo -n " ${width}x${height}" ;; ! 614: esac ! 615: xlat_info="${xlat_info}, ${width}, ${height}" ! 616: case ${scale} in ! 617: _h_) echo " (image will be halved)" ; value="HALF" ;; ! 618: _d_) echo " (image will be doubled)" ; value="DOUBLE" ;; ! 619: *) echo "" ; value="NONE" ;; ! 620: esac ! 621: xlat_info="${xlat_info}, TME_FB_XLAT_SCALE_${value}" ! 622: echo -n " " ! 623: case ${src_depth} in ! 624: 0) echo -n "any depth" ;; ! 625: 1) echo -n "1 bit deep" ;; ! 626: *) echo -n "${src_depth} bits deep" ;; ! 627: esac ! 628: xlat_info="${xlat_info}, ${src_depth}" ! 629: case ${src_bipp} in ! 630: 0) echo -n ", any bits per pixel" ;; ! 631: 1) echo -n ", 1 bit per pixel" ;; ! 632: *) echo -n ", ${src_bipp} bits per pixel" ;; ! 633: esac ! 634: xlat_info="${xlat_info}, ${src_bipp}" ! 635: case ${src_skipx} in ! 636: _) echo -n ", any number of pixels skipped" ; value="-1";; ! 637: *) echo -n ", ${src_skipx} pixels skipped" ; value=${src_skipx} ;; ! 638: esac ! 639: xlat_info="${xlat_info}, ${value}" ! 640: case ${src_pad} in ! 641: 0) echo -n ", any scanline padding" ;; ! 642: *) echo -n ", ${src_pad}-bit scanline padding" ;; ! 643: esac ! 644: xlat_info="${xlat_info}, ${src_pad}" ! 645: case ${src_order} in ! 646: m) echo -n ", MSB-first" ; value="BIG" ;; ! 647: l) echo -n ", LSB-first" ; value="LITTLE" ;; ! 648: esac ! 649: xlat_info="${xlat_info}, TME_ENDIAN_${value}" ! 650: echo "" ! 651: echo " to this destination format:" ! 652: echo -n " " ! 653: case ${dst_depth} in ! 654: 0) echo -n "any depth" ;; ! 655: 1) echo -n "1 bit deep" ;; ! 656: *) echo -n "${dst_depth} bits deep" ;; ! 657: esac ! 658: xlat_info="${xlat_info}, ${dst_depth}" ! 659: case ${dst_bipp} in ! 660: 0) echo -n ", any bits per pixel" ;; ! 661: 1) echo -n ", 1 bit per pixel" ;; ! 662: *) echo -n ", ${dst_bipp} bits per pixel" ;; ! 663: esac ! 664: xlat_info="${xlat_info}, ${dst_bipp}" ! 665: case ${dst_skipx} in ! 666: _) echo -n ", any number of pixels skipped" ; value="-1";; ! 667: *) echo -n ", ${dst_skipx} pixels skipped" ; value=${dst_skipx} ;; ! 668: esac ! 669: xlat_info="${xlat_info}, ${value}" ! 670: case ${dst_pad} in ! 671: 0) echo -n ", any scanline padding" ;; ! 672: *) echo -n ", ${dst_pad}-bit scanline padding" ;; ! 673: esac ! 674: xlat_info="${xlat_info}, ${dst_pad}" ! 675: case ${dst_order} in ! 676: m) echo -n ", MSB-first" ; value="BIG" ;; ! 677: l) echo -n ", LSB-first" ; value="LITTLE" ;; ! 678: esac ! 679: xlat_info="${xlat_info}, TME_ENDIAN_${value}" ! 680: save_IFS=$IFS ! 681: IFS= ! 682: xlat_array="${xlat_array} ! 683: { $xlat_info }, " ! 684: IFS=$save_IFS ! 685: echo "" ! 686: echo "*/" ! 687: echo "static int" ! 688: echo "tme_fb_xlat${xlat}(struct tme_fb_connection *src," ! 689: echo " struct tme_fb_connection *dst)" ! 690: echo "{" ! 691: undef_macros= ! 692: ! 693: echo "" ! 694: echo " /* whenever possible we define macros instead of declaring" ! 695: echo " variables, for optimization: */" ! 696: ! 697: echo "" ! 698: echo " /* declare src_x and src_y. these are the current translation" ! 699: echo " coordinates in the source image: */" ! 700: echo " unsigned int src_x, src_y;" ! 701: ! 702: echo "" ! 703: echo " /* declare dst_x and dst_y. these are the current translation" ! 704: echo " coordinates in the destination image. since this function" ! 705: if test $scale = _; then ! 706: echo " does not scale the image, these coordinates are always" ! 707: echo " the same as the coordinates in the source image: */" ! 708: echo "#define dst_x (src_x)" ! 709: echo "#define dst_y (src_y)" ! 710: undef_macros="${undef_macros} dst_x dst_y" ! 711: scale_op= ! 712: scale_math= ! 713: else ! 714: if test $scale = _h_; then ! 715: scale_op='/' ! 716: scale_name='halves' ! 717: else ! 718: scale_op='*' ! 719: scale_name='doubles' ! 720: fi ! 721: scale_math=" ${scale_op} 2" ! 722: echo " ${scale_name} the image, the coordinates in the destination image" ! 723: echo " are always the coordinates in the source image${scale_math}: */" ! 724: echo " unsigned int dst_x, dst_y;" ! 725: fi ! 726: ! 727: echo "" ! 728: echo " /* declare pixel. this holds a single pixel value being translated" ! 729: echo " for the destination image: */" ! 730: echo " tme_uint32_t pixel;" ! 731: ! 732: if test $scale = _h_ && test $src_depth != 1; then ! 733: echo "" ! 734: echo " /* since this function halves the source image, and this" ! 735: echo " image isn't grayscale, we need to read all pixels in the" ! 736: echo " 2x2 square in the source image into separate variables" ! 737: echo " and then make a decision about how to map those four" ! 738: echo " pixels into one color value for the destination pixel." ! 739: echo " the above \"pixel\" will hold one of the four pixels," ! 740: echo " and these three variables will hold the others: */" ! 741: echo " tme_uint32_t src_pixel1, src_pixel2, src_pixel3;" ! 742: fi ! 743: ! 744: echo "" ! 745: echo " /* declare src_width and dst_width. these are in terms of pixels: */" ! 746: value="(src_width${scale_math})" ! 747: if test ${width} = 0; then ! 748: echo " const unsigned int src_width = src->tme_fb_connection_width;" ! 749: if test $scale != _; then ! 750: echo " const unsigned int dst_width = ${value};" ! 751: else ! 752: echo "#define dst_width ${value}" ! 753: undef_macros="${undef_macros} dst_width" ! 754: fi ! 755: else ! 756: echo "#define src_width (${width})" ! 757: echo "#define dst_width ${value}" ! 758: undef_macros="${undef_macros} src_width dst_width" ! 759: fi ! 760: ! 761: echo "" ! 762: echo " /* declare src_depth, the source pixel depth, which is in" ! 763: echo " terms of bits. declare src_mask, which is the corresponding" ! 764: echo " mask of one bits: */" ! 765: value="(0xffffffff >> (32 - src_depth))" ! 766: if test ${src_depth} = 0; then ! 767: echo " const unsigned int src_depth = src->tme_fb_connection_depth;" ! 768: echo " const tme_uint32_t src_mask = ${value};" ! 769: else ! 770: echo "#define src_depth (${src_depth})" ! 771: echo "#define src_mask ${value}" ! 772: undef_macros="${undef_macros} src_depth src_mask" ! 773: fi ! 774: ! 775: echo "" ! 776: echo " /* declare src_bipp and dst_bipp. these are the bits-per-pixel" ! 777: echo " values for the source and destination images: */" ! 778: if test ${src_bipp} = 0; then ! 779: echo " const unsigned int src_bipp = src->tme_fb_connection_bits_per_pixel;" ! 780: else ! 781: echo "#define src_bipp (${src_bipp})" ! 782: undef_macros="${undef_macros} src_bipp" ! 783: fi ! 784: if test ${dst_bipp} = 0; then ! 785: echo " const unsigned int dst_bipp = dst->tme_fb_connection_bits_per_pixel;" ! 786: else ! 787: echo "#define dst_bipp (${dst_bipp})" ! 788: undef_macros="${undef_macros} dst_bipp" ! 789: fi ! 790: ! 791: echo "" ! 792: echo " /* declare src_skipx and dst_skipx. these are the counts of" ! 793: echo " undisplayed pixels at the beginning of each scanline in the" ! 794: echo " source and destination images: */" ! 795: if test ${src_skipx} = _; then ! 796: echo " const unsigned int src_skipx = src->tme_fb_connection_skipx;" ! 797: else ! 798: echo "#define src_skipx (${src_skipx})" ! 799: undef_macros="${undef_macros} src_skipx" ! 800: fi ! 801: if test ${dst_skipx} = _; then ! 802: echo " const unsigned int dst_skipx = dst->tme_fb_connection_skipx;" ! 803: else ! 804: echo "#define dst_skipx (${dst_skipx})" ! 805: undef_macros="${undef_macros} dst_skipx" ! 806: fi ! 807: ! 808: echo "" ! 809: echo " /* declare src_pad and dst_pad. these are the paddings, in bits," ! 810: echo " of each scanline in the source and destination images: */" ! 811: if test ${src_pad} = 0; then ! 812: echo " const unsigned int src_pad = src->tme_fb_connection_scanline_pad;" ! 813: else ! 814: echo "#define src_pad (${src_pad})" ! 815: undef_macros="${undef_macros} src_pad" ! 816: fi ! 817: if test ${dst_pad} = 0; then ! 818: echo " const unsigned int dst_pad = dst->tme_fb_connection_scanline_pad;" ! 819: else ! 820: echo "#define dst_pad (${dst_pad})" ! 821: undef_macros="${undef_macros} dst_pad" ! 822: fi ! 823: ! 824: echo "" ! 825: echo " /* declare src_order and dst_order. these are the bit and byte" ! 826: echo " orders (either TME_ENDIAN_BIG or TME_ENDIAN_LITTLE) of the" ! 827: echo " source and destination images. since these values profoundly" ! 828: echo " affect optimization, they are always constant: */" ! 829: if test ${src_order} = m; then value=BIG; else value=LITTLE; fi ! 830: echo "#define src_order (TME_ENDIAN_${value})" ! 831: undef_macros="${undef_macros} src_order" ! 832: if test ${dst_order} = m; then value=BIG; else value=LITTLE; fi ! 833: echo "#define dst_order (TME_ENDIAN_${value})" ! 834: undef_macros="${undef_macros} dst_order" ! 835: ! 836: echo "" ! 837: echo " /* declare src_bypl and dst_bypl. these are the bytes per scanline" ! 838: echo " in the source and destination images. these values are calculated" ! 839: echo " from the count of undisplayed and displayed pixels per scanline," ! 840: echo " the number of bits per pixel, and the scanline padding: */" ! 841: value="(((((src_skipx + src_width) * src_bipp) + (src_pad - 1)) & -src_pad) / 8)" ! 842: if test ${src_skipx} = _ || test ${width} = 0 || test ${src_bipp} = 0 || test ${src_pad} = 0; then ! 843: echo " const unsigned int src_bypl = ${value};" ! 844: src_bypl_var=true ! 845: else ! 846: echo "#define src_bypl ${value}" ! 847: undef_macros="${undef_macros} src_bypl" ! 848: src_bypl_var=false ! 849: fi ! 850: value="(((((dst_skipx + dst_width) * dst_bipp) + (dst_pad - 1)) & -dst_pad) / 8)" ! 851: if test ${dst_skipx} = _ || test ${width} = 0 || test ${dst_bipp} = 0 || test ${dst_pad} = 0; then ! 852: echo " const unsigned int dst_bypl = ${value};" ! 853: dst_bypl_var=true ! 854: else ! 855: echo "#define dst_bypl ${value}" ! 856: undef_macros="${undef_macros} dst_bypl" ! 857: dst_bypl_var=false ! 858: fi ! 859: ! 860: echo "" ! 861: echo " /* declare src_packed and dst_packed. these are nonzero iff" ! 862: echo " every last bit in a scanline belongs to a displayed pixel." ! 863: echo " put another way, this is zero iff a scanline has undisplayed" ! 864: echo " pixels at its beginning or padding bits at its end. when" ! 865: echo " a source image or destination image is packed, translation" ! 866: echo " doesn't have to worry about skipping FIFO bits to get to" ! 867: echo " bits belonging to displayed pixels: */" ! 868: value="((src_width * src_bipp) == (src_bypl * 8))" ! 869: if $src_bypl_var; then ! 870: echo " const unsigned int src_packed = ${value};" ! 871: else ! 872: echo "#define src_packed ${value}" ! 873: undef_macros="${undef_macros} src_packed" ! 874: fi ! 875: value="((dst_width * dst_bipp) == (dst_bypl * 8))" ! 876: if $dst_bypl_var; then ! 877: echo " const unsigned int dst_packed = ${value};" ! 878: else ! 879: echo "#define dst_packed ${value}" ! 880: undef_macros="${undef_macros} dst_packed" ! 881: fi ! 882: ! 883: echo "" ! 884: echo " /* declare src_bypb and src_bypb_real. src_bypb is the bytes" ! 885: echo " per source image buffer with the \"translation termination" ! 886: echo " overhead\" of approximately two extra scanlines. src_bypb_real" ! 887: echo " is the real bytes per source image buffer with no overhead." ! 888: echo " both values are padded to a multiple of 4 bytes (32 bits): */" ! 889: if test ${height} = 0; then ! 890: value="src->tme_fb_connection_height" ! 891: else ! 892: value="${height}" ! 893: fi ! 894: value_real="(((${value} * src_bypl) + 3) & -4)" ! 895: value="((src_bypb_real + (src_bypl * 2)) & -4)" ! 896: if test ${height} = 0 || $src_bypl_var; then ! 897: echo " const unsigned int src_bypb_real = ${value_real};" ! 898: echo " const unsigned int src_bypb = ${value};" ! 899: else ! 900: echo "#define src_bypb_real ${value_real}" ! 901: echo "#define src_bypb ${value}" ! 902: undef_macros="${undef_macros} src_bypb_real src_bypb" ! 903: fi ! 904: ! 905: echo "" ! 906: echo " /* declare the source primary bit FIFO:" ! 907: echo "" ! 908: echo " src_raw0 points to the next aligned 32-bit word to be" ! 909: echo " read from the image buffer." ! 910: echo "" ! 911: echo " src_fifo0 is the visible part of the bit FIFO." ! 912: echo "" ! 913: echo " src_fifo0_next and src_fifo0_bits are only used when the" ! 914: echo " visible part of the bit FIFO is not guaranteed to always" ! 915: echo " correspond to an aligned 32-bit word in the image buffer." ! 916: echo " src_fifo0_next is the invisible part of the bit FIFO," ! 917: echo " and src_fifo0_bits tracks the total number of bits in the" ! 918: echo " visible and invisible parts of the FIFO. */" ! 919: echo " const tme_uint32_t *src_raw0;" ! 920: echo " tme_uint32_t src_fifo0, src_fifo0_next;" ! 921: echo " unsigned int src_fifo0_bits;" ! 922: ! 923: if test ${scale} = _h_; then ! 924: echo "" ! 925: echo " /* since this function ${scale_name} the image, declare the" ! 926: echo " source secondary bit FIFO. these variables work in " ! 927: echo " exactly the same way that their primary counterparts do: */" ! 928: echo " const tme_uint32_t *src_raw1;" ! 929: echo " tme_uint32_t src_fifo1, src_fifo1_next;" ! 930: echo " unsigned int src_fifo1_bits;" ! 931: fi ! 932: ! 933: echo "" ! 934: echo " /* declare the destination primary bit FIFO:" ! 935: echo "" ! 936: echo " dst_raw0 points to the next aligned 32-bit word to be" ! 937: echo " written into the image buffer." ! 938: echo "" ! 939: echo " dst_fifo0 is the visible part of the bit FIFO." ! 940: echo "" ! 941: echo " dst_fifo0_next and dst_fifo0_bits are only used when the" ! 942: echo " visible part of the bit FIFO is not guaranteed to always" ! 943: echo " correspond to an aligned 32-bit word in the image buffer." ! 944: echo " dst_fifo0_next is the invisible part of the bit FIFO," ! 945: echo " and dst_fifo0_bits tracks the total number of bits in the" ! 946: echo " invisible part of the FIFO. */" ! 947: echo " tme_uint32_t *dst_raw0;" ! 948: echo " tme_uint32_t dst_fifo0, dst_fifo0_next;" ! 949: echo " unsigned int dst_fifo0_bits;" ! 950: ! 951: if test ${scale} = _d_; then ! 952: echo "" ! 953: echo " /* since this function ${scale_name} the image, declare" ! 954: echo " the destination secondary bit FIFO. these variables work" ! 955: echo " in exactly the same way that their primary counterparts" ! 956: echo " do: */" ! 957: echo " tme_uint32_t *dst_raw1;" ! 958: echo " tme_uint32_t dst_fifo1, dst_fifo1_next;" ! 959: echo " unsigned int dst_fifo1_bits;" ! 960: fi ! 961: ! 962: echo "" ! 963: echo " /* declare src_off and dst_off. these are used when priming a" ! 964: echo " source or destination bit FIFO, to identify an initial aligned" ! 965: echo " 32-bit word in the source or destination image buffer, and an" ! 966: echo " initial bit offset within that word: */" ! 967: echo " unsigned int src_off, dst_off;" ! 968: ! 969: echo "" ! 970: echo " /* declare src_fifo0_may_be_unaligned. this is zero iff all" ! 971: echo " aligned 32-bit words in the source buffer contain a whole" ! 972: echo " number of displayed pixels. this is *not* so if the source" ! 973: echo " buffer is not packed, or if there are 24 bits per pixel -" ! 974: echo " in this last case, it is possible for a pixel value to cross" ! 975: echo " a 32-bit boundary: */" ! 976: value="(!src_packed || (src_bipp == 24))" ! 977: if $src_bypl_var; then ! 978: echo " const unsigned int src_fifo0_may_be_unaligned = ${value};" ! 979: else ! 980: echo "#define src_fifo0_may_be_unaligned ${value}" ! 981: undef_macros="${undef_macros} src_fifo0_may_be_unaligned" ! 982: fi ! 983: ! 984: if test $scale = _h_; then ! 985: echo "" ! 986: echo " /* declare src_fifo1_may_be_unaligned. this is zero iff all" ! 987: echo " aligned 32-bit words in the source buffer contain a" ! 988: echo " whole number of displayed pixels, *and* for every aligned" ! 989: echo " 32-bit word on one scanline all other scanlines have an" ! 990: echo " aligned 32-bit word corresponding to the same x coordinate: */" ! 991: value="(src_fifo0_may_be_unaligned || (src_bypl & 3))" ! 992: if $src_bypl_var; then ! 993: echo " const unsigned int src_fifo1_may_be_unaligned = ${value};" ! 994: else ! 995: echo "#define src_fifo1_may_be_unaligned ${value}" ! 996: undef_macros="${undef_macros} src_fifo1_may_be_unaligned" ! 997: fi ! 998: fi ! 999: ! 1000: echo "" ! 1001: echo " /* declare dst_fifo0_may_be_unaligned. this is zero iff" ! 1002: echo " src_fifo0_may_be_unaligned is zero, dst_bypl is 32-bit aligned" ! 1003: echo " and we can guarantee that any initial dst_x will correspond to" ! 1004: echo " an aligned 32-bit word in the destination buffer. the motivation" ! 1005: echo " is to only prime and shift the destination primary bit FIFO if" ! 1006: echo " absolutely necessary." ! 1007: echo "" ! 1008: echo " since we require that src_fifo0_may_be_unaligned is zero, we" ! 1009: echo " know that the initial src_x = (Z * 32) / src_bipp for " ! 1010: echo " some Z. we also have the initial dst_x = src_x${scale_math}." ! 1011: echo " the initial destination bit offset will then be:" ! 1012: echo "" ! 1013: echo " (dst_skipx + dst_x) * dst_bipp" ! 1014: echo " = (dst_skipx * dst_bipp) + (dst_x * dst_bipp)" ! 1015: echo "" ! 1016: echo " if we additionally require that (dst_skipx * dst_bipp)" ! 1017: echo " be 32-bit aligned, this reduces things to:" ! 1018: echo "" ! 1019: echo " dst_x * dst_bipp" ! 1020: echo " = (src_x${scale_math}) * dst_bipp" ! 1021: echo " = (((Z * 32) / src_bipp)${scale_math}) * dst_bipp" ! 1022: echo "" ! 1023: echo " which will be a multiple of 32 iff:" ! 1024: echo "" ! 1025: echo " ((1 / src_bipp)${scale_math}) * dst_bipp >= 1 and integral" ! 1026: echo " */" ! 1027: denom="src_bipp" ! 1028: numer="dst_bipp" ! 1029: case $scale in ! 1030: _) ;; ! 1031: _h_) denom="(${denom} * 2)" ;; ! 1032: _d_) numer="(${numer} * 2)" ;; ! 1033: esac ! 1034: value="(src_fifo0_may_be_unaligned || !dst_packed || (dst_bipp == 24) || (dst_bypl % 4) || ((dst_skipx * dst_bipp) % 32) || (${numer} % ${denom}))" ! 1035: if $src_bypl_var || $dst_bypl_var; then ! 1036: echo " const unsigned int dst_fifo0_may_be_unaligned = ${value};" ! 1037: else ! 1038: echo "#define dst_fifo0_may_be_unaligned ${value}" ! 1039: undef_macros="${undef_macros} dst_fifo0_may_be_unaligned" ! 1040: fi ! 1041: ! 1042: if test $scale = _d_; then ! 1043: echo "" ! 1044: echo " /* declare dst_fifo1_may_be_unaligned. this is zero iff all" ! 1045: echo " 32-bit aligned values in the destination buffer contain a" ! 1046: echo " whole number of displayed pixels, and for every 32-bit" ! 1047: echo " aligned value on one scanline all other scanlines have a" ! 1048: echo " 32-bit aligned value corresponding to the same x coordinate: */" ! 1049: value="(dst_fifo0_may_be_unaligned || (dst_bypl & 3))" ! 1050: if $src_bypl_var || $dst_bypl_var; then ! 1051: echo " const unsigned int dst_fifo1_may_be_unaligned = ${value};" ! 1052: else ! 1053: echo "#define dst_fifo1_may_be_unaligned ${value}" ! 1054: undef_macros="${undef_macros} dst_fifo1_may_be_unaligned" ! 1055: fi ! 1056: fi ! 1057: ! 1058: echo "" ! 1059: echo " /* declare src_raw0_end. when treating the source image as" ! 1060: echo " an array of aligned 32-bit words, this variable holds the" ! 1061: echo " address of the first word after the real source image." ! 1062: echo " if the fast, aligned 32-bit word comparison loop passes" ! 1063: echo " this point, the entire source image has been processed and" ! 1064: echo " the function terminates: */" ! 1065: echo " const tme_uint32_t *src_raw0_end;" ! 1066: ! 1067: echo "" ! 1068: echo " /* declare xlat_run. see the comment for the TME_FB_XLAT_RUN" ! 1069: echo " macro for an explanation of what this variable does: */" ! 1070: echo " int xlat_run;" ! 1071: ! 1072: echo "" ! 1073: echo " /* this silences gcc -Wuninitialized: */" ! 1074: echo " src_fifo0_next = 0;" ! 1075: echo " src_fifo0_bits = 0;" ! 1076: if test ${scale} = _h_; then ! 1077: echo " src_fifo1_next = 0;" ! 1078: echo " src_fifo1_bits = 0;" ! 1079: fi ! 1080: echo " dst_fifo0_next = 0;" ! 1081: echo " dst_fifo0_bits = 0;" ! 1082: if test ${scale} = _d_; then ! 1083: echo " dst_fifo1_next = 0;" ! 1084: echo " dst_fifo1_bits = 0;" ! 1085: fi ! 1086: ! 1087: echo "" ! 1088: echo " /* initialize src_raw0 and src_raw0_end for the fast aligned 32-bit" ! 1089: echo " word comparison loop. on entry to (and when continuing) that loop," ! 1090: echo " src_raw0 always points to the aligned 32-bit word *before* the" ! 1091: echo " next word to check. src_raw0_end always points after the last" ! 1092: echo " word to check." ! 1093: echo "" ! 1094: echo " src_raw0 is actually part of the source primary bit FIFO, which" ! 1095: echo " is good, because when the fast comparison fails on a word, src_raw0" ! 1096: echo " is already primed and ready to work for that bit FIFO: */" ! 1097: echo " src_raw0 = ((const tme_uint32_t *) src->tme_fb_connection_buffer) - 1;" ! 1098: echo " src_raw0_end = (const tme_uint32_t *) (src->tme_fb_connection_buffer + src_bypb_real);" ! 1099: ! 1100: echo "" ! 1101: echo " /* initialize xlat_run to -1. it can never go negative inside the" ! 1102: echo " pixel translation loop, so if xlat_run stays negative for the" ! 1103: echo " entire translation, it means that the source image hasn't changed" ! 1104: echo " since the last translation. this information is returned to the" ! 1105: echo " caller to hopefully save more work in updating the display: */" ! 1106: echo " xlat_run = -1;" ! 1107: ! 1108: echo "" ! 1109: echo " /* this is the main translation loop, which contains the fast aligned" ! 1110: echo " 32-bit word comparison loop, and the pixel translation loop: */" ! 1111: echo " for (;;) {" ! 1112: ! 1113: echo "" ! 1114: echo " /* this is the fast aligned 32-bit word comparison loop. it" ! 1115: echo " terminates either when a word fails comparison, or when the" ! 1116: echo " entire source image has been compared. the if test that" ! 1117: echo " follows checks for the latter case and breaks the main" ! 1118: echo " translation loop: */" ! 1119: echo " for (; (++src_raw0 < src_raw0_end" ! 1120: echo " && *src_raw0 == *TME_FB_XLAT_SRC_OLD(src_raw0)); );" ! 1121: echo " if (src_raw0 >= src_raw0_end) {" ! 1122: echo " break;" ! 1123: echo " }" ! 1124: ! 1125: echo "" ! 1126: echo " /* calculate the byte offset into the source buffer of the" ! 1127: echo " 32-bit word that failed comparison: */" ! 1128: echo " src_off = ((tme_uint8_t *) src_raw0) - src->tme_fb_connection_buffer;" ! 1129: ! 1130: echo "" ! 1131: echo " /* calculate the source y pixel coordinate, and reduce" ! 1132: echo " src_off from the byte offset into the buffer to the" ! 1133: echo " byte offset into that scanline: */" ! 1134: echo " src_y = src_off / src_bypl;" ! 1135: echo " src_off = src_off % src_bypl;" ! 1136: ! 1137: echo "" ! 1138: echo " /* while translating pixels, we use one or more \"bit FIFOs\"," ! 1139: echo " each composed of one or more 32-bit integers. we load these" ! 1140: echo " FIFOs 32 bits at a time. */" ! 1141: echo "" ! 1142: echo " /* prime the visible part of the source primary bit FIFO: */" ! 1143: echo " src_fifo0 = *src_raw0;" ! 1144: echo " *TME_FB_XLAT_SRC_OLD(src_raw0) = src_fifo0;" ! 1145: echo " src_raw0++;" ! 1146: echo " src_fifo0 = ((src_order == TME_ENDIAN_BIG)" ! 1147: echo " ? tme_betoh_u32(src_fifo0)" ! 1148: echo " : tme_letoh_u32(src_fifo0));" ! 1149: echo "" ! 1150: echo " /* if the source primary bit FIFO may be unaligned: */" ! 1151: echo " if (src_fifo0_may_be_unaligned) {" ! 1152: echo "" ! 1153: echo " /* prime the invisible part of the source primary bit FIFO and" ! 1154: echo " assume that we will not have to shift it to finish: */" ! 1155: echo " src_fifo0_next = *src_raw0;" ! 1156: echo " *TME_FB_XLAT_SRC_OLD(src_raw0) = src_fifo0_next;" ! 1157: echo " src_raw0++;" ! 1158: echo " src_fifo0_next = ((src_order == TME_ENDIAN_BIG)" ! 1159: echo " ? tme_betoh_u32(src_fifo0_next)" ! 1160: echo " : tme_letoh_u32(src_fifo0_next));" ! 1161: echo " src_fifo0_bits = 0;" ! 1162: echo "" ! 1163: echo " /* if there are pixels that need to be skipped, the first 32 bits" ! 1164: echo " we loaded into the FIFO may have first bits that belong to" ! 1165: echo " those undisplayed (skipped) pixels. it is *not* possible for" ! 1166: echo " it to have first bits that belong to the scanline pad; there" ! 1167: echo " might be pad bits in the *middle* of the first 32 bits, but any" ! 1168: echo " first bits *must* belong to pixels, displayed or not: */" ! 1169: echo " if (src_skipx > 0" ! 1170: echo " && (src_off * 8) < (src_skipx * src_bipp)) {" ! 1171: echo "" ! 1172: echo " /* see how many bits we will need to skip: */" ! 1173: echo " src_fifo0_bits = (src_skipx * src_bipp) - (src_off * 8);" ! 1174: echo "" ! 1175: echo " /* if it is more than 31 bits, this is an entire 32 bits of" ! 1176: echo " undisplayed pixels. just advance: */" ! 1177: echo " if (src_fifo0_bits > 31) {" ! 1178: echo " src_raw0--;" ! 1179: echo " continue;" ! 1180: echo " }" ! 1181: echo "" ! 1182: echo " /* set the source x coordinate to zero: */" ! 1183: echo " src_x = 0;" ! 1184: echo " }" ! 1185: echo "" ! 1186: echo " /* otherwise, the first 32 bits we load will have first bits for" ! 1187: echo " a displayable pixel: */" ! 1188: echo " else {" ! 1189: echo "" ! 1190: echo " /* if the source bits per pixel is 24, calculate the number of" ! 1191: echo " bytes *before* the original src_raw0 of any split pixel, and" ! 1192: echo " subtract this from src_off, to leave src_off as the byte offset" ! 1193: echo " into the scanline of the beginning of a pixel: */" ! 1194: echo " if (src_bipp == 24) {" ! 1195: echo " src_fifo0_bits = (src_off % 3);" ! 1196: echo " src_off -= src_fifo0_bits;" ! 1197: echo "" ! 1198: echo " /* if this is a split pixel, we need to prime the source primary" ! 1199: echo " bit FIFO starting with the part *before* the original src_raw0." ! 1200: echo " we do not have to copy to the old; it passed comparison: */" ! 1201: echo " if (src_fifo0_bits) {" ! 1202: echo " src_raw0--;" ! 1203: echo " src_fifo0_next = src_fifo0;" ! 1204: echo " src_fifo0 = ((src_order == TME_ENDIAN_BIG)" ! 1205: echo " ? tme_betoh_u32(*(src_raw0 - 2))" ! 1206: echo " : tme_letoh_u32(*(src_raw0 - 2)));" ! 1207: echo " }" ! 1208: echo " }" ! 1209: echo "" ! 1210: echo " /* calculate the source x coordinate: */" ! 1211: echo " src_x = ((src_off * 8) / src_bipp) - src_skipx;" ! 1212: echo " }" ! 1213: echo "" ! 1214: echo " /* do any shifting to finish priming the source primary FIFO: */" ! 1215: echo " if (src_fifo0_bits) {" ! 1216: echo " if (src_order == TME_ENDIAN_BIG) {" ! 1217: echo " src_fifo0 = (src_fifo0 << src_fifo0_bits) | (src_fifo0_next >> (32 - src_fifo0_bits));" ! 1218: echo " src_fifo0_next <<= src_fifo0_bits;" ! 1219: echo " }" ! 1220: echo " else {" ! 1221: echo " src_fifo0 = (src_fifo0 >> src_fifo0_bits) | (src_fifo0_next << (32 - src_fifo0_bits));" ! 1222: echo " src_fifo0_next >>= src_fifo0_bits;" ! 1223: echo " }" ! 1224: echo " }" ! 1225: echo " src_fifo0_bits = 64 - src_fifo0_bits;" ! 1226: echo " }" ! 1227: echo "" ! 1228: echo " /* otherwise, the source primary FIFO is aligned: */" ! 1229: echo " else {" ! 1230: echo " src_x = ((src_off * 8) / src_bipp) - src_skipx;" ! 1231: echo " }" ! 1232: ! 1233: if test $scale = _h_; then ! 1234: echo "" ! 1235: echo " /* when halving the image, we have a source secondary bit " ! 1236: echo " FIFO, providing pixel values at the same source x coordinate" ! 1237: echo " but on the \"other\" line. prime the source secondary" ! 1238: echo " bit FIFO: */" ! 1239: echo " if (src_fifo1_may_be_unaligned) {" ! 1240: echo "" ! 1241: echo " /* calculate the bit offset into the source buffer of" ! 1242: echo " this exact same pixel on the other line: */" ! 1243: echo " src_off = ((src_y ^ 1) * src_bypl * 8) + ((src_skipx + src_x) * src_bipp);" ! 1244: echo "" ! 1245: echo " /* calculate how many bits offset from a 32-bit boundary the pixel is: */" ! 1246: echo " src_fifo1_bits = src_off % 32;" ! 1247: echo "" ! 1248: echo " /* set src_raw1: */" ! 1249: echo " src_raw1 = (const tme_uint32_t *)" ! 1250: echo " (src->tme_fb_connection_buffer" ! 1251: echo " + ((src_off - src_fifo1_bits) / 8));" ! 1252: echo "" ! 1253: echo " /* actually prime the FIFO by loading the first two words and" ! 1254: echo " shifting off any offset bits: */" ! 1255: echo " src_fifo1 = *src_raw1;" ! 1256: echo " *TME_FB_XLAT_SRC_OLD(src_raw1) = src_fifo1;" ! 1257: echo " src_raw1++;" ! 1258: echo " src_fifo1_next = *src_raw1;" ! 1259: echo " *TME_FB_XLAT_SRC_OLD(src_raw1) = src_fifo1_next;" ! 1260: echo " src_raw1++;" ! 1261: echo " if (src_order == TME_ENDIAN_BIG) {" ! 1262: echo " src_fifo1 = tme_betoh_u32(src_fifo1);" ! 1263: echo " src_fifo1_next = tme_betoh_u32(src_fifo1_next);" ! 1264: echo " if (src_fifo1_bits) {" ! 1265: echo " src_fifo1 = (src_fifo1 << src_fifo1_bits) | (src_fifo1_next >> (32 - src_fifo1_bits));" ! 1266: echo " src_fifo1_next <<= src_fifo1_bits;" ! 1267: echo " }" ! 1268: echo " }" ! 1269: echo " else {" ! 1270: echo " src_fifo1 = tme_letoh_u32(src_fifo1);" ! 1271: echo " src_fifo1_next = tme_letoh_u32(src_fifo1_next);" ! 1272: echo " if (src_fifo1_bits) {" ! 1273: echo " src_fifo1 = (src_fifo1 >> src_fifo1_bits) | (src_fifo1_next << (32 - src_fifo1_bits));" ! 1274: echo " src_fifo1_next >>= src_fifo1_bits;" ! 1275: echo " }" ! 1276: echo " }" ! 1277: echo " src_fifo1_bits = 64 - src_fifo1_bits;" ! 1278: echo " }" ! 1279: echo "" ! 1280: echo " /* otherwise the source secondary FIFO is aligned: */" ! 1281: echo " else {" ! 1282: echo " src_raw1 = (const tme_uint32_t *)" ! 1283: echo " (((tme_uint8_t *) src_raw0)" ! 1284: echo " + ((" ! 1285: echo " /* if src_y is even, this addend is now src_bypl * 4," ! 1286: echo " else if src_y is odd, this addend is now src_bypl * 2: */" ! 1287: echo " ((src_bypl * 4) >> (src_y & 1))" ! 1288: echo " /* if src_y is even, this addend is now src_bypl," ! 1289: echo " else if src_y is odd, this addend is now -src_bypl: */" ! 1290: echo " - (src_bypl * 3))" ! 1291: echo " /* this -4 compensates for src_raw0 already having" ! 1292: echo " been advanced by one: */" ! 1293: echo " - 4));" ! 1294: echo " src_fifo1 = *src_raw1;" ! 1295: echo " *TME_FB_XLAT_SRC_OLD(src_raw1) = src_fifo1;" ! 1296: echo " src_raw1++;" ! 1297: echo " src_fifo1 = ((src_order == TME_ENDIAN_BIG)" ! 1298: echo " ? tme_betoh_u32(src_fifo1)" ! 1299: echo " : tme_letoh_u32(src_fifo1));" ! 1300: echo " }" ! 1301: fi ! 1302: ! 1303: if test $scale != _; then ! 1304: echo "" ! 1305: echo " /* calculate the destination coordinates: */" ! 1306: echo " dst_y = src_y${scale_math};" ! 1307: echo " dst_x = src_x${scale_math};" ! 1308: fi ! 1309: ! 1310: echo "" ! 1311: echo " /* prime the destination primary bit FIFO: */" ! 1312: echo " dst_fifo0 = 0;" ! 1313: echo " if (dst_fifo0_may_be_unaligned) {" ! 1314: echo "" ! 1315: echo " /* calculate the bit offset into the destination buffer of" ! 1316: echo " the destination pixel: */" ! 1317: echo " dst_off = (dst_y * dst_bypl * 8) + ((dst_skipx + dst_x) * dst_bipp);" ! 1318: echo "" ! 1319: echo " /* calculate the number of bits that will be in the primed FIFO: */" ! 1320: echo " dst_fifo0_bits = dst_off % 32;" ! 1321: echo "" ! 1322: echo " /* set dst_raw0: */" ! 1323: echo " dst_raw0 = (tme_uint32_t *)" ! 1324: echo " (dst->tme_fb_connection_buffer" ! 1325: echo " + ((dst_off - dst_fifo0_bits) / 8));" ! 1326: echo "" ! 1327: echo " /* prime the primary destination FIFO: */" ! 1328: echo " dst_fifo0_next = 0;" ! 1329: echo " if (dst_fifo0_bits) {" ! 1330: echo " dst_fifo0_next = (src_order == TME_ENDIAN_BIG" ! 1331: echo " ? (tme_betoh_u32(*dst_raw0) & (0xffffffffUL << (32 - dst_fifo0_bits)))" ! 1332: echo " : (tme_letoh_u32(*dst_raw0) & (0xffffffffUL >> (32 - dst_fifo0_bits))));" ! 1333: echo " }" ! 1334: echo " }" ! 1335: echo "" ! 1336: echo " /* otherwise the destination primary FIFO is aligned: */" ! 1337: echo " else {" ! 1338: echo " dst_off = (dst_y * dst_bypl) + (((dst_skipx + dst_x) * dst_bipp) / 8);" ! 1339: echo " dst_raw0 = (tme_uint32_t *) (dst->tme_fb_connection_buffer + dst_off);" ! 1340: echo " }" ! 1341: ! 1342: if test $scale = _d_; then ! 1343: echo "" ! 1344: echo " /* when doubling the image, we have a destination secondary bit " ! 1345: echo " FIFO, for pixel values at the same source x coordinate" ! 1346: echo " but on the \"other\" line. prime the destination secondary" ! 1347: echo " bit FIFO: */" ! 1348: echo " dst_fifo1 = 0;" ! 1349: echo " if (dst_fifo1_may_be_unaligned) {" ! 1350: echo "" ! 1351: echo " /* calculate the bit offset into the destination buffer of" ! 1352: echo " the destination pixel: */" ! 1353: echo " dst_off = ((dst_y + 1) * dst_bypl * 8) + ((dst_skipx + dst_x) * dst_bipp);" ! 1354: echo "" ! 1355: echo " /* calculate the number of bits that will be in the primed FIFO: */" ! 1356: echo " dst_fifo1_bits = dst_off % 32;" ! 1357: echo "" ! 1358: echo " /* set dst_raw1: */" ! 1359: echo " dst_raw1 = (tme_uint32_t *)" ! 1360: echo " (dst->tme_fb_connection_buffer" ! 1361: echo " + ((dst_off - dst_fifo1_bits) / 8));" ! 1362: echo "" ! 1363: echo " /* prime the primary destination FIFO: */" ! 1364: echo " dst_fifo1_next = 0;" ! 1365: echo " if (dst_fifo1_bits) {" ! 1366: echo " dst_fifo1_next = (src_order == TME_ENDIAN_BIG" ! 1367: echo " ? (tme_betoh_u32(*dst_raw1) & (0xffffffffUL << (32 - dst_fifo1_bits)))" ! 1368: echo " : (tme_letoh_u32(*dst_raw1) & (0xffffffffUL >> (32 - dst_fifo1_bits))));" ! 1369: echo " }" ! 1370: echo " }" ! 1371: echo "" ! 1372: echo " /* otherwise, the destination secondary FIFO is aligned: */" ! 1373: echo " else {" ! 1374: echo " dst_raw1 = (tme_uint32_t *)" ! 1375: echo " (((tme_uint8_t *) dst_raw0)" ! 1376: echo " + dst_bypl);" ! 1377: echo " }" ! 1378: fi ! 1379: ! 1380: # we want to unroll the pixel translation loop to read as many ! 1381: # source pixels as possible out of the source bit FIFOs and ! 1382: # write as many destination pixels as possible into the ! 1383: # destination bit FIFOs before shifting them. ! 1384: # ! 1385: # it is very common to want to unroll the translation loop a ! 1386: # different number of times on source and destination pixels, ! 1387: # so we always unroll the maximum possible, tracking within ! 1388: # each unrolled iteration the relative unrolled iteration for ! 1389: # the source and destination bit FIFOs. ! 1390: # ! 1391: ! 1392: # src_unroll and dst_unroll are the number of times we will ! 1393: # unroll the translation loop on source and destination ! 1394: # pixels, respectively. assume no unrolling: ! 1395: # ! 1396: src_unroll=1 ! 1397: dst_unroll=1 ! 1398: ! 1399: # src_iter_scale is the number of source pixels read out of a ! 1400: # source bit FIFO in one unrolled iteration of the translation ! 1401: # loop. if this function halves the source image, this is ! 1402: # two, otherwise this is one. ! 1403: # ! 1404: # dst_iter_scale is the number of destination pixels written ! 1405: # to a destination bit FIFO in one unrolled iteration of the ! 1406: # translation loop. if this function doubles the source ! 1407: # image, this is two, otherwise this is one. ! 1408: # ! 1409: # src_fifo_shift is the number of bits that the source bit ! 1410: # FIFO(s) must be shifted after all unrolled iterations on ! 1411: # source pixels. assume no unrolling, so if this function ! 1412: # halves the source image and src_bipp is less than 24, two ! 1413: # pixels' bits must be shifted, otherwise one pixel's bits ! 1414: # must be shifted. ! 1415: # ! 1416: # dst_fifo_shift is the number of bits that the destination bit ! 1417: # FIFO(s) must be shifted after all unrolled iterations on ! 1418: # destination pixels. we are assuming no unrolling, so if this ! 1419: # function doubles the source image and dst_bipp is less than ! 1420: # 24, two pixels' bits must be shifted, otherwise one pixel's ! 1421: # bits must be shifted: ! 1422: # ! 1423: if test $scale = _h_; then ! 1424: src_iter_scale=2 ! 1425: src_fifo_shift="(src_bipp < 24 ? (src_bipp * 2) : src_bipp)" ! 1426: else ! 1427: src_iter_scale=1 ! 1428: src_fifo_shift="src_bipp" ! 1429: fi ! 1430: if test $scale = _d_; then ! 1431: dst_iter_scale=2 ! 1432: dst_fifo_shift="(dst_bipp < 24 ? (dst_bipp * 2) : dst_bipp)" ! 1433: else ! 1434: dst_iter_scale=1 ! 1435: dst_fifo_shift="dst_bipp" ! 1436: fi ! 1437: ! 1438: # if src_bipp is known now, see how many times we can unroll the ! 1439: # translation loop on source pixels: ! 1440: # ! 1441: if test ${src_bipp} != 0; then ! 1442: ! 1443: # in general, we can unroll once for each pixel in the ! 1444: # visible part of a source bit FIFO: ! 1445: # ! 1446: src_unroll=`expr 32 / ${src_bipp}` ! 1447: ! 1448: # if this function halves the source image, we can unroll ! 1449: # half as many times: ! 1450: # ! 1451: src_unroll=`expr ${src_unroll} / ${src_iter_scale}` ! 1452: ! 1453: # if we think we can unroll zero times, this means that ! 1454: # src_bipp is greater than 16 and this function halves the ! 1455: # source image - the zero is telling us that two whole ! 1456: # pixels cannot fit in the visible part of a source bit ! 1457: # FIFO. so we unroll once on source pixels, and shift ! 1458: # only one pixel's bits after the unrolling (the halving ! 1459: # code will be shifting one pixel's worth of bits to get ! 1460: # to the next pixel it has to read): ! 1461: # ! 1462: if test ${src_unroll} = 0; then ! 1463: src_unroll=1 ! 1464: src_fifo_shift=${src_bipp} ! 1465: ! 1466: # otherwise, we will be shifting the entire visible part ! 1467: # of the source bit FIFO(s) after all unrolled iterations: ! 1468: # ! 1469: else ! 1470: src_fifo_shift=32 ! 1471: fi ! 1472: ! 1473: echo "" ! 1474: echo " /* since src_bipp is known at code-generation time, the" ! 1475: echo " pixel translation loop is unrolled to translate all" ! 1476: echo " source pixels in the 32-bit visible part of the source" ! 1477: echo " bit FIFO(s) before shifting." ! 1478: echo "" ! 1479: echo " in this case, src_bipp is known to be ${src_bipp}, so "`expr ${src_unroll} \* ${src_iter_scale}`" pixels will" ! 1480: echo " be read out of the source bit FIFO(s) before shifting, and" ! 1481: echo " when the source bit FIFO(s) are shifted, they are shifted" ! 1482: echo " ${src_fifo_shift} bits at a time: */" ! 1483: fi ! 1484: ! 1485: # if dst_bipp is known now, see how many times we can unroll the ! 1486: # translation loop on destination pixels: ! 1487: # ! 1488: if test ${dst_bipp} != 0; then ! 1489: ! 1490: # in general, we can unroll once for each pixel in the ! 1491: # visible part of a destination bit FIFO: ! 1492: # ! 1493: dst_unroll=`expr 32 / ${dst_bipp}` ! 1494: ! 1495: # if this function doubles the source image, we can unroll ! 1496: # half as many times: ! 1497: # ! 1498: dst_unroll=`expr ${dst_unroll} / ${dst_iter_scale}` ! 1499: ! 1500: # if we think we can unroll zero times, this means that ! 1501: # dst_bipp is greater than 16 and this function doubles the ! 1502: # source image - the zero is telling us that two whole ! 1503: # pixels cannot fit in the visible part of a destination bit ! 1504: # FIFO. so we unroll once on destination pixels, and shift ! 1505: # only one pixel's bits after the unrolling (the doubling ! 1506: # code will be shifting one pixel's worth of bits to get ! 1507: # out the first pixel it has to write): ! 1508: # ! 1509: if test ${dst_unroll} = 0; then ! 1510: dst_unroll=1 ! 1511: dst_fifo_shift=${dst_bipp} ! 1512: ! 1513: # otherwise, we will be shifting the entire visible part ! 1514: # of the source bit FIFO(s) after all unrolled iterations: ! 1515: # ! 1516: else ! 1517: dst_fifo_shift=32 ! 1518: fi ! 1519: ! 1520: echo "" ! 1521: echo " /* since dst_bipp is known at code-generation time, the pixel" ! 1522: echo " translation loop is unrolled to translate all destination" ! 1523: echo " pixels in the 32-bit visible part of the destination bit" ! 1524: echo " FIFO(s) before shifting." ! 1525: echo "" ! 1526: echo " in this case, dst_bipp is known to be ${dst_bipp}, so "`expr ${dst_unroll} \* ${dst_iter_scale}`" pixels will" ! 1527: echo " be written into the destination bit FIFO(s) before shifting," ! 1528: echo " and when the destination bit FIFO(s) are shifted, they are" ! 1529: echo " shifted ${dst_fifo_shift} bits at a time: */" ! 1530: fi ! 1531: ! 1532: # unroll the translation loop the maximum number amount of times: ! 1533: # ! 1534: if test `expr ${src_unroll} \> ${dst_unroll}` = 1; then ! 1535: unroll=${src_unroll} ! 1536: else ! 1537: unroll=${dst_unroll} ! 1538: fi ! 1539: ! 1540: echo "" ! 1541: echo " /* src_unroll = ${src_unroll}, src_iter_scale = ${src_iter_scale}" ! 1542: echo " dst_unroll = ${dst_unroll}, dst_iter_scale = ${dst_iter_scale} */" ! 1543: echo " for (xlat_run = TME_FB_XLAT_RUN;" ! 1544: echo " xlat_run > 0; ) {" ! 1545: iter=0 ! 1546: ! 1547: while test `expr ${iter} \< ${unroll}` = 1; do ! 1548: echo "" ! 1549: echo " /* iter #${iter} */" ! 1550: echo "" ! 1551: iter_next=`expr ${iter} + 1` ! 1552: ! 1553: # the number of bits to skip in a source FIFO to get to ! 1554: # this iteration's pixel: ! 1555: src_shift=`expr ${iter} % ${src_unroll}` ! 1556: src_shift='('`expr ${src_shift} \* ${src_iter_scale}`' * src_bipp)' ! 1557: ! 1558: echo " /* get a pixel from the source primary FIFO: */" ! 1559: echo " pixel =" ! 1560: echo " ((src_fifo0" ! 1561: echo " >> (src_order == TME_ENDIAN_BIG" ! 1562: echo " ? (32 - (src_bipp + ${src_shift}))" ! 1563: echo " : ${src_shift}))" ! 1564: echo " & src_mask);" ! 1565: ! 1566: if test $scale = _; then ! 1567: ! 1568: echo "" ! 1569: echo " /* map the pixel value from source to destination: */" ! 1570: echo " if (src_depth == 1) {" ! 1571: echo " pixel = dst->tme_fb_connection_depth1_map[pixel];" ! 1572: echo " }" ! 1573: ! 1574: elif test $scale = _h_; then ! 1575: ! 1576: echo "" ! 1577: echo " /* get a second pixel, from the source secondary FIFO: */" ! 1578: if test $src_depth != 1; then ! 1579: echo " src_pixel1 =" ! 1580: else ! 1581: echo " pixel +=" ! 1582: fi ! 1583: echo " ((src_fifo1" ! 1584: echo " >> (src_order == TME_ENDIAN_BIG" ! 1585: echo " ? (32 - (src_bipp + ${src_shift}))" ! 1586: echo " : ${src_shift}))" ! 1587: echo " & src_mask);" ! 1588: ! 1589: echo "" ! 1590: echo " /* get third and fourth pixels, from the source primary" ! 1591: echo " FIFO and source secondary FIFO, respectively. if" ! 1592: echo " src_bipp is 24 or greater, these pixels are not yet" ! 1593: echo " entirely in the first parts of the FIFOs, so we need" ! 1594: echo " to shift: */" ! 1595: echo " if (src_bipp >= 24) {" ! 1596: echo " TME_FB_XLAT_SHIFT_SRC(src_fifo0_may_be_unaligned," ! 1597: echo " src_fifo0," ! 1598: echo " src_fifo0_next," ! 1599: echo " src_fifo0_bits," ! 1600: echo " src_bipp," ! 1601: echo " src_raw0," ! 1602: echo " src_order);" ! 1603: echo " TME_FB_XLAT_SHIFT_SRC(src_fifo1_may_be_unaligned," ! 1604: echo " src_fifo1," ! 1605: echo " src_fifo1_next," ! 1606: echo " src_fifo1_bits," ! 1607: echo " src_bipp," ! 1608: echo " src_raw1," ! 1609: echo " src_order);" ! 1610: if test $src_depth != 1; then ! 1611: echo " src_pixel2 =" ! 1612: else ! 1613: echo " pixel +=" ! 1614: fi ! 1615: echo " ((src_fifo0" ! 1616: echo " >> (src_order == TME_ENDIAN_BIG" ! 1617: echo " ? (32 - (src_bipp + ${src_shift}))" ! 1618: echo " : ${src_shift}))" ! 1619: echo " & src_mask);" ! 1620: if test $src_depth != 1; then ! 1621: echo " src_pixel3 =" ! 1622: else ! 1623: echo " pixel +=" ! 1624: fi ! 1625: echo " ((src_fifo1" ! 1626: echo " >> (src_order == TME_ENDIAN_BIG" ! 1627: echo " ? (32 - (src_bipp + ${src_shift}))" ! 1628: echo " : ${src_shift}))" ! 1629: echo " & src_mask);" ! 1630: echo " }" ! 1631: echo "" ! 1632: echo " /* otherwise, src_pixel2 and src_pixel3 are already in the" ! 1633: echo " visible parts of the source bit FIFOs; we just have to" ! 1634: echo " reach over the pixels we already read to get at them: */" ! 1635: echo " else {" ! 1636: if test $src_depth != 1; then ! 1637: echo " src_pixel2 =" ! 1638: else ! 1639: echo " pixel +=" ! 1640: fi ! 1641: echo " ((src_fifo0" ! 1642: echo " >> (src_order == TME_ENDIAN_BIG" ! 1643: echo " ? (32 - (src_bipp + (${src_shift} + src_bipp)))" ! 1644: echo " : (${src_shift} + src_bipp)))" ! 1645: echo " & src_mask);" ! 1646: if test $src_depth != 1; then ! 1647: echo " src_pixel3 =" ! 1648: else ! 1649: echo " pixel +=" ! 1650: fi ! 1651: echo " ((src_fifo1" ! 1652: echo " >> (src_order == TME_ENDIAN_BIG" ! 1653: echo " ? (32 - (src_bipp + (${src_shift} + src_bipp)))" ! 1654: echo " : (${src_shift} + src_bipp)))" ! 1655: echo " & src_mask);" ! 1656: echo " }" ! 1657: ! 1658: echo "" ! 1659: echo " /* map all four src_pixels into dst_pixel." ! 1660: echo " if src_depth is one, this is simple - add all of the" ! 1661: echo " single-bit pixel values together and look up the" ! 1662: echo " destination pixel value for that intensity: */" ! 1663: if test $src_depth = 1; then ! 1664: echo " pixel = dst->tme_fb_connection_depth1_map[pixel];" ! 1665: else ! 1666: echo " if (src_depth == 1) {" ! 1667: echo " pixel = dst->tme_fb_connection_depth1_map[pixel" ! 1668: echo " + src_pixel1" ! 1669: echo " + src_pixel2" ! 1670: echo " + src_pixel3];" ! 1671: echo " }" ! 1672: echo "" ! 1673: echo " /* otherwise, this is trickier - we need to get the" ! 1674: echo " R, G, and B values for all four pixels, average" ! 1675: echo " them together, and look up the (closest) destination" ! 1676: echo " pixel value for the resulting color: */" ! 1677: echo " else {" ! 1678: echo " /* TBD: */" ! 1679: echo " abort();" ! 1680: echo " }" ! 1681: fi ! 1682: fi ! 1683: ! 1684: echo "" ! 1685: if test $scale = _h_; then ! 1686: ! 1687: echo " /* if we just read the last pixels on these" ! 1688: echo " source scanlines: */" ! 1689: if test `expr ${iter_next} % ${src_unroll}` = 0; then ! 1690: echo " if ((src_x +=" ! 1691: echo " (src_packed" ! 1692: echo " ? `expr ${src_unroll} \* 2`" ! 1693: echo " : 2))" ! 1694: echo " == src_width) {" ! 1695: else ! 1696: echo " if (!src_packed" ! 1697: echo " && (src_x += 2) == src_width) {" ! 1698: fi ! 1699: echo "" ! 1700: echo " /* we need to rapidly shift the source FIFOs" ! 1701: echo " to skip not only pad bits and undisplayed" ! 1702: echo " pixels on the next line, but actually the" ! 1703: echo " *entire* next line." ! 1704: echo "" ! 1705: echo " note that this sounds like when we're done," ! 1706: echo " the bits at the fronts of the FIFOs will be" ! 1707: echo " the *first* pixels on the next scanlines." ! 1708: echo "" ! 1709: echo " but the bits at the fronts of the FIFOs now" ! 1710: echo " are the *last* pixels on the current scanlines -" ! 1711: echo " they haven't been shifted off yet. so when" ! 1712: echo " we're done, we want one pixel's worth of bits" ! 1713: echo " in the FIFOs before the first pixel on the" ! 1714: echo " next scanlines: */" ! 1715: echo "" ! 1716: echo " /* calculate the number of bits that we need" ! 1717: echo " to shift the source primary FIFO, after" ! 1718: echo " discarding any bits in it now: */" ! 1719: echo " src_off = ((src_bypl * 8) - (src_width * src_bipp)) + (src_bypl * 8);" ! 1720: echo " src_off -= (src_fifo0_may_be_unaligned" ! 1721: echo " ? src_fifo0_bits" ! 1722: echo " : 32);" ! 1723: echo "" ! 1724: echo " /* rapidly advance src_raw0 by the number of" ! 1725: echo " whole 32-bit words. this will leave it pointing" ! 1726: echo " to the 32-bit word that has the first bit that" ! 1727: echo " we want to end up as the first bit in the source" ! 1728: echo " primary FIFO: */" ! 1729: echo " src_raw0 += (src_off / 32);" ! 1730: echo "" ! 1731: echo " /* reprime the source primary FIFO: */" ! 1732: echo " src_fifo0 = *src_raw0;" ! 1733: echo " *TME_FB_XLAT_SRC_OLD(src_raw0) = src_fifo0;" ! 1734: echo " src_raw0++;" ! 1735: echo " src_fifo0 = ((src_order == TME_ENDIAN_BIG)" ! 1736: echo " ? tme_betoh_u32(src_fifo0)" ! 1737: echo " : tme_letoh_u32(src_fifo0));" ! 1738: echo "" ! 1739: echo " /* if the source primary FIFO may be unaligned: */" ! 1740: echo " if (src_fifo0_may_be_unaligned) {" ! 1741: echo "" ! 1742: echo " /* reprime the top half of the FIFO, leaving a" ! 1743: echo " total of 64 bits in it: */" ! 1744: echo " src_fifo0_next = *src_raw0;" ! 1745: echo " *TME_FB_XLAT_SRC_OLD(src_raw0) = src_fifo0_next;" ! 1746: echo " src_raw0++;" ! 1747: echo " src_fifo0_next = ((src_order == TME_ENDIAN_BIG)" ! 1748: echo " ? tme_betoh_u32(src_fifo0_next)" ! 1749: echo " : tme_letoh_u32(src_fifo0_next));" ! 1750: echo " src_fifo0_bits = 64;" ! 1751: echo "" ! 1752: echo " /* if we have to shift off bits left over" ! 1753: echo " from rapidly advancing whole 32-bit words: */" ! 1754: echo " src_off %= 32;" ! 1755: echo " if (src_off > 0) {" ! 1756: echo " TME_FB_XLAT_SHIFT_SRC(src_fifo0_may_be_unaligned," ! 1757: echo " src_fifo0," ! 1758: echo " src_fifo0_next," ! 1759: echo " src_fifo0_bits," ! 1760: echo " src_off," ! 1761: echo " src_raw0," ! 1762: echo " src_order);" ! 1763: echo " }" ! 1764: echo " }" ! 1765: echo "" ! 1766: echo " /* otherwise, the source primary FIFO is always aligned: */" ! 1767: echo " else {" ! 1768: echo " assert ((src_off % 32) == 0);" ! 1769: echo " }" ! 1770: echo "" ! 1771: echo " /* calculate the number of bits that we need" ! 1772: echo " to shift the source secondary FIFO, after" ! 1773: echo " discarding any bits in it now: */" ! 1774: echo " src_off = ((src_bypl * 8) - (src_width * src_bipp)) + (src_bypl * 8);" ! 1775: echo " src_off -= (src_fifo1_may_be_unaligned" ! 1776: echo " ? src_fifo1_bits" ! 1777: echo " : 32);" ! 1778: echo "" ! 1779: echo " /* rapidly advance src_raw1 by the number of" ! 1780: echo " whole 32-bit words. this will leave it pointing" ! 1781: echo " to the 32-bit word that has the first bit that" ! 1782: echo " we want to end up as the first bit in the source" ! 1783: echo " secondary FIFO: */" ! 1784: echo " src_raw1 += (src_off / 32);" ! 1785: echo "" ! 1786: echo " /* reprime the source secondary FIFO: */" ! 1787: echo " src_fifo1 = *src_raw1;" ! 1788: echo " *TME_FB_XLAT_SRC_OLD(src_raw1) = src_fifo1;" ! 1789: echo " src_raw1++;" ! 1790: echo " src_fifo1 = ((src_order == TME_ENDIAN_BIG)" ! 1791: echo " ? tme_betoh_u32(src_fifo1)" ! 1792: echo " : tme_letoh_u32(src_fifo1));" ! 1793: echo "" ! 1794: echo " /* if the source secondary FIFO may be unaligned: */" ! 1795: echo " if (src_fifo1_may_be_unaligned) {" ! 1796: echo "" ! 1797: echo " /* reprime the top half of the FIFO, leaving a" ! 1798: echo " total of 64 bits in it: */" ! 1799: echo " src_fifo1_next = *src_raw1;" ! 1800: echo " *TME_FB_XLAT_SRC_OLD(src_raw1) = src_fifo1_next;" ! 1801: echo " src_raw1++;" ! 1802: echo " src_fifo1_next = ((src_order == TME_ENDIAN_BIG)" ! 1803: echo " ? tme_betoh_u32(src_fifo1_next)" ! 1804: echo " : tme_letoh_u32(src_fifo1_next));" ! 1805: echo " src_fifo1_bits = 64;" ! 1806: echo "" ! 1807: echo " /* if we have to shift off bits left over" ! 1808: echo " from rapidly advancing whole 32-bit words: */" ! 1809: echo " src_off %= 32;" ! 1810: echo " if (src_off > 0) {" ! 1811: echo " TME_FB_XLAT_SHIFT_SRC(src_fifo1_may_be_unaligned," ! 1812: echo " src_fifo1," ! 1813: echo " src_fifo1_next," ! 1814: echo " src_fifo1_bits," ! 1815: echo " src_off," ! 1816: echo " src_raw1," ! 1817: echo " src_order);" ! 1818: echo " }" ! 1819: echo " }" ! 1820: echo "" ! 1821: echo " /* otherwise, the source secondary FIFO is always aligned: */" ! 1822: echo " else {" ! 1823: echo " assert ((src_off % 32) == 0);" ! 1824: echo " }" ! 1825: echo "" ! 1826: echo " /* we are now on the first pixel of the next scanline: */" ! 1827: echo " src_x = 0;" ! 1828: echo " }" ! 1829: else ! 1830: echo " /* if the source buffer is not packed, and we just" ! 1831: echo " read the last pixel on this source scanline: */" ! 1832: echo " if (!src_packed" ! 1833: echo " && ++src_x == src_width) {" ! 1834: echo "" ! 1835: echo " /* calculate the number of bits between the" ! 1836: echo " last bit of the last pixel and the first bit" ! 1837: echo " of the first displayed pixel on the next" ! 1838: echo " scanline. this is equal to the number of" ! 1839: echo " pad bits plus bits for undisplayed pixels: */" ! 1840: echo " src_off = ((src_bypl * 8) - (src_width * src_bipp));" ! 1841: echo "" ! 1842: echo " /* while there are bits to shift: */" ! 1843: echo " for (; src_off > 0; src_off -= TME_MIN(src_off, 32)) {" ! 1844: echo "" ! 1845: echo " /* shift the source primary FIFO: */" ! 1846: echo " TME_FB_XLAT_SHIFT_SRC(src_fifo0_may_be_unaligned," ! 1847: echo " src_fifo0," ! 1848: echo " src_fifo0_next," ! 1849: echo " src_fifo0_bits," ! 1850: echo " TME_MIN(src_off, 32)," ! 1851: echo " src_raw0," ! 1852: echo " src_order);" ! 1853: echo " }" ! 1854: echo "" ! 1855: echo " /* we are now on the first pixel of the next scanline: */" ! 1856: echo " src_x = 0;" ! 1857: echo " }" ! 1858: fi ! 1859: ! 1860: if test `expr ${iter_next} % ${src_unroll}` = 0; then ! 1861: echo "" ! 1862: echo " /* shift the source primary FIFO: */" ! 1863: echo " TME_FB_XLAT_SHIFT_SRC(src_fifo0_may_be_unaligned," ! 1864: echo " src_fifo0," ! 1865: echo " src_fifo0_next," ! 1866: echo " src_fifo0_bits," ! 1867: echo " ${src_fifo_shift}," ! 1868: echo " src_raw0," ! 1869: echo " src_order);" ! 1870: if test $scale = _h_; then ! 1871: echo "" ! 1872: echo " /* shift the source secondary FIFO: */" ! 1873: echo " TME_FB_XLAT_SHIFT_SRC(src_fifo1_may_be_unaligned," ! 1874: echo " src_fifo1," ! 1875: echo " src_fifo1_next," ! 1876: echo " src_fifo1_bits," ! 1877: echo " ${src_fifo_shift}," ! 1878: echo " src_raw1," ! 1879: echo " src_order);" ! 1880: fi ! 1881: echo " xlat_run--;" ! 1882: fi ! 1883: ! 1884: # the number of bits to skip in a destination FIFO to get to ! 1885: # this iteration's pixel: ! 1886: dst_shift=`expr ${iter} % ${dst_unroll}` ! 1887: dst_shift='('`expr ${dst_shift} \* ${dst_iter_scale}`' * dst_bipp)' ! 1888: ! 1889: echo "" ! 1890: echo " /* put the pixel into the destination primary FIFO: */" ! 1891: echo " dst_fifo0 |=" ! 1892: echo " (pixel" ! 1893: echo " << (dst_order == TME_ENDIAN_BIG" ! 1894: echo " ? ((32 - dst_bipp) - ${dst_shift})" ! 1895: echo " : ${dst_shift}));" ! 1896: ! 1897: if test $scale = _d_; then ! 1898: ! 1899: echo "" ! 1900: echo " /* put the pixel into the destination secondary FIFO: */" ! 1901: echo " dst_fifo1 |=" ! 1902: echo " (pixel" ! 1903: echo " << (dst_order == TME_ENDIAN_BIG" ! 1904: echo " ? ((32 - dst_bipp) - ${dst_shift})" ! 1905: echo " : ${dst_shift}));" ! 1906: ! 1907: echo "" ! 1908: echo " /* put the pixel into both FIFOs again. if" ! 1909: echo " dst_bipp is 24 or greater, the FIFOs can" ! 1910: echo " not entirely take these further pixels," ! 1911: echo " so we need to shift: */" ! 1912: echo " if (dst_bipp >= 24) {" ! 1913: echo " TME_FB_XLAT_SHIFT_DST(dst_fifo0_may_be_unaligned," ! 1914: echo " dst_fifo0," ! 1915: echo " dst_fifo0_next," ! 1916: echo " dst_fifo0_bits," ! 1917: echo " dst_bipp," ! 1918: echo " dst_raw0," ! 1919: echo " dst_order);" ! 1920: echo " TME_FB_XLAT_SHIFT_DST(dst_fifo1_may_be_unaligned," ! 1921: echo " dst_fifo1," ! 1922: echo " dst_fifo1_next," ! 1923: echo " dst_fifo1_bits," ! 1924: echo " dst_bipp," ! 1925: echo " dst_raw1," ! 1926: echo " dst_order);" ! 1927: echo " dst_fifo0 |=" ! 1928: echo " (pixel" ! 1929: echo " << (dst_order == TME_ENDIAN_BIG" ! 1930: echo " ? ((32 - dst_bipp) - ${dst_shift})" ! 1931: echo " : ${dst_shift}));" ! 1932: echo " dst_fifo1 |=" ! 1933: echo " (pixel" ! 1934: echo " << (dst_order == TME_ENDIAN_BIG" ! 1935: echo " ? ((32 - dst_bipp) - ${dst_shift})" ! 1936: echo " : ${dst_shift}));" ! 1937: echo " }" ! 1938: echo "" ! 1939: echo " /* otherwise, the FIFOs can take these further pixels: */" ! 1940: echo " else {" ! 1941: echo " dst_fifo0 |=" ! 1942: echo " (pixel" ! 1943: echo " << (dst_order == TME_ENDIAN_BIG" ! 1944: echo " ? ((32 - dst_bipp) - (${dst_shift} + dst_bipp))" ! 1945: echo " : (${dst_shift} + dst_bipp)));" ! 1946: echo " dst_fifo1 |=" ! 1947: echo " (pixel" ! 1948: echo " << (dst_order == TME_ENDIAN_BIG" ! 1949: echo " ? ((32 - dst_bipp) - (${dst_shift} + dst_bipp))" ! 1950: echo " : (${dst_shift} + dst_bipp)));" ! 1951: echo " }" ! 1952: fi ! 1953: ! 1954: echo "" ! 1955: echo " /* if the destination buffer is not packed, and we just" ! 1956: echo " wrote the last pixel on this destination scanline: */" ! 1957: if test $scale = _d_; then value=2; else value=1; fi ! 1958: echo " if (!dst_packed" ! 1959: echo " && (dst_x += ${value}) == dst_width) {" ! 1960: echo "" ! 1961: echo " /* calculate the number of bits between the" ! 1962: echo " last bit of the last pixel and the first bit" ! 1963: echo " of the first displayed pixel on the next" ! 1964: echo " scanline. this is equal to the number of" ! 1965: echo " pad bits plus bits for undisplayed pixels: */" ! 1966: echo " dst_off = ((dst_bypl * 8) - (dst_width * dst_bipp));" ! 1967: echo "" ! 1968: echo " /* while there are bits to shift: */" ! 1969: echo " for (; dst_off > 0; dst_off -= TME_MIN(dst_off, 32)) {" ! 1970: echo "" ! 1971: echo " /* shift the destination primary FIFO: */" ! 1972: echo " TME_FB_XLAT_SHIFT_DST(dst_fifo0_may_be_unaligned," ! 1973: echo " dst_fifo0," ! 1974: echo " dst_fifo0_next," ! 1975: echo " dst_fifo0_bits," ! 1976: echo " TME_MIN(dst_off, 32)," ! 1977: echo " dst_raw0," ! 1978: echo " dst_order);" ! 1979: if test $scale = _d_; then ! 1980: echo "" ! 1981: echo " /* shift the destination secondary FIFO: */" ! 1982: echo " TME_FB_XLAT_SHIFT_DST(dst_fifo1_may_be_unaligned," ! 1983: echo " dst_fifo1," ! 1984: echo " dst_fifo1_next," ! 1985: echo " dst_fifo1_bits," ! 1986: echo " TME_MIN(dst_off, 32)," ! 1987: echo " dst_raw1," ! 1988: echo " dst_order);" ! 1989: fi ! 1990: echo " }" ! 1991: echo "" ! 1992: echo " /* we are now on the first pixel of the next scanline: */" ! 1993: echo " dst_x = 0;" ! 1994: echo " }" ! 1995: ! 1996: if test `expr ${iter_next} % ${dst_unroll}` = 0; then ! 1997: echo "" ! 1998: echo " /* shift the destination primary FIFO: */" ! 1999: echo " TME_FB_XLAT_SHIFT_DST(dst_fifo0_may_be_unaligned," ! 2000: echo " dst_fifo0," ! 2001: echo " dst_fifo0_next," ! 2002: echo " dst_fifo0_bits," ! 2003: echo " ${dst_fifo_shift}," ! 2004: echo " dst_raw0," ! 2005: echo " dst_order);" ! 2006: if test $scale = _d_; then ! 2007: echo "" ! 2008: echo " /* shift the destination secondary FIFO: */" ! 2009: echo " TME_FB_XLAT_SHIFT_DST(dst_fifo1_may_be_unaligned," ! 2010: echo " dst_fifo1," ! 2011: echo " dst_fifo1_next," ! 2012: echo " dst_fifo1_bits," ! 2013: echo " ${dst_fifo_shift}," ! 2014: echo " dst_raw1," ! 2015: echo " dst_order);" ! 2016: fi ! 2017: fi ! 2018: ! 2019: iter=${iter_next} ! 2020: done ! 2021: echo "" ! 2022: echo " }" ! 2023: ! 2024: if test `expr ${iter} % ${dst_unroll}` != 0; then ! 2025: echo "$PROG internal error - the last iter did not shift the destination FIFOs ($iter and $dst_unroll)" 1>&2 ! 2026: exit 1 ! 2027: fi ! 2028: ! 2029: echo "" ! 2030: echo " /* if the destination FIFOs may be unaligned, there" ! 2031: echo " may be bits left in the FIFO that we need to flush: */" ! 2032: echo " if (dst_fifo0_may_be_unaligned" ! 2033: echo " && dst_fifo0_bits > 0) {" ! 2034: echo " dst_fifo0 = *dst_raw0;" ! 2035: echo " if (dst_order == TME_ENDIAN_BIG) {" ! 2036: echo " dst_fifo0_next |= (tme_betoh_u32(dst_fifo0) & (0xffffffff >> dst_fifo0_bits));" ! 2037: echo " dst_fifo0_next = tme_htobe_u32(dst_fifo0_next);" ! 2038: echo " }" ! 2039: echo " else {" ! 2040: echo " dst_fifo0_next |= (tme_letoh_u32(dst_fifo0) & (0xffffffff << dst_fifo0_bits));" ! 2041: echo " dst_fifo0_next = tme_htole_u32(dst_fifo0_next);" ! 2042: echo " }" ! 2043: echo " *dst_raw0 = dst_fifo0;" ! 2044: echo " }" ! 2045: if test $scale = _d_; then ! 2046: echo " if (dst_fifo1_may_be_unaligned" ! 2047: echo " && dst_fifo1_bits > 0) {" ! 2048: echo " dst_fifo1 = *dst_raw1;" ! 2049: echo " if (dst_order == TME_ENDIAN_BIG) {" ! 2050: echo " dst_fifo1_next |= (tme_betoh_u32(dst_fifo1) & (0xffffffff >> dst_fifo1_bits));" ! 2051: echo " dst_fifo1_next = tme_htobe_u32(dst_fifo1_next);" ! 2052: echo " }" ! 2053: echo " else {" ! 2054: echo " dst_fifo1_next |= (tme_letoh_u32(dst_fifo1) & (0xffffffff << dst_fifo1_bits));" ! 2055: echo " dst_fifo1_next = tme_htole_u32(dst_fifo1_next);" ! 2056: echo " }" ! 2057: echo " *dst_raw1 = dst_fifo1;" ! 2058: echo " }" ! 2059: fi ! 2060: ! 2061: echo "" ! 2062: echo " /* loop back to compare more 32-bit words: */" ! 2063: echo " src_raw0--;" ! 2064: echo " }" ! 2065: ! 2066: echo "" ! 2067: echo " /* return nonzero iff we did some translating: */" ! 2068: echo " return (xlat_run >= 0);" ! 2069: ! 2070: echo "" ! 2071: for macro in ${undef_macros}; do ! 2072: echo "#undef ${macro}" ! 2073: done ! 2074: echo "}" ! 2075: ! 2076: done ! 2077: done ! 2078: ! 2079: echo "" ! 2080: echo "/* the xlat function array: */" ! 2081: echo "static const struct tme_fb_xlat tme_fb_xlats[] = {$xlat_array ! 2082: };" ! 2083: ! 2084: # done: ! 2085: exit 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.