[Mesa-dev] [PATCH 11/25] mesa/i965/i915/r200: eliminate gl_vertex_program

Timothy Arceri timothy.arceri at collabora.com
Wed Oct 19 01:47:20 UTC 2016


On Tue, 2016-10-18 at 12:07 -0700, Ian Romanick wrote:
> I'd like to see two tiny changes:
> 
> 1. A comment for the IsPositionInvariant field that it can only be
> true
> for vertex programs.

I already had that this is only used for assembly style vertex
programs. I've reworded it to be only true for :)

> 
> 2. An assertion or two like
> 
>     assert(p->Target == GL_VERTEX_PROGRAM_ARB ||
>            !p->IsPositionInvariant);

I'm not sure how useful this is.
> 
>    in reasonable places.  I'm thinking:
> 
>    - Where it's assigned in src/mesa/program/arbprogparse.c

It assigned in mesa_parse_arb_vertex_program() and there is already an

assert(target == GL_VERTEX_PROGRAM_ARB);

> 
>    - Where it's used in src/mesa/state_tracker/st_program.c,

Again this is in st_translate_vertex_program()

so if its not a vp we already have problems.

>      src/mesa/drivers/dri/i965/brw_program.c, and

Its used inside case GL_VERTEX_PROGRAM_ARB:

I've added the assert to the top of the function but it seems kind of
pointless.

>      src/mesa/tnl/t_vb_program.c (both places).

In both of these the program always comes from ctx-
>VertexProgram._Current so it doesn't seems very useful here either.

> 
> I'd also support a follow-up patch that converts IsPositionInvariant
> from GLboolean to bool. :)
> 
> On 10/17/2016 11:12 PM, Timothy Arceri wrote:
> > 
> > Here we move the only field in gl_vertex_program to the
> > ARB program fields in gl_program.
> > ---
> >  src/mesa/drivers/common/meta.c                   | 10 +--
> >  src/mesa/drivers/common/meta.h                   |  2 +-
> >  src/mesa/drivers/dri/i915/i915_fragprog.c        |  4 +-
> >  src/mesa/drivers/dri/i965/brw_context.h          |  8 +--
> >  src/mesa/drivers/dri/i965/brw_curbe.c            |  2 +-
> >  src/mesa/drivers/dri/i965/brw_draw.c             |  4 +-
> >  src/mesa/drivers/dri/i965/brw_program.c          |  5 +-
> >  src/mesa/drivers/dri/i965/brw_vs.c               | 41 ++++++------
> >  src/mesa/drivers/dri/i965/brw_vs_surface_state.c |  2 +-
> >  src/mesa/drivers/dri/i965/gen6_vs_state.c        |  4 +-
> >  src/mesa/drivers/dri/r200/r200_context.h         |  2 +-
> >  src/mesa/drivers/dri/r200/r200_state_init.c      |  4 +-
> >  src/mesa/drivers/dri/r200/r200_tcl.c             |  2 +-
> >  src/mesa/drivers/dri/r200/r200_vertprog.c        | 82
> > ++++++++++++------------
> >  src/mesa/main/arbprogram.c                       | 19 +++---
> >  src/mesa/main/context.c                          |  8 +--
> >  src/mesa/main/ff_fragment_shader.cpp             |  2 +-
> >  src/mesa/main/ffvertex_prog.c                    | 72 ++++++++++
> > -----------
> >  src/mesa/main/ffvertex_prog.h                    |  2 +-
> >  src/mesa/main/mtypes.h                           | 17 ++---
> >  src/mesa/main/shared.c                           |  5 +-
> >  src/mesa/main/state.c                            | 26 ++++----
> >  src/mesa/main/state.h                            |  2 +-
> >  src/mesa/program/arbprogparse.c                  | 46 ++++++----
> > ---
> >  src/mesa/program/arbprogparse.h                  |  2 +-
> >  src/mesa/program/prog_statevars.c                |  8 +--
> >  src/mesa/program/program.c                       | 15 ++---
> >  src/mesa/program/program.h                       | 26 --------
> >  src/mesa/program/programopt.c                    | 42 ++++++------
> >  src/mesa/program/programopt.h                    |  2 +-
> >  src/mesa/state_tracker/st_atom.c                 |  4 +-
> >  src/mesa/state_tracker/st_atom_constbuf.c        |  2 +-
> >  src/mesa/state_tracker/st_atom_rasterizer.c      |  8 +--
> >  src/mesa/state_tracker/st_atom_sampler.c         |  2 +-
> >  src/mesa/state_tracker/st_atom_shader.c          |  4 +-
> >  src/mesa/state_tracker/st_atom_texture.c         |  2 +-
> >  src/mesa/state_tracker/st_cb_feedback.c          |  2 +-
> >  src/mesa/state_tracker/st_cb_program.c           |  2 +-
> >  src/mesa/state_tracker/st_debug.c                |  4 +-
> >  src/mesa/state_tracker/st_program.c              | 35 +++++-----
> >  src/mesa/state_tracker/st_program.h              |  4 +-
> >  src/mesa/tnl/t_context.c                         |  4 +-
> >  src/mesa/tnl/t_vb_program.c                      | 24 +++----
> >  src/mesa/tnl/t_vp_build.c                        |  4 +-
> >  src/mesa/vbo/vbo_exec_draw.c                     |  4 +-
> >  src/mesa/vbo/vbo_save_draw.c                     |  4 +-
> >  46 files changed, 264 insertions(+), 311 deletions(-)
> > 
> > diff --git a/src/mesa/drivers/common/meta.c
> > b/src/mesa/drivers/common/meta.c
> > index 890e98a..ab81eed 100644
> > --- a/src/mesa/drivers/common/meta.c
> > +++ b/src/mesa/drivers/common/meta.c
> > @@ -566,8 +566,8 @@ _mesa_meta_begin(struct gl_context *ctx,
> > GLbitfield state)
> >  
> >        if (ctx->Extensions.ARB_vertex_program) {
> >           save->VertexProgramEnabled = ctx->VertexProgram.Enabled;
> > -         _mesa_reference_vertprog(ctx, &save->VertexProgram,
> > -				  ctx->VertexProgram.Current);
> > +         _mesa_reference_program(ctx, &save->VertexProgram,
> > +				 ctx->VertexProgram.Current);
> >           _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB, GL_FALSE);
> >        }
> >  
> > @@ -945,9 +945,9 @@ _mesa_meta_end(struct gl_context *ctx)
> >        if (ctx->Extensions.ARB_vertex_program) {
> >           _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB,
> >                            save->VertexProgramEnabled);
> > -         _mesa_reference_vertprog(ctx, &ctx-
> > >VertexProgram.Current, 
> > -                                  save->VertexProgram);
> > -	 _mesa_reference_vertprog(ctx, &save->VertexProgram,
> > NULL);
> > +         _mesa_reference_program(ctx, &ctx->VertexProgram.Current,
> > +                                 save->VertexProgram);
> > +	 _mesa_reference_program(ctx, &save->VertexProgram, NULL);
> >        }
> >  
> >        if (ctx->Extensions.ARB_fragment_program) {
> > diff --git a/src/mesa/drivers/common/meta.h
> > b/src/mesa/drivers/common/meta.h
> > index ba83a6d..4d3b8ec 100644
> > --- a/src/mesa/drivers/common/meta.h
> > +++ b/src/mesa/drivers/common/meta.h
> > @@ -121,7 +121,7 @@ struct save_state
> >  
> >     /** MESA_META_SHADER */
> >     GLboolean VertexProgramEnabled;
> > -   struct gl_vertex_program *VertexProgram;
> > +   struct gl_program *VertexProgram;
> >     GLboolean FragmentProgramEnabled;
> >     struct gl_fragment_program *FragmentProgram;
> >     GLboolean ATIFragmentShaderEnabled;
> > diff --git a/src/mesa/drivers/dri/i915/i915_fragprog.c
> > b/src/mesa/drivers/dri/i915/i915_fragprog.c
> > index 1944b3d..4e1df73 100644
> > --- a/src/mesa/drivers/dri/i915/i915_fragprog.c
> > +++ b/src/mesa/drivers/dri/i915/i915_fragprog.c
> > @@ -1148,8 +1148,8 @@ i915NewProgram(struct gl_context * ctx,
> > GLenum target, GLuint id)
> >  {
> >     switch (target) {
> >     case GL_VERTEX_PROGRAM_ARB: {
> > -      struct gl_vertex_program *prog =
> > CALLOC_STRUCT(gl_vertex_program);
> > -      return _mesa_init_gl_program(&prog->Base, target, id);
> > +      struct gl_program *prog = CALLOC_STRUCT(gl_program);
> > +      return _mesa_init_gl_program(prog, target, id);
> >     }
> >  
> >     case GL_FRAGMENT_PROGRAM_ARB:{
> > diff --git a/src/mesa/drivers/dri/i965/brw_context.h
> > b/src/mesa/drivers/dri/i965/brw_context.h
> > index 5e68c50..c1d6e08 100644
> > --- a/src/mesa/drivers/dri/i965/brw_context.h
> > +++ b/src/mesa/drivers/dri/i965/brw_context.h
> > @@ -330,7 +330,7 @@ struct brw_state_flags {
> >  
> >  /** Subclass of Mesa vertex program */
> >  struct brw_vertex_program {
> > -   struct gl_vertex_program program;
> > +   struct gl_program program;
> >     GLuint id;
> >  };
> >  
> > @@ -1006,7 +1006,7 @@ struct brw_context
> >  
> >     /* Active vertex program:
> >      */
> > -   const struct gl_vertex_program *vertex_program;
> > +   const struct gl_program *vertex_program;
> >     const struct gl_program *geometry_program;
> >     const struct gl_program *tess_ctrl_program;
> >     const struct gl_program *tess_eval_program;
> > @@ -1718,13 +1718,13 @@ brw_context( struct gl_context *ctx )
> >  }
> >  
> >  static inline struct brw_vertex_program *
> > -brw_vertex_program(struct gl_vertex_program *p)
> > +brw_vertex_program(struct gl_program *p)
> >  {
> >     return (struct brw_vertex_program *) p;
> >  }
> >  
> >  static inline const struct brw_vertex_program *
> > -brw_vertex_program_const(const struct gl_vertex_program *p)
> > +brw_vertex_program_const(const struct gl_program *p)
> >  {
> >     return (const struct brw_vertex_program *) p;
> >  }
> > diff --git a/src/mesa/drivers/dri/i965/brw_curbe.c
> > b/src/mesa/drivers/dri/i965/brw_curbe.c
> > index e88f4bb..f3f5a80 100644
> > --- a/src/mesa/drivers/dri/i965/brw_curbe.c
> > +++ b/src/mesa/drivers/dri/i965/brw_curbe.c
> > @@ -256,7 +256,7 @@ brw_upload_constant_buffer(struct brw_context
> > *brw)
> >  
> >     /* vertex shader constants */
> >     if (brw->curbe.vs_size) {
> > -      _mesa_load_state_parameters(ctx, brw->vertex_program-
> > >Base.Parameters);
> > +      _mesa_load_state_parameters(ctx, brw->vertex_program-
> > >Parameters);
> >  
> >        GLuint offset = brw->curbe.vs_start * 16;
> >  
> > diff --git a/src/mesa/drivers/dri/i965/brw_draw.c
> > b/src/mesa/drivers/dri/i965/brw_draw.c
> > index a2e0442..a979128 100644
> > --- a/src/mesa/drivers/dri/i965/brw_draw.c
> > +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> > @@ -302,7 +302,7 @@ brw_merge_inputs(struct brw_context *brw,
> >     }
> >  
> >     if (brw->gen < 8 && !brw->is_haswell) {
> > -      uint64_t mask = ctx->VertexProgram._Current->Base.nir->info-
> > >inputs_read;
> > +      uint64_t mask = ctx->VertexProgram._Current-
> > >info.inputs_read;
> >        /* Prior to Haswell, the hardware can't natively support
> > GL_FIXED or
> >         * 2_10_10_10_REV vertex formats.  Set appropriate
> > workaround flags.
> >         */
> > @@ -460,7 +460,7 @@ brw_try_draw_prims(struct gl_context *ctx,
> >     brw->tcs.base.sampler_count = ctx->TessCtrlProgram._Current ?
> >        util_last_bit(ctx->TessCtrlProgram._Current->SamplersUsed) :
> > 0;
> >     brw->vs.base.sampler_count =
> > -      util_last_bit(ctx->VertexProgram._Current-
> > >Base.SamplersUsed);
> > +      util_last_bit(ctx->VertexProgram._Current->SamplersUsed);
> >  
> >     intel_prepare_render(brw);
> >     brw_predraw_set_aux_buffers(brw);
> > diff --git a/src/mesa/drivers/dri/i965/brw_program.c
> > b/src/mesa/drivers/dri/i965/brw_program.c
> > index 8c0c936..9b31270 100644
> > --- a/src/mesa/drivers/dri/i965/brw_program.c
> > +++ b/src/mesa/drivers/dri/i965/brw_program.c
> > @@ -135,7 +135,7 @@ static struct gl_program *brwNewProgram( struct
> > gl_context *ctx,
> >        if (prog) {
> >  	 prog->id = get_new_program_id(brw->screen);
> >  
> > -	 return _mesa_init_gl_program(&prog->program.Base, target,
> > id);
> > +	 return _mesa_init_gl_program(&prog->program, target, id);
> >        }
> >        else
> >  	 return NULL;
> > @@ -235,8 +235,7 @@ brwProgramStringNotify(struct gl_context *ctx,
> >        break;
> >     }
> >     case GL_VERTEX_PROGRAM_ARB: {
> > -      struct gl_vertex_program *vprog = (struct gl_vertex_program
> > *) prog;
> > -      struct brw_vertex_program *newVP =
> > brw_vertex_program(vprog);
> > +      struct brw_vertex_program *newVP = brw_vertex_program(prog);
> >        const struct brw_vertex_program *curVP =
> >           brw_vertex_program_const(brw->vertex_program);
> >  
> > diff --git a/src/mesa/drivers/dri/i965/brw_vs.c
> > b/src/mesa/drivers/dri/i965/brw_vs.c
> > index f24a2ee..5d1c8e0 100644
> > --- a/src/mesa/drivers/dri/i965/brw_vs.c
> > +++ b/src/mesa/drivers/dri/i965/brw_vs.c
> > @@ -112,16 +112,15 @@ brw_codegen_vs_prog(struct brw_context *brw,
> >  
> >     mem_ctx = ralloc_context(NULL);
> >  
> > -   brw_assign_common_binding_table_offsets(MESA_SHADER_VERTEX,
> > -                                           devinfo,
> > -                                           prog, &vp-
> > >program.Base,
> > -                                           &prog_data.base.base,
> > 0);
> > +   brw_assign_common_binding_table_offsets(MESA_SHADER_VERTEX,
> > devinfo, prog,
> > +                                           &vp->program,
> > &prog_data.base.base,
> > +                                           0);
> >  
> >     /* Allocate the references to the uniforms that will end up in
> > the
> >      * prog_data associated with the compiled program, and which
> > will be freed
> >      * by the state cache.
> >      */
> > -   int param_count = vp->program.Base.nir->num_uniforms / 4;
> > +   int param_count = vp->program.nir->num_uniforms / 4;
> >  
> >     if (vs)
> >        prog_data.base.base.nr_image_params = vs->base.NumImages;
> > @@ -141,26 +140,25 @@ brw_codegen_vs_prog(struct brw_context *brw,
> >     stage_prog_data->nr_params = param_count;
> >  
> >     if (prog) {
> > -      brw_nir_setup_glsl_uniforms(vp->program.Base.nir, prog, &vp-
> > >program.Base,
> > +      brw_nir_setup_glsl_uniforms(vp->program.nir, prog, &vp-
> > >program,
> >                                    &prog_data.base.base,
> >                                    compiler-
> > >scalar_stage[MESA_SHADER_VERTEX]);
> >     } else {
> > -      brw_nir_setup_arb_uniforms(vp->program.Base.nir, &vp-
> > >program.Base,
> > +      brw_nir_setup_arb_uniforms(vp->program.nir, &vp->program,
> >                                   &prog_data.base.base);
> >     }
> >  
> >     uint64_t outputs_written =
> > -      brw_vs_outputs_written(brw, key,
> > -                             vp->program.Base.nir->info-
> > >outputs_written);
> > -   prog_data.inputs_read = vp->program.Base.nir->info-
> > >inputs_read;
> > +      brw_vs_outputs_written(brw, key, vp-
> > >program.info.outputs_written);
> > +   prog_data.inputs_read = vp->program.info.inputs_read;
> >  
> >     if (key->copy_edgeflag) {
> >        prog_data.inputs_read |= VERT_BIT_EDGEFLAG;
> >     }
> >  
> >     prog_data.base.cull_distance_mask =
> > -      ((1 << vp->program.Base.CullDistanceArraySize) - 1) <<
> > -      vp->program.Base.ClipDistanceArraySize;
> > +      ((1 << vp->program.CullDistanceArraySize) - 1) <<
> > +      vp->program.ClipDistanceArraySize;
> >  
> >     brw_compute_vue_map(devinfo,
> >                         &prog_data.base.vue_map, outputs_written,
> > @@ -169,8 +167,7 @@ brw_codegen_vs_prog(struct brw_context *brw,
> >                              : false);
> >  
> >     if (0) {
> > -      _mesa_fprint_program_opt(stderr, &vp->program.Base,
> > PROG_PRINT_DEBUG,
> > -			       true);
> > +      _mesa_fprint_program_opt(stderr, &vp->program,
> > PROG_PRINT_DEBUG, true);
> >     }
> >  
> >     if (unlikely(brw->perf_debug)) {
> > @@ -180,7 +177,7 @@ brw_codegen_vs_prog(struct brw_context *brw,
> >     }
> >  
> >     if (unlikely(INTEL_DEBUG & DEBUG_VS)) {
> > -      brw_dump_ir("vertex", prog, vs ? &vs->base : NULL, &vp-
> > >program.Base);
> > +      brw_dump_ir("vertex", prog, vs ? &vs->base : NULL, &vp-
> > >program);
> >  
> >        fprintf(stderr, "VS Output ");
> >        brw_print_vue_map(stderr, &prog_data.base.vue_map);
> > @@ -188,13 +185,13 @@ brw_codegen_vs_prog(struct brw_context *brw,
> >  
> >     int st_index = -1;
> >     if (INTEL_DEBUG & DEBUG_SHADER_TIME)
> > -      st_index = brw_get_shader_time_index(brw, prog, &vp-
> > >program.Base, ST_VS);
> > +      st_index = brw_get_shader_time_index(brw, prog, &vp-
> > >program, ST_VS);
> >  
> >     /* Emit GEN4 code.
> >      */
> >     char *error_str;
> > -   program = brw_compile_vs(compiler, brw, mem_ctx, key,
> > -                            &prog_data, vp->program.Base.nir,
> > +   program = brw_compile_vs(compiler, brw, mem_ctx, key,
> > &prog_data,
> > +                            vp->program.nir,
> >                              brw_select_clip_planes(&brw->ctx),
> >                              !_mesa_is_gles3(&brw->ctx),
> >                              st_index, &program_size, &error_str);
> > @@ -322,9 +319,8 @@ brw_vs_populate_key(struct brw_context *brw,
> >     key->program_string_id = vp->id;
> >  
> >     if (ctx->Transform.ClipPlanesEnabled != 0 &&
> > -       (ctx->API == API_OPENGL_COMPAT ||
> > -        ctx->API == API_OPENGLES) &&
> > -       vp->program.Base.ClipDistanceArraySize == 0) {
> > +       (ctx->API == API_OPENGL_COMPAT || ctx->API == API_OPENGLES)
> > &&
> > +       vp->program.ClipDistanceArraySize == 0) {
> >        key->nr_userclip_plane_consts =
> >           _mesa_logbase2(ctx->Transform.ClipPlanesEnabled) + 1;
> >     }
> > @@ -393,8 +389,7 @@ brw_vs_precompile(struct gl_context *ctx,
> >     struct brw_stage_prog_data *old_prog_data = brw-
> > >vs.base.prog_data;
> >     bool success;
> >  
> > -   struct gl_vertex_program *vp = (struct gl_vertex_program *)
> > prog;
> > -   struct brw_vertex_program *bvp = brw_vertex_program(vp);
> > +   struct brw_vertex_program *bvp = brw_vertex_program(prog);
> >  
> >     memset(&key, 0, sizeof(key));
> >  
> > diff --git a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c
> > b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c
> > index f8c7218..a5a5a75 100644
> > --- a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c
> > +++ b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c
> > @@ -121,7 +121,7 @@ brw_upload_vs_pull_constants(struct brw_context
> > *brw)
> >  
> >     _mesa_shader_write_subroutine_indices(&brw->ctx,
> > MESA_SHADER_VERTEX);
> >     /* _NEW_PROGRAM_CONSTANTS */
> > -   brw_upload_pull_constants(brw, BRW_NEW_VS_CONSTBUF, &vp-
> > >program.Base,
> > +   brw_upload_pull_constants(brw, BRW_NEW_VS_CONSTBUF, &vp-
> > >program,
> >                               stage_state, prog_data);
> >  }
> >  
> > diff --git a/src/mesa/drivers/dri/i965/gen6_vs_state.c
> > b/src/mesa/drivers/dri/i965/gen6_vs_state.c
> > index 780b163..17ccd32 100644
> > --- a/src/mesa/drivers/dri/i965/gen6_vs_state.c
> > +++ b/src/mesa/drivers/dri/i965/gen6_vs_state.c
> > @@ -46,8 +46,8 @@ gen6_upload_vs_push_constants(struct brw_context
> > *brw)
> >     const struct brw_stage_prog_data *prog_data = brw-
> > >vs.base.prog_data;
> >  
> >     _mesa_shader_write_subroutine_indices(&brw->ctx,
> > MESA_SHADER_VERTEX);
> > -   gen6_upload_push_constants(brw, &vp->program.Base, prog_data,
> > -                              stage_state,
> > AUB_TRACE_VS_CONSTANTS);
> > +   gen6_upload_push_constants(brw, &vp->program, prog_data,
> > stage_state,
> > +                              AUB_TRACE_VS_CONSTANTS);
> >  
> >     if (brw->gen >= 7) {
> >        if (brw->gen == 7 && !brw->is_haswell && !brw->is_baytrail)
> > diff --git a/src/mesa/drivers/dri/r200/r200_context.h
> > b/src/mesa/drivers/dri/r200/r200_context.h
> > index 7c6f480..07eae23 100644
> > --- a/src/mesa/drivers/dri/r200/r200_context.h
> > +++ b/src/mesa/drivers/dri/r200/r200_context.h
> > @@ -59,7 +59,7 @@ typedef struct r200_context *r200ContextPtr;
> >  #include "main/mm.h"
> >  
> >  struct r200_vertex_program {
> > -        struct gl_vertex_program mesa_program; /* Must be first */
> > +        struct gl_program mesa_program; /* Must be first */
> >          int translated;
> >          /* need excess instr: 1 for late loop checking, 2 for 
> >             additional instr due to instr/attr, 3 for fog */
> > diff --git a/src/mesa/drivers/dri/r200/r200_state_init.c
> > b/src/mesa/drivers/dri/r200/r200_state_init.c
> > index 8cffa92..f31a191 100644
> > --- a/src/mesa/drivers/dri/r200/r200_state_init.c
> > +++ b/src/mesa/drivers/dri/r200/r200_state_init.c
> > @@ -271,8 +271,8 @@ TCL_OR_VP_CHECK( tcl_or_vp, GL_TRUE, 0 )
> >  TCL_OR_VP_CHECK( tcl_or_vp_add2, GL_TRUE, 2 )
> >  VP_CHECK( tcl_vp, GL_TRUE, 0 )
> >  VP_CHECK( tcl_vp_add4, GL_TRUE, 4 )
> > -VP_CHECK( tcl_vp_size_add4, ctx->VertexProgram.Current-
> > >Base.NumNativeInstructions > 64, 4 )
> > -VP_CHECK( tcl_vpp_size_add4, ctx->VertexProgram.Current-
> > >Base.NumNativeParameters > 96, 4 )
> > +VP_CHECK( tcl_vp_size_add4, ctx->VertexProgram.Current-
> > >NumNativeInstructions > 64, 4 )
> > +VP_CHECK( tcl_vpp_size_add4, ctx->VertexProgram.Current-
> > >NumNativeParameters > 96, 4 )
> >  
> >  #define OUT_VEC(hdr, data) do {			\
> >      drm_radeon_cmd_header_t h;					
> > \
> > diff --git a/src/mesa/drivers/dri/r200/r200_tcl.c
> > b/src/mesa/drivers/dri/r200/r200_tcl.c
> > index c042aae..b556c86 100644
> > --- a/src/mesa/drivers/dri/r200/r200_tcl.c
> > +++ b/src/mesa/drivers/dri/r200/r200_tcl.c
> > @@ -427,7 +427,7 @@ static GLboolean r200_run_tcl_render( struct
> > gl_context *ctx,
> >  	 We only need to change compsel. */
> >        GLuint out_compsel = 0;
> >        const GLbitfield64 vp_out =
> > -	 rmesa->curr_vp_hw->mesa_program.Base.OutputsWritten;
> > +	 rmesa->curr_vp_hw->mesa_program.OutputsWritten;
> >  
> >        vimap_rev = &rmesa->curr_vp_hw->inputmap_rev[0];
> >        assert(vp_out & BITFIELD64_BIT(VARYING_SLOT_POS));
> > diff --git a/src/mesa/drivers/dri/r200/r200_vertprog.c
> > b/src/mesa/drivers/dri/r200/r200_vertprog.c
> > index 628c570..bf67602 100644
> > --- a/src/mesa/drivers/dri/r200/r200_vertprog.c
> > +++ b/src/mesa/drivers/dri/r200/r200_vertprog.c
> > @@ -104,15 +104,15 @@ static GLboolean
> > r200VertexProgUpdateParams(struct gl_context *ctx, struct r200_
> >     r200ContextPtr rmesa = R200_CONTEXT( ctx );
> >     GLfloat *fcmd = (GLfloat *)&rmesa->hw.vpp[0].cmd[VPP_CMD_0 +
> > 1];
> >     int pi;
> > -   struct gl_vertex_program *mesa_vp = &vp->mesa_program;
> > +   struct gl_program *mesa_vp = &vp->mesa_program;
> >     struct gl_program_parameter_list *paramList;
> >     drm_radeon_cmd_header_t tmp;
> >  
> >     R200_STATECHANGE( rmesa, vpp[0] );
> >     R200_STATECHANGE( rmesa, vpp[1] );
> > -   assert(mesa_vp->Base.Parameters);
> > -   _mesa_load_state_parameters(ctx, mesa_vp->Base.Parameters);
> > -   paramList = mesa_vp->Base.Parameters;
> > +   assert(mesa_vp->Parameters);
> > +   _mesa_load_state_parameters(ctx, mesa_vp->Parameters);
> > +   paramList = mesa_vp->Parameters;
> >  
> >     if(paramList->NumParameters > R200_VSF_MAX_PARAM){
> >        fprintf(stderr, "%s:Params exhausted\n", __func__);
> > @@ -392,7 +392,7 @@ static unsigned long op_operands(enum
> > prog_opcode opcode)
> >   */
> >  static GLboolean r200_translate_vertex_program(struct gl_context
> > *ctx, struct r200_vertex_program *vp)
> >  {
> > -   struct gl_vertex_program *mesa_vp = &vp->mesa_program;
> > +   struct gl_program *mesa_vp = &vp->mesa_program;
> >     struct prog_instruction *vpi;
> >     int i;
> >     VERTEX_SHADER_INSTRUCTION *o_inst;
> > @@ -409,30 +409,30 @@ static GLboolean
> > r200_translate_vertex_program(struct gl_context *ctx, struct r2
> >     vp->translated = GL_TRUE;
> >     vp->fogmode = ctx->Fog.Mode;
> >  
> > -   if (mesa_vp->Base.NumInstructions == 0)
> > +   if (mesa_vp->NumInstructions == 0)
> >        return GL_FALSE;
> >  
> >  #if 0
> > -   if ((mesa_vp->Base.InputsRead &
> > +   if ((mesa_vp->InputsRead &
> >        ~(VERT_BIT_POS | VERT_BIT_NORMAL | VERT_BIT_COLOR0 |
> > VERT_BIT_COLOR1 |
> >        VERT_BIT_FOG | VERT_BIT_TEX0 | VERT_BIT_TEX1 | VERT_BIT_TEX2
> > |
> >        VERT_BIT_TEX3 | VERT_BIT_TEX4 | VERT_BIT_TEX5)) != 0) {
> >        if (R200_DEBUG & RADEON_FALLBACKS) {
> >  	 fprintf(stderr, "can't handle vert prog inputs 0x%x\n",
> > -	    mesa_vp->Base.InputsRead);
> > +	    mesa_vp->InputsRead);
> >        }
> >        return GL_FALSE;
> >     }
> >  #endif
> >  
> > -   if ((mesa_vp->Base.OutputsWritten &
> > +   if ((mesa_vp->OutputsWritten &
> >        ~((1 << VARYING_SLOT_POS) | (1 << VARYING_SLOT_COL0) | (1 <<
> > VARYING_SLOT_COL1) |
> >        (1 << VARYING_SLOT_FOGC) | (1 << VARYING_SLOT_TEX0) | (1 <<
> > VARYING_SLOT_TEX1) |
> >        (1 << VARYING_SLOT_TEX2) | (1 << VARYING_SLOT_TEX3) | (1 <<
> > VARYING_SLOT_TEX4) |
> >        (1 << VARYING_SLOT_TEX5) | (1 << VARYING_SLOT_PSIZ))) != 0)
> > {
> >        if (R200_DEBUG & RADEON_FALLBACKS) {
> >  	 fprintf(stderr, "can't handle vert prog outputs
> > 0x%llx\n",
> > -                 (unsigned long long) mesa_vp-
> > >Base.OutputsWritten);
> > +                 (unsigned long long) mesa_vp->OutputsWritten);
> >        }
> >        return GL_FALSE;
> >     }
> > @@ -447,25 +447,25 @@ static GLboolean
> > r200_translate_vertex_program(struct gl_context *ctx, struct r2
> >  /* FIXME: is changing the prog safe to do here? */
> >     if (mesa_vp->IsPositionInvariant &&
> >        /* make sure we only do this once */
> > -       !(mesa_vp->Base.OutputsWritten & (1 << VARYING_SLOT_POS)))
> > {
> > +       !(mesa_vp->OutputsWritten & (1 << VARYING_SLOT_POS))) {
> >  	 _mesa_insert_mvp_code(ctx, mesa_vp);
> >        }
> >  
> >     /* for fogc, can't change mesa_vp, as it would hose swtnl, and
> > exp with
> >        base e isn't directly available neither. */
> > -   if ((mesa_vp->Base.OutputsWritten & (1 << VARYING_SLOT_FOGC))
> > && !vp->fogpidx) {
> > +   if ((mesa_vp->OutputsWritten & (1 << VARYING_SLOT_FOGC)) &&
> > !vp->fogpidx) {
> >        struct gl_program_parameter_list *paramList;
> >        gl_state_index tokens[STATE_LENGTH] = { STATE_FOG_PARAMS, 0,
> > 0, 0, 0 };
> > -      paramList = mesa_vp->Base.Parameters;
> > +      paramList = mesa_vp->Parameters;
> >        vp->fogpidx = _mesa_add_state_reference(paramList, tokens);
> >     }
> >  
> >     vp->pos_end = 0;
> > -   mesa_vp->Base.NumNativeInstructions = 0;
> > -   if (mesa_vp->Base.Parameters)
> > -      mesa_vp->Base.NumNativeParameters = mesa_vp-
> > >Base.Parameters->NumParameters;
> > +   mesa_vp->NumNativeInstructions = 0;
> > +   if (mesa_vp->Parameters)
> > +      mesa_vp->NumNativeParameters = mesa_vp->Parameters-
> > >NumParameters;
> >     else
> > -      mesa_vp->Base.NumNativeParameters = 0;
> > +      mesa_vp->NumNativeParameters = 0;
> >  
> >     for(i = 0; i < VERT_ATTRIB_MAX; i++)
> >        vp->inputs[i] = -1;
> > @@ -491,42 +491,42 @@ static GLboolean
> > r200_translate_vertex_program(struct gl_context *ctx, struct r2
> >     Haven't seen attr 14 used, maybe that's for the hw pointsize
> > vec1 (which is
> >     not possibe to use with vertex progs as it is lacking in vert
> > prog specification) */
> >  /* may look different when using idx buf / input_route instead of
> > se_vtx_fmt? */
> > -   if (mesa_vp->Base.InputsRead & VERT_BIT_POS) {
> > +   if (mesa_vp->InputsRead & VERT_BIT_POS) {
> >        vp->inputs[VERT_ATTRIB_POS] = 0;
> >        vp->inputmap_rev[0] = VERT_ATTRIB_POS;
> >        free_inputs &= ~(1 << 0);
> >        array_count++;
> >     }
> > -   if (mesa_vp->Base.InputsRead & VERT_BIT_WEIGHT) {
> > +   if (mesa_vp->InputsRead & VERT_BIT_WEIGHT) {
> >        vp->inputs[VERT_ATTRIB_WEIGHT] = 12;
> >        vp->inputmap_rev[1] = VERT_ATTRIB_WEIGHT;
> >        array_count++;
> >     }
> > -   if (mesa_vp->Base.InputsRead & VERT_BIT_NORMAL) {
> > +   if (mesa_vp->InputsRead & VERT_BIT_NORMAL) {
> >        vp->inputs[VERT_ATTRIB_NORMAL] = 1;
> >        vp->inputmap_rev[2] = VERT_ATTRIB_NORMAL;
> >        array_count++;
> >     }
> > -   if (mesa_vp->Base.InputsRead & VERT_BIT_COLOR0) {
> > +   if (mesa_vp->InputsRead & VERT_BIT_COLOR0) {
> >        vp->inputs[VERT_ATTRIB_COLOR0] = 2;
> >        vp->inputmap_rev[4] = VERT_ATTRIB_COLOR0;
> >        free_inputs &= ~(1 << 2);
> >        array_count++;
> >     }
> > -   if (mesa_vp->Base.InputsRead & VERT_BIT_COLOR1) {
> > +   if (mesa_vp->InputsRead & VERT_BIT_COLOR1) {
> >        vp->inputs[VERT_ATTRIB_COLOR1] = 3;
> >        vp->inputmap_rev[5] = VERT_ATTRIB_COLOR1;
> >        free_inputs &= ~(1 << 3);
> >        array_count++;
> >     }
> > -   if (mesa_vp->Base.InputsRead & VERT_BIT_FOG) {
> > +   if (mesa_vp->InputsRead & VERT_BIT_FOG) {
> >        vp->inputs[VERT_ATTRIB_FOG] = 15; array_count++;
> >        vp->inputmap_rev[3] = VERT_ATTRIB_FOG;
> >        array_count++;
> >     }
> >     /* VERT_ATTRIB_TEX0-5 */
> >     for (i = 0; i <= 5; i++) {
> > -      if (mesa_vp->Base.InputsRead & VERT_BIT_TEX(i)) {
> > +      if (mesa_vp->InputsRead & VERT_BIT_TEX(i)) {
> >  	 vp->inputs[VERT_ATTRIB_TEX(i)] = i + 6;
> >  	 vp->inputmap_rev[8 + i] = VERT_ATTRIB_TEX(i);
> >  	 free_inputs &= ~(1 << (i + 6));
> > @@ -535,7 +535,7 @@ static GLboolean
> > r200_translate_vertex_program(struct gl_context *ctx, struct r2
> >     }
> >     /* using VERT_ATTRIB_TEX6/7 would be illegal */
> >     for (; i < VERT_ATTRIB_TEX_MAX; i++) {
> > -      if (mesa_vp->Base.InputsRead & VERT_BIT_TEX(i)) {
> > +      if (mesa_vp->InputsRead & VERT_BIT_TEX(i)) {
> >            if (R200_DEBUG & RADEON_FALLBACKS) {
> >                fprintf(stderr, "texture attribute %d in vert
> > prog\n", i);
> >            }
> > @@ -546,7 +546,7 @@ static GLboolean
> > r200_translate_vertex_program(struct gl_context *ctx, struct r2
> >     for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) {
> >        int j;
> >     /* completely ignore aliasing? */
> > -      if (mesa_vp->Base.InputsRead & VERT_BIT_GENERIC(i)) {
> > +      if (mesa_vp->InputsRead & VERT_BIT_GENERIC(i)) {
> >  	 array_count++;
> >  	 if (array_count > 12) {
> >  	    if (R200_DEBUG & RADEON_FALLBACKS) {
> > @@ -575,7 +575,7 @@ static GLboolean
> > r200_translate_vertex_program(struct gl_context *ctx, struct r2
> >        }
> >     }
> >  
> > -   if (!(mesa_vp->Base.OutputsWritten & (1 << VARYING_SLOT_POS)))
> > {
> > +   if (!(mesa_vp->OutputsWritten & (1 << VARYING_SLOT_POS))) {
> >        if (R200_DEBUG & RADEON_FALLBACKS) {
> >  	 fprintf(stderr, "can't handle vert prog without position
> > output\n");
> >        }
> > @@ -589,7 +589,7 @@ static GLboolean
> > r200_translate_vertex_program(struct gl_context *ctx, struct r2
> >     }
> >  
> >     o_inst = vp->instr;
> > -   for (vpi = mesa_vp->Base.Instructions; vpi->Opcode !=
> > OPCODE_END; vpi++, o_inst++){
> > +   for (vpi = mesa_vp->Instructions; vpi->Opcode != OPCODE_END;
> > vpi++, o_inst++){
> >        operands = op_operands(vpi->Opcode);
> >        are_srcs_scalar = operands & SCALAR_FLAG;
> >        operands &= OP_MASK;
> > @@ -1069,20 +1069,20 @@ else {
> >        }
> >  
> >        u_temp_used = (R200_VSF_MAX_TEMPS - 1) - u_temp_i;
> > -      if (mesa_vp->Base.NumNativeTemporaries <
> > -	 (mesa_vp->Base.NumTemporaries + u_temp_used)) {
> > -	 mesa_vp->Base.NumNativeTemporaries =
> > -	    mesa_vp->Base.NumTemporaries + u_temp_used;
> > +      if (mesa_vp->NumNativeTemporaries <
> > +	  (mesa_vp->NumTemporaries + u_temp_used)) {
> > +	 mesa_vp->NumNativeTemporaries =
> > +	    mesa_vp->NumTemporaries + u_temp_used;
> >        }
> > -      if ((mesa_vp->Base.NumTemporaries + u_temp_used) >
> > R200_VSF_MAX_TEMPS) {
> > +      if ((mesa_vp->NumTemporaries + u_temp_used) >
> > R200_VSF_MAX_TEMPS) {
> >  	 if (R200_DEBUG & RADEON_FALLBACKS) {
> > -	    fprintf(stderr, "Ran out of temps, num temps %d, us
> > %d\n", mesa_vp->Base.NumTemporaries, u_temp_used);
> > +	    fprintf(stderr, "Ran out of temps, num temps %d, us
> > %d\n", mesa_vp->NumTemporaries, u_temp_used);
> >  	 }
> >  	 return GL_FALSE;
> >        }
> >        u_temp_i = R200_VSF_MAX_TEMPS - 1;
> >        if(o_inst - vp->instr >= R200_VSF_MAX_INST) {
> > -	 mesa_vp->Base.NumNativeInstructions = 129;
> > +	 mesa_vp->NumNativeInstructions = 129;
> >  	 if (R200_DEBUG & RADEON_FALLBACKS) {
> >  	    fprintf(stderr, "more than 128 native
> > instructions\n");
> >  	 }
> > @@ -1094,7 +1094,7 @@ else {
> >     }
> >  
> >     vp->native = GL_TRUE;
> > -   mesa_vp->Base.NumNativeInstructions = (o_inst - vp->instr);
> > +   mesa_vp->NumNativeInstructions = (o_inst - vp->instr);
> >  #if 0
> >     fprintf(stderr, "hw program:\n");
> >     for(i=0; i < vp->program.length; i++)
> > @@ -1126,10 +1126,10 @@ void r200SetupVertexProg( struct gl_context
> > *ctx ) {
> >     R200_STATECHANGE( rmesa, pvs );
> >  
> >     rmesa->hw.pvs.cmd[PVS_CNTL_1] = (0 <<
> > R200_PVS_CNTL_1_PROGRAM_START_SHIFT) |
> > -      ((vp->mesa_program.Base.NumNativeInstructions - 1) <<
> > R200_PVS_CNTL_1_PROGRAM_END_SHIFT) |
> > +      ((vp->mesa_program.NumNativeInstructions - 1) <<
> > R200_PVS_CNTL_1_PROGRAM_END_SHIFT) |
> >        (vp->pos_end << R200_PVS_CNTL_1_POS_END_SHIFT);
> >     rmesa->hw.pvs.cmd[PVS_CNTL_2] = (0 <<
> > R200_PVS_CNTL_2_PARAM_OFFSET_SHIFT) |
> > -      (vp->mesa_program.Base.NumNativeParameters <<
> > R200_PVS_CNTL_2_PARAM_COUNT_SHIFT);
> > +      (vp->mesa_program.NumNativeParameters <<
> > R200_PVS_CNTL_2_PARAM_COUNT_SHIFT);
> >  
> >     /* maybe user clip planes just work with vertex progs...
> > untested */
> >     if (ctx->Transform.ClipPlanesEnabled) {
> > @@ -1143,7 +1143,7 @@ void r200SetupVertexProg( struct gl_context
> > *ctx ) {
> >     }
> >  
> >     if (vp != rmesa->curr_vp_hw) {
> > -      GLuint count = vp->mesa_program.Base.NumNativeInstructions;
> > +      GLuint count = vp->mesa_program.NumNativeInstructions;
> >        drm_radeon_cmd_header_t tmp;
> >  
> >        R200_STATECHANGE( rmesa, vpi[0] );
> > @@ -1203,7 +1203,7 @@ r200NewProgram(struct gl_context *ctx, GLenum
> > target, GLuint id)
> >     switch(target){
> >     case GL_VERTEX_PROGRAM_ARB: {
> >        struct r200_vertex_program *vp =
> > CALLOC_STRUCT(r200_vertex_program);
> > -      return _mesa_init_gl_program(&vp->mesa_program.Base, target,
> > id);
> > +      return _mesa_init_gl_program(&vp->mesa_program, target, id);
> >     }
> >     case GL_FRAGMENT_PROGRAM_ARB: {
> >        struct gl_fragment_program *prog =
> > CALLOC_STRUCT(gl_fragment_program);
> > @@ -1232,7 +1232,7 @@ r200ProgramStringNotify(struct gl_context
> > *ctx, GLenum target, struct gl_program
> >     case GL_VERTEX_PROGRAM_ARB:
> >        vp->translated = GL_FALSE;
> >        vp->fogpidx = 0;
> > -/*      memset(&vp->translated, 0, sizeof(struct
> > r200_vertex_program) - sizeof(struct gl_vertex_program));*/
> > +/*      memset(&vp->translated, 0, sizeof(struct
> > r200_vertex_program) - sizeof(struct gl_program));*/
> >        r200_translate_vertex_program(ctx, vp);
> >        rmesa->curr_vp_hw = NULL;
> >        break;
> > diff --git a/src/mesa/main/arbprogram.c
> > b/src/mesa/main/arbprogram.c
> > index 911b6fa..0b6f7cb 100644
> > --- a/src/mesa/main/arbprogram.c
> > +++ b/src/mesa/main/arbprogram.c
> > @@ -59,7 +59,7 @@ _mesa_BindProgramARB(GLenum target, GLuint id)
> >  
> >     /* Error-check target and get curProg */
> >     if (target == GL_VERTEX_PROGRAM_ARB && ctx-
> > >Extensions.ARB_vertex_program) {
> > -      curProg = &ctx->VertexProgram.Current->Base;
> > +      curProg = ctx->VertexProgram.Current;
> >     }
> >     else if (target == GL_FRAGMENT_PROGRAM_ARB
> >              && ctx->Extensions.ARB_fragment_program) {
> > @@ -79,7 +79,7 @@ _mesa_BindProgramARB(GLenum target, GLuint id)
> >        /* Bind a default program */
> >        newProg = NULL;
> >        if (target == GL_VERTEX_PROGRAM_ARB)
> > -         newProg = &ctx->Shared->DefaultVertexProgram->Base;
> > +         newProg = ctx->Shared->DefaultVertexProgram;
> >        else
> >           newProg = &ctx->Shared->DefaultFragmentProgram->Base;
> >     }
> > @@ -114,8 +114,7 @@ _mesa_BindProgramARB(GLenum target, GLuint id)
> >  
> >     /* bind newProg */
> >     if (target == GL_VERTEX_PROGRAM_ARB) {
> > -      _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current,
> > -                               gl_vertex_program(newProg));
> > +      _mesa_reference_program(ctx, &ctx->VertexProgram.Current,
> > newProg);
> >     }
> >     else if (target == GL_FRAGMENT_PROGRAM_ARB) {
> >        _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current,
> > @@ -160,7 +159,7 @@ _mesa_DeleteProgramsARB(GLsizei n, const GLuint
> > *ids)
> >              switch (prog->Target) {
> >              case GL_VERTEX_PROGRAM_ARB:
> >                 if (ctx->VertexProgram.Current &&
> > -                   ctx->VertexProgram.Current->Base.Id == ids[i])
> > {
> > +                   ctx->VertexProgram.Current->Id == ids[i]) {
> >                    /* unbind this currently bound program */
> >                    _mesa_BindProgramARB(prog->Target, 0);
> >                 }
> > @@ -257,7 +256,7 @@ get_local_param_pointer(struct gl_context *ctx,
> > const char *func,
> >  
> >     if (target == GL_VERTEX_PROGRAM_ARB
> >         && ctx->Extensions.ARB_vertex_program) {
> > -      prog = &(ctx->VertexProgram.Current->Base);
> > +      prog = ctx->VertexProgram.Current;
> >        maxParams = ctx-
> > >Const.Program[MESA_SHADER_VERTEX].MaxLocalParams;
> >     }
> >     else if (target == GL_FRAGMENT_PROGRAM_ARB
> > @@ -336,10 +335,10 @@ _mesa_ProgramStringARB(GLenum target, GLenum
> > format, GLsizei len,
> >     }
> >  
> >     if (target == GL_VERTEX_PROGRAM_ARB && ctx-
> > >Extensions.ARB_vertex_program) {
> > -      struct gl_vertex_program *prog = ctx->VertexProgram.Current;
> > +      struct gl_program *prog = ctx->VertexProgram.Current;
> >        _mesa_parse_arb_vertex_program(ctx, target, string, len,
> > prog);
> >  
> > -      base = & prog->Base;
> > +      base = prog;
> >     }
> >     else if (target == GL_FRAGMENT_PROGRAM_ARB
> >              && ctx->Extensions.ARB_fragment_program) {
> > @@ -657,7 +656,7 @@ _mesa_GetProgramivARB(GLenum target, GLenum
> > pname, GLint *params)
> >  
> >     if (target == GL_VERTEX_PROGRAM_ARB
> >         && ctx->Extensions.ARB_vertex_program) {
> > -      prog = &(ctx->VertexProgram.Current->Base);
> > +      prog = ctx->VertexProgram.Current;
> >        limits = &ctx->Const.Program[MESA_SHADER_VERTEX];
> >     }
> >     else if (target == GL_FRAGMENT_PROGRAM_ARB
> > @@ -838,7 +837,7 @@ _mesa_GetProgramStringARB(GLenum target, GLenum
> > pname, GLvoid *string)
> >     GET_CURRENT_CONTEXT(ctx);
> >  
> >     if (target == GL_VERTEX_PROGRAM_ARB) {
> > -      prog = &(ctx->VertexProgram.Current->Base);
> > +      prog = ctx->VertexProgram.Current;
> >     }
> >     else if (target == GL_FRAGMENT_PROGRAM_ARB) {
> >        prog = &(ctx->FragmentProgram.Current->Base);
> > diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> > index 757dbfc..1ae1ab5 100644
> > --- a/src/mesa/main/context.c
> > +++ b/src/mesa/main/context.c
> > @@ -741,7 +741,7 @@ check_context_limits(struct gl_context *ctx)
> >  
> >     /* check that we don't exceed the size of various bitfields */
> >     assert(VARYING_SLOT_MAX <=
> > -	  (8 * sizeof(ctx->VertexProgram._Current-
> > >Base.OutputsWritten)));
> > +	  (8 * sizeof(ctx->VertexProgram._Current-
> > >OutputsWritten)));
> >     assert(VARYING_SLOT_MAX <=
> >  	  (8 * sizeof(ctx->FragmentProgram._Current-
> > >Base.InputsRead)));
> >  
> > @@ -1293,9 +1293,9 @@ _mesa_free_context_data( struct gl_context
> > *ctx )
> >     _mesa_reference_framebuffer(&ctx->DrawBuffer, NULL);
> >     _mesa_reference_framebuffer(&ctx->ReadBuffer, NULL);
> >  
> > -   _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current,
> > NULL);
> > -   _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current,
> > NULL);
> > -   _mesa_reference_vertprog(ctx, &ctx->VertexProgram._TnlProgram,
> > NULL);
> > +   _mesa_reference_program(ctx, &ctx->VertexProgram.Current,
> > NULL);
> > +   _mesa_reference_program(ctx, &ctx->VertexProgram._Current,
> > NULL);
> > +   _mesa_reference_program(ctx, &ctx->VertexProgram._TnlProgram,
> > NULL);
> >  
> >     _mesa_reference_program(ctx, &ctx->TessCtrlProgram._Current,
> > NULL);
> >     _mesa_reference_program(ctx, &ctx->TessEvalProgram._Current,
> > NULL);
> > diff --git a/src/mesa/main/ff_fragment_shader.cpp
> > b/src/mesa/main/ff_fragment_shader.cpp
> > index db3736e..5300335 100644
> > --- a/src/mesa/main/ff_fragment_shader.cpp
> > +++ b/src/mesa/main/ff_fragment_shader.cpp
> > @@ -368,7 +368,7 @@ static GLbitfield get_fp_input_mask( struct
> > gl_context *ctx )
> >        if (vertexShader)
> >           vprog = ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX]-
> > >_LinkedShaders[MESA_SHADER_VERTEX]->Program;
> >        else
> > -         vprog = &ctx->VertexProgram.Current->Base;
> > +         vprog = ctx->VertexProgram.Current;
> >  
> >        vp_outputs = vprog->OutputsWritten;
> >  
> > diff --git a/src/mesa/main/ffvertex_prog.c
> > b/src/mesa/main/ffvertex_prog.c
> > index 9bf0f68..15997cc 100644
> > --- a/src/mesa/main/ffvertex_prog.c
> > +++ b/src/mesa/main/ffvertex_prog.c
> > @@ -305,7 +305,7 @@ struct ureg {
> >  
> >  struct tnl_program {
> >     const struct state_key *state;
> > -   struct gl_vertex_program *program;
> > +   struct gl_program *program;
> >     GLuint max_inst;  /** number of instructions allocated for
> > program */
> >     GLboolean mvp_with_dp4;
> >  
> > @@ -384,8 +384,8 @@ static struct ureg get_temp( struct tnl_program
> > *p )
> >        exit(1);
> >     }
> >  
> > -   if ((GLuint) bit > p->program->Base.NumTemporaries)
> > -      p->program->Base.NumTemporaries = bit;
> > +   if ((GLuint) bit > p->program->NumTemporaries)
> > +      p->program->NumTemporaries = bit;
> >  
> >     p->temp_in_use |= 1<<(bit-1);
> >     return make_ureg(PROGRAM_TEMPORARY, bit-1);
> > @@ -428,7 +428,7 @@ static struct ureg register_param5(struct
> > tnl_program *p,
> >     tokens[2] = s2;
> >     tokens[3] = s3;
> >     tokens[4] = s4;
> > -   idx = _mesa_add_state_reference( p->program->Base.Parameters,
> > tokens );
> > +   idx = _mesa_add_state_reference(p->program->Parameters, tokens
> > );
> >     return make_ureg(PROGRAM_STATE_VAR, idx);
> >  }
> >  
> > @@ -448,7 +448,7 @@ static struct ureg register_input( struct
> > tnl_program *p, GLuint input )
> >     assert(input < VERT_ATTRIB_MAX);
> >  
> >     if (p->state->varying_vp_inputs & VERT_BIT(input)) {
> > -      p->program->Base.InputsRead |= VERT_BIT(input);
> > +      p->program->InputsRead |= VERT_BIT(input);
> >        return make_ureg(PROGRAM_INPUT, input);
> >     }
> >     else {
> > @@ -462,7 +462,7 @@ static struct ureg register_input( struct
> > tnl_program *p, GLuint input )
> >   */
> >  static struct ureg register_output( struct tnl_program *p, GLuint
> > output )
> >  {
> > -   p->program->Base.OutputsWritten |= BITFIELD64_BIT(output);
> > +   p->program->OutputsWritten |= BITFIELD64_BIT(output);
> >     return make_ureg(PROGRAM_OUTPUT, output);
> >  }
> >  
> > @@ -480,8 +480,8 @@ static struct ureg register_const4f( struct
> > tnl_program *p,
> >     values[1].f = s1;
> >     values[2].f = s2;
> >     values[3].f = s3;
> > -   idx = _mesa_add_unnamed_constant( p->program->Base.Parameters,
> > values, 4,
> > -                                     &swizzle );
> > +   idx = _mesa_add_unnamed_constant(p->program->Parameters,
> > values, 4,
> > +                                    &swizzle );
> >     assert(swizzle == SWIZZLE_NOOP);
> >     return make_ureg(PROGRAM_CONSTANT, idx);
> >  }
> > @@ -578,9 +578,9 @@ static void emit_op3fn(struct tnl_program *p,
> >     GLuint nr;
> >     struct prog_instruction *inst;
> >  
> > -   assert(p->program->Base.NumInstructions <= p->max_inst);
> > +   assert(p->program->NumInstructions <= p->max_inst);
> >  
> > -   if (p->program->Base.NumInstructions == p->max_inst) {
> > +   if (p->program->NumInstructions == p->max_inst) {
> >        /* need to extend the program's instruction array */
> >        struct prog_instruction *newInst;
> >  
> > @@ -593,19 +593,18 @@ static void emit_op3fn(struct tnl_program *p,
> >           return;
> >        }
> >  
> > -      _mesa_copy_instructions(newInst,
> > -                              p->program->Base.Instructions,
> > -                              p->program->Base.NumInstructions);
> > +      _mesa_copy_instructions(newInst, p->program->Instructions,
> > +                              p->program->NumInstructions);
> >  
> > -      _mesa_free_instructions(p->program->Base.Instructions,
> > -                              p->program->Base.NumInstructions);
> > +      _mesa_free_instructions(p->program->Instructions,
> > +                              p->program->NumInstructions);
> >  
> > -      p->program->Base.Instructions = newInst;
> > +      p->program->Instructions = newInst;
> >     }
> >  
> > -   nr = p->program->Base.NumInstructions++;
> > +   nr = p->program->NumInstructions++;
> >  
> > -   inst = &p->program->Base.Instructions[nr];
> > +   inst = &p->program->Instructions[nr];
> >     inst->Opcode = (enum prog_opcode) op;
> >  
> >     emit_arg( &inst->SrcReg[0], src0 );
> > @@ -1608,7 +1607,7 @@ static void build_tnl_program( struct
> > tnl_program *p )
> >  
> >  static void
> >  create_new_program( const struct state_key *key,
> > -                    struct gl_vertex_program *program,
> > +                    struct gl_program *program,
> >                      GLboolean mvp_with_dp4,
> >                      GLuint max_temps)
> >  {
> > @@ -1634,15 +1633,15 @@ create_new_program( const struct state_key
> > *key,
> >      * If we need more, we'll grow the instruction array as needed.
> >      */
> >     p.max_inst = 32;
> > -   p.program->Base.Instructions =
> > _mesa_alloc_instructions(p.max_inst);
> > -   p.program->Base.String = NULL;
> > -   p.program->Base.NumInstructions =
> > -   p.program->Base.NumTemporaries =
> > -   p.program->Base.NumParameters =
> > -   p.program->Base.NumAttributes = p.program->Base.NumAddressRegs
> > = 0;
> > -   p.program->Base.Parameters = _mesa_new_parameter_list();
> > -   p.program->Base.InputsRead = 0;
> > -   p.program->Base.OutputsWritten = 0;
> > +   p.program->Instructions = _mesa_alloc_instructions(p.max_inst);
> > +   p.program->String = NULL;
> > +   p.program->NumInstructions =
> > +   p.program->NumTemporaries =
> > +   p.program->NumParameters =
> > +   p.program->NumAttributes = p.program->NumAddressRegs = 0;
> > +   p.program->Parameters = _mesa_new_parameter_list();
> > +   p.program->InputsRead = 0;
> > +   p.program->OutputsWritten = 0;
> >  
> >     build_tnl_program( &p );
> >  }
> > @@ -1652,10 +1651,10 @@ create_new_program( const struct state_key
> > *key,
> >   * Return a vertex program which implements the current fixed-
> > function
> >   * transform/lighting/texgen operations.
> >   */
> > -struct gl_vertex_program *
> > +struct gl_program *
> >  _mesa_get_fixed_func_vertex_program(struct gl_context *ctx)
> >  {
> > -   struct gl_vertex_program *prog;
> > +   struct gl_program *prog;
> >     struct state_key key;
> >  
> >     /* Grab all the relevant state and put it in a single
> > structure:
> > @@ -1664,15 +1663,15 @@ _mesa_get_fixed_func_vertex_program(struct
> > gl_context *ctx)
> >  
> >     /* Look for an already-prepared program for this state:
> >      */
> > -   prog = gl_vertex_program(
> > -      _mesa_search_program_cache(ctx->VertexProgram.Cache, &key,
> > sizeof(key)));
> > +   prog = _mesa_search_program_cache(ctx->VertexProgram.Cache,
> > &key,
> > +                                     sizeof(key));
> >  
> >     if (!prog) {
> >        /* OK, we'll have to build a new one */
> >        if (0)
> >           printf("Build new TNL program\n");
> >  
> > -      prog = gl_vertex_program(ctx->Driver.NewProgram(ctx,
> > GL_VERTEX_PROGRAM_ARB, 0));
> > +      prog = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB,
> > 0);
> >        if (!prog)
> >           return NULL;
> >  
> > @@ -1681,11 +1680,10 @@ _mesa_get_fixed_func_vertex_program(struct
> > gl_context *ctx)
> >                            ctx-
> > >Const.Program[MESA_SHADER_VERTEX].MaxTemps );
> >  
> >        if (ctx->Driver.ProgramStringNotify)
> > -         ctx->Driver.ProgramStringNotify( ctx,
> > GL_VERTEX_PROGRAM_ARB,
> > -                                          &prog->Base );
> > +         ctx->Driver.ProgramStringNotify(ctx,
> > GL_VERTEX_PROGRAM_ARB, prog);
> >  
> > -      _mesa_program_cache_insert(ctx, ctx->VertexProgram.Cache,
> > -                                 &key, sizeof(key), &prog->Base);
> > +      _mesa_program_cache_insert(ctx, ctx->VertexProgram.Cache,
> > &key,
> > +                                 sizeof(key), prog);
> >     }
> >  
> >     return prog;
> > diff --git a/src/mesa/main/ffvertex_prog.h
> > b/src/mesa/main/ffvertex_prog.h
> > index 648befd..0a67d48 100644
> > --- a/src/mesa/main/ffvertex_prog.h
> > +++ b/src/mesa/main/ffvertex_prog.h
> > @@ -32,7 +32,7 @@
> >  
> >  struct gl_context;
> >  
> > -struct gl_vertex_program *
> > +struct gl_program *
> >  _mesa_get_fixed_func_vertex_program(struct gl_context *ctx);
> >  
> >  
> > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> > index e79d37a..d54c1b3 100644
> > --- a/src/mesa/main/mtypes.h
> > +++ b/src/mesa/main/mtypes.h
> > @@ -1987,13 +1987,8 @@ struct gl_program
> >     GLuint NumNativeTexInstructions;
> >     GLuint NumNativeTexIndirections;
> >     /*@}*/
> > -};
> > -
> >  
> > -/** Vertex program object */
> > -struct gl_vertex_program
> > -{
> > -   struct gl_program Base;   /**< base class */
> > +   /** Used by ARB assembly-style Vertex program */
> >     GLboolean IsPositionInvariant;
> >  };
> >  
> > @@ -2071,13 +2066,13 @@ struct gl_vertex_program_state
> >     GLboolean TwoSideEnabled;     /**<
> > GL_VERTEX_PROGRAM_TWO_SIDE_ARB/NV */
> >     /** Computed two sided lighting for fixed function/programs. */
> >     GLboolean _TwoSideEnabled;
> > -   struct gl_vertex_program *Current;  /**< User-bound vertex
> > program */
> > +   struct gl_program *Current;  /**< User-bound vertex program */
> >  
> >     /** Currently enabled and valid vertex program (including
> > internal
> >      * programs, user-defined vertex programs and GLSL vertex
> > shaders).
> >      * This is the program we must use when rendering.
> >      */
> > -   struct gl_vertex_program *_Current;
> > +   struct gl_program *_Current;
> >  
> >     GLfloat Parameters[MAX_PROGRAM_ENV_PARAMS][4]; /**< Env params
> > */
> >  
> > @@ -2085,7 +2080,7 @@ struct gl_vertex_program_state
> >     GLboolean _MaintainTnlProgram;
> >  
> >     /** Program to emulate fixed-function T&L (see above) */
> > -   struct gl_vertex_program *_TnlProgram;
> > +   struct gl_program *_TnlProgram;
> >  
> >     /** Cache of fixed-function programs */
> >     struct gl_program_cache *Cache;
> > @@ -2779,7 +2774,7 @@ struct gl_shader_program
> >     /** Vertex shader state */
> >     struct {
> >        /**
> > -       * True if gl_ClipDistance is written to.  Copied into
> > gl_vertex_program
> > +       * True if gl_ClipDistance is written to.  Copied into
> > gl_program
> >         * by _mesa_copy_linked_program_data().
> >         */
> >        GLuint ClipDistanceArraySize; /**< Size of the
> > gl_ClipDistance array, or
> > @@ -3100,7 +3095,7 @@ struct gl_shared_state
> >      */
> >     /*@{*/
> >     struct _mesa_HashTable *Programs; /**< All vertex/fragment
> > programs */
> > -   struct gl_vertex_program *DefaultVertexProgram;
> > +   struct gl_program *DefaultVertexProgram;
> >     struct gl_fragment_program *DefaultFragmentProgram;
> >     /*@}*/
> >  
> > diff --git a/src/mesa/main/shared.c b/src/mesa/main/shared.c
> > index 49e5f02..5ff0b69 100644
> > --- a/src/mesa/main/shared.c
> > +++ b/src/mesa/main/shared.c
> > @@ -70,8 +70,7 @@ _mesa_alloc_shared_state(struct gl_context *ctx)
> >     shared->Programs = _mesa_NewHashTable();
> >  
> >     shared->DefaultVertexProgram =
> > -      gl_vertex_program(ctx->Driver.NewProgram(ctx,
> > -                                               GL_VERTEX_PROGRAM_A
> > RB, 0));
> > +      ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);
> >     shared->DefaultFragmentProgram =
> >        gl_fragment_program(ctx->Driver.NewProgram(ctx,
> >                                                   GL_FRAGMENT_PROGR
> > AM_ARB, 0));
> > @@ -332,7 +331,7 @@ free_shared_state(struct gl_context *ctx,
> > struct gl_shared_state *shared)
> >     _mesa_HashDeleteAll(shared->Programs, delete_program_cb, ctx);
> >     _mesa_DeleteHashTable(shared->Programs);
> >  
> > -   _mesa_reference_vertprog(ctx, &shared->DefaultVertexProgram,
> > NULL);
> > +   _mesa_reference_program(ctx, &shared->DefaultVertexProgram,
> > NULL);
> >     _mesa_reference_fragprog(ctx, &shared->DefaultFragmentProgram,
> > NULL);
> >  
> >     _mesa_HashDeleteAll(shared->ATIShaders, delete_fragshader_cb,
> > ctx);
> > diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
> > index 407ff38..b09b3fe 100644
> > --- a/src/mesa/main/state.c
> > +++ b/src/mesa/main/state.c
> > @@ -70,7 +70,7 @@ update_program_enables(struct gl_context *ctx)
> >      * GLSL shaders not relevant here.
> >      */
> >     ctx->VertexProgram._Enabled = ctx->VertexProgram.Enabled
> > -      && ctx->VertexProgram.Current->Base.Instructions;
> > +      && ctx->VertexProgram.Current->Instructions;
> >     ctx->FragmentProgram._Enabled = ctx->FragmentProgram.Enabled
> >        && ctx->FragmentProgram.Current->Base.Instructions;
> >     ctx->ATIFragmentShader._Enabled = ctx-
> > >ATIFragmentShader.Enabled
> > @@ -107,7 +107,7 @@ update_program(struct gl_context *ctx)
> >        ctx->_Shader->CurrentProgram[MESA_SHADER_FRAGMENT];
> >     const struct gl_shader_program *csProg =
> >        ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
> > -   const struct gl_vertex_program *prevVP = ctx-
> > >VertexProgram._Current;
> > +   const struct gl_program *prevVP = ctx->VertexProgram._Current;
> >     const struct gl_fragment_program *prevFP = ctx-
> > >FragmentProgram._Current;
> >     const struct gl_program *prevGP = ctx-
> > >GeometryProgram._Current;
> >     const struct gl_program *prevTCP = ctx-
> > >TessCtrlProgram._Current;
> > @@ -222,24 +222,24 @@ update_program(struct gl_context *ctx)
> >     if (vsProg && vsProg->LinkStatus
> >         && vsProg->_LinkedShaders[MESA_SHADER_VERTEX]) {
> >        /* Use GLSL vertex shader */
> > -      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current,
> > -			       gl_vertex_program(vsProg-
> > >_LinkedShaders[MESA_SHADER_VERTEX]->Program));
> > +      _mesa_reference_program(ctx, &ctx->VertexProgram._Current,
> > +                              vsProg-
> > >_LinkedShaders[MESA_SHADER_VERTEX]->Program);
> >     }
> >     else if (ctx->VertexProgram._Enabled) {
> >        /* Use user-defined vertex program */
> > -      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current,
> > -                               ctx->VertexProgram.Current);
> > +      _mesa_reference_program(ctx, &ctx->VertexProgram._Current,
> > +                              ctx->VertexProgram.Current);
> >     }
> >     else if (ctx->VertexProgram._MaintainTnlProgram) {
> >        /* Use vertex program generated from fixed-function state */
> > -      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current,
> > -                               _mesa_get_fixed_func_vertex_program
> > (ctx));
> > -      _mesa_reference_vertprog(ctx, &ctx-
> > >VertexProgram._TnlProgram,
> > -                               ctx->VertexProgram._Current);
> > +      _mesa_reference_program(ctx, &ctx->VertexProgram._Current,
> > +                              _mesa_get_fixed_func_vertex_program(
> > ctx));
> > +      _mesa_reference_program(ctx, &ctx-
> > >VertexProgram._TnlProgram,
> > +                              ctx->VertexProgram._Current);
> >     }
> >     else {
> >        /* no vertex program */
> > -      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current,
> > NULL);
> > +      _mesa_reference_program(ctx, &ctx->VertexProgram._Current,
> > NULL);
> >     }
> >  
> >     if (csProg && csProg->LinkStatus
> > @@ -290,7 +290,7 @@ update_program(struct gl_context *ctx)
> >        new_state |= _NEW_PROGRAM;
> >        if (ctx->Driver.BindProgram) {
> >           ctx->Driver.BindProgram(ctx, GL_VERTEX_PROGRAM_ARB,
> > -                            (struct gl_program *) ctx-
> > >VertexProgram._Current);
> > +                                 ctx->VertexProgram._Current);
> >        }
> >     }
> >  
> > @@ -328,7 +328,7 @@ update_program_constants(struct gl_context
> > *ctx)
> >  
> >     if (ctx->VertexProgram._Current) {
> >        const struct gl_program_parameter_list *params =
> > -         ctx->VertexProgram._Current->Base.Parameters;
> > +         ctx->VertexProgram._Current->Parameters;
> >        if (params && params->StateFlags & ctx->NewState) {
> >           new_state |= _NEW_PROGRAM_CONSTANTS;
> >        }
> > diff --git a/src/mesa/main/state.h b/src/mesa/main/state.h
> > index c57dc0e..95cde32 100644
> > --- a/src/mesa/main/state.h
> > +++ b/src/mesa/main/state.h
> > @@ -61,7 +61,7 @@ _mesa_need_secondary_color(const struct
> > gl_context *ctx)
> >  
> >     if (ctx->VertexProgram._Current &&
> >         (ctx->VertexProgram._Current != ctx-
> > >VertexProgram._TnlProgram) &&
> > -       (ctx->VertexProgram._Current->Base.InputsRead &
> > VERT_BIT_COLOR1))
> > +       (ctx->VertexProgram._Current->InputsRead &
> > VERT_BIT_COLOR1))
> >        return GL_TRUE;
> >  
> >     if (ctx->FragmentProgram._Current &&
> > diff --git a/src/mesa/program/arbprogparse.c
> > b/src/mesa/program/arbprogparse.c
> > index b7bddfe..80a0528 100644
> > --- a/src/mesa/program/arbprogparse.c
> > +++ b/src/mesa/program/arbprogparse.c
> > @@ -160,7 +160,7 @@ _mesa_parse_arb_fragment_program(struct
> > gl_context* ctx, GLenum target,
> >  void
> >  _mesa_parse_arb_vertex_program(struct gl_context *ctx, GLenum
> > target,
> >  			       const GLvoid *str, GLsizei len,
> > -			       struct gl_vertex_program *program)
> > +			       struct gl_program *program)
> >  {
> >     struct gl_program prog;
> >     struct asm_parser_state state;
> > @@ -180,37 +180,37 @@ _mesa_parse_arb_vertex_program(struct
> > gl_context *ctx, GLenum target,
> >     if ((ctx->_Shader->Flags & GLSL_NO_OPT) == 0)
> >        _mesa_optimize_program(ctx, &prog);
> >  
> > -   free(program->Base.String);
> > +   free(program->String);
> >  
> >     /* Copy the relevant contents of the arb_program struct into
> > the 
> >      * vertex_program struct.
> >      */
> > -   program->Base.String          = prog.String;
> > -   program->Base.NumInstructions = prog.NumInstructions;
> > -   program->Base.NumTemporaries  = prog.NumTemporaries;
> > -   program->Base.NumParameters   = prog.NumParameters;
> > -   program->Base.NumAttributes   = prog.NumAttributes;
> > -   program->Base.NumAddressRegs  = prog.NumAddressRegs;
> > -   program->Base.NumNativeInstructions =
> > prog.NumNativeInstructions;
> > -   program->Base.NumNativeTemporaries = prog.NumNativeTemporaries;
> > -   program->Base.NumNativeParameters = prog.NumNativeParameters;
> > -   program->Base.NumNativeAttributes = prog.NumNativeAttributes;
> > -   program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs;
> > -   program->Base.InputsRead     = prog.InputsRead;
> > -   program->Base.OutputsWritten = prog.OutputsWritten;
> > -   program->Base.IndirectRegisterFiles =
> > prog.IndirectRegisterFiles;
> > +   program->String          = prog.String;
> > +   program->NumInstructions = prog.NumInstructions;
> > +   program->NumTemporaries  = prog.NumTemporaries;
> > +   program->NumParameters   = prog.NumParameters;
> > +   program->NumAttributes   = prog.NumAttributes;
> > +   program->NumAddressRegs  = prog.NumAddressRegs;
> > +   program->NumNativeInstructions = prog.NumNativeInstructions;
> > +   program->NumNativeTemporaries = prog.NumNativeTemporaries;
> > +   program->NumNativeParameters = prog.NumNativeParameters;
> > +   program->NumNativeAttributes = prog.NumNativeAttributes;
> > +   program->NumNativeAddressRegs = prog.NumNativeAddressRegs;
> > +   program->InputsRead     = prog.InputsRead;
> > +   program->OutputsWritten = prog.OutputsWritten;
> > +   program->IndirectRegisterFiles = prog.IndirectRegisterFiles;
> >     program->IsPositionInvariant = (state.option.PositionInvariant)
> >        ? GL_TRUE : GL_FALSE;
> >  
> > -   free(program->Base.Instructions);
> > -   program->Base.Instructions = prog.Instructions;
> > +   free(program->Instructions);
> > +   program->Instructions = prog.Instructions;
> >  
> > -   if (program->Base.Parameters)
> > -      _mesa_free_parameter_list(program->Base.Parameters);
> > -   program->Base.Parameters = prog.Parameters; 
> > +   if (program->Parameters)
> > +      _mesa_free_parameter_list(program->Parameters);
> > +   program->Parameters = prog.Parameters;
> >  
> >  #if DEBUG_VP
> > -   printf("____________Vertex program %u __________\n", program-
> > >Base.Id);
> > -   _mesa_print_program(&program->Base);
> > +   printf("____________Vertex program %u __________\n", program-
> > >Id);
> > +   _mesa_print_program(program);
> >  #endif
> >  }
> > diff --git a/src/mesa/program/arbprogparse.h
> > b/src/mesa/program/arbprogparse.h
> > index 39d2116..05d93f0 100644
> > --- a/src/mesa/program/arbprogparse.h
> > +++ b/src/mesa/program/arbprogparse.h
> > @@ -35,7 +35,7 @@ struct gl_vertex_program;
> >  extern void
> >  _mesa_parse_arb_vertex_program(struct gl_context *ctx, GLenum
> > target,
> >  			       const GLvoid *str, GLsizei len,
> > -			       struct gl_vertex_program *program);
> > +                               struct gl_program *program);
> >  
> >  extern void
> >  _mesa_parse_arb_fragment_program(struct gl_context *ctx, GLenum
> > target,
> > diff --git a/src/mesa/program/prog_statevars.c
> > b/src/mesa/program/prog_statevars.c
> > index 2ac7b56..110dfda 100644
> > --- a/src/mesa/program/prog_statevars.c
> > +++ b/src/mesa/program/prog_statevars.c
> > @@ -399,14 +399,14 @@ _mesa_fetch_state(struct gl_context *ctx,
> > const gl_state_index state[],
> >                 COPY_4V(value, ctx->VertexProgram.Parameters[idx]);
> >                 return;
> >              case STATE_LOCAL:
> > -               if (!ctx->VertexProgram.Current->Base.LocalParams)
> > {
> > -                  ctx->VertexProgram.Current->Base.LocalParams =
> > +               if (!ctx->VertexProgram.Current->LocalParams) {
> > +                  ctx->VertexProgram.Current->LocalParams =
> >                       calloc(MAX_PROGRAM_LOCAL_PARAMS,
> > sizeof(float[4]));
> > -                  if (!ctx->VertexProgram.Current-
> > >Base.LocalParams)
> > +                  if (!ctx->VertexProgram.Current->LocalParams)
> >                       return;
> >                 }
> >  
> > -               COPY_4V(value, ctx->VertexProgram.Current-
> > >Base.LocalParams[idx]);
> > +               COPY_4V(value, ctx->VertexProgram.Current-
> > >LocalParams[idx]);
> >                 return;
> >              default:
> >                 _mesa_problem(ctx, "Bad state switch in
> > _mesa_fetch_state()");
> > diff --git a/src/mesa/program/program.c
> > b/src/mesa/program/program.c
> > index 28af5b5..a72e6a1 100644
> > --- a/src/mesa/program/program.c
> > +++ b/src/mesa/program/program.c
> > @@ -87,8 +87,8 @@ _mesa_init_program(struct gl_context *ctx)
> >     ctx->VertexProgram.PointSizeEnabled =
> >        (ctx->API == API_OPENGLES2) ? GL_TRUE : GL_FALSE;
> >     ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
> > -   _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current,
> > -                            ctx->Shared->DefaultVertexProgram);
> > +   _mesa_reference_program(ctx, &ctx->VertexProgram.Current,
> > +                           ctx->Shared->DefaultVertexProgram);
> >     assert(ctx->VertexProgram.Current);
> >     ctx->VertexProgram.Cache = _mesa_new_program_cache();
> >  
> > @@ -112,7 +112,7 @@ _mesa_init_program(struct gl_context *ctx)
> >  void
> >  _mesa_free_program_data(struct gl_context *ctx)
> >  {
> > -   _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current,
> > NULL);
> > +   _mesa_reference_program(ctx, &ctx->VertexProgram.Current,
> > NULL);
> >     _mesa_delete_program_cache(ctx, ctx->VertexProgram.Cache);
> >     _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current,
> > NULL);
> >     _mesa_delete_shader_cache(ctx, ctx->FragmentProgram.Cache);
> > @@ -137,8 +137,8 @@ _mesa_free_program_data(struct gl_context *ctx)
> >  void
> >  _mesa_update_default_objects_program(struct gl_context *ctx)
> >  {
> > -   _mesa_reference_vertprog(ctx, &ctx->VertexProgram.Current,
> > -                            ctx->Shared->DefaultVertexProgram);
> > +   _mesa_reference_program(ctx, &ctx->VertexProgram.Current,
> > +                           ctx->Shared->DefaultVertexProgram);
> >     assert(ctx->VertexProgram.Current);
> >  
> >     _mesa_reference_fragprog(ctx, &ctx->FragmentProgram.Current,
> > @@ -215,14 +215,11 @@ struct gl_program *
> >  _mesa_new_program(struct gl_context *ctx, GLenum target, GLuint
> > id)
> >  {
> >     switch (target) {
> > -   case GL_VERTEX_PROGRAM_ARB: { /* == GL_VERTEX_PROGRAM_NV */
> > -      struct gl_vertex_program *prog =
> > CALLOC_STRUCT(gl_vertex_program);
> > -      return _mesa_init_gl_program(&prog->Base, target, id);
> > -   }
> >     case GL_FRAGMENT_PROGRAM_ARB: {
> >        struct gl_fragment_program *prog =
> > CALLOC_STRUCT(gl_fragment_program);
> >        return _mesa_init_gl_program(&prog->Base, target, id);
> >     }
> > +   case GL_VERTEX_PROGRAM_ARB: /* == GL_VERTEX_PROGRAM_NV */
> >     case GL_GEOMETRY_PROGRAM_NV:
> >     case GL_TESS_CONTROL_PROGRAM_NV:
> >     case GL_TESS_EVALUATION_PROGRAM_NV: {
> > diff --git a/src/mesa/program/program.h
> > b/src/mesa/program/program.h
> > index a909dcc..5f322da 100644
> > --- a/src/mesa/program/program.h
> > +++ b/src/mesa/program/program.h
> > @@ -90,15 +90,6 @@ _mesa_reference_program(struct gl_context *ctx,
> >  }
> >  
> >  static inline void
> > -_mesa_reference_vertprog(struct gl_context *ctx,
> > -                         struct gl_vertex_program **ptr,
> > -                         struct gl_vertex_program *prog)
> > -{
> > -   _mesa_reference_program(ctx, (struct gl_program **) ptr,
> > -                           (struct gl_program *) prog);
> > -}
> > -
> > -static inline void
> >  _mesa_reference_fragprog(struct gl_context *ctx,
> >                           struct gl_fragment_program **ptr,
> >                           struct gl_fragment_program *prog)
> > @@ -184,10 +175,6 @@ _mesa_shader_stage_to_program(unsigned stage)
> >  }
> >  
> >  
> > -/* Cast wrappers from gl_program to derived program types.
> > - * (e.g. gl_vertex_program)
> > - */
> > -
> >  static inline struct gl_fragment_program *
> >  gl_fragment_program(struct gl_program *prog)
> >  {
> > @@ -200,19 +187,6 @@ gl_fragment_program_const(const struct
> > gl_program *prog)
> >     return (const struct gl_fragment_program *) prog;
> >  }
> >  
> > -
> > -static inline struct gl_vertex_program *
> > -gl_vertex_program(struct gl_program *prog)
> > -{
> > -   return (struct gl_vertex_program *) prog;
> > -}
> > -
> > -static inline const struct gl_vertex_program *
> > -gl_vertex_program_const(const struct gl_program *prog)
> > -{
> > -   return (const struct gl_vertex_program *) prog;
> > -}
> > -
> >  static inline struct gl_compute_program *
> >  gl_compute_program(struct gl_program *prog)
> >  {
> > diff --git a/src/mesa/program/programopt.c
> > b/src/mesa/program/programopt.c
> > index 4dd9998..4610035 100644
> > --- a/src/mesa/program/programopt.c
> > +++ b/src/mesa/program/programopt.c
> > @@ -46,10 +46,10 @@
> >   * May be used to implement the position_invariant option.
> >   */
> >  static void
> > -_mesa_insert_mvp_dp4_code(struct gl_context *ctx, struct
> > gl_vertex_program *vprog)
> > +_mesa_insert_mvp_dp4_code(struct gl_context *ctx, struct
> > gl_program *vprog)
> >  {
> >     struct prog_instruction *newInst;
> > -   const GLuint origLen = vprog->Base.NumInstructions;
> > +   const GLuint origLen = vprog->NumInstructions;
> >     const GLuint newLen = origLen + 4;
> >     GLuint i;
> >  
> > @@ -66,8 +66,7 @@ _mesa_insert_mvp_dp4_code(struct gl_context *ctx,
> > struct gl_vertex_program *vpro
> >     GLint mvpRef[4];
> >  
> >     for (i = 0; i < 4; i++) {
> > -      mvpRef[i] = _mesa_add_state_reference(vprog-
> > >Base.Parameters,
> > -                                            mvpState[i]);
> > +      mvpRef[i] = _mesa_add_state_reference(vprog->Parameters,
> > mvpState[i]);
> >     }
> >  
> >     /* Alloc storage for new instructions */
> > @@ -100,24 +99,24 @@ _mesa_insert_mvp_dp4_code(struct gl_context
> > *ctx, struct gl_vertex_program *vpro
> >     }
> >  
> >     /* Append original instructions after new instructions */
> > -   _mesa_copy_instructions (newInst + 4, vprog->Base.Instructions, 
> > origLen);
> > +   _mesa_copy_instructions (newInst + 4, vprog->Instructions,
> > origLen);
> >  
> >     /* free old instructions */
> > -   _mesa_free_instructions(vprog->Base.Instructions, origLen);
> > +   _mesa_free_instructions(vprog->Instructions, origLen);
> >  
> >     /* install new instructions */
> > -   vprog->Base.Instructions = newInst;
> > -   vprog->Base.NumInstructions = newLen;
> > -   vprog->Base.InputsRead |= VERT_BIT_POS;
> > -   vprog->Base.OutputsWritten |= BITFIELD64_BIT(VARYING_SLOT_POS);
> > +   vprog->Instructions = newInst;
> > +   vprog->NumInstructions = newLen;
> > +   vprog->InputsRead |= VERT_BIT_POS;
> > +   vprog->OutputsWritten |= BITFIELD64_BIT(VARYING_SLOT_POS);
> >  }
> >  
> >  
> >  static void
> > -_mesa_insert_mvp_mad_code(struct gl_context *ctx, struct
> > gl_vertex_program *vprog)
> > +_mesa_insert_mvp_mad_code(struct gl_context *ctx, struct
> > gl_program *vprog)
> >  {
> >     struct prog_instruction *newInst;
> > -   const GLuint origLen = vprog->Base.NumInstructions;
> > +   const GLuint origLen = vprog->NumInstructions;
> >     const GLuint newLen = origLen + 4;
> >     GLuint hposTemp;
> >     GLuint i;
> > @@ -135,8 +134,7 @@ _mesa_insert_mvp_mad_code(struct gl_context
> > *ctx, struct gl_vertex_program *vpro
> >     GLint mvpRef[4];
> >  
> >     for (i = 0; i < 4; i++) {
> > -      mvpRef[i] = _mesa_add_state_reference(vprog-
> > >Base.Parameters,
> > -                                            mvpState[i]);
> > +      mvpRef[i] = _mesa_add_state_reference(vprog->Parameters,
> > mvpState[i]);
> >     }
> >  
> >     /* Alloc storage for new instructions */
> > @@ -148,7 +146,7 @@ _mesa_insert_mvp_mad_code(struct gl_context
> > *ctx, struct gl_vertex_program *vpro
> >     }
> >  
> >     /* TEMP hposTemp; */
> > -   hposTemp = vprog->Base.NumTemporaries++;
> > +   hposTemp = vprog->NumTemporaries++;
> >  
> >     /*
> >      * Generated instructions:
> > @@ -202,21 +200,21 @@ _mesa_insert_mvp_mad_code(struct gl_context
> > *ctx, struct gl_vertex_program *vpro
> >  
> >  
> >     /* Append original instructions after new instructions */
> > -   _mesa_copy_instructions (newInst + 4, vprog->Base.Instructions, 
> > origLen);
> > +   _mesa_copy_instructions (newInst + 4, vprog->Instructions,
> > origLen);
> >  
> >     /* free old instructions */
> > -   _mesa_free_instructions(vprog->Base.Instructions, origLen);
> > +   _mesa_free_instructions(vprog->Instructions, origLen);
> >  
> >     /* install new instructions */
> > -   vprog->Base.Instructions = newInst;
> > -   vprog->Base.NumInstructions = newLen;
> > -   vprog->Base.InputsRead |= VERT_BIT_POS;
> > -   vprog->Base.OutputsWritten |= BITFIELD64_BIT(VARYING_SLOT_POS);
> > +   vprog->Instructions = newInst;
> > +   vprog->NumInstructions = newLen;
> > +   vprog->InputsRead |= VERT_BIT_POS;
> > +   vprog->OutputsWritten |= BITFIELD64_BIT(VARYING_SLOT_POS);
> >  }
> >  
> >  
> >  void
> > -_mesa_insert_mvp_code(struct gl_context *ctx, struct
> > gl_vertex_program *vprog)
> > +_mesa_insert_mvp_code(struct gl_context *ctx, struct gl_program
> > *vprog)
> >  {
> >     if (ctx-
> > >Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].OptimizeForAOS)
> >        _mesa_insert_mvp_dp4_code( ctx, vprog );
> > diff --git a/src/mesa/program/programopt.h
> > b/src/mesa/program/programopt.h
> > index 1520d16..2a76da4 100644
> > --- a/src/mesa/program/programopt.h
> > +++ b/src/mesa/program/programopt.h
> > @@ -35,7 +35,7 @@ extern "C" {
> >  
> >  
> >  extern void
> > -_mesa_insert_mvp_code(struct gl_context *ctx, struct
> > gl_vertex_program *vprog);
> > +_mesa_insert_mvp_code(struct gl_context *ctx, struct gl_program
> > *vprog);
> >  
> >  extern void
> >  _mesa_append_fog_code(struct gl_context *ctx,
> > diff --git a/src/mesa/state_tracker/st_atom.c
> > b/src/mesa/state_tracker/st_atom.c
> > index dc4e143..573615e 100644
> > --- a/src/mesa/state_tracker/st_atom.c
> > +++ b/src/mesa/state_tracker/st_atom.c
> > @@ -69,7 +69,7 @@ static void check_program_state( struct
> > st_context *st )
> >     struct st_geometry_program *old_gp = st->gp;
> >     struct st_fragment_program *old_fp = st->fp;
> >  
> > -   struct gl_vertex_program *new_vp = ctx->VertexProgram._Current;
> > +   struct gl_program *new_vp = ctx->VertexProgram._Current;
> >     struct gl_program *new_tcp = ctx->TessCtrlProgram._Current;
> >     struct gl_program *new_tep = ctx->TessEvalProgram._Current;
> >     struct gl_program *new_gp = ctx->GeometryProgram._Current;
> > @@ -122,7 +122,7 @@ static void check_attrib_edgeflag(struct
> > st_context *st)
> >  {
> >     const struct gl_client_array **arrays = st->ctx-
> > >Array._DrawArrays;
> >     GLboolean vertdata_edgeflags, edgeflag_culls_prims,
> > edgeflags_enabled;
> > -   struct gl_vertex_program *vp = st->ctx->VertexProgram._Current;
> > +   struct gl_program *vp = st->ctx->VertexProgram._Current;
> >  
> >     if (!arrays)
> >        return;
> > diff --git a/src/mesa/state_tracker/st_atom_constbuf.c
> > b/src/mesa/state_tracker/st_atom_constbuf.c
> > index 74d18e3..bc9a156 100644
> > --- a/src/mesa/state_tracker/st_atom_constbuf.c
> > +++ b/src/mesa/state_tracker/st_atom_constbuf.c
> > @@ -142,7 +142,7 @@ void st_upload_constants( struct st_context
> > *st,
> >  static void update_vs_constants(struct st_context *st )
> >  {
> >     struct st_vertex_program *vp = st->vp;
> > -   struct gl_program_parameter_list *params = vp-
> > >Base.Base.Parameters;
> > +   struct gl_program_parameter_list *params = vp->Base.Parameters;
> >  
> >     st_upload_constants( st, params, MESA_SHADER_VERTEX );
> >  }
> > diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c
> > b/src/mesa/state_tracker/st_atom_rasterizer.c
> > index 1598f5e..e365a45 100644
> > --- a/src/mesa/state_tracker/st_atom_rasterizer.c
> > +++ b/src/mesa/state_tracker/st_atom_rasterizer.c
> > @@ -62,7 +62,7 @@ static void update_raster_state( struct
> > st_context *st )
> >  {
> >     struct gl_context *ctx = st->ctx;
> >     struct pipe_rasterizer_state *raster = &st->state.rasterizer;
> > -   const struct gl_vertex_program *vertProg = ctx-
> > >VertexProgram._Current;
> > +   const struct gl_program *vertProg = ctx-
> > >VertexProgram._Current;
> >     const struct gl_fragment_program *fragProg = ctx-
> > >FragmentProgram._Current;
> >  
> >     memset(raster, 0, sizeof(*raster));
> > @@ -194,8 +194,8 @@ static void update_raster_state( struct
> > st_context *st )
> >     /* ST_NEW_VERTEX_PROGRAM
> >      */
> >     if (vertProg) {
> > -      if (vertProg->Base.Id == 0) {
> > -         if (vertProg->Base.OutputsWritten &
> > BITFIELD64_BIT(VARYING_SLOT_PSIZ)) {
> > +      if (vertProg->Id == 0) {
> > +         if (vertProg->OutputsWritten &
> > BITFIELD64_BIT(VARYING_SLOT_PSIZ)) {
> >              /* generated program which emits point size */
> >              raster->point_size_per_vertex = TRUE;
> >           }
> > @@ -213,7 +213,7 @@ static void update_raster_state( struct
> > st_context *st )
> >           else if (ctx->TessEvalProgram._Current)
> >              last = ctx->TessEvalProgram._Current;
> >           else if (ctx->VertexProgram._Current)
> > -            last = &ctx->VertexProgram._Current->Base;
> > +            last = ctx->VertexProgram._Current;
> >           if (last)
> >              raster->point_size_per_vertex =
> >                 !!(last->OutputsWritten &
> > BITFIELD64_BIT(VARYING_SLOT_PSIZ));
> > diff --git a/src/mesa/state_tracker/st_atom_sampler.c
> > b/src/mesa/state_tracker/st_atom_sampler.c
> > index f170298..91baa59 100644
> > --- a/src/mesa/state_tracker/st_atom_sampler.c
> > +++ b/src/mesa/state_tracker/st_atom_sampler.c
> > @@ -328,7 +328,7 @@ update_samplers(struct st_context *st)
> >  
> >     update_shader_samplers(st,
> >                            PIPE_SHADER_VERTEX,
> > -                          &ctx->VertexProgram._Current->Base,
> > +                          ctx->VertexProgram._Current,
> >                            ctx-
> > >Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
> >                            st->state.samplers[PIPE_SHADER_VERTEX],
> >                            &st-
> > >state.num_samplers[PIPE_SHADER_VERTEX]);
> > diff --git a/src/mesa/state_tracker/st_atom_shader.c
> > b/src/mesa/state_tracker/st_atom_shader.c
> > index 02f789c..554e342 100644
> > --- a/src/mesa/state_tracker/st_atom_shader.c
> > +++ b/src/mesa/state_tracker/st_atom_shader.c
> > @@ -175,7 +175,7 @@ update_vp( struct st_context *st )
> >      */
> >     assert(st->ctx->VertexProgram._Current);
> >     stvp = st_vertex_program(st->ctx->VertexProgram._Current);
> > -   assert(stvp->Base.Base.Target == GL_VERTEX_PROGRAM_ARB);
> > +   assert(stvp->Base.Target == GL_VERTEX_PROGRAM_ARB);
> >  
> >     memset(&key, 0, sizeof key);
> >     key.st = st->has_shareable_shaders ? NULL : st;
> > @@ -190,7 +190,7 @@ update_vp( struct st_context *st )
> >  
> >     key.clamp_color = st->clamp_vert_color_in_shader &&
> >                       st->ctx->Light._ClampVertexColor &&
> > -                     (stvp->Base.Base.OutputsWritten &
> > +                     (stvp->Base.OutputsWritten &
> >                        (VARYING_SLOT_COL0 |
> >                         VARYING_SLOT_COL1 |
> >                         VARYING_SLOT_BFC0 |
> > diff --git a/src/mesa/state_tracker/st_atom_texture.c
> > b/src/mesa/state_tracker/st_atom_texture.c
> > index df77a38..e4257dd 100644
> > --- a/src/mesa/state_tracker/st_atom_texture.c
> > +++ b/src/mesa/state_tracker/st_atom_texture.c
> > @@ -207,7 +207,7 @@ update_vertex_textures(struct st_context *st)
> >     if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits 
> > > 0) {
> >        update_textures(st,
> >                        MESA_SHADER_VERTEX,
> > -                      &ctx->VertexProgram._Current->Base,
> > +                      ctx->VertexProgram._Current,
> >                        ctx-
> > >Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
> >                        st->state.sampler_views[PIPE_SHADER_VERTEX],
> >                        &st-
> > >state.num_sampler_views[PIPE_SHADER_VERTEX]);
> > diff --git a/src/mesa/state_tracker/st_cb_feedback.c
> > b/src/mesa/state_tracker/st_cb_feedback.c
> > index d624d9f..7f383eb 100644
> > --- a/src/mesa/state_tracker/st_cb_feedback.c
> > +++ b/src/mesa/state_tracker/st_cb_feedback.c
> > @@ -292,7 +292,7 @@ st_RenderMode(struct gl_context *ctx, GLenum
> > newMode )
> >        vbo_set_draw_func(ctx, st_feedback_draw_vbo);
> >     }
> >     else {
> > -      struct gl_vertex_program *vp = st->ctx-
> > >VertexProgram._Current;
> > +      struct gl_program *vp = st->ctx->VertexProgram._Current;
> >  
> >        if (!st->feedback_stage)
> >           st->feedback_stage = draw_glfeedback_stage(ctx, draw);
> > diff --git a/src/mesa/state_tracker/st_cb_program.c
> > b/src/mesa/state_tracker/st_cb_program.c
> > index 6dce2f6..fb0bdd2 100644
> > --- a/src/mesa/state_tracker/st_cb_program.c
> > +++ b/src/mesa/state_tracker/st_cb_program.c
> > @@ -59,7 +59,7 @@ st_new_program(struct gl_context *ctx, GLenum
> > target, GLuint id)
> >     switch (target) {
> >     case GL_VERTEX_PROGRAM_ARB: {
> >        struct st_vertex_program *prog =
> > ST_CALLOC_STRUCT(st_vertex_program);
> > -      return _mesa_init_gl_program(&prog->Base.Base, target, id);
> > +      return _mesa_init_gl_program(&prog->Base, target, id);
> >     }
> >     case GL_FRAGMENT_PROGRAM_ARB: {
> >        struct st_fragment_program *prog =
> > ST_CALLOC_STRUCT(st_fragment_program);
> > diff --git a/src/mesa/state_tracker/st_debug.c
> > b/src/mesa/state_tracker/st_debug.c
> > index b51f350..1e5bbba 100644
> > --- a/src/mesa/state_tracker/st_debug.c
> > +++ b/src/mesa/state_tracker/st_debug.c
> > @@ -98,8 +98,8 @@ st_print_current(void)
> >  
> >     if (st->vp->variants)
> >        tgsi_dump( st->vp->variants[0].tgsi.tokens, 0 );
> > -   if (st->vp->Base.Base.Parameters)
> > -      _mesa_print_parameter_list(st->vp->Base.Base.Parameters);
> > +   if (st->vp->Base.Parameters)
> > +      _mesa_print_parameter_list(st->vp->Base.Parameters);
> >  
> >     tgsi_dump(st->fp->tgsi.tokens, 0);
> >     if (st->fp->Base.Base.Parameters)
> > diff --git a/src/mesa/state_tracker/st_program.c
> > b/src/mesa/state_tracker/st_program.c
> > index 9f90f6b..e671e12 100644
> > --- a/src/mesa/state_tracker/st_program.c
> > +++ b/src/mesa/state_tracker/st_program.c
> > @@ -250,11 +250,11 @@ st_translate_vertex_program(struct st_context
> > *st,
> >      * and TGSI generic input indexes, plus input attrib semantic
> > info.
> >      */
> >     for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
> > -      if ((stvp->Base.Base.InputsRead & BITFIELD64_BIT(attr)) !=
> > 0) {
> > +      if ((stvp->Base.InputsRead & BITFIELD64_BIT(attr)) != 0) {
> >           input_to_index[attr] = stvp->num_inputs;
> >           stvp->index_to_input[stvp->num_inputs] = attr;
> >           stvp->num_inputs++;
> > -         if ((stvp->Base.Base.DoubleInputsRead &
> > BITFIELD64_BIT(attr)) != 0) {
> > +         if ((stvp->Base.DoubleInputsRead & BITFIELD64_BIT(attr))
> > != 0) {
> >              /* add placeholder for second part of a double
> > attribute */
> >              stvp->index_to_input[stvp->num_inputs] =
> > ST_DOUBLE_ATTRIB_PLACEHOLDER;
> >              stvp->num_inputs++;
> > @@ -268,7 +268,7 @@ st_translate_vertex_program(struct st_context
> > *st,
> >     /* Compute mapping of vertex program outputs to slots.
> >      */
> >     for (attr = 0; attr < VARYING_SLOT_MAX; attr++) {
> > -      if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr))
> > == 0) {
> > +      if ((stvp->Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0)
> > {
> >           stvp->result_to_output[attr] = ~0;
> >        }
> >        else {
> > @@ -367,7 +367,7 @@ st_translate_vertex_program(struct st_context
> > *st,
> >  
> >     /* ARB_vp: */
> >     if (!stvp->glsl_to_tgsi && !stvp->shader_program) {
> > -      _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT);
> > +      _mesa_remove_output_reads(&stvp->Base, PROGRAM_OUTPUT);
> >  
> >        /* This determines which states will be updated when the
> > assembly
> >         * shader is bound.
> > @@ -376,15 +376,14 @@ st_translate_vertex_program(struct st_context
> > *st,
> >                                ST_NEW_RASTERIZER |
> >                                ST_NEW_VERTEX_ARRAYS;
> >  
> > -      if (stvp->Base.Base.Parameters->NumParameters)
> > +      if (stvp->Base.Parameters->NumParameters)
> >           stvp->affected_states |= ST_NEW_VS_CONSTANTS;
> >  
> >        /* No samplers are allowed in ARB_vp. */
> >     }
> >  
> >     if (stvp->shader_program) {
> > -      nir_shader *nir = st_glsl_to_nir(st, &stvp->Base.Base,
> > -                                       stvp->shader_program,
> > +      nir_shader *nir = st_glsl_to_nir(st, &stvp->Base, stvp-
> > >shader_program,
> >                                         MESA_SHADER_VERTEX);
> >  
> >        stvp->tgsi.type = PIPE_SHADER_IR_NIR;
> > @@ -400,16 +399,16 @@ st_translate_vertex_program(struct st_context
> > *st,
> >     if (ureg == NULL)
> >        return false;
> >  
> > -   if (stvp->Base.Base.ClipDistanceArraySize)
> > +   if (stvp->Base.ClipDistanceArraySize)
> >        ureg_property(ureg, TGSI_PROPERTY_NUM_CLIPDIST_ENABLED,
> > -                    stvp->Base.Base.ClipDistanceArraySize);
> > -   if (stvp->Base.Base.CullDistanceArraySize)
> > +                    stvp->Base.ClipDistanceArraySize);
> > +   if (stvp->Base.CullDistanceArraySize)
> >        ureg_property(ureg, TGSI_PROPERTY_NUM_CULLDIST_ENABLED,
> > -                    stvp->Base.Base.CullDistanceArraySize);
> > +                    stvp->Base.CullDistanceArraySize);
> >  
> >     if (ST_DEBUG & DEBUG_MESA) {
> > -      _mesa_print_program(&stvp->Base.Base);
> > -      _mesa_print_program_parameters(st->ctx, &stvp->Base.Base);
> > +      _mesa_print_program(&stvp->Base);
> > +      _mesa_print_program_parameters(st->ctx, &stvp->Base);
> >        debug_printf("\n");
> >     }
> >  
> > @@ -418,7 +417,7 @@ st_translate_vertex_program(struct st_context
> > *st,
> >                                     PIPE_SHADER_VERTEX,
> >                                     ureg,
> >                                     stvp->glsl_to_tgsi,
> > -                                   &stvp->Base.Base,
> > +                                   &stvp->Base,
> >                                     /* inputs */
> >                                     stvp->num_inputs,
> >                                     input_to_index,
> > @@ -444,7 +443,7 @@ st_translate_vertex_program(struct st_context
> > *st,
> >        error = st_translate_mesa_program(st->ctx,
> >                                          PIPE_SHADER_VERTEX,
> >                                          ureg,
> > -                                        &stvp->Base.Base,
> > +                                        &stvp->Base,
> >                                          /* inputs */
> >                                          stvp->num_inputs,
> >                                          input_to_index,
> > @@ -459,7 +458,7 @@ st_translate_vertex_program(struct st_context
> > *st,
> >  
> >     if (error) {
> >        debug_printf("%s: failed to translate Mesa program:\n",
> > __func__);
> > -      _mesa_print_program(&stvp->Base.Base);
> > +      _mesa_print_program(&stvp->Base);
> >        debug_assert(0);
> >        return false;
> >     }
> > @@ -489,7 +488,7 @@ st_create_vp_variant(struct st_context *st,
> >        if (key->passthrough_edgeflags)
> >           NIR_PASS_V(vpv->tgsi.ir.nir,
> > nir_lower_passthrough_edgeflags);
> >  
> > -      st_finalize_nir(st, &stvp->Base.Base, vpv->tgsi.ir.nir);
> > +      st_finalize_nir(st, &stvp->Base, vpv->tgsi.ir.nir);
> >  
> >        vpv->driver_shader = pipe->create_vs_state(pipe, &vpv-
> > >tgsi);
> >        /* driver takes ownership of IR: */
> > @@ -1913,7 +1912,7 @@ st_print_current_vertex_program(void)
> >           (struct st_vertex_program *) ctx->VertexProgram._Current;
> >        struct st_vp_variant *stv;
> >  
> > -      debug_printf("Vertex program %u\n", stvp->Base.Base.Id);
> > +      debug_printf("Vertex program %u\n", stvp->Base.Id);
> >  
> >        for (stv = stvp->variants; stv; stv = stv->next) {
> >           debug_printf("variant %p\n", stv);
> > diff --git a/src/mesa/state_tracker/st_program.h
> > b/src/mesa/state_tracker/st_program.h
> > index ab01d7b..0263c8e 100644
> > --- a/src/mesa/state_tracker/st_program.h
> > +++ b/src/mesa/state_tracker/st_program.h
> > @@ -201,7 +201,7 @@ struct st_vp_variant
> >   */
> >  struct st_vertex_program
> >  {
> > -   struct gl_vertex_program Base;  /**< The Mesa vertex program */
> > +   struct gl_program Base;  /**< The Mesa vertex program */
> >     struct pipe_shader_state tgsi;
> >     struct glsl_to_tgsi_visitor* glsl_to_tgsi;
> >     uint64_t affected_states; /**< ST_NEW_* flags to mark dirty
> > when binding */
> > @@ -309,7 +309,7 @@ st_fragment_program( struct gl_fragment_program
> > *fp )
> >  
> >  
> >  static inline struct st_vertex_program *
> > -st_vertex_program( struct gl_vertex_program *vp )
> > +st_vertex_program( struct gl_program *vp )
> >  {
> >     return (struct st_vertex_program *)vp;
> >  }
> > diff --git a/src/mesa/tnl/t_context.c b/src/mesa/tnl/t_context.c
> > index b5c0b3e..3810043 100644
> > --- a/src/mesa/tnl/t_context.c
> > +++ b/src/mesa/tnl/t_context.c
> > @@ -131,7 +131,7 @@ void
> >  _tnl_InvalidateState( struct gl_context *ctx, GLuint new_state )
> >  {
> >     TNLcontext *tnl = TNL_CONTEXT(ctx);
> > -   const struct gl_vertex_program *vp = ctx-
> > >VertexProgram._Current;
> > +   const struct gl_program *vp = ctx->VertexProgram._Current;
> >     const struct gl_fragment_program *fp = ctx-
> > >FragmentProgram._Current;
> >     GLuint i;
> >  
> > @@ -183,7 +183,7 @@ _tnl_InvalidateState( struct gl_context *ctx,
> > GLuint new_state )
> >     if (vp) {
> >        GLuint i;
> >        for (i = 0; i < MAX_VARYING; i++) {
> > -	 if (vp->Base.OutputsWritten &
> > BITFIELD64_BIT(VARYING_SLOT_VAR0 + i)) {
> > +	 if (vp->OutputsWritten & BITFIELD64_BIT(VARYING_SLOT_VAR0
> > + i)) {
> >              tnl->render_inputs_bitset |=
> > BITFIELD64_BIT(_TNL_ATTRIB_GENERIC(i));
> >           }
> >        }
> > diff --git a/src/mesa/tnl/t_vb_program.c
> > b/src/mesa/tnl/t_vb_program.c
> > index 55c44d1..c0a48a0 100644
> > --- a/src/mesa/tnl/t_vb_program.c
> > +++ b/src/mesa/tnl/t_vb_program.c
> > @@ -237,7 +237,7 @@ init_machine(struct gl_context *ctx, struct
> > gl_program_machine *machine,
> >     machine->FetchTexelLod = vp_fetch_texel;
> >     machine->FetchTexelDeriv = NULL; /* not used by vertex programs
> > */
> >  
> > -   machine->Samplers = ctx->VertexProgram._Current-
> > >Base.SamplerUnits;
> > +   machine->Samplers = ctx->VertexProgram._Current->SamplerUnits;
> >  
> >     machine->SystemValues[SYSTEM_VALUE_INSTANCE_ID][0] = (GLfloat)
> > instID;
> >  }
> > @@ -247,12 +247,12 @@ init_machine(struct gl_context *ctx, struct
> > gl_program_machine *machine,
> >   * Map the texture images which the vertex program will access (if
> > any).
> >   */
> >  static void
> > -map_textures(struct gl_context *ctx, const struct
> > gl_vertex_program *vp)
> > +map_textures(struct gl_context *ctx, const struct gl_program *vp)
> >  {
> >     GLuint u;
> >  
> >     for (u = 0; u < ctx-
> > >Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits; u++) {
> > -      if (vp->Base.TexturesUsed[u]) {
> > +      if (vp->TexturesUsed[u]) {
> >           /* Note: _Current *should* correspond to the target
> > indicated
> >            * in TexturesUsed[u].
> >            */
> > @@ -266,12 +266,12 @@ map_textures(struct gl_context *ctx, const
> > struct gl_vertex_program *vp)
> >   * Unmap the texture images which were used by the vertex program
> > (if any).
> >   */
> >  static void
> > -unmap_textures(struct gl_context *ctx, const struct
> > gl_vertex_program *vp)
> > +unmap_textures(struct gl_context *ctx, const struct gl_program
> > *vp)
> >  {
> >     GLuint u;
> >  
> >     for (u = 0; u < ctx-
> > >Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits; u++) {
> > -      if (vp->Base.TexturesUsed[u]) {
> > +      if (vp->TexturesUsed[u]) {
> >           /* Note: _Current *should* correspond to the target
> > indicated
> >            * in TexturesUsed[u].
> >            */
> > @@ -290,7 +290,7 @@ run_vp( struct gl_context *ctx, struct
> > tnl_pipeline_stage *stage )
> >     TNLcontext *tnl = TNL_CONTEXT(ctx);
> >     struct vp_stage_data *store = VP_STAGE_DATA(stage);
> >     struct vertex_buffer *VB = &tnl->vb;
> > -   struct gl_vertex_program *program = ctx-
> > >VertexProgram._Current;
> > +   struct gl_program *program = ctx->VertexProgram._Current;
> >     struct gl_program_machine *machine = &store->machine;
> >     GLuint outputs[VARYING_SLOT_MAX], numOutputs;
> >     GLuint i, j;
> > @@ -299,12 +299,12 @@ run_vp( struct gl_context *ctx, struct
> > tnl_pipeline_stage *stage )
> >        return GL_TRUE;
> >  
> >     /* ARB program or vertex shader */
> > -   _mesa_load_state_parameters(ctx, program->Base.Parameters);
> > +   _mesa_load_state_parameters(ctx, program->Parameters);
> >  
> >     /* make list of outputs to save some time below */
> >     numOutputs = 0;
> >     for (i = 0; i < VARYING_SLOT_MAX; i++) {
> > -      if (program->Base.OutputsWritten & BITFIELD64_BIT(i)) {
> > +      if (program->OutputsWritten & BITFIELD64_BIT(i)) {
> >           outputs[numOutputs++] = i;
> >        }
> >     }
> > @@ -347,7 +347,7 @@ run_vp( struct gl_context *ctx, struct
> > tnl_pipeline_stage *stage )
> >  
> >        /* the vertex array case */
> >        for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
> > -	 if (program->Base.InputsRead & BITFIELD64_BIT(attr)) {
> > +	 if (program->InputsRead & BITFIELD64_BIT(attr)) {
> >  	    const GLubyte *ptr = (const GLubyte*) VB-
> > >AttribPtr[attr]->data;
> >  	    const GLuint size = VB->AttribPtr[attr]->size;
> >  	    const GLuint stride = VB->AttribPtr[attr]->stride;
> > @@ -363,7 +363,7 @@ run_vp( struct gl_context *ctx, struct
> > tnl_pipeline_stage *stage )
> >        }
> >  
> >        /* execute the program */
> > -      _mesa_execute_program(ctx, &program->Base, machine);
> > +      _mesa_execute_program(ctx, program, machine);
> >  
> >        /* copy the output registers into the VB->attribs arrays */
> >        for (j = 0; j < numOutputs; j++) {
> > @@ -378,7 +378,7 @@ run_vp( struct gl_context *ctx, struct
> > tnl_pipeline_stage *stage )
> >        }
> >  
> >        /* FOGC is a special case.  Fragment shader expects
> > (f,0,0,1) */
> > -      if (program->Base.OutputsWritten &
> > BITFIELD64_BIT(VARYING_SLOT_FOGC)) {
> > +      if (program->OutputsWritten &
> > BITFIELD64_BIT(VARYING_SLOT_FOGC)) {
> >           store->results[VARYING_SLOT_FOGC].data[i][1] = 0.0;
> >           store->results[VARYING_SLOT_FOGC].data[i][2] = 0.0;
> >           store->results[VARYING_SLOT_FOGC].data[i][3] = 1.0;
> > @@ -443,7 +443,7 @@ run_vp( struct gl_context *ctx, struct
> > tnl_pipeline_stage *stage )
> >     }
> >  
> >     for (i = 0; i < ctx->Const.MaxVarying; i++) {
> > -      if (program->Base.OutputsWritten &
> > BITFIELD64_BIT(VARYING_SLOT_VAR0 + i)) {
> > +      if (program->OutputsWritten &
> > BITFIELD64_BIT(VARYING_SLOT_VAR0 + i)) {
> >           /* Note: varying results get put into the generic
> > attributes */
> >  	 VB->AttribPtr[VERT_ATTRIB_GENERIC0+i]
> >              = &store->results[VARYING_SLOT_VAR0 + i];
> > diff --git a/src/mesa/tnl/t_vp_build.c b/src/mesa/tnl/t_vp_build.c
> > index 4728c70..18d105f 100644
> > --- a/src/mesa/tnl/t_vp_build.c
> > +++ b/src/mesa/tnl/t_vp_build.c
> > @@ -40,7 +40,7 @@
> >   */
> >  void _tnl_UpdateFixedFunctionProgram( struct gl_context *ctx )
> >  {
> > -   const struct gl_vertex_program *prev = ctx-
> > >VertexProgram._Current;
> > +   const struct gl_program *prev = ctx->VertexProgram._Current;
> >  
> >     if (!ctx->VertexProgram._Current ||
> >         ctx->VertexProgram._Current == ctx-
> > >VertexProgram._TnlProgram) {
> > @@ -54,6 +54,6 @@ void _tnl_UpdateFixedFunctionProgram( struct
> > gl_context *ctx )
> >      */
> >     if (ctx->VertexProgram._Current != prev && ctx-
> > >Driver.BindProgram) {
> >        ctx->Driver.BindProgram(ctx, GL_VERTEX_PROGRAM_ARB,
> > -                            (struct gl_program *) ctx-
> > >VertexProgram._Current);
> > +                              ctx->VertexProgram._Current);
> >     }
> >  }
> > diff --git a/src/mesa/vbo/vbo_exec_draw.c
> > b/src/mesa/vbo/vbo_exec_draw.c
> > index 0ae879b..19114da 100644
> > --- a/src/mesa/vbo/vbo_exec_draw.c
> > +++ b/src/mesa/vbo/vbo_exec_draw.c
> > @@ -211,8 +211,8 @@ vbo_exec_bind_arrays( struct gl_context *ctx )
> >         * glVertexAttrib(0, val) calls to feed into the GENERIC0
> > input.
> >         * The original state gets essentially restored below.
> >         */
> > -      if ((ctx->VertexProgram._Current->Base.InputsRead &
> > VERT_BIT_POS) == 0 &&
> > -          (ctx->VertexProgram._Current->Base.InputsRead &
> > VERT_BIT_GENERIC0)) {
> > +      if ((ctx->VertexProgram._Current->InputsRead & VERT_BIT_POS)
> > == 0 &&
> > +          (ctx->VertexProgram._Current->InputsRead &
> > VERT_BIT_GENERIC0)) {
> >           swap_pos = true;
> >           exec->vtx.inputs[VERT_ATTRIB_GENERIC0] = exec-
> > >vtx.inputs[0];
> >           exec->vtx.attrsz[VERT_ATTRIB_GENERIC0] = exec-
> > >vtx.attrsz[0];
> > diff --git a/src/mesa/vbo/vbo_save_draw.c
> > b/src/mesa/vbo/vbo_save_draw.c
> > index 507ab82..cb68e1d 100644
> > --- a/src/mesa/vbo/vbo_save_draw.c
> > +++ b/src/mesa/vbo/vbo_save_draw.c
> > @@ -174,8 +174,8 @@ static void vbo_bind_vertex_list(struct
> > gl_context *ctx,
> >         * In that case we effectively need to route the data from
> >         * glVertexAttrib(0, val) calls to feed into the GENERIC0
> > input.
> >         */
> > -      if ((ctx->VertexProgram._Current->Base.InputsRead &
> > VERT_BIT_POS) == 0 &&
> > -          (ctx->VertexProgram._Current->Base.InputsRead &
> > VERT_BIT_GENERIC0)) {
> > +      if ((ctx->VertexProgram._Current->InputsRead & VERT_BIT_POS)
> > == 0 &&
> > +          (ctx->VertexProgram._Current->InputsRead &
> > VERT_BIT_GENERIC0)) {
> >           save->inputs[VERT_ATTRIB_GENERIC0] = save->inputs[0];
> >           node_attrsz[VERT_ATTRIB_GENERIC0] = node_attrsz[0];
> >           node_attrtype[VERT_ATTRIB_GENERIC0] = node_attrtype[0];
> > 
> 


More information about the mesa-dev mailing list