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 <[email protected]> >To: [email protected]; Ralph Little <[email protected]> >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. > > >
