Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

225 lines
6.6 KiB

//----------------------------------------------------------------------------
//
// rendprim.cpp
//
// RastRenderState and RastRenderPrimitive.
//
// Copyright (C) Microsoft Corporation, 1997.
//
//----------------------------------------------------------------------------
#include "pch.cpp"
#pragma hdrstop
#define DDS_LCL(x) ((LPDDRAWI_DDRAWSURFACE_INT)(x))->lpLcl
//----------------------------------------------------------------------------
//
// RendPoint
//
// Draw lists of points. Called by RastRenderPrimitive() for drawing points.
//
//----------------------------------------------------------------------------
HRESULT FASTCALL
DoRendPoints(LPVOID pCtx,
PRIMITIVE_FUNTIONS *pfnPrims,
LPD3DINSTRUCTION pIns,
LPD3DTLVERTEX pVtx,
LPD3DPOINT pPt)
{
INT i;
LPD3DTLVERTEX pV;
for (i = pIns->wCount; i > 0; i--)
{
INT iPts;
for (iPts = pPt->wCount, pV = pVtx + pPt->wFirst;
iPts > 0;
iPts --, pV ++)
{
HRESULT hr;
HR_RET(pfnPrims->pfnPoint(pCtx, (PUINT8)pV));
}
}
return D3D_OK;
}
//----------------------------------------------------------------------------
//
// RendLine
//
// Draw a list of lines. Called by RastRenderPrimitive() for drawing lines.
//
//----------------------------------------------------------------------------
HRESULT FASTCALL
DoRendLines(LPVOID pCtx,
PRIMITIVE_FUNTIONS *pfnPrims,
LPD3DINSTRUCTION pIns,
LPD3DTLVERTEX pVtx,
LPD3DLINE pLine)
{
INT i;
LPD3DTLVERTEX pV0, pV1;
for (i = pIns->wCount; i > 0; i --)
{
HRESULT hr;
pV0 = pVtx + pLine->v1;
pV1 = pVtx + pLine->v2;
pLine = (LPD3DLINE)((PINT8)pLine + pIns->bSize);
HR_RET(pfnPrims->pfnLine(pCtx, (PUINT8)pV0, (PUINT8)pV1));
}
return D3D_OK;
}
//----------------------------------------------------------------------------
//
// RendTriangle
//
// Draw a list of triangles. Called by RastRenderPrimitive() for drawing
// triangles.
//
//----------------------------------------------------------------------------
HRESULT FASTCALL
DoRendTriangles(LPVOID pCtx,
PRIMITIVE_FUNTIONS *pfnPrims,
LPD3DINSTRUCTION pIns,
LPD3DTLVERTEX pVtx,
LPD3DTRIANGLE pTri)
{
LPD3DTLVERTEX pV0, pV1, pV2;
INT i;
for (i = pIns->wCount; i > 0; i --)
{
HRESULT hr;
pV0 = pVtx + pTri->v1;
pV1 = pVtx + pTri->v2;
pV2 = pVtx + pTri->v3;
HR_RET(pfnPrims->pfnTri(pCtx, (PUINT8)pV0, (PUINT8)pV1,
(PUINT8)pV2, pTri->wFlags));
pTri = (LPD3DTRIANGLE)((PINT8)pTri + pIns->bSize);
}
return D3D_OK;
}
//----------------------------------------------------------------------------
//
// RastRenderPrimitive
//
// Called by Execute() for drawing primitives.
//
//----------------------------------------------------------------------------
DWORD __stdcall
RastRenderPrimitive(LPD3DHAL_RENDERPRIMITIVEDATA pRenderData)
{
LPD3DINSTRUCTION pIns;
LPD3DTLVERTEX pVtx;
PUINT8 pData, pPrim;
D3DContext *pDCtx;
VALIDATE_D3DCONTEXT("RastRenderPrimitive", pRenderData);
if (pDCtx->GetRastCtx()->pdwRenderState[D3DRENDERSTATE_ZVISIBLE])
{
pRenderData->dwStatus &= ~D3DSTATUS_ZNOTVISIBLE;
pRenderData->ddrval = D3D_OK;
return DDHAL_DRIVER_HANDLED;
}
// Find out necessary data
pData = (PUINT8)(DDS_LCL(pRenderData->lpExeBuf)->lpGbl->fpVidMem);
pIns = &pRenderData->diInstruction;
pPrim = pData + pRenderData->dwOffset;
pVtx = (LPD3DTLVERTEX)
((PUINT8)DDS_LCL(pRenderData->lpTLBuf)->lpGbl->fpVidMem
+ pRenderData->dwTLOffset);
pRenderData->ddrval = pDCtx->Begin();
if (pRenderData->ddrval != D3D_OK)
{
return DDHAL_DRIVER_HANDLED;
}
// Render
switch (pIns->bOpcode) {
case D3DOP_POINT:
pDCtx->BeginPrimSet(D3DPT_POINTLIST, RAST_TLVERTEX);
pRenderData->ddrval = DoRendPoints((LPVOID)pDCtx, pDCtx->GetFunsTbl(),
pIns, pVtx, (LPD3DPOINT)pPrim);
break;
case D3DOP_LINE:
pDCtx->BeginPrimSet(D3DPT_LINELIST, RAST_TLVERTEX);
pRenderData->ddrval = DoRendLines((LPVOID)pDCtx, pDCtx->GetFunsTbl(),
pIns, pVtx, (LPD3DLINE)pPrim);
break;
case D3DOP_TRIANGLE:
pDCtx->BeginPrimSet(D3DPT_TRIANGLELIST, RAST_TLVERTEX);
pRenderData->ddrval = DoRendTriangles((LPVOID)pDCtx, pDCtx->GetFunsTbl(),
pIns, pVtx, (LPD3DTRIANGLE)pPrim);
break;
default:
D3D_ERR("(Rast) Wrong Opcode passed to the new rasterizer.");
pRenderData->ddrval = DDERR_INVALIDPARAMS;
break;
}
HRESULT hr;
hr = pDCtx->End();
if (pRenderData->ddrval == D3D_OK)
{
pRenderData->ddrval = hr;
}
return DDHAL_DRIVER_HANDLED;
}
//----------------------------------------------------------------------------
//
// RastRenderPrimitive
//
// Called by Execute() for setting render states.
//
//----------------------------------------------------------------------------
DWORD __stdcall
RastRenderState(LPD3DHAL_RENDERSTATEDATA pStateData)
{
PUINT8 pData;
LPD3DSTATE pState;
INT i;
D3DContext *pDCtx;
VALIDATE_D3DCONTEXT("RastRenderState", pStateData);
// Updates D3DCTX
pData = (PUINT8) (((LPDDRAWI_DDRAWSURFACE_INT)
(pStateData->lpExeBuf))->lpLcl->lpGbl->fpVidMem);
for (i = 0, pState = (LPD3DSTATE) (pData + pStateData->dwOffset);
i < (INT)pStateData->dwCount;
i ++, pState ++)
{
UINT32 type = (UINT32) pState->drstRenderStateType;
// Check for overrides
if (IS_OVERRIDE(type)) {
UINT32 override = GET_OVERRIDE(type);
if (pState->dwArg[0])
STATESET_SET(pDCtx->m_renderstate_override, override);
else
STATESET_CLEAR(pDCtx->m_renderstate_override, override);
continue;
}
if (STATESET_ISSET(pDCtx->m_renderstate_override, type))
continue;
// Set the state
pStateData->ddrval = pDCtx->SetRenderState(type, pState->dwArg[0]);
if (pStateData->ddrval != D3D_OK)
{
return DDHAL_DRIVER_HANDLED;
}
}
return DDHAL_DRIVER_HANDLED;
}