#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // forward declaration class CMyRasterizer; //////////////////////////////////////////////////////////////////////////////// // // CMyDriver // //////////////////////////////////////////////////////////////////////////////// class CMyDriver: public CMinimalDriver< CMyDriver, CMyRasterizer> { private: static const CSurfaceCapWrap c_aSurfaces[]; static const D3DCAPS8 c_D3DCaps; protected: public: CMyDriver(); ~CMyDriver() { } static const D3DCAPS8 GetCaps( void) { return c_D3DCaps; } }; //////////////////////////////////////////////////////////////////////////////// // // CMyRasterizer // //////////////////////////////////////////////////////////////////////////////// class CMyRasterizer { public: // Types typedef CMyDriver::TContext TContext; protected: int m_iVal; public: CMyRasterizer() { } ~CMyRasterizer() { } HRESULT DrawPrimitive( TContext& Context, const D3DHAL_DP2COMMAND& DP2Cmd, const D3DHAL_DP2DRAWPRIMITIVE* aDP2Param) { // Context can be converted to this structure. const D3DHAL_DP2VERTEXSHADER VertexShader( Context); // We need this data. UINT8* pStartVData= NULL; DWORD dwVStride( 0); // Since Sample is a non TnL device, the vertex shader handle should // always be a fixed function FVF. const DWORD dwFVF( VertexShader.dwHandle); // Since Sample only supports one stream, our data source should be // from stream 0. TContext::TVStream& VStream0( Context.GetVStream( 0)); VStream0.SetFVF( dwFVF); // Find vertex information. if( VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::User) { pStartVData= reinterpret_cast< UINT8*>( VStream0.GetUserMemPtr()); dwVStride= VStream0.GetStride(); } else if( VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::System|| VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::Video) { // Sample can pretend system mem and video mem surfaces are the same. pStartVData= reinterpret_cast< UINT8*>( VStream0.GetSurfDBRepresentation()->GetGBLfpVidMem()); dwVStride= VStream0.GetStride(); } if( pStartVData!= NULL) { const D3DHAL_DP2DRAWPRIMITIVE* pParam= aDP2Param; WORD wPrimitiveCount( DP2Cmd.wPrimitiveCount); if( wPrimitiveCount) do { const UINT8* pVData= pStartVData+ pParam->VStart* dwVStride; DrawOnePrimitive( Context, pParam->primType, pParam->PrimitiveCount, pVData, dwVStride, dwFVF); pParam++; } while( --wPrimitiveCount); } return DD_OK; } HRESULT DrawPrimitive2( TContext& Context, const D3DHAL_DP2COMMAND& DP2Cmd, const D3DHAL_DP2DRAWPRIMITIVE2* aDP2Param) { // Context can be converted to this structure. const D3DHAL_DP2VERTEXSHADER VertexShader( Context); // We need this data. UINT8* pStartVData= NULL; DWORD dwVStride( 0); // Since Sample is a non TnL device, the vertex shader handle should // always be a fixed function FVF. const DWORD dwFVF( VertexShader.dwHandle); // Since Sample only supports one stream, our data source should be // from stream 0. TContext::TVStream& VStream0( Context.GetVStream( 0)); VStream0.SetFVF( dwFVF); // Find vertex information. if( VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::User) { pStartVData= reinterpret_cast< UINT8*>( VStream0.GetUserMemPtr()); dwVStride= VStream0.GetStride(); } else if( VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::System|| VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::Video) { // Sample can pretend system mem and video mem surfaces are the same. pStartVData= reinterpret_cast< UINT8*>( VStream0.GetSurfDBRepresentation()->GetGBLfpVidMem()); dwVStride= VStream0.GetStride(); } if( pStartVData!= NULL) { const D3DHAL_DP2DRAWPRIMITIVE2* pParam= aDP2Param; WORD wPrimitiveCount( DP2Cmd.wPrimitiveCount); if( wPrimitiveCount) do { const UINT8* pVData= pStartVData+ pParam->FirstVertexOffset; DrawOnePrimitive( Context, pParam->primType, pParam->PrimitiveCount, pVData, dwVStride, dwFVF); pParam++; } while( --wPrimitiveCount); } return DD_OK; } HRESULT DrawIndexedPrimitive( TContext& Context, const D3DHAL_DP2COMMAND& DP2Cmd, const D3DHAL_DP2DRAWINDEXEDPRIMITIVE* aDP2Param) { // Context can be converted to these structures. const D3DHAL_DP2VERTEXSHADER VertexShader( Context); // We need this data. UINT8* pStartVData= NULL; UINT16* pStartIData= NULL; DWORD dwVStride( 0); DWORD dwIStride( 0); // Since Sample is a non TnL device, the vertex shader handle should // always be a fixed function FVF. const DWORD dwFVF( VertexShader.dwHandle); // Since Sample only supports one stream, our data source should be // from stream 0. TContext::TVStream& VStream0= Context.GetVStream( 0); VStream0.SetFVF( dwFVF); // Find vertex information. if( VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::User) { pStartVData= reinterpret_cast< UINT8*>( VStream0.GetUserMemPtr()); dwVStride= VStream0.GetStride(); } else if( VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::System|| VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::Video) { // Sample can pretend system mem and video mem surfaces are the same. pStartVData= reinterpret_cast< UINT8*>( VStream0.GetSurfDBRepresentation()->GetGBLfpVidMem()); dwVStride= VStream0.GetStride(); } // Find Indices information. TContext::TIStream& IStream= Context.GetIStream( 0); if( IStream.GetMemLocation()== TContext::TIStream::EMemLocation::System|| IStream.GetMemLocation()== TContext::TIStream::EMemLocation::Video) { // Sample can pretend system mem and video mem surfaces are the same. pStartIData= reinterpret_cast< UINT16*>( IStream.GetSurfDBRepresentation()->GetGBLfpVidMem()); dwIStride= IStream.GetStride(); } if( pStartVData!= NULL&& pStartIData!= NULL) { // Sample should've marked caps as only supporting 16-bit indices. assert( sizeof(UINT16)== dwIStride); const D3DHAL_DP2DRAWINDEXEDPRIMITIVE* pParam= aDP2Param; WORD wPrimitiveCount( DP2Cmd.wPrimitiveCount); if( wPrimitiveCount) do { const UINT8* pVData= pStartVData+ pParam->BaseVertexIndex* dwVStride; const UINT16* pIData= pStartIData+ pParam->StartIndex; //* dwIStride; DrawOneIPrimitive( Context, pParam->primType, pParam->PrimitiveCount, pVData, dwVStride, dwFVF, pIData); pParam++; } while( --wPrimitiveCount); } return DD_OK; } HRESULT DrawIndexedPrimitive2( TContext& Context, const D3DHAL_DP2COMMAND& DP2Cmd, const D3DHAL_DP2DRAWINDEXEDPRIMITIVE2* aDP2Param) { // Context can be converted to these structures. const D3DHAL_DP2VERTEXSHADER VertexShader( Context); // We need this data. UINT8* pStartVData= NULL; UINT16* pStartIData= NULL; DWORD dwVStride( 0); DWORD dwIStride( 0); // Since Sample is a non TnL device, the vertex shader handle should // always be a fixed function FVF. const DWORD dwFVF( VertexShader.dwHandle); // Since Sample only supports one stream, our data source should be // from stream 0. TContext::TVStream& VStream0( Context.GetVStream( 0)); VStream0.SetFVF( dwFVF); // Find vertex information. if( VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::User) { pStartVData= reinterpret_cast< UINT8*>( VStream0.GetUserMemPtr()); dwVStride= VStream0.GetStride(); } else if( VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::System|| VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::Video) { // Sample can pretend system mem and video mem surfaces are the same. pStartVData= reinterpret_cast< UINT8*>( VStream0.GetSurfDBRepresentation()->GetGBLfpVidMem()); dwVStride= VStream0.GetStride(); } // Find Indices information. TContext::TIStream& IStream= Context.GetIStream( 0); if( IStream.GetMemLocation()== TContext::TIStream::EMemLocation::System|| IStream.GetMemLocation()== TContext::TIStream::EMemLocation::Video) { // Sample can pretend system mem and video mem surfaces are the same. pStartIData= reinterpret_cast< UINT16*>( IStream.GetSurfDBRepresentation()->GetGBLfpVidMem()); dwIStride= IStream.GetStride(); } if( pStartVData!= NULL&& pStartIData!= NULL) { // Sample should've marked caps as only supporting 16-bit indices. assert( sizeof(UINT16)== dwIStride); const D3DHAL_DP2DRAWINDEXEDPRIMITIVE2* pParam= aDP2Param; WORD wPrimitiveCount( DP2Cmd.wPrimitiveCount); if( wPrimitiveCount) do { const UINT8* pVData= pStartVData+ pParam->BaseVertexOffset; const UINT16* pIData= reinterpret_cast< const UINT16*>( pStartIData+ pParam->StartIndexOffset); DrawOneIPrimitive( Context, pParam->primType, pParam->PrimitiveCount, pVData, dwVStride, dwFVF, pIData); pParam++; } while( --wPrimitiveCount); } return DD_OK; } HRESULT ClippedTriangleFan( TContext& Context, const D3DHAL_DP2COMMAND& DP2Cmd, const D3DHAL_CLIPPEDTRIANGLEFAN* aDP2Param) { // Context can be converted to this structure. const D3DHAL_DP2VERTEXSHADER VertexShader( Context); // We need this data. UINT8* pStartVData= NULL; DWORD dwVStride( 0); // Since Sample is a non TnL device, the vertex shader handle should // always be a fixed function FVF. const DWORD dwFVF( VertexShader.dwHandle); // Since Sample only supports one stream, our data source should be // from stream 0. TContext::TVStream& VStream0( Context.GetVStream( 0)); VStream0.SetFVF( dwFVF); // Find vertex information. if( VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::User) { pStartVData= reinterpret_cast< UINT8*>( VStream0.GetUserMemPtr()); dwVStride= VStream0.GetStride(); } else if( VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::System|| VStream0.GetMemLocation()== TContext::TVStream::EMemLocation::Video) { // Sample can pretend system mem and video mem surfaces are the same. pStartVData= reinterpret_cast< UINT8*>( VStream0.GetSurfDBRepresentation()->GetGBLfpVidMem()); dwVStride= VStream0.GetStride(); } if( pStartVData!= NULL) { const D3DHAL_CLIPPEDTRIANGLEFAN* pParam= aDP2Param; WORD wPrimitiveCount( DP2Cmd.wPrimitiveCount); if( wPrimitiveCount) do { const UINT8* pVData= pStartVData+ pParam->FirstVertexOffset; // Must use pParam->dwEdgeFlags for correct drawing of wireframe. if( Context.GetRenderStateDW( D3DRS_FILLMODE)!= D3DFILL_WIREFRAME) DrawOnePrimitive( Context, D3DPT_TRIANGLEFAN, pParam->PrimitiveCount, pVData, dwVStride, dwFVF); else assert( false); // NYI pParam++; } while( --wPrimitiveCount); } return DD_OK; } void DrawOnePrimitive( TContext& Context, D3DPRIMITIVETYPE primType, WORD wPrims, const UINT8* pVData, DWORD dwVStride, DWORD dwFVF) { } void DrawOneIPrimitive( TContext& Context, D3DPRIMITIVETYPE primType, WORD wPrims, const UINT8* pVData, DWORD dwVStride, DWORD dwFVF, const UINT16* pIData) { } };