OSDN Git Service

Merge branch 'shader-file-reorg'
authorBrian Paul <brianp@vmware.com>
Thu, 24 Jun 2010 04:30:26 +0000 (22:30 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 24 Jun 2010 04:30:26 +0000 (22:30 -0600)
1. Move all GL entrypoint functions and files into src/mesa/main/
This includes the ARB vp/vp, NV vp/fp, ATI fragshader and GLSL bits
that were in src/mesa/shader/

2. Move src/mesa/shader/slang/ to src/mesa/slang/ to reduce the tree depth

3. Rename src/mesa/shader/ to src/mesa/program/ since all the
remaining files are concerned with GPU programs.

4. Misc code refactoring.  In particular, I got rid of most of the
GLSL-related ctx->Driver hook functions.  None of the drivers used
them.

Conflicts:
src/mesa/drivers/dri/i965/brw_context.c

1  2 
src/mesa/drivers/common/meta.c
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/drivers/dri/i965/brw_curbe.c
src/mesa/drivers/dri/i965/brw_program.c
src/mesa/drivers/dri/i965/brw_vs_surface_state.c
src/mesa/drivers/dri/i965/brw_wm_surface_state.c
src/mesa/drivers/dri/i965/gen6_wm_state.c
src/mesa/drivers/dri/r600/r700_assembler.c
src/mesa/drivers/dri/r600/r700_fragprog.c
src/mesa/main/arbprogram.h

@@@ -34,6 -34,7 +34,7 @@@
  #include "main/glheader.h"
  #include "main/mtypes.h"
  #include "main/imports.h"
+ #include "main/arbprogram.h"
  #include "main/arrayobj.h"
  #include "main/blend.h"
  #include "main/bufferobj.h"
@@@ -51,7 -52,7 +52,7 @@@
  #include "main/polygon.h"
  #include "main/readpix.h"
  #include "main/scissor.h"
- #include "main/shaders.h"
+ #include "main/shaderapi.h"
  #include "main/state.h"
  #include "main/stencil.h"
  #include "main/texobj.h"
@@@ -61,8 -62,7 +62,7 @@@
  #include "main/texstate.h"
  #include "main/varray.h"
  #include "main/viewport.h"
- #include "shader/program.h"
- #include "shader/arbprogram.h"
+ #include "program/program.h"
  #include "swrast/swrast.h"
  #include "drivers/common/meta.h"
  
@@@ -2400,9 -2400,6 +2400,9 @@@ _mesa_meta_GenerateMipmap(GLcontext *ct
           break;
        }
  
 +      /* Set MaxLevel large enough to hold the new level when we allocate it  */
 +      _mesa_TexParameteri(target, GL_TEXTURE_MAX_LEVEL, dstLevel);
 +
        /* Create empty dest image */
        if (target == GL_TEXTURE_1D) {
           _mesa_TexImage1D(target, dstLevel, srcImage->InternalFormat,
@@@ -34,7 -34,8 +34,6 @@@
  #include "main/api_noop.h"
  #include "main/macros.h"
  #include "main/simple_list.h"
 -#include "program/shader_api.h"
--
  #include "brw_context.h"
  #include "brw_defines.h"
  #include "brw_draw.h"
@@@ -53,9 -54,6 +52,9 @@@ static void brwInitDriverFunctions( str
  
     brwInitFragProgFuncs( functions );
     brw_init_queryobj_functions(functions);
 +
 +   functions->Enable = brw_enable;
 +   functions->DepthRange = brw_depth_range;
  }
  
  GLboolean brwCreateContext( int api,
  
     brw_draw_init( brw );
  
 +   /* Now that most driver functions are hooked up, initialize some of the
 +    * immediate state.
 +    */
 +   brw_update_cc_vp(brw);
 +
     return GL_TRUE;
  }
  
@@@ -35,9 -35,9 +35,9 @@@
  #include "main/context.h"
  #include "main/macros.h"
  #include "main/enums.h"
- #include "shader/prog_parameter.h"
- #include "shader/prog_print.h"
- #include "shader/prog_statevars.h"
+ #include "program/prog_parameter.h"
+ #include "program/prog_print.h"
+ #include "program/prog_statevars.h"
  #include "intel_batchbuffer.h"
  #include "intel_regions.h"
  #include "brw_context.h"
@@@ -182,6 -182,8 +182,6 @@@ static void prepare_constant_buffer(str
     GLcontext *ctx = &brw->intel.ctx;
     const struct brw_vertex_program *vp =
        brw_vertex_program_const(brw->vertex_program);
 -   const struct brw_fragment_program *fp =
 -      brw_fragment_program_const(brw->fragment_program);
     const GLuint sz = brw->curbe.total_size;
     const GLuint bufsz = sz * 16 * sizeof(GLfloat);
     GLfloat *buf;
     if (brw->curbe.wm_size) {
        GLuint offset = brw->curbe.wm_start * 16;
  
 -      _mesa_load_state_parameters(ctx, fp->program.Base.Parameters); 
 -
        /* copy float constants */
        for (i = 0; i < brw->wm.prog_data->nr_params; i++) 
         buf[offset + i] = *brw->wm.prog_data->param[i];
        GLuint offset = brw->curbe.vs_start * 16;
        GLuint nr = brw->vs.prog_data->nr_params / 4;
  
 -      if (brw->vertex_program->IsNVProgram)
 -       _mesa_load_tracked_matrices(ctx);
 -
 -      /* Updates the ParamaterValues[i] pointers for all parameters of the
 -       * basic type of PROGRAM_STATE_VAR.
 -       */
 -      _mesa_load_state_parameters(ctx, vp->program.Base.Parameters); 
 -
        if (vp->use_const_buffer) {
         /* Load the subset of push constants that will get used when
          * we also have a pull constant buffer.
    
  #include "main/imports.h"
  #include "main/enums.h"
- #include "shader/prog_parameter.h"
- #include "shader/program.h"
- #include "shader/programopt.h"
- #include "shader/shader_api.h"
++#include "main/shaderobj.h"
+ #include "program/prog_parameter.h"
+ #include "program/program.h"
+ #include "program/programopt.h"
 -#include "program/shader_api.h"
  #include "tnl/tnl.h"
  
  #include "brw_context.h"
@@@ -95,6 -95,20 +95,6 @@@ static struct gl_program *brwNewProgram
  static void brwDeleteProgram( GLcontext *ctx,
                              struct gl_program *prog )
  {
 -   if (prog->Target == GL_FRAGMENT_PROGRAM_ARB) {
 -      struct gl_fragment_program *fp = (struct gl_fragment_program *) prog;
 -      struct brw_fragment_program *brw_fp = brw_fragment_program(fp);
 -
 -      drm_intel_bo_unreference(brw_fp->const_buffer);
 -   }
 -
 -   if (prog->Target == GL_VERTEX_PROGRAM_ARB) {
 -      struct gl_vertex_program *vp = (struct gl_vertex_program *) prog;
 -      struct brw_vertex_program *brw_vp = brw_vertex_program(vp);
 -
 -      drm_intel_bo_unreference(brw_vp->const_buffer);
 -   }
 -
     _mesa_delete_program( ctx, prog );
  }
  
@@@ -31,7 -31,7 +31,7 @@@
  
  #include "main/mtypes.h"
  #include "main/texstore.h"
- #include "shader/prog_parameter.h"
+ #include "program/prog_parameter.h"
  
  #include "brw_context.h"
  #include "brw_state.h"
   * Otherwise, constants go through the CURBEs using the brw_constant_buffer
   * state atom.
   */
 -static drm_intel_bo *
 -brw_vs_update_constant_buffer(struct brw_context *brw)
 +static void
 +prepare_vs_constants(struct brw_context *brw)
  {
 +   GLcontext *ctx = &brw->intel.ctx;
     struct intel_context *intel = &brw->intel;
     struct brw_vertex_program *vp =
        (struct brw_vertex_program *) brw->vertex_program;
     const struct gl_program_parameter_list *params = vp->program.Base.Parameters;
     const int size = params->NumParameters * 4 * sizeof(GLfloat);
 -   drm_intel_bo *const_buffer;
     int i;
  
 -   /* BRW_NEW_VERTEX_PROGRAM */
 -   if (!vp->use_const_buffer)
 -      return NULL;
 -
 -   const_buffer = drm_intel_bo_alloc(intel->bufmgr, "vp_const_buffer",
 -                                   size, 64);
 -
 -   /* _NEW_PROGRAM_CONSTANTS */
 +   if (vp->program.IsNVProgram)
 +      _mesa_load_tracked_matrices(ctx);
  
     /* Updates the ParamaterValues[i] pointers for all parameters of the
      * basic type of PROGRAM_STATE_VAR.
      */
     _mesa_load_state_parameters(&brw->intel.ctx, vp->program.Base.Parameters);
  
 -   drm_intel_gem_bo_map_gtt(const_buffer);
 +   /* BRW_NEW_VERTEX_PROGRAM */
 +   if (!vp->use_const_buffer) {
 +      if (brw->vs.const_bo) {
 +       drm_intel_bo_unreference(brw->vs.const_bo);
 +       brw->vs.const_bo = NULL;
 +       brw->state.dirty.brw |= BRW_NEW_VS_CONSTBUF;
 +      }
 +      return;
 +   }
 +
 +   /* _NEW_PROGRAM_CONSTANTS */
 +   drm_intel_bo_unreference(brw->vs.const_bo);
 +   brw->vs.const_bo = drm_intel_bo_alloc(intel->bufmgr, "vp_const_buffer",
 +                                       size, 64);
 +
 +   drm_intel_gem_bo_map_gtt(brw->vs.const_bo);
     for (i = 0; i < params->NumParameters; i++) {
 -      memcpy(const_buffer->virtual + i * 4 * sizeof(float),
 +      memcpy(brw->vs.const_bo->virtual + i * 4 * sizeof(float),
             params->ParameterValues[i],
             4 * sizeof(float));
     }
 -   drm_intel_gem_bo_unmap_gtt(const_buffer);
 -
 -   return const_buffer;
 +   drm_intel_gem_bo_unmap_gtt(brw->vs.const_bo);
 +   brw->state.dirty.brw |= BRW_NEW_VS_CONSTBUF;
  }
  
 +const struct brw_tracked_state brw_vs_constants = {
 +   .dirty = {
 +      .mesa = (_NEW_PROGRAM_CONSTANTS),
 +      .brw = (BRW_NEW_VERTEX_PROGRAM),
 +      .cache = 0
 +   },
 +   .prepare = prepare_vs_constants,
 +};
 +
  /**
   * Update the surface state for a VS constant buffer.
   *
@@@ -105,41 -88,101 +105,41 @@@ brw_update_vs_constant_surface( GLconte
                                  GLuint surf)
  {
     struct brw_context *brw = brw_context(ctx);
 -   struct brw_surface_key key;
     struct brw_vertex_program *vp =
        (struct brw_vertex_program *) brw->vertex_program;
     const struct gl_program_parameter_list *params = vp->program.Base.Parameters;
  
     assert(surf == 0);
  
 -   /* If we're in this state update atom, we need to update VS constants, so
 -    * free the old buffer and create a new one for the new contents.
 -    */
 -   drm_intel_bo_unreference(vp->const_buffer);
 -   vp->const_buffer = brw_vs_update_constant_buffer(brw);
 -
     /* If there's no constant buffer, then no surface BO is needed to point at
      * it.
      */
 -   if (vp->const_buffer == NULL) {
 +   if (brw->vs.const_bo == NULL) {
        drm_intel_bo_unreference(brw->vs.surf_bo[surf]);
        brw->vs.surf_bo[surf] = NULL;
        return;
     }
  
 -   memset(&key, 0, sizeof(key));
 -
 -   key.format = MESA_FORMAT_RGBA_FLOAT32;
 -   key.internal_format = GL_RGBA;
 -   key.bo = vp->const_buffer;
 -   key.depthmode = GL_NONE;
 -   key.pitch = params->NumParameters;
 -   key.width = params->NumParameters;
 -   key.height = 1;
 -   key.depth = 1;
 -   key.cpp = 16;
 -
 -   /*
 -   printf("%s:\n", __FUNCTION__);
 -   printf("  width %d  height %d  depth %d  cpp %d  pitch %d\n",
 -          key.width, key.height, key.depth, key.cpp, key.pitch);
 -   */
 -
 -   drm_intel_bo_unreference(brw->vs.surf_bo[surf]);
 -   brw->vs.surf_bo[surf] = brw_search_cache(&brw->surface_cache,
 -                                            BRW_SS_SURFACE,
 -                                            &key, sizeof(key),
 -                                            &key.bo, 1,
 -                                            NULL);
 -   if (brw->vs.surf_bo[surf] == NULL) {
 -      brw->vs.surf_bo[surf] = brw_create_constant_surface(brw, &key);
 -   }
 +   brw_create_constant_surface(brw, brw->vs.const_bo, params->NumParameters,
 +                             &brw->vs.surf_bo[surf],
 +                             &brw->vs.surf_offset[surf]);
  }
  
  
 -/**
 - * Constructs the binding table for the VS surface state.
 - */
 -static drm_intel_bo *
 -brw_vs_get_binding_table(struct brw_context *brw)
 +static void
 +prepare_vs_surfaces(struct brw_context *brw)
  {
 -   drm_intel_bo *bind_bo;
 -
 -   bind_bo = brw_search_cache(&brw->surface_cache, BRW_SS_SURF_BIND,
 -                            NULL, 0,
 -                            brw->vs.surf_bo, BRW_VS_MAX_SURF,
 -                            NULL);
 -
 -   if (bind_bo == NULL) {
 -      GLuint data_size = BRW_VS_MAX_SURF * sizeof(GLuint);
 -      uint32_t data[BRW_VS_MAX_SURF];
 -      int i;
 -
 -      for (i = 0; i < BRW_VS_MAX_SURF; i++)
 -         if (brw->vs.surf_bo[i])
 -            data[i] = brw->vs.surf_bo[i]->offset;
 -         else
 -            data[i] = 0;
 -
 -      bind_bo = brw_upload_cache( &brw->surface_cache, BRW_SS_SURF_BIND,
 -                                NULL, 0,
 -                                brw->vs.surf_bo, BRW_VS_MAX_SURF,
 -                                data, data_size);
 -
 -      /* Emit binding table relocations to surface state */
 -      for (i = 0; i < BRW_VS_MAX_SURF; i++) {
 -       if (brw->vs.surf_bo[i] != NULL) {
 -          /* The presumed offsets were set in the data values for
 -           * brw_upload_cache.
 -           */
 -          drm_intel_bo_emit_reloc(bind_bo, i * 4,
 -                                  brw->vs.surf_bo[i], 0,
 -                                  I915_GEM_DOMAIN_INSTRUCTION, 0);
 -       }
 -      }
 +   int nr_surfaces = 0;
 +
 +   if (brw->vs.const_bo) {
 +      brw_add_validated_bo(brw, brw->vs.const_bo);
 +      nr_surfaces = 1;
     }
  
 -   return bind_bo;
 +   if (brw->vs.nr_surfaces != nr_surfaces) {
 +      brw->state.dirty.brw |= BRW_NEW_NR_VS_SURFACES;
 +      brw->vs.nr_surfaces = nr_surfaces;
 +   }
  }
  
  /**
   * to be updated, and produces BRW_NEW_NR_VS_SURFACES for the VS unit and
   * CACHE_NEW_SURF_BIND for the binding table upload.
   */
 -static void prepare_vs_surfaces(struct brw_context *brw )
 +static void upload_vs_surfaces(struct brw_context *brw)
  {
     GLcontext *ctx = &brw->intel.ctx;
 +   uint32_t *bind;
     int i;
 -   int nr_surfaces = 0;
 -
 -   brw_update_vs_constant_surface(ctx, SURF_INDEX_VERT_CONST_BUFFER);
  
 -   for (i = 0; i < BRW_VS_MAX_SURF; i++) {
 -      if (brw->vs.surf_bo[i] != NULL) {
 -       nr_surfaces = i + 1;
 +   /* BRW_NEW_NR_VS_SURFACES */
 +   if (brw->vs.nr_surfaces == 0) {
 +      if (brw->vs.bind_bo) {
 +       drm_intel_bo_unreference(brw->vs.bind_bo);
 +       brw->vs.bind_bo = NULL;
 +       brw->state.dirty.brw |= BRW_NEW_BINDING_TABLE;
        }
 +      return;
     }
  
 -   if (brw->vs.nr_surfaces != nr_surfaces) {
 -      brw->state.dirty.brw |= BRW_NEW_NR_VS_SURFACES;
 -      brw->vs.nr_surfaces = nr_surfaces;
 -   }
 +   brw_update_vs_constant_surface(ctx, SURF_INDEX_VERT_CONST_BUFFER);
  
 -   /* Note that we don't end up updating the bind_bo if we don't have a
 -    * surface to be pointing at.  This should be relatively harmless, as it
 -    * just slightly increases our working set size.
 +   /* Might want to calculate nr_surfaces first, to avoid taking up so much
 +    * space for the binding table. (once we have vs samplers)
      */
 -   if (brw->vs.nr_surfaces != 0) {
 -      drm_intel_bo_unreference(brw->vs.bind_bo);
 -      brw->vs.bind_bo = brw_vs_get_binding_table(brw);
 +   bind = brw_state_batch(brw, sizeof(uint32_t) * BRW_VS_MAX_SURF,
 +                        32, &brw->vs.bind_bo, &brw->vs.bind_bo_offset);
 +
 +   for (i = 0; i < BRW_VS_MAX_SURF; i++) {
 +      /* BRW_NEW_VS_CONSTBUF */
 +      if (brw->vs.surf_bo[i]) {
 +       bind[i] = brw->vs.surf_offset[i];
 +      } else {
 +       bind[i] = 0;
 +      }
     }
 +
 +   brw->state.dirty.brw |= BRW_NEW_BINDING_TABLE;
  }
  
  const struct brw_tracked_state brw_vs_surfaces = {
     .dirty = {
 -      .mesa = (_NEW_PROGRAM_CONSTANTS),
 -      .brw = (BRW_NEW_VERTEX_PROGRAM),
 +      .mesa = 0,
 +      .brw = (BRW_NEW_VS_CONSTBUF |
 +            BRW_NEW_NR_VS_SURFACES |
 +            BRW_NEW_BATCH),
        .cache = 0
     },
     .prepare = prepare_vs_surfaces,
 +   .emit = upload_vs_surfaces,
  };
 -
 -
 -
@@@ -32,7 -32,7 +32,7 @@@
  
  #include "main/mtypes.h"
  #include "main/texstore.h"
- #include "shader/prog_parameter.h"
+ #include "program/prog_parameter.h"
  
  #include "intel_mipmap_tree.h"
  #include "intel_batchbuffer.h"
@@@ -196,40 -196,36 +196,40 @@@ brw_set_surface_tiling(struct brw_surfa
     }
  }
  
 -static drm_intel_bo *
 -brw_create_texture_surface( struct brw_context *brw,
 -                          struct brw_surface_key *key )
 +static void
 +brw_update_texture_surface( GLcontext *ctx, GLuint unit )
  {
 +   struct brw_context *brw = brw_context(ctx);
 +   struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
 +   struct intel_texture_object *intelObj = intel_texture_object(tObj);
 +   struct gl_texture_image *firstImage = tObj->Image[0][intelObj->firstLevel];
 +   const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
     struct brw_surface_state surf;
 -   drm_intel_bo *bo;
 +   void *map;
  
     memset(&surf, 0, sizeof(surf));
  
     surf.ss0.mipmap_layout_mode = BRW_SURFACE_MIPMAPLAYOUT_BELOW;
 -   surf.ss0.surface_type = translate_tex_target(key->target);
 -   surf.ss0.surface_format = translate_tex_format(key->format,
 -                                                key->internal_format,
 -                                                key->depthmode);
 +   surf.ss0.surface_type = translate_tex_target(tObj->Target);
 +   surf.ss0.surface_format = translate_tex_format(firstImage->TexFormat,
 +                                                firstImage->InternalFormat,
 +                                                tObj->DepthMode);
  
     /* This is ok for all textures with channel width 8bit or less:
      */
  /*    surf.ss0.data_return_format = BRW_SURFACERETURNFORMAT_S1; */
 -   surf.ss1.base_addr = key->bo->offset; /* reloc */
 +   surf.ss1.base_addr = intelObj->mt->region->buffer->offset; /* reloc */
  
 -   surf.ss2.mip_count = key->last_level - key->first_level;
 -   surf.ss2.width = key->width - 1;
 -   surf.ss2.height = key->height - 1;
 -   brw_set_surface_tiling(&surf, key->tiling);
 -   surf.ss3.pitch = (key->pitch * key->cpp) - 1;
 -   surf.ss3.depth = key->depth - 1;
 +   surf.ss2.mip_count = intelObj->lastLevel - intelObj->firstLevel;
 +   surf.ss2.width = firstImage->Width - 1;
 +   surf.ss2.height = firstImage->Height - 1;
 +   brw_set_surface_tiling(&surf, intelObj->mt->region->tiling);
 +   surf.ss3.pitch = (intelObj->mt->region->pitch * intelObj->mt->cpp) - 1;
 +   surf.ss3.depth = firstImage->Depth - 1;
  
     surf.ss4.min_lod = 0;
   
 -   if (key->target == GL_TEXTURE_CUBE_MAP) {
 +   if (tObj->Target == GL_TEXTURE_CUBE_MAP) {
        surf.ss0.cube_pos_x = 1;
        surf.ss0.cube_pos_y = 1;
        surf.ss0.cube_pos_z = 1;
        surf.ss0.cube_neg_z = 1;
     }
  
 -   bo = brw_upload_cache(&brw->surface_cache, BRW_SS_SURFACE,
 -                       key, sizeof(*key),
 -                       &key->bo, 1,
 -                       &surf, sizeof(surf));
 +   map = brw_state_batch(brw, sizeof(surf), 32,
 +                       &brw->wm.surf_bo[surf_index],
 +                       &brw->wm.surf_offset[surf_index]);
 +   memcpy(map, &surf, sizeof(surf));
  
     /* Emit relocation to surface contents */
 -   drm_intel_bo_emit_reloc(bo, offsetof(struct brw_surface_state, ss1),
 -                         key->bo, 0,
 +   drm_intel_bo_emit_reloc(brw->wm.surf_bo[surf_index],
 +                         brw->wm.surf_offset[surf_index] +
 +                         offsetof(struct brw_surface_state, ss1),
 +                         intelObj->mt->region->buffer, 0,
                           I915_GEM_DOMAIN_SAMPLER, 0);
 -
 -   return bo;
 -}
 -
 -static void
 -brw_update_texture_surface( GLcontext *ctx, GLuint unit )
 -{
 -   struct brw_context *brw = brw_context(ctx);
 -   struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
 -   struct intel_texture_object *intelObj = intel_texture_object(tObj);
 -   struct gl_texture_image *firstImage = tObj->Image[0][intelObj->firstLevel];
 -   struct brw_surface_key key;
 -   const GLuint surf = SURF_INDEX_TEXTURE(unit);
 -
 -   memset(&key, 0, sizeof(key));
 -
 -   key.format = firstImage->TexFormat;
 -   key.internal_format = firstImage->InternalFormat;
 -   key.pitch = intelObj->mt->region->pitch;
 -   key.depth = firstImage->Depth;
 -   key.bo = intelObj->mt->region->buffer;
 -   key.offset = 0;
 -
 -   key.target = tObj->Target;
 -   key.depthmode = tObj->DepthMode;
 -   key.first_level = intelObj->firstLevel;
 -   key.last_level = intelObj->lastLevel;
 -   key.width = firstImage->Width;
 -   key.height = firstImage->Height;
 -   key.cpp = intelObj->mt->cpp;
 -   key.tiling = intelObj->mt->region->tiling;
 -
 -   drm_intel_bo_unreference(brw->wm.surf_bo[surf]);
 -   brw->wm.surf_bo[surf] = brw_search_cache(&brw->surface_cache,
 -                                            BRW_SS_SURFACE,
 -                                            &key, sizeof(key),
 -                                            &key.bo, 1,
 -                                            NULL);
 -   if (brw->wm.surf_bo[surf] == NULL) {
 -      brw->wm.surf_bo[surf] = brw_create_texture_surface(brw, &key);
 -   }
  }
  
 -
 -
  /**
   * Create the constant buffer surface.  Vertex/fragment shader constants will be
   * read from this buffer with Data Port Read instructions/messages.
   */
 -drm_intel_bo *
 -brw_create_constant_surface( struct brw_context *brw,
 -                             struct brw_surface_key *key )
 +void
 +brw_create_constant_surface(struct brw_context *brw,
 +                          drm_intel_bo *bo,
 +                          int width,
 +                          drm_intel_bo **out_bo,
 +                          uint32_t *out_offset)
  {
 -   const GLint w = key->width - 1;
 +   const GLint w = width - 1;
     struct brw_surface_state surf;
 -   drm_intel_bo *bo;
 +   void *map;
  
     memset(&surf, 0, sizeof(surf));
  
     surf.ss0.surface_type = BRW_SURFACE_BUFFER;
     surf.ss0.surface_format = BRW_SURFACEFORMAT_R32G32B32A32_FLOAT;
  
 -   assert(key->bo);
 -   surf.ss1.base_addr = key->bo->offset; /* reloc */
 +   assert(bo);
 +   surf.ss1.base_addr = bo->offset; /* reloc */
  
     surf.ss2.width = w & 0x7f;            /* bits 6:0 of size or width */
     surf.ss2.height = (w >> 7) & 0x1fff;  /* bits 19:7 of size or width */
     surf.ss3.depth = (w >> 20) & 0x7f;    /* bits 26:20 of size or width */
 -   surf.ss3.pitch = (key->pitch * key->cpp) - 1; /* ignored?? */
 -   brw_set_surface_tiling(&surf, key->tiling); /* tiling now allowed */
 - 
 -   bo = brw_upload_cache(&brw->surface_cache, BRW_SS_SURFACE,
 -                       key, sizeof(*key),
 -                       &key->bo, 1,
 -                       &surf, sizeof(surf));
 +   surf.ss3.pitch = (width * 16) - 1; /* ignored?? */
 +   brw_set_surface_tiling(&surf, I915_TILING_NONE); /* tiling now allowed */
 +
 +   map = brw_state_batch(brw, sizeof(surf), 32, out_bo, out_offset);
 +   memcpy(map, &surf, sizeof(surf));
  
     /* Emit relocation to surface contents.  Section 5.1.1 of the gen4
      * bspec ("Data Cache") says that the data cache does not exist as
      * a separate cache and is just the sampler cache.
      */
 -   drm_intel_bo_emit_reloc(bo, offsetof(struct brw_surface_state, ss1),
 -                         key->bo, 0,
 +   drm_intel_bo_emit_reloc(*out_bo, (*out_offset +
 +                                   offsetof(struct brw_surface_state, ss1)),
 +                         bo, 0,
                           I915_GEM_DOMAIN_SAMPLER, 0);
 -
 -   return bo;
  }
  
  /* Creates a new WM constant buffer reflecting the current fragment program's
   * Otherwise, constants go through the CURBEs using the brw_constant_buffer
   * state atom.
   */
 -static drm_intel_bo *
 -brw_wm_update_constant_buffer(struct brw_context *brw)
 +static void
 +prepare_wm_constants(struct brw_context *brw)
  {
 +   GLcontext *ctx = &brw->intel.ctx;
     struct intel_context *intel = &brw->intel;
     struct brw_fragment_program *fp =
        (struct brw_fragment_program *) brw->fragment_program;
     const struct gl_program_parameter_list *params = fp->program.Base.Parameters;
     const int size = params->NumParameters * 4 * sizeof(GLfloat);
 -   drm_intel_bo *const_buffer;
 -
 -   /* BRW_NEW_FRAGMENT_PROGRAM */
 -   if (!fp->use_const_buffer)
 -      return NULL;
 -
 -   const_buffer = drm_intel_bo_alloc(intel->bufmgr, "fp_const_buffer",
 -                                   size, 64);
  
 -   /* _NEW_PROGRAM_CONSTANTS */
 -   drm_intel_bo_subdata(const_buffer, 0, size, params->ParameterValues);
 -
 -   return const_buffer;
 -}
 +   _mesa_load_state_parameters(ctx, fp->program.Base.Parameters);
  
 -/**
 - * Update the surface state for a WM constant buffer.
 - * The constant buffer will be (re)allocated here if needed.
 - */
 -static void
 -brw_update_wm_constant_surface( GLcontext *ctx,
 -                                GLuint surf)
 -{
 -   struct brw_context *brw = brw_context(ctx);
 -   struct brw_surface_key key;
 -   struct brw_fragment_program *fp =
 -      (struct brw_fragment_program *) brw->fragment_program;
 -   const struct gl_program_parameter_list *params =
 -      fp->program.Base.Parameters;
 -
 -   /* If we're in this state update atom, we need to update WM constants, so
 -    * free the old buffer and create a new one for the new contents.
 -    */
 -   drm_intel_bo_unreference(fp->const_buffer);
 -   fp->const_buffer = brw_wm_update_constant_buffer(brw);
 -
 -   /* If there's no constant buffer, then no surface BO is needed to point at
 -    * it.
 -    */
 -   if (fp->const_buffer == NULL) {
 -      drm_intel_bo_unreference(brw->wm.surf_bo[surf]);
 -      brw->wm.surf_bo[surf] = NULL;
 +   /* BRW_NEW_FRAGMENT_PROGRAM */
 +   if (!fp->use_const_buffer) {
 +      if (brw->wm.const_bo) {
 +       drm_intel_bo_unreference(brw->wm.const_bo);
 +       brw->wm.const_bo = NULL;
 +       brw->state.dirty.brw |= BRW_NEW_WM_CONSTBUF;
 +      }
        return;
     }
  
 -   memset(&key, 0, sizeof(key));
 +   drm_intel_bo_unreference(brw->wm.const_bo);
 +   brw->wm.const_bo = drm_intel_bo_alloc(intel->bufmgr, "vp_const_buffer",
 +                                       size, 64);
  
 -   key.format = MESA_FORMAT_RGBA_FLOAT32;
 -   key.internal_format = GL_RGBA;
 -   key.bo = fp->const_buffer;
 -   key.depthmode = GL_NONE;
 -   key.pitch = params->NumParameters;
 -   key.width = params->NumParameters;
 -   key.height = 1;
 -   key.depth = 1;
 -   key.cpp = 16;
 -
 -   /*
 -   printf("%s:\n", __FUNCTION__);
 -   printf("  width %d  height %d  depth %d  cpp %d  pitch %d\n",
 -          key.width, key.height, key.depth, key.cpp, key.pitch);
 -   */
 -
 -   drm_intel_bo_unreference(brw->wm.surf_bo[surf]);
 -   brw->wm.surf_bo[surf] = brw_search_cache(&brw->surface_cache,
 -                                            BRW_SS_SURFACE,
 -                                            &key, sizeof(key),
 -                                            &key.bo, 1,
 -                                            NULL);
 -   if (brw->wm.surf_bo[surf] == NULL) {
 -      brw->wm.surf_bo[surf] = brw_create_constant_surface(brw, &key);
 -   }
 -   brw->state.dirty.brw |= BRW_NEW_WM_SURFACES;
 +   /* _NEW_PROGRAM_CONSTANTS */
 +   drm_intel_bo_subdata(brw->wm.const_bo, 0, size, params->ParameterValues);
  }
  
 +const struct brw_tracked_state brw_wm_constants = {
 +   .dirty = {
 +      .mesa = (_NEW_PROGRAM_CONSTANTS),
 +      .brw = (BRW_NEW_FRAGMENT_PROGRAM),
 +      .cache = 0
 +   },
 +   .prepare = prepare_wm_constants,
 +};
 +
  /**
   * Updates surface / buffer for fragment shader constant buffer, if
   * one is required.
   * BRW_NEW_WM_SURFACES to get picked up by brw_prepare_wm_surfaces for
   * inclusion in the binding table.
   */
 -static void prepare_wm_constant_surface(struct brw_context *brw )
 +static void upload_wm_constant_surface(struct brw_context *brw )
  {
 -   GLcontext *ctx = &brw->intel.ctx;
 +   GLuint surf = SURF_INDEX_FRAG_CONST_BUFFER;
     struct brw_fragment_program *fp =
        (struct brw_fragment_program *) brw->fragment_program;
 -   GLuint surf = SURF_INDEX_FRAG_CONST_BUFFER;
 -
 -   drm_intel_bo_unreference(fp->const_buffer);
 -   fp->const_buffer = brw_wm_update_constant_buffer(brw);
 +   const struct gl_program_parameter_list *params =
 +      fp->program.Base.Parameters;
  
     /* If there's no constant buffer, then no surface BO is needed to point at
      * it.
      */
 -   if (fp->const_buffer == 0) {
 +   if (brw->wm.const_bo == 0) {
        if (brw->wm.surf_bo[surf] != NULL) {
         drm_intel_bo_unreference(brw->wm.surf_bo[surf]);
         brw->wm.surf_bo[surf] = NULL;
        return;
     }
  
 -   brw_update_wm_constant_surface(ctx, surf);
 +   brw_create_constant_surface(brw, brw->wm.const_bo, params->NumParameters,
 +                             &brw->wm.surf_bo[surf],
 +                             &brw->wm.surf_offset[surf]);
 +   brw->state.dirty.brw |= BRW_NEW_WM_SURFACES;
  }
  
  const struct brw_tracked_state brw_wm_constant_surface = {
     .dirty = {
 -      .mesa = (_NEW_PROGRAM_CONSTANTS),
 -      .brw = (BRW_NEW_FRAGMENT_PROGRAM),
 +      .mesa = 0,
 +      .brw = (BRW_NEW_WM_CONSTBUF |
 +            BRW_NEW_BATCH),
        .cache = 0
     },
 -   .prepare = prepare_wm_constant_surface,
 +   .emit = upload_wm_constant_surface,
  };
  
  
@@@ -409,8 -488,6 +409,8 @@@ brw_update_renderbuffer_surface(struct 
        uint32_t draw_x;
        uint32_t draw_y;
     } key;
 +   struct brw_surface_state surf;
 +   void *map;
  
     memset(&key, 0, sizeof(key));
  
                         (ctx->Color.BlendEnabled & (1 << unit)));
     }
  
 -   drm_intel_bo_unreference(brw->wm.surf_bo[unit]);
 -   brw->wm.surf_bo[unit] = brw_search_cache(&brw->surface_cache,
 -                                          BRW_SS_SURFACE,
 -                                          &key, sizeof(key),
 -                                          &region_bo, 1,
 -                                          NULL);
 -
 -   if (brw->wm.surf_bo[unit] == NULL) {
 -      struct brw_surface_state surf;
 -
 -      memset(&surf, 0, sizeof(surf));
 +   memset(&surf, 0, sizeof(surf));
  
 -      surf.ss0.surface_format = key.surface_format;
 -      surf.ss0.surface_type = key.surface_type;
 -      if (key.tiling == I915_TILING_NONE) {
 -       surf.ss1.base_addr = (key.draw_x + key.draw_y * key.pitch) * key.cpp;
 +   surf.ss0.surface_format = key.surface_format;
 +   surf.ss0.surface_type = key.surface_type;
 +   if (key.tiling == I915_TILING_NONE) {
 +      surf.ss1.base_addr = (key.draw_x + key.draw_y * key.pitch) * key.cpp;
 +   } else {
 +      uint32_t tile_base, tile_x, tile_y;
 +      uint32_t pitch = key.pitch * key.cpp;
 +
 +      if (key.tiling == I915_TILING_X) {
 +       tile_x = key.draw_x % (512 / key.cpp);
 +       tile_y = key.draw_y % 8;
 +       tile_base = ((key.draw_y / 8) * (8 * pitch));
 +       tile_base += (key.draw_x - tile_x) / (512 / key.cpp) * 4096;
        } else {
 -       uint32_t tile_base, tile_x, tile_y;
 -       uint32_t pitch = key.pitch * key.cpp;
 -
 -       if (key.tiling == I915_TILING_X) {
 -          tile_x = key.draw_x % (512 / key.cpp);
 -          tile_y = key.draw_y % 8;
 -          tile_base = ((key.draw_y / 8) * (8 * pitch));
 -          tile_base += (key.draw_x - tile_x) / (512 / key.cpp) * 4096;
 -       } else {
 -          /* Y */
 -          tile_x = key.draw_x % (128 / key.cpp);
 -          tile_y = key.draw_y % 32;
 -          tile_base = ((key.draw_y / 32) * (32 * pitch));
 -          tile_base += (key.draw_x - tile_x) / (128 / key.cpp) * 4096;
 -       }
 -       assert(brw->has_surface_tile_offset || (tile_x == 0 && tile_y == 0));
 -       assert(tile_x % 4 == 0);
 -       assert(tile_y % 2 == 0);
 -       /* Note that the low bits of these fields are missing, so
 -        * there's the possibility of getting in trouble.
 -        */
 -       surf.ss1.base_addr = tile_base;
 -       surf.ss5.x_offset = tile_x / 4;
 -       surf.ss5.y_offset = tile_y / 2;
 -      }
 -      if (region_bo != NULL)
 -       surf.ss1.base_addr += region_bo->offset; /* reloc */
 -
 -      surf.ss2.width = key.width - 1;
 -      surf.ss2.height = key.height - 1;
 -      brw_set_surface_tiling(&surf, key.tiling);
 -      surf.ss3.pitch = (key.pitch * key.cpp) - 1;
 -
 -      if (intel->gen < 6) {
 -       /* _NEW_COLOR */
 -       surf.ss0.color_blend = key.color_blend;
 -       surf.ss0.writedisable_red =   !key.color_mask[0];
 -       surf.ss0.writedisable_green = !key.color_mask[1];
 -       surf.ss0.writedisable_blue =  !key.color_mask[2];
 -       surf.ss0.writedisable_alpha = !key.color_mask[3];
 +       /* Y */
 +       tile_x = key.draw_x % (128 / key.cpp);
 +       tile_y = key.draw_y % 32;
 +       tile_base = ((key.draw_y / 32) * (32 * pitch));
 +       tile_base += (key.draw_x - tile_x) / (128 / key.cpp) * 4096;
        }
 +      assert(brw->has_surface_tile_offset || (tile_x == 0 && tile_y == 0));
 +      assert(tile_x % 4 == 0);
 +      assert(tile_y % 2 == 0);
 +      /* Note that the low bits of these fields are missing, so
 +       * there's the possibility of getting in trouble.
 +       */
 +      surf.ss1.base_addr = tile_base;
 +      surf.ss5.x_offset = tile_x / 4;
 +      surf.ss5.y_offset = tile_y / 2;
 +   }
 +   if (region_bo != NULL)
 +      surf.ss1.base_addr += region_bo->offset; /* reloc */
  
 -      /* Key size will never match key size for textures, so we're safe. */
 -      brw->wm.surf_bo[unit] = brw_upload_cache(&brw->surface_cache,
 -                                               BRW_SS_SURFACE,
 -                                               &key, sizeof(key),
 -                                             &region_bo, 1,
 -                                             &surf, sizeof(surf));
 -      if (region_bo != NULL) {
 -       /* We might sample from it, and we might render to it, so flag
 -        * them both.  We might be able to figure out from other state
 -        * a more restrictive relocation to emit.
 -        */
 -       drm_intel_bo_emit_reloc(brw->wm.surf_bo[unit],
 -                               offsetof(struct brw_surface_state, ss1),
 -                               region_bo,
 -                               surf.ss1.base_addr - region_bo->offset,
 -                               I915_GEM_DOMAIN_RENDER,
 -                               I915_GEM_DOMAIN_RENDER);
 -      }
 +   surf.ss2.width = key.width - 1;
 +   surf.ss2.height = key.height - 1;
 +   brw_set_surface_tiling(&surf, key.tiling);
 +   surf.ss3.pitch = (key.pitch * key.cpp) - 1;
 +
 +   if (intel->gen < 6) {
 +      /* _NEW_COLOR */
 +      surf.ss0.color_blend = key.color_blend;
 +      surf.ss0.writedisable_red =   !key.color_mask[0];
 +      surf.ss0.writedisable_green = !key.color_mask[1];
 +      surf.ss0.writedisable_blue =  !key.color_mask[2];
 +      surf.ss0.writedisable_alpha = !key.color_mask[3];
     }
 -}
  
 +   map = brw_state_batch(brw, sizeof(surf), 32,
 +                       &brw->wm.surf_bo[unit],
 +                       &brw->wm.surf_offset[unit]);
 +   memcpy(map, &surf, sizeof(surf));
 +
 +   if (region_bo != NULL) {
 +      drm_intel_bo_emit_reloc(brw->wm.surf_bo[unit],
 +                            brw->wm.surf_offset[unit] +
 +                            offsetof(struct brw_surface_state, ss1),
 +                            region_bo,
 +                            surf.ss1.base_addr - region_bo->offset,
 +                            I915_GEM_DOMAIN_RENDER,
 +                            I915_GEM_DOMAIN_RENDER);
 +   }
 +}
  
 -/**
 - * Constructs the binding table for the WM surface state, which maps unit
 - * numbers to surface state objects.
 - */
 -static drm_intel_bo *
 -brw_wm_get_binding_table(struct brw_context *brw)
 +static void
 +prepare_wm_surfaces(struct brw_context *brw)
  {
 -   drm_intel_bo *bind_bo;
 -
 -   assert(brw->wm.nr_surfaces <= BRW_WM_MAX_SURF);
 -
 -   bind_bo = brw_search_cache(&brw->surface_cache, BRW_SS_SURF_BIND,
 -                            NULL, 0,
 -                            brw->wm.surf_bo, brw->wm.nr_surfaces,
 -                            NULL);
 -
 -   if (bind_bo == NULL) {
 -      GLuint data_size = brw->wm.nr_surfaces * sizeof(GLuint);
 -      uint32_t data[BRW_WM_MAX_SURF];
 -      int i;
 -
 -      for (i = 0; i < brw->wm.nr_surfaces; i++)
 -         if (brw->wm.surf_bo[i])
 -            data[i] = brw->wm.surf_bo[i]->offset;
 -         else
 -            data[i] = 0;
 -
 -      bind_bo = brw_upload_cache( &brw->surface_cache, BRW_SS_SURF_BIND,
 -                                NULL, 0,
 -                                brw->wm.surf_bo, brw->wm.nr_surfaces,
 -                                data, data_size);
 -
 -      /* Emit binding table relocations to surface state */
 -      for (i = 0; i < BRW_WM_MAX_SURF; i++) {
 -       if (brw->wm.surf_bo[i] != NULL) {
 -          drm_intel_bo_emit_reloc(bind_bo, i * sizeof(GLuint),
 -                                  brw->wm.surf_bo[i], 0,
 -                                  I915_GEM_DOMAIN_INSTRUCTION, 0);
 -       }
 +   GLcontext *ctx = &brw->intel.ctx;
 +   int i;
 +   int nr_surfaces = 0;
 +
 +   if (ctx->DrawBuffer->_NumColorDrawBuffers >= 1) {
 +      for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
 +       struct gl_renderbuffer *rb = ctx->DrawBuffer->_ColorDrawBuffers[i];
 +       struct intel_renderbuffer *irb = intel_renderbuffer(rb);
 +       struct intel_region *region = irb ? irb->region : NULL;
 +
 +       brw_add_validated_bo(brw, region->buffer);
 +       nr_surfaces = SURF_INDEX_DRAW(i) + 1;
 +      }
 +   }
 +
 +   if (brw->wm.const_bo) {
 +      brw_add_validated_bo(brw, brw->wm.const_bo);
 +      nr_surfaces = SURF_INDEX_FRAG_CONST_BUFFER + 1;
 +   }
 +
 +   for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
 +      const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
 +      struct gl_texture_object *tObj = texUnit->_Current;
 +      struct intel_texture_object *intelObj = intel_texture_object(tObj);
 +
 +      if (texUnit->_ReallyEnabled) {
 +       brw_add_validated_bo(brw, intelObj->mt->region->buffer);
 +       nr_surfaces = SURF_INDEX_TEXTURE(i) + 1;
        }
     }
  
 -   return bind_bo;
 +   /* Have to update this in our prepare, since the unit's prepare
 +    * relies on it.
 +    */
 +   if (brw->wm.nr_surfaces != nr_surfaces) {
 +      brw->wm.nr_surfaces = nr_surfaces;
 +      brw->state.dirty.brw |= BRW_NEW_NR_WM_SURFACES;
 +   }
  }
  
 -static void prepare_wm_surfaces(struct brw_context *brw )
 +/**
 + * Constructs the set of surface state objects pointed to by the
 + * binding table.
 + */
 +static void
 +upload_wm_surfaces(struct brw_context *brw)
  {
     GLcontext *ctx = &brw->intel.ctx;
     GLuint i;
 -   int old_nr_surfaces;
  
     /* _NEW_BUFFERS | _NEW_COLOR */
     /* Update surfaces for drawing buffers */
        brw_update_renderbuffer_surface(brw, NULL, 0);
     }
  
 -   old_nr_surfaces = brw->wm.nr_surfaces;
 -   brw->wm.nr_surfaces = BRW_MAX_DRAW_BUFFERS;
 -
 -   if (brw->wm.surf_bo[SURF_INDEX_FRAG_CONST_BUFFER] != NULL)
 -       brw->wm.nr_surfaces = SURF_INDEX_FRAG_CONST_BUFFER + 1;
 -
     /* Update surfaces for textures */
     for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
        const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
        const GLuint surf = SURF_INDEX_TEXTURE(i);
  
 -      /* _NEW_TEXTURE, BRW_NEW_TEXDATA */
 +      /* _NEW_TEXTURE */
        if (texUnit->_ReallyEnabled) {
         brw_update_texture_surface(ctx, i);
 -       brw->wm.nr_surfaces = surf + 1;
        } else {
           drm_intel_bo_unreference(brw->wm.surf_bo[surf]);
           brw->wm.surf_bo[surf] = NULL;
        }
     }
  
 -   drm_intel_bo_unreference(brw->wm.bind_bo);
 -   brw->wm.bind_bo = brw_wm_get_binding_table(brw);
 -
 -   if (brw->wm.nr_surfaces != old_nr_surfaces)
 -      brw->state.dirty.brw |= BRW_NEW_NR_WM_SURFACES;
 +   brw->state.dirty.brw |= BRW_NEW_WM_SURFACES;
  }
  
  const struct brw_tracked_state brw_wm_surfaces = {
        .mesa = (_NEW_COLOR |
                 _NEW_TEXTURE |
                 _NEW_BUFFERS),
 -      .brw = (BRW_NEW_CONTEXT |
 -            BRW_NEW_WM_SURFACES),
 +      .brw = (BRW_NEW_BATCH),
        .cache = 0
     },
     .prepare = prepare_wm_surfaces,
 +   .emit = upload_wm_surfaces,
  };
  
 +/**
 + * Constructs the binding table for the WM surface state, which maps unit
 + * numbers to surface state objects.
 + */
 +static void
 +brw_wm_upload_binding_table(struct brw_context *brw)
 +{
 +   uint32_t *bind;
 +   int i;
 +
 +   /* Might want to calculate nr_surfaces first, to avoid taking up so much
 +    * space for the binding table.
 +    */
 +   bind = brw_state_batch(brw, sizeof(uint32_t) * BRW_WM_MAX_SURF,
 +                        32, &brw->wm.bind_bo, &brw->wm.bind_bo_offset);
 +
 +   for (i = 0; i < BRW_WM_MAX_SURF; i++) {
 +      /* BRW_NEW_WM_SURFACES */
 +      bind[i] = brw->wm.surf_offset[i];
 +      if (brw->wm.surf_bo[i]) {
 +       bind[i] = brw->wm.surf_offset[i];
 +      } else {
 +       bind[i] = 0;
 +      }
 +   }
  
 +   brw->state.dirty.brw |= BRW_NEW_BINDING_TABLE;
 +}
  
 +const struct brw_tracked_state brw_wm_binding_table = {
 +   .dirty = {
 +      .mesa = 0,
 +      .brw = (BRW_NEW_BATCH |
 +            BRW_NEW_WM_SURFACES),
 +      .cache = 0
 +   },
 +   .emit = brw_wm_upload_binding_table,
 +};
@@@ -29,8 -29,8 +29,8 @@@
  #include "brw_state.h"
  #include "brw_defines.h"
  #include "brw_util.h"
- #include "shader/prog_parameter.h"
- #include "shader/prog_statevars.h"
+ #include "program/prog_parameter.h"
+ #include "program/prog_statevars.h"
  #include "intel_batchbuffer.h"
  
  static void
@@@ -98,8 -98,7 +98,8 @@@ upload_wm_state(struct brw_context *brw
  
     /* CACHE_NEW_SAMPLER */
     dw2 |= (ALIGN(brw->wm.sampler_count, 4) / 4) << GEN6_WM_SAMPLER_COUNT_SHIFT;
 -   dw4 |= (1 << GEN6_WM_DISPATCH_START_GRF_SHIFT_0);
 +   dw4 |= (brw->wm.prog_data->first_curbe_grf <<
 +         GEN6_WM_DISPATCH_START_GRF_SHIFT_0);
  
     dw5 |= (40 - 1) << GEN6_WM_MAX_THREADS_SHIFT;
     dw5 |= GEN6_WM_DISPATCH_ENABLE;
@@@ -32,7 -32,7 +32,7 @@@
  
  #include "main/mtypes.h"
  #include "main/imports.h"
- #include "shader/prog_parameter.h"
+ #include "program/prog_parameter.h"
  
  #include "radeon_debug.h"
  #include "r600_context.h"
@@@ -6159,7 -6159,7 +6159,7 @@@ GLboolean callPreSub(r700_AssemblerBase
      }
      if(uNumValidSrc > 0)
      {
 -        prelude_cf_ptr     = pAsm->cf_current_alu_clause_ptr;
 +        prelude_cf_ptr     = (R700ControlFlowGenericClause*) pAsm->cf_current_alu_clause_ptr;
          pAsm->alu_x_opcode = SQ_CF_INST_ALU;
      }
  
  
          next_ins(pAsm);        
  
 -        pAsm->callers[pAsm->unCallerArrayPointer - 1].finale_cf_ptr  = pAsm->cf_current_alu_clause_ptr;
 +        pAsm->callers[pAsm->unCallerArrayPointer - 1].finale_cf_ptr  = (R700ControlFlowGenericClause*) pAsm->cf_current_alu_clause_ptr;
          pAsm->callers[pAsm->unCallerArrayPointer - 1].prelude_cf_ptr = prelude_cf_ptr;
          pAsm->alu_x_opcode = SQ_CF_INST_ALU;
      }
@@@ -32,9 -32,9 +32,9 @@@
  #include <math.h>
  
  #include "main/imports.h"
- #include "shader/prog_parameter.h"
- #include "shader/prog_statevars.h"
- #include "shader/program.h"
+ #include "program/prog_parameter.h"
+ #include "program/prog_statevars.h"
+ #include "program/program.h"
  
  #include "r600_context.h"
  #include "r600_cmdbuf.h"
@@@ -563,15 -563,11 +563,15 @@@ GLboolean r700SetupFragmentProgram(GLco
  
      /* see if we need any point_sprite replacements, also increase num_interp
       * as there's no vp output for them */
 -    for (i = FRAG_ATTRIB_TEX0; i<= FRAG_ATTRIB_TEX7; i++)
 +    if (ctx->Point.PointSprite)
      {
 -        if(ctx->Point.CoordReplace[i - FRAG_ATTRIB_TEX0] == GL_TRUE) {
 -            ui++;
 -            point_sprite = GL_TRUE;
 +        for (i = FRAG_ATTRIB_TEX0; i<= FRAG_ATTRIB_TEX7; i++)
 +        {
 +            if (ctx->Point.CoordReplace[i - FRAG_ATTRIB_TEX0] == GL_TRUE)
 +            {
 +                ui++;
 +                point_sprite = GL_TRUE;
 +            }
          }
      }
  
  
      for(i=0; i<8; i++)
      {
 +          GLboolean coord_replace = ctx->Point.PointSprite && ctx->Point.CoordReplace[i];
            unBit = 1 << (VERT_RESULT_TEX0 + i);
 -          if((OutputsWritten & unBit) || (ctx->Point.CoordReplace[i] == GL_TRUE))
 +          if ((OutputsWritten & unBit) || coord_replace)
            {
                    ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_TEX0 + i];
                    SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
                             SEMANTIC_shift, SEMANTIC_mask);
                    CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
                    /* ARB_point_sprite */
 -                  if(ctx->Point.CoordReplace[i] == GL_TRUE)
 +                  if (coord_replace)
                    {
                             SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, PT_SPRITE_TEX_bit);
                    }
  #define ARBPROGRAM_H
  
  
++#include "compiler.h"
++#include "glheader.h"
++
++
  extern void GLAPIENTRY
  _mesa_BindProgram(GLenum target, GLuint id);