| /**************************************************************************** |
| * |
| * Mesa 3-D graphics library |
| * Direct3D Driver Interface |
| * |
| * ======================================================================== |
| * |
| * Copyright (C) 1991-2004 SciTech Software, Inc. All rights reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * SCITECH SOFTWARE INC BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
| * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF |
| * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| * SOFTWARE. |
| * |
| * ====================================================================== |
| * |
| * Language: ANSI C |
| * Environment: Windows 9x/2000/XP/XBox (Win32) |
| * |
| * Description: GLDirect fastpath pipeline stage |
| * |
| ****************************************************************************/ |
| |
| //--------------------------------------------------------------------------- |
| |
| //#include "../GLDirect.h" |
| //#include "../gld_log.h" |
| //#include "gld_dx8.h" |
| |
| #include "dglcontext.h" |
| #include "ddlog.h" |
| #include "gld_dx7.h" |
| |
| //--------------------------------------------------------------------------- |
| |
| #include "glheader.h" |
| #include "context.h" |
| #include "macros.h" |
| // #include "mem.h" |
| #include "mtypes.h" |
| //#include "mmath.h" |
| |
| #include "math/m_matrix.h" |
| #include "math/m_xform.h" |
| |
| #include "tnl/t_pipeline.h" |
| |
| //--------------------------------------------------------------------------- |
| /* |
| __inline void _gldSetVertexShaderConstants( |
| GLcontext *ctx, |
| GLD_driver_dx8 *gld) |
| { |
| D3DXMATRIX mat, matView, matProj; |
| GLfloat *pM; |
| |
| // Mesa 5: Altered to a Stack |
| //pM = ctx->ModelView.m; |
| pM = ctx->ModelviewMatrixStack.Top->m; |
| matView._11 = pM[0]; |
| matView._12 = pM[1]; |
| matView._13 = pM[2]; |
| matView._14 = pM[3]; |
| matView._21 = pM[4]; |
| matView._22 = pM[5]; |
| matView._23 = pM[6]; |
| matView._24 = pM[7]; |
| matView._31 = pM[8]; |
| matView._32 = pM[9]; |
| matView._33 = pM[10]; |
| matView._34 = pM[11]; |
| matView._41 = pM[12]; |
| matView._42 = pM[13]; |
| matView._43 = pM[14]; |
| matView._44 = pM[15]; |
| |
| // Mesa 5: Altered to a Stack |
| //pM = ctx->ProjectionMatrix.m; |
| pM = ctx->ProjectionMatrixStack.Top->m; |
| matProj._11 = pM[0]; |
| matProj._12 = pM[1]; |
| matProj._13 = pM[2]; |
| matProj._14 = pM[3]; |
| matProj._21 = pM[4]; |
| matProj._22 = pM[5]; |
| matProj._23 = pM[6]; |
| matProj._24 = pM[7]; |
| matProj._31 = pM[8]; |
| matProj._32 = pM[9]; |
| matProj._33 = pM[10]; |
| matProj._34 = pM[11]; |
| matProj._41 = pM[12]; |
| matProj._42 = pM[13]; |
| matProj._43 = pM[14]; |
| matProj._44 = pM[15]; |
| |
| D3DXMatrixMultiply( &mat, &matView, &matProj ); |
| D3DXMatrixTranspose( &mat, &mat ); |
| |
| _GLD_DX8_DEV(SetVertexShaderConstant(gld->pDev, 0, &mat, 4)); |
| } |
| */ |
| //--------------------------------------------------------------------------- |
| |
| static GLboolean gld_d3d_render_stage_run( |
| GLcontext *ctx, |
| struct tnl_pipeline_stage *stage) |
| { |
| GLD_context *gldCtx = GLD_GET_CONTEXT(ctx); |
| GLD_driver_dx7 *gld = GLD_GET_DX7_DRIVER(gldCtx); |
| |
| TNLcontext *tnl; |
| struct vertex_buffer *VB; |
| tnl_render_func *tab; |
| GLint pass; |
| GLD_pb_dx7 *gldPB = &gld->PB3d; |
| DWORD dwFlags; |
| |
| /* |
| static int count = 0; |
| count++; |
| if (count != 2) |
| return GL_FALSE; |
| */ |
| // The "check" function should disable this stage, |
| // but we'll test gld->bUseMesaTnL anyway. |
| if (gld->bUseMesaTnL) { |
| // Do nothing in this stage, but continue pipeline |
| return GL_TRUE; |
| } |
| |
| tnl = TNL_CONTEXT(ctx); |
| VB = &tnl->vb; |
| pass = 0; |
| |
| tnl->Driver.Render.Start( ctx ); |
| |
| #if 0 |
| // For debugging: Useful to see if an app passes colour data in |
| // an unusual format. |
| switch (VB->ColorPtr[0]->Type) { |
| case GL_FLOAT: |
| ddlogMessage(GLDLOG_SYSTEM, "ColorPtr: GL_FLOAT\n"); |
| break; |
| case GL_UNSIGNED_BYTE: |
| ddlogMessage(GLDLOG_SYSTEM, "ColorPtr: GL_UNSIGNED_BYTE\n"); |
| break; |
| default: |
| ddlogMessage(GLDLOG_SYSTEM, "ColorPtr: *?*\n"); |
| break; |
| } |
| #endif |
| |
| tnl->Driver.Render.Points = gld_Points3D_DX7; |
| if (ctx->_TriangleCaps & DD_FLATSHADE) { |
| tnl->Driver.Render.Line = gld_Line3DFlat_DX7; |
| tnl->Driver.Render.Triangle = gld_Triangle3DFlat_DX7; |
| tnl->Driver.Render.Quad = gld_Quad3DFlat_DX7; |
| } else { |
| tnl->Driver.Render.Line = gld_Line3DSmooth_DX7; |
| tnl->Driver.Render.Triangle = gld_Triangle3DSmooth_DX7; |
| tnl->Driver.Render.Quad = gld_Quad3DSmooth_DX7; |
| } |
| |
| // _GLD_DX7_VB(Lock(gldPB->pVB, 0, 0, &gldPB->pPoints, D3DLOCK_DISCARD)); |
| dwFlags = DDLOCK_DISCARDCONTENTS | DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY; |
| _GLD_DX7_VB(Lock(gldPB->pVB, dwFlags, &gldPB->pPoints, NULL)); |
| gldPB->nPoints = gldPB->nLines = gldPB->nTriangles = 0; |
| // Allocate primitive pointers |
| // gldPB->pPoints is always first |
| gldPB->pLines = gldPB->pPoints + (gldPB->dwStride * gldPB->iFirstLine); |
| gldPB->pTriangles = gldPB->pPoints + (gldPB->dwStride * gldPB->iFirstTriangle); |
| |
| ASSERT(tnl->Driver.Render.BuildVertices); |
| ASSERT(tnl->Driver.Render.PrimitiveNotify); |
| ASSERT(tnl->Driver.Render.Points); |
| ASSERT(tnl->Driver.Render.Line); |
| ASSERT(tnl->Driver.Render.Triangle); |
| ASSERT(tnl->Driver.Render.Quad); |
| ASSERT(tnl->Driver.Render.ResetLineStipple); |
| ASSERT(tnl->Driver.Render.Interp); |
| ASSERT(tnl->Driver.Render.CopyPV); |
| ASSERT(tnl->Driver.Render.ClippedLine); |
| ASSERT(tnl->Driver.Render.ClippedPolygon); |
| ASSERT(tnl->Driver.Render.Finish); |
| |
| tab = (VB->Elts ? tnl->Driver.Render.PrimTabElts : tnl->Driver.Render.PrimTabVerts); |
| |
| do { |
| GLuint i, length, flags = 0; |
| for (i = 0 ; !(flags & PRIM_END) ; i += length) |
| { |
| flags = VB->Primitive[i].mode; |
| length= VB->Primitive[i].count; |
| ASSERT(length || (flags & PRIM_END)); |
| ASSERT((flags & PRIM_MODE_MASK) <= GL_POLYGON+1); |
| if (length) |
| tab[flags & PRIM_MODE_MASK]( ctx, i, i + length, flags ); |
| } |
| } while (tnl->Driver.Render.Multipass && |
| tnl->Driver.Render.Multipass( ctx, ++pass )); |
| |
| _GLD_DX7_VB(Unlock(gldPB->pVB)); |
| |
| // _GLD_DX7_DEV(SetStreamSource(gld->pDev, 0, gldPB->pVB, gldPB->dwStride)); |
| |
| _GLD_DX7_DEV(SetTransform(gld->pDev, D3DTRANSFORMSTATE_PROJECTION, &gld->matProjection)); |
| _GLD_DX7_DEV(SetTransform(gld->pDev, D3DTRANSFORMSTATE_WORLD, &gld->matModelView)); |
| |
| if (gldPB->nPoints) { |
| // _GLD_DX7_DEV(DrawPrimitive(gld->pDev, D3DPT_POINTLIST, 0, gldPB->nPoints)); |
| _GLD_DX7_DEV(DrawPrimitiveVB(gld->pDev, D3DPT_POINTLIST, gldPB->pVB, 0, gldPB->nPoints, 0)); |
| gldPB->nPoints = 0; |
| } |
| |
| if (gldPB->nLines) { |
| // _GLD_DX7_DEV(DrawPrimitive(gld->pDev, D3DPT_LINELIST, gldPB->iFirstLine, gldPB->nLines)); |
| _GLD_DX7_DEV(DrawPrimitiveVB(gld->pDev, D3DPT_LINELIST, gldPB->pVB, gldPB->iFirstLine, gldPB->nLines, 0)); |
| gldPB->nLines = 0; |
| } |
| |
| if (gldPB->nTriangles) { |
| // _GLD_DX7_DEV(DrawPrimitive(gld->pDev, D3DPT_TRIANGLELIST, gldPB->iFirstTriangle, gldPB->nTriangles)); |
| _GLD_DX7_DEV(DrawPrimitiveVB(gld->pDev, D3DPT_TRIANGLELIST, gldPB->pVB, gldPB->iFirstTriangle, gldPB->nTriangles, 0)); |
| gldPB->nTriangles = 0; |
| } |
| |
| return GL_FALSE; /* finished the pipe */ |
| } |
| |
| |
| //--------------------------------------------------------------------------- |
| |
| const struct tnl_pipeline_stage _gld_d3d_render_stage = |
| { |
| "gld_d3d_render_stage", |
| NULL, |
| NULL, |
| NULL, |
| NULL, |
| gld_d3d_render_stage_run /* run */ |
| }; |
| |
| //--------------------------------------------------------------------------- |