diff --git a/src/cpu/codegen_ops_x86-64.h b/src/cpu/codegen_ops_x86-64.h index fb16d7c74..de12f93d5 100644 --- a/src/cpu/codegen_ops_x86-64.h +++ b/src/cpu/codegen_ops_x86-64.h @@ -884,9 +884,9 @@ static inline void CHECK_SEG_READ(x86seg *seg) addbyte(0xe8 | REG_ESI); addbyte(0xff); } - addbyte(0x0f); /*JE end*/ + addbyte(0x0f); /*JE GPF_BLOCK_OFFSET*/ addbyte(0x84); - addlong(BLOCK_EXIT_OFFSET - (block_pos + 4)); + addlong(BLOCK_GPF_OFFSET - (block_pos + 4)); seg->checked = 1; } @@ -920,9 +920,9 @@ static inline void CHECK_SEG_WRITE(x86seg *seg) addbyte(0xe8 | REG_ESI); addbyte(0xff); } - addbyte(0x0f); /*JE end*/ + addbyte(0x0f); /*JE GPF_BLOCK_OFFSET*/ addbyte(0x84); - addlong(BLOCK_EXIT_OFFSET - (block_pos + 4)); + addlong(BLOCK_GPF_OFFSET - (block_pos + 4)); seg->checked = 1; } diff --git a/src/cpu/codegen_ops_x86.h b/src/cpu/codegen_ops_x86.h index d81ba0dd9..8f38b3cdf 100644 --- a/src/cpu/codegen_ops_x86.h +++ b/src/cpu/codegen_ops_x86.h @@ -626,8 +626,8 @@ static inline void CHECK_SEG_READ(x86seg *seg) addlong((uint32_t)&seg->base); addbyte(-1); addbyte(0x0f); - addbyte(0x84); /*JE end*/ - addlong(BLOCK_EXIT_OFFSET - (block_pos + 4)); + addbyte(0x84); /*JE BLOCK_GPF_OFFSET*/ + addlong(BLOCK_GPF_OFFSET - (block_pos + 4)); seg->checked = 1; } @@ -649,8 +649,8 @@ static inline void CHECK_SEG_WRITE(x86seg *seg) addlong((uint32_t)&seg->base); addbyte(-1); addbyte(0x0f); - addbyte(0x84); /*JE end*/ - addlong(BLOCK_EXIT_OFFSET - (block_pos + 4)); + addbyte(0x84); /*JE BLOCK_GPF_OFFSET*/ + addlong(BLOCK_GPF_OFFSET - (block_pos + 4)); seg->checked = 1; } diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 79f1a5358..f64fa3961 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -1909,6 +1909,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) int x_mul; int cpu_dat_shift; uint32_t *pattern_data; + uint32_t src_fg_clr, src_bg_clr; uint32_t src_addr; uint32_t dest_addr; uint32_t source = 0, dest = 0, pattern; @@ -1922,12 +1923,16 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) x_mul = 1; cpu_dat_shift = 8; pattern_data = virge->s3d.pattern_8; + src_fg_clr = virge->s3d.src_fg_clr & 0xff; + src_bg_clr = virge->s3d.src_bg_clr & 0xff; break; case CMD_SET_FORMAT_16: bpp = 1; x_mul = 2; cpu_dat_shift = 16; pattern_data = virge->s3d.pattern_16; + src_fg_clr = virge->s3d.src_fg_clr & 0xffff; + src_bg_clr = virge->s3d.src_bg_clr & 0xffff; break; case CMD_SET_FORMAT_24: default: @@ -1935,6 +1940,8 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) x_mul = 3; cpu_dat_shift = 24; pattern_data = virge->s3d.pattern_32; + src_fg_clr = virge->s3d.src_fg_clr; + src_bg_clr = virge->s3d.src_bg_clr; break; } if (virge->s3d.cmd_set & CMD_SET_MP) @@ -2016,7 +2023,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) case 0: case CMD_SET_MS: READ(src_addr, source); - if ((virge->s3d.cmd_set & CMD_SET_TP) && source == virge->s3d.src_fg_clr) + if ((virge->s3d.cmd_set & CMD_SET_TP) && source == src_fg_clr) update = 0; break; case CMD_SET_IDS: @@ -2047,11 +2054,11 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) count = 0; } } - if ((virge->s3d.cmd_set & CMD_SET_TP) && source == virge->s3d.src_fg_clr) + if ((virge->s3d.cmd_set & CMD_SET_TP) && source == src_fg_clr) update = 0; break; case CMD_SET_IDS | CMD_SET_MS: - source = (cpu_dat & (1 << 31)) ? virge->s3d.src_fg_clr : virge->s3d.src_bg_clr; + source = (cpu_dat & (1 << 31)) ? src_fg_clr : src_bg_clr; if ((virge->s3d.cmd_set & CMD_SET_TP) && !(cpu_dat & (1 << 31))) update = 0; cpu_dat <<= 1; diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index 0913d1e3b..92c00fb75 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -331,6 +331,7 @@ typedef struct voodoo_t fifo_entry_t fifo[FIFO_SIZE]; volatile int fifo_read_idx, fifo_write_idx; int cmd_read, cmd_written; + volatile int cmd_read, cmd_written, cmd_written_fifo; voodoo_params_t params_buffer[PARAM_SIZE]; volatile int params_read_idx[2], params_write_idx; @@ -6023,17 +6024,19 @@ static uint32_t voodoo_readl(uint32_t addr, void *p) { int fifo_entries = FIFO_ENTRIES; int swap_count = voodoo->swap_count; - int busy = (voodoo->cmd_written - voodoo->cmd_read) || (voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr); + int written = voodoo->cmd_written + voodoo->cmd_written_fifo; + int busy = (written - voodoo->cmd_read) || (voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr); if (SLI_ENABLED && voodoo->type != VOODOO_2) { voodoo_t *voodoo_other = (voodoo == voodoo->set->voodoos[0]) ? voodoo->set->voodoos[1] : voodoo->set->voodoos[0]; - + int other_written = voodoo_other->cmd_written + voodoo_other->cmd_written_fifo; + if (voodoo_other->swap_count > swap_count) swap_count = voodoo_other->swap_count; if ((voodoo_other->fifo_write_idx - voodoo_other->fifo_read_idx) > fifo_entries) fifo_entries = voodoo_other->fifo_write_idx - voodoo_other->fifo_read_idx; - if ((voodoo_other->cmd_written - voodoo_other->cmd_read) || + if ((other_written - voodoo_other->cmd_read) || (voodoo_other->cmdfifo_depth_rd != voodoo_other->cmdfifo_depth_wr)) busy = 1; if (!voodoo_other->voodoo_busy) @@ -6651,7 +6654,7 @@ static void fifo_thread(void *param) uint32_t val = cmdfifo_get(voodoo); if ((addr & 0x3ff) == SST_triangleCMD || (addr & 0x3ff) == SST_ftriangleCMD || (addr & 0x3ff) == SST_fastfillCMD || (addr & 0x3ff) == SST_nopCMD) - voodoo->cmd_written++; + voodoo->cmd_written_fifo++; voodoo_reg_writel(addr, val, voodoo); @@ -6735,7 +6738,7 @@ static void fifo_thread(void *param) uint32_t val = cmdfifo_get(voodoo); if ((addr & 0x3ff) == SST_triangleCMD || (addr & 0x3ff) == SST_ftriangleCMD || (addr & 0x3ff) == SST_fastfillCMD || (addr & 0x3ff) == SST_nopCMD) - voodoo->cmd_written++; + voodoo->cmd_written_fifo++; voodoo_reg_writel(addr, val, voodoo); }