diff options
Diffstat (limited to 'src/win95/zbuffer.c')
| -rw-r--r-- | src/win95/zbuffer.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/win95/zbuffer.c b/src/win95/zbuffer.c new file mode 100644 index 0000000..b33ea85 --- /dev/null +++ b/src/win95/zbuffer.c @@ -0,0 +1,91 @@ +/***************************************************************************/ +/* Creation of Z-Buffer */ +/***************************************************************************/ +/* + * D3DAppICreateZBuffer + * Create a Z-Buffer of the appropriate depth and attach it to the back + * buffer. + */ +BOOL +D3DAppICreateZBuffer(int w, int h, int driver) +{ + DDSURFACEDESC ddsd; + DWORD devDepth; + /* + * Release any Z-Buffer that might be around just in case. + */ + RELEASE(d3dappi.lpZBuffer); + + /* + * If this driver does not do z-buffering, don't create a z-buffer + */ + if (!d3dappi.Driver[driver].bDoesZBuffer) + return TRUE; + + memset(&ddsd, 0 ,sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof( ddsd ); + ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | + DDSD_ZBUFFERBITDEPTH; + ddsd.ddsCaps.dwCaps = DDSCAPS_ZBUFFER; + ddsd.dwHeight = h; + ddsd.dwWidth = w; + /* + * If this is a hardware D3D driver, the Z-Buffer MUST end up in video + * memory. Otherwise, it MUST end up in system memory. + */ + if (d3dappi.Driver[driver].bIsHardware) + ddsd.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; + else + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + /* + * Get the Z buffer bit depth from this driver's D3D device description + */ + devDepth = d3dappi.Driver[driver].Desc.dwDeviceZBufferBitDepth; + if (devDepth & DDBD_32) + ddsd.dwZBufferBitDepth = 32; + else if (devDepth & DDBD_24) + ddsd.dwZBufferBitDepth = 24; + else if (devDepth & DDBD_16) + ddsd.dwZBufferBitDepth = 16; + else if (devDepth & DDBD_8) + ddsd.dwZBufferBitDepth = 8; + else { + D3DAppISetErrorString("Unsupported Z-buffer depth requested by device.\n"); + return FALSE; + } + LastError = d3dappi.lpDD->lpVtbl->CreateSurface(d3dappi.lpDD, &ddsd, + &d3dappi.lpZBuffer, + NULL); + if(LastError != DD_OK) { + D3DAppISetErrorString("CreateSurface for Z-buffer failed.\n%s", + D3DAppErrorToString(LastError)); + goto exit_with_error; + } + /* + * Attach the Z-buffer to the back buffer so D3D will find it + */ + LastError = + d3dappi.lpBackBuffer->lpVtbl->AddAttachedSurface(d3dappi.lpBackBuffer, + d3dappi.lpZBuffer); + if(LastError != DD_OK) { + D3DAppISetErrorString("AddAttachedBuffer failed for Z-Buffer.\n%s", + D3DAppErrorToString(LastError)); + goto exit_with_error; + } + /* + * Find out if it ended up in video memory (FYI). + */ + LastError = D3DAppIGetSurfDesc(&ddsd, d3dappi.lpZBuffer); + if (LastError != DD_OK) { + D3DAppISetErrorString("Failed to get surface description of Z buffer.\n%s", + D3DAppErrorToString(LastError)); + goto exit_with_error; + } + d3dappi.bZBufferInVideo = + (ddsd.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) ? TRUE : FALSE; + return TRUE; + +exit_with_error: + RELEASE(d3dappi.lpZBuffer); + return FALSE; +} |
