From dbeea25bb834479a29712100888c862348112018 Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 10 May 2005 13:57:50 +0000 Subject: Double-buffer generated instructions and only notify driver when the generated program differs from the previous one. --- src/mesa/main/texenvprogram.c | 29 +++++++++++++++++++++-------- src/mesa/tnl/t_vp_build.c | 32 +++++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/mesa/main/texenvprogram.c b/src/mesa/main/texenvprogram.c index 77879de8ac..eb7842cdf1 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 22dc595abb..04af02e491 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<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); } -- cgit v1.2.3