Commit 4c8732d71b61d2950a57dbb758517de536125175

Authored by bellard
1 parent 1cc98a5f

cirrus blitter fixes


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@907 c046a42c-6fe2-441c-8c8c-71466251a162
hw/cirrus_vga.c
@@ -136,6 +136,7 @@ @@ -136,6 +136,7 @@
136 136
137 // control 0x33 137 // control 0x33
138 #define CIRRUS_BLTMODEEXT_SOLIDFILL 0x04 138 #define CIRRUS_BLTMODEEXT_SOLIDFILL 0x04
  139 +#define CIRRUS_BLTMODEEXT_COLOREXPINV 0x02
139 #define CIRRUS_BLTMODEEXT_DWORDGRANULARITY 0x01 140 #define CIRRUS_BLTMODEEXT_DWORDGRANULARITY 0x01
140 141
141 // memory-mapped IO 142 // memory-mapped IO
@@ -325,7 +326,7 @@ static void cirrus_bitblt_fill_nop(CirrusVGAState *s, @@ -325,7 +326,7 @@ static void cirrus_bitblt_fill_nop(CirrusVGAState *s,
325 #include "cirrus_vga_rop.h" 326 #include "cirrus_vga_rop.h"
326 327
327 #define ROP_NAME 1 328 #define ROP_NAME 1
328 -#define ROP_OP(d, s) d = 0xff 329 +#define ROP_OP(d, s) d = ~0
329 #include "cirrus_vga_rop.h" 330 #include "cirrus_vga_rop.h"
330 331
331 #define ROP_NAME notsrc_and_dst 332 #define ROP_NAME notsrc_and_dst
@@ -435,6 +436,25 @@ static const cirrus_bitblt_rop_t cirrus_colorexpand_transp[16][4] = { @@ -435,6 +436,25 @@ static const cirrus_bitblt_rop_t cirrus_colorexpand_transp[16][4] = {
435 ROP2(cirrus_colorexpand_transp_notsrc_and_notdst), 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 static const cirrus_bitblt_rop_t cirrus_colorexpand[16][4] = { 458 static const cirrus_bitblt_rop_t cirrus_colorexpand[16][4] = {
439 ROP2(cirrus_colorexpand_0), 459 ROP2(cirrus_colorexpand_0),
440 ROP2(cirrus_colorexpand_src_and_dst), 460 ROP2(cirrus_colorexpand_src_and_dst),
@@ -820,8 +840,13 @@ static void cirrus_bitblt_start(CirrusVGAState * s) @@ -820,8 +840,13 @@ static void cirrus_bitblt_start(CirrusVGAState * s)
820 CIRRUS_BLTMODE_COLOREXPAND) { 840 CIRRUS_BLTMODE_COLOREXPAND) {
821 841
822 if (s->cirrus_blt_mode & CIRRUS_BLTMODE_TRANSPARENTCOMP) { 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 } else { 850 } else {
826 cirrus_bitblt_fgcol(s); 851 cirrus_bitblt_fgcol(s);
827 cirrus_bitblt_bgcol(s); 852 cirrus_bitblt_bgcol(s);
hw/cirrus_vga_rop2.h
@@ -36,14 +36,14 @@ @@ -36,14 +36,14 @@
36 #error unsupported DEPTH 36 #error unsupported DEPTH
37 #endif 37 #endif
38 38
  39 +/* NOTE: srcpitch is ignored */
39 static void 40 static void
40 glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH) 41 glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH)
41 (CirrusVGAState * s, uint8_t * dst, 42 (CirrusVGAState * s, uint8_t * dst,
42 - const uint8_t * src1, 43 + const uint8_t * src,
43 int dstpitch, int srcpitch, 44 int dstpitch, int srcpitch,
44 int bltwidth, int bltheight) 45 int bltwidth, int bltheight)
45 { 46 {
46 - const uint8_t *src;  
47 uint8_t *d; 47 uint8_t *d;
48 int x, y; 48 int x, y;
49 unsigned bits; 49 unsigned bits;
@@ -54,7 +54,6 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH) @@ -54,7 +54,6 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH)
54 54
55 col = s->cirrus_blt_fgcol; 55 col = s->cirrus_blt_fgcol;
56 for(y = 0; y < bltheight; y++) { 56 for(y = 0; y < bltheight; y++) {
57 - src = src1;  
58 bitmask = 0x80 >> srcskipleft; 57 bitmask = 0x80 >> srcskipleft;
59 bits = *src++; 58 bits = *src++;
60 d = dst; 59 d = dst;
@@ -70,7 +69,43 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH) @@ -70,7 +69,43 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH)
70 d += (DEPTH / 8); 69 d += (DEPTH / 8);
71 bitmask >>= 1; 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 dst += dstpitch; 109 dst += dstpitch;
75 } 110 }
76 } 111 }
@@ -78,11 +113,10 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH) @@ -78,11 +113,10 @@ glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH)
78 static void 113 static void
79 glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH) 114 glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH)
80 (CirrusVGAState * s, uint8_t * dst, 115 (CirrusVGAState * s, uint8_t * dst,
81 - const uint8_t * src1, 116 + const uint8_t * src,
82 int dstpitch, int srcpitch, 117 int dstpitch, int srcpitch,
83 int bltwidth, int bltheight) 118 int bltwidth, int bltheight)
84 { 119 {
85 - const uint8_t *src;  
86 uint32_t colors[2]; 120 uint32_t colors[2];
87 uint8_t *d; 121 uint8_t *d;
88 int x, y; 122 int x, y;
@@ -94,7 +128,6 @@ glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH) @@ -94,7 +128,6 @@ glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH)
94 colors[0] = s->cirrus_blt_bgcol; 128 colors[0] = s->cirrus_blt_bgcol;
95 colors[1] = s->cirrus_blt_fgcol; 129 colors[1] = s->cirrus_blt_fgcol;
96 for(y = 0; y < bltheight; y++) { 130 for(y = 0; y < bltheight; y++) {
97 - src = src1;  
98 bitmask = 0x80 >> srcskipleft; 131 bitmask = 0x80 >> srcskipleft;
99 bits = *src++; 132 bits = *src++;
100 d = dst; 133 d = dst;
@@ -108,7 +141,6 @@ glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH) @@ -108,7 +141,6 @@ glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH)
108 d += (DEPTH / 8); 141 d += (DEPTH / 8);
109 bitmask >>= 1; 142 bitmask >>= 1;
110 } 143 }
111 - src1 += srcpitch;  
112 dst += dstpitch; 144 dst += dstpitch;
113 } 145 }
114 } 146 }