//---------------------------------------------------------------------------- // // d3dif.cpp // // shared interface functions // // Copyright (C) Microsoft Corporation, 1997. // //---------------------------------------------------------------------------- #include "pch.cpp" #pragma hdrstop //---------------------------------------------------------------------------- // // FindOutSurfFormat // // Converts a DDPIXELFORMAT to D3DI_SPANTEX_FORMAT. // //---------------------------------------------------------------------------- HRESULT FASTCALL FindOutSurfFormat(LPDDPIXELFORMAT pDdPixFmt, D3DI_SPANTEX_FORMAT *pFmt) { if (pDdPixFmt->dwFlags & DDPF_ZBUFFER) { switch(pDdPixFmt->dwZBitMask) { default: case 0x0000FFFF: *pFmt = D3DI_SPTFMT_Z16S0; break; case 0xFFFFFF00: *pFmt = D3DI_SPTFMT_Z24S8; break; case 0x0000FFFE: *pFmt = D3DI_SPTFMT_Z15S1; break; case 0xFFFFFFFF: *pFmt = D3DI_SPTFMT_Z32S0; break; } } else if (pDdPixFmt->dwFlags & DDPF_BUMPDUDV) { UINT uFmt = pDdPixFmt->dwBumpDvBitMask; switch (uFmt) { case 0x0000ff00: switch (pDdPixFmt->dwRGBBitCount) { case 24: *pFmt = D3DI_SPTFMT_U8V8L8; break; case 16: *pFmt = D3DI_SPTFMT_U8V8; break; } break; case 0x000003e0: *pFmt = D3DI_SPTFMT_U5V5L6; break; } } else if (pDdPixFmt->dwFlags & DDPF_PALETTEINDEXED8) { *pFmt = D3DI_SPTFMT_PALETTE8; } else if (pDdPixFmt->dwFlags & DDPF_PALETTEINDEXED4) { *pFmt = D3DI_SPTFMT_PALETTE4; } else if (pDdPixFmt->dwFourCC == MAKEFOURCC('U', 'Y', 'V', 'Y')) { *pFmt = D3DI_SPTFMT_UYVY; } else if (pDdPixFmt->dwFourCC == MAKEFOURCC('Y', 'U', 'Y', '2')) { *pFmt = D3DI_SPTFMT_YUY2; } else if (pDdPixFmt->dwFourCC == MAKEFOURCC('D', 'X', 'T', '1')) { *pFmt = D3DI_SPTFMT_DXT1; } else if (pDdPixFmt->dwFourCC == MAKEFOURCC('D', 'X', 'T', '2')) { *pFmt = D3DI_SPTFMT_DXT2; } else if (pDdPixFmt->dwFourCC == MAKEFOURCC('D', 'X', 'T', '3')) { *pFmt = D3DI_SPTFMT_DXT3; } else if (pDdPixFmt->dwFourCC == MAKEFOURCC('D', 'X', 'T', '4')) { *pFmt = D3DI_SPTFMT_DXT4; } else if (pDdPixFmt->dwFourCC == MAKEFOURCC('D', 'X', 'T', '5')) { *pFmt = D3DI_SPTFMT_DXT5; } else { UINT uFmt = pDdPixFmt->dwGBitMask | pDdPixFmt->dwRBitMask; if (pDdPixFmt->dwFlags & DDPF_ALPHAPIXELS) { uFmt |= pDdPixFmt->dwRGBAlphaBitMask; } switch (uFmt) { case 0x00ffff00: switch (pDdPixFmt->dwRGBBitCount) { case 32: *pFmt = D3DI_SPTFMT_B8G8R8X8; break; case 24: *pFmt = D3DI_SPTFMT_B8G8R8; break; } break; case 0xffffff00: *pFmt = D3DI_SPTFMT_B8G8R8A8; break; case 0xffe0: if (pDdPixFmt->dwFlags & DDPF_ALPHAPIXELS) { *pFmt = D3DI_SPTFMT_B5G5R5A1; } else { *pFmt = D3DI_SPTFMT_B5G6R5; } break; case 0x07fe0: *pFmt = D3DI_SPTFMT_B5G5R5; break; case 0xff0: *pFmt = D3DI_SPTFMT_B4G4R4; break; case 0xfff0: *pFmt = D3DI_SPTFMT_B4G4R4A4; break; case 0xff: *pFmt = D3DI_SPTFMT_L8; break; case 0xffff: *pFmt = D3DI_SPTFMT_L8A8; break; case 0xfc: *pFmt = D3DI_SPTFMT_B2G3R3; break; default: *pFmt = D3DI_SPTFMT_NULL; break; } } return D3D_OK; } //---------------------------------------------------------------------------- // // ValidTextureSize // // checks for power of two texture size // //---------------------------------------------------------------------------- BOOL FASTCALL ValidTextureSize(INT16 iuSize, INT16 iuShift, INT16 ivSize, INT16 ivShift) { if (iuSize == 1) { if (ivSize == 1) { return TRUE; } else { return !(ivSize & (~(1 << ivShift))); } } else { if (ivSize == 1) { return !(iuSize & (~(1 << iuShift))); } else { return (!(iuSize & (~(1 << iuShift))) && !(iuSize & (~(1 << iuShift)))); } } } //---------------------------------------------------------------------------- // // ValidMipmapSize // // Computes size of next smallest mipmap level, clamping at 1 // //---------------------------------------------------------------------------- BOOL FASTCALL ValidMipmapSize(INT16 iPreSize, INT16 iSize) { if (iPreSize == 1) { if (iSize == 1) { return TRUE; } else { return FALSE; } } else { return ((iPreSize >> 1) == iSize); } } //---------------------------------------------------------------------------- // // TextureFormats // // Returns all the texture formats supported by our rasterizer. // Right now, it's called at device creation time to fill the driver gloabl // data. // //---------------------------------------------------------------------------- #define NUM_SUPPORTED_TEXTURE_FORMATS 22 int TextureFormats(LPDDSURFACEDESC* lplpddsd, DWORD dwVersion, SW_RAST_TYPE RastType) { int i = 0; if (RastType == SW_RAST_MMX && dwVersion < 3) { static DDSURFACEDESC mmx_ddsd[1]; /* pal8 */ mmx_ddsd[i].dwSize = sizeof(mmx_ddsd[0]); mmx_ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; mmx_ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; mmx_ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); mmx_ddsd[i].ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; mmx_ddsd[i].ddpfPixelFormat.dwRGBBitCount = 8; i++; *lplpddsd = mmx_ddsd; return i; } static DDSURFACEDESC ddsd_RefNull_Dev3[NUM_SUPPORTED_TEXTURE_FORMATS]; static DDSURFACEDESC ddsd_RefNull_Dev2[NUM_SUPPORTED_TEXTURE_FORMATS]; static DDSURFACEDESC ddsd_RGBMMX_Dev3[NUM_SUPPORTED_TEXTURE_FORMATS]; static DDSURFACEDESC ddsd_RGBMMX_Dev2[NUM_SUPPORTED_TEXTURE_FORMATS]; DDSURFACEDESC *ddsd; if (RastType == SW_RAST_REFNULL) { if (dwVersion >= 3) { ddsd = ddsd_RefNull_Dev3; } else { ddsd = ddsd_RefNull_Dev2; } } else { if (dwVersion >= 3) { ddsd = ddsd_RGBMMX_Dev3; } else { ddsd = ddsd_RGBMMX_Dev2; } } /* 888 */ ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_RGB; ddsd[i].ddpfPixelFormat.dwRGBBitCount = 32; ddsd[i].ddpfPixelFormat.dwRBitMask = 0xff0000; ddsd[i].ddpfPixelFormat.dwGBitMask = 0x00ff00; ddsd[i].ddpfPixelFormat.dwBBitMask = 0x0000ff; i++; /* 8888 */ ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; ddsd[i].ddpfPixelFormat.dwRGBBitCount = 32; ddsd[i].ddpfPixelFormat.dwRGBAlphaBitMask = 0xff000000; ddsd[i].ddpfPixelFormat.dwRBitMask = 0xff0000; ddsd[i].ddpfPixelFormat.dwGBitMask = 0x00ff00; ddsd[i].ddpfPixelFormat.dwBBitMask = 0x0000ff; i++; /* 565 */ ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_RGB; ddsd[i].ddpfPixelFormat.dwRGBBitCount = 16; ddsd[i].ddpfPixelFormat.dwRBitMask = 0xf800; ddsd[i].ddpfPixelFormat.dwGBitMask = 0x07e0; ddsd[i].ddpfPixelFormat.dwBBitMask = 0x001f; i++; /* 555 */ ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_RGB; ddsd[i].ddpfPixelFormat.dwRGBBitCount = 16; ddsd[i].ddpfPixelFormat.dwRBitMask = 0x7c00; ddsd[i].ddpfPixelFormat.dwGBitMask = 0x03e0; ddsd[i].ddpfPixelFormat.dwBBitMask = 0x001f; i++; /* pal4 */ ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED4 | DDPF_RGB; ddsd[i].ddpfPixelFormat.dwRGBBitCount = 4; i++; /* pal8 */ ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; ddsd[i].ddpfPixelFormat.dwRGBBitCount = 8; i++; if ((dwVersion >= 3) || (RastType == SW_RAST_REFNULL)) { /* 1555 */ ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; ddsd[i].ddpfPixelFormat.dwRGBBitCount = 16; ddsd[i].ddpfPixelFormat.dwRGBAlphaBitMask = 0x8000; ddsd[i].ddpfPixelFormat.dwRBitMask = 0x7c00; ddsd[i].ddpfPixelFormat.dwGBitMask = 0x03e0; ddsd[i].ddpfPixelFormat.dwBBitMask = 0x001f; i++; // A formats for PC98 consistency // 4444 ARGB (it is already supported by S3 Virge) ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS; ddsd[i].ddpfPixelFormat.dwRGBBitCount = 16; ddsd[i].ddpfPixelFormat.dwRGBAlphaBitMask = 0xf000; ddsd[i].ddpfPixelFormat.dwRBitMask = 0x0f00; ddsd[i].ddpfPixelFormat.dwGBitMask = 0x00f0; ddsd[i].ddpfPixelFormat.dwBBitMask = 0x000f; i++; } if ((dwVersion >= 2) && (RastType == SW_RAST_REFNULL)) { // 332 8-bit RGB ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_RGB; ddsd[i].ddpfPixelFormat.dwRGBBitCount = 8; ddsd[i].ddpfPixelFormat.dwRBitMask = 0xe0; ddsd[i].ddpfPixelFormat.dwGBitMask = 0x1c; ddsd[i].ddpfPixelFormat.dwBBitMask = 0x03; i++; } if (dwVersion >= 3) { /* 8 bit luminance-only */ ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_LUMINANCE; ddsd[i].ddpfPixelFormat.dwLuminanceBitCount = 8; ddsd[i].ddpfPixelFormat.dwLuminanceBitMask = 0xff; i++; /* 16 bit alpha-luminance */ ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_LUMINANCE | DDPF_ALPHAPIXELS; ddsd[i].ddpfPixelFormat.dwLuminanceBitCount = 16; ddsd[i].ddpfPixelFormat.dwRGBAlphaBitMask = 0xff00; ddsd[i].ddpfPixelFormat.dwLuminanceBitMask = 0xff; i++; if (RastType == SW_RAST_REFNULL) { // A couple of formats for PC98 consistency // UYVY ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_FOURCC; ddsd[i].ddpfPixelFormat.dwFourCC = MAKEFOURCC('U', 'Y', 'V', 'Y'); i++; // YVY2 ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_FOURCC; ddsd[i].ddpfPixelFormat.dwFourCC = MAKEFOURCC('Y', 'U', 'Y', '2'); i++; // S3 compressed texture format 1 ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_FOURCC; ddsd[i].ddpfPixelFormat.dwFourCC = MAKEFOURCC('D', 'X', 'T', '1'); i++; // S3 compressed texture format 2 ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_FOURCC; ddsd[i].ddpfPixelFormat.dwFourCC = MAKEFOURCC('D', 'X', 'T', '2'); i++; // S3 compressed texture format 3 ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_FOURCC; ddsd[i].ddpfPixelFormat.dwFourCC = MAKEFOURCC('D', 'X', 'T', '3'); i++; // S3 compressed texture format 4 ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_FOURCC; ddsd[i].ddpfPixelFormat.dwFourCC = MAKEFOURCC('D', 'X', 'T', '4'); i++; // S3 compressed texture format 5 ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_FOURCC; ddsd[i].ddpfPixelFormat.dwFourCC = MAKEFOURCC('D', 'X', 'T', '5'); i++; // Add a few bump map formats // U8V8 ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_BUMPDUDV; ddsd[i].ddpfPixelFormat.dwBumpBitCount = 16; ddsd[i].ddpfPixelFormat.dwBumpDuBitMask = 0x00ff; ddsd[i].ddpfPixelFormat.dwBumpDvBitMask = 0xff00; ddsd[i].ddpfPixelFormat.dwBumpLuminanceBitMask = 0x0; i++; // U5V5L6 ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_BUMPDUDV | DDPF_BUMPLUMINANCE; ddsd[i].ddpfPixelFormat.dwBumpBitCount = 16; ddsd[i].ddpfPixelFormat.dwBumpDuBitMask = 0x001f; ddsd[i].ddpfPixelFormat.dwBumpDvBitMask = 0x03e0; ddsd[i].ddpfPixelFormat.dwBumpLuminanceBitMask = 0xfc00; i++; // U8V8L8 ddsd[i].dwSize = sizeof(ddsd[0]); ddsd[i].dwFlags = DDSD_PIXELFORMAT | DDSD_CAPS; ddsd[i].ddsCaps.dwCaps = DDSCAPS_TEXTURE; ddsd[i].ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd[i].ddpfPixelFormat.dwFlags = DDPF_BUMPDUDV | DDPF_BUMPLUMINANCE; ddsd[i].ddpfPixelFormat.dwBumpBitCount = 24; ddsd[i].ddpfPixelFormat.dwBumpDuBitMask = 0x0000ff; ddsd[i].ddpfPixelFormat.dwBumpDvBitMask = 0x00ff00; ddsd[i].ddpfPixelFormat.dwBumpLuminanceBitMask = 0xff0000; i++; } } *lplpddsd = ddsd; return i; } //---------------------------------------------------------------------------- // // ZBufferFormats // // Must return union of all the Z buffer formats supported by all rasterizers. // CreateDevice will screen out device-specific ones (i.e. ones ramp doesnt handle) later. // Called at device creation time and by DDHEL to validate software ZBuffer // creation. // //---------------------------------------------------------------------------- #define NUM_SUPPORTED_ZBUFFER_FORMATS 4 int ZBufferFormats(DDPIXELFORMAT** ppDDPF, BOOL bIsRefOrNull) { static DDPIXELFORMAT DDPF[NUM_SUPPORTED_ZBUFFER_FORMATS]; int i = 0; memset(&DDPF[0],0,sizeof(DDPF)); /* 16 bit Z; no stencil */ DDPF[i].dwSize = sizeof(DDPIXELFORMAT); DDPF[i].dwFlags = DDPF_ZBUFFER; DDPF[i].dwZBufferBitDepth = 16; DDPF[i].dwStencilBitDepth = 0; DDPF[i].dwZBitMask = 0xffff; DDPF[i].dwStencilBitMask = 0x0000; i++; /* 24 bit Z; 8 bit stencil */ DDPF[i].dwSize = sizeof(DDPIXELFORMAT); DDPF[i].dwFlags = DDPF_ZBUFFER | DDPF_STENCILBUFFER; DDPF[i].dwZBufferBitDepth = 32; // ZBufferBitDepth represents the total bits. Z Bits are ZBBitDepth-StencilBitDepth DDPF[i].dwStencilBitDepth = 8; DDPF[i].dwZBitMask = 0xffffff00; DDPF[i].dwStencilBitMask = 0x000000ff; i++; if (bIsRefOrNull) { /* 15 bit Z; 1 bit stencil */ DDPF[i].dwSize = sizeof(DDPIXELFORMAT); DDPF[i].dwFlags = DDPF_ZBUFFER | DDPF_STENCILBUFFER; DDPF[i].dwZBufferBitDepth = 16; // ZBufferBitDepth represents the total bits. Z Bits are ZBBitDepth-StencilBitDepth DDPF[i].dwStencilBitDepth = 1; DDPF[i].dwZBitMask = 0xfffe; DDPF[i].dwStencilBitMask = 0x0001; i++; /* 32bit Z; no stencil */ DDPF[i].dwSize = sizeof(DDPIXELFORMAT); DDPF[i].dwFlags = DDPF_ZBUFFER; DDPF[i].dwZBufferBitDepth = 32; DDPF[i].dwStencilBitDepth = 0; DDPF[i].dwZBitMask = 0xffffffff; DDPF[i].dwStencilBitMask = 0x00000000; i++; } *ppDDPF = DDPF; return i; } // this fn is exported externally to be called by the directdraw HEL DWORD WINAPI Direct3DGetSWRastZPixFmts(DDPIXELFORMAT** ppDDPF) { // try to get texture formats from external DLL ref device PFNGETREFZBUFFERFORMATS pfnGetRefZBufferFormats; if (NULL != (pfnGetRefZBufferFormats = (PFNGETREFZBUFFERFORMATS)LoadReferenceDeviceProc("GetRefZBufferFormats"))) { D3D_INFO(0,"Direct3DGetSWRastZPixFmts: getting Z buffer formats from d3dref"); return pfnGetRefZBufferFormats(IID_IDirect3DRefDevice, ppDDPF); } // always return all formats so DDraw creates // all surfaces which it should return (DWORD) ZBufferFormats(ppDDPF, TRUE); }