diff --git a/src/mesa/drivers/dri/r300/r300_vertexprog.c b/src/mesa/drivers/dri/r300/r300_vertexprog.c index 2ff92e1..5141441 100644 --- a/src/mesa/drivers/dri/r300/r300_vertexprog.c +++ b/src/mesa/drivers/dri/r300/r300_vertexprog.c @@ -1092,25 +1092,30 @@ static struct r300_vertex_program *build_program(struct r300_vertex_program_key GLint wpos_idx) { struct r300_vertex_program *vp; - + struct gl_program tempBase = mesa_vp->Base; + + tempBase.Instructions = _mesa_calloc(mesa_vp->Base.NumInstructions*sizeof(struct prog_instruction)); + + _mesa_memcpy(tempBase.Instructions, mesa_vp->Base.Instructions, mesa_vp->Base.NumInstructions*sizeof(struct prog_instruction)); + vp = _mesa_calloc(sizeof(*vp)); _mesa_memcpy(&vp->key, wanted_key, sizeof(vp->key)); vp->wpos_idx = wpos_idx; if(mesa_vp->IsPositionInvariant) { - position_invariant(&mesa_vp->Base); + position_invariant(&tempBase); } if(wpos_idx > -1) - pos_as_texcoord(vp, &mesa_vp->Base); + pos_as_texcoord(vp, &tempBase); - assert(mesa_vp->Base.NumInstructions); + assert(tempBase.NumInstructions); vp->num_temporaries=mesa_vp->Base.NumTemporaries; - r300_translate_vertex_shader(vp, mesa_vp->Base.Instructions); - + r300_translate_vertex_shader(vp, tempBase.Instructions); + _mesa_free(tempBase.Instructions); return vp; }