Double-buffer generated instructions and only notify driver when the
generated program differs from the previous one.
This commit is contained in:
@@ -687,6 +687,8 @@ void _mesa_UpdateTexEnvProgram( GLcontext *ctx )
|
|||||||
struct texenv_fragment_program p;
|
struct texenv_fragment_program p;
|
||||||
GLuint unit;
|
GLuint unit;
|
||||||
struct ureg cf, out;
|
struct ureg cf, out;
|
||||||
|
GLuint db_NumInstructions;
|
||||||
|
struct fp_instruction *db_Instructions;
|
||||||
|
|
||||||
if (ctx->FragmentProgram._Enabled)
|
if (ctx->FragmentProgram._Enabled)
|
||||||
return;
|
return;
|
||||||
@@ -699,10 +701,10 @@ void _mesa_UpdateTexEnvProgram( GLcontext *ctx )
|
|||||||
p.ctx = ctx;
|
p.ctx = ctx;
|
||||||
p.program = ctx->_TexEnvProgram;
|
p.program = ctx->_TexEnvProgram;
|
||||||
|
|
||||||
if (p.program->Instructions == NULL) {
|
db_Instructions = p.program->Instructions;
|
||||||
p.program->Instructions = MALLOC(sizeof(struct fp_instruction) * 100);
|
db_NumInstructions = p.program->Base.NumInstructions;
|
||||||
}
|
|
||||||
|
|
||||||
|
p.program->Instructions = MALLOC(sizeof(struct fp_instruction) * 100);
|
||||||
p.program->Base.NumInstructions = 0;
|
p.program->Base.NumInstructions = 0;
|
||||||
p.program->Base.Target = GL_FRAGMENT_PROGRAM_ARB;
|
p.program->Base.Target = GL_FRAGMENT_PROGRAM_ARB;
|
||||||
p.program->NumTexIndirections = 1; /* correct? */
|
p.program->NumTexIndirections = 1; /* correct? */
|
||||||
@@ -713,9 +715,12 @@ void _mesa_UpdateTexEnvProgram( GLcontext *ctx )
|
|||||||
p.program->Base.NumTemporaries =
|
p.program->Base.NumTemporaries =
|
||||||
p.program->Base.NumParameters =
|
p.program->Base.NumParameters =
|
||||||
p.program->Base.NumAttributes = p.program->Base.NumAddressRegs = 0;
|
p.program->Base.NumAttributes = p.program->Base.NumAddressRegs = 0;
|
||||||
|
|
||||||
if (p.program->Parameters)
|
if (p.program->Parameters)
|
||||||
_mesa_free_parameter_list(p.program->Parameters);
|
_mesa_free_parameters(p.program->Parameters);
|
||||||
p.program->Parameters = _mesa_new_parameter_list();
|
else
|
||||||
|
p.program->Parameters = _mesa_new_parameter_list();
|
||||||
|
|
||||||
p.program->InputsRead = 0;
|
p.program->InputsRead = 0;
|
||||||
p.program->OutputsWritten = 0;
|
p.program->OutputsWritten = 0;
|
||||||
|
|
||||||
@@ -778,10 +783,18 @@ void _mesa_UpdateTexEnvProgram( GLcontext *ctx )
|
|||||||
_mesa_printf("\n");
|
_mesa_printf("\n");
|
||||||
#endif
|
#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,
|
if (db_Instructions == NULL ||
|
||||||
p.program );
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -317,6 +317,8 @@ static void emit_op3fn(struct tnl_program *p,
|
|||||||
struct vp_instruction *inst = &p->program->Instructions[nr];
|
struct vp_instruction *inst = &p->program->Instructions[nr];
|
||||||
|
|
||||||
inst->Opcode = op;
|
inst->Opcode = op;
|
||||||
|
inst->StringPos = 0;
|
||||||
|
inst->Data = 0;
|
||||||
|
|
||||||
emit_arg( &inst->SrcReg[0], src0 );
|
emit_arg( &inst->SrcReg[0], src0 );
|
||||||
emit_arg( &inst->SrcReg[1], src1 );
|
emit_arg( &inst->SrcReg[1], src1 );
|
||||||
@@ -1094,6 +1096,8 @@ void _tnl_UpdateFixedFunctionProgram( GLcontext *ctx )
|
|||||||
{
|
{
|
||||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||||
struct tnl_program p;
|
struct tnl_program p;
|
||||||
|
GLuint db_NumInstructions;
|
||||||
|
struct vp_instruction *db_Instructions;
|
||||||
|
|
||||||
if (ctx->VertexProgram._Enabled)
|
if (ctx->VertexProgram._Enabled)
|
||||||
return;
|
return;
|
||||||
@@ -1114,9 +1118,10 @@ void _tnl_UpdateFixedFunctionProgram( GLcontext *ctx )
|
|||||||
p.temp_flag = 0;
|
p.temp_flag = 0;
|
||||||
p.temp_reserved = ~((1<<MAX_NV_VERTEX_PROGRAM_TEMPS)-1);
|
p.temp_reserved = ~((1<<MAX_NV_VERTEX_PROGRAM_TEMPS)-1);
|
||||||
|
|
||||||
if (p.program->Instructions == NULL) {
|
db_Instructions = p.program->Instructions;
|
||||||
p.program->Instructions = MALLOC(sizeof(struct vp_instruction) * 100);
|
db_NumInstructions = p.program->Base.NumInstructions;
|
||||||
}
|
|
||||||
|
p.program->Instructions = MALLOC(sizeof(struct vp_instruction) * 100);
|
||||||
|
|
||||||
/* Initialize the arb_program struct */
|
/* Initialize the arb_program struct */
|
||||||
p.program->Base.String = 0;
|
p.program->Base.String = 0;
|
||||||
@@ -1124,9 +1129,12 @@ void _tnl_UpdateFixedFunctionProgram( GLcontext *ctx )
|
|||||||
p.program->Base.NumTemporaries =
|
p.program->Base.NumTemporaries =
|
||||||
p.program->Base.NumParameters =
|
p.program->Base.NumParameters =
|
||||||
p.program->Base.NumAttributes = p.program->Base.NumAddressRegs = 0;
|
p.program->Base.NumAttributes = p.program->Base.NumAddressRegs = 0;
|
||||||
|
|
||||||
if (p.program->Parameters)
|
if (p.program->Parameters)
|
||||||
_mesa_free_parameter_list(p.program->Parameters);
|
_mesa_free_parameters(p.program->Parameters);
|
||||||
p.program->Parameters = _mesa_new_parameter_list();
|
else
|
||||||
|
p.program->Parameters = _mesa_new_parameter_list();
|
||||||
|
|
||||||
p.program->InputsRead = 0;
|
p.program->InputsRead = 0;
|
||||||
p.program->OutputsWritten = 0;
|
p.program->OutputsWritten = 0;
|
||||||
|
|
||||||
@@ -1167,4 +1175,18 @@ void _tnl_UpdateFixedFunctionProgram( GLcontext *ctx )
|
|||||||
if (DISASSEM) {
|
if (DISASSEM) {
|
||||||
_mesa_printf ("\n");
|
_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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user