stage. (Materials now treated more like colors, etc.). Continue whipping the dd templates into shape. Remove old NormalLength code; may come back as a driver helper, but not useful for, eg. hardware t&l drivers.tags/mesa_3_5
@@ -1,4 +1,4 @@ | |||
/* $Id: dd.h,v 1.51 2001/02/06 21:42:48 brianp Exp $ */ | |||
/* $Id: dd.h,v 1.52 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -815,6 +815,15 @@ struct dd_function_table { | |||
void (*EdgeFlagPointer)(GLcontext *ctx, GLsizei stride, const GLvoid *ptr); | |||
/*** | |||
*** TNL Pipeline | |||
***/ | |||
void (*PipelineStart)(GLcontext *ctx); | |||
void (*PipelineFinish)(GLcontext *ctx); | |||
/* Called before and after all pipeline stages. | |||
* These are a suitable place for grabbing/releasing hardware locks. | |||
*/ | |||
/*** | |||
*** Rendering |
@@ -1,4 +1,4 @@ | |||
/* $Id: light.c,v 1.36 2001/02/13 23:55:30 brianp Exp $ */ | |||
/* $Id: light.c,v 1.37 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -535,6 +535,54 @@ GLuint gl_material_bitmask( GLcontext *ctx, GLenum face, GLenum pname, | |||
} | |||
/* Perform a straight copy between pairs of materials. | |||
*/ | |||
void gl_copy_material_pairs( struct gl_material dst[2], | |||
const struct gl_material src[2], | |||
GLuint bitmask ) | |||
{ | |||
if (bitmask & FRONT_EMISSION_BIT) { | |||
COPY_4FV( dst[0].Emission, src[0].Emission ); | |||
} | |||
if (bitmask & BACK_EMISSION_BIT) { | |||
COPY_4FV( dst[1].Emission, src[1].Emission ); | |||
} | |||
if (bitmask & FRONT_AMBIENT_BIT) { | |||
COPY_4FV( dst[0].Ambient, src[0].Ambient ); | |||
} | |||
if (bitmask & BACK_AMBIENT_BIT) { | |||
COPY_4FV( dst[1].Ambient, src[1].Ambient ); | |||
} | |||
if (bitmask & FRONT_DIFFUSE_BIT) { | |||
COPY_4FV( dst[0].Diffuse, src[0].Diffuse ); | |||
} | |||
if (bitmask & BACK_DIFFUSE_BIT) { | |||
COPY_4FV( dst[1].Diffuse, src[1].Diffuse ); | |||
} | |||
if (bitmask & FRONT_SPECULAR_BIT) { | |||
COPY_4FV( dst[0].Specular, src[0].Specular ); | |||
} | |||
if (bitmask & BACK_SPECULAR_BIT) { | |||
COPY_4FV( dst[1].Specular, src[1].Specular ); | |||
} | |||
if (bitmask & FRONT_SHININESS_BIT) { | |||
dst[0].Shininess = src[0].Shininess; | |||
} | |||
if (bitmask & BACK_SHININESS_BIT) { | |||
dst[1].Shininess = src[1].Shininess; | |||
} | |||
if (bitmask & FRONT_INDEXES_BIT) { | |||
dst[0].AmbientIndex = src[0].AmbientIndex; | |||
dst[0].DiffuseIndex = src[0].DiffuseIndex; | |||
dst[0].SpecularIndex = src[0].SpecularIndex; | |||
} | |||
if (bitmask & BACK_INDEXES_BIT) { | |||
dst[1].AmbientIndex = src[1].AmbientIndex; | |||
dst[1].DiffuseIndex = src[1].DiffuseIndex; | |||
dst[1].SpecularIndex = src[1].SpecularIndex; | |||
} | |||
} | |||
/* | |||
* Check if the global material has to be updated with info that was | |||
@@ -545,11 +593,7 @@ GLuint gl_material_bitmask( GLcontext *ctx, GLenum face, GLenum pname, | |||
* | |||
* src[0] is front material, src[1] is back material | |||
* | |||
* KW: Added code here to keep the precomputed variables uptodate. | |||
* This means we can use the faster shade functions when using | |||
* GL_COLOR_MATERIAL, and we can also now use the precomputed | |||
* values in the slower shading functions, which further offsets | |||
* the cost of doing this here. | |||
* Additionally keeps the precomputed lighting state uptodate. | |||
*/ | |||
void gl_update_material( GLcontext *ctx, | |||
const struct gl_material src[2], | |||
@@ -610,9 +654,6 @@ void gl_update_material( GLcontext *ctx, | |||
if (bitmask & FRONT_DIFFUSE_BIT) { | |||
struct gl_material *mat = &ctx->Light.Material[0]; | |||
COPY_4FV( mat->Diffuse, src[0].Diffuse ); | |||
/* fprintf(stderr, "FRONT_DIFFUSE %f %f %f %f\n", */ | |||
/* mat->Diffuse[0], mat->Diffuse[1], */ | |||
/* mat->Diffuse[2], mat->Diffuse[3]); */ | |||
foreach (light, list) { | |||
SCALE_3V( light->_MatDiffuse[0], light->Diffuse, mat->Diffuse ); | |||
} | |||
@@ -621,9 +662,6 @@ void gl_update_material( GLcontext *ctx, | |||
if (bitmask & BACK_DIFFUSE_BIT) { | |||
struct gl_material *mat = &ctx->Light.Material[1]; | |||
COPY_4FV( mat->Diffuse, src[1].Diffuse ); | |||
/* fprintf(stderr, "BACK_DIFFUSE %f %f %f %f\n", */ | |||
/* mat->Diffuse[0], mat->Diffuse[1], */ | |||
/* mat->Diffuse[2], mat->Diffuse[3]); */ | |||
foreach (light, list) { | |||
SCALE_3V( light->_MatDiffuse[1], light->Diffuse, mat->Diffuse ); | |||
} | |||
@@ -647,7 +685,6 @@ void gl_update_material( GLcontext *ctx, | |||
} | |||
if (bitmask & FRONT_SHININESS_BIT) { | |||
/* fprintf(stderr, "FRONT_SHININESS_BIT %f\n", src[0].Shininess); */ | |||
ctx->Light.Material[0].Shininess = src[0].Shininess; | |||
gl_invalidate_shine_table( ctx, 0 ); | |||
} | |||
@@ -692,6 +729,9 @@ void gl_update_material( GLcontext *ctx, | |||
/* | |||
* Update the current materials from the given rgba color | |||
* according to the bitmask in ColorMaterialBitmask, which is |
@@ -1,4 +1,4 @@ | |||
/* $Id: light.h,v 1.9 2001/02/06 04:06:35 keithw Exp $ */ | |||
/* $Id: light.h,v 1.10 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -114,6 +114,10 @@ extern void gl_update_material( GLcontext *ctx, | |||
const struct gl_material src[2], | |||
GLuint bitmask ); | |||
extern void gl_copy_material_pairs( struct gl_material dst[2], | |||
const struct gl_material src[2], | |||
GLuint bitmask ); | |||
extern void gl_update_color_material( GLcontext *ctx, const GLchan rgba[4] ); | |||
@@ -1,4 +1,4 @@ | |||
/* $Id: t_array_api.c,v 1.5 2001/02/04 00:44:36 keithw Exp $ */ | |||
/* $Id: t_array_api.c,v 1.6 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -90,6 +90,79 @@ static void fallback_drawarrays( GLcontext *ctx, GLenum mode, GLint start, | |||
} | |||
static void _tnl_draw_elements( GLcontext *ctx, GLenum mode, GLsizei count, | |||
const GLuint *indices) | |||
{ | |||
#if 1 | |||
/* Optimized code that fakes the effect of calling | |||
* _tnl_array_element for each index in the list. | |||
*/ | |||
if (_tnl_hard_begin( ctx, mode )) { | |||
GLuint i,j; | |||
for (j = 0 ; j < count ; ) { | |||
struct immediate *IM = TNL_CURRENT_IM(ctx); | |||
GLuint start = IM->Start; | |||
GLuint nr = MIN2( IMM_MAXDATA - start, count - j ) + start; | |||
GLuint sf = IM->Flag[start]; | |||
IM->FlushElt |= 1; | |||
for (i = start ; i < nr ; i++) { | |||
IM->Elt[i] = (GLuint) *indices++; | |||
IM->Flag[i] = VERT_ELT; | |||
} | |||
if (j == 0) IM->Flag[start] |= sf; | |||
IM->Count = nr; | |||
j += nr - start; | |||
if (j == count) | |||
_tnl_end( ctx ); | |||
_tnl_flush_immediate( IM ); | |||
} | |||
} | |||
#else | |||
/* Simple version of the above code. | |||
*/ | |||
if (_tnl_hard_begin(ctx, mode)) { | |||
GLuint i; | |||
for (i = 0 ; i < count ; i++) | |||
_tnl_array_element( ctx, indices[i] ); | |||
_tnl_end( ctx ); | |||
} | |||
#endif | |||
} | |||
static void _tnl_draw_range_elements( GLcontext *ctx, GLenum mode, | |||
GLuint start, GLuint end, | |||
GLsizei count, const GLuint *indices ) | |||
{ | |||
TNLcontext *tnl = TNL_CONTEXT(ctx); | |||
FLUSH_CURRENT( ctx, 0 ); | |||
_tnl_vb_bind_arrays( ctx, start, end ); | |||
tnl->vb.FirstPrimitive = 0; | |||
tnl->vb.Primitive[0] = mode | PRIM_BEGIN | PRIM_END | PRIM_LAST; | |||
tnl->vb.PrimitiveLength[0] = count; | |||
tnl->vb.Elts = (GLuint *)indices; | |||
if (ctx->Array.LockCount) | |||
_tnl_run_pipeline( ctx ); | |||
else { | |||
/* Note that arrays may have changed before/after execution. | |||
*/ | |||
tnl->pipeline.run_input_changes |= ctx->Array._Enabled; | |||
_tnl_run_pipeline( ctx ); | |||
tnl->pipeline.run_input_changes |= ctx->Array._Enabled; | |||
} | |||
} | |||
void | |||
_tnl_DrawArrays(GLenum mode, GLint start, GLsizei count) | |||
@@ -162,81 +235,6 @@ _tnl_DrawArrays(GLenum mode, GLint start, GLsizei count) | |||
} | |||
static void _tnl_draw_range_elements( GLcontext *ctx, GLenum mode, | |||
GLuint start, GLuint end, | |||
GLsizei count, const GLuint *indices ) | |||
{ | |||
TNLcontext *tnl = TNL_CONTEXT(ctx); | |||
FLUSH_CURRENT( ctx, 0 ); | |||
_tnl_vb_bind_arrays( ctx, start, end ); | |||
tnl->vb.FirstPrimitive = 0; | |||
tnl->vb.Primitive[0] = mode | PRIM_BEGIN | PRIM_END | PRIM_LAST; | |||
tnl->vb.PrimitiveLength[0] = count; | |||
tnl->vb.Elts = (GLuint *)indices; | |||
if (ctx->Array.LockCount) | |||
_tnl_run_pipeline( ctx ); | |||
else { | |||
/* Note that arrays may have changed before/after execution. | |||
*/ | |||
tnl->pipeline.run_input_changes |= ctx->Array._Enabled; | |||
_tnl_run_pipeline( ctx ); | |||
tnl->pipeline.run_input_changes |= ctx->Array._Enabled; | |||
} | |||
} | |||
static void _tnl_draw_elements( GLcontext *ctx, GLenum mode, GLsizei count, | |||
const GLuint *indices) | |||
{ | |||
#if 1 | |||
/* Optimized code that fakes the effect of calling | |||
* _tnl_array_element for each index in the list. | |||
*/ | |||
if (_tnl_hard_begin( ctx, mode )) { | |||
GLuint i,j; | |||
for (j = 0 ; j < count ; ) { | |||
struct immediate *IM = TNL_CURRENT_IM(ctx); | |||
GLuint start = IM->Start; | |||
GLuint nr = MIN2( IMM_MAXDATA - start, count - j ) + start; | |||
GLuint sf = IM->Flag[start]; | |||
IM->FlushElt |= 1; | |||
for (i = start ; i < nr ; i++) { | |||
IM->Elt[i] = (GLuint) *indices++; | |||
IM->Flag[i] = VERT_ELT; | |||
} | |||
if (j == 0) IM->Flag[start] |= sf; | |||
IM->Count = nr; | |||
j += nr - start; | |||
if (j == count) | |||
_tnl_end( ctx ); | |||
_tnl_flush_immediate( IM ); | |||
} | |||
} | |||
#else | |||
/* Simple version of the above code. | |||
*/ | |||
if (_tnl_hard_begin(ctx, mode)) { | |||
GLuint i; | |||
for (i = 0 ; i < count ; i++) | |||
_tnl_array_element( ctx, indices[i] ); | |||
_tnl_end( ctx ); | |||
} | |||
#endif | |||
} | |||
void | |||
_tnl_DrawRangeElements(GLenum mode, | |||
GLuint start, GLuint end, | |||
@@ -276,6 +274,8 @@ _tnl_DrawRangeElements(GLenum mode, | |||
* May be able to get away with just setting LockCount==0, | |||
* though this raises the problems of dependent state. May | |||
* have to call glUnlockArrays() directly? | |||
* | |||
* Or scan the list and replace bad indices? | |||
*/ | |||
gl_problem( ctx, | |||
"DrawRangeElements references " | |||
@@ -283,8 +283,8 @@ _tnl_DrawRangeElements(GLenum mode, | |||
} | |||
} | |||
else if (end + 1 - start < ctx->Const.MaxArrayLockSize) { | |||
/* The arrays aren't locked but we can still fit them inside a single | |||
* vertexbuffer. | |||
/* The arrays aren't locked but we can still fit them inside a | |||
* single vertexbuffer. | |||
*/ | |||
_tnl_draw_range_elements( ctx, mode, start, end + 1, count, ui_indices ); | |||
} else { | |||
@@ -315,7 +315,6 @@ _tnl_DrawElements(GLenum mode, GLsizei count, GLenum type, | |||
ui_indices = (GLuint *)_ac_import_elements( ctx, GL_UNSIGNED_INT, | |||
count, type, indices ); | |||
#if 1 | |||
if (ctx->Array.LockCount) { | |||
_tnl_draw_range_elements( ctx, mode, | |||
ctx->Array.LockFirst, | |||
@@ -333,13 +332,10 @@ _tnl_DrawElements(GLenum mode, GLsizei count, GLenum type, | |||
if (max_elt < ctx->Const.MaxArrayLockSize && /* can we use it? */ | |||
max_elt < count) /* do we want to use it? */ | |||
_tnl_draw_range_elements( ctx, mode, 0, max_elt + 1, count, ui_indices ); | |||
_tnl_draw_range_elements( ctx, mode, 0, max_elt+1, count, ui_indices ); | |||
else | |||
_tnl_draw_elements( ctx, mode, count, ui_indices ); | |||
} | |||
#else | |||
_tnl_draw_elements( ctx, mode, count, ui_indices ); | |||
#endif | |||
} | |||
@@ -1,4 +1,4 @@ | |||
/* $Id: t_array_import.c,v 1.7 2001/01/24 00:04:59 brianp Exp $ */ | |||
/* $Id: t_array_import.c,v 1.8 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -316,6 +316,9 @@ void _tnl_vb_bind_arrays( GLcontext *ctx, GLint start, GLsizei count ) | |||
GLuint imports; | |||
struct vertex_arrays *tmp = &tnl->array_inputs; | |||
/* fprintf(stderr, "_tnl_vb_bind_arrays %d..%d // %d..%d\n", */ | |||
/* start, count, ctx->Array.LockFirst, ctx->Array.LockCount); */ | |||
if (ctx->Array.LockCount) { | |||
ASSERT(start == ctx->Array.LockFirst); | |||
ASSERT(count == ctx->Array.LockCount); |
@@ -1,4 +1,4 @@ | |||
/* $Id: t_context.h,v 1.13 2001/01/29 20:47:39 keithw Exp $ */ | |||
/* $Id: t_context.h,v 1.14 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -192,7 +192,9 @@ struct immediate | |||
*/ | |||
struct gl_material (*Material)[2]; | |||
GLuint *MaterialMask; | |||
GLfloat *NormalLengths; | |||
GLuint LastMaterial; | |||
GLuint MaterialOrMask; | |||
GLfloat (*TexCoord[MAX_TEXTURE_UNITS])[4]; | |||
GLuint Primitive[IMM_SIZE]; /* BEGIN/END */ | |||
@@ -258,7 +260,6 @@ typedef struct vertex_buffer | |||
GLubyte ClipOrMask; /* VERT_CLIP (3) */ | |||
GLubyte *ClipMask; /* VERT_CLIP (4) */ | |||
GLvector3f *NormalPtr; /* VERT_NORM */ | |||
GLfloat *NormalLengthPtr; /* VERT_NORM (optional) */ | |||
GLboolean *EdgeFlag; /* VERT_EDGE */ | |||
GLvector4f *TexCoordPtr[MAX_TEXTURE_UNITS]; /* VERT_TEX_0..n */ | |||
GLvector1ui *IndexPtr[2]; /* VERT_INDEX */ |
@@ -1,4 +1,4 @@ | |||
/* $Id: t_imm_alloc.c,v 1.2 2000/12/28 22:11:05 keithw Exp $ */ | |||
/* $Id: t_imm_alloc.c,v 1.3 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -47,7 +47,6 @@ struct immediate *_tnl_alloc_immediate( GLcontext *ctx ) | |||
IM->id = id++; | |||
IM->ref_count = 0; | |||
IM->backref = ctx; | |||
IM->NormalLengths = 0; | |||
IM->FlushElt = 0; | |||
IM->LastPrimitive = IMM_MAX_COPIED_VERTS; | |||
IM->Count = IMM_MAX_COPIED_VERTS; | |||
@@ -83,11 +82,6 @@ void _tnl_free_immediate( struct immediate *IM ) | |||
static int freed = 0; | |||
GLuint j; | |||
if (IM->NormalLengths) { | |||
FREE( IM->NormalLengths ); | |||
IM->NormalLengths = 0; | |||
} | |||
if (IM->Material) { | |||
FREE( IM->Material ); | |||
FREE( IM->MaterialMask ); |
@@ -1229,17 +1229,24 @@ _tnl_Materialfv( GLenum face, GLenum pname, const GLfloat *params ) | |||
if (bitmask == 0) | |||
return; | |||
if (!IM->Material) { | |||
IM->Material = (GLmaterial (*)[2]) MALLOC( sizeof(GLmaterial) * | |||
IMM_SIZE * 2 ); | |||
IM->MaterialMask = (GLuint *) MALLOC( sizeof(GLuint) * IMM_SIZE ); | |||
} | |||
if (!(IM->Flag[count] & VERT_MATERIAL)) { | |||
if (!IM->Material) { | |||
IM->Material = (GLmaterial (*)[2]) MALLOC( sizeof(GLmaterial) * | |||
IMM_SIZE * 2 ); | |||
IM->MaterialMask = (GLuint *) MALLOC( sizeof(GLuint) * IMM_SIZE ); | |||
} | |||
else if (IM->MaterialOrMask & ~bitmask) { | |||
gl_copy_material_pairs( IM->Material[count], | |||
IM->Material[IM->LastMaterial], | |||
IM->MaterialOrMask & ~bitmask ); | |||
} | |||
IM->Flag[count] |= VERT_MATERIAL; | |||
IM->LastMaterial = count; | |||
IM->MaterialMask[count] = 0; | |||
} | |||
IM->MaterialOrMask |= bitmask; | |||
IM->MaterialMask[count] |= bitmask; | |||
mat = IM->Material[count]; | |||
@@ -1,4 +1,4 @@ | |||
/* $Id: t_imm_dlist.c,v 1.7 2001/02/13 23:51:34 brianp Exp $ */ | |||
/* $Id: t_imm_dlist.c,v 1.8 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -57,7 +57,8 @@ typedef struct { | |||
GLuint TexSize; | |||
GLuint LastData; | |||
GLuint LastPrimitive; | |||
GLboolean have_normal_lengths; | |||
GLuint LastMaterial; | |||
GLuint MaterialOrMask; | |||
} TNLvertexcassette; | |||
static void execute_compiled_cassette( GLcontext *ctx, void *data ); | |||
@@ -121,7 +122,8 @@ _tnl_compile_cassette( GLcontext *ctx, struct immediate *IM ) | |||
node->AndFlag = im->AndFlag; | |||
node->LastData = im->LastData; | |||
node->LastPrimitive = im->LastPrimitive; | |||
node->have_normal_lengths = GL_FALSE; | |||
node->LastMaterial = im->LastMaterial; | |||
node->MaterialOrMask = im->MaterialOrMask; | |||
if (ctx->ExecuteFlag) { | |||
execute_compiled_cassette( ctx, (void *)node ); | |||
@@ -155,34 +157,6 @@ _tnl_compile_cassette( GLcontext *ctx, struct immediate *IM ) | |||
} | |||
#if 0 | |||
/* Drivers to turn this on? | |||
*/ | |||
static void calc_normal_lengths( GLfloat *dest, | |||
CONST GLfloat (*data)[3], | |||
GLuint *flags, | |||
GLuint count ) | |||
{ | |||
GLuint i; | |||
GLint tmpflag = flags[0]; | |||
flags[0] |= VERT_NORM; | |||
for (i = 0 ; i < count ; i++ ) | |||
if (flags[i] & VERT_NORM) { | |||
GLfloat tmp = (GLfloat) LEN_3FV( data[i] ); | |||
dest[i] = 0; | |||
if (tmp > 0) | |||
dest[i] = 1.0F / tmp; | |||
} else | |||
dest[i] = dest[i-1]; | |||
flags[0] = tmpflag; | |||
} | |||
#endif | |||
static void | |||
execute_compiled_cassette( GLcontext *ctx, void *data ) | |||
{ | |||
@@ -219,7 +193,7 @@ execute_compiled_cassette( GLcontext *ctx, void *data ) | |||
} | |||
if (IM->Count == IM->Start) { | |||
_tnl_run_empty_cassette( ctx, IM ); | |||
_tnl_copy_to_current( ctx, IM, IM->OrFlag ); | |||
return; | |||
} | |||
@@ -227,40 +201,16 @@ execute_compiled_cassette( GLcontext *ctx, void *data ) | |||
if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1) | |||
tnl->ReplayHardBeginEnd = 1; | |||
if (!tnl->ReplayHardBeginEnd) { | |||
/* XXX is this really an OpenGL error or an implementation problem? */ | |||
/* This is a user error. Whatever operation (like glRectf) | |||
* decomposed to this hard begin/end pair is now being run | |||
* inside a begin/end object -- illegally. Reject it and | |||
* raise an error. | |||
*/ | |||
gl_error(ctx, GL_INVALID_OPERATION, "hard replay"); | |||
return; | |||
} | |||
} | |||
/* Lazy optimization of the cassette. Need to make these switchable | |||
* or otherwise more useful for t&l cards. | |||
*/ | |||
#if 0 | |||
if (ctx->Transform.Normalize && !node->have_normal_lengths) { | |||
if (!IM->NormalLengths) | |||
IM->NormalLengths = (GLfloat *)MALLOC(sizeof(GLfloat) * IMM_SIZE); | |||
calc_normal_lengths( IM->NormalLengths + IM->Start, | |||
(const GLfloat (*)[3])(IM->Normal + IM->Start), | |||
IM->Flag + IM->Start, | |||
IM->Count - IM->Start); | |||
node->have_normal_lengths = GL_TRUE; | |||
} | |||
#endif | |||
#if 0 | |||
if (0 && im->v.Obj.size < 4 && im->Count > 15) { | |||
im->Bounds = (GLfloat (*)[3]) MALLOC(6 * sizeof(GLfloat)); | |||
(_tnl_calc_bound_tab[im->v.Obj.size])( im->Bounds, &im->v.Obj ); | |||
} | |||
#endif | |||
_tnl_fixup_compiled_cassette( ctx, IM ); | |||
_tnl_get_exec_copy_verts( ctx, IM ); | |||
_tnl_run_cassette( ctx, IM ); | |||
@@ -275,10 +225,6 @@ destroy_compiled_cassette( GLcontext *ctx, void *data ) | |||
{ | |||
TNLvertexcassette *node = (TNLvertexcassette *)data; | |||
/* fprintf(stderr, "destroy_compiled_cassette node->IM id %d ref_count: %d\n", */ | |||
/* node->IM->id, */ | |||
/* node->IM->ref_count-1); */ | |||
if ( --node->IM->ref_count == 0 ) | |||
_tnl_free_immediate( node->IM ); | |||
} | |||
@@ -301,6 +247,8 @@ print_compiled_cassette( GLcontext *ctx, void *data ) | |||
IM->AndFlag = node->AndFlag; | |||
IM->LastData = node->LastData; | |||
IM->LastPrimitive = node->LastPrimitive; | |||
IM->LastMaterial = node->LastMaterial; | |||
IM->MaterialOrMask = node->MaterialOrMask; | |||
_tnl_print_cassette( node->IM ); | |||
} | |||
@@ -359,7 +307,6 @@ _tnl_EndList( GLcontext *ctx ) | |||
tnl->ExecCopySource = IM; | |||
IM->ref_count++; | |||
SET_IMMEDIATE( ctx, IM ); | |||
IM->ref_count++; | |||
@@ -1,4 +1,4 @@ | |||
/* $Id: t_imm_exec.c,v 1.10 2001/02/06 21:42:49 brianp Exp $ */ | |||
/* $Id: t_imm_exec.c,v 1.11 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -84,8 +84,8 @@ void _tnl_reset_input( GLcontext *ctx, | |||
static void copy_to_current( GLcontext *ctx, struct immediate *IM, | |||
GLuint flag ) | |||
void _tnl_copy_to_current( GLcontext *ctx, struct immediate *IM, | |||
GLuint flag ) | |||
{ | |||
GLuint count = IM->LastData; | |||
@@ -101,8 +101,13 @@ static void copy_to_current( GLcontext *ctx, struct immediate *IM, | |||
if (flag & VERT_EDGE) | |||
ctx->Current.EdgeFlag = IM->EdgeFlag[count]; | |||
if (flag & VERT_RGBA) | |||
if (flag & VERT_RGBA) { | |||
COPY_4UBV(ctx->Current.Color, IM->Color[count]); | |||
if (ctx->Light.ColorMaterialEnabled) { | |||
gl_update_color_material( ctx, ctx->Current.Color ); | |||
gl_validate_all_lighting_tables( ctx ); | |||
} | |||
} | |||
if (flag & VERT_SPEC_RGB) | |||
COPY_4UBV(ctx->Current.SecondaryColor, IM->SecondaryColor[count]); | |||
@@ -118,6 +123,14 @@ static void copy_to_current( GLcontext *ctx, struct immediate *IM, | |||
} | |||
} | |||
} | |||
if (flag & VERT_MATERIAL) { | |||
gl_update_material( ctx, | |||
IM->Material[IM->LastMaterial], | |||
IM->MaterialOrMask ); | |||
gl_validate_all_lighting_tables( ctx ); | |||
} | |||
} | |||
@@ -142,8 +155,8 @@ void _tnl_compute_orflag( struct immediate *IM ) | |||
/* It is possible there will be data in the buffer arising from | |||
* calls like 'glNormal', 'glMaterial' that occur after the final | |||
* glVertex, glEval, etc. Additionally, a buffer can consist of | |||
* only a single glMaterial call, in which case IM->Start == | |||
* IM->Count, but the buffer is definitely not empty. | |||
* eg. a single glMaterial call, in which case IM->Start == | |||
* IM->Count, but the buffer is definitely not empty. | |||
*/ | |||
if (IM->Flag[i] & VERT_DATA) { | |||
IM->LastData++; | |||
@@ -195,7 +208,6 @@ static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM ) | |||
/* TexCoordPtr's are zeroed in loop below. | |||
*/ | |||
VB->NormalPtr = 0; | |||
VB->NormalLengthPtr = 0; | |||
VB->FogCoordPtr = 0; | |||
VB->EdgeFlag = 0; | |||
VB->IndexPtr[0] = 0; | |||
@@ -232,8 +244,6 @@ static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM ) | |||
tmp->Normal.start = (GLfloat *)(IM->Normal + start); | |||
tmp->Normal.count = count; | |||
VB->NormalPtr = &tmp->Normal; | |||
if (IM->NormalLengths) | |||
VB->NormalLengthPtr = IM->NormalLengths + start; | |||
} | |||
if (inputs & VERT_INDEX) { | |||
@@ -317,7 +327,7 @@ void _tnl_run_cassette( GLcontext *ctx, struct immediate *IM ) | |||
_tnl_run_pipeline( ctx ); | |||
tnl->pipeline.run_input_changes |= tnl->pipeline.inputs; | |||
copy_to_current( ctx, IM, IM->OrFlag ); | |||
_tnl_copy_to_current( ctx, IM, IM->OrFlag ); | |||
} | |||
@@ -347,31 +357,10 @@ static void exec_elt_cassette( GLcontext *ctx, struct immediate *IM ) | |||
*/ | |||
if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1) { | |||
_tnl_translate_array_elts( ctx, IM, IM->LastData, IM->LastData ); | |||
copy_to_current( ctx, IM, ctx->Array._Enabled ); | |||
_tnl_copy_to_current( ctx, IM, ctx->Array._Enabled ); | |||
} | |||
} | |||
/* Called for cassettes where CopyStart == Count -- no need to run the | |||
* pipeline. | |||
*/ | |||
void _tnl_run_empty_cassette( GLcontext *ctx, struct immediate *IM ) | |||
{ | |||
copy_to_current( ctx, IM, IM->OrFlag ); | |||
if (IM->OrFlag & (VERT_RGBA|VERT_MATERIAL)) { | |||
GLuint start = IM->CopyStart; | |||
if (IM->OrFlag & VERT_MATERIAL) | |||
gl_update_material( ctx, IM->Material[start], | |||
IM->MaterialMask[start] ); | |||
if (IM->OrFlag & VERT_RGBA) | |||
if (ctx->Light.ColorMaterialEnabled) | |||
gl_update_color_material( ctx, ctx->Current.Color ); | |||
gl_validate_all_lighting_tables( ctx ); | |||
} | |||
} | |||
/* Called for regular vertex cassettes. | |||
@@ -413,14 +402,11 @@ void _tnl_execute_cassette( GLcontext *ctx, struct immediate *IM ) | |||
_tnl_compute_orflag( IM ); | |||
/* _tnl_print_cassette( IM ); */ | |||
/* Mark the last primitive: | |||
*/ | |||
IM->PrimitiveLength[IM->LastPrimitive] = IM->Count - IM->LastPrimitive; | |||
ASSERT(IM->Primitive[IM->LastPrimitive] & PRIM_LAST); | |||
if (tnl->pipeline.build_state_changes) | |||
_tnl_validate_pipeline( ctx ); | |||
@@ -430,8 +416,7 @@ void _tnl_execute_cassette( GLcontext *ctx, struct immediate *IM ) | |||
if (IM->OrFlag & VERT_ELT) | |||
_tnl_translate_array_elts( ctx, IM, IM->CopyStart, IM->CopyStart ); | |||
_tnl_fixup_input( ctx, IM ); /* shouldn't be needed? (demos/fire) */ | |||
_tnl_run_empty_cassette( ctx, IM ); | |||
_tnl_copy_to_current( ctx, IM, IM->OrFlag ); | |||
} | |||
else if ((IM->OrFlag & VERT_DATA) == VERT_ELT && | |||
ctx->Array.LockCount && |
@@ -1,4 +1,4 @@ | |||
/* $Id: t_imm_exec.h,v 1.2 2000/12/27 21:49:40 keithw Exp $ */ | |||
/* $Id: t_imm_exec.h,v 1.3 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -43,7 +43,8 @@ extern void _tnl_flush_immediate( struct immediate *IM ); | |||
/* Called from imm_dlist.c and _tnl_flush_immediate: | |||
*/ | |||
extern void _tnl_run_cassette( GLcontext *ctx, struct immediate *IM ); | |||
extern void _tnl_run_empty_cassette( GLcontext *ctx, struct immediate *IM ); | |||
extern void _tnl_copy_to_current( GLcontext *ctx, struct immediate *IM, | |||
GLuint flag ); | |||
/* Initialize some stuff: | |||
*/ | |||
@@ -60,4 +61,5 @@ extern void _tnl_compute_orflag( struct immediate *IM ); | |||
extern void _tnl_execute_cassette( GLcontext *ctx, struct immediate *IM ); | |||
#endif |
@@ -1,4 +1,4 @@ | |||
/* $Id: t_imm_fixup.c,v 1.6 2001/02/13 23:51:34 brianp Exp $ */ | |||
/* $Id: t_imm_fixup.c,v 1.7 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -416,20 +416,6 @@ static void copy_vertices( GLcontext *ctx, | |||
next->CopyAndFlag &= prev->Flag[src]; /* redundant for current_im */ | |||
} | |||
/* Only needed when copying to a compiled cassette | |||
*/ | |||
if (next->NormalLengths) { | |||
for (i = 0 ; i < count ; i++) | |||
{ | |||
GLuint src = elts[i+offset]; | |||
GLuint dst = next->CopyStart+i; | |||
if (prev->NormalLengths) | |||
next->NormalLengths[dst] = prev->NormalLengths[src]; | |||
else | |||
next->NormalLengths[dst] = 1.0/LEN_3FV(prev->Normal[src]); | |||
} | |||
} | |||
ASSERT(prev == tnl->ExecCopySource); | |||
@@ -549,9 +535,6 @@ void _tnl_fixup_compiled_cassette( GLcontext *ctx, struct immediate *IM ) | |||
if (fixup & VERT_NORM) { | |||
fixup_first_3f(IM->Normal, IM->Flag, VERT_NORM, start, | |||
ctx->Current.Normal ); | |||
if (IM->NormalLengths) | |||
fixup_first_1f(IM->NormalLengths, IM->Flag, VERT_NORM, start, | |||
1.0F / (GLfloat) LEN_3FV(ctx->Current.Normal) ); | |||
} | |||
} | |||
@@ -1,4 +1,4 @@ | |||
/* $Id: t_pipeline.c,v 1.11 2001/01/29 20:47:39 keithw Exp $ */ | |||
/* $Id: t_pipeline.c,v 1.12 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -132,6 +132,8 @@ void _tnl_run_pipeline( GLcontext *ctx ) | |||
ASSERT(pipe->build_state_changes == 0); | |||
START_FAST_MATH(__tmp); | |||
if (ctx->Driver.PipelineStart) | |||
ctx->Driver.PipelineStart( ctx ); | |||
/* If something changes in the pipeline, tag all subsequent stages | |||
* using this value for recalculation. | |||
@@ -157,6 +159,9 @@ void _tnl_run_pipeline( GLcontext *ctx ) | |||
} | |||
} | |||
} | |||
if (ctx->Driver.PipelineFinish) | |||
ctx->Driver.PipelineFinish( ctx ); | |||
END_FAST_MATH(__tmp); | |||
pipe->run_state_changes = 0; |
@@ -1,4 +1,4 @@ | |||
/* $Id: t_vb_normals.c,v 1.2 2000/12/27 19:57:37 keithw Exp $ */ | |||
/* $Id: t_vb_normals.c,v 1.3 2001/02/15 01:33:52 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -61,18 +61,11 @@ static GLboolean run_normal_stage( GLcontext *ctx, | |||
ASSERT(store->NormalTransform); | |||
if (VB->NormalLengthPtr) { | |||
GLfloat diff = VB->NormalLengthPtr[0] - | |||
1.0/LEN_3FV(VB->NormalPtr->data[0]); | |||
(void)diff; | |||
ASSERT((diff*diff) < .01); | |||
} | |||
if (stage->changed_inputs) | |||
(store->NormalTransform[0])(&ctx->ModelView, | |||
ctx->_ModelViewInvScale, | |||
VB->NormalPtr, | |||
VB->NormalLengthPtr, | |||
0, | |||
0, | |||
&store->normal); | |||