/*===========================================================================*/ | |
/* */ | |
/* Mesa-3.0 DirectX 6 Driver */ | |
/* */ | |
/* By Leigh McRae */ | |
/* */ | |
/* http://www.altsoftware.com/ */ | |
/* */ | |
/* Copyright (c) 1999-1998 alt.software inc. All Rights Reserved */ | |
/*===========================================================================*/ | |
#include "D3DHAL.h" | |
/*===========================================================================*/ | |
/* This function clears the context bound to the supplied shared context. */ | |
/* The function takes the D3D flags D3DCLEAR_TARGET, D3DCLEAR_STENCIL and */ | |
/* D3DCLEAR_ZBUFFER. Set bAll to TRUE for a full clear else supply the coord*/ | |
/* of the rect to be cleared relative to the window. The color is always a */ | |
/* 32bit value (RGBA). Fill in the z-value and stencil if needed. */ | |
/* */ | |
/* TODO: this can be redone to be called by Mesa directly. */ | |
/*===========================================================================*/ | |
/* RETURN: */ | |
/*===========================================================================*/ | |
extern "C" void ClearHAL( PMESAD3DSHARED pShared, DWORD dwFlags, BOOL bAll, int x, int y, int cx, int cy, DWORD dwColor, float zv, DWORD dwStencil ) | |
{ | |
PMESAD3DHAL pHAL = (PMESAD3DHAL)pShared; | |
D3DRECT d3dRect; | |
#ifdef D3D_DEBUG | |
HRESULT rc; | |
DPF(( DBG_FUNC, "CleaHAL();" )); | |
/* Make sure we have enough info. */ | |
if ( (pHAL == NULL) || (pHAL->lpViewport == NULL) ) | |
return; | |
#endif | |
if ( bAll ) | |
{ | |
/* I assume my viewport is valid. */ | |
d3dRect.lX1 = pShared->rectV.left; | |
d3dRect.lY1 = pShared->rectV.top; | |
d3dRect.lX2 = pShared->rectV.right; | |
d3dRect.lY2 = pShared->rectV.bottom; | |
} | |
else | |
{ | |
d3dRect.lX1 = pShared->rectV.left + x; | |
d3dRect.lY1 = pShared->rectV.top + y; | |
d3dRect.lX2 = d3dRect.lX1 + cx; | |
d3dRect.lY2 = d3dRect.lY1 + cy; | |
} | |
#ifdef D3D_DEBUG | |
rc = pHAL->lpViewport->Clear2( 1, &d3dRect, dwFlags, dwColor, zv, dwStencil ); | |
if ( FAILED(rc) ) | |
{ | |
RIP( pHAL, "Clear2 ->", ErrorStringD3D(rc) ); | |
} | |
#else | |
pHAL->lpViewport->Clear2( 1, &d3dRect, dwFlags, dwColor, zv, dwStencil ); | |
#endif | |
} | |
/*===========================================================================*/ | |
/* Well this is the guts of it all. Here we rasterize the primitives that */ | |
/* are in their final form. OpenGL has done all the lighting, transfomations*/ | |
/* and clipping at this point. */ | |
/* */ | |
/* TODO: I'm not sure if I want to bother to check for errors on this call. */ | |
/* The overhead kills me... */ | |
/*===========================================================================*/ | |
/* RETURN: */ | |
/*===========================================================================*/ | |
extern "C" void DrawPrimitiveHAL( PMESAD3DSHARED pShared, D3DPRIMITIVETYPE dptPrimitiveType, D3DTLVERTEX *pVertices, DWORD dwCount ) | |
{ | |
PMESAD3DHAL pHAL = (PMESAD3DHAL)pShared; | |
#ifdef D3D_DEBUG | |
HRESULT rc; | |
DPF(( DBG_FUNC, "DrawPrimitveHAL();" )); | |
/* Make sure we have enough info. */ | |
if ( (pHAL == NULL) || (pHAL->lpD3DDevice == NULL) ) | |
return; | |
DPF(( DBG_PRIM_INFO, "DP( %d )", dwCount )); | |
rc = pHAL->lpD3DDevice->DrawPrimitive( dptPrimitiveType, | |
D3DFVF_TLVERTEX, | |
(LPVOID)pVertices, | |
dwCount, | |
(D3DDP_DONOTCLIP | D3DDP_DONOTLIGHT) ); | |
if ( FAILED(rc) ) | |
{ | |
RIP( pHAL, "DrawPrimitive ->", ErrorStringD3D(rc) ); | |
} | |
#else | |
pHAL->lpD3DDevice->DrawPrimitive( dptPrimitiveType, | |
D3DFVF_TLVERTEX, | |
(LPVOID)pVertices, | |
dwCount, | |
(D3DDP_DONOTCLIP | D3DDP_DONOTLIGHT) ); | |
#endif | |
} | |
/*===========================================================================*/ | |
/* This call will handle the swapping of the buffers. Now I didn't bother */ | |
/* to support single buffered so this will be used for glFlush() as its all */ | |
/* the same. So first we do an EndScene as we are always considered to be in*/ | |
/* a BeginScene because when we leave we do a BeginScene. Now note that when*/ | |
/* the context is created in the first place we do a BeginScene also just to */ | |
/* get things going. The call will use either Flip/blt based on the type of */ | |
/* surface was created for rendering. */ | |
/*===========================================================================*/ | |
/* RETURN: */ | |
/*===========================================================================*/ | |
extern "C" void SwapBuffersHAL( PMESAD3DSHARED pShared ) | |
{ | |
PMESAD3DHAL pHAL = (PMESAD3DHAL)pShared; | |
#ifdef D3D_DEBUG | |
HRESULT rc; | |
DPF(( DBG_FUNC, "SwapBuffersHAL();" )); | |
DPF(( DBG_ALL_PROFILE, "=================SWAP===================" )); | |
/* Make sure we have enough info. */ | |
if ( (pHAL == NULL) || (pHAL->lpD3DDevice == NULL) ) | |
return; | |
/* Make sure we have enough info. */ | |
if ( pHAL->lpDDSPrimary != NULL ) | |
{ | |
rc = pHAL->lpD3DDevice->EndScene(); | |
if ( FAILED(rc) ) | |
{ | |
RIP( pHAL, "EndScene ->", ErrorStringD3D(rc) ); | |
} | |
if ( pShared->bFlipable ) | |
{ | |
DPF(( DBG_CNTX_PROFILE, "Swap->FLIP" )); | |
rc = pHAL->lpDDSPrimary->Flip( NULL, DDFLIP_WAIT ); | |
} | |
else | |
{ | |
DPF(( DBG_CNTX_PROFILE, "Swap->Blt" )); | |
rc = pHAL->lpDDSPrimary->Blt( &pShared->rectW, pHAL->lpDDSRender, NULL, DDBLT_WAIT, NULL ); | |
} | |
if ( FAILED(rc) ) | |
{ | |
RIP( pHAL, "Blt (RENDER/PRIMARY) ->", ErrorStringD3D(rc) ); | |
} | |
rc = pHAL->lpD3DDevice->BeginScene(); | |
if ( FAILED(rc) ) | |
{ | |
RIP( pHAL, "BeginScene ->", ErrorStringD3D(rc) ); | |
} | |
} | |
#else | |
pHAL->lpD3DDevice->EndScene(); | |
if ( pShared->bFlipable ) | |
pHAL->lpDDSPrimary->Flip( NULL, DDFLIP_WAIT ); | |
else | |
pHAL->lpDDSPrimary->Blt( &pShared->rectW, pHAL->lpDDSRender, NULL, DDBLT_WAIT, NULL ); | |
pHAL->lpD3DDevice->BeginScene(); | |
#endif | |
} | |
/*===========================================================================*/ | |
/* This function is a very thin wrapper for the D3D call 'SetRenderState'. */ | |
/* Using this function requires all the types to be defined by including the */ | |
/* D3D header file. */ | |
/* */ | |
/* TODO: would be much better to get ride of all these calls per VBRender. */ | |
/* I feel I should get this call into SetRenderStates() the RenderVB. */ | |
/*===========================================================================*/ | |
/* RETURN: */ | |
/*===========================================================================*/ | |
extern "C" void SetStateHAL( PMESAD3DSHARED pShared, DWORD dwType, DWORD dwState ) | |
{ | |
PMESAD3DHAL pHAL = (PMESAD3DHAL)pShared; | |
#ifdef D3D_DEBUG | |
HRESULT rc; | |
DPF(( DBG_FUNC, "SetStateHAL();" )); | |
/* Make sure we have enough info. */ | |
if ( (pHAL == NULL) || (pHAL->lpD3DDevice == NULL) ) | |
return; | |
rc = pHAL->lpD3DDevice->SetRenderState( (D3DRENDERSTATETYPE)dwType, dwState ); | |
if ( FAILED(rc) ) | |
{ | |
RIP( pHAL, "SetRenderState ->", ErrorStringD3D(rc) ); | |
} | |
#else | |
pHAL->lpD3DDevice->SetRenderState( (D3DRENDERSTATETYPE)dwType, dwState ); | |
#endif | |
} | |