Commit fb019223 authored by Marcus Meissner's avatar Marcus Meissner Committed by Alexandre Julliard

Some ddraw/d3d bugfixes, updated Diablo/WC4 ddraw status.

parent 4a1dbaf6
...@@ -6,17 +6,20 @@ layer is represented by the functions in the Win32 DLL ddraw.dll and the ...@@ -6,17 +6,20 @@ layer is represented by the functions in the Win32 DLL ddraw.dll and the
IDirectDraw* interfaces (that can be created using the API functions). IDirectDraw* interfaces (that can be created using the API functions).
WINE currently implements a very basic set of the DirectDraw functionality WINE currently implements a very basic set of the DirectDraw functionality
in graphics/ddraw.c. This implementation uses the XFree86-DGA extension in graphics/ddraw.c. This implementation uses either the XFree86-DGA extension
to get very fast access to the graphics card framebuffer and doublebuffering to get very fast access to the graphics card framebuffer and doublebuffering
features. It is as fast as the MS equivalent for the stuff that is implemented. features or Xlib, which is slower.
The implementation using XFree86-DGA is as fast as the MS equivalent for the
stuff that is implemented.
Several applications already work, see below. Several applications already work, see below.
Problems of the implementation using XFree86-DGA: Problems of the implementation using XFree86-DGA:
- XFree86 cannot switch resolution nor depth on the fly. - XFree86 cannot switch depth on the fly.
This is a problem with X and unavoidable. This is a problem with X and unavoidable.
Current solution is to pop up a MessageBox with an error for Current solution is to pop up a MessageBox with an error for
mismatched parameters and advice the user to restart the X server mismatched parameters and advice the user to restart the X server
with the specified depth and/or screensize. with the specified depth.
- The rest of the functionality that has to be implemented will have - The rest of the functionality that has to be implemented will have
to be done in software and will be very slow. to be done in software and will be very slow.
- This requires WINE to be run as root user so XF86DGA can mmap the - This requires WINE to be run as root user so XF86DGA can mmap the
...@@ -25,10 +28,7 @@ Problems of the implementation using XFree86-DGA: ...@@ -25,10 +28,7 @@ Problems of the implementation using XFree86-DGA:
Status: Status:
- Diablo [640x480x8]: - Diablo [640x480x8]:
The movies play with speed comparable to the MS DDRAW one. No longer works. Unclear why. [WINE-990131, Marcus Meissner]
The game doesn't work, it somehow tries to write into 2 lines _BEFORE_
the start of the surface. I have tried to investigate this, but it is
in code that is automatically generated.
- WingCommander 4 / Win95 Patch [640x480x8]: - WingCommander 4 / Win95 Patch [640x480x8]:
The intromovie plays, in 8 bit mode (to reconfigure wc4, run wine The intromovie plays, in 8 bit mode (to reconfigure wc4, run wine
...@@ -36,10 +36,16 @@ Status: ...@@ -36,10 +36,16 @@ Status:
this is due to the unusual colorweight (565 rgb) of the Mystique in 16bit this is due to the unusual colorweight (565 rgb) of the Mystique in 16bit
mode. [Specifying it in DDPIXELFORMAT didn't help.] mode. [Specifying it in DDPIXELFORMAT didn't help.]
Requires to be run in 640x480xdepth mode (doesn't seem to heed Keyboard input does not work. This seems to be a problem with the
DDSURFACEDESC.lPitch). cooperative window and USER input handling in general.
You can even fly the first mission with Maniac (ignore the weird sounds),
but it crashes as soon as you arrive at Blue Point Station... -> Unable to test Gameplay.
The display is slower as before. Reason is unknown, but I suspect the
communication between winserver,dsoundmixerthread,mainthread takes
up too much time.
[WINE-990131, Marcus Meissner]
- Monkey Island 3 [640x480x8]: - Monkey Island 3 [640x480x8]:
WINE-CVS-981116: WINE-CVS-981116:
...@@ -49,10 +55,6 @@ Status: ...@@ -49,10 +55,6 @@ Status:
Plays through nearly all intro movies. Sound and animation skip a lot of Plays through nearly all intro movies. Sound and animation skip a lot of
stuff (possible DirectSound asynchronization problem). stuff (possible DirectSound asynchronization problem).
- XvT [640x480x16]:
Shows the splash screen, then fails with missing Joystick. I have
investigated but failed to find a reason for this.
- Tomb Raider 2 Demo (using 8 bit renderer) [640x480x8]: - Tomb Raider 2 Demo (using 8 bit renderer) [640x480x8]:
I have played nearly all of the DEMO level using Keyboard Controls. I have played nearly all of the DEMO level using Keyboard Controls.
Sound is a bit weird. Keyboard/Mouse handling too due to incomplete Sound is a bit weird. Keyboard/Mouse handling too due to incomplete
......
...@@ -194,7 +194,7 @@ static HRESULT WINAPI IDirect3DViewport2_SetBackground(LPDIRECT3DVIEWPORT2 this, ...@@ -194,7 +194,7 @@ static HRESULT WINAPI IDirect3DViewport2_SetBackground(LPDIRECT3DVIEWPORT2 this,
static HRESULT WINAPI IDirect3DViewport2_GetBackground(LPDIRECT3DVIEWPORT2 this, static HRESULT WINAPI IDirect3DViewport2_GetBackground(LPDIRECT3DVIEWPORT2 this,
LPD3DMATERIALHANDLE lphMat, LPD3DMATERIALHANDLE lphMat,
LPBOOL lpValid) LPBOOL32 lpValid)
{ {
FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lphMat, lpValid); FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lphMat, lpValid);
...@@ -211,7 +211,7 @@ static HRESULT WINAPI IDirect3DViewport2_SetBackgroundDepth(LPDIRECT3DVIEWPORT2 ...@@ -211,7 +211,7 @@ static HRESULT WINAPI IDirect3DViewport2_SetBackgroundDepth(LPDIRECT3DVIEWPORT2
static HRESULT WINAPI IDirect3DViewport2_GetBackgroundDepth(LPDIRECT3DVIEWPORT2 this, static HRESULT WINAPI IDirect3DViewport2_GetBackgroundDepth(LPDIRECT3DVIEWPORT2 this,
LPDIRECTDRAWSURFACE* lplpDDSurface, LPDIRECTDRAWSURFACE* lplpDDSurface,
LPBOOL lpValid) LPBOOL32 lpValid)
{ {
FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lplpDDSurface, lpValid); FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lplpDDSurface, lpValid);
......
...@@ -402,6 +402,15 @@ static int _getpixelformat(LPDIRECTDRAW2 ddraw,LPDDPIXELFORMAT pf) { ...@@ -402,6 +402,15 @@ static int _getpixelformat(LPDIRECTDRAW2 ddraw,LPDDPIXELFORMAT pf) {
pf->xy.dwRGBAlphaBitMask= 0; pf->xy.dwRGBAlphaBitMask= 0;
return 0; return 0;
} }
if (ddraw->d.depth==24) {
pf->dwFlags = DDPF_RGB;
pf->x.dwRGBBitCount = 24;
pf->y.dwRBitMask = vi[0].red_mask;
pf->z.dwGBitMask = vi[0].green_mask;
pf->xx.dwBBitMask = vi[0].blue_mask;
pf->xy.dwRGBAlphaBitMask= 0;
return 0;
}
FIXME(ddraw,"_getpixelformat:unknown depth %ld?\n",ddraw->d.depth); FIXME(ddraw,"_getpixelformat:unknown depth %ld?\n",ddraw->d.depth);
return DDERR_GENERIC; return DDERR_GENERIC;
} }
......
...@@ -6,9 +6,6 @@ ...@@ -6,9 +6,6 @@
/* This is needed for GL_LIGHT */ /* This is needed for GL_LIGHT */
#include "wine_gl.h" #include "wine_gl.h"
typedef BOOL32 *LPBOOL;
typedef BOOL32 BOOL;
DEFINE_GUID(IID_IDirect3D, 0x3BBA0080,0x2421,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 ); DEFINE_GUID(IID_IDirect3D, 0x3BBA0080,0x2421,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 );
DEFINE_GUID(IID_IDirect3D2, 0x6aae1ec1,0x662a,0x11d0,0x88,0x9d,0x00,0xaa,0x00,0xbb,0xb7,0x6a); DEFINE_GUID(IID_IDirect3D2, 0x6aae1ec1,0x662a,0x11d0,0x88,0x9d,0x00,0xaa,0x00,0xbb,0xb7,0x6a);
...@@ -1109,7 +1106,7 @@ typedef struct _D3DTEXTURELOAD { ...@@ -1109,7 +1106,7 @@ typedef struct _D3DTEXTURELOAD {
typedef struct _D3DBRANCH { typedef struct _D3DBRANCH {
DWORD dwMask; DWORD dwMask;
DWORD dwValue; DWORD dwValue;
BOOL bNegate; BOOL32 bNegate;
DWORD dwOffset; DWORD dwOffset;
} D3DBRANCH, *LPD3DBRANCH; } D3DBRANCH, *LPD3DBRANCH;
...@@ -1347,9 +1344,9 @@ typedef struct IDirect3Viewport_VTable { ...@@ -1347,9 +1344,9 @@ typedef struct IDirect3Viewport_VTable {
STDMETHOD(TransformVertices) (THIS_ DWORD, LPD3DTRANSFORMDATA, DWORD, LPDWORD) PURE; STDMETHOD(TransformVertices) (THIS_ DWORD, LPD3DTRANSFORMDATA, DWORD, LPDWORD) PURE;
STDMETHOD(LightElements) (THIS_ DWORD, LPD3DLIGHTDATA) PURE; STDMETHOD(LightElements) (THIS_ DWORD, LPD3DLIGHTDATA) PURE;
STDMETHOD(SetBackground) (THIS_ D3DMATERIALHANDLE) PURE; STDMETHOD(SetBackground) (THIS_ D3DMATERIALHANDLE) PURE;
STDMETHOD(GetBackground) (THIS_ LPD3DMATERIALHANDLE, LPBOOL) PURE; STDMETHOD(GetBackground) (THIS_ LPD3DMATERIALHANDLE, LPBOOL32) PURE;
STDMETHOD(SetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE) PURE; STDMETHOD(SetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE) PURE;
STDMETHOD(GetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE*, LPBOOL) PURE; STDMETHOD(GetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE*, LPBOOL32) PURE;
STDMETHOD(Clear) (THIS_ DWORD, LPD3DRECT, DWORD) PURE; STDMETHOD(Clear) (THIS_ DWORD, LPD3DRECT, DWORD) PURE;
STDMETHOD(AddLight) (THIS_ LPDIRECT3DLIGHT) PURE; STDMETHOD(AddLight) (THIS_ LPDIRECT3DLIGHT) PURE;
STDMETHOD(DeleteLight) (THIS_ LPDIRECT3DLIGHT) PURE; STDMETHOD(DeleteLight) (THIS_ LPDIRECT3DLIGHT) PURE;
...@@ -1375,9 +1372,9 @@ typedef struct IDirect3Viewport2_VTable { ...@@ -1375,9 +1372,9 @@ typedef struct IDirect3Viewport2_VTable {
STDMETHOD(TransformVertices) (THIS_ DWORD, LPD3DTRANSFORMDATA, DWORD, LPDWORD) PURE; STDMETHOD(TransformVertices) (THIS_ DWORD, LPD3DTRANSFORMDATA, DWORD, LPDWORD) PURE;
STDMETHOD(LightElements) (THIS_ DWORD, LPD3DLIGHTDATA) PURE; STDMETHOD(LightElements) (THIS_ DWORD, LPD3DLIGHTDATA) PURE;
STDMETHOD(SetBackground) (THIS_ D3DMATERIALHANDLE) PURE; STDMETHOD(SetBackground) (THIS_ D3DMATERIALHANDLE) PURE;
STDMETHOD(GetBackground) (THIS_ LPD3DMATERIALHANDLE, LPBOOL) PURE; STDMETHOD(GetBackground) (THIS_ LPD3DMATERIALHANDLE, LPBOOL32) PURE;
STDMETHOD(SetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE) PURE; STDMETHOD(SetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE) PURE;
STDMETHOD(GetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE*, LPBOOL) PURE; STDMETHOD(GetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE*, LPBOOL32) PURE;
STDMETHOD(Clear) (THIS_ DWORD, LPD3DRECT, DWORD) PURE; STDMETHOD(Clear) (THIS_ DWORD, LPD3DRECT, DWORD) PURE;
STDMETHOD(AddLight) (THIS_ LPDIRECT3DLIGHT) PURE; STDMETHOD(AddLight) (THIS_ LPDIRECT3DLIGHT) PURE;
STDMETHOD(DeleteLight) (THIS_ LPDIRECT3DLIGHT) PURE; STDMETHOD(DeleteLight) (THIS_ LPDIRECT3DLIGHT) PURE;
...@@ -1459,7 +1456,7 @@ struct IDirect3DExecuteBuffer { ...@@ -1459,7 +1456,7 @@ struct IDirect3DExecuteBuffer {
/* This flags is set to TRUE if we allocated ourselves the /* This flags is set to TRUE if we allocated ourselves the
data buffer */ data buffer */
BOOL need_free; BOOL32 need_free;
void (*execute)(LPDIRECT3DEXECUTEBUFFER this, void (*execute)(LPDIRECT3DEXECUTEBUFFER this,
LPDIRECT3DDEVICE dev, LPDIRECT3DDEVICE dev,
......
...@@ -415,7 +415,7 @@ static HRESULT WINAPI IDirectPlayLobby2W_Connect ...@@ -415,7 +415,7 @@ static HRESULT WINAPI IDirectPlayLobby2W_Connect
return DPERR_INVALIDPARAMS; return DPERR_INVALIDPARAMS;
} }
if( ( createRC = DirectPlayCreate( &IID_IDirectPlayLobby2, lplpDP, pUnk ) ) != DP_OK ) if( ( createRC = DirectPlayCreate( (LPGUID)&IID_IDirectPlayLobby2, lplpDP, pUnk ) ) != DP_OK )
{ {
ERR( dplay, "error creating Direct Play 2W interface. Return Code = %ld.\n", createRC ); ERR( dplay, "error creating Direct Play 2W interface. Return Code = %ld.\n", createRC );
return createRC; return createRC;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment