92 lines
3.2 KiB
C
92 lines
3.2 KiB
C
![]() |
/***************************************************************************/
|
||
|
/* 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;
|
||
|
}
|