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(¶dise->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:
