Hi Stefan,
> If the testing doesn't reveal anything, look out for IDirectDraw::GetCaps
> calls in the logs or IDirect3Dx::EnumZBufferFormats. IDirectDraw::GetCaps
> returns a DDCAPS structure which has dwZBufferBitDepths containing some flags
> for z buffer bit depths. EnumZBufferFormats calls a callback multiple times
> with available DDPIXELFORMAT structures. The application may not like some
> flags we set there.

You know, my gut says that this is the right place to look, particularly IDirect3Dx::EnumZBufferFormats.
I see why you suggest this: what if none are returned to the application?
I will look into it. What The Sims is passing to CreateSurface just looks wrong.

In the meantime, I will generate a full ddraw trace and add it to the bug log as you suggest and then check it through.

Cheers, and thanks for the help. It is much appreciated.

Ralph

From: Stefan Dösinger <stefandoesinger@gmx.at>
To: wine-devel@winehq.org; Ralph Little <littlesincanada@yahoo.co.uk>
Sent: Wednesday, February 1, 2012 11:52:15 AM
Subject: Re: Profiing windows apps

Hi,

Am Dienstag, 31. Januar 2012, 21:51:01 schrieb Ralph Little:
> IDirectDraw * pDD = NULL;
> IDirectDrawSurface * pDDSPrimary = NULL;
> DDSURFACEDESC ddsd;
Take a look at dlls/ddraw/tests/ddraw*.c

> ...<initialisation etc>...
Make sure you use the version of the interface the game uses. There are some
behavioral differences between them. E.g. with zbuffers
DDSURFACEDESC(IDirectDraw, IDirectDraw2) has dwZBufferBitDepth(and
DDSD_ZBUFFERBITDEPTH), while DDSURFACEDESC2(IDirectDraw4, IDirectDraw7) always
uses a pixel format.

As far as I can see from the bug report the game is using IDirectDraw4.

> memset(&ddsd, 0, sizeof(ddsd));
> ddsd.dwSize  = sizeof(ddsd);
> ddsd.dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT | DDSD_HEIGHT | DDSD_WIDTH;
> ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_ZBUFFER;
Is it really trying to create a system memory z buffer? (Ok, I just saw this
in the logs attached to the bug report - that's really odd).

> ddsd.dwHeight = 600;
> ddsd.dwWidth  = 800;
> ddsd.ddpfPixelFormat.dwSize  = sizeof(DDPIXELFORMAT);
Try to set ddsd.ddpfPixelFormat.dwZBufferBitDepth to e.g. 16 and
ddsd.ddpfPixelFormat.dwZBitMask to 0x0000ffff. Keep dwFlags set to 0. Als try
to keep dwSize at 0.

> I assume that if the caller specifies DDSCAPS_ZBUFFER, the you must also
> specify some PIXEL format information. DDSD_PIXELFORMAT is present, but
> there are no format flags.
Basically that, or dwZBufferBitDepth. See zbufferbitdepth_test in
dlls/ddraw/tests/dsurface.c for some tests on this. (Don't add any new tests
there btw - use tests/ddraw*.c).

> I have to admit that I am a bit of a novice when it comes to DirectX so any
> guidance here would be helpful. I see that the lpSurface is NULL, which I
> thought was an error. However, I see that this is optional if the caller
> wishes the system to manage the surface memory.
Correct.

> Any error returned by this function the Sims at this point to causes it to
> crash. Therefore, it seems to me that if it succeeds in Windows, it must
> have passed something different. If only we could see the source :D
If the testing doesn't reveal anything, look out for IDirectDraw::GetCaps
calls in the logs or IDirect3Dx::EnumZBufferFormats. IDirectDraw::GetCaps
returns a DDCAPS structure which has dwZBufferBitDepths containing some flags
for z buffer bit depths. EnumZBufferFormats calls a callback multiple times
with available DDPIXELFORMAT structures. The application may not like some
flags we set there.

Also please attach a full +ddraw log to the bug report. If it is too big
compress it. bzip2 should do a pretty decent job, if all fails try lrzip.