1 /* DirectDraw using DGA
3 * Copyright 1997,1998 Marcus Meissner
5 /* When DirectVideo mode is enabled you can no longer use 'normal' X
6 * applications nor can you switch to a virtual console. Also, enabling
7 * only works, if you have switched to the screen where the application
9 * Some ways to debug this stuff are:
10 * - A terminal connected to the serial port. Can be bought used for cheap.
11 * (This is the method I am using.)
12 * - Another machine connected over some kind of network.
14 /* Progress on following programs:
16 * - Diablo [640x480x8]:
17 * The movies play. The game doesn't work, it somehow tries to write
18 * into 2 lines _BEFORE_ the start of the surface. Don't know why.
20 * - WingCommander 4 / Win95 Patch [640x480x8]:
21 * The intromovie plays, in 8 bit mode (to reconfigure wc4, run wine
22 * "wc4w.exe -I"). The 16bit mode looks broken, but I think this is due to
23 * my Matrox Mystique which uses 565 (rgb) colorweight instead of the usual
24 * 555. Specifying it in DDPIXELFORMAT didn't help.
25 * Requires to be run in 640x480xdepth mode (doesn't seem to heed
26 * DDSURFACEDESC.lPitch). You can fly the first mission with Maniac, but
27 * it crashes as soon as you arrive at Blue Point Station...
29 * - Monkey Island 3 [640x480x8]:
30 * Goes to the easy/hard selection screen, then hangs due to MT problems.
32 * - DiscWorld 2 [640x480x8]:
33 * [Crashes with 'cli' in released version. Yes. Privileged instructions
34 * in 32bit code. Will they ever learn...]
35 * Plays through nearly all intro movies. Sound and animation skip a lot of
36 * stuff (possible DirectSound problem).
39 * Shows the splash screen, then fails with missing Joystick.
41 * - Tomb Raider 2 Demo (using 8 bit renderer) [640x480x8]:
42 * Playable. Sound is weird.
44 * - WingCommander Prophecy Demo (using software renderer) [640x480x16]:
45 * [Crashes with an invalid opcode (outb) in the release version.]
46 * Plays intromovie, hangs in selection screen (no keyboard input, probably
47 * DirectInput problem).
55 #include <sys/signal.h>
59 #include "interfaces.h"
70 #ifdef HAVE_LIBXXF86DGA
71 #include <X11/extensions/xf86dga.h>
74 /* restore signal handlers overwritten by XF86DGA
75 * this is a define, for it will only work in emulator mode
77 #undef RESTORE_SIGNALS
79 static struct IDirectDrawSurface3_VTable dds3vt
;
80 static struct IDirectDrawSurface2_VTable dds2vt
;
81 static struct IDirectDrawSurface_VTable ddsvt
;
82 static struct IDirectDraw_VTable ddvt
;
83 static struct IDirectDraw2_VTable dd2vt
;
84 static struct IDirect3D_VTable d3dvt
;
85 static struct IDirect3D2_VTable d3d2vt
;
89 DirectDrawEnumerate32A(LPDDENUMCALLBACK32A ddenumproc
,LPVOID data
) {
90 /* we have just one display driver right now ... */
91 ddenumproc(0,"WINE Display","display",data
);
96 DSoundHelp(DWORD x
,DWORD y
,DWORD z
) {
97 fprintf(stderr
,"DSoundHelp(0x%08lx,0x%08lx,0x%08lx),stub!\n",x
,y
,z
);
102 #ifdef HAVE_LIBXXF86DGA
104 /******************************************************************************
105 * internal helper functions
107 static void _dump_DDBLTFX(DWORD flagmask
) {
113 #define FE(x) { x, #x},
114 FE(DDBLTFX_ARITHSTRETCHY
)
115 FE(DDBLTFX_MIRRORLEFTRIGHT
)
116 FE(DDBLTFX_MIRRORUPDOWN
)
117 FE(DDBLTFX_NOTEARING
)
118 FE(DDBLTFX_ROTATE180
)
119 FE(DDBLTFX_ROTATE270
)
121 FE(DDBLTFX_ZBUFFERRANGE
)
122 FE(DDBLTFX_ZBUFFERBASEDEST
)
124 for (i
=0;i
<sizeof(flags
)/sizeof(flags
[0]);i
++)
125 if (flags
[i
].mask
& flagmask
)
126 fprintf(stderr
,"%s ",flags
[i
].name
);
129 static void _dump_DDBLTFAST(DWORD flagmask
) {
135 #define FE(x) { x, #x},
136 FE(DDBLTFAST_NOCOLORKEY
)
137 FE(DDBLTFAST_SRCCOLORKEY
)
138 FE(DDBLTFAST_DESTCOLORKEY
)
141 for (i
=0;i
<sizeof(flags
)/sizeof(flags
[0]);i
++)
142 if (flags
[i
].mask
& flagmask
)
143 fprintf(stderr
,"%s ",flags
[i
].name
);
146 static void _dump_DDBLT(DWORD flagmask
) {
152 #define FE(x) { x, #x},
154 FE(DDBLT_ALPHADESTCONSTOVERRIDE
)
155 FE(DDBLT_ALPHADESTNEG
)
156 FE(DDBLT_ALPHADESTSURFACEOVERRIDE
)
157 FE(DDBLT_ALPHAEDGEBLEND
)
159 FE(DDBLT_ALPHASRCCONSTOVERRIDE
)
160 FE(DDBLT_ALPHASRCNEG
)
161 FE(DDBLT_ALPHASRCSURFACEOVERRIDE
)
167 FE(DDBLT_KEYDESTOVERRIDE
)
169 FE(DDBLT_KEYSRCOVERRIDE
)
171 FE(DDBLT_ROTATIONANGLE
)
173 FE(DDBLT_ZBUFFERDESTCONSTOVERRIDE
)
174 FE(DDBLT_ZBUFFERDESTOVERRIDE
)
175 FE(DDBLT_ZBUFFERSRCCONSTOVERRIDE
)
176 FE(DDBLT_ZBUFFERSRCOVERRIDE
)
180 for (i
=0;i
<sizeof(flags
)/sizeof(flags
[0]);i
++)
181 if (flags
[i
].mask
& flagmask
)
182 fprintf(stderr
,"%s ",flags
[i
].name
);
185 static void _dump_DDSCAPS(DWORD flagmask
) {
191 #define FE(x) { x, #x},
192 FE(DDSCAPS_RESERVED1
)
194 FE(DDSCAPS_BACKBUFFER
)
197 FE(DDSCAPS_FRONTBUFFER
)
198 FE(DDSCAPS_OFFSCREENPLAIN
)
201 FE(DDSCAPS_PRIMARYSURFACE
)
202 FE(DDSCAPS_PRIMARYSURFACELEFT
)
203 FE(DDSCAPS_SYSTEMMEMORY
)
206 FE(DDSCAPS_VIDEOMEMORY
)
208 FE(DDSCAPS_WRITEONLY
)
211 FE(DDSCAPS_LIVEVIDEO
)
215 FE(DDSCAPS_RESERVED2
)
216 FE(DDSCAPS_ALLOCONLOAD
)
217 FE(DDSCAPS_VIDEOPORT
)
218 FE(DDSCAPS_LOCALVIDMEM
)
219 FE(DDSCAPS_NONLOCALVIDMEM
)
220 FE(DDSCAPS_STANDARDVGAMODE
)
221 FE(DDSCAPS_OPTIMIZED
)
223 for (i
=0;i
<sizeof(flags
)/sizeof(flags
[0]);i
++)
224 if (flags
[i
].mask
& flagmask
)
225 fprintf(stderr
,"%s ",flags
[i
].name
);
228 static void _dump_DDCAPS(DWORD flagmask
) {
234 #define FE(x) { x, #x},
236 FE(DDCAPS_ALIGNBOUNDARYDEST
)
237 FE(DDCAPS_ALIGNSIZEDEST
)
238 FE(DDCAPS_ALIGNBOUNDARYSRC
)
239 FE(DDCAPS_ALIGNSIZESRC
)
240 FE(DDCAPS_ALIGNSTRIDE
)
244 FE(DDCAPS_BLTSTRETCH
)
247 FE(DDCAPS_OVERLAYCANTCLIP
)
248 FE(DDCAPS_OVERLAYFOURCC
)
249 FE(DDCAPS_OVERLAYSTRETCH
)
251 FE(DDCAPS_PALETTEVSYNC
)
252 FE(DDCAPS_READSCANLINE
)
253 FE(DDCAPS_STEREOVIEW
)
259 FE(DDCAPS_COLORKEYHWASSIST
)
260 FE(DDCAPS_NOHARDWARE
)
261 FE(DDCAPS_BLTCOLORFILL
)
262 FE(DDCAPS_BANKSWITCHED
)
263 FE(DDCAPS_BLTDEPTHFILL
)
265 FE(DDCAPS_CANCLIPSTRETCHED
)
266 FE(DDCAPS_CANBLTSYSMEM
)
268 for (i
=0;i
<sizeof(flags
)/sizeof(flags
[0]);i
++)
269 if (flags
[i
].mask
& flagmask
)
270 fprintf(stderr
,"%s ",flags
[i
].name
);
273 static void _dump_DDSD(DWORD flagmask
) {
283 FE(DDSD_BACKBUFFERCOUNT
)
284 FE(DDSD_ZBUFFERBITDEPTH
)
285 FE(DDSD_ALPHABITDEPTH
)
287 FE(DDSD_CKDESTOVERLAY
)
289 FE(DDSD_CKSRCOVERLAY
)
296 for (i
=0;i
<sizeof(flags
)/sizeof(flags
[0]);i
++)
297 if (flags
[i
].mask
& flagmask
)
298 fprintf(stderr
,"%s ",flags
[i
].name
);
301 static int _getpixelformat(LPDIRECTDRAW ddraw
,LPDDPIXELFORMAT pf
) {
302 static XVisualInfo
*vi
;
307 vi
= TSXGetVisualInfo(display
,VisualNoMask
,&vt
,&nitems
);
310 if (ddraw
->d
.depth
==8) {
311 pf
->dwFlags
= DDPF_RGB
|DDPF_PALETTEINDEXED8
;
312 pf
->x
.dwRGBBitCount
= 8;
313 pf
->y
.dwRBitMask
= 0;
314 pf
->z
.dwGBitMask
= 0;
315 pf
->xx
.dwBBitMask
= 0;
316 pf
->xy
.dwRGBAlphaBitMask
= 0;
319 if (ddraw
->d
.depth
==16) {
320 pf
->dwFlags
= DDPF_RGB
;
321 pf
->x
.dwRGBBitCount
= 16;
322 pf
->y
.dwRBitMask
= vi
[0].red_mask
;
323 pf
->z
.dwGBitMask
= vi
[0].green_mask
;
324 pf
->xx
.dwBBitMask
= vi
[0].blue_mask
;
325 pf
->xy
.dwRGBAlphaBitMask
= 0;
328 fprintf(stderr
,"_getpixelformat:oops?\n");
329 return DDERR_GENERIC
;
332 /******************************************************************************
336 static HRESULT WINAPI
IDirectDrawSurface_Lock(
337 LPDIRECTDRAWSURFACE
this,LPRECT32 lprect
,LPDDSURFACEDESC lpddsd
,DWORD flags
, HANDLE32 hnd
339 dprintf_info(ddraw
, "IDirectDrawSurface(%p)->Lock(%p,%p,%08lx,%08lx)\n",
340 this,lprect
,lpddsd
,flags
,(DWORD
)hnd
);
341 if (flags
& ~(DDLOCK_WAIT
|DDLOCK_READONLY
|DDLOCK_WRITEONLY
))
342 dprintf_warn(ddraw
, "IDirectDrawSurface(%p)->Lock(%p,%p,%08lx,%08lx)\n",
343 this,lprect
,lpddsd
,flags
,(DWORD
)hnd
);
346 dprintf_info(ddraw
," lprect: %dx%d-%dx%d\n",
347 lprect
->top
,lprect
->left
,lprect
->bottom
,lprect
->right
349 lpddsd
->y
.lpSurface
= this->s
.surface
+
350 (lprect
->top
*this->s
.lpitch
)+
351 (lprect
->left
*(this->s
.ddraw
->d
.depth
/8));
353 lpddsd
->y
.lpSurface
= this->s
.surface
;
354 lpddsd
->dwFlags
= DDSD_WIDTH
|DDSD_HEIGHT
|DDSD_PIXELFORMAT
|DDSD_PITCH
|DDSD_LPSURFACE
;
355 lpddsd
->dwWidth
= this->s
.width
;
356 lpddsd
->dwHeight
= this->s
.height
;
357 lpddsd
->lPitch
= this->s
.lpitch
;
358 _getpixelformat(this->s
.ddraw
,&(lpddsd
->ddpfPixelFormat
));
362 static HRESULT WINAPI
IDirectDrawSurface_Unlock(
363 LPDIRECTDRAWSURFACE
this,LPVOID surface
365 dprintf_info(ddraw
,"IDirectDrawSurface(%p)->Unlock(%p)\n",this,surface
);
369 static HRESULT WINAPI
IDirectDrawSurface_Flip(
370 LPDIRECTDRAWSURFACE
this,LPDIRECTDRAWSURFACE flipto
,DWORD dwFlags
372 dprintf_info(ddraw
,"IDirectDrawSurface(%p)->Flip(%p,%08lx)\n",this,flipto
,dwFlags
);
374 if (this->s
.backbuffer
)
375 flipto
= this->s
.backbuffer
;
379 XF86DGASetViewPort(display
,DefaultScreen(display
),0,flipto
->s
.fb_height
);
380 if (flipto
->s
.palette
&& flipto
->s
.palette
->cm
)
381 XF86DGAInstallColormap(display
,DefaultScreen(display
),flipto
->s
.palette
->cm
);
382 while (!XF86DGAViewPortChanged(display
,DefaultScreen(display
),2)) {
388 tmp
= this->s
.fb_height
;
389 this->s
.fb_height
= flipto
->s
.fb_height
;
390 flipto
->s
.fb_height
= tmp
;
392 ptmp
= this->s
.surface
;
393 this->s
.surface
= flipto
->s
.surface
;
394 flipto
->s
.surface
= ptmp
;
399 static HRESULT WINAPI
IDirectDrawSurface_SetPalette(
400 LPDIRECTDRAWSURFACE
this,LPDIRECTDRAWPALETTE pal
402 dprintf_info(ddraw
,"IDirectDrawSurface(%p)->SetPalette(%p)\n",this,pal
);
403 this->s
.palette
= pal
; /* probably addref it too */
407 static HRESULT WINAPI
IDirectDrawSurface_Blt(
408 LPDIRECTDRAWSURFACE
this,LPRECT32 rdst
,LPDIRECTDRAWSURFACE src
,LPRECT32 rsrc
,DWORD dwFlags
,LPDDBLTFX lpbltfx
414 memcpy(&xdst
,rdst
,sizeof(xdst
));
417 xdst
.bottom
= this->s
.height
;
419 xdst
.right
= this->s
.width
;
422 memcpy(&xsrc
,rsrc
,sizeof(xsrc
));
425 xsrc
.bottom
= src
->s
.height
;
427 xsrc
.right
= src
->s
.width
;
430 if (dwFlags
& DDBLT_COLORFILL
) {
431 int bpp
= this->s
.ddraw
->d
.depth
/8;
434 xline
= (LPBYTE
)this->s
.surface
+xdst
.top
*this->s
.lpitch
;
435 for (i
=xdst
.top
;i
<xdst
.bottom
;i
++) {
436 xpixel
= xline
+bpp
*xdst
.left
;
438 for (j
=xdst
.left
;j
<xdst
.right
;j
++) {
439 /* FIXME: this only works on little endian
440 * architectures, where DWORD starts with low
443 memcpy(xpixel
,&(lpbltfx
->b
.dwFillColor
),bpp
);
446 xline
+= this->s
.lpitch
;
448 dwFlags
&= ~(DDBLT_COLORFILL
);
450 dwFlags
&= ~(DDBLT_WAIT
|DDBLT_ASYNC
);/* FIXME: can't handle right now */
451 if ( (xsrc
.top
==0) && (xsrc
.bottom
==this->s
.height
) &&
452 (xsrc
.left
==0) && (xsrc
.right
==this->s
.width
) &&
453 (xdst
.top
==0) && (xdst
.bottom
==this->s
.height
) &&
454 (xdst
.left
==0) && (xdst
.right
==this->s
.width
) &&
457 memcpy(this->s
.surface
,src
->s
.surface
,this->s
.height
*this->s
.lpitch
);
461 fprintf(stderr
,"IDirectDrawSurface(%p)->Blt(%p,%p,%p,%08lx,%p),stub!\n",
462 this,rdst
,src
,rsrc
,dwFlags
,lpbltfx
464 if (rdst
) fprintf(stderr
," destrect :%dx%d-%dx%d\n",rdst
->left
,rdst
->top
,rdst
->right
,rdst
->bottom
);
465 if (rsrc
) fprintf(stderr
," srcrect :%dx%d-%dx%d\n",rsrc
->left
,rsrc
->top
,rsrc
->right
,rsrc
->bottom
);
466 fprintf(stderr
,"\tflags: ");_dump_DDBLT(dwFlags
);fprintf(stderr
,"\n");
468 if (dwFlags
& DDBLT_DDFX
) {
469 fprintf(stderr
," blitfx: ");_dump_DDBLTFX(lpbltfx
->dwDDFX
);fprintf(stderr
,"\n");
474 static HRESULT WINAPI
IDirectDrawSurface_BltFast(
475 LPDIRECTDRAWSURFACE
this,DWORD dstx
,DWORD dsty
,LPDIRECTDRAWSURFACE src
,LPRECT32 rsrc
,DWORD trans
478 if (debugging_info(ddraw
)) {
479 fprintf(stderr
,"IDirectDrawSurface(%p)->BltFast(%ld,%ld,%p,%p,%08lx),stub!\n",
480 this,dstx
,dsty
,src
,rsrc
,trans
482 fprintf(stderr
," trans:");_dump_DDBLTFAST(trans
);fprintf(stderr
,"\n");
483 fprintf(stderr
," srcrect: %dx%d-%dx%d\n",rsrc
->left
,rsrc
->top
,rsrc
->right
,rsrc
->bottom
);
485 bpp
= this->s
.ddraw
->d
.depth
/8;
486 for (i
=0;i
<rsrc
->bottom
-rsrc
->top
;i
++) {
487 memcpy( this->s
.surface
+((i
+dsty
)*this->s
.width
*bpp
)+dstx
*bpp
,
488 src
->s
.surface
+(rsrc
->top
+i
)*src
->s
.width
*bpp
+rsrc
->left
*bpp
,
489 (rsrc
->right
-rsrc
->left
)*bpp
495 static HRESULT WINAPI
IDirectDrawSurface_BltBatch(
496 LPDIRECTDRAWSURFACE
this,LPDDBLTBATCH ddbltbatch
,DWORD x
,DWORD y
498 fprintf(stderr
,"IDirectDrawSurface(%p)->BltBatch(%p,%08lx,%08lx),stub!\n",
504 static HRESULT WINAPI
IDirectDrawSurface_GetCaps(
505 LPDIRECTDRAWSURFACE
this,LPDDSCAPS caps
507 dprintf_info(ddraw
,"IDirectDrawSurface(%p)->GetCaps(%p)\n",this,caps
);
508 caps
->dwCaps
= DDCAPS_PALETTE
; /* probably more */
512 static HRESULT WINAPI
IDirectDrawSurface_GetSurfaceDesc(
513 LPDIRECTDRAWSURFACE
this,LPDDSURFACEDESC ddsd
515 if (debugging_info(ddraw
)) {
516 dprintf_info(ddraw
, "IDirectDrawSurface(%p)->GetSurfaceDesc(%p)\n",
518 fprintf(stderr
," flags: ");
519 _dump_DDSD(ddsd
->dwFlags
);
520 fprintf(stderr
,"\n");
523 ddsd
->dwFlags
|= DDSD_PIXELFORMAT
|DDSD_CAPS
|DDSD_BACKBUFFERCOUNT
|DDSD_HEIGHT
|DDSD_WIDTH
;
524 ddsd
->ddsCaps
.dwCaps
= DDSCAPS_PALETTE
;
525 ddsd
->dwBackBufferCount
= 1;
526 ddsd
->dwHeight
= this->s
.height
;
527 ddsd
->dwWidth
= this->s
.width
;
528 ddsd
->lPitch
= this->s
.lpitch
;
529 if (this->s
.backbuffer
)
530 ddsd
->ddsCaps
.dwCaps
|= DDSCAPS_PRIMARYSURFACE
|DDSCAPS_FLIP
;
531 _getpixelformat(this->s
.ddraw
,&(ddsd
->ddpfPixelFormat
));
536 static ULONG WINAPI
IDirectDrawSurface_AddRef(LPDIRECTDRAWSURFACE
this) {
537 dprintf_info(ddraw
,"IDirectDrawSurface(%p)->AddRef()\n",this);
538 return ++(this->ref
);
541 static ULONG WINAPI
IDirectDrawSurface_Release(LPDIRECTDRAWSURFACE
this) {
542 dprintf_info(ddraw
,"IDirectDrawSurface(%p)->Release()\n",this);
543 if (!--(this->ref
)) {
544 this->s
.ddraw
->lpvtbl
->fnRelease(this->s
.ddraw
);
545 /* clear out of surface list */
546 if (this->s
.fb_height
== -1) {
547 HeapFree(GetProcessHeap(),0,this->s
.surface
);
549 this->s
.ddraw
->d
.vpmask
&= ~(1<<(this->s
.fb_height
/this->s
.ddraw
->d
.fb_height
));
551 HeapFree(GetProcessHeap(),0,this);
557 static HRESULT WINAPI
IDirectDrawSurface_GetAttachedSurface(
558 LPDIRECTDRAWSURFACE
this,LPDDSCAPS lpddsd
,LPDIRECTDRAWSURFACE
*lpdsf
560 dprintf_info(ddraw
, "IDirectDrawSurface(%p)->GetAttachedSurface(%p,%p)\n",
561 this, lpddsd
, lpdsf
);
562 if (debugging_info(ddraw
)) {
563 fprintf(stderr
," caps ");
564 _dump_DDSCAPS(lpddsd
->dwCaps
);
565 fprintf(stderr
,"\n");
567 if (!(lpddsd
->dwCaps
& DDSCAPS_BACKBUFFER
)) {
568 fprintf(stderr
,"IDirectDrawSurface::GetAttachedSurface():whoops, can only handle backbuffers for now\n");
571 /* FIXME: should handle more than one backbuffer */
572 *lpdsf
= this->s
.backbuffer
;
576 static HRESULT WINAPI
IDirectDrawSurface_Initialize(
577 LPDIRECTDRAWSURFACE
this,LPDIRECTDRAW ddraw
,LPDDSURFACEDESC lpdsfd
579 return DDERR_ALREADYINITIALIZED
;
582 static HRESULT WINAPI
IDirectDrawSurface_GetPixelFormat(
583 LPDIRECTDRAWSURFACE
this,LPDDPIXELFORMAT pf
585 return _getpixelformat(this->s
.ddraw
,pf
);
588 static HRESULT WINAPI
IDirectDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE
this,DWORD dwFlags
) {
589 fprintf(stderr
,"IDirectDrawSurface(%p)->GetBltStatus(0x%08lx),stub!\n",
595 static HRESULT WINAPI
IDirectDrawSurface_GetOverlayPosition(
596 LPDIRECTDRAWSURFACE
this,LPLONG x1
,LPLONG x2
598 fprintf(stderr
,"IDirectDrawSurface(%p)->GetOverlayPosition(%p,%p),stub!\n",
604 static HRESULT WINAPI
IDirectDrawSurface_SetClipper(
605 LPDIRECTDRAWSURFACE
this,LPDIRECTDRAWCLIPPER clipper
607 fprintf(stderr
,"IDirectDrawSurface(%p)->SetClipper(%p),stub!\n",this,clipper
);
611 static HRESULT WINAPI
IDirectDrawSurface_AddAttachedSurface(
612 LPDIRECTDRAWSURFACE
this,LPDIRECTDRAWSURFACE surf
614 fprintf(stderr
,"IDirectDrawSurface(%p)->AddAttachedSurface(%p),stub!\n",this,surf
);
615 this->s
.backbuffer
= surf
;
619 static HRESULT WINAPI
IDirectDrawSurface_GetDC(LPDIRECTDRAWSURFACE
this,HDC32
* lphdc
) {
620 fprintf(stderr
,"IDirectDrawSurface(%p)->GetDC(%p),stub!\n",this,lphdc
);
624 static HRESULT WINAPI
IDirectDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE
this,REFIID refiid
,LPVOID
*obj
) {
627 WINE_StringFromCLSID((LPCLSID
)refiid
,xrefiid
);
628 dprintf_info(ddraw
,"IDirectDrawSurface(%p)->QueryInterface(%s,%p)\n",this,xrefiid
,obj
);
630 /* thats version 3 (DirectX 5) */
631 if ( !memcmp(&IID_IDirectDrawSurface3
,refiid
,sizeof(IID_IDirectDrawSurface3
))) {
632 this->lpvtbl
->fnAddRef(this);
633 this->lpvtbl
= (LPDIRECTDRAWSURFACE_VTABLE
)&dds3vt
;
637 /* thats version 2 (DirectX 3) */
638 if ( !memcmp(&IID_IDirectDrawSurface2
,refiid
,sizeof(IID_IDirectDrawSurface2
))) {
639 this->lpvtbl
->fnAddRef(this);
640 this->lpvtbl
= (LPDIRECTDRAWSURFACE_VTABLE
)&dds2vt
;
645 if (!memcmp(&IID_IDirectDrawSurface
,refiid
,sizeof(IID_IDirectDrawSurface
))) {
646 this->lpvtbl
->fnAddRef(this);
650 fprintf(stderr
,"IDirectDrawSurface(%p):interface for IID %s _NOT_ found!\n",this,xrefiid
);
651 return OLE_E_ENUM_NOMORE
;
654 static HRESULT WINAPI
IDirectDrawSurface_IsLost(LPDIRECTDRAWSURFACE
this) {
658 static struct IDirectDrawSurface_VTable ddsvt
= {
659 IDirectDrawSurface_QueryInterface
,
660 IDirectDrawSurface_AddRef
,
661 IDirectDrawSurface_Release
,
662 IDirectDrawSurface_AddAttachedSurface
,
664 IDirectDrawSurface_Blt
,
665 IDirectDrawSurface_BltBatch
,
666 IDirectDrawSurface_BltFast
,
670 IDirectDrawSurface_Flip
,
671 IDirectDrawSurface_GetAttachedSurface
,
672 IDirectDrawSurface_GetBltStatus
,
673 IDirectDrawSurface_GetCaps
,
676 IDirectDrawSurface_GetDC
,
678 IDirectDrawSurface_GetOverlayPosition
,
680 IDirectDrawSurface_GetPixelFormat
,
681 IDirectDrawSurface_GetSurfaceDesc
,
682 IDirectDrawSurface_Initialize
,
683 IDirectDrawSurface_IsLost
,
684 IDirectDrawSurface_Lock
,
687 IDirectDrawSurface_SetClipper
,
690 IDirectDrawSurface_SetPalette
,
691 IDirectDrawSurface_Unlock
,
697 /******************************************************************************
698 * IDirectDrawSurface2
700 * calls IDirectDrawSurface methods where possible
702 static HRESULT WINAPI
IDirectDrawSurface2_Lock(
703 LPDIRECTDRAWSURFACE2
this,LPRECT32 lprect
,LPDDSURFACEDESC lpddsd
,DWORD flags
, HANDLE32 hnd
705 return IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE
)this,lprect
,lpddsd
,flags
,hnd
);
708 static HRESULT WINAPI
IDirectDrawSurface2_Unlock(
709 LPDIRECTDRAWSURFACE2
this,LPVOID surface
711 dprintf_info(ddraw
,"IDirectDrawSurface2(%p)->Unlock(%p)\n",this,surface
);
715 static HRESULT WINAPI
IDirectDrawSurface2_SetPalette(
716 LPDIRECTDRAWSURFACE2
this,LPDIRECTDRAWPALETTE pal
718 return IDirectDrawSurface_SetPalette((LPDIRECTDRAWSURFACE
)this,pal
);
721 static ULONG WINAPI
IDirectDrawSurface2_AddRef(LPDIRECTDRAWSURFACE2
this) {
722 dprintf_info(ddraw
,"IDirectDrawSurface2(%p)->AddRef()\n",this);
723 return ++(this->ref
);
726 static ULONG WINAPI
IDirectDrawSurface2_Release(LPDIRECTDRAWSURFACE2
this) {
727 return IDirectDrawSurface_Release((LPDIRECTDRAWSURFACE
)this);
730 static HRESULT WINAPI
IDirectDrawSurface2_GetAttachedSurface(
731 LPDIRECTDRAWSURFACE2
this,LPDDSCAPS lpddsd
,LPDIRECTDRAWSURFACE2
*lpdsf
733 HRESULT ret
= IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE
)this,lpddsd
,(LPDIRECTDRAWSURFACE
*)lpdsf
);
736 (*lpdsf
)->lpvtbl
= &dds2vt
;
740 static HRESULT WINAPI
IDirectDrawSurface2_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE2
this,LPVOID context
,LPDDENUMSURFACESCALLBACK esfcb
) {
741 fprintf(stderr
,"IDirectDrawSurface(%p)->EnumAttachedSurfaces(%p,%p),stub!\n",this,context
,esfcb
);
745 static HRESULT WINAPI
IDirectDrawSurface2_QueryInterface(
746 LPDIRECTDRAWSURFACE2
this,REFIID riid
,LPVOID
*ppobj
748 return IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE
)this,riid
,ppobj
);
751 static HRESULT WINAPI
IDirectDrawSurface2_IsLost(LPDIRECTDRAWSURFACE2
this) {
756 static struct IDirectDrawSurface2_VTable dds2vt
= {
757 IDirectDrawSurface2_QueryInterface
,
758 IDirectDrawSurface2_AddRef
,
759 IDirectDrawSurface2_Release
,
762 (void*)6/*IDirectDrawSurface_Blt*/,
763 (void*)7/*IDirectDrawSurface_BltBatch*/,
766 IDirectDrawSurface2_EnumAttachedSurfaces
,
769 IDirectDrawSurface2_GetAttachedSurface
,
771 (void*)15/*IDirectDrawSurface_GetCaps*/,
779 (void*)23/*IDirectDrawSurface_GetSurfaceDesc*/,
781 IDirectDrawSurface2_IsLost
,
782 IDirectDrawSurface2_Lock
,
788 IDirectDrawSurface2_SetPalette
,
789 IDirectDrawSurface2_Unlock
,
798 /******************************************************************************
799 * IDirectDrawSurface3
801 static HRESULT WINAPI
IDirectDrawSurface3_SetPalette(
802 LPDIRECTDRAWSURFACE3
this,LPDIRECTDRAWPALETTE pal
804 return IDirectDrawSurface_SetPalette((LPDIRECTDRAWSURFACE
)this,pal
);
807 static HRESULT WINAPI
IDirectDrawSurface3_GetPixelFormat(
808 LPDIRECTDRAWSURFACE3
this,LPDDPIXELFORMAT pf
810 return _getpixelformat(this->s
.ddraw
,pf
);
813 static HRESULT WINAPI
IDirectDrawSurface3_GetAttachedSurface(
814 LPDIRECTDRAWSURFACE3
this,LPDDSCAPS lpddsd
,LPDIRECTDRAWSURFACE3
*lpdsf
816 HRESULT ret
= IDirectDrawSurface_GetAttachedSurface((LPDIRECTDRAWSURFACE
)this,lpddsd
,(LPDIRECTDRAWSURFACE
*)lpdsf
);
819 (*lpdsf
)->lpvtbl
= &dds3vt
;
823 static ULONG WINAPI
IDirectDrawSurface3_AddRef(LPDIRECTDRAWSURFACE3
this) {
824 dprintf_info(ddraw
,"IDirectDrawSurface3(%p)->AddRef()\n",this);
825 return ++(this->ref
);
828 static ULONG WINAPI
IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3
this) {
829 dprintf_info(ddraw
,"IDirectDrawSurface3(%p)->Release()\n",this);
830 if (!--(this->ref
)) {
831 this->s
.ddraw
->lpvtbl
->fnRelease(this->s
.ddraw
);
832 this->s
.ddraw
->d
.vpmask
&= ~(1<<(this->s
.fb_height
/this->s
.ddraw
->d
.fb_height
));
833 HeapFree(GetProcessHeap(),0,this);
839 static HRESULT WINAPI
IDirectDrawSurface3_Blt(
840 LPDIRECTDRAWSURFACE3
this,LPRECT32 rdst
,LPDIRECTDRAWSURFACE3 src
,
841 LPRECT32 rsrc
,DWORD dwFlags
,LPDDBLTFX lpbltfx
843 return IDirectDrawSurface_Blt((LPDIRECTDRAWSURFACE
)this,rdst
,(LPDIRECTDRAWSURFACE
)src
,rsrc
,dwFlags
,lpbltfx
);
846 static HRESULT WINAPI
IDirectDrawSurface3_IsLost(LPDIRECTDRAWSURFACE3
this) {
850 static HRESULT WINAPI
IDirectDrawSurface3_Restore(LPDIRECTDRAWSURFACE3
this) {
854 static HRESULT WINAPI
IDirectDrawSurface3_GetBltStatus(
855 LPDIRECTDRAWSURFACE3
this,DWORD dwflags
857 return IDirectDrawSurface_GetBltStatus((LPDIRECTDRAWSURFACE
)this,dwflags
);
860 static HRESULT WINAPI
IDirectDrawSurface3_Flip(
861 LPDIRECTDRAWSURFACE3
this,LPDIRECTDRAWSURFACE3 flipto
,DWORD dwFlags
863 return IDirectDrawSurface_Flip((LPDIRECTDRAWSURFACE
)this,(LPDIRECTDRAWSURFACE
)flipto
,dwFlags
);
866 static HRESULT WINAPI
IDirectDrawSurface3_Lock(
867 LPDIRECTDRAWSURFACE3
this,LPRECT32 lprect
,LPDDSURFACEDESC lpddsd
,DWORD flags
, HANDLE32 hnd
869 return IDirectDrawSurface_Lock((LPDIRECTDRAWSURFACE
)this,lprect
,lpddsd
,flags
,hnd
);
872 static HRESULT WINAPI
IDirectDrawSurface3_Unlock(
873 LPDIRECTDRAWSURFACE3
this,LPVOID surface
875 return IDirectDrawSurface_Unlock((LPDIRECTDRAWSURFACE
)this,surface
);
878 static HRESULT WINAPI
IDirectDrawSurface3_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3
this,LPVOID context
,LPDDENUMSURFACESCALLBACK esfcb
) {
879 fprintf(stderr
,"IDirectDrawSurface3(%p)->EnumAttachedSurfaces(%p,%p),stub!\n",this,context
,esfcb
);
883 static HRESULT WINAPI
IDirectDrawSurface3_SetClipper(
884 LPDIRECTDRAWSURFACE3
this,LPDIRECTDRAWCLIPPER clipper
886 return IDirectDrawSurface_SetClipper((LPDIRECTDRAWSURFACE
)this,clipper
);
889 static HRESULT WINAPI
IDirectDrawSurface3_QueryInterface(
890 LPDIRECTDRAWSURFACE3
this,REFIID riid
,LPVOID
*ppobj
892 return IDirectDrawSurface_QueryInterface((LPDIRECTDRAWSURFACE
)this,riid
,ppobj
);
895 static struct IDirectDrawSurface3_VTable dds3vt
= {
896 IDirectDrawSurface3_QueryInterface
,
897 IDirectDrawSurface3_AddRef
,
898 IDirectDrawSurface3_Release
,
901 IDirectDrawSurface3_Blt
,
905 IDirectDrawSurface3_EnumAttachedSurfaces
,
907 IDirectDrawSurface3_Flip
,
908 IDirectDrawSurface3_GetAttachedSurface
,
909 IDirectDrawSurface3_GetBltStatus
,
917 IDirectDrawSurface3_GetPixelFormat
,
920 IDirectDrawSurface3_IsLost
,
921 IDirectDrawSurface3_Lock
,
923 IDirectDrawSurface3_Restore
,
924 IDirectDrawSurface3_SetClipper
,
927 IDirectDrawSurface3_SetPalette
,
928 IDirectDrawSurface3_Unlock
,
939 /******************************************************************************
942 static HRESULT WINAPI
IDirectDrawClipper_SetHwnd(
943 LPDIRECTDRAWCLIPPER
this,DWORD x
,HWND32 hwnd
945 fprintf(stderr
,"IDirectDrawClipper(%p)->SetHwnd(0x%08lx,0x%08lx),stub!\n",this,x
,(DWORD
)hwnd
);
949 static ULONG WINAPI
IDirectDrawClipper_Release(LPDIRECTDRAWCLIPPER
this) {
953 HeapFree(GetProcessHeap(),0,this);
957 static struct IDirectDrawClipper_VTable ddclipvt
= {
960 IDirectDrawClipper_Release
,
966 IDirectDrawClipper_SetHwnd
969 /******************************************************************************
972 static HRESULT WINAPI
IDirectDrawPalette_GetEntries(
973 LPDIRECTDRAWPALETTE
this,DWORD x
,DWORD start
,DWORD end
,LPPALETTEENTRY palent
977 fprintf(stderr
,"IDirectDrawPalette(%p)->GetEntries(%08lx,%ld,%ld,%p),stub!\n",
978 this,x
,start
,end
,palent
980 for (i
=start
;i
<end
;i
++) {
981 palent
[i
-start
].peRed
= i
;
982 palent
[i
-start
].peGreen
= i
;
983 palent
[i
-start
].peBlue
= i
;
988 static HRESULT WINAPI
IDirectDrawPalette_SetEntries(
989 LPDIRECTDRAWPALETTE
this,DWORD x
,DWORD start
,DWORD end
,LPPALETTEENTRY palent
994 dprintf_info(ddraw
,"IDirectDrawPalette(%p)->SetEntries(%08lx,%ld,%ld,%p)\n",
995 this,x
,start
,end
,palent
997 if (!this->cm
) /* should not happen */ {
998 fprintf(stderr
,"no colormap in SetEntries???\n");
999 return DDERR_GENERIC
;
1001 /* FIXME: free colorcells instead of freeing whole map */
1002 TSXFreeColormap(display
,this->cm
);
1003 this->cm
= TSXCreateColormap(display
,DefaultRootWindow(display
),DefaultVisualOfScreen(screen
),AllocAll
);
1005 xc
.red
= xc
.blue
= xc
.green
= 0; xc
.flags
= DoRed
|DoGreen
|DoBlue
; xc
.pixel
= 0; TSXStoreColor(display
,this->cm
,&xc
);
1006 this->palents
[0].peRed
= 0;
1007 this->palents
[0].peBlue
= 0;
1008 this->palents
[0].peGreen
= 0;
1011 xc
.red
= xc
.blue
= xc
.green
= 0xffff; xc
.flags
= DoRed
|DoGreen
|DoBlue
; xc
.pixel
= 255; TSXStoreColor(display
,this->cm
,&xc
);
1012 this->palents
[255].peRed
= 255;
1013 this->palents
[255].peBlue
= 255;
1014 this->palents
[255].peGreen
= 255;
1016 for (i
=start
;i
<end
;i
++) {
1017 xc
.red
= palent
[i
-start
].peRed
<<8;
1018 xc
.blue
= palent
[i
-start
].peBlue
<<8;
1019 xc
.green
= palent
[i
-start
].peGreen
<<8;
1020 xc
.flags
= DoRed
|DoBlue
|DoGreen
;
1022 TSXStoreColor(display
,this->cm
,&xc
);
1023 this->palents
[i
].peRed
= palent
[i
-start
].peRed
;
1024 this->palents
[i
].peBlue
= palent
[i
-start
].peBlue
;
1025 this->palents
[i
].peGreen
= palent
[i
-start
].peGreen
;
1027 XF86DGAInstallColormap(display
,DefaultScreen(display
),this->cm
);
1031 static ULONG WINAPI
IDirectDrawPalette_Release(LPDIRECTDRAWPALETTE
this) {
1032 if (!--(this->ref
)) {
1034 TSXFreeColormap(display
,this->cm
);
1037 HeapFree(GetProcessHeap(),0,this);
1043 static ULONG WINAPI
IDirectDrawPalette_AddRef(LPDIRECTDRAWPALETTE
this) {
1044 return ++(this->ref
);
1047 static HRESULT WINAPI
IDirectDrawPalette_Initialize(
1048 LPDIRECTDRAWPALETTE
this,LPDIRECTDRAW ddraw
,DWORD x
,LPPALETTEENTRY palent
1050 return DDERR_ALREADYINITIALIZED
;
1053 static struct IDirectDrawPalette_VTable ddpalvt
= {
1055 IDirectDrawPalette_AddRef
,
1056 IDirectDrawPalette_Release
,
1058 IDirectDrawPalette_GetEntries
,
1059 IDirectDrawPalette_Initialize
,
1060 IDirectDrawPalette_SetEntries
1063 /*******************************************************************************
1066 static struct IDirect3D_VTable d3dvt
= {
1078 /*******************************************************************************
1081 static ULONG WINAPI
IDirect3D2_Release(LPDIRECT3D2
this) {
1084 this->ddraw
->lpvtbl
->fnRelease(this->ddraw
);
1085 HeapFree(GetProcessHeap(),0,this);
1091 static HRESULT WINAPI
IDirect3D2_EnumDevices(
1092 LPDIRECT3D2
this,LPD3DENUMDEVICESCALLBACK cb
, LPVOID context
1094 D3DDEVICEDESC d1
,d2
;
1096 fprintf(stderr
,"IDirect3D2(%p)->EnumDevices(%p,%p),stub!\n",this,cb
,context
);
1097 d1
.dwSize
= sizeof(d1
);
1100 d2
.dwSize
= sizeof(d2
);
1102 cb(&IID_IDirect3DHALDevice
,"WINE Direct3D HAL","direct3d",&d1
,&d2
,context
);
1106 static struct IDirect3D2_VTable d3d2vt
= {
1110 IDirect3D2_EnumDevices
,
1118 /*******************************************************************************
1121 static HRESULT WINAPI
IDirectDraw_CreateSurface(
1122 LPDIRECTDRAW
this,LPDDSURFACEDESC lpddsd
,LPDIRECTDRAWSURFACE
*lpdsf
,IUnknown
*lpunk
1126 dprintf_info(ddraw
, "IDirectDraw(%p)->CreateSurface(%p,%p,%p)\n",
1127 this,lpddsd
,lpdsf
,lpunk
);
1128 if (debugging_info(ddraw
)) {
1129 fprintf(stderr
,"[w=%ld,h=%ld,flags ",lpddsd
->dwWidth
,lpddsd
->dwHeight
);
1130 _dump_DDSD(lpddsd
->dwFlags
);
1131 fprintf(stderr
,"caps ");
1132 _dump_DDSCAPS(lpddsd
->ddsCaps
.dwCaps
);
1133 fprintf(stderr
,"]\n");
1136 *lpdsf
= (LPDIRECTDRAWSURFACE
)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IDirectDrawSurface
));
1137 this->lpvtbl
->fnAddRef(this);
1139 (*lpdsf
)->lpvtbl
= &ddsvt
;
1140 if ( (lpddsd
->dwFlags
& DDSD_CAPS
) &&
1141 (lpddsd
->ddsCaps
.dwCaps
& DDSCAPS_OFFSCREENPLAIN
)
1143 if (!(lpddsd
->dwFlags
& DDSD_WIDTH
))
1144 lpddsd
->dwWidth
= this->d
.fb_width
;
1145 if (!(lpddsd
->dwFlags
& DDSD_HEIGHT
))
1146 lpddsd
->dwWidth
= this->d
.fb_height
;
1147 (*lpdsf
)->s
.surface
= (LPBYTE
)HeapAlloc(GetProcessHeap(),0,lpddsd
->dwWidth
*lpddsd
->dwHeight
*this->d
.depth
/8);
1148 (*lpdsf
)->s
.fb_height
= -1;
1149 (*lpdsf
)->s
.lpitch
= lpddsd
->dwWidth
*this->d
.depth
/8;
1150 dprintf_info(ddraw
,"using system memory for a primary surface\n");
1153 if (!(this->d
.vpmask
& (1<<i
)))
1155 dprintf_info(ddraw
,"using viewport %d for a primary surface\n",i
);
1156 /* if i == 32 or maximum ... return error */
1157 this->d
.vpmask
|=(1<<i
);
1158 (*lpdsf
)->s
.surface
= this->d
.fb_addr
+((i
*this->d
.fb_height
)*this->d
.fb_width
*this->d
.depth
/8);
1159 (*lpdsf
)->s
.fb_height
= i
*this->d
.fb_height
;
1160 (*lpdsf
)->s
.lpitch
= this->d
.fb_width
*this->d
.depth
/8;
1163 lpddsd
->lPitch
= (*lpdsf
)->s
.lpitch
;
1165 (*lpdsf
)->s
.width
= this->d
.width
;
1166 (*lpdsf
)->s
.height
= this->d
.height
;
1167 (*lpdsf
)->s
.ddraw
= this;
1168 (*lpdsf
)->s
.backbuffer
= NULL
;
1169 if (lpddsd
->dwFlags
& DDSD_BACKBUFFERCOUNT
) {
1170 LPDIRECTDRAWSURFACE back
;
1172 if (lpddsd
->dwBackBufferCount
>1)
1173 fprintf(stderr
,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd
->dwBackBufferCount
);
1175 (*lpdsf
)->s
.backbuffer
= back
= (LPDIRECTDRAWSURFACE
)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IDirectDrawSurface
));
1176 this->lpvtbl
->fnAddRef(this);
1178 back
->lpvtbl
= &ddsvt
;
1180 if (!(this->d
.vpmask
& (1<<i
)))
1182 dprintf_info(ddraw
,"using viewport %d for backbuffer\n",i
);
1183 /* if i == 32 or maximum ... return error */
1184 this->d
.vpmask
|=(1<<i
);
1185 back
->s
.surface
= this->d
.fb_addr
+((i
*this->d
.fb_height
)*this->d
.fb_width
*this->d
.depth
/8);
1186 back
->s
.fb_height
= i
*this->d
.fb_height
;
1188 back
->s
.width
= this->d
.width
;
1189 back
->s
.height
= this->d
.height
;
1190 back
->s
.ddraw
= this;
1191 back
->s
.lpitch
= this->d
.fb_width
*this->d
.depth
/8;
1192 back
->s
.backbuffer
= NULL
; /* does not have a backbuffer, it is
1198 static HRESULT WINAPI
IDirectDraw_DuplicateSurface(
1199 LPDIRECTDRAW
this,LPDIRECTDRAWSURFACE src
,LPDIRECTDRAWSURFACE
*dst
1201 fprintf(stderr
,"IDirectDraw(%p)->DuplicateSurface(%p,%p)\n",this,src
,dst
);
1202 *dst
= src
; /* FIXME */
1206 static HRESULT WINAPI
IDirectDraw_SetCooperativeLevel(
1207 LPDIRECTDRAW
this,HWND32 hwnd
,DWORD cooplevel
1214 FE(DDSCL_FULLSCREEN
)
1215 FE(DDSCL_ALLOWREBOOT
)
1216 FE(DDSCL_NOWINDOWCHANGES
)
1218 FE(DDSCL_ALLOWMODEX
)
1220 FE(DDSCL_SETFOCUSWINDOW
)
1221 FE(DDSCL_SETDEVICEWINDOW
)
1222 FE(DDSCL_CREATEDEVICEWINDOW
)
1225 dprintf_info(ddraw
,"IDirectDraw(%p)->SetCooperativeLevel(%08lx,%08lx)\n",
1226 this,(DWORD
)hwnd
,cooplevel
1228 if(debugging_info(ddraw
)){
1229 dbg_decl_str(ddraw
, 512);
1230 for (i
=0;i
<sizeof(flagmap
)/sizeof(flagmap
[0]);i
++)
1231 if (flagmap
[i
].mask
& cooplevel
)
1232 dsprintf(ddraw
, "%s ", flagmap
[i
].name
);
1233 dprintf_info(ddraw
," cooperative level %s\n", dbg_str(ddraw
));
1235 this->d
.mainwindow
= hwnd
;
1240 static HRESULT WINAPI
IDirectDraw_SetDisplayMode(
1241 LPDIRECTDRAW
this,DWORD width
,DWORD height
,DWORD depth
1243 int i
,*depths
,depcount
;
1246 dprintf_fixme(ddraw
, "IDirectDraw(%p)->SetDisplayMode(%ld,%ld,%ld),stub!\n",
1247 this, width
, height
, depth
);
1249 depths
= TSXListDepths(display
,DefaultScreen(display
),&depcount
);
1250 for (i
=0;i
<depcount
;i
++)
1251 if (depths
[i
]==depth
)
1254 if (i
==depcount
) {/* not found */
1255 sprintf(buf
,"SetDisplayMode(w=%ld,h=%ld,d=%ld), unsupported depth!",width
,height
,depth
);
1256 MessageBox32A(0,buf
,"WINE DirectDraw",MB_OK
|MB_ICONSTOP
);
1257 return DDERR_UNSUPPORTEDMODE
;
1259 if (this->d
.fb_width
< width
) {
1260 sprintf(buf
,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width
,height
,depth
,width
,this->d
.fb_width
);
1261 MessageBox32A(0,buf
,"WINE DirectDraw",MB_OK
|MB_ICONSTOP
);
1262 return DDERR_UNSUPPORTEDMODE
;
1264 this->d
.width
= width
;
1265 this->d
.height
= height
;
1266 /* adjust fb_height, so we don't overlap */
1267 if (this->d
.fb_height
< height
)
1268 this->d
.fb_height
= height
;
1269 this->d
.depth
= depth
;
1271 /* FIXME: this function OVERWRITES several signal handlers.
1272 * can we save them? and restore them later? In a way that
1273 * it works for the library too?
1275 XF86DGADirectVideo(display
,DefaultScreen(display
),XF86DGADirectGraphics
);
1276 XF86DGASetViewPort(display
,DefaultScreen(display
),0,this->d
.fb_height
);
1277 #ifdef RESTORE_SIGNALS
1278 SIGNAL_InitEmulator();
1283 static HRESULT WINAPI
IDirectDraw_GetCaps(
1284 LPDIRECTDRAW
this,LPDDCAPS caps1
,LPDDCAPS caps2
1286 dprintf_info(ddraw
,"IDirectDraw(%p)->GetCaps(%p,%p)\n",this,caps1
,caps2
);
1287 caps1
->dwVidMemTotal
= this->d
.fb_memsize
;
1288 caps1
->dwCaps
= 0xffffffff&~(DDCAPS_BANKSWITCHED
); /* we can do anything */
1289 caps1
->ddsCaps
.dwCaps
= 0xffffffff; /* we can do anything */
1291 caps2
->dwVidMemTotal
= this->d
.fb_memsize
;
1292 caps2
->dwCaps
= 0xffffffff&~(DDCAPS_BANKSWITCHED
); /* we can do anything */
1293 caps2
->ddsCaps
.dwCaps
= 0xffffffff; /* we can do anything */
1298 static HRESULT WINAPI
IDirectDraw_CreateClipper(
1299 LPDIRECTDRAW
this,DWORD x
,LPDIRECTDRAWCLIPPER
*lpddclip
,LPUNKNOWN lpunk
1301 fprintf(stderr
,"IDirectDraw(%p)->CreateClipper(%08lx,%p,%p),stub!\n",
1302 this,x
,lpddclip
,lpunk
1304 *lpddclip
= (LPDIRECTDRAWCLIPPER
)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IDirectDrawClipper
));
1305 (*lpddclip
)->ref
= 1;
1306 (*lpddclip
)->lpvtbl
= &ddclipvt
;
1310 static HRESULT WINAPI
IDirectDraw_CreatePalette(
1311 LPDIRECTDRAW
this,DWORD x
,LPPALETTEENTRY palent
,LPDIRECTDRAWPALETTE
*lpddpal
,LPUNKNOWN lpunk
1313 dprintf_info(ddraw
,"IDirectDraw(%p)->CreatePalette(%08lx,%p,%p,%p)\n",
1314 this,x
,palent
,lpddpal
,lpunk
1316 *lpddpal
= (LPDIRECTDRAWPALETTE
)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IDirectDrawPalette
));
1317 (*lpddpal
)->ref
= 1;
1318 (*lpddpal
)->lpvtbl
= &ddpalvt
;
1319 (*lpddpal
)->ddraw
= this;
1320 if (this->d
.depth
<=8) {
1321 (*lpddpal
)->cm
= TSXCreateColormap(display
,DefaultRootWindow(display
),DefaultVisualOfScreen(screen
),AllocAll
);
1322 } else /* we don't want palettes in hicolor or truecolor */
1328 static HRESULT WINAPI
IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW
this) {
1329 dprintf_fixme(ddraw
, "IDirectDraw(%p)->RestoreDisplayMode(),stub!\n",
1332 XF86DGADirectVideo(display
,DefaultScreen(display
),0);
1333 #ifdef RESTORE_SIGNALS
1334 SIGNAL_InitEmulator();
1340 static HRESULT WINAPI
IDirectDraw_WaitForVerticalBlank(
1341 LPDIRECTDRAW
this,DWORD x
,HANDLE32 h
1343 dprintf_info(ddraw
,"IDirectDraw(%p)->WaitForVerticalBlank(0x%08lx,0x%08x),stub!\n",this,x
,h
);
1347 static ULONG WINAPI
IDirectDraw_AddRef(LPDIRECTDRAW
this) {
1348 return ++(this->ref
);
1351 static ULONG WINAPI
IDirectDraw_Release(LPDIRECTDRAW
this) {
1352 if (!--(this->ref
)) {
1353 XF86DGADirectVideo(display
,DefaultScreen(display
),0);
1354 #ifdef RESTORE_SIGNALS
1355 SIGNAL_InitEmulator();
1357 HeapFree(GetProcessHeap(),0,this);
1363 static HRESULT WINAPI
IDirectDraw_QueryInterface(
1364 LPDIRECTDRAW
this,REFIID refiid
,LPVOID
*obj
1368 WINE_StringFromCLSID((LPCLSID
)refiid
,xrefiid
);
1369 dprintf_info(ddraw
,"IDirectDraw(%p)->QueryInterface(%s,%p)\n",this,xrefiid
,obj
);
1370 if (!memcmp(&IID_IUnknown
,refiid
,sizeof(IID_IUnknown
))) {
1372 this->lpvtbl
->fnAddRef(this);
1375 if (!memcmp(&IID_IDirectDraw
,refiid
,sizeof(IID_IDirectDraw
))) {
1377 this->lpvtbl
->fnAddRef(this);
1380 if (!memcmp(&IID_IDirectDraw2
,refiid
,sizeof(IID_IDirectDraw2
))) {
1381 this->lpvtbl
= (LPDIRECTDRAW_VTABLE
)&dd2vt
;
1382 this->lpvtbl
->fnAddRef(this);
1386 if (!memcmp(&IID_IDirect3D
,refiid
,sizeof(IID_IDirect3D
))) {
1389 d3d
= HeapAlloc(GetProcessHeap(),0,sizeof(*d3d
));
1392 this->lpvtbl
->fnAddRef(this);
1393 d3d
->lpvtbl
= &d3dvt
;
1397 if (!memcmp(&IID_IDirect3D2
,refiid
,sizeof(IID_IDirect3D
))) {
1400 d3d
= HeapAlloc(GetProcessHeap(),0,sizeof(*d3d
));
1403 this->lpvtbl
->fnAddRef(this);
1404 d3d
->lpvtbl
= &d3d2vt
;
1408 fprintf(stderr
,"IDirectDraw(%p):interface for IID %s _NOT_ found!\n",this,xrefiid
);
1409 return OLE_E_ENUM_NOMORE
;
1412 static HRESULT WINAPI
IDirectDraw_GetVerticalBlankStatus(
1413 LPDIRECTDRAW
this,BOOL32
*status
1415 dprintf_info(ddraw
,"IDirectDraw(%p)->GetVerticalBlankSatus(%p)\n",this,status
);
1420 static HRESULT WINAPI
IDirectDraw_EnumDisplayModes(
1421 LPDIRECTDRAW
this,DWORD dwFlags
,LPDDSURFACEDESC lpddsfd
,LPVOID context
,LPDDENUMMODESCALLBACK modescb
1423 DDSURFACEDESC ddsfd
;
1425 dprintf_info(ddraw
,"IDirectDraw(%p)->EnumDisplayModes(0x%08lx,%p,%p,%p)\n",this,dwFlags
,lpddsfd
,context
,modescb
);
1428 _getpixelformat(this,&(ddsfd
.ddpfPixelFormat
));
1429 ddsfd
.dwSize
= sizeof(ddsfd
);
1430 ddsfd
.dwFlags
= DDSD_HEIGHT
|DDSD_WIDTH
|DDSD_BACKBUFFERCOUNT
|DDSD_PIXELFORMAT
|DDSD_CAPS
;
1431 if (dwFlags
& DDEDM_REFRESHRATES
) {
1432 ddsfd
.dwFlags
|= DDSD_REFRESHRATE
;
1433 ddsfd
.x
.dwRefreshRate
= 60;
1436 ddsfd
.dwWidth
= 640;
1437 ddsfd
.dwHeight
= 480;
1438 ddsfd
.dwBackBufferCount
= 1;
1439 ddsfd
.ddsCaps
.dwCaps
= DDSCAPS_PALETTE
;
1441 if (!modescb(&ddsfd
,context
)) return 0;
1443 ddsfd
.dwWidth
= 800;
1444 ddsfd
.dwHeight
= 600;
1445 if (!modescb(&ddsfd
,context
)) return 0;
1447 if (!(dwFlags
& DDEDM_STANDARDVGAMODES
)) {
1448 /* modeX is not standard VGA */
1450 ddsfd
.dwHeight
= 200;
1451 ddsfd
.dwWidth
= 320;
1452 if (!modescb(&ddsfd
,context
)) return 0;
1457 static HRESULT WINAPI
IDirectDraw_GetDisplayMode(
1458 LPDIRECTDRAW
this,LPDDSURFACEDESC lpddsfd
1460 dprintf_info(ddraw
,"IDirectDraw(%p)->GetDisplayMode(%p)\n",this,lpddsfd
);
1461 lpddsfd
->dwFlags
= DDSD_HEIGHT
|DDSD_WIDTH
|DDSD_PITCH
|DDSD_BACKBUFFERCOUNT
|DDSD_PIXELFORMAT
|DDSD_CAPS
;
1462 lpddsfd
->dwHeight
= screenHeight
;
1463 lpddsfd
->dwWidth
= screenWidth
;
1464 lpddsfd
->lPitch
= this->d
.fb_width
*this->d
.depth
/8;
1465 lpddsfd
->dwBackBufferCount
= 1;
1466 lpddsfd
->x
.dwRefreshRate
= 60;
1467 lpddsfd
->ddsCaps
.dwCaps
= DDSCAPS_PALETTE
;
1468 _getpixelformat(this,&(lpddsfd
->ddpfPixelFormat
));
1472 static HRESULT WINAPI
IDirectDraw_FlipToGDISurface(LPDIRECTDRAW
this) {
1473 fprintf(stderr
,"IDirectDraw(%p)->FlipToGDISurface(),stub!\n",this);
1477 static HRESULT WINAPI
IDirectDraw_GetMonitorFrequency(
1478 LPDIRECTDRAW
this,LPDWORD freq
1480 fprintf(stderr
,"IDirectDraw(%p)->GetMonitorFrequency(%p)\n",this,freq
);
1481 *freq
= 60*100; /* 60 Hz */
1485 static IDirectDraw_VTable ddvt
= {
1486 IDirectDraw_QueryInterface
,
1488 IDirectDraw_Release
,
1490 IDirectDraw_CreateClipper
,
1491 IDirectDraw_CreatePalette
,
1492 IDirectDraw_CreateSurface
,
1493 IDirectDraw_DuplicateSurface
,
1494 IDirectDraw_EnumDisplayModes
,
1496 IDirectDraw_FlipToGDISurface
,
1497 IDirectDraw_GetCaps
,
1498 IDirectDraw_GetDisplayMode
,
1501 IDirectDraw_GetMonitorFrequency
,
1503 IDirectDraw_GetVerticalBlankStatus
,
1505 IDirectDraw_RestoreDisplayMode
,
1506 IDirectDraw_SetCooperativeLevel
,
1507 IDirectDraw_SetDisplayMode
,
1508 IDirectDraw_WaitForVerticalBlank
,
1511 /*****************************************************************************
1515 static HRESULT WINAPI
IDirectDraw2_CreateClipper(
1516 LPDIRECTDRAW2
this,DWORD x
,LPDIRECTDRAWCLIPPER
*lpddclip
,LPUNKNOWN lpunk
1518 return IDirectDraw_CreateClipper((LPDIRECTDRAW
)this,x
,lpddclip
,lpunk
);
1521 static HRESULT WINAPI
IDirectDraw2_CreateSurface(
1522 LPDIRECTDRAW2
this,LPDDSURFACEDESC lpddsd
,LPDIRECTDRAWSURFACE
*lpdsf
,IUnknown
*lpunk
1524 return IDirectDraw_CreateSurface((LPDIRECTDRAW
)this,lpddsd
,(LPDIRECTDRAWSURFACE
*)lpdsf
,lpunk
);
1527 static HRESULT WINAPI
IDirectDraw2_QueryInterface(
1528 LPDIRECTDRAW2
this,REFIID refiid
,LPVOID
*obj
1530 return IDirectDraw_QueryInterface((LPDIRECTDRAW
)this,refiid
,obj
);
1533 static ULONG WINAPI
IDirectDraw2_AddRef(LPDIRECTDRAW2
this) {
1534 return IDirectDraw_AddRef((LPDIRECTDRAW
)this);
1537 static ULONG WINAPI
IDirectDraw2_Release(LPDIRECTDRAW2
this) {
1538 return IDirectDraw_Release((LPDIRECTDRAW
)this);
1541 static HRESULT WINAPI
IDirectDraw2_GetCaps(
1542 LPDIRECTDRAW2
this,LPDDCAPS caps1
,LPDDCAPS caps2
1544 return IDirectDraw_GetCaps((LPDIRECTDRAW
)this,caps1
,caps2
);
1547 static HRESULT WINAPI
IDirectDraw2_SetCooperativeLevel(
1548 LPDIRECTDRAW2
this,HWND32 hwnd
,DWORD x
1550 return IDirectDraw_SetCooperativeLevel((LPDIRECTDRAW
)this,hwnd
,x
);
1553 static HRESULT WINAPI
IDirectDraw2_CreatePalette(
1554 LPDIRECTDRAW2
this,DWORD x
,LPPALETTEENTRY palent
,LPDIRECTDRAWPALETTE
*lpddpal
,LPUNKNOWN lpunk
1556 return IDirectDraw_CreatePalette((LPDIRECTDRAW
)this,x
,palent
,lpddpal
,lpunk
);
1560 static HRESULT WINAPI
IDirectDraw2_SetDisplayMode(
1561 LPDIRECTDRAW2
this,DWORD width
,DWORD height
,DWORD depth
,DWORD xx
,DWORD yy
1563 dprintf_fixme(ddraw
,"IDirectDraw2(%p)->SetDisplayMode(%ld,%ld,%ld,%08lx,%08lx),stub!\n",
1564 this, width
, height
, depth
, xx
, yy
);
1566 return IDirectDraw_SetDisplayMode((LPDIRECTDRAW
)this,width
,height
,depth
);
1569 static HRESULT WINAPI
IDirectDraw2_RestoreDisplayMode(LPDIRECTDRAW2
this) {
1570 return IDirectDraw_RestoreDisplayMode((LPDIRECTDRAW
)this);
1573 static HRESULT WINAPI
IDirectDraw2_EnumSurfaces(
1574 LPDIRECTDRAW2
this,DWORD x
,LPDDSURFACEDESC ddsfd
,LPVOID context
,LPDDENUMSURFACESCALLBACK ddsfcb
1576 fprintf(stderr
,"IDirectDraw2(%p)->EnumSurfaces(0x%08lx,%p,%p,%p),stub!\n",this,x
,ddsfd
,context
,ddsfcb
);
1580 static HRESULT WINAPI
IDirectDraw2_EnumDisplayModes(
1581 LPDIRECTDRAW2
this,DWORD dwFlags
,LPDDSURFACEDESC lpddsfd
,LPVOID context
,LPDDENUMMODESCALLBACK modescb
1583 return IDirectDraw_EnumDisplayModes((LPDIRECTDRAW
)this,dwFlags
,lpddsfd
,context
,modescb
);
1586 static HRESULT WINAPI
IDirectDraw2_GetDisplayMode(
1587 LPDIRECTDRAW2
this,LPDDSURFACEDESC lpddsfd
1589 return IDirectDraw_GetDisplayMode((LPDIRECTDRAW
)this,lpddsfd
);
1592 static HRESULT WINAPI
IDirectDraw2_GetAvailableVidMem(
1593 LPDIRECTDRAW2
this,LPDDSCAPS ddscaps
,LPDWORD total
,LPDWORD free
1595 fprintf(stderr
,"IDirectDraw2(%p)->GetAvailableVidMem(%p,%p,%p)\n",
1596 this,ddscaps
,total
,free
1598 if (total
) *total
= this->d
.fb_memsize
* 1024;
1599 if (free
) *free
= this->d
.fb_memsize
* 1024;
1603 static HRESULT WINAPI
IDirectDraw2_GetMonitorFrequency(
1604 LPDIRECTDRAW2
this,LPDWORD freq
1606 return IDirectDraw_GetMonitorFrequency((LPDIRECTDRAW
)this,freq
);
1609 static HRESULT WINAPI
IDirectDraw2_GetVerticalBlankStatus(
1610 LPDIRECTDRAW2
this,BOOL32
*status
1612 return IDirectDraw_GetVerticalBlankStatus((LPDIRECTDRAW
)this,status
);
1615 static HRESULT WINAPI
IDirectDraw2_WaitForVerticalBlank(
1616 LPDIRECTDRAW2
this,DWORD x
,HANDLE32 h
1618 return IDirectDraw_WaitForVerticalBlank((LPDIRECTDRAW
)this,x
,h
);
1621 static IDirectDraw2_VTable dd2vt
= {
1622 IDirectDraw2_QueryInterface
,
1623 IDirectDraw2_AddRef
,
1624 IDirectDraw2_Release
,
1626 IDirectDraw2_CreateClipper
,
1627 IDirectDraw2_CreatePalette
,
1628 IDirectDraw2_CreateSurface
,
1630 IDirectDraw2_EnumDisplayModes
,
1631 IDirectDraw2_EnumSurfaces
,
1633 IDirectDraw2_GetCaps
,
1634 IDirectDraw2_GetDisplayMode
,
1637 IDirectDraw2_GetMonitorFrequency
,
1639 IDirectDraw2_GetVerticalBlankStatus
,
1641 IDirectDraw2_RestoreDisplayMode
,
1642 IDirectDraw2_SetCooperativeLevel
,
1643 IDirectDraw2_SetDisplayMode
,
1644 IDirectDraw2_WaitForVerticalBlank
,
1645 IDirectDraw2_GetAvailableVidMem
1649 /******************************************************************************
1653 HRESULT WINAPI
DirectDrawCreate( LPGUID lpGUID
, LPDIRECTDRAW
*lplpDD
, LPUNKNOWN pUnkOuter
) {
1656 int memsize
,banksize
,width
,evbase
,evret
,major
,minor
,flags
,height
;
1660 WINE_StringFromCLSID(lpGUID
,xclsid
);
1662 strcpy(xclsid
,"<null>");
1664 dprintf_info(ddraw
,"DirectDrawCreate(%s,%p,%p)\n",xclsid
,lplpDD
,pUnkOuter
);
1666 MessageBox32A(0,"Using the XF86DGA extension requires the program to be run using UID 0.","WINE DirectDraw",MB_OK
|MB_ICONSTOP
);
1667 return E_UNEXPECTED
;
1669 *lplpDD
= (LPDIRECTDRAW
)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(IDirectDraw
));
1670 (*lplpDD
)->lpvtbl
= &ddvt
;
1672 if (!XF86DGAQueryExtension(display
,&evbase
,&evret
)) {
1673 fprintf(stderr
,"No XF86DGA detected.\n");
1676 XF86DGAQueryVersion(display
,&major
,&minor
);
1677 dprintf_info(ddraw
,"XF86DGA is version %d.%d\n",major
,minor
);
1678 XF86DGAQueryDirectVideo(display
,DefaultScreen(display
),&flags
);
1679 if (!(flags
& XF86DGADirectPresent
))
1680 fprintf(stderr
,"direct video is NOT ENABLED.\n");
1681 XF86DGAGetVideo(display
,DefaultScreen(display
),&addr
,&width
,&banksize
,&memsize
);
1682 dprintf_info(ddraw
,"video framebuffer: begin %p, width %d,banksize %d,memsize %d\n",
1683 addr
,width
,banksize
,memsize
1685 (*lplpDD
)->d
.fb_width
= width
;
1686 (*lplpDD
)->d
.fb_addr
= addr
;
1687 (*lplpDD
)->d
.fb_memsize
= memsize
;
1688 (*lplpDD
)->d
.fb_banksize
= banksize
;
1690 XF86DGAGetViewPortSize(display
,DefaultScreen(display
),&width
,&height
);
1691 XF86DGASetViewPort(display
,DefaultScreen(display
),0,0);
1692 (*lplpDD
)->d
.vp_width
= width
;
1693 (*lplpDD
)->d
.vp_height
= height
;
1694 (*lplpDD
)->d
.fb_height
= screenHeight
;
1695 (*lplpDD
)->d
.vpmask
= 1;
1697 /* just assume the default depth is the DGA depth too */
1698 (*lplpDD
)->d
.depth
= DefaultDepthOfScreen(screen
);
1699 #ifdef RESTORE_SIGNALS
1700 SIGNAL_InitEmulator();
1706 HRESULT WINAPI
DirectDrawCreate( LPGUID lpGUID
, LPDIRECTDRAW
*lplpDD
, LPUNKNOWN pUnkOuter
) {
1707 MessageBox32A(0,"WINE DirectDraw needs the XF86DGA extensions compiled in. (libXxf86dga.a).","WINE DirectDraw",MB_OK
|MB_ICONSTOP
);
1708 return E_OUTOFMEMORY
;