Commit 4c8732d71b61d2950a57dbb758517de536125175
1 parent
1cc98a5f
cirrus blitter fixes
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@907 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
68 additions
and
11 deletions
hw/cirrus_vga.c
| ... | ... | @@ -136,6 +136,7 @@ |
| 136 | 136 | |
| 137 | 137 | // control 0x33 |
| 138 | 138 | #define CIRRUS_BLTMODEEXT_SOLIDFILL 0x04 |
| 139 | +#define CIRRUS_BLTMODEEXT_COLOREXPINV 0x02 | |
| 139 | 140 | #define CIRRUS_BLTMODEEXT_DWORDGRANULARITY 0x01 |
| 140 | 141 | |
| 141 | 142 | // memory-mapped IO |
| ... | ... | @@ -325,7 +326,7 @@ static void cirrus_bitblt_fill_nop(CirrusVGAState *s, |
| 325 | 326 | #include "cirrus_vga_rop.h" |
| 326 | 327 | |
| 327 | 328 | #define ROP_NAME 1 |
| 328 | -#define ROP_OP(d, s) d = 0xff | |
| 329 | +#define ROP_OP(d, s) d = ~0 | |
| 329 | 330 | #include "cirrus_vga_rop.h" |
| 330 | 331 | |
| 331 | 332 | #define ROP_NAME notsrc_and_dst |
| ... | ... | @@ -435,6 +436,25 @@ static const cirrus_bitblt_rop_t cirrus_colorexpand_transp[16][4] = { |
| 435 | 436 | ROP2(cirrus_colorexpand_transp_notsrc_and_notdst), |
| 436 | 437 | }; |
| 437 | 438 | |
| 439 | +static const cirrus_bitblt_rop_t cirrus_colorexpand_transp_inv[16][4] = { | |
| 440 | + ROP2(cirrus_colorexpand_transp_inv_0), | |
| 441 | + ROP2(cirrus_colorexpand_transp_inv_src_and_dst), | |
| 442 | + ROP_NOP2(cirrus_bitblt_rop_nop), | |
| 443 | + ROP2(cirrus_colorexpand_transp_inv_src_and_notdst), | |
| 444 | + ROP2(cirrus_colorexpand_transp_inv_notdst), | |
| 445 | + ROP2(cirrus_colorexpand_transp_inv_src), | |
| 446 | + ROP2(cirrus_colorexpand_transp_inv_1), | |
| 447 | + ROP2(cirrus_colorexpand_transp_inv_notsrc_and_dst), | |
| 448 | + ROP2(cirrus_colorexpand_transp_inv_src_xor_dst), | |
| 449 | + ROP2(cirrus_colorexpand_transp_inv_src_or_dst), | |
| 450 | + ROP2(cirrus_colorexpand_transp_inv_notsrc_or_notdst), | |
| 451 | + ROP2(cirrus_colorexpand_transp_inv_src_notxor_dst), | |
| 452 | + ROP2(cirrus_colorexpand_transp_inv_src_or_notdst), | |
| 453 | + ROP2(cirrus_colorexpand_transp_inv_notsrc), | |
| 454 | + ROP2(cirrus_colorexpand_transp_inv_notsrc_or_dst), | |
| 455 | + ROP2(cirrus_colorexpand_transp_inv_notsrc_and_notdst), | |
| 456 | +}; | |
| 457 | + | |
| 438 | 458 | static const cirrus_bitblt_rop_t cirrus_colorexpand[16][4] = { |
| 439 | 459 | ROP2(cirrus_colorexpand_0), |
| 440 | 460 | ROP2(cirrus_colorexpand_src_and_dst), |
| ... | ... | @@ -820,8 +840,13 @@ static void cirrus_bitblt_start(CirrusVGAState * s) |
| 820 | 840 | CIRRUS_BLTMODE_COLOREXPAND) { |
| 821 | 841 | |
| 822 | 842 | if (s->cirrus_blt_mode & CIRRUS_BLTMODE_TRANSPARENTCOMP) { |
| 823 | - cirrus_bitblt_fgcol(s); | |
| 824 | - s->cirrus_rop = cirrus_colorexpand_transp[rop_to_index[blt_rop]][s->cirrus_blt_pixelwidth - 1]; | |
| 843 | + if (s->cirrus_blt_modeext & CIRRUS_BLTMODEEXT_COLOREXPINV) { | |
| 844 | + cirrus_bitblt_bgcol(s); | |
| 845 | + s->cirrus_rop = cirrus_colorexpand_transp_inv[rop_to_index[blt_rop]][s->cirrus_blt_pixelwidth - 1]; | |
| 846 | + } else { | |
| 847 | + cirrus_bitblt_fgcol(s); | |
| 848 | + s->cirrus_rop = cirrus_colorexpand_transp[rop_to_index[blt_rop]][s->cirrus_blt_pixelwidth - 1]; | |
| 849 | + } | |
| 825 | 850 | } else { |
| 826 | 851 | cirrus_bitblt_fgcol(s); |
| 827 | 852 | cirrus_bitblt_bgcol(s); | ... | ... |
hw/cirrus_vga_rop2.h
| ... | ... | @@ -36,14 +36,14 @@ |
| 36 | 36 | #error unsupported DEPTH |
| 37 | 37 | #endif |
| 38 | 38 | |
| 39 | +/* NOTE: srcpitch is ignored */ | |
| 39 | 40 | static void |
| 40 | 41 | glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH) |
| 41 | 42 | (CirrusVGAState * s, uint8_t * dst, |
| 42 | - const uint8_t * src1, | |
| 43 | + const uint8_t * src, | |
| 43 | 44 | int dstpitch, int srcpitch, |
| 44 | 45 | int bltwidth, int bltheight) |
| 45 | 46 | { |
| 46 | - const uint8_t *src; | |
| 47 | 47 | uint8_t *d; |
| 48 | 48 | int x, y; |
| 49 | 49 | unsigned bits; |
| ... | ... | @@ -54,7 +54,6 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH) |
| 54 | 54 | |
| 55 | 55 | col = s->cirrus_blt_fgcol; |
| 56 | 56 | for(y = 0; y < bltheight; y++) { |
| 57 | - src = src1; | |
| 58 | 57 | bitmask = 0x80 >> srcskipleft; |
| 59 | 58 | bits = *src++; |
| 60 | 59 | d = dst; |
| ... | ... | @@ -70,7 +69,43 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH) |
| 70 | 69 | d += (DEPTH / 8); |
| 71 | 70 | bitmask >>= 1; |
| 72 | 71 | } |
| 73 | - src1 += srcpitch; | |
| 72 | + dst += dstpitch; | |
| 73 | + } | |
| 74 | +} | |
| 75 | + | |
| 76 | +/* NOTE: srcpitch is ignored */ | |
| 77 | +static void | |
| 78 | +glue(glue(glue(cirrus_colorexpand_transp_inv_, ROP_NAME), _),DEPTH) | |
| 79 | + (CirrusVGAState * s, uint8_t * dst, | |
| 80 | + const uint8_t * src, | |
| 81 | + int dstpitch, int srcpitch, | |
| 82 | + int bltwidth, int bltheight) | |
| 83 | +{ | |
| 84 | + uint8_t *d; | |
| 85 | + int x, y; | |
| 86 | + unsigned bits; | |
| 87 | + unsigned int col; | |
| 88 | + unsigned bitmask; | |
| 89 | + unsigned index; | |
| 90 | + int srcskipleft = 0; | |
| 91 | + | |
| 92 | + col = s->cirrus_blt_bgcol; | |
| 93 | + for(y = 0; y < bltheight; y++) { | |
| 94 | + bitmask = 0x80 >> srcskipleft; | |
| 95 | + bits = *src++; | |
| 96 | + d = dst; | |
| 97 | + for (x = 0; x < bltwidth; x += (DEPTH / 8)) { | |
| 98 | + if ((bitmask & 0xff) == 0) { | |
| 99 | + bitmask = 0x80; | |
| 100 | + bits = *src++; | |
| 101 | + } | |
| 102 | + index = (bits & bitmask); | |
| 103 | + if (!index) { | |
| 104 | + PUTPIXEL(); | |
| 105 | + } | |
| 106 | + d += (DEPTH / 8); | |
| 107 | + bitmask >>= 1; | |
| 108 | + } | |
| 74 | 109 | dst += dstpitch; |
| 75 | 110 | } |
| 76 | 111 | } |
| ... | ... | @@ -78,11 +113,10 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH) |
| 78 | 113 | static void |
| 79 | 114 | glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH) |
| 80 | 115 | (CirrusVGAState * s, uint8_t * dst, |
| 81 | - const uint8_t * src1, | |
| 116 | + const uint8_t * src, | |
| 82 | 117 | int dstpitch, int srcpitch, |
| 83 | 118 | int bltwidth, int bltheight) |
| 84 | 119 | { |
| 85 | - const uint8_t *src; | |
| 86 | 120 | uint32_t colors[2]; |
| 87 | 121 | uint8_t *d; |
| 88 | 122 | int x, y; |
| ... | ... | @@ -94,7 +128,6 @@ glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH) |
| 94 | 128 | colors[0] = s->cirrus_blt_bgcol; |
| 95 | 129 | colors[1] = s->cirrus_blt_fgcol; |
| 96 | 130 | for(y = 0; y < bltheight; y++) { |
| 97 | - src = src1; | |
| 98 | 131 | bitmask = 0x80 >> srcskipleft; |
| 99 | 132 | bits = *src++; |
| 100 | 133 | d = dst; |
| ... | ... | @@ -108,7 +141,6 @@ glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH) |
| 108 | 141 | d += (DEPTH / 8); |
| 109 | 142 | bitmask >>= 1; |
| 110 | 143 | } |
| 111 | - src1 += srcpitch; | |
| 112 | 144 | dst += dstpitch; |
| 113 | 145 | } |
| 114 | 146 | } | ... | ... |