Double-buffer generated instructions and only notify driver when the
authorKeith Whitwell <keith@tungstengraphics.com>
Tue, 10 May 2005 13:57:50 +0000 (13:57 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Tue, 10 May 2005 13:57:50 +0000 (13:57 +0000)
generated program differs from the previous one.

src/mesa/main/texenvprogram.c
src/mesa/tnl/t_vp_build.c

index 77879de8acb267a9f5f114e077e01af2b934d746..eb7842cdf1c5d37e1a1716648eb4013a4b91deab 100644 (file)
@@ -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);
 }
 
 
index 22dc595abb8be03e6573152dfe72aa4dc8493752..04af02e49179d63580fa1b9259f6cc1c80cd9cfb 100644 (file)
@@ -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);
 }