windows-nt/Source/XPSP1/NT/multimedia/directx/dxg/d3d8/tnl/fe.h
2020-09-26 16:20:57 +08:00

132 lines
5.2 KiB
C++

#ifndef __MSPSGP_H_
#define __MSPSGP_H_
/*==========================================================================;
*
* Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
*
* File: mspsgp.h
* Content: Defines for Microsoft's PSPG implementation
*
***************************************************************************/
#include "vvm.h"
// DEBUG_PIPELINE is defined to check performance and to allow to choose
// diifferent paths in the geometry pipeline
// Undefine DEBUG_PIPELINE for final
//#define DEBUG_PIPELINE
#ifdef DEBUG_PIPELINE
const DWORD __DEBUG_NORENDERING = 1; // Disable writing drawing command to the command buffer
const DWORD __DEBUG_ONEPASS = 2; // Disable clip and light in one pass
const DWORD __DEBUG_MODELSPACE = 4; // Disable lighting in model space
#endif
//---------------------------------------------------------------------
// Returns TRUE if cipping is needed
//
inline BOOL CheckIfNeedClipping(LPD3DFE_PROCESSVERTICES pv)
{
if (pv->dwDeviceFlags & D3DDEV_GUARDBAND)
{
if (pv->dwClipUnion & ~__D3DCS_INGUARDBAND)
return TRUE;
}
else
if (pv->dwClipUnion)
return TRUE;
return FALSE;
}
//-----------------------------------------------------------------------------
// Direct3D default implementation of PVFUNCS
//
class D3DFE_PVFUNCSI : public ID3DFE_PVFUNCS
{
public:
DWORD ProcessVertices(LPD3DFE_PROCESSVERTICES);
HRESULT ProcessPrimitive(LPD3DFE_PROCESSVERTICES);
HRESULT ProcessIndexedPrimitive(LPD3DFE_PROCESSVERTICES);
int ClipSingleTriangle(D3DFE_PROCESSVERTICES *pv,
ClipTriangle *tri,
ClipVertex ***clipVertexPointer);
HRESULT DoDrawIndexedPrimitive(LPD3DFE_PROCESSVERTICES pv);
HRESULT DoDrawPrimitive(LPD3DFE_PROCESSVERTICES pv);
HRESULT ProcessLineList(D3DFE_PROCESSVERTICES *pv);
HRESULT ProcessLineStrip(D3DFE_PROCESSVERTICES *pv);
DWORD ProcessVerticesVVM(LPD3DFE_PROCESSVERTICES pv);
HRESULT CreateShader(CVElement* pElements, DWORD dwNumElements,
DWORD* pdwShaderCode, DWORD dwOutputFVF,
CPSGPShader** ppPSGPShader);
HRESULT SetActiveShader(CPSGPShader* pPSGPShader);
HRESULT LoadShaderConstants(DWORD start, DWORD count, LPVOID buffer);
HRESULT GetShaderConstants(DWORD start, DWORD count, LPVOID buffer);
HRESULT SetOutputFVF(DWORD dwFVF) {return D3D_OK;}
HRESULT ProcessTriangleList(LPD3DFE_PROCESSVERTICES);
HRESULT ProcessTriangleFan(LPD3DFE_PROCESSVERTICES);
HRESULT ProcessTriangleStrip(LPD3DFE_PROCESSVERTICES);
HRESULT Clip(D3DFE_PROCESSVERTICES *pv, ClipVertex *cv1,
ClipVertex *cv2,
ClipVertex *cv3);
int ClipSingleLine(D3DFE_PROCESSVERTICES *pv, ClipTriangle *line);
HRESULT ProcessClippedTriangleFan(D3DFE_PROCESSVERTICES *pv);
HRESULT ProcessClippedIndexedTriangleFan(D3DFE_PROCESSVERTICES *pv);
HRESULT ProcessClippedLine(D3DFE_PROCESSVERTICES *pv);
HRESULT ProcessClippedTriangleList(D3DFE_PROCESSVERTICES *pv);
HRESULT ProcessClippedTriangleStrip(D3DFE_PROCESSVERTICES *pv);
HRESULT ProcessClippedIndexedTriangleList(D3DFE_PROCESSVERTICES *pv);
HRESULT ProcessClippedIndexedTriangleStrip(D3DFE_PROCESSVERTICES *pv);
HRESULT ProcessClippedIndexedLine(D3DFE_PROCESSVERTICES *pv);
HRESULT ProcessClippedPoints(D3DFE_PROCESSVERTICES *pv);
HRESULT ProcessClippedIndexedPoints(D3DFE_PROCESSVERTICES *pv);
HRESULT ClipLine(D3DFE_PROCESSVERTICES *pv, ClipVertex *v1, ClipVertex *v2);
CVertexVM m_VertexVM;
};
//-----------------------------------------------------------------------------
// Does projected texture emulation
// Parameters:
// pOut - output texture coordinates
// pIn - input texture coordinates
// dwOutTexSize - size of output texture coordinates in bytes
// Assumes that input texture coordinates have one float more than the output
//
inline void DoTextureProjection(float* pIn, float* pOut, DWORD dwOutTexSize)
{
UINT n = dwOutTexSize >> 2; // Number of output floats
float w = 1.0f/pIn[n];
for (UINT i=0; i < n; i++)
{
pOut[i] = pIn[i] * w;
}
}
//-----------------------------------------------------------------------------
inline void
DoBlending(float blendFactor, D3DVECTOR* v1, D3DVECTOR* v2, D3DVECTOR* out)
{
out->x = v1->x + (v2->x - v1->x) * blendFactor;
out->y = v1->y + (v2->y - v1->y) * blendFactor;
out->z = v1->z + (v2->z - v1->z) * blendFactor;
}
//-----------------------------------------------------------------------------
// Returns TRUE if we can do one pass transformation-lighting-clipping for
// non-indexed primitives
//
inline BOOL DoOnePassPrimProcessing(D3DFE_PROCESSVERTICES* pv)
{
return ((pv->dwDeviceFlags & (D3DDEV_DONOTCLIP | D3DDEV_VERTEXSHADERS)) |
(pv->dwFlags & (D3DPV_POSITION_TWEENING | D3DPV_NORMAL_TWEENING))) == 0;
}
//-----------------------------------------------------------------------------
// Returns TRUE if we never read from the internal TL buffer
//
inline BOOL NeverReadFromTLBuffer(D3DFE_PROCESSVERTICES* pv)
{
return (pv->dwDeviceFlags & D3DDEV_DONOTCLIP) | DoOnePassPrimProcessing(pv);
}
#endif // __MSPSGP_H_