|
|
//----------------------------------------------------------------------------
//
// ramprov.cpp
//
// Implements software rasterizer HAL provider.
//
// Copyright (C) Microsoft Corporation, 1997.
//
//----------------------------------------------------------------------------
#include "pch.cpp"
#pragma hdrstop
extern HRESULT RastService(ULONG_PTR dwCtx, RastServiceType srvType, DWORD arg1, LPVOID arg2);
extern HRESULT RastRampService(ULONG_PTR dwCtx, RastRampServiceType srvType, ULONG_PTR arg1, LPVOID arg2);
extern D3DDEVICEDESC g_nullDevDesc;
#define BUILD_RAMP 1
#define devDesc rampDevDescDX5
#include "getcaps.h"
STDMETHODIMP RampRastHalProvider::GetCaps(THIS_ LPDDRAWI_DIRECTDRAW_GBL pDdGbl, LPD3DDEVICEDESC pHwDesc, LPD3DDEVICEDESC pHelDesc, DWORD dwVersion) { *pHwDesc = g_nullDevDesc; *pHelDesc = rampDevDescDX5;
return D3D_OK; }
//----------------------------------------------------------------------------
//
// RampRastHalProvider::GetInterface
//
// Returns driver interface data for opt rast.
//
//----------------------------------------------------------------------------
static D3DHAL_GLOBALDRIVERDATA SwDriverData = { sizeof(D3DHAL_GLOBALDRIVERDATA), // The rest is filled in at runtime.
};
static D3DHAL_CALLBACKS RampRastCallbacks = { sizeof(D3DHAL_CALLBACKS), RastContextCreateRamp, RastContextDestroyRamp, NULL, NULL, NULL, NULL, RastRenderState, RastRenderPrimitive, NULL, RastTextureCreate, RastTextureDestroy, RastTextureSwap, RastTextureGetSurf, // All others NULL.
};
static D3DHAL_CALLBACKS2 RampRastCallbacks2 = { sizeof(D3DHAL_CALLBACKS2), D3DHAL2_CB32_SETRENDERTARGET | D3DHAL2_CB32_DRAWONEPRIMITIVE | D3DHAL2_CB32_DRAWONEINDEXEDPRIMITIVE | D3DHAL2_CB32_DRAWPRIMITIVES, RastSetRenderTarget, NULL, RastDrawOnePrimitive, RastDrawOneIndexedPrimitive, RastDrawPrimitives };
static D3DHAL_CALLBACKS3 RampRastCallbacks3 = { sizeof(D3DHAL_CALLBACKS3), D3DHAL3_CB32_DRAWPRIMITIVES2, NULL, // Clear2
NULL, // lpvReserved
NULL, // ValidateTextureStageState
RastDrawPrimitives2, // DrawVB
};
//----------------------------------------------------------------------------
//
// 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_RAMP_SUPPORTED_TEXTURE_FORMATS 2
int RampTextureFormats(LPDDSURFACEDESC* lplpddsd) { static DDSURFACEDESC ddsd[NUM_RAMP_SUPPORTED_TEXTURE_FORMATS];
int i = 0;
/* 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++;
/* pal4 */ // although ramp supports the pal4 (and 16 bit texture formats, for copy)
// texture format, it must not be enumerated for backwards compatibility
//
// 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++;
*lplpddsd = ddsd;
return i; }
// Note: because ramp ZBuffer Formats are different than the standard ones
// used by the other rasterizers, it is impossible for DDHEL to properly validate
// zbuffer creation for the case of ramp (because the ramp device may have not
// been created at zbuffer creation time), so Direct3DCreateDevice has a special check
// to invalidate the zformats (i.e. stencil) not accepted by ramp
#define NUM_SUPPORTED_ZBUFFER_FORMATS 1
int RampZBufferFormats(DDPIXELFORMAT** ppDDPF) { static DDPIXELFORMAT DDPF[NUM_SUPPORTED_ZBUFFER_FORMATS];
int i = 0;
/* 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++; *ppDDPF = DDPF;
return i; }
STDMETHODIMP RampRastHalProvider::GetInterface(THIS_ LPDDRAWI_DIRECTDRAW_GBL pDdGbl, LPD3DHALPROVIDER_INTERFACEDATA pInterfaceData, DWORD dwVersion) {
memcpy(&SwDriverData.hwCaps, &rampDevDescDX5, sizeof(SwDriverData.hwCaps)); SwDriverData.dwNumVertices = BASE_VERTEX_COUNT; SwDriverData.dwNumClipVertices = MAX_CLIP_VERTICES; SwDriverData.dwNumTextureFormats = RampTextureFormats(&SwDriverData.lpTextureFormats); pInterfaceData->pGlobalData = &SwDriverData;
pInterfaceData->pExtCaps = NULL;
pInterfaceData->pCallbacks = &RampRastCallbacks; pInterfaceData->pCallbacks2 = &RampRastCallbacks2; pInterfaceData->pCallbacks3 = &RampRastCallbacks3; pInterfaceData->pfnRampService = RastRampService; pInterfaceData->pfnRastService = RastService;
return S_OK; }
|