]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Check PCem RTG board doubling mode when calculating magic mouse coordinates.
authorToni Wilen <twilen@winuae.net>
Sat, 18 Dec 2021 17:48:16 +0000 (19:48 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 18 Dec 2021 17:48:16 +0000 (19:48 +0200)
framebufferboards.cpp
gfxboard.cpp
include/gfxboard.h
mame/a2410.cpp
od-win32/picasso96_win.cpp
od-win32/picasso96_win.h
od-win32/win32gfx.cpp
pcem/ibm.h
pcem/pcemglue.cpp
pcem/vid_svga.cpp

index acb29629c5fb8da34ffcf71f7ae579122375e7ae..fae7417b5480d4c4be7fbe87f16279388df8e08e 100644 (file)
@@ -359,6 +359,8 @@ static bool harlequin_vsync(void *userdata, struct gfxboard_mode *mode)
                mode->width = data->width;
                mode->height = data->height;
                mode->mode = data->rgbtype;
+               mode->hlinedbl = 1;
+               mode->vlinedbl = 1;
 
                if (fb_get_surface(data)) {
                        if (data->fb_modified || data->modechanged || mode->redraw_required) {
index 65ee5caafa54c14b442405eade0d162fa38c0bc7..b917a38f5d99f4f315c19c25b1a59c2d802cc9c2 100644 (file)
@@ -330,7 +330,7 @@ struct rtggfxboard
        uae_u8 cirrus_pci[0x44];
        uae_u8 p4i2c;
        uae_u8 p4_pci[0x44];
-       int vga_width, vga_height;
+       int vga_width, vga_height, vga_width_mult, vga_height_mult;
        bool vga_refresh_active;
        int device_settings;
 
@@ -852,6 +852,7 @@ static void init_board (struct rtggfxboard *gb)
        gb->gfxmem_bank->reserved_size = vramsize;
        gb->gfxmem_bank->start = gb->gfxboardmem_start;
        if (gb->board->manufacturer) {
+               gb->gfxmem_bank->flags |= ABFLAG_ALLOCINDIRECT | ABFLAG_PPCIOSPACE;
                gb->gfxmem_bank->label = _T("*");
                mapped_malloc(gb->gfxmem_bank);
        } else if (gb->board->pci) {
@@ -859,6 +860,7 @@ static void init_board (struct rtggfxboard *gb)
                // PCI display card's BARs have been initialized
                ;
        } else {
+               gb->gfxmem_bank->flags |= ABFLAG_ALLOCINDIRECT | ABFLAG_PPCIOSPACE;
                gb->gfxmem_bank->label = _T("*");
                gb->vram_back = xmalloc(uae_u8, vramsize);
                if (&get_mem_bank(0x800000) == &dummy_bank)
@@ -962,6 +964,8 @@ static bool gfxboard_setmode(struct rtggfxboard *gb, struct gfxboard_mode *mode)
        state->Height = mode->height;
        state->VirtualWidth = state->Width;
        state->VirtualHeight = state->Height;
+       state->HLineDBL = mode->hlinedbl ? mode->hlinedbl : 1;
+       state->VLineDBL = mode->vlinedbl ? mode->vlinedbl : 1;
        int bpp = GetBytesPerPixel(mode->mode);
        state->BytesPerPixel = bpp;
        state->BytesPerRow = mode->width * bpp;
@@ -1156,6 +1160,8 @@ static bool gfxboard_setmode_ext(struct rtggfxboard *gb)
        struct gfxboard_mode mode;
        mode.width = gb->vga_width;
        mode.height = gb->vga_height;
+       mode.hlinedbl = gb->vga_width_mult ? gb->vga_width_mult : 1;
+       mode.vlinedbl = gb->vga_height_mult ? gb->vga_height_mult : 1;
        mode.mode = RGBFB_NONE;
        for (int i = 0; i < RGBFB_MaxFormats; i++) {
                RGBFTYPE t = (RGBFTYPE)i;
@@ -1293,7 +1299,7 @@ DisplaySurface *qemu_console_surface(QemuConsole *con)
        return &gb->gfxsurface;
 }
 
-void gfxboard_resize(int width, int height, void *p)
+void gfxboard_resize(int width, int height, int hmult, int vmult, void *p)
 {
        struct rtggfxboard *gb = (struct rtggfxboard *)p;
        if (width != gb->vga_width || gb->vga_height != height) {
@@ -1301,6 +1307,8 @@ void gfxboard_resize(int width, int height, void *p)
        }
        gb->vga_width = width;
        gb->vga_height = height;
+       gb->vga_width_mult = hmult;
+       gb->vga_height_mult = vmult;
 }
 
 void qemu_console_resize(QemuConsole *con, int width, int height)
@@ -1311,6 +1319,8 @@ void qemu_console_resize(QemuConsole *con, int width, int height)
        }
        gb->vga_width = width;
        gb->vga_height = height;
+       gb->vga_width_mult = 1;
+       gb->vga_height_mult = 1;
 }
 
 void linear_memory_region_set_dirty(MemoryRegion *mr, hwaddr addr, hwaddr size)
@@ -2589,7 +2599,7 @@ static void copyvrambank(addrbank *dst, const addrbank *src, bool unsafe)
        if (unsafe) {
                dst->jit_read_flag |= S_READ | S_N_ADDR;
                dst->jit_write_flag |= S_WRITE | S_N_ADDR;
-               dst->flags |= ABFLAG_PPCIOSPACE;
+               dst->flags |= ABFLAG_ALLOCINDIRECT | ABFLAG_PPCIOSPACE;
        }
 }
 
@@ -2616,7 +2626,7 @@ static void REGPARAM2 gfxboard_wput_mem_autoconfig (uaecptr addr, uae_u32 b)
                        }
                }
                init_board(gb);
-               copyvrambank(&gb->gfxboard_bank_memory, gb->gfxmem_bank, false);
+               copyvrambank(&gb->gfxboard_bank_memory, gb->gfxmem_bank, true);
                copyvrambank(&gb->gfxboard_bank_vram_pcem, gb->gfxmem_bank, true);
                if (ISP4() && !gb->board->pcemdev) {
                        if (validate_banks_z3(&gb->gfxboard_bank_memory, gb->gfxmem_bank->start >> 16, expamem_board_size >> 16)) {
index 81990ed48dba598b17514a48b2e369f1e51911bd..799ba0e81271ed3187193867b8d262407c2e78ae 100644 (file)
@@ -34,7 +34,7 @@ extern bool gfxboard_rtg_enable_initial(int monid, int);
 extern void gfxboard_rtg_disable(int monid, int);
 extern bool gfxboard_init_board(struct autoconfig_info*);
 extern bool gfxboard_set(int monid, bool rtg);
-extern void gfxboard_resize(int width, int height, void *p);
+extern void gfxboard_resize(int width, int height, int hmult, int vmult, void *p);
 
 uae_u8 *gfxboard_getrtgbuffer(int monid, int *widthp, int *heightp, int *pitch, int *depth, uae_u8 *palette);
 void gfxboard_freertgbuffer(int monid, uae_u8 *dst);
@@ -88,6 +88,7 @@ struct gfxboard_mode
        int height;
        RGBFTYPE mode;
        bool redraw_required;
+       int hlinedbl, vlinedbl;
 };
 
 typedef bool(*GFXBOARD_INIT)(struct autoconfig_info*);
index 0ecf4e9d46e98b8fba405673e493feba4d0708af..51964aa8bb629d4bc435f2cf5443affaf3646155 100644 (file)
@@ -796,6 +796,8 @@ static bool tms_vsync(void *userdata, struct gfxboard_mode *mode)
        if (data->a2410_visible) {
                mode->width = data->a2410_width;
                mode->height = data->a2410_height;
+               mode->hlinedbl = 1;
+               mode->vlinedbl = 1;
                mode->mode = RGBFB_CLUT;
        }
 
index 2ff52c1d9a7d832bd5c40fcf23e456a489a4c49d..307c9ff933a70280c84e360abaeb3f627835c72d 100644 (file)
@@ -2806,6 +2806,8 @@ static uae_u32 REGPARAM2 picasso_SetSwitch (TrapContext *ctx)
                state->GC_Depth = 8;
                state->GC_Flags = 0;
                state->BytesPerPixel = 1;
+               state->HLineDBL = 1;
+               state->VLineDBL = 1;
                state->HostAddress = NULL;
                delayed_set_switch = true;
                atomic_or(&vidinfo->picasso_state_change, PICASSO_STATE_SETGC);
@@ -2993,6 +2995,9 @@ static uae_u32 REGPARAM2 picasso_SetGC (TrapContext *ctx)
        state->GC_Depth = trap_get_byte(ctx, modeinfo + PSSO_ModeInfo_Depth);
        state->GC_Flags = trap_get_byte(ctx, modeinfo + PSSO_ModeInfo_Flags);
 
+       state->HLineDBL = 1;
+       state->VLineDBL = 1;
+
        P96TRACE_SETUP((_T("SetGC(%d,%d,%d,%d)\n"), state->Width, state->Height, state->GC_Depth, border));
 
        state->HostAddress = NULL;
@@ -6668,6 +6673,8 @@ uae_u8 *restore_p96 (uae_u8 *src)
                }
        }
        state->HostAddress = NULL;
+       state->HLineDBL = 1;
+       state->VLineDBL = 1;
        picasso_SetPanningInit(state);
        state->Extent = state->Address + state->BytesPerRow * state->VirtualHeight;
        return src;
index b61d23b1bfed56c5204ea821d27ec0a02b7b8168..4221af5c67d8f0b8cbb6c23a6bb5fbe5bd26c568 100644 (file)
@@ -637,6 +637,7 @@ struct picasso96_state_struct
     // must be in memory
     long               XYOffset;
     bool        dualclut;
+    int         HLineDBL, VLineDBL;
 };
 
 extern void InitPicasso96(int monid);
index 31b34d1a91ecf84640bdfff5c252ef0401299e60..871c6db04c91019d8264de0d81dbaf042212512b 100644 (file)
@@ -1799,8 +1799,12 @@ void getrtgfilterrect2(int monid, RECT *sr, RECT *dr, RECT *zr, int dst_width, i
        }
 
        OffsetRect (zr, picasso_offset_x, picasso_offset_y);
-       picasso_offset_mx = (float)srcwidth * mx / (dr->right - dr->left);
-       picasso_offset_my = (float)srcheight * my / (dr->bottom - dr->top);
+
+       picasso_offset_x /= state->HLineDBL;
+       picasso_offset_y /= state->VLineDBL;
+
+       picasso_offset_mx = (float)(srcwidth * mx * state->HLineDBL) / (dr->right - dr->left);
+       picasso_offset_my = (float)(srcheight * my * state->VLineDBL) / (dr->bottom - dr->top);
 }
 
 static uae_u8 *gfx_lock_picasso2(int monid, bool fullupdate)
index c4afe4ddbf375fc3f20912fbdf24f14161a50686..a4d405e7b6f869c493b98745f5243415743925f4 100644 (file)
@@ -489,7 +489,7 @@ void endblit();
 
 void set_window_title(const char *s);
 
-void updatewindowsize(int x, int y);
+void updatewindowsize(int x, int mx, int y, int my);
 
 void initpc(int argc, char *argv[]);
 void runpc();
index b279f94c383c5e5ecf80a0fa6f853b8f94c3dfc1..6e7c7af6c23ff8763f8cb7426618428be89e0623 100644 (file)
@@ -662,9 +662,10 @@ void video_wait_for_buffer(void)
 {
        //write_log(_T("video_wait_for_buffer\n"));
 }
-void updatewindowsize(int x, int y)
+void updatewindowsize(int x, int mx, int y, int my)
 {
-       gfxboard_resize(x, y, gfxboard_priv);
+       x *= mx;
+       gfxboard_resize(x, y, mx, my, gfxboard_priv);
 }
 
 static void (*pci_card_write)(int func, int addr, uint8_t val, void *priv);
index c925b3257f5b5670a8899ef736354a8529f43038..1b3221929349a70fa6f322a00377031c4791e344 100644 (file)
@@ -1457,7 +1457,7 @@ void svga_doblit(int y1, int y2, int wx, int wy, svga_t *svga)
                 if (xsize<128) xsize=0;
                 if (ysize<32) ysize=0;
 
-                updatewindowsize(xsize * (svga->horizontal_linedbl ? 2 : 1), ysize * (svga->vertical_linedbl ? 2 : 1));
+                updatewindowsize(xsize,  svga->horizontal_linedbl ? 2 : 1, ysize, svga->linedbl ? 2 : 1);
         }
         if (vid_resize)
         {