summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Whitwell <[email protected]>2005-05-10 13:57:50 +0000
committerKeith Whitwell <[email protected]>2005-05-10 13:57:50 +0000
commitdbeea25bb834479a29712100888c862348112018 (patch)
treed232684123377493b1cb2ed788fb1238788439c9
parentf29f2fc29464780eea6d877569cd5b7032266b88 (diff)
Double-buffer generated instructions and only notify driver when the
generated program differs from the previous one.
-rw-r--r--src/mesa/main/texenvprogram.c29
-rw-r--r--src/mesa/tnl/t_vp_build.c32
2 files changed, 48 insertions, 13 deletions
diff --git a/src/mesa/main/texenvprogram.c b/src/mesa/main/texenvprogram.c
index 77879de8acb..eb7842cdf1c 100644
--- a/src/mesa/main/texenvprogram.c
+++ b/src/mesa/main/texenvprogram.c
@@ -687,6 +687,8 @@ void _mesa_UpdateTexEnvProgram( GLcontext *ctx )
struct texenv_fragment_program p;
GLuint unit;
struct ureg cf, out;
+ GLuint db_NumInstructions;
+ struct fp_instruction *db_Instructions;
if (ctx->FragmentProgram._Enabled)
return;
@@ -699,10 +701,10 @@ void _mesa_UpdateTexEnvProgram( GLcontext *ctx )
p.ctx = ctx;
p.program = ctx->_TexEnvProgram;
- if (p.program->Instructions == NULL) {
- p.program->Instructions = MALLOC(sizeof(struct fp_instruction) * 100);
- }
+ db_Instructions = p.program->Instructions;
+ db_NumInstructions = p.program->Base.NumInstructions;
+ p.program->Instructions = MALLOC(sizeof(struct fp_instruction) * 100);
p.program->Base.NumInstructions = 0;
p.program->Base.Target = GL_FRAGMENT_PROGRAM_ARB;
p.program->NumTexIndirections = 1; /* correct? */
@@ -713,9 +715,12 @@ void _mesa_UpdateTexEnvProgram( GLcontext *ctx )
p.program->Base.NumTemporaries =
p.program->Base.NumParameters =
p.program->Base.NumAttributes = p.program->Base.NumAddressRegs = 0;
+
if (p.program->Parameters)
- _mesa_free_parameter_list(p.program->Parameters);
- p.program->Parameters = _mesa_new_parameter_list();
+ _mesa_free_parameters(p.program->Parameters);
+ else
+ p.program->Parameters = _mesa_new_parameter_list();
+
p.program->InputsRead = 0;
p.program->OutputsWritten = 0;
@@ -778,10 +783,18 @@ void _mesa_UpdateTexEnvProgram( GLcontext *ctx )
_mesa_printf("\n");
#endif
- /* Notify driver the fragment program has (potentially) changed.
+ /* Notify driver the fragment program has (actually) changed.
*/
- ctx->Driver.ProgramStringNotify( ctx, GL_FRAGMENT_PROGRAM_ARB,
- p.program );
+ if (db_Instructions == NULL ||
+ db_NumInstructions != p.program->Base.NumInstructions ||
+ memcmp(db_Instructions, p.program->Instructions,
+ db_NumInstructions * sizeof(*db_Instructions)) != 0) {
+ _mesa_printf("new program string\n");
+ ctx->Driver.ProgramStringNotify( ctx, GL_FRAGMENT_PROGRAM_ARB,
+ &p.program->Base );
+ }
+
+ FREE(db_Instructions);
}
diff --git a/src/mesa/tnl/t_vp_build.c b/src/mesa/tnl/t_vp_build.c
index 22dc595abb8..04af02e4917 100644
--- a/src/mesa/tnl/t_vp_build.c
+++ b/src/mesa/tnl/t_vp_build.c
@@ -317,6 +317,8 @@ static void emit_op3fn(struct tnl_program *p,
struct vp_instruction *inst = &p->program->Instructions[nr];
inst->Opcode = op;
+ inst->StringPos = 0;
+ inst->Data = 0;
emit_arg( &inst->SrcReg[0], src0 );
emit_arg( &inst->SrcReg[1], src1 );
@@ -1094,6 +1096,8 @@ void _tnl_UpdateFixedFunctionProgram( GLcontext *ctx )
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
struct tnl_program p;
+ GLuint db_NumInstructions;
+ struct vp_instruction *db_Instructions;
if (ctx->VertexProgram._Enabled)
return;
@@ -1114,9 +1118,10 @@ void _tnl_UpdateFixedFunctionProgram( GLcontext *ctx )
p.temp_flag = 0;
p.temp_reserved = ~((1<<MAX_NV_VERTEX_PROGRAM_TEMPS)-1);
- if (p.program->Instructions == NULL) {
- p.program->Instructions = MALLOC(sizeof(struct vp_instruction) * 100);
- }
+ db_Instructions = p.program->Instructions;
+ db_NumInstructions = p.program->Base.NumInstructions;
+
+ p.program->Instructions = MALLOC(sizeof(struct vp_instruction) * 100);
/* Initialize the arb_program struct */
p.program->Base.String = 0;
@@ -1124,9 +1129,12 @@ void _tnl_UpdateFixedFunctionProgram( GLcontext *ctx )
p.program->Base.NumTemporaries =
p.program->Base.NumParameters =
p.program->Base.NumAttributes = p.program->Base.NumAddressRegs = 0;
+
if (p.program->Parameters)
- _mesa_free_parameter_list(p.program->Parameters);
- p.program->Parameters = _mesa_new_parameter_list();
+ _mesa_free_parameters(p.program->Parameters);
+ else
+ p.program->Parameters = _mesa_new_parameter_list();
+
p.program->InputsRead = 0;
p.program->OutputsWritten = 0;
@@ -1167,4 +1175,18 @@ void _tnl_UpdateFixedFunctionProgram( GLcontext *ctx )
if (DISASSEM) {
_mesa_printf ("\n");
}
+
+
+ /* Notify driver the fragment program has (actually) changed.
+ */
+ if (db_Instructions == NULL ||
+ db_NumInstructions != p.program->Base.NumInstructions ||
+ memcmp(db_Instructions, p.program->Instructions,
+ db_NumInstructions * sizeof(*db_Instructions)) != 0) {
+ _mesa_printf("new program string\n");
+ ctx->Driver.ProgramStringNotify( ctx, GL_VERTEX_PROGRAM_ARB,
+ &p.program->Base );
+ }
+
+ FREE(db_Instructions);
}