From: Brian Date: Mon, 26 Feb 2007 00:29:00 +0000 (-0700) Subject: Optimize the loop for copying output results. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e71a33bbf87649150bc748b85ca7213af7c737f4;p=mesa.git Optimize the loop for copying output results. --- diff --git a/src/mesa/tnl/t_vb_program.c b/src/mesa/tnl/t_vb_program.c index 82e007a3ac1..4ea134a97e0 100644 --- a/src/mesa/tnl/t_vb_program.c +++ b/src/mesa/tnl/t_vb_program.c @@ -196,7 +196,8 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage ) struct vertex_buffer *VB = &tnl->vb; struct gl_vertex_program *program = ctx->VertexProgram._Current; struct gl_program_machine machine; - GLuint i; + GLuint outputs[VERT_RESULT_MAX], numOutputs; + GLuint i, j; #define FORCE_PROG_EXECUTE_C 1 #if FORCE_PROG_EXECUTE_C @@ -214,6 +215,13 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage ) _mesa_load_state_parameters(ctx, program->Base.Parameters); } + numOutputs = 0; + for (i = 0; i < VERT_RESULT_MAX; i++) { + if (program->Base.OutputsWritten & (1 << i)) { + outputs[numOutputs++] = i; + } + } + for (i = 0; i < VB->Count; i++) { GLuint attr; @@ -264,10 +272,9 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage ) } /* copy the output registers into the VB->attribs arrays */ - for (attr = 0; attr < VERT_RESULT_MAX; attr++) { - if (program->Base.OutputsWritten & (1 << attr)) { - COPY_4V(store->attribs[attr].data[i], machine.Outputs[attr]); - } + for (j = 0; j < numOutputs; j++) { + const GLuint attr = outputs[j]; + COPY_4V(store->attribs[attr].data[i], machine.Outputs[attr]); } #if 0 printf("HPOS: %f %f %f %f\n",