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
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;
|
|
}
|