From c9cc0f816412b872b9146024a2939efec3ca64e2 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Thu, 16 Jan 2025 21:01:18 +0200 Subject: [PATCH] Some Voodoo updates --- pcem/vid_voodoo_banshee.cpp | 10 +++++++++- pcem/vid_voodoo_fb.cpp | 9 +++++++++ pcem/vid_voodoo_regs.h | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/pcem/vid_voodoo_banshee.cpp b/pcem/vid_voodoo_banshee.cpp index cda8bee4..60411f9d 100644 --- a/pcem/vid_voodoo_banshee.cpp +++ b/pcem/vid_voodoo_banshee.cpp @@ -147,6 +147,7 @@ enum cmdHoleCnt0 = 0x48 }; +#define VGAINIT0_RAMDAC_8BIT (1 << 2) #define VGAINIT0_EXTENDED_SHIFT_OUT (1 << 12) #define VIDPROCCFG_VIDPROC_ENABLE (1 << 0) @@ -376,7 +377,7 @@ static void banshee_render_16bpp_tiled(svga_t *svga) else addr = banshee->desktop_addr + (banshee->desktop_y & 31) * 128 + ((banshee->desktop_y >> 5) * banshee->desktop_stride_tiled); - for (x = 0; x <= svga->hdisp; x += 64) + for (x = 0; x < svga->hdisp; x += 64) { if (svga->hwcursor_on || svga->overlay_on) svga->changedvram[addr >> 12] = 2; @@ -630,6 +631,7 @@ static void banshee_ext_outl(uint16_t addr, uint32_t val, void *p) break; case Init_vgaInit0: banshee->vgaInit0 = val; + svga_set_ramdac_type(svga, (val & VGAINIT0_RAMDAC_8BIT ? RAMDAC_8BIT : RAMDAC_6BIT)); break; case Init_vgaInit1: banshee->vgaInit1 = val; @@ -1044,6 +1046,10 @@ static uint32_t banshee_cmd_read(banshee_t *banshee, uint32_t addr) // pclog("Read cmdfifo_depth %08x\n", ret); break; + case cmdBaseSize0: + ret = voodoo->cmdfifo_size; + break; + case 0x108: break; @@ -1753,6 +1759,7 @@ void banshee_hwcursor_draw(svga_t *svga, int displine) for (xx = 0; xx < 8; xx++) { + if (((x_off + xx + svga->x_add) >= 0) && ((x_off + xx + svga->x_add) <= 2047)) { if (!(plane0[x >> 3] & (1 << 7))) ((uint32_t *)buffer32->line[displine])[x_off + xx] = (plane1[x >> 3] & (1 << 7)) ? col1 : col0; else if (plane1[x >> 3] & (1 << 7)) @@ -1760,6 +1767,7 @@ void banshee_hwcursor_draw(svga_t *svga, int displine) plane0[x >> 3] <<= 1; plane1[x >> 3] <<= 1; + } } } diff --git a/pcem/vid_voodoo_fb.cpp b/pcem/vid_voodoo_fb.cpp index be07311a..d6251f59 100644 --- a/pcem/vid_voodoo_fb.cpp +++ b/pcem/vid_voodoo_fb.cpp @@ -325,6 +325,15 @@ void voodoo_fb_writel(uint32_t addr, uint32_t val, void *p) addr >>= 1; break; + case LFB_FORMAT_XRGB8888: + colour_data[0].b = val & 0xff; + colour_data[0].g = (val >> 8) & 0xff; + colour_data[0].r = (val >> 16) & 0xff; + alpha_data[0] = 0xff; + write_mask = LFB_WRITE_COLOUR; + addr >>= 1; + break; + case LFB_FORMAT_DEPTH: depth_data[0] = val; depth_data[1] = val >> 16; diff --git a/pcem/vid_voodoo_regs.h b/pcem/vid_voodoo_regs.h index e99241f6..eb8435d7 100644 --- a/pcem/vid_voodoo_regs.h +++ b/pcem/vid_voodoo_regs.h @@ -342,6 +342,7 @@ enum LFB_FORMAT_RGB565 = 0, LFB_FORMAT_RGB555 = 1, LFB_FORMAT_ARGB1555 = 2, + LFB_FORMAT_XRGB8888 = 4, LFB_FORMAT_ARGB8888 = 5, LFB_FORMAT_DEPTH = 15, LFB_FORMAT_MASK = 15 -- 2.47.3