PCem

changeset 18:b23d087f2489

Direct3D video output. Fixed redraw when DirectDraw/Direct3D device is lost.
author TomW
date Tue Aug 13 19:20:28 2013 +0100
parents 5fabef03e81b
children 925de5938e9a
files src/Makefile.mingw src/device.c src/device.h src/ibm.h src/pc.c src/pc.rc src/resources.h src/sis496.c src/sound_adlib.c src/sound_adlibgold.c src/sound_cms.c src/sound_gus.c src/sound_pas16.c src/sound_sb.c src/sound_sn76489.c src/sound_wss.c src/vid_ati18800.c src/vid_ati28800.c src/vid_ati_mach64.c src/vid_cga.c src/vid_cl5429.c src/vid_ega.c src/vid_et4000.c src/vid_et4000w32.c src/vid_hercules.c src/vid_mda.c src/vid_olivetti_m24.c src/vid_oti067.c src/vid_paradise.c src/vid_pc1512.c src/vid_pc1640.c src/vid_pc200.c src/vid_s3.c src/vid_s3_virge.c src/vid_svga.c src/vid_tandy.c src/vid_tvga.c src/vid_vga.c src/video.h src/win-d3d.cc src/win-d3d.h src/win-ddraw.cc src/win.c
diffstat 43 files changed, 528 insertions(+), 192 deletions(-) [+]
line diff
     1.1 --- a/src/Makefile.mingw	Sat Aug 03 21:04:33 2013 +0100
     1.2 +++ b/src/Makefile.mingw	Tue Aug 13 19:20:28 2013 +0100
     1.3 @@ -18,12 +18,12 @@
     1.4  	vid_oti067.o vid_paradise.o vid_pc1512.o vid_pc1640.o vid_pc200.o vid_s3.o \
     1.5  	vid_s3_virge.o vid_sdac_ramdac.o vid_stg_ramdac.o vid_svga.o vid_svga_render.o \
     1.6  	vid_tandy.o vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o \
     1.7 -	vid_voodoo.o video.o wd76c10.o win.o win-ddraw.o win-keyboard.o win-midi.o \
     1.8 +	vid_voodoo.o video.o wd76c10.o win.o win-d3d.o win-ddraw.o win-keyboard.o win-midi.o \
     1.9  	win-mouse.o win-timer.o win-video.o x86seg.o x87.o xtide.o pc.res
    1.10  FMOBJ = fmopl.o ymf262.o
    1.11  
    1.12  
    1.13 -LIBS = -mwindows -lwinmm -lalut -lopenal32 -lddraw -ldinput -ldxguid
    1.14 +LIBS = -mwindows -lwinmm -lalut -lopenal32 -lddraw -ldinput -ldxguid -ld3d9
    1.15  
    1.16  PCem.exe: $(OBJ) $(FMOBJ)
    1.17  	$(CC) $(OBJ) $(FMOBJ) -o "PCem.exe" $(LIBS)
     2.1 --- a/src/device.c	Sat Aug 03 21:04:33 2013 +0100
     2.2 +++ b/src/device.c	Tue Aug 13 19:20:28 2013 +0100
     2.3 @@ -58,6 +58,22 @@
     2.4          }
     2.5  }
     2.6  
     2.7 +void device_force_redraw()
     2.8 +{
     2.9 +        int c;
    2.10 +        
    2.11 +        for (c = 0; c < 256; c++)
    2.12 +        {
    2.13 +                if (devices[c] != NULL)
    2.14 +                {
    2.15 +                        if (devices[c]->force_redraw != NULL)
    2.16 +                        {
    2.17 +                                devices[c]->force_redraw(device_priv[c]);
    2.18 +                        }
    2.19 +                }
    2.20 +        }
    2.21 +}
    2.22 +
    2.23  char *device_add_status_info(char *s, int max_len)
    2.24  {
    2.25          int c;
     3.1 --- a/src/device.h	Sat Aug 03 21:04:33 2013 +0100
     3.2 +++ b/src/device.h	Tue Aug 13 19:20:28 2013 +0100
     3.3 @@ -4,6 +4,7 @@
     3.4          void *(*init)();
     3.5          void (*close)(void *p);
     3.6          void (*speed_changed)(void *p);
     3.7 +        void (*force_redraw)(void *p);
     3.8          int  (*add_status_info)(char *s, int max_len, void *p);
     3.9  } device_t;
    3.10  
    3.11 @@ -11,4 +12,5 @@
    3.12  void device_add(device_t *d);
    3.13  void device_close_all();
    3.14  void device_speed_changed();
    3.15 +void device_force_redraw();
    3.16  char *device_add_status_info(char *s, int max_len);
     4.1 --- a/src/ibm.h	Sat Aug 03 21:04:33 2013 +0100
     4.2 +++ b/src/ibm.h	Tue Aug 13 19:20:28 2013 +0100
     4.3 @@ -367,6 +367,7 @@
     4.4  extern int egareads,egawrites;
     4.5  extern int cga_comp;
     4.6  extern int vid_resize;
     4.7 +extern int vid_api;
     4.8  extern int winsizex,winsizey;
     4.9  extern int chain4;
    4.10  
     5.1 --- a/src/pc.c	Sat Aug 03 21:04:33 2013 +0100
     5.2 +++ b/src/pc.c	Tue Aug 13 19:20:28 2013 +0100
     5.3 @@ -35,7 +35,7 @@
     5.4  int cdrom_enabled;
     5.5  int CPUID;
     5.6  int kb_win;
     5.7 -int vid_resize;
     5.8 +int vid_resize, vid_api;
     5.9  
    5.10  int cycles_lost = 0;
    5.11  
    5.12 @@ -203,7 +203,6 @@
    5.13          atfullspeed=0;
    5.14  
    5.15          device_init();        
    5.16 -        pclog("Initvideo\n");
    5.17          
    5.18          initvideo();
    5.19          mem_init();
    5.20 @@ -264,7 +263,6 @@
    5.21          mem_resize();
    5.22          fdc_init();
    5.23          model_init();
    5.24 -        pclog("Video_init\n");
    5.25          video_init();
    5.26          speaker_init();        
    5.27          sound_card_init(sound_card_current);
    5.28 @@ -312,6 +310,8 @@
    5.29  {
    5.30          char s[200];
    5.31          int done=0;
    5.32 +
    5.33 +        startblit();
    5.34          clockrate = models[model].cpu[cpu_manufacturer].cpus[cpu].rspeed;
    5.35                  if (is386)   exec386(models[model].cpu[cpu_manufacturer].cpus[cpu].rspeed / 100);
    5.36                  else if (AT) exec386(models[model].cpu[cpu_manufacturer].cpus[cpu].rspeed / 100);
    5.37 @@ -320,6 +320,8 @@
    5.38                  keyboard_process();
    5.39  //                checkkeys();
    5.40                  pollmouse();
    5.41 +        endblit();
    5.42 +
    5.43                  framecountx++;
    5.44                  framecount++;
    5.45                  if (framecountx>=100)
    5.46 @@ -461,6 +463,7 @@
    5.47          
    5.48          kb_win = get_config_int(NULL, "kb_win", 0);
    5.49          vid_resize = get_config_int(NULL, "vid_resize", 0);
    5.50 +        vid_api = get_config_int(NULL, "vid_api", 0);
    5.51  
    5.52          hdc[0].spt = get_config_int(NULL, "hdc_sectors", 0);
    5.53          hdc[0].hpc = get_config_int(NULL, "hdc_heads", 0);
    5.54 @@ -501,6 +504,7 @@
    5.55          set_config_int(NULL, "cdrom_enabled", cdrom_enabled);
    5.56          set_config_int(NULL, "kb_win", kb_win);
    5.57          set_config_int(NULL, "vid_resize", vid_resize);
    5.58 +        set_config_int(NULL, "vid_api", vid_api);
    5.59          
    5.60          set_config_int(NULL, "hdc_sectors", hdc[0].spt);
    5.61          set_config_int(NULL, "hdc_heads", hdc[0].hpc);
     6.1 --- a/src/pc.rc	Sat Aug 03 21:04:33 2013 +0100
     6.2 +++ b/src/pc.rc	Tue Aug 13 19:20:28 2013 +0100
     6.3 @@ -27,6 +27,9 @@
     6.4                  POPUP "&Video"
     6.5                  BEGIN
     6.6                          MENUITEM "&Resizeable window",IDM_VID_RESIZE
     6.7 +                        MENUITEM SEPARATOR
     6.8 +                        MENUITEM "&DirectDraw", IDM_VID_DDRAW
     6.9 +                        MENUITEM "Direct&3D",   IDM_VID_D3D
    6.10                  END
    6.11          END
    6.12          POPUP "&Misc"
     7.1 --- a/src/resources.h	Sat Aug 03 21:04:33 2013 +0100
     7.2 +++ b/src/resources.h	Tue Aug 13 19:20:28 2013 +0100
     7.3 @@ -11,6 +11,8 @@
     7.4  #define IDM_KEY_ALLEGRO 40040
     7.5  #define IDM_KEY_WINDOWS 40041
     7.6  #define IDM_VID_RESIZE  40050
     7.7 +#define IDM_VID_DDRAW   40060
     7.8 +#define IDM_VID_D3D     40061
     7.9  #define IDM_CDROM_EMPTY 40100
    7.10  #define IDM_CDROM_REAL  40100
    7.11  #define IDM_CDROM_DISABLED 40200
    7.12 @@ -57,3 +59,5 @@
    7.13  #define IDC_STEXT7 1106
    7.14  #define IDC_STEXT8 1107
    7.15  #define IDC_STEXT_DEVICE 1108
    7.16 +
    7.17 +#define WM_RESETD3D WM_USER
     8.1 --- a/src/sis496.c	Sat Aug 03 21:04:33 2013 +0100
     8.2 +++ b/src/sis496.c	Tue Aug 13 19:20:28 2013 +0100
     8.3 @@ -133,5 +133,6 @@
     8.4          sis496_init,
     8.5          sis496_close,
     8.6          NULL,
     8.7 +        NULL,
     8.8          NULL
     8.9  };
     9.1 --- a/src/sound_adlib.c	Sat Aug 03 21:04:33 2013 +0100
     9.2 +++ b/src/sound_adlib.c	Tue Aug 13 19:20:28 2013 +0100
     9.3 @@ -59,5 +59,6 @@
     9.4          adlib_init,
     9.5          adlib_close,
     9.6          NULL,
     9.7 +        NULL,
     9.8          NULL
     9.9  };
    10.1 --- a/src/sound_adlibgold.c	Sat Aug 03 21:04:33 2013 +0100
    10.2 +++ b/src/sound_adlibgold.c	Tue Aug 13 19:20:28 2013 +0100
    10.3 @@ -594,5 +594,6 @@
    10.4          adgold_init,
    10.5          adgold_close,
    10.6          NULL,
    10.7 +        NULL,
    10.8          NULL
    10.9  };
    11.1 --- a/src/sound_cms.c	Sat Aug 03 21:04:33 2013 +0100
    11.2 +++ b/src/sound_cms.c	Tue Aug 13 19:20:28 2013 +0100
    11.3 @@ -176,5 +176,6 @@
    11.4          cms_init,
    11.5          cms_close,
    11.6          NULL,
    11.7 +        NULL,
    11.8          NULL
    11.9  };
    12.1 --- a/src/sound_gus.c	Sat Aug 03 21:04:33 2013 +0100
    12.2 +++ b/src/sound_gus.c	Tue Aug 13 19:20:28 2013 +0100
    12.3 @@ -1104,5 +1104,6 @@
    12.4          gus_init,
    12.5          gus_close,
    12.6          gus_speed_changed,
    12.7 +        NULL,
    12.8          NULL
    12.9  };
    13.1 --- a/src/sound_pas16.c	Sat Aug 03 21:04:33 2013 +0100
    13.2 +++ b/src/sound_pas16.c	Tue Aug 13 19:20:28 2013 +0100
    13.3 @@ -750,5 +750,6 @@
    13.4          pas16_init,
    13.5          pas16_close,
    13.6          NULL,
    13.7 +        NULL,
    13.8          NULL
    13.9  };
    14.1 --- a/src/sound_sb.c	Sat Aug 03 21:04:33 2013 +0100
    14.2 +++ b/src/sound_sb.c	Tue Aug 13 19:20:28 2013 +0100
    14.3 @@ -430,6 +430,7 @@
    14.4          sb_1_init,
    14.5          sb_close,
    14.6          sb_speed_changed,
    14.7 +        NULL,
    14.8          NULL
    14.9  };
   14.10  device_t sb_15_device =
   14.11 @@ -438,6 +439,7 @@
   14.12          sb_15_init,
   14.13          sb_close,
   14.14          sb_speed_changed,
   14.15 +        NULL,
   14.16          NULL
   14.17  };
   14.18  device_t sb_2_device =
   14.19 @@ -446,6 +448,7 @@
   14.20          sb_2_init,
   14.21          sb_close,
   14.22          sb_speed_changed,
   14.23 +        NULL,
   14.24          NULL
   14.25  };
   14.26  device_t sb_pro_v1_device =
   14.27 @@ -454,6 +457,7 @@
   14.28          sb_pro_v1_init,
   14.29          sb_close,
   14.30          sb_speed_changed,
   14.31 +        NULL,
   14.32          NULL
   14.33  };
   14.34  device_t sb_pro_v2_device =
   14.35 @@ -462,6 +466,7 @@
   14.36          sb_pro_v2_init,
   14.37          sb_close,
   14.38          sb_speed_changed,
   14.39 +        NULL,
   14.40          NULL
   14.41  };
   14.42  device_t sb_16_device =
   14.43 @@ -470,6 +475,7 @@
   14.44          sb_16_init,
   14.45          sb_close,
   14.46          sb_speed_changed,
   14.47 +        NULL,
   14.48          NULL
   14.49  };
   14.50  device_t sb_awe32_device =
   14.51 @@ -478,5 +484,6 @@
   14.52          sb_awe32_init,
   14.53          sb_close,
   14.54          sb_speed_changed,
   14.55 +        NULL,
   14.56          NULL
   14.57  };
    15.1 --- a/src/sound_sn76489.c	Sat Aug 03 21:04:33 2013 +0100
    15.2 +++ b/src/sound_sn76489.c	Tue Aug 13 19:20:28 2013 +0100
    15.3 @@ -195,5 +195,6 @@
    15.4          sn76489_init,
    15.5          sn76489_close,
    15.6          NULL,
    15.7 +        NULL,
    15.8          NULL
    15.9  };
    16.1 --- a/src/sound_wss.c	Sat Aug 03 21:04:33 2013 +0100
    16.2 +++ b/src/sound_wss.c	Tue Aug 13 19:20:28 2013 +0100
    16.3 @@ -304,5 +304,6 @@
    16.4          wss_init,
    16.5          wss_close,
    16.6          NULL,
    16.7 +        NULL,
    16.8          NULL
    16.9  };
    17.1 --- a/src/vid_ati18800.c	Sat Aug 03 21:04:33 2013 +0100
    17.2 +++ b/src/vid_ati18800.c	Tue Aug 13 19:20:28 2013 +0100
    17.3 @@ -152,12 +152,20 @@
    17.4          svga_recalctimings(&ati18800->svga);
    17.5  }
    17.6  
    17.7 +void ati18800_force_redraw(void *p)
    17.8 +{
    17.9 +        ati18800_t *ati18800 = (ati18800_t *)p;
   17.10 +
   17.11 +        ati18800->svga.fullchange = changeframecount;
   17.12 +}
   17.13 +
   17.14  device_t ati18800_device =
   17.15  {
   17.16          "ATI-18800",
   17.17          ati18800_init,
   17.18          ati18800_close,
   17.19          ati18800_speed_changed,
   17.20 +        ati18800_force_redraw,
   17.21          svga_add_status_info
   17.22  };
   17.23  
    18.1 --- a/src/vid_ati28800.c	Sat Aug 03 21:04:33 2013 +0100
    18.2 +++ b/src/vid_ati28800.c	Tue Aug 13 19:20:28 2013 +0100
    18.3 @@ -173,11 +173,19 @@
    18.4          svga_recalctimings(&ati28800->svga);
    18.5  }
    18.6  
    18.7 +void ati28800_force_redraw(void *p)
    18.8 +{
    18.9 +        ati28800_t *ati28800 = (ati28800_t *)p;
   18.10 +
   18.11 +        ati28800->svga.fullchange = changeframecount;
   18.12 +}
   18.13 +
   18.14  device_t ati28800_device =
   18.15  {
   18.16          "ATI-28800",
   18.17          ati28800_init,
   18.18          ati28800_close,
   18.19          ati28800_speed_changed,
   18.20 +        ati28800_force_redraw,
   18.21          svga_add_status_info
   18.22  };
    19.1 --- a/src/vid_ati_mach64.c	Sat Aug 03 21:04:33 2013 +0100
    19.2 +++ b/src/vid_ati_mach64.c	Tue Aug 13 19:20:28 2013 +0100
    19.3 @@ -1848,11 +1848,19 @@
    19.4          svga_recalctimings(&mach64->svga);
    19.5  }
    19.6  
    19.7 +void mach64_force_redraw(void *p)
    19.8 +{
    19.9 +        mach64_t *mach64 = (mach64_t *)p;
   19.10 +
   19.11 +        mach64->svga.fullchange = changeframecount;
   19.12 +}
   19.13 +
   19.14  device_t mach64gx_device =
   19.15  {
   19.16          "ATI Mach64GX",
   19.17          mach64gx_init,
   19.18          mach64_close,
   19.19          mach64_speed_changed,
   19.20 +        mach64_force_redraw,
   19.21          svga_add_status_info
   19.22  };
    20.1 --- a/src/vid_cga.c	Sat Aug 03 21:04:33 2013 +0100
    20.2 +++ b/src/vid_cga.c	Tue Aug 13 19:20:28 2013 +0100
    20.3 @@ -523,5 +523,6 @@
    20.4          cga_standalone_init,
    20.5          cga_close,
    20.6          cga_speed_changed,
    20.7 +        NULL,
    20.8          NULL
    20.9  };
    21.1 --- a/src/vid_cl5429.c	Sat Aug 03 21:04:33 2013 +0100
    21.2 +++ b/src/vid_cl5429.c	Tue Aug 13 19:20:28 2013 +0100
    21.3 @@ -834,11 +834,19 @@
    21.4          svga_recalctimings(&gd5429->svga);
    21.5  }
    21.6  
    21.7 +void gd5429_force_redraw(void *p)
    21.8 +{
    21.9 +        gd5429_t *gd5429 = (gd5429_t *)p;
   21.10 +
   21.11 +        gd5429->svga.fullchange = changeframecount;
   21.12 +}
   21.13 +
   21.14  device_t gd5429_device =
   21.15  {
   21.16          "Cirrus Logic GD5429",
   21.17          gd5429_init,
   21.18          gd5429_close,
   21.19          gd5429_speed_changed,
   21.20 +        gd5429_force_redraw,
   21.21          svga_add_status_info
   21.22  };
    22.1 --- a/src/vid_ega.c	Sat Aug 03 21:04:33 2013 +0100
    22.2 +++ b/src/vid_ega.c	Tue Aug 13 19:20:28 2013 +0100
    22.3 @@ -840,5 +840,6 @@
    22.4          ega_standalone_init,
    22.5          ega_close,
    22.6          ega_speed_changed,
    22.7 +        NULL,
    22.8          NULL
    22.9  };
    23.1 --- a/src/vid_et4000.c	Sat Aug 03 21:04:33 2013 +0100
    23.2 +++ b/src/vid_et4000.c	Tue Aug 13 19:20:28 2013 +0100
    23.3 @@ -146,11 +146,19 @@
    23.4          svga_recalctimings(&et4000->svga);
    23.5  }
    23.6  
    23.7 +void et4000_force_redraw(void *p)
    23.8 +{
    23.9 +        et4000_t *et4000 = (et4000_t *)p;
   23.10 +
   23.11 +        et4000->svga.fullchange = changeframecount;
   23.12 +}
   23.13 +
   23.14  device_t et4000_device =
   23.15  {
   23.16          "Tseng Labs ET4000AX",
   23.17          et4000_init,
   23.18          et4000_close,
   23.19          et4000_speed_changed,
   23.20 +        et4000_force_redraw,
   23.21          svga_add_status_info
   23.22  };
    24.1 --- a/src/vid_et4000w32.c	Sat Aug 03 21:04:33 2013 +0100
    24.2 +++ b/src/vid_et4000w32.c	Tue Aug 13 19:20:28 2013 +0100
    24.3 @@ -965,11 +965,19 @@
    24.4          svga_recalctimings(&et4000->svga);
    24.5  }
    24.6  
    24.7 +void et4000w32p_force_redraw(void *p)
    24.8 +{
    24.9 +        et4000w32p_t *et4000w32p = (et4000w32p_t *)p;
   24.10 +
   24.11 +        et4000w32p->svga.fullchange = changeframecount;
   24.12 +}
   24.13 +
   24.14  device_t et4000w32p_device =
   24.15  {
   24.16          "Tseng Labs ET4000/w32p",
   24.17          et4000w32p_init,
   24.18          et4000w32p_close,
   24.19          et4000w32p_speed_changed,
   24.20 +        et4000w32p_force_redraw,
   24.21          svga_add_status_info
   24.22  };
    25.1 --- a/src/vid_hercules.c	Sat Aug 03 21:04:33 2013 +0100
    25.2 +++ b/src/vid_hercules.c	Tue Aug 13 19:20:28 2013 +0100
    25.3 @@ -354,5 +354,6 @@
    25.4          hercules_init,
    25.5          hercules_close,
    25.6          hercules_speed_changed,
    25.7 +        NULL,
    25.8          NULL
    25.9  };
    26.1 --- a/src/vid_mda.c	Sat Aug 03 21:04:33 2013 +0100
    26.2 +++ b/src/vid_mda.c	Tue Aug 13 19:20:28 2013 +0100
    26.3 @@ -312,5 +312,6 @@
    26.4          mda_init,
    26.5          mda_close,
    26.6          mda_speed_changed,
    26.7 +        NULL,
    26.8          NULL
    26.9  };
    27.1 --- a/src/vid_olivetti_m24.c	Sat Aug 03 21:04:33 2013 +0100
    27.2 +++ b/src/vid_olivetti_m24.c	Tue Aug 13 19:20:28 2013 +0100
    27.3 @@ -483,5 +483,6 @@
    27.4          m24_init,
    27.5          m24_close,
    27.6          m24_speed_changed,
    27.7 +        NULL,
    27.8          NULL
    27.9  };
    28.1 --- a/src/vid_oti067.c	Sat Aug 03 21:04:33 2013 +0100
    28.2 +++ b/src/vid_oti067.c	Tue Aug 13 19:20:28 2013 +0100
    28.3 @@ -141,11 +141,19 @@
    28.4          svga_recalctimings(&oti067->svga);
    28.5  }
    28.6          
    28.7 +void oti067_force_redraw(void *p)
    28.8 +{
    28.9 +        oti067_t *oti067 = (oti067_t *)p;
   28.10 +
   28.11 +        oti067->svga.fullchange = changeframecount;
   28.12 +}
   28.13 +
   28.14  device_t oti067_device =
   28.15  {
   28.16          "Oak OTI-067",
   28.17          oti067_init,
   28.18          oti067_close,
   28.19          oti067_speed_changed,
   28.20 +        oti067_force_redraw,
   28.21          svga_add_status_info
   28.22  };
    29.1 --- a/src/vid_paradise.c	Sat Aug 03 21:04:33 2013 +0100
    29.2 +++ b/src/vid_paradise.c	Tue Aug 13 19:20:28 2013 +0100
    29.3 @@ -319,12 +319,20 @@
    29.4          svga_recalctimings(&paradise->svga);
    29.5  }
    29.6  
    29.7 +void paradise_force_redraw(void *p)
    29.8 +{
    29.9 +        paradise_t *paradise = (paradise_t *)p;
   29.10 +
   29.11 +        paradise->svga.fullchange = changeframecount;
   29.12 +}
   29.13 +
   29.14  device_t paradise_pvga1a_device =
   29.15  {
   29.16          "Paradise PVGA1A",
   29.17          paradise_pvga1a_init,
   29.18          paradise_close,
   29.19          paradise_speed_changed,
   29.20 +        paradise_force_redraw,
   29.21          svga_add_status_info
   29.22  };
   29.23  device_t paradise_wd90c11_device =
   29.24 @@ -333,5 +341,6 @@
   29.25          paradise_wd90c11_init,
   29.26          paradise_close,
   29.27          paradise_speed_changed,
   29.28 +        paradise_force_redraw,
   29.29          svga_add_status_info
   29.30  };
    30.1 --- a/src/vid_pc1512.c	Sat Aug 03 21:04:33 2013 +0100
    30.2 +++ b/src/vid_pc1512.c	Tue Aug 13 19:20:28 2013 +0100
    30.3 @@ -482,5 +482,6 @@
    30.4          pc1512_init,
    30.5          pc1512_close,
    30.6          pc1512_speed_changed,
    30.7 +        NULL,
    30.8          NULL
    30.9  };
    31.1 --- a/src/vid_pc1640.c	Sat Aug 03 21:04:33 2013 +0100
    31.2 +++ b/src/vid_pc1640.c	Tue Aug 13 19:20:28 2013 +0100
    31.3 @@ -141,5 +141,6 @@
    31.4          pc1640_init,
    31.5          pc1640_close,
    31.6          pc1640_speed_changed,
    31.7 +        NULL,
    31.8          NULL
    31.9  };
    32.1 --- a/src/vid_pc200.c	Sat Aug 03 21:04:33 2013 +0100
    32.2 +++ b/src/vid_pc200.c	Tue Aug 13 19:20:28 2013 +0100
    32.3 @@ -135,5 +135,6 @@
    32.4          pc200_init,
    32.5          pc200_close,
    32.6          pc200_speed_changed,
    32.7 +        NULL,
    32.8          NULL
    32.9  };
    33.1 --- a/src/vid_s3.c	Sat Aug 03 21:04:33 2013 +0100
    33.2 +++ b/src/vid_s3.c	Tue Aug 13 19:20:28 2013 +0100
    33.3 @@ -1605,12 +1605,20 @@
    33.4          svga_recalctimings(&s3->svga);
    33.5  }
    33.6  
    33.7 +void s3_force_redraw(void *p)
    33.8 +{
    33.9 +        s3_t *s3 = (s3_t *)p;
   33.10 +
   33.11 +        s3->svga.fullchange = changeframecount;
   33.12 +}
   33.13 +
   33.14  device_t s3_bahamas64_device =
   33.15  {
   33.16          "Paradise Bahamas 64 (S3 Vision864)",
   33.17          s3_bahamas64_init,
   33.18          s3_close,
   33.19          s3_speed_changed,
   33.20 +        s3_force_redraw,
   33.21          svga_add_status_info
   33.22  };
   33.23  
   33.24 @@ -1620,5 +1628,6 @@
   33.25          s3_9fx_init,
   33.26          s3_close,
   33.27          s3_speed_changed,
   33.28 +        s3_force_redraw,
   33.29          svga_add_status_info
   33.30  };
    34.1 --- a/src/vid_s3_virge.c	Sat Aug 03 21:04:33 2013 +0100
    34.2 +++ b/src/vid_s3_virge.c	Tue Aug 13 19:20:28 2013 +0100
    34.3 @@ -490,11 +490,19 @@
    34.4          svga_recalctimings(&virge->svga);
    34.5  }
    34.6  
    34.7 +void s3_virge_force_redraw(void *p)
    34.8 +{
    34.9 +        virge_t *virge = (virge_t *)p;
   34.10 +
   34.11 +        virge->svga.fullchange = changeframecount;
   34.12 +}
   34.13 +
   34.14  device_t s3_virge_device =
   34.15  {
   34.16          "Diamond Stealth 3D 2000 (S3 VIRGE)",
   34.17          s3_virge_init,
   34.18          s3_virge_close,
   34.19          s3_virge_speed_changed,
   34.20 +        s3_virge_force_redraw,
   34.21          svga_add_status_info
   34.22  };
    35.1 --- a/src/vid_svga.c	Sat Aug 03 21:04:33 2013 +0100
    35.2 +++ b/src/vid_svga.c	Tue Aug 13 19:20:28 2013 +0100
    35.3 @@ -1116,16 +1116,15 @@
    35.4  
    35.5  void svga_doblit(int y1, int y2, int wx, int wy, svga_t *svga)
    35.6  {
    35.7 +        pclog("svga_doblit start\n");
    35.8          svga->frames++;
    35.9  //        pclog("doblit %i %i\n", y1, y2);
   35.10          if (y1 > y2) 
   35.11          {
   35.12 -                startblit();
   35.13                  video_blit_memtoscreen(32, 0, 0, 0, xsize, ysize);
   35.14 -                endblit();
   35.15                  return;   
   35.16          }     
   35.17 -        startblit();
   35.18 +
   35.19          if ((wx!=xsize || wy!=ysize) && !vid_resize)
   35.20          {
   35.21                  xsize=wx;
   35.22 @@ -1141,9 +1140,8 @@
   35.23                  ysize = wy + 1;
   35.24          }
   35.25          video_blit_memtoscreen(32, 0, y1, y2, xsize, ysize);
   35.26 -        if (readflash) rectfill(screen,winsizex-40,8,winsizex-8,14,0xFFFFFFFF);
   35.27 -        endblit();
   35.28 -        
   35.29 +        if (readflash) rectfill(screen,winsizex-40,8,winsizex-8,14,0xFFFFFFFF);      
   35.30 +        pclog("svga_doblit end\n");
   35.31  }
   35.32  
   35.33  void svga_writew(uint32_t addr, uint16_t val, void *p)
    36.1 --- a/src/vid_tandy.c	Sat Aug 03 21:04:33 2013 +0100
    36.2 +++ b/src/vid_tandy.c	Tue Aug 13 19:20:28 2013 +0100
    36.3 @@ -692,5 +692,6 @@
    36.4          tandy_init,
    36.5          tandy_close,
    36.6          tandy_speed_changed,
    36.7 +        NULL,
    36.8          NULL
    36.9  };
    37.1 --- a/src/vid_tvga.c	Sat Aug 03 21:04:33 2013 +0100
    37.2 +++ b/src/vid_tvga.c	Tue Aug 13 19:20:28 2013 +0100
    37.3 @@ -420,12 +420,20 @@
    37.4          svga_recalctimings(&tvga->svga);
    37.5  }
    37.6  
    37.7 +void tvga_force_redraw(void *p)
    37.8 +{
    37.9 +        tvga_t *tvga = (tvga_t *)p;
   37.10 +
   37.11 +        tvga->svga.fullchange = changeframecount;
   37.12 +}
   37.13 +
   37.14  device_t tvga8900d_device =
   37.15  {
   37.16          "Trident TVGA 8900D",
   37.17          tvga8900d_init,
   37.18          tvga_close,
   37.19          tvga_speed_changed,
   37.20 +        tvga_force_redraw,
   37.21          svga_add_status_info
   37.22  };
   37.23  device_t tgui9440_device =
   37.24 @@ -434,6 +442,7 @@
   37.25          tgui9440_init,
   37.26          tvga_close,
   37.27          tvga_speed_changed,
   37.28 +        tvga_force_redraw,
   37.29          svga_add_status_info
   37.30  };
   37.31  
    38.1 --- a/src/vid_vga.c	Sat Aug 03 21:04:33 2013 +0100
    38.2 +++ b/src/vid_vga.c	Tue Aug 13 19:20:28 2013 +0100
    38.3 @@ -106,11 +106,19 @@
    38.4          svga_recalctimings(&vga->svga);
    38.5  }
    38.6  
    38.7 +void vga_force_redraw(void *p)
    38.8 +{
    38.9 +        vga_t *vga = (vga_t *)p;
   38.10 +
   38.11 +        vga->svga.fullchange = changeframecount;
   38.12 +}
   38.13 +
   38.14  device_t vga_device =
   38.15  {
   38.16          "VGA",
   38.17          vga_init,
   38.18          vga_close,
   38.19          vga_speed_changed,
   38.20 +        vga_force_redraw,
   38.21          svga_add_status_info
   38.22  };
    39.1 --- a/src/video.h	Sat Aug 03 21:04:33 2013 +0100
    39.2 +++ b/src/video.h	Tue Aug 13 19:20:28 2013 +0100
    39.3 @@ -48,3 +48,5 @@
    39.4  extern int video_speed;
    39.5  
    39.6  extern int video_res_x, video_res_y, video_bpp;
    39.7 +
    39.8 +extern int vid_resize;
    40.1 --- a/src/win-d3d.cc	Sat Aug 03 21:04:33 2013 +0100
    40.2 +++ b/src/win-d3d.cc	Tue Aug 13 19:20:28 2013 +0100
    40.3 @@ -2,127 +2,205 @@
    40.4  #define BITMAP WINDOWS_BITMAP
    40.5  #include <d3d9.h>
    40.6  #undef BITMAP
    40.7 +#include "resources.h"
    40.8  #include "win-d3d.h"
    40.9  #include "video.h"
   40.10  
   40.11  extern "C" void fatal(const char *format, ...);
   40.12  extern "C" void pclog(const char *format, ...);
   40.13  
   40.14 +extern "C" void device_force_redraw();
   40.15 +
   40.16 +void d3d_init_objects();
   40.17 +void d3d_close_objects();
   40.18  void d3d_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h);
   40.19  void d3d_blit_memtoscreen_8(int x, int y, int w, int h);
   40.20  
   40.21 -LPDIRECT3D9             d3d        = NULL;
   40.22 -LPDIRECT3DDEVICE9       d3ddev     = NULL; 
   40.23 -LPDIRECT3DVERTEXBUFFER9 v_buffer   = NULL;
   40.24 -LPDIRECT3DTEXTURE9      d3dTexture = NULL;
   40.25 -D3DPRESENT_PARAMETERS d3dpp;
   40.26 +static LPDIRECT3D9             d3d        = NULL;
   40.27 +static LPDIRECT3DDEVICE9       d3ddev     = NULL; 
   40.28 +static LPDIRECT3DVERTEXBUFFER9 v_buffer   = NULL;
   40.29 +static LPDIRECT3DTEXTURE9      d3dTexture = NULL;
   40.30 +static D3DPRESENT_PARAMETERS d3dpp;
   40.31  
   40.32 -HWND d3d_hwnd;
   40.33 +static HWND d3d_hwnd;
   40.34  
   40.35  struct CUSTOMVERTEX
   40.36  {
   40.37       FLOAT x, y, z, rhw;    // from the D3DFVF_XYZRHW flag
   40.38 -     DWORD color;    // from the D3DFVF_DIFFUSE flag
   40.39       FLOAT tu, tv;
   40.40  };
   40.41  
   40.42 -CUSTOMVERTEX OurVertices[] =
   40.43 +static PALETTE cgapal=
   40.44  {
   40.45 -     {  0.0f,   0.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), 0.0f, 0.0f},
   40.46 -     {2048.0f, 2048.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), 1.0f, 1.0f},
   40.47 -     {  0.0f, 2048.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), 0.0f, 1.0f},
   40.48 +        {0,0,0},{0,42,0},{42,0,0},{42,21,0},
   40.49 +        {0,0,0},{0,42,42},{42,0,42},{42,42,42},
   40.50 +        {0,0,0},{21,63,21},{63,21,21},{63,63,21},
   40.51 +        {0,0,0},{21,63,63},{63,21,63},{63,63,63},
   40.52  
   40.53 -     {  0.0f,   0.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), 0.0f, 0.0f},
   40.54 -     {2048.0f,   0.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0.0f},
   40.55 -     {2048.0f, 2048.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), 1.0f, 1.0f},
   40.56 +        {0,0,0},{0,0,42},{0,42,0},{0,42,42},
   40.57 +        {42,0,0},{42,0,42},{42,21,00},{42,42,42},
   40.58 +        {21,21,21},{21,21,63},{21,63,21},{21,63,63},
   40.59 +        {63,21,21},{63,21,63},{63,63,21},{63,63,63},
   40.60 +
   40.61 +        {0,0,0},{0,21,0},{0,0,42},{0,42,42},
   40.62 +        {42,0,21},{21,10,21},{42,0,42},{42,0,63},
   40.63 +        {21,21,21},{21,63,21},{42,21,42},{21,63,63},
   40.64 +        {63,0,0},{42,42,0},{63,21,42},{41,41,41},
   40.65 +        
   40.66 +        {0,0,0},{0,42,42},{42,0,0},{42,42,42},
   40.67 +        {0,0,0},{0,42,42},{42,0,0},{42,42,42},
   40.68 +        {0,0,0},{0,63,63},{63,0,0},{63,63,63},
   40.69 +        {0,0,0},{0,63,63},{63,0,0},{63,63,63},
   40.70 +};
   40.71 +
   40.72 +static uint32_t pal_lookup[256];
   40.73 +
   40.74 +static CUSTOMVERTEX d3d_verts[] =
   40.75 +{
   40.76 +     {   0.0f,    0.0f, 1.0f, 1.0f, 0.0f, 0.0f},
   40.77 +     {2048.0f, 2048.0f, 1.0f, 1.0f, 1.0f, 1.0f},
   40.78 +     {   0.0f, 2048.0f, 1.0f, 1.0f, 0.0f, 1.0f},
   40.79 +
   40.80 +     {   0.0f,    0.0f, 1.0f, 1.0f, 0.0f, 0.0f},
   40.81 +     {2048.0f,    0.0f, 1.0f, 1.0f, 1.0f, 0.0f},
   40.82 +     {2048.0f, 2048.0f, 1.0f, 1.0f, 1.0f, 1.0f},
   40.83  };
   40.84    
   40.85  void d3d_init(HWND h)
   40.86  {
   40.87 -        VOID* pVoid;    // the void pointer
   40.88 -        D3DLOCKED_RECT dr;
   40.89 -        RECT r;
   40.90 -        int x, y;
   40.91 -        uint32_t *p;
   40.92 +        int c;
   40.93 +        HRESULT hr;
   40.94          
   40.95 +        for (c = 0; c < 256; c++)
   40.96 +            pal_lookup[c] = makecol(cgapal[c].r << 2, cgapal[c].g << 2, cgapal[c].b << 2);
   40.97 +
   40.98          d3d_hwnd = h;
   40.99          
  40.100          d3d = Direct3DCreate9(D3D_SDK_VERSION);
  40.101  
  40.102          memset(&d3dpp, 0, sizeof(d3dpp));      
  40.103  
  40.104 -    d3dpp.Flags                  = D3DPRESENTFLAG_VIDEO;
  40.105 -    d3dpp.SwapEffect             = D3DSWAPEFFECT_FLIP;
  40.106 -    d3dpp.hDeviceWindow          = h;
  40.107 -    d3dpp.BackBufferCount        = 1;
  40.108 -    d3dpp.MultiSampleType        = D3DMULTISAMPLE_NONE;
  40.109 -    d3dpp.MultiSampleQuality     = 0;
  40.110 -    d3dpp.EnableAutoDepthStencil = false;
  40.111 -    d3dpp.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
  40.112 -    d3dpp.PresentationInterval   = D3DPRESENT_INTERVAL_IMMEDIATE;
  40.113 -    d3dpp.Windowed               = true;
  40.114 -    d3dpp.BackBufferFormat       = D3DFMT_UNKNOWN;
  40.115 -    d3dpp.BackBufferWidth        = 0;
  40.116 -    d3dpp.BackBufferHeight       = 0;
  40.117 +        d3dpp.Flags                  = 0;
  40.118 +        d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
  40.119 +        d3dpp.hDeviceWindow          = h;
  40.120 +        d3dpp.BackBufferCount        = 1;
  40.121 +        d3dpp.MultiSampleType        = D3DMULTISAMPLE_NONE;
  40.122 +        d3dpp.MultiSampleQuality     = 0;
  40.123 +        d3dpp.EnableAutoDepthStencil = false;
  40.124 +        d3dpp.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
  40.125 +        d3dpp.PresentationInterval   = D3DPRESENT_INTERVAL_IMMEDIATE;
  40.126 +        d3dpp.Windowed               = true;
  40.127 +        d3dpp.BackBufferFormat       = D3DFMT_UNKNOWN;
  40.128 +        d3dpp.BackBufferWidth        = 0;
  40.129 +        d3dpp.BackBufferHeight       = 0;
  40.130  
  40.131 -        d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, h, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);
  40.132 +        hr = d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, h, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);
  40.133          
  40.134 -        d3ddev->SetTextureStageState(0,D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
  40.135 -        d3ddev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
  40.136 -        d3ddev->SetTextureStageState(0,D3DTSS_ALPHAOP,   D3DTOP_DISABLE);
  40.137 +        d3d_init_objects();
  40.138 +        
  40.139 +        video_blit_memtoscreen = d3d_blit_memtoscreen;
  40.140 +        video_blit_memtoscreen_8 = d3d_blit_memtoscreen_8;
  40.141 +}
  40.142  
  40.143 -        d3ddev->SetSamplerState(0,D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
  40.144 -        d3ddev->SetSamplerState(0,D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
  40.145 -        
  40.146 -    // create the vertex and store the pointer into v_buffer, which is created globally
  40.147 -     d3ddev->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),
  40.148 -                                0,
  40.149 -                                D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1,
  40.150 -                                D3DPOOL_MANAGED,
  40.151 -                                &v_buffer,
  40.152 -                                NULL);
  40.153 +void d3d_close_objects()
  40.154 +{
  40.155 +        if (d3dTexture)
  40.156 +        {
  40.157 +                d3dTexture->Release();
  40.158 +                d3dTexture = NULL;
  40.159 +        }
  40.160 +        if (v_buffer)
  40.161 +        {
  40.162 +                v_buffer->Release();
  40.163 +                v_buffer = NULL;
  40.164 +        }
  40.165 +}
  40.166  
  40.167 +void d3d_init_objects()
  40.168 +{
  40.169 +        HRESULT hr;
  40.170 +        D3DLOCKED_RECT dr;
  40.171 +        int y;
  40.172 +        RECT r;
  40.173  
  40.174 -     v_buffer->Lock(0, 0, (void**)&pVoid, 0);    // lock the vertex buffer
  40.175 -     memcpy(pVoid, OurVertices, sizeof(OurVertices));    // copy the vertices to the locked buffer
  40.176 -     v_buffer->Unlock();    // unlock the vertex buffer
  40.177 -     
  40.178 -     d3ddev->CreateTexture(2048, 2048, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &d3dTexture, NULL);
  40.179 +        hr = d3ddev->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),
  40.180 +                                   0,
  40.181 +                                   D3DFVF_XYZRHW | D3DFVF_TEX1,
  40.182 +                                   D3DPOOL_MANAGED,
  40.183 +                                   &v_buffer,
  40.184 +                                   NULL);
  40.185 +
  40.186 +        d3ddev->CreateTexture(2048, 2048, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &d3dTexture, NULL);
  40.187       
  40.188          r.top    = r.left  = 0;
  40.189          r.bottom = r.right = 2047;
  40.190 -        
  40.191 +
  40.192          if (FAILED(d3dTexture->LockRect(0, &dr, &r, 0)))
  40.193             fatal("LockRect failed\n");
  40.194          
  40.195          for (y = 0; y < 2048; y++)
  40.196          {
  40.197 -                p = (uint32_t *)(dr.pBits + (y * dr.Pitch));
  40.198 -                for (x = 0; x < 2048; x++)
  40.199 -                {
  40.200 -                        p[x] = x + (y << 11);
  40.201 -                }
  40.202 +                uint32_t *p = (uint32_t *)(dr.pBits + (y * dr.Pitch));
  40.203 +                memset(p, 0, 2048 * 4);
  40.204          }
  40.205 -        
  40.206 +
  40.207          d3dTexture->UnlockRect(0);
  40.208 -        
  40.209 -//        atexit(d3d_close);
  40.210 -        
  40.211 -        video_blit_memtoscreen = d3d_blit_memtoscreen;
  40.212 -        video_blit_memtoscreen_8 = d3d_blit_memtoscreen_8;
  40.213 +
  40.214 +        d3ddev->SetTextureStageState(0,D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
  40.215 +        d3ddev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
  40.216 +        d3ddev->SetTextureStageState(0,D3DTSS_ALPHAOP,   D3DTOP_DISABLE);
  40.217 +
  40.218 +        d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
  40.219 +        d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
  40.220  }
  40.221  
  40.222  void d3d_resize(int x, int y)
  40.223  {
  40.224 -//        d3d_close();
  40.225 -//        d3d_init(d3d_hwnd);
  40.226 +        HRESULT hr;
  40.227 +
  40.228 +        d3dpp.BackBufferWidth  = x;
  40.229 +        d3dpp.BackBufferHeight = y;
  40.230 +
  40.231 +        d3d_reset();
  40.232 +}
  40.233 +        
  40.234 +void d3d_reset()
  40.235 +{
  40.236 +        HRESULT hr;
  40.237 +        
  40.238 +        memset(&d3dpp, 0, sizeof(d3dpp));      
  40.239 +
  40.240 +        d3dpp.Flags                  = 0;
  40.241 +        d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
  40.242 +        d3dpp.hDeviceWindow          = d3d_hwnd;
  40.243 +        d3dpp.BackBufferCount        = 1;
  40.244 +        d3dpp.MultiSampleType        = D3DMULTISAMPLE_NONE;
  40.245 +        d3dpp.MultiSampleQuality     = 0;
  40.246 +        d3dpp.EnableAutoDepthStencil = false;
  40.247 +        d3dpp.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
  40.248 +        d3dpp.PresentationInterval   = D3DPRESENT_INTERVAL_IMMEDIATE;
  40.249 +        d3dpp.Windowed               = true;
  40.250 +        d3dpp.BackBufferFormat       = D3DFMT_UNKNOWN;
  40.251          d3dpp.BackBufferWidth        = 0;
  40.252          d3dpp.BackBufferHeight       = 0;
  40.253 -        d3ddev->Reset(&d3dpp);
  40.254 +
  40.255 +        hr = d3ddev->Reset(&d3dpp);
  40.256 +
  40.257 +        if (hr == D3DERR_DEVICELOST)
  40.258 +                return;
  40.259 +
  40.260 +        d3ddev->SetTextureStageState(0,D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
  40.261 +        d3ddev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
  40.262 +        d3ddev->SetTextureStageState(0,D3DTSS_ALPHAOP,   D3DTOP_DISABLE);
  40.263 +
  40.264 +        d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
  40.265 +        d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
  40.266 +
  40.267 +        device_force_redraw();
  40.268  }
  40.269 -        
  40.270 +
  40.271  void d3d_close()
  40.272 -{
  40.273 +{       
  40.274          if (d3dTexture)
  40.275          {
  40.276                  d3dTexture->Release();
  40.277 @@ -147,79 +225,155 @@
  40.278  
  40.279  void d3d_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
  40.280  {
  40.281 +        HRESULT hr = D3D_OK;
  40.282          VOID* pVoid;
  40.283 -        float xmax, ymax;
  40.284          D3DLOCKED_RECT dr;
  40.285          RECT r;
  40.286          uint32_t *p, *src;
  40.287          int yy;
  40.288          
  40.289 -        xmax = (float)w / 2048.0;
  40.290 -        ymax = (float)h / 2048.0;        
  40.291 -        
  40.292 -        OurVertices[1].tu = OurVertices[4].tu = OurVertices[5].tu = xmax;
  40.293 -        OurVertices[1].tv = OurVertices[2].tv = OurVertices[5].tv = ymax;
  40.294 +        d3d_verts[0].tu = d3d_verts[2].tu = d3d_verts[3].tu = 0;//0.5 / 2048.0;
  40.295 +        d3d_verts[0].tv = d3d_verts[3].tv = d3d_verts[4].tv = 0;//0.5 / 2048.0;
  40.296 +        d3d_verts[1].tu = d3d_verts[4].tu = d3d_verts[5].tu = (float)w / 2048.0;
  40.297 +        d3d_verts[1].tv = d3d_verts[2].tv = d3d_verts[5].tv = (float)h / 2048.0;
  40.298  
  40.299          GetClientRect(d3d_hwnd, &r);
  40.300 -        OurVertices[1].x = OurVertices[4].x = OurVertices[5].x = r.right  - r.left;
  40.301 -        OurVertices[1].y = OurVertices[2].y = OurVertices[5].y = r.bottom - r.top;
  40.302 -        
  40.303 -        //pclog("Window %i, %i\n", 
  40.304 +        d3d_verts[0].x = d3d_verts[2].x = d3d_verts[3].x = -0.5;
  40.305 +        d3d_verts[0].y = d3d_verts[3].y = d3d_verts[4].y = -0.5;
  40.306 +        d3d_verts[1].x = d3d_verts[4].x = d3d_verts[5].x = (r.right  - r.left) - 0.5;
  40.307 +        d3d_verts[1].y = d3d_verts[2].y = d3d_verts[5].y = (r.bottom - r.top) - 0.5;
  40.308  
  40.309 -     v_buffer->Lock(0, 0, (void**)&pVoid, 0);    // lock the vertex buffer
  40.310 -     memcpy(pVoid, OurVertices, sizeof(OurVertices));    // copy the vertices to the locked buffer
  40.311 -     v_buffer->Unlock();    // unlock the vertex buffer
  40.312 -    // clear the window to a deep blue
  40.313 -     //d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
  40.314 +        if (hr == D3D_OK)
  40.315 +                hr = v_buffer->Lock(0, 0, (void**)&pVoid, 0);    // lock the vertex buffer
  40.316 +        if (hr == D3D_OK)
  40.317 +                memcpy(pVoid, d3d_verts, sizeof(d3d_verts));    // copy the vertices to the locked buffer
  40.318 +        if (hr == D3D_OK)
  40.319 +                hr = v_buffer->Unlock();    // unlock the vertex buffer
  40.320  
  40.321          r.top    = y1;
  40.322          r.left   = 0;
  40.323          r.bottom = y2;
  40.324          r.right  = 2047;
  40.325 +
  40.326 +        if (hr == D3D_OK)
  40.327 +        {        
  40.328 +                if (FAILED(d3dTexture->LockRect(0, &dr, &r, 0)))
  40.329 +                   fatal("LockRect failed\n");
  40.330          
  40.331 -        if (FAILED(d3dTexture->LockRect(0, &dr, &r, 0)))
  40.332 -           fatal("LockRect failed\n");
  40.333 +                for (yy = y1; yy < y2; yy++)
  40.334 +                        memcpy(dr.pBits + ((yy - y1) * dr.Pitch), &(((uint32_t *)buffer32->line[yy + y])[x]), w * 4);
  40.335 +
  40.336 +                d3dTexture->UnlockRect(0);
  40.337 +        }
  40.338 +
  40.339 +        if (hr == D3D_OK)        
  40.340 +                hr = d3ddev->BeginScene();
  40.341 +
  40.342 +        if (hr == D3D_OK)
  40.343 +        {
  40.344 +                if (hr == D3D_OK)
  40.345 +                        hr = d3ddev->SetTexture(0, d3dTexture);
  40.346 +
  40.347 +                if (hr == D3D_OK)
  40.348 +                        hr = d3ddev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
  40.349 +
  40.350 +                if (hr == D3D_OK)
  40.351 +                        hr = d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
  40.352 +
  40.353 +                if (hr == D3D_OK)
  40.354 +                        hr = d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
  40.355 +
  40.356 +                if (hr == D3D_OK)
  40.357 +                        hr = d3ddev->SetTexture(0, NULL);
  40.358 +
  40.359 +                if (hr == D3D_OK)
  40.360 +                        hr = d3ddev->EndScene();
  40.361 +        }
  40.362 +
  40.363 +        if (hr == D3D_OK)
  40.364 +                hr = d3ddev->Present(NULL, NULL, d3d_hwnd, NULL);
  40.365          
  40.366 -        for (yy = y1; yy < y2; yy++)
  40.367 -            memcpy(dr.pBits + (yy * dr.Pitch), &(((uint32_t *)buffer32->line[y + yy])[x]), w * 4);
  40.368 -
  40.369 -        d3dTexture->UnlockRect(0);
  40.370 -
  40.371 -        
  40.372 -//        d3dpp.BackBufferWidth  = r.right - r.left;
  40.373 -//	d3dpp.BackBufferHeight = r.bottom - r.top;
  40.374 -	
  40.375 -//	d3ddev->Reset(&d3dpp);
  40.376 -		
  40.377 -     d3ddev->BeginScene();    // begins the 3D scene
  40.378 -
  40.379 -        d3ddev->SetTexture( 0, d3dTexture );
  40.380 -        // select which vertex format we are using
  40.381 -         d3ddev->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
  40.382 -
  40.383 -         // select the vertex buffer to display
  40.384 -         d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
  40.385 -
  40.386 -         // copy the vertex buffer to the back buffer
  40.387 -        d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
  40.388 -        
  40.389 -        d3ddev->SetTexture( 0, NULL );
  40.390 -
  40.391 -     d3ddev->EndScene();    // ends the 3D scene
  40.392 -
  40.393 -     d3ddev->Present(NULL, NULL, d3d_hwnd, NULL);    // displays the created frame
  40.394 +        if (hr == D3DERR_DEVICELOST || hr == D3DERR_INVALIDCALL)
  40.395 +                PostMessage(d3d_hwnd, WM_RESETD3D, 0, 0);
  40.396  }
  40.397  
  40.398  void d3d_blit_memtoscreen_8(int x, int y, int w, int h)
  40.399  {
  40.400 -    // clear the window to a deep blue
  40.401 -     d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
  40.402 +        VOID* pVoid;
  40.403 +        D3DLOCKED_RECT dr;
  40.404 +        RECT r;
  40.405 +        uint32_t *p, *src;
  40.406 +        int yy, xx;
  40.407 +        HRESULT hr = D3D_OK;
  40.408  
  40.409 -     d3ddev->BeginScene();    // begins the 3D scene
  40.410 +        d3d_verts[0].tu = d3d_verts[2].tu = d3d_verts[3].tu = 0;//0.5 / 2048.0;
  40.411 +        d3d_verts[0].tv = d3d_verts[3].tv = d3d_verts[4].tv = 0;//0.5 / 2048.0;
  40.412 +        d3d_verts[1].tu = d3d_verts[4].tu = d3d_verts[5].tu = (float)w / 2048.0;
  40.413 +        d3d_verts[1].tv = d3d_verts[2].tv = d3d_verts[5].tv = (float)h / 2048.0;
  40.414  
  40.415 -     // do 3D rendering on the back buffer here
  40.416 +        GetClientRect(d3d_hwnd, &r);
  40.417 +        d3d_verts[0].x = d3d_verts[2].x = d3d_verts[3].x = -0.5;
  40.418 +        d3d_verts[0].y = d3d_verts[3].y = d3d_verts[4].y = -0.5;
  40.419 +        d3d_verts[1].x = d3d_verts[4].x = d3d_verts[5].x = (r.right  - r.left) - 0.5;
  40.420 +        d3d_verts[1].y = d3d_verts[2].y = d3d_verts[5].y = (r.bottom - r.top) - 0.5;
  40.421  
  40.422 -     d3ddev->EndScene();    // ends the 3D scene
  40.423 +        if (hr == D3D_OK)
  40.424 +                hr = v_buffer->Lock(0, 0, (void**)&pVoid, 0);    // lock the vertex buffer
  40.425 +        if (hr == D3D_OK)
  40.426 +                memcpy(pVoid, d3d_verts, sizeof(d3d_verts));    // copy the vertices to the locked buffer
  40.427 +        if (hr == D3D_OK)
  40.428 +                hr = v_buffer->Unlock();    // unlock the vertex buffer
  40.429  
  40.430 -     d3ddev->Present(NULL, NULL, NULL, NULL);    // displays the created frame
  40.431 +        r.top    = 0;
  40.432 +        r.left   = 0;
  40.433 +        r.bottom = h;
  40.434 +        r.right  = 2047;
  40.435 +        
  40.436 +        if (hr == D3D_OK)
  40.437 +        {
  40.438 +                if (FAILED(d3dTexture->LockRect(0, &dr, &r, 0)))
  40.439 +                        fatal("LockRect failed\n");
  40.440 +        
  40.441 +                for (yy = 0; yy < h; yy++)
  40.442 +                {
  40.443 +                        uint32_t *p = (uint32_t *)(dr.pBits + (yy * dr.Pitch));
  40.444 +                        if ((y + yy) >= 0 && (y + yy) < buffer->h)
  40.445 +                        {
  40.446 +                                for (xx = 0; xx < w; xx++)
  40.447 +                                        p[xx] = pal_lookup[buffer->line[y + yy][x + xx]];
  40.448 +                        }
  40.449 +                }
  40.450 +
  40.451 +                d3dTexture->UnlockRect(0);
  40.452 +        }
  40.453 +      
  40.454 +        if (hr == D3D_OK)        
  40.455 +                hr = d3ddev->BeginScene();
  40.456 +
  40.457 +        if (hr == D3D_OK)
  40.458 +        {
  40.459 +                if (hr == D3D_OK)
  40.460 +                        hr = d3ddev->SetTexture(0, d3dTexture);
  40.461 +
  40.462 +                if (hr == D3D_OK)
  40.463 +                        hr = d3ddev->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
  40.464 +
  40.465 +                if (hr == D3D_OK)
  40.466 +                        hr = d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
  40.467 +
  40.468 +                if (hr == D3D_OK)
  40.469 +                        hr = d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
  40.470 +
  40.471 +                if (hr == D3D_OK)
  40.472 +                        hr = d3ddev->SetTexture(0, NULL);
  40.473 +
  40.474 +                if (hr == D3D_OK)
  40.475 +                        hr = d3ddev->EndScene();
  40.476 +        }
  40.477 +
  40.478 +        if (hr == D3D_OK)
  40.479 +                hr = d3ddev->Present(NULL, NULL, d3d_hwnd, NULL);
  40.480 +        
  40.481 +        if (hr == D3DERR_DEVICELOST || hr == D3DERR_INVALIDCALL)
  40.482 +                PostMessage(d3d_hwnd, WM_RESETD3D, 0, 0);
  40.483  }
    41.1 --- a/src/win-d3d.h	Sat Aug 03 21:04:33 2013 +0100
    41.2 +++ b/src/win-d3d.h	Tue Aug 13 19:20:28 2013 +0100
    41.3 @@ -3,6 +3,7 @@
    41.4  #endif
    41.5          void d3d_init(HWND h);
    41.6          void d3d_close();
    41.7 +        void d3d_reset();
    41.8          void d3d_resize(int x, int y);
    41.9  #ifdef __cplusplus
   41.10  }
    42.1 --- a/src/win-ddraw.cc	Sat Aug 03 21:04:33 2013 +0100
    42.2 +++ b/src/win-ddraw.cc	Tue Aug 13 19:20:28 2013 +0100
    42.3 @@ -8,6 +8,8 @@
    42.4  extern "C" void fatal(const char *format, ...);
    42.5  extern "C" void pclog(const char *format, ...);
    42.6  
    42.7 +extern "C" void device_force_redraw();
    42.8 +
    42.9  extern "C" void ddraw_init(HWND h);
   42.10  extern "C" void ddraw_close();
   42.11  extern "C" void ddraw_draw();
   42.12 @@ -157,7 +159,7 @@
   42.13          {
   42.14                  lpdds_back->Restore();
   42.15                  lpdds_back->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
   42.16 -                fullchange = changeframecount;
   42.17 +                device_force_redraw();
   42.18          }
   42.19          if (!ddsd.lpSurface) return;
   42.20          for (yy = y1; yy < y2; yy++)
   42.21 @@ -190,7 +192,7 @@
   42.22                  {
   42.23                          lpdds_back2->Restore();
   42.24                          lpdds_back2->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
   42.25 -                        fullchange = changeframecount;
   42.26 +                        device_force_redraw();
   42.27                  }
   42.28                  if (!ddsd.lpSurface) return;
   42.29                  for (yy = 8; yy < 14; yy++)
   42.30 @@ -229,7 +231,7 @@
   42.31          {
   42.32                  lpdds_back->Restore();
   42.33                  lpdds_back->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
   42.34 -                fullchange = changeframecount;
   42.35 +                device_force_redraw();
   42.36          }
   42.37          if (!ddsd.lpSurface) return;
   42.38          for (yy = 0; yy < h; yy++)
   42.39 @@ -270,7 +272,7 @@
   42.40                  {
   42.41                          lpdds_back2->Restore();
   42.42                          lpdds_back2->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
   42.43 -                        fullchange = changeframecount;
   42.44 +                        device_force_redraw();
   42.45                  }
   42.46                  if (!ddsd.lpSurface) return;
   42.47                  for (yy = 8; yy < 14; yy++)
    43.1 --- a/src/win.c	Sat Aug 03 21:04:33 2013 +0100
    43.2 +++ b/src/win.c	Tue Aug 13 19:20:28 2013 +0100
    43.3 @@ -22,9 +22,20 @@
    43.4  #include "plat-keyboard.h"
    43.5  
    43.6  #include "win-ddraw.h"
    43.7 -//#include "win-d3d.h"
    43.8 +#include "win-d3d.h"
    43.9  //#include "win-opengl.h"
   43.10  
   43.11 +static struct
   43.12 +{
   43.13 +        void (*init)(HWND h);
   43.14 +        void (*close)();
   43.15 +        void (*resize)(int x, int y);
   43.16 +} vid_apis[] =
   43.17 +{
   43.18 +        ddraw_init, ddraw_close, NULL,
   43.19 +        d3d_init, d3d_close, d3d_resize
   43.20 +};
   43.21 +
   43.22  #define TIMER_1SEC 1
   43.23  
   43.24  int winsizex=640,winsizey=480;
   43.25 @@ -75,19 +86,15 @@
   43.26  char szClassName[ ] = "WindowsApp";
   43.27  
   43.28  HWND ghwnd;
   43.29 +static int win_doresize = 0;
   43.30 +
   43.31  void updatewindowsize(int x, int y)
   43.32  {
   43.33          RECT r;
   43.34          if (vid_resize) return;
   43.35 +
   43.36          winsizex=x; winsizey=y;
   43.37 -        GetWindowRect(ghwnd,&r);
   43.38 -        MoveWindow(ghwnd,r.left,r.top,
   43.39 -                     x+(GetSystemMetrics(SM_CXFIXEDFRAME)*2),
   43.40 -                     y+(GetSystemMetrics(SM_CYFIXEDFRAME)*2)+GetSystemMetrics(SM_CYMENUSIZE)+GetSystemMetrics(SM_CYCAPTION)+1,
   43.41 -                     TRUE);
   43.42 -//        startblit();
   43.43 -//        d3d_resize(x, y);
   43.44 -//        endblit();
   43.45 +        win_doresize = 1;
   43.46  }
   43.47  
   43.48  void releasemouse()
   43.49 @@ -153,55 +160,49 @@
   43.50          int t = 0;
   43.51          int frames = 0;
   43.52          DWORD old_time, new_time;
   43.53 +
   43.54          mainthreadon=1;
   43.55  //        Sleep(500);
   43.56          drawits=0;
   43.57          old_time = GetTickCount();
   43.58          while (!quited)
   43.59          {
   43.60 -//                if (infocus)
   43.61 -//                {
   43.62 -/*                        if (!drawits)
   43.63 +                if (updatestatus)
   43.64 +                {
   43.65 +                        updatestatus=0;
   43.66 +                        if (statusopen) SendMessage(statushwnd,WM_USER,0,0);
   43.67 +                }
   43.68 +                new_time = GetTickCount();
   43.69 +                drawits += new_time - old_time;
   43.70 +                old_time = new_time;
   43.71 +                if (drawits > 0 && !pause)
   43.72 +                {
   43.73 +                        drawits-=10;        if (drawits>50) drawits=0;
   43.74 +                        wokeups++;
   43.75 +                        runpc();
   43.76 +                        frames++;
   43.77 +                        if (frames >= 200 && nvr_dosave)
   43.78                          {
   43.79 -                                while (!drawits)
   43.80 -                                {
   43.81 -                                        ResetEvent(frameobject);
   43.82 -                                        WaitForSingleObject(frameobject,10);
   43.83 -                                }
   43.84 -                        }*/
   43.85 -                        if (updatestatus)
   43.86 -                        {
   43.87 -                                updatestatus=0;
   43.88 -                                if (statusopen) SendMessage(statushwnd,WM_USER,0,0);
   43.89 +                                frames = 0;
   43.90 +                                nvr_dosave = 0;
   43.91 +                                savenvr();
   43.92                          }
   43.93 -                        new_time = GetTickCount();
   43.94 -                        drawits += new_time - old_time;
   43.95 -                        old_time = new_time;
   43.96 -                        if (drawits > 0 && !pause)
   43.97 -                        {
   43.98 -//                                printf("Drawits %i\n",drawits);
   43.99 -                                drawits-=10;
  43.100 -                                if (drawits>50) drawits=0;
  43.101 -                                wokeups++;
  43.102 -                                startblit();
  43.103 -                                runpc();
  43.104 -//                                ddraw_draw();
  43.105 -                                endblit();
  43.106 -                                frames++;
  43.107 -                                if (frames >= 200 && nvr_dosave)
  43.108 -                                {
  43.109 -                                        frames = 0;
  43.110 -                                        nvr_dosave = 0;
  43.111 -                                        savenvr();
  43.112 -                                }
  43.113 -//#if 0                                
  43.114 -//#endif
  43.115 -                        }
  43.116 -                        else
  43.117 -                        {
  43.118 -                                Sleep(1);
  43.119 -                        }
  43.120 -//                }
  43.121 +                }
  43.122 +                else
  43.123 +                {
  43.124 +                        Sleep(1);
  43.125 +                }
  43.126 +
  43.127 +                if (win_doresize)
  43.128 +                {
  43.129 +                        RECT r;
  43.130 +                        GetWindowRect(ghwnd, &r);
  43.131 +                        MoveWindow(ghwnd, r.left, r.top,
  43.132 +                                   winsizex + (GetSystemMetrics(SM_CXFIXEDFRAME) * 2),
  43.133 +                                   winsizey + (GetSystemMetrics(SM_CYFIXEDFRAME) * 2) + GetSystemMetrics(SM_CYMENUSIZE) + GetSystemMetrics(SM_CYCAPTION) + 1,
  43.134 +                                   TRUE);
  43.135 +                        win_doresize = 0;
  43.136 +                }
  43.137          }
  43.138          mainthreadon=0;
  43.139  }
  43.140 @@ -300,13 +301,12 @@
  43.141          
  43.142          ghwnd=hwnd;
  43.143          
  43.144 -        ddraw_init(hwnd);
  43.145          midi_init();
  43.146          atexit(midi_close);
  43.147 -//        d3d_init(hwnd);
  43.148 -//        opengl_init(hwnd);
  43.149          
  43.150          initpc();
  43.151 +        
  43.152 +        vid_apis[vid_api].init(ghwnd);
  43.153  
  43.154          if (vid_resize) SetWindowLong(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW|WS_VISIBLE);
  43.155          else            SetWindowLong(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW&~WS_SIZEBOX&~WS_THICKFRAME&~WS_MAXIMIZEBOX)|WS_VISIBLE);
  43.156 @@ -317,7 +317,7 @@
  43.157             CheckMenuItem(menu, IDM_CDROM_REAL + cdrom_drive, MF_CHECKED);
  43.158          CheckMenuItem(menu, IDM_KEY_ALLEGRO + kb_win, MF_CHECKED);
  43.159          if (vid_resize) CheckMenuItem(menu, IDM_VID_RESIZE, MF_CHECKED);
  43.160 -        
  43.161 +        CheckMenuItem(menu, IDM_VID_DDRAW + vid_api, MF_CHECKED);        
  43.162  //        set_display_switch_mode(SWITCH_BACKGROUND);
  43.163          
  43.164          d=romset;
  43.165 @@ -462,6 +462,9 @@
  43.166  //        pclog("Closepc\n");
  43.167          closepc();
  43.168  //        pclog("dumpregs\n");
  43.169 +
  43.170 +        vid_apis[vid_api].close();
  43.171 +        
  43.172          timeEndPeriod(1);
  43.173  //        endsoundthread();
  43.174  //        dumpregs();
  43.175 @@ -1470,6 +1473,19 @@
  43.176                          SetWindowPos(hwnd, 0, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_FRAMECHANGED);
  43.177                          saveconfig();
  43.178                          break;
  43.179 +                        
  43.180 +                        case IDM_VID_DDRAW: case IDM_VID_D3D:
  43.181 +                        startblit();
  43.182 +                        CheckMenuItem(hmenu, IDM_VID_DDRAW + vid_api, MF_UNCHECKED);
  43.183 +                        vid_apis[vid_api].close();
  43.184 +                        vid_api = LOWORD(wParam) - IDM_VID_DDRAW;
  43.185 +                        CheckMenuItem(hmenu, IDM_VID_DDRAW + vid_api, MF_CHECKED);
  43.186 +                        vid_apis[vid_api].init(ghwnd);
  43.187 +                        endblit();
  43.188 +                        saveconfig();
  43.189 +                        device_force_redraw();
  43.190 +                        break;
  43.191 +
  43.192                          case IDM_KEY_ALLEGRO: case IDM_KEY_WINDOWS:
  43.193                          CheckMenuItem(hmenu,LOWORD(wParam),MF_CHECKED);
  43.194                          CheckMenuItem(hmenu,LOWORD(wParam)^1,MF_UNCHECKED);
  43.195 @@ -1583,14 +1599,24 @@
  43.196                  case WM_SIZE:
  43.197                  winsizex=lParam&0xFFFF;
  43.198                  winsizey=lParam>>16;
  43.199 -//                startblit();
  43.200 -//                d3d_resize(winsizex, winsizey);
  43.201 -//                endblit();
  43.202 +
  43.203 +                if (vid_apis[vid_api].resize)
  43.204 +                {
  43.205 +                        startblit();
  43.206 +                        vid_apis[vid_api].resize(winsizex, winsizey);
  43.207 +                        endblit();
  43.208 +                }
  43.209                  break;
  43.210  
  43.211                  case WM_TIMER:
  43.212                  if (wParam == TIMER_1SEC)
  43.213 -                   onesec();
  43.214 +                        onesec();
  43.215 +                break;
  43.216 +                
  43.217 +                case WM_RESETD3D:
  43.218 +                startblit();
  43.219 +                d3d_reset();
  43.220 +                endblit();
  43.221                  break;
  43.222  
  43.223                  case WM_KEYDOWN: