520 lines
15 KiB
C
520 lines
15 KiB
C
/*
|
|
** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
|
|
** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
|
|
** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
|
|
** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
|
|
** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
|
|
** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
|
|
** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
|
|
** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
|
|
**
|
|
** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
|
|
** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
|
|
** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
|
|
** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
|
|
** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
|
|
** THE UNITED STATES.
|
|
**
|
|
** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
|
|
**
|
|
** $Header$
|
|
** $Log$
|
|
** Revision 1.1.1.1 1999/12/07 21:42:31 joseph
|
|
** Initial checkin into SourceForge.
|
|
**
|
|
**
|
|
** 1 10/08/98 11:30a Brent
|
|
**
|
|
** 22 10/07/98 9:43p Peter
|
|
** triangle procs for 3DNow!(tm)
|
|
**
|
|
** 21 10/06/98 8:23p Peter
|
|
** 3DNow!(tm) texture downloads
|
|
**
|
|
** 20 10/06/98 7:18p Atai
|
|
** added triangle and drawlist asm routine for clip coords
|
|
**
|
|
** 19 9/29/98 2:32p Atai
|
|
** change color type if parameter is enabled
|
|
**
|
|
** 18 9/09/98 11:57a Atai
|
|
** fix grVertexLayout dbg msg
|
|
**
|
|
** 17 7/24/98 1:41p Hohn
|
|
**
|
|
** 16 6/11/98 5:12p Atai
|
|
** added aa case for OGL
|
|
**
|
|
** 15 6/08/98 7:28p Atai
|
|
** remove unused defines, add state selectors and update state routine
|
|
** prototype
|
|
**
|
|
** 14 6/08/98 3:20p Atai
|
|
** fix tri stats
|
|
**
|
|
** 13 5/29/98 11:30a Atai
|
|
** 1.added _EXT for extension #defines.
|
|
** 2. change GR_TEXBASE_* values
|
|
**
|
|
** 12 5/12/98 7:26p Atai
|
|
** added fog parameter offset and mode
|
|
**
|
|
** 11 4/21/98 1:34p Atai
|
|
** make 32 bit clean
|
|
**
|
|
** 10 4/17/98 10:59a Atai
|
|
** added grGlideGetVertexLayout and grGlideSetVertexLayout
|
|
**
|
|
** 9 3/21/98 11:31a Atai
|
|
** added GR_TRIANGLE_STRIP_CONTINUE and GR_TRIANGLE_FAN_CONTINUE
|
|
**
|
|
** 8 2/09/98 6:20p Atai
|
|
** remove aa strip and fan for grDrawVertexArrayContiguous
|
|
**
|
|
** 7 2/06/98 6:57p Atai
|
|
** rename grVertexArrayLinear to grDrawVertexArrayContiguous
|
|
**
|
|
** 6 2/05/98 6:19p Atai
|
|
** lazy evaluate for grVertexLayout
|
|
**
|
|
** 5 2/03/98 3:40p Atai
|
|
** remove aa strip/fan and code clean up
|
|
**
|
|
** 4 1/28/98 10:12a Atai
|
|
** update GrState size
|
|
**
|
|
** 3 1/26/98 11:30a Atai
|
|
** update to new glide.h
|
|
**
|
|
** 2 1/22/98 10:35a Atai
|
|
** 1. introduce GLIDE_VERSION, g3\glide.h, g3\glideutl.h, g2\glide.h,
|
|
** g2\glideutl.h
|
|
** 2. fixed grChromaRange, grSstOrigin, and grGetProcAddress
|
|
*
|
|
* 1 1/16/98 4:29p Atai
|
|
* create glide 3 src
|
|
*
|
|
* 14 1/08/98 4:58p Atai
|
|
* tex table broadcast, grVertexLayout enable/disable, stq, and some
|
|
* defines
|
|
*
|
|
* 13 12/12/97 10:59a Atai
|
|
* clip space and viewport
|
|
*
|
|
* 12 12/08/97 10:42a Atai
|
|
* added grDrawVertexArrayLinear()
|
|
*
|
|
* 11 11/21/97 6:05p Atai
|
|
* use one datalist (tsuDataList) in glide3
|
|
*
|
|
* 10 11/18/97 6:11p Peter
|
|
* fixed glide3 muckage
|
|
*
|
|
* 9 11/18/97 3:24p Atai
|
|
* change grParameterData to grVertexLayout
|
|
* define GR_PARAM_*
|
|
*
|
|
* 8 11/07/97 11:22a Atai
|
|
* remove GR_*_SMOOTH. use GR_SMOOTH
|
|
*
|
|
* 7 11/06/97 6:10p Atai
|
|
* update GrState size
|
|
* rename grDrawArray to grDrawVertexArray
|
|
* update _grDrawPoint and _grDrawVertexList
|
|
*
|
|
* 6 10/21/97 8:36p Atai
|
|
* added gr_lines routines
|
|
* use dword offset
|
|
*
|
|
* 5 10/17/97 2:11p Atai
|
|
* added grContinueArray. We only support non aa mode for now.
|
|
*
|
|
* 4 10/14/97 4:34p Atai
|
|
* filled out the calls to different drawarray routines
|
|
*
|
|
* 3 9/29/97 1:26p Dow
|
|
* Fixed packed color strips/fans
|
|
*
|
|
* 2 9/26/97 10:24a Dow
|
|
* Fixed state muckage in Glide3 parameter data
|
|
*
|
|
* 1 9/23/97 2:04p Dow
|
|
* DI code for strips
|
|
**
|
|
*/
|
|
#ifdef GLIDE3
|
|
|
|
#include <3dfx.h>
|
|
#include <glidesys.h>
|
|
|
|
#define FX_DLL_DEFINITION
|
|
#include <fxdll.h>
|
|
#include <glide.h>
|
|
|
|
#include "fxglide.h"
|
|
|
|
/*-------------------------------------------------------------------
|
|
Function: grVertexLayout
|
|
Date: 17-Sep-97
|
|
Implementor(s): dow
|
|
Library: Init Code for
|
|
Description:
|
|
This routine defines the format for vertex arrays.
|
|
|
|
Arguments:
|
|
param - Type of date-i.e. vertex, color, or texture info:
|
|
GR_COLOR, GR_VERTEX, GR_TEXTURE0, GR_TEXTURE1
|
|
components - Which components are specified
|
|
Valid Components:
|
|
|
|
|
|
So, this table summarizes the legal combinations:
|
|
Param Type Size Description
|
|
=======================================================================================================
|
|
GR_PARAM_XY FxFloat 8 X and Y coordinates. Offset must be zero.
|
|
GR_PARAM_Z FxFloat 4 Z coordinate.
|
|
GR_PARAM_A FxFloat 4 Alpha value.
|
|
GR_PARAM_RGB FxFloat 12 RGB triplet.
|
|
GR_PARAM_PARGB FxU32 4 Packed ARGB. High-order byte is A, followed by R, G, and B.
|
|
GR_PARAM_STn FxFloat 8 S and T coordinates for TMU , where n is in the range [0, TBD]
|
|
GR_PARAM_Wn FxFloat 4
|
|
|
|
Return:
|
|
Nothing ever.
|
|
-------------------------------------------------------------------*/
|
|
GR_DIENTRY(grVertexLayout, void , (FxU32 param, FxI32 offset, FxU32 mode) )
|
|
{
|
|
#define FN_NAME "grVertexLayout"
|
|
GR_BEGIN_NOFIFOCHECK(FN_NAME, 85);
|
|
|
|
GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x)\n", param, offset);
|
|
|
|
switch (param) {
|
|
case GR_PARAM_XY:
|
|
GR_CHECK_F(myName,
|
|
(offset != 0),
|
|
"Offset must be zero.");
|
|
|
|
gc->state.vData.vertexInfo.offset = offset;
|
|
gc->state.vData.vertexInfo.mode = mode;
|
|
break;
|
|
|
|
case GR_PARAM_Z:
|
|
|
|
gc->state.vData.zInfo.offset = offset;
|
|
gc->state.vData.zInfo.mode = mode;
|
|
|
|
break;
|
|
|
|
case GR_PARAM_W:
|
|
|
|
gc->state.vData.wInfo.offset = offset;
|
|
gc->state.vData.wInfo.mode = mode;
|
|
|
|
break;
|
|
|
|
case GR_PARAM_FOG_EXT:
|
|
/*
|
|
** Fog coordinate is an extension in Glide3. It is supported in V2 and VB.
|
|
** If z-buffering, we use w iterator for fog coordinate.
|
|
** If w-buffering, we move the w iterator to floating point z and use w iterator for fog.
|
|
*/
|
|
gc->state.vData.fogInfo.offset = offset;
|
|
gc->state.vData.fogInfo.mode = mode;
|
|
|
|
break;
|
|
|
|
case GR_PARAM_A:
|
|
|
|
gc->state.vData.aInfo.offset = offset;
|
|
if (mode == GR_PARAM_ENABLE)
|
|
gc->state.vData.colorType = GR_FLOAT;
|
|
gc->state.vData.aInfo.mode = mode;
|
|
|
|
break;
|
|
case GR_PARAM_RGB:
|
|
|
|
gc->state.vData.rgbInfo.offset = offset;
|
|
if (mode == GR_PARAM_ENABLE)
|
|
gc->state.vData.colorType = GR_FLOAT;
|
|
gc->state.vData.rgbInfo.mode = mode;
|
|
|
|
break;
|
|
case GR_PARAM_PARGB:
|
|
|
|
gc->state.vData.pargbInfo.offset = offset;
|
|
if (mode == GR_PARAM_ENABLE)
|
|
gc->state.vData.colorType = GR_U8;
|
|
gc->state.vData.pargbInfo.mode = mode;
|
|
|
|
break;
|
|
case GR_PARAM_ST0:
|
|
|
|
gc->state.vData.st0Info.offset = offset;
|
|
gc->state.vData.st0Info.mode = mode;
|
|
|
|
break;
|
|
case GR_PARAM_ST1:
|
|
|
|
gc->state.vData.st1Info.offset = offset;
|
|
gc->state.vData.st1Info.mode = mode;
|
|
|
|
break;
|
|
case GR_PARAM_Q:
|
|
|
|
gc->state.vData.qInfo.offset = offset;
|
|
gc->state.vData.qInfo.mode = mode;
|
|
|
|
break;
|
|
case GR_PARAM_Q0:
|
|
|
|
gc->state.vData.q0Info.offset = offset;
|
|
gc->state.vData.q0Info.mode = mode;
|
|
|
|
break;
|
|
case GR_PARAM_Q1:
|
|
|
|
gc->state.vData.q1Info.offset = offset;
|
|
gc->state.vData.q1Info.mode = mode;
|
|
|
|
break;
|
|
}
|
|
|
|
gc->state.invalid |= vtxlayoutBIT;
|
|
|
|
GR_END();
|
|
#undef FN_NAME
|
|
} /* grParameterData */
|
|
|
|
/*-------------------------------------------------------------------
|
|
Function: grGlideGetVertexLayout
|
|
Date: 16-Apr-98
|
|
Implementor(s): atai
|
|
Library:
|
|
Description:
|
|
This routine gets the vertex layout
|
|
|
|
Arguments:
|
|
layout - vertexlayout
|
|
Return:
|
|
-------------------------------------------------------------------*/
|
|
GR_DIENTRY(grGlideGetVertexLayout, void , (void *layout) )
|
|
{
|
|
#define FN_NAME "grGlideGetVertexLayout"
|
|
GR_BEGIN_NOFIFOCHECK(FN_NAME, 87);
|
|
GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",layout);
|
|
GR_ASSERT(layout != NULL);
|
|
|
|
*((GrVertexLayout *)layout) = gc->state.vData;
|
|
|
|
GR_END();
|
|
#undef FN_NAME
|
|
} /* grGlideGetVertexLayout */
|
|
|
|
/*-------------------------------------------------------------------
|
|
Function: grGlideSetVertexLayout
|
|
Date: 16-Apr-98
|
|
Implementor(s): atai
|
|
Library:
|
|
Description:
|
|
This routine sets the vertex layout
|
|
|
|
Arguments:
|
|
layout - vertexlayout
|
|
Return:
|
|
-------------------------------------------------------------------*/
|
|
GR_DIENTRY(grGlideSetVertexLayout, void , (const void *layout) )
|
|
{
|
|
#define FN_NAME "grGlideSetVertexLayout"
|
|
GR_BEGIN_NOFIFOCHECK(FN_NAME, 87);
|
|
GDBG_INFO_MORE(gc->myLevel,"(0x%x)\n",layout);
|
|
GR_ASSERT(layout != NULL);
|
|
|
|
gc->state.vData = *((GrVertexLayout *)layout);
|
|
gc->state.invalid |= vtxlayoutBIT;
|
|
|
|
GR_END();
|
|
#undef FN_NAME
|
|
} /* grGlideSetVertexLayout */
|
|
|
|
/*-------------------------------------------------------------------
|
|
Function: grDrawVertexArray
|
|
Date: 18-Sep-97
|
|
Implementor(s): dow
|
|
Description:
|
|
|
|
Arguments:
|
|
mode: GR_POINTS, GR_LINE_STRIP, GR_POLYGON, GR_TRIANLGE_STRIP,
|
|
GR_TRIANGLE_FAN, GR_TRIANGLES
|
|
|
|
Return:
|
|
Nothing ever
|
|
-------------------------------------------------------------------*/
|
|
GR_DIENTRY(grDrawVertexArray, void , (FxU32 mode, FxU32 Count, void *pointers) )
|
|
{
|
|
#define FN_NAME "grDrawVertexArray"
|
|
GR_BEGIN_NOFIFOCHECK(FN_NAME, 90);
|
|
|
|
GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x, 0x%x)\n",
|
|
mode, Count, pointers);
|
|
|
|
GR_FLUSH_STATE();
|
|
|
|
#ifdef GDBG_INFO_ON
|
|
{
|
|
FxU32 i;
|
|
for (i = 0; i < Count; i++)
|
|
GDBG_INFO(110, "%s: pointers[%d] = 0x%x\n",
|
|
FN_NAME, i, ((float **)pointers)[i]);
|
|
}
|
|
#endif
|
|
|
|
switch (mode) {
|
|
case GR_POINTS:
|
|
if (gc->state.grEnableArgs.primitive_smooth_mode & GR_AA_ORDERED_POINTS_MASK)
|
|
_grAADrawPoints(GR_VTX_PTR_ARRAY, Count, pointers);
|
|
else
|
|
_grDrawPoints(GR_VTX_PTR_ARRAY, Count, pointers);
|
|
break;
|
|
case GR_LINE_STRIP:
|
|
if (gc->state.grEnableArgs.primitive_smooth_mode & GR_AA_ORDERED_LINES_MASK)
|
|
_grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, Count, pointers);
|
|
else
|
|
_grDrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINE_STRIP, Count, pointers);
|
|
break;
|
|
case GR_LINES:
|
|
if (gc->state.grEnableArgs.primitive_smooth_mode & GR_AA_ORDERED_LINES_MASK)
|
|
_grAADrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINES, Count, pointers);
|
|
else
|
|
_grDrawLineStrip(GR_VTX_PTR_ARRAY, GR_LINES, Count, pointers);
|
|
break;
|
|
|
|
/*
|
|
** anti-alias does not apply to strip and fan
|
|
*/
|
|
case GR_TRIANGLE_STRIP:
|
|
(*gc->curArchProcs.drawVertexList)(SSTCP_PKT3_BDDDDD, kSetupStrip, GR_VTX_PTR_ARRAY, Count, pointers);
|
|
_GlideRoot.stats.trisProcessed+=(Count-2);
|
|
break;
|
|
|
|
case GR_POLYGON:
|
|
case GR_TRIANGLE_FAN:
|
|
(*gc->curArchProcs.drawVertexList)(SSTCP_PKT3_BDDDDD, kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers);
|
|
_GlideRoot.stats.trisProcessed+=(Count-2);
|
|
break;
|
|
|
|
case GR_TRIANGLE_STRIP_CONTINUE:
|
|
(*gc->curArchProcs.drawVertexList)(SSTCP_PKT3_DDDDDD, kSetupStrip, GR_VTX_PTR_ARRAY, Count, pointers);
|
|
_GlideRoot.stats.trisProcessed+=Count;
|
|
break;
|
|
|
|
case GR_TRIANGLE_FAN_CONTINUE:
|
|
(*gc->curArchProcs.drawVertexList)(SSTCP_PKT3_DDDDDD, kSetupFan, GR_VTX_PTR_ARRAY, Count, pointers);
|
|
_GlideRoot.stats.trisProcessed+=Count;
|
|
break;
|
|
|
|
case GR_TRIANGLES:
|
|
if (gc->state.grEnableArgs.primitive_smooth_mode & GR_AA_ORDERED_TRIANGLES_MASK)
|
|
if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS)
|
|
_grAADrawTriangles(GR_VTX_PTR_ARRAY, GR_TRIANGLES, Count, pointers);
|
|
else
|
|
_grAAVpDrawTriangles(GR_VTX_PTR_ARRAY, GR_TRIANGLES, Count, pointers);
|
|
else
|
|
(*gc->curArchProcs.drawTrianglesProc)(GR_VTX_PTR_ARRAY, Count, pointers);
|
|
break;
|
|
|
|
}
|
|
#undef FN_NAME
|
|
} /* grDrawVertexArray */
|
|
|
|
|
|
/*-------------------------------------------------------------------
|
|
Function: grDrawVertexArrayContiguous
|
|
Date: 04-Dec-97
|
|
Implementor(s): atai
|
|
Description:
|
|
|
|
Arguments:
|
|
mode: GR_POINTS, GR_LINE_STRIP, GR_POLYGON, GR_TRIANLGE_STRIP,
|
|
GR_TRIANGLE_FAN, GR_TRIANGLES
|
|
|
|
Return:
|
|
Nothing ever
|
|
-------------------------------------------------------------------*/
|
|
GR_DIENTRY(grDrawVertexArrayContiguous, void , (FxU32 mode, FxU32 Count, void *pointers, FxU32 stride) )
|
|
{
|
|
#define FN_NAME "grDrawVertexArrayContiguous"
|
|
GR_BEGIN_NOFIFOCHECK(FN_NAME, 90);
|
|
|
|
GDBG_INFO_MORE(gc->myLevel, "(0x%x, 0x%x, 0x%x)\n",
|
|
mode, Count, pointers);
|
|
|
|
GR_FLUSH_STATE();
|
|
|
|
#ifdef GDBG_INFO_ON
|
|
{
|
|
FxU32 i;
|
|
for (i = 0; i < Count; i++)
|
|
GDBG_INFO(110, "%s: pointers[%d] = 0x%lx\n",
|
|
FN_NAME, i, (unsigned long)pointers + gc->state.vData.vStride * i);
|
|
}
|
|
#endif
|
|
|
|
gc->state.vData.vStride = stride >> 2;
|
|
switch (mode) {
|
|
case GR_POINTS:
|
|
if (gc->state.grEnableArgs.primitive_smooth_mode & GR_AA_ORDERED_POINTS_MASK)
|
|
_grAADrawPoints(GR_VTX_PTR, Count, pointers);
|
|
else
|
|
_grDrawPoints(GR_VTX_PTR, Count, pointers);
|
|
break;
|
|
case GR_LINE_STRIP:
|
|
if (gc->state.grEnableArgs.primitive_smooth_mode & GR_AA_ORDERED_LINES_MASK)
|
|
_grAADrawLineStrip(GR_VTX_PTR, GR_LINE_STRIP, Count, pointers);
|
|
else
|
|
_grDrawLineStrip(GR_VTX_PTR, GR_LINE_STRIP, Count, pointers);
|
|
break;
|
|
case GR_LINES:
|
|
if (gc->state.grEnableArgs.primitive_smooth_mode & GR_AA_ORDERED_LINES_MASK)
|
|
_grAADrawLineStrip(GR_VTX_PTR, GR_LINES, Count, pointers);
|
|
else
|
|
_grDrawLineStrip(GR_VTX_PTR, GR_LINES, Count, pointers);
|
|
break;
|
|
|
|
case GR_TRIANGLE_STRIP:
|
|
(*gc->curArchProcs.drawVertexList)(SSTCP_PKT3_BDDDDD, kSetupStrip, GR_VTX_PTR, Count, pointers);
|
|
_GlideRoot.stats.trisProcessed+=(Count-2);
|
|
break;
|
|
|
|
case GR_POLYGON:
|
|
case GR_TRIANGLE_FAN:
|
|
(*gc->curArchProcs.drawVertexList)(SSTCP_PKT3_BDDDDD, kSetupFan, GR_VTX_PTR, Count, pointers);
|
|
_GlideRoot.stats.trisProcessed+=(Count-2);
|
|
break;
|
|
|
|
case GR_TRIANGLE_STRIP_CONTINUE:
|
|
(*gc->curArchProcs.drawVertexList)(SSTCP_PKT3_DDDDDD, kSetupStrip, GR_VTX_PTR, Count, pointers);
|
|
_GlideRoot.stats.trisProcessed+=Count;
|
|
break;
|
|
|
|
case GR_TRIANGLE_FAN_CONTINUE:
|
|
(*gc->curArchProcs.drawVertexList)(SSTCP_PKT3_DDDDDD, kSetupFan, GR_VTX_PTR, Count, pointers);
|
|
_GlideRoot.stats.trisProcessed+=Count;
|
|
break;
|
|
|
|
case GR_TRIANGLES:
|
|
if (gc->state.grEnableArgs.primitive_smooth_mode & GR_AA_ORDERED_TRIANGLES_MASK)
|
|
if (gc->state.grCoordinateSpaceArgs.coordinate_space_mode == GR_WINDOW_COORDS)
|
|
_grAADrawTriangles(GR_VTX_PTR, GR_TRIANGLES, Count, pointers);
|
|
else
|
|
_grAAVpDrawTriangles(GR_VTX_PTR, GR_TRIANGLES, Count, pointers);
|
|
else
|
|
(*gc->curArchProcs.drawTrianglesProc)(GR_VTX_PTR, Count, pointers);
|
|
break;
|
|
|
|
}
|
|
#undef FN_NAME
|
|
} /* grDrawVertexArrayContiguous */
|
|
|
|
#endif /* GLIDE3 */
|