Another vertex program checkpoint: clean-up of vertex attribute storage
in vertex_buffer. Improved vertex program pipeline stage such that output registers can be processed in a loop. Getting closer to where we need to be in order to implement performance optimizations...
This commit is contained in:
@@ -1,10 +1,10 @@
|
|||||||
/* $Id: mtypes.h,v 1.58 2002/01/05 21:53:20 brianp Exp $ */
|
/* $Id: mtypes.h,v 1.59 2002/01/06 03:54:12 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 4.1
|
* Version: 4.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -1156,40 +1156,6 @@ struct gl_evaluators {
|
|||||||
#define VP_PROG_REG_START (VP_TEMP_REG_END + 1)
|
#define VP_PROG_REG_START (VP_TEMP_REG_END + 1)
|
||||||
#define VP_PROG_REG_END (VP_PROG_REG_START + VP_NUM_PROG_REGS - 1)
|
#define VP_PROG_REG_END (VP_PROG_REG_START + VP_NUM_PROG_REGS - 1)
|
||||||
|
|
||||||
/* Input register names */
|
|
||||||
#define VP_IN_OPOS (VP_INPUT_REG_START + 0)
|
|
||||||
#define VP_IN_WGHT (VP_INPUT_REG_START + 1)
|
|
||||||
#define VP_IN_NRML (VP_INPUT_REG_START + 2)
|
|
||||||
#define VP_IN_COL0 (VP_INPUT_REG_START + 3)
|
|
||||||
#define VP_IN_COL1 (VP_INPUT_REG_START + 4)
|
|
||||||
#define VP_IN_FOGC (VP_INPUT_REG_START + 5)
|
|
||||||
#define VP_IN_TEX0 (VP_INPUT_REG_START + 8)
|
|
||||||
#define VP_IN_TEX1 (VP_INPUT_REG_START + 9)
|
|
||||||
#define VP_IN_TEX2 (VP_INPUT_REG_START + 10)
|
|
||||||
#define VP_IN_TEX3 (VP_INPUT_REG_START + 11)
|
|
||||||
#define VP_IN_TEX4 (VP_INPUT_REG_START + 12)
|
|
||||||
#define VP_IN_TEX5 (VP_INPUT_REG_START + 13)
|
|
||||||
#define VP_IN_TEX6 (VP_INPUT_REG_START + 14)
|
|
||||||
#define VP_IN_TEX7 (VP_INPUT_REG_START + 15)
|
|
||||||
|
|
||||||
/* Output register names */
|
|
||||||
#define VP_OUT_HPOS (VP_OUTPUT_REG_START + 0)
|
|
||||||
#define VP_OUT_COL0 (VP_OUTPUT_REG_START + 1)
|
|
||||||
#define VP_OUT_COL1 (VP_OUTPUT_REG_START + 2)
|
|
||||||
#define VP_OUT_BFC0 (VP_OUTPUT_REG_START + 3)
|
|
||||||
#define VP_OUT_BFC1 (VP_OUTPUT_REG_START + 4)
|
|
||||||
#define VP_OUT_FOGC (VP_OUTPUT_REG_START + 5)
|
|
||||||
#define VP_OUT_PSIZ (VP_OUTPUT_REG_START + 6)
|
|
||||||
#define VP_OUT_TEX0 (VP_OUTPUT_REG_START + 7)
|
|
||||||
#define VP_OUT_TEX1 (VP_OUTPUT_REG_START + 8)
|
|
||||||
#define VP_OUT_TEX2 (VP_OUTPUT_REG_START + 9)
|
|
||||||
#define VP_OUT_TEX3 (VP_OUTPUT_REG_START + 10)
|
|
||||||
#define VP_OUT_TEX4 (VP_OUTPUT_REG_START + 11)
|
|
||||||
#define VP_OUT_TEX5 (VP_OUTPUT_REG_START + 12)
|
|
||||||
#define VP_OUT_TEX6 (VP_OUTPUT_REG_START + 13)
|
|
||||||
#define VP_OUT_TEX7 (VP_OUTPUT_REG_START + 14)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Machine state (i.e. the register file) */
|
/* Machine state (i.e. the register file) */
|
||||||
struct vp_machine
|
struct vp_machine
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
/* $Id: ss_vbtmp.h,v 1.19 2002/01/05 20:51:12 brianp Exp $ */
|
/* $Id: ss_vbtmp.h,v 1.20 2002/01/06 03:54:12 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 3.5
|
* Version: 4.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -77,8 +77,8 @@ static void TAG(emit)(GLcontext *ctx, GLuint start, GLuint end,
|
|||||||
proj_stride = VB->NdcPtr->stride;
|
proj_stride = VB->NdcPtr->stride;
|
||||||
|
|
||||||
if (IND & FOG) {
|
if (IND & FOG) {
|
||||||
fog = (GLfloat *) VB->AttribPtr[VERT_ATTRIB_FOG]->data;
|
fog = (GLfloat *) VB->FogCoordPtr->data;
|
||||||
fog_stride = VB->AttribPtr[VERT_ATTRIB_FOG]->stride;
|
fog_stride = VB->FogCoordPtr->stride;
|
||||||
}
|
}
|
||||||
if (IND & COLOR) {
|
if (IND & COLOR) {
|
||||||
if (VB->ColorPtr[0]->Type != CHAN_TYPE)
|
if (VB->ColorPtr[0]->Type != CHAN_TYPE)
|
||||||
@@ -99,7 +99,7 @@ static void TAG(emit)(GLcontext *ctx, GLuint start, GLuint end,
|
|||||||
index_stride = VB->IndexPtr[0]->stride;
|
index_stride = VB->IndexPtr[0]->stride;
|
||||||
}
|
}
|
||||||
if (IND & POINT) {
|
if (IND & POINT) {
|
||||||
pointSize = VB->PointSizePtr->data;
|
pointSize = (GLfloat *) VB->PointSizePtr->data;
|
||||||
pointSize_stride = VB->PointSizePtr->stride;
|
pointSize_stride = VB->PointSizePtr->stride;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,6 +215,7 @@ static void TAG(interp)( GLcontext *ctx,
|
|||||||
INTERP_UI( t, dst->index, out->index, in->index );
|
INTERP_UI( t, dst->index, out->index, in->index );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* XXX Point size interpolation??? */
|
||||||
if (IND & POINT) {
|
if (IND & POINT) {
|
||||||
INTERP_F( t, dst->pointSize, out->pointSize, in->pointSize );
|
INTERP_F( t, dst->pointSize, out->pointSize, in->pointSize );
|
||||||
}
|
}
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
/* $Id: t_array_import.c,v 1.20 2002/01/05 20:51:13 brianp Exp $ */
|
/* $Id: t_array_import.c,v 1.21 2002/01/06 03:54:12 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 3.5
|
* Version: 4.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -277,8 +277,8 @@ static void _tnl_upgrade_client_data( GLcontext *ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((required & VERT_FOG_BIT)
|
if ((required & VERT_FOG_BIT)
|
||||||
&& (VB->AttribPtr[VERT_ATTRIB_FOG]->flags & flags)) {
|
&& (VB->FogCoordPtr->flags & flags)) {
|
||||||
ASSERT(VB->AttribPtr[VERT_ATTRIB_FOG] == &inputs->FogCoord);
|
ASSERT(VB->FogCoordPtr == &inputs->FogCoord);
|
||||||
_tnl_import_fogcoord( ctx, writeable, stride );
|
_tnl_import_fogcoord( ctx, writeable, stride );
|
||||||
VB->importable_data &= ~VERT_FOG_BIT;
|
VB->importable_data &= ~VERT_FOG_BIT;
|
||||||
}
|
}
|
||||||
@@ -372,7 +372,7 @@ void _tnl_vb_bind_arrays( GLcontext *ctx, GLint start, GLsizei count )
|
|||||||
if (inputs & VERT_FOG_BIT) {
|
if (inputs & VERT_FOG_BIT) {
|
||||||
_tnl_import_fogcoord( ctx, 0, 0 );
|
_tnl_import_fogcoord( ctx, 0, 0 );
|
||||||
tmp->FogCoord.count = VB->Count;
|
tmp->FogCoord.count = VB->Count;
|
||||||
VB->AttribPtr[VERT_ATTRIB_FOG] = &tmp->FogCoord;
|
VB->FogCoordPtr = &tmp->FogCoord;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inputs & VERT_EDGEFLAG_BIT) {
|
if (inputs & VERT_EDGEFLAG_BIT) {
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: t_context.h,v 1.35 2002/01/05 20:51:13 brianp Exp $ */
|
/* $Id: t_context.h,v 1.36 2002/01/06 03:54:12 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
@@ -254,7 +254,6 @@ typedef struct vertex_buffer
|
|||||||
GLuint FirstPrimitive; /* usually zero */
|
GLuint FirstPrimitive; /* usually zero */
|
||||||
|
|
||||||
/* Pointers to current data.
|
/* Pointers to current data.
|
||||||
* XXX Replace ObjPtr, NormalPtr, TexCoordPtr, etc with AttribPtr[] arrays.
|
|
||||||
*/
|
*/
|
||||||
GLuint *Elts; /* VERT_ELT */
|
GLuint *Elts; /* VERT_ELT */
|
||||||
GLvector4f *ObjPtr; /* VERT_OBJ_BIT */
|
GLvector4f *ObjPtr; /* VERT_OBJ_BIT */
|
||||||
@@ -270,13 +269,15 @@ typedef struct vertex_buffer
|
|||||||
GLvector1ui *IndexPtr[2]; /* VERT_INDEX_BIT */
|
GLvector1ui *IndexPtr[2]; /* VERT_INDEX_BIT */
|
||||||
struct gl_client_array *ColorPtr[2]; /* VERT_COLOR0_BIT */
|
struct gl_client_array *ColorPtr[2]; /* VERT_COLOR0_BIT */
|
||||||
struct gl_client_array *SecondaryColorPtr[2];/* VERT_COLOR1_BIT */
|
struct gl_client_array *SecondaryColorPtr[2];/* VERT_COLOR1_BIT */
|
||||||
GLvector1f *PointSizePtr; /* VERT_POINT_SIZE */
|
GLvector4f *PointSizePtr; /* VERT_POINT_SIZE */
|
||||||
|
GLvector4f *FogCoordPtr; /* VERT_FOG_BIT */
|
||||||
GLmaterial (*Material)[2]; /* VERT_MATERIAL, optional */
|
GLmaterial (*Material)[2]; /* VERT_MATERIAL, optional */
|
||||||
GLuint *MaterialMask; /* VERT_MATERIAL, optional */
|
GLuint *MaterialMask; /* VERT_MATERIAL, optional */
|
||||||
GLuint *Flag; /* VERT_* flags, optional */
|
GLuint *Flag; /* VERT_* flags, optional */
|
||||||
GLuint *Primitive; /* GL_(mode)|PRIM_* flags */
|
GLuint *Primitive; /* GL_(mode)|PRIM_* flags */
|
||||||
GLuint *PrimitiveLength; /* integers */
|
GLuint *PrimitiveLength; /* integers */
|
||||||
|
|
||||||
|
/* Inputs to the vertex program stage */
|
||||||
GLvector4f *AttribPtr[VERT_ATTRIB_MAX]; /* GL_NV_vertex_program */
|
GLvector4f *AttribPtr[VERT_ATTRIB_MAX]; /* GL_NV_vertex_program */
|
||||||
|
|
||||||
GLuint importable_data;
|
GLuint importable_data;
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
/* $Id: t_imm_elt.c,v 1.14 2002/01/05 20:51:13 brianp Exp $ */
|
/* $Id: t_imm_elt.c,v 1.15 2002/01/06 03:54:12 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 3.5
|
* Version: 4.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -721,6 +721,7 @@ static void _tnl_trans_elt_4f(GLfloat (*to)[4],
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
static void _tnl_trans_elt_3f(GLfloat (*to)[3],
|
static void _tnl_trans_elt_3f(GLfloat (*to)[3],
|
||||||
const struct gl_client_array *from,
|
const struct gl_client_array *from,
|
||||||
GLuint *flags,
|
GLuint *flags,
|
||||||
@@ -738,7 +739,7 @@ static void _tnl_trans_elt_3f(GLfloat (*to)[3],
|
|||||||
start,
|
start,
|
||||||
n );
|
n );
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
/* $Id: t_imm_exec.c,v 1.33 2002/01/05 20:51:13 brianp Exp $ */
|
/* $Id: t_imm_exec.c,v 1.34 2002/01/06 03:54:12 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 3.5
|
* Version: 4.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -232,7 +232,6 @@ static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM )
|
|||||||
GLuint inputs = tnl->pipeline.inputs; /* for copy-to-current */
|
GLuint inputs = tnl->pipeline.inputs; /* for copy-to-current */
|
||||||
const GLuint start = IM->CopyStart;
|
const GLuint start = IM->CopyStart;
|
||||||
const GLuint count = IM->Count - start;
|
const GLuint count = IM->Count - start;
|
||||||
GLuint i;
|
|
||||||
|
|
||||||
/* TODO: optimize the case where nothing has changed. (Just bind
|
/* TODO: optimize the case where nothing has changed. (Just bind
|
||||||
* tmp to vb).
|
* tmp to vb).
|
||||||
@@ -267,8 +266,6 @@ static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM )
|
|||||||
VB->Elts = 0;
|
VB->Elts = 0;
|
||||||
VB->MaterialMask = 0;
|
VB->MaterialMask = 0;
|
||||||
VB->Material = 0;
|
VB->Material = 0;
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
VB->AttribPtr[i] = NULL;
|
|
||||||
|
|
||||||
/* _tnl_print_vert_flags("copy-orflag", IM->CopyOrFlag); */
|
/* _tnl_print_vert_flags("copy-orflag", IM->CopyOrFlag); */
|
||||||
/* _tnl_print_vert_flags("orflag", IM->OrFlag); */
|
/* _tnl_print_vert_flags("orflag", IM->OrFlag); */
|
||||||
@@ -309,7 +306,7 @@ static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM )
|
|||||||
tmp->FogCoord.data = IM->Attrib[VERT_ATTRIB_FOG] + start;
|
tmp->FogCoord.data = IM->Attrib[VERT_ATTRIB_FOG] + start;
|
||||||
tmp->FogCoord.start = (GLfloat *) (IM->Attrib[VERT_ATTRIB_FOG] + start);
|
tmp->FogCoord.start = (GLfloat *) (IM->Attrib[VERT_ATTRIB_FOG] + start);
|
||||||
tmp->FogCoord.count = count;
|
tmp->FogCoord.count = count;
|
||||||
VB->AttribPtr[VERT_ATTRIB_FOG] = &tmp->FogCoord;
|
VB->FogCoordPtr = &tmp->FogCoord;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inputs & VERT_COLOR1_BIT) {
|
if (inputs & VERT_COLOR1_BIT) {
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: t_imm_fixup.c,v 1.31 2002/01/05 20:51:13 brianp Exp $ */
|
/* $Id: t_imm_fixup.c,v 1.32 2002/01/06 03:54:12 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
@@ -145,6 +145,7 @@ fixup_first_4f( GLfloat data[][4], GLuint flag[], GLuint match,
|
|||||||
COPY_4FV(data[i], dflt);
|
COPY_4FV(data[i], dflt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static void
|
static void
|
||||||
fixup_first_3f( GLfloat data[][3], GLuint flag[], GLuint match,
|
fixup_first_3f( GLfloat data[][3], GLuint flag[], GLuint match,
|
||||||
GLuint start, GLfloat *dflt )
|
GLuint start, GLfloat *dflt )
|
||||||
@@ -158,7 +159,7 @@ fixup_first_3f( GLfloat data[][3], GLuint flag[], GLuint match,
|
|||||||
while ((flag[++i]&match) == 0)
|
while ((flag[++i]&match) == 0)
|
||||||
COPY_3FV(data[i], dflt);
|
COPY_3FV(data[i], dflt);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fixup_first_1ui( GLuint data[], GLuint flag[], GLuint match,
|
fixup_first_1ui( GLuint data[], GLuint flag[], GLuint match,
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
/* $Id: t_vb_fog.c,v 1.15 2002/01/05 20:51:13 brianp Exp $ */
|
/* $Id: t_vb_fog.c,v 1.16 2002/01/06 03:54:12 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 3.5
|
* Version: 4.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -142,7 +142,7 @@ static GLboolean run_fog_stage( GLcontext *ctx,
|
|||||||
/* fog computed from Z depth */
|
/* fog computed from Z depth */
|
||||||
/* source = VB->ObjPtr or VB->EyePtr coords */
|
/* source = VB->ObjPtr or VB->EyePtr coords */
|
||||||
/* dest = VB->FogCoordPtr = fog stage private storage */
|
/* dest = VB->FogCoordPtr = fog stage private storage */
|
||||||
VB->AttribPtr[VERT_ATTRIB_FOG] = &store->fogcoord;
|
VB->FogCoordPtr = &store->fogcoord;
|
||||||
|
|
||||||
if (!ctx->_NeedEyeCoords) {
|
if (!ctx->_NeedEyeCoords) {
|
||||||
const GLfloat *m = ctx->ModelviewMatrixStack.Top->m;
|
const GLfloat *m = ctx->ModelviewMatrixStack.Top->m;
|
||||||
@@ -181,12 +181,12 @@ static GLboolean run_fog_stage( GLcontext *ctx,
|
|||||||
else {
|
else {
|
||||||
/* use glFogCoord() coordinates */
|
/* use glFogCoord() coordinates */
|
||||||
/* source = VB->FogCoordPtr */
|
/* source = VB->FogCoordPtr */
|
||||||
input = VB->AttribPtr[VERT_ATTRIB_FOG];
|
input = VB->FogCoordPtr;
|
||||||
/* dest = fog stage private storage */
|
/* dest = fog stage private storage */
|
||||||
VB->AttribPtr[VERT_ATTRIB_FOG] = &store->fogcoord;
|
VB->FogCoordPtr = &store->fogcoord;
|
||||||
}
|
}
|
||||||
|
|
||||||
make_win_fog_coords( ctx, VB->AttribPtr[VERT_ATTRIB_FOG], input );
|
make_win_fog_coords( ctx, VB->FogCoordPtr, input );
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
/* $Id: t_vb_points.c,v 1.5 2001/12/14 02:51:45 brianp Exp $ */
|
/* $Id: t_vb_points.c,v 1.6 2002/01/06 03:54:12 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 3.5
|
* Version: 4.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
|
|
||||||
struct point_stage_data {
|
struct point_stage_data {
|
||||||
GLvector1f PointSize;
|
GLvector4f PointSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define POINT_STAGE_DATA(stage) ((struct point_stage_data *)stage->privatePtr)
|
#define POINT_STAGE_DATA(stage) ((struct point_stage_data *)stage->privatePtr)
|
||||||
@@ -53,7 +53,7 @@ static GLboolean run_point_stage( GLcontext *ctx,
|
|||||||
const GLfloat p1 = ctx->Point.Params[1];
|
const GLfloat p1 = ctx->Point.Params[1];
|
||||||
const GLfloat p2 = ctx->Point.Params[2];
|
const GLfloat p2 = ctx->Point.Params[2];
|
||||||
const GLfloat pointSize = ctx->Point._Size;
|
const GLfloat pointSize = ctx->Point._Size;
|
||||||
GLfloat *size = store->PointSize.data;
|
GLfloat (*size)[4] = store->PointSize.data;
|
||||||
GLuint i;
|
GLuint i;
|
||||||
|
|
||||||
if (stage->changed_inputs) {
|
if (stage->changed_inputs) {
|
||||||
@@ -61,7 +61,7 @@ static GLboolean run_point_stage( GLcontext *ctx,
|
|||||||
for (i = 0; i < VB->Count; i++) {
|
for (i = 0; i < VB->Count; i++) {
|
||||||
const GLfloat dist = -eye[i][2];
|
const GLfloat dist = -eye[i][2];
|
||||||
/* GLfloat dist = GL_SQRT(pos[0]*pos[0]+pos[1]*pos[1]+pos[2]*pos[2]);*/
|
/* GLfloat dist = GL_SQRT(pos[0]*pos[0]+pos[1]*pos[1]+pos[2]*pos[2]);*/
|
||||||
size[i] = pointSize / (p0 + dist * (p1 + dist * p2));
|
size[i][0] = pointSize / (p0 + dist * (p1 + dist * p2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ static GLboolean alloc_point_data( GLcontext *ctx,
|
|||||||
if (!store)
|
if (!store)
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
|
|
||||||
_mesa_vector1f_alloc( &store->PointSize, 0, VB->Size, 32 );
|
_mesa_vector4f_alloc( &store->PointSize, 0, VB->Size, 32 );
|
||||||
|
|
||||||
/* Now run the stage.
|
/* Now run the stage.
|
||||||
*/
|
*/
|
||||||
@@ -102,7 +102,7 @@ static void free_point_data( struct gl_pipeline_stage *stage )
|
|||||||
{
|
{
|
||||||
struct point_stage_data *store = POINT_STAGE_DATA(stage);
|
struct point_stage_data *store = POINT_STAGE_DATA(stage);
|
||||||
if (store) {
|
if (store) {
|
||||||
_mesa_vector1f_free( &store->PointSize );
|
_mesa_vector4f_free( &store->PointSize );
|
||||||
FREE( store );
|
FREE( store );
|
||||||
stage->privatePtr = 0;
|
stage->privatePtr = 0;
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/* $Id: t_vb_program.c,v 1.6 2002/01/05 20:51:13 brianp Exp $ */
|
/* $Id: t_vb_program.c,v 1.7 2002/01/06 03:54:12 brianp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
@@ -98,16 +98,36 @@
|
|||||||
#include "t_imm_exec.h"
|
#include "t_imm_exec.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* WARNING: these values _MUST_ match the values in the OutputRegisters[]
|
||||||
|
* array in vpparse.c!!!
|
||||||
|
*/
|
||||||
|
#define VERT_RESULT_HPOS 0
|
||||||
|
#define VERT_RESULT_COL0 1
|
||||||
|
#define VERT_RESULT_COL1 2
|
||||||
|
#define VERT_RESULT_BFC0 3
|
||||||
|
#define VERT_RESULT_BFC1 4
|
||||||
|
#define VERT_RESULT_FOGC 5
|
||||||
|
#define VERT_RESULT_PSIZ 6
|
||||||
|
#define VERT_RESULT_TEX0 7
|
||||||
|
#define VERT_RESULT_TEX1 8
|
||||||
|
#define VERT_RESULT_TEX2 9
|
||||||
|
#define VERT_RESULT_TEX3 10
|
||||||
|
#define VERT_RESULT_TEX4 11
|
||||||
|
#define VERT_RESULT_TEX5 12
|
||||||
|
#define VERT_RESULT_TEX6 13
|
||||||
|
#define VERT_RESULT_TEX7 14
|
||||||
|
|
||||||
|
|
||||||
struct vp_stage_data {
|
struct vp_stage_data {
|
||||||
GLvector4f clipCoords; /* post-modelview/projection coords */
|
/* The results of running the vertex program go into these arrays. */
|
||||||
GLvector4f ndcCoords; /* normalized device coords */
|
GLvector4f attribs[15];
|
||||||
|
|
||||||
|
/* These point to the attribs[VERT_RESULT_COL0, COL1, BFC0, BFC1] arrays */
|
||||||
struct gl_client_array color0[2]; /* front and back */
|
struct gl_client_array color0[2]; /* front and back */
|
||||||
struct gl_client_array color1[2]; /* front and back */
|
struct gl_client_array color1[2]; /* front and back */
|
||||||
GLvector4f texCoord[MAX_TEXTURE_UNITS];
|
|
||||||
GLvector4f fogCoord;
|
GLvector4f ndcCoords; /* normalized device coords */
|
||||||
GLvector1f pointSize;
|
GLubyte *clipmask; /* clip flags */
|
||||||
GLubyte *clipmask;
|
|
||||||
GLubyte ormask, andmask;
|
GLubyte ormask, andmask;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -123,21 +143,8 @@ static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
|
|||||||
struct vp_machine *machine = &(ctx->VertexProgram.Machine);
|
struct vp_machine *machine = &(ctx->VertexProgram.Machine);
|
||||||
GLint i;
|
GLint i;
|
||||||
|
|
||||||
/* convenience pointers */
|
|
||||||
GLfloat (*clip)[4] = (GLfloat (*)[4]) store->clipCoords.data;
|
|
||||||
GLfloat (*color0)[4] = (GLfloat (*)[4]) store->color0[0].Ptr;
|
|
||||||
GLfloat (*color1)[4] = (GLfloat (*)[4]) store->color1[0].Ptr;
|
|
||||||
GLfloat (*bfcolor0)[4] = (GLfloat (*)[4]) store->color0[1].Ptr;
|
|
||||||
GLfloat (*bfcolor1)[4] = (GLfloat (*)[4]) store->color1[1].Ptr;
|
|
||||||
GLfloat (*fog)[4] = (GLfloat (*)[4]) store->fogCoord.data;
|
|
||||||
GLfloat *pointSize = (GLfloat *) store->pointSize.data;
|
|
||||||
GLfloat (*texture0)[4] = (GLfloat (*)[4]) store->texCoord[0].data;
|
|
||||||
GLfloat (*texture1)[4] = (GLfloat (*)[4]) store->texCoord[1].data;
|
|
||||||
GLfloat (*texture2)[4] = (GLfloat (*)[4]) store->texCoord[2].data;
|
|
||||||
GLfloat (*texture3)[4] = (GLfloat (*)[4]) store->texCoord[3].data;
|
|
||||||
|
|
||||||
_mesa_init_tracked_matrices(ctx);
|
_mesa_init_tracked_matrices(ctx);
|
||||||
_mesa_init_vp_registers(ctx); /* sets temp regs to (0,0,0,1) */
|
_mesa_init_vp_registers(ctx); /* init temp and result regs */
|
||||||
|
|
||||||
for (i = 0; i < VB->Count; i++) {
|
for (i = 0; i < VB->Count; i++) {
|
||||||
GLuint attr;
|
GLuint attr;
|
||||||
@@ -185,33 +192,28 @@ static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
|
|||||||
machine->Registers[VP_OUT_COL0][3]);
|
machine->Registers[VP_OUT_COL0][3]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* store the attribute output registers into the VB arrays */
|
/* copy the output registers into the VB->attribs arrays */
|
||||||
COPY_4V(clip[i], machine->Registers[VP_OUT_HPOS]);
|
/* XXX (optimize) could use a conditional and smaller loop limit here */
|
||||||
COPY_4V(color0[i], machine->Registers[VP_OUT_COL0]);
|
for (attr = 0; attr < 15; attr++) {
|
||||||
COPY_4V(color1[i], machine->Registers[VP_OUT_COL1]);
|
COPY_4V( store->attribs[attr].data[i],
|
||||||
COPY_4V(bfcolor0[i], machine->Registers[VP_OUT_BFC0]);
|
machine->Registers[VP_OUTPUT_REG_START + attr] );
|
||||||
COPY_4V(bfcolor1[i], machine->Registers[VP_OUT_BFC1]);
|
}
|
||||||
fog[i][0] = machine->Registers[VP_OUT_FOGC][0];
|
|
||||||
pointSize[i] = machine->Registers[VP_OUT_PSIZ][0];
|
|
||||||
COPY_4V(texture0[i], machine->Registers[VP_OUT_TEX0]);
|
|
||||||
COPY_4V(texture1[i], machine->Registers[VP_OUT_TEX0]);
|
|
||||||
COPY_4V(texture2[i], machine->Registers[VP_OUT_TEX0]);
|
|
||||||
COPY_4V(texture3[i], machine->Registers[VP_OUT_TEX0]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VB->ClipPtr = &store->clipCoords;
|
/* Setup the VB pointers so that the next pipeline stages get
|
||||||
|
* their data from the right place (the program output arrays).
|
||||||
|
*/
|
||||||
|
VB->ClipPtr = &store->attribs[VERT_RESULT_HPOS];
|
||||||
VB->ClipPtr->size = 4;
|
VB->ClipPtr->size = 4;
|
||||||
VB->ClipPtr->count = VB->Count;
|
VB->ClipPtr->count = VB->Count;
|
||||||
VB->ColorPtr[0] = &store->color0[0];
|
VB->ColorPtr[0] = &store->color0[0];
|
||||||
VB->ColorPtr[1] = &store->color0[1];
|
VB->ColorPtr[1] = &store->color0[1];
|
||||||
VB->SecondaryColorPtr[0] = &store->color1[0];
|
VB->SecondaryColorPtr[0] = &store->color1[0];
|
||||||
VB->SecondaryColorPtr[1] = &store->color1[1];
|
VB->SecondaryColorPtr[1] = &store->color1[1];
|
||||||
VB->AttribPtr[VERT_ATTRIB_FOG] = &store->fogCoord;
|
VB->FogCoordPtr = &store->attribs[VERT_RESULT_FOGC];
|
||||||
VB->PointSizePtr = &store->pointSize;
|
VB->PointSizePtr = &store->attribs[VERT_RESULT_PSIZ];
|
||||||
VB->TexCoordPtr[0] = &store->texCoord[0];
|
for (i = 0; i < ctx->Const.MaxTextureUnits; i++)
|
||||||
VB->TexCoordPtr[1] = &store->texCoord[1];
|
VB->TexCoordPtr[i] = &store->attribs[VERT_RESULT_TEX0 + i];
|
||||||
VB->TexCoordPtr[2] = &store->texCoord[2];
|
|
||||||
VB->TexCoordPtr[3] = &store->texCoord[3];
|
|
||||||
|
|
||||||
/* Cliptest and perspective divide. Clip functions must clear
|
/* Cliptest and perspective divide. Clip functions must clear
|
||||||
* the clipmask.
|
* the clipmask.
|
||||||
@@ -304,23 +306,9 @@ static GLboolean run_validate_program( GLcontext *ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void init_client_array( struct gl_client_array *a, GLvector4f *vec )
|
||||||
#if 0
|
|
||||||
static void alloc_4chan( struct gl_client_array *a, GLuint sz )
|
|
||||||
{
|
{
|
||||||
a->Ptr = ALIGN_MALLOC( sz * sizeof(GLchan) * 4, 32 );
|
a->Ptr = vec->data;
|
||||||
a->Size = 4;
|
|
||||||
a->Type = CHAN_TYPE;
|
|
||||||
a->Stride = 0;
|
|
||||||
a->StrideB = sizeof(GLchan) * 4;
|
|
||||||
a->Enabled = 0;
|
|
||||||
a->Flags = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void alloc_4float( struct gl_client_array *a, GLuint sz )
|
|
||||||
{
|
|
||||||
a->Ptr = ALIGN_MALLOC( sz * sizeof(GLfloat) * 4, 32 );
|
|
||||||
a->Size = 4;
|
a->Size = 4;
|
||||||
a->Type = GL_FLOAT;
|
a->Type = GL_FLOAT;
|
||||||
a->Stride = 0;
|
a->Stride = 0;
|
||||||
@@ -347,19 +335,19 @@ static GLboolean run_init_vp( GLcontext *ctx,
|
|||||||
if (!store)
|
if (!store)
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
|
|
||||||
/* The output of a vertex program is: */
|
/* Allocate arrays of vertex output values */
|
||||||
_mesa_vector4f_alloc( &store->clipCoords, 0, size, 32 );
|
for (i = 0; i < 15; i++)
|
||||||
_mesa_vector4f_alloc( &store->ndcCoords, 0, size, 32 );
|
_mesa_vector4f_alloc( &store->attribs[i], 0, size, 32 );
|
||||||
alloc_4float( &store->color0[0], size );
|
|
||||||
alloc_4float( &store->color0[1], size );
|
|
||||||
alloc_4float( &store->color1[0], size );
|
|
||||||
alloc_4float( &store->color1[1], size );
|
|
||||||
for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++)
|
|
||||||
_mesa_vector4f_alloc( &store->texCoord[i], 0, VB->Size, 32 );
|
|
||||||
_mesa_vector4f_alloc( &store->fogCoord, 0, size, 32 );
|
|
||||||
_mesa_vector1f_alloc( &store->pointSize, 0, size, 32 );
|
|
||||||
store->clipmask = (GLubyte *) ALIGN_MALLOC(sizeof(GLubyte)*size, 32 );
|
|
||||||
|
|
||||||
|
/* Make the color0[] and color1[] arrays point into the attribs[] arrays */
|
||||||
|
init_client_array( &store->color0[0], &store->attribs[VERT_RESULT_COL0] );
|
||||||
|
init_client_array( &store->color0[1], &store->attribs[VERT_RESULT_COL1] );
|
||||||
|
init_client_array( &store->color1[0], &store->attribs[VERT_RESULT_BFC0] );
|
||||||
|
init_client_array( &store->color1[1], &store->attribs[VERT_RESULT_BFC1] );
|
||||||
|
|
||||||
|
/* a few other misc allocations */
|
||||||
|
_mesa_vector4f_alloc( &store->ndcCoords, 0, size, 32 );
|
||||||
|
store->clipmask = (GLubyte *) ALIGN_MALLOC(sizeof(GLubyte)*size, 32 );
|
||||||
|
|
||||||
/* Now validate the stage derived data...
|
/* Now validate the stage derived data...
|
||||||
*/
|
*/
|
||||||
@@ -401,17 +389,13 @@ static void dtr( struct gl_pipeline_stage *stage )
|
|||||||
|
|
||||||
if (store) {
|
if (store) {
|
||||||
GLuint i;
|
GLuint i;
|
||||||
_mesa_vector4f_free( &store->clipCoords );
|
|
||||||
|
/* free the vertex program result arrays */
|
||||||
|
for (i = 0; i < 15; i++)
|
||||||
|
_mesa_vector4f_free( &store->attribs[i] );
|
||||||
|
|
||||||
|
/* free misc arrays */
|
||||||
_mesa_vector4f_free( &store->ndcCoords );
|
_mesa_vector4f_free( &store->ndcCoords );
|
||||||
ALIGN_FREE( store->color0[0].Ptr );
|
|
||||||
ALIGN_FREE( store->color0[1].Ptr );
|
|
||||||
ALIGN_FREE( store->color1[0].Ptr );
|
|
||||||
ALIGN_FREE( store->color1[1].Ptr );
|
|
||||||
for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++)
|
|
||||||
if (store->texCoord[i].data)
|
|
||||||
_mesa_vector4f_free( &store->texCoord[i] );
|
|
||||||
_mesa_vector4f_free( &store->fogCoord );
|
|
||||||
_mesa_vector1f_free( &store->pointSize );
|
|
||||||
ALIGN_FREE( store->clipmask );
|
ALIGN_FREE( store->clipmask );
|
||||||
|
|
||||||
FREE( store );
|
FREE( store );
|
||||||
|
Reference in New Issue
Block a user