s/Tungsten Graphics/VMware/
[mesa.git] / src / mesa / drivers / dri / i965 / brw_vs_surface_state.c
index f9ee4d112a5b991c538c33ab364f8965731ceb11..e3fa6386941c41b82d98b2ae74615464db9a4f69 100644 (file)
@@ -1,6 +1,6 @@
 /*
  Copyright (C) Intel Corp.  2006.  All Rights Reserved.
 /*
  Copyright (C) Intel Corp.  2006.  All Rights Reserved.
- Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
+ Intel funded Tungsten Graphics to
  develop this 3D driver.
 
  Permission is hereby granted, free of charge, to any person obtaining
  develop this 3D driver.
 
  Permission is hereby granted, free of charge, to any person obtaining
  **********************************************************************/
  /*
   * Authors:
  **********************************************************************/
  /*
   * Authors:
-  *   Keith Whitwell <keith@tungstengraphics.com>
+  *   Keith Whitwell <keithw@vmware.com>
   */
 
 #include "main/mtypes.h"
   */
 
 #include "main/mtypes.h"
-#include "main/texstore.h"
 #include "program/prog_parameter.h"
 
 #include "brw_context.h"
 #include "brw_state.h"
 
 #include "program/prog_parameter.h"
 
 #include "brw_context.h"
 #include "brw_state.h"
 
-/* Creates a new VS constant buffer reflecting the current VS program's
- * constants, if needed by the VS program.
- *
- * Otherwise, constants go through the CURBEs using the brw_constant_buffer
- * state atom.
- */
-static void
-prepare_vs_constants(struct brw_context *brw)
+
+void
+brw_upload_vec4_pull_constants(struct brw_context *brw,
+                               GLbitfield brw_new_constbuf,
+                               const struct gl_program *prog,
+                               struct brw_stage_state *stage_state,
+                               const struct brw_vec4_prog_data *prog_data)
 {
 {
-   struct gl_context *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);
    int i;
    int i;
-
-   if (vp->program.IsNVProgram)
-      _mesa_load_tracked_matrices(ctx);
+   uint32_t surf_index = prog_data->base.binding_table.pull_constants_start;
 
    /* Updates the ParamaterValues[i] pointers for all parameters of the
     * basic type of PROGRAM_STATE_VAR.
     */
 
    /* 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);
-
-   /* 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;
+   _mesa_load_state_parameters(&brw->ctx, prog->Parameters);
+
+   if (!prog_data->nr_pull_params) {
+      if (stage_state->const_bo) {
+        drm_intel_bo_unreference(stage_state->const_bo);
+        stage_state->const_bo = NULL;
+        stage_state->surf_offset[surf_index] = 0;
+        brw->state.dirty.brw |= brw_new_constbuf;
       }
       return;
    }
 
    /* _NEW_PROGRAM_CONSTANTS */
       }
       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(brw->vs.const_bo->virtual + i * 4 * sizeof(float),
-            params->ParameterValues[i],
-            4 * sizeof(float));
+   drm_intel_bo_unreference(stage_state->const_bo);
+   uint32_t size = prog_data->nr_pull_params * 4;
+   stage_state->const_bo = drm_intel_bo_alloc(brw->bufmgr, "vec4_const_buffer",
+                                           size, 64);
+
+   drm_intel_gem_bo_map_gtt(stage_state->const_bo);
+
+   for (i = 0; i < prog_data->nr_pull_params; i++) {
+      memcpy(stage_state->const_bo->virtual + i * 4,
+            prog_data->pull_param[i],
+            4);
    }
 
    if (0) {
    }
 
    if (0) {
-      for (i = 0; i < params->NumParameters; i++) {
-        float *row = (float *)brw->vs.const_bo->virtual + i * 4;
-        printf("vs const surface %3d: %4.3f %4.3f %4.3f %4.3f\n",
+      for (i = 0; i < ALIGN(prog_data->nr_pull_params, 4) / 4; i++) {
+        float *row = (float *)stage_state->const_bo->virtual + i * 4;
+        printf("const surface %3d: %4.3f %4.3f %4.3f %4.3f\n",
                i, row[0], row[1], row[2], row[3]);
       }
    }
 
                i, row[0], row[1], row[2], row[3]);
       }
    }
 
-   drm_intel_gem_bo_unmap_gtt(brw->vs.const_bo);
-   brw->state.dirty.brw |= BRW_NEW_VS_CONSTBUF;
+   drm_intel_gem_bo_unmap_gtt(stage_state->const_bo);
+
+   brw_create_constant_surface(brw, stage_state->const_bo, 0, size,
+                               &stage_state->surf_offset[surf_index],
+                               false);
+
+   brw->state.dirty.brw |= brw_new_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.
+/* Creates a new VS constant buffer reflecting the current VS program's
+ * constants, if needed by the VS program.
  *
  *
- * Sets brw->vs.surf_bo[surf] and brw->vp->const_buffer.
+ * Otherwise, constants go through the CURBEs using the brw_constant_buffer
+ * state atom.
  */
 static void
  */
 static void
-brw_update_vs_constant_surface( struct gl_context *ctx,
-                                GLuint surf)
+brw_upload_vs_pull_constants(struct brw_context *brw)
 {
 {
-   struct brw_context *brw = brw_context(ctx);
-   struct intel_context *intel = &brw->intel;
+   struct brw_stage_state *stage_state = &brw->vs.base;
+
+   /* BRW_NEW_VERTEX_PROGRAM */
    struct brw_vertex_program *vp =
       (struct brw_vertex_program *) brw->vertex_program;
    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);
+   /* CACHE_NEW_VS_PROG */
+   const struct brw_vec4_prog_data *prog_data = &brw->vs.prog_data->base;
 
 
-   /* If there's no constant buffer, then no surface BO is needed to point at
-    * it.
-    */
-   if (brw->vs.const_bo == NULL) {
-      brw->vs.surf_offset[surf] = 0;
-      return;
-   }
-
-   if (intel->gen >= 7) {
-      gen7_create_constant_surface(brw, brw->vs.const_bo, params->NumParameters,
-                                 &brw->vs.surf_offset[surf]);
-   } else {
-      brw_create_constant_surface(brw, brw->vs.const_bo, params->NumParameters,
-                                 &brw->vs.surf_offset[surf]);
-   }
+   /* _NEW_PROGRAM_CONSTANTS */
+   brw_upload_vec4_pull_constants(brw, BRW_NEW_VS_CONSTBUF, &vp->program.Base,
+                                  stage_state, prog_data);
 }
 
 }
 
+const struct brw_tracked_state brw_vs_pull_constants = {
+   .dirty = {
+      .mesa = (_NEW_PROGRAM_CONSTANTS),
+      .brw = (BRW_NEW_BATCH | BRW_NEW_VERTEX_PROGRAM),
+      .cache = CACHE_NEW_VS_PROG,
+   },
+   .emit = brw_upload_vs_pull_constants,
+};
 
 static void
 
 static void
-prepare_vs_surfaces(struct brw_context *brw)
-{
-   int nr_surfaces = 0;
-
-   if (brw->vs.const_bo) {
-      brw_add_validated_bo(brw, brw->vs.const_bo);
-      nr_surfaces = 1;
-   }
-
-   if (brw->vs.nr_surfaces != nr_surfaces) {
-      brw->state.dirty.brw |= BRW_NEW_NR_VS_SURFACES;
-      brw->vs.nr_surfaces = nr_surfaces;
-   }
-}
-
-/**
- * Vertex shader surfaces (constant buffer).
- *
- * This consumes the state updates for the constant buffer needing
- * 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 upload_vs_surfaces(struct brw_context *brw)
+brw_upload_vs_ubo_surfaces(struct brw_context *brw)
 {
 {
-   struct gl_context *ctx = &brw->intel.ctx;
-   uint32_t *bind;
-   int i;
+   struct gl_context *ctx = &brw->ctx;
+   /* _NEW_PROGRAM */
+   struct gl_shader_program *prog = ctx->Shader.CurrentVertexProgram;
 
 
-   /* BRW_NEW_NR_VS_SURFACES */
-   if (brw->vs.nr_surfaces == 0) {
-      if (brw->vs.bind_bo_offset) {
-        brw->state.dirty.brw |= BRW_NEW_VS_BINDING_TABLE;
-      }
-      brw->vs.bind_bo_offset = 0;
+   if (!prog)
       return;
       return;
-   }
 
 
-   brw_update_vs_constant_surface(ctx, SURF_INDEX_VERT_CONST_BUFFER);
+   /* CACHE_NEW_VS_PROG */
+   brw_upload_ubo_surfaces(brw, prog->_LinkedShaders[MESA_SHADER_VERTEX],
+                          &brw->vs.base, &brw->vs.prog_data->base.base);
+}
 
 
-   /* Might want to calculate nr_surfaces first, to avoid taking up so much
-    * space for the binding table. (once we have vs samplers)
-    */
-   bind = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
-                         sizeof(uint32_t) * BRW_VS_MAX_SURF,
-                         32, &brw->vs.bind_bo_offset);
+const struct brw_tracked_state brw_vs_ubo_surfaces = {
+   .dirty = {
+      .mesa = _NEW_PROGRAM,
+      .brw = BRW_NEW_BATCH | BRW_NEW_UNIFORM_BUFFER,
+      .cache = CACHE_NEW_VS_PROG,
+   },
+   .emit = brw_upload_vs_ubo_surfaces,
+};
 
 
-   for (i = 0; i < BRW_VS_MAX_SURF; i++) {
-      /* BRW_NEW_VS_CONSTBUF */
-      bind[i] = brw->vs.surf_offset[i];
+static void
+brw_upload_vs_abo_surfaces(struct brw_context *brw)
+{
+   struct gl_context *ctx = &brw->ctx;
+   /* _NEW_PROGRAM */
+   struct gl_shader_program *prog = ctx->Shader.CurrentVertexProgram;
+
+   if (prog) {
+      /* CACHE_NEW_VS_PROG */
+      brw_upload_abo_surfaces(brw, prog, &brw->vs.base,
+                              &brw->vs.prog_data->base.base);
    }
    }
-
-   brw->state.dirty.brw |= BRW_NEW_VS_BINDING_TABLE;
 }
 
 }
 
-const struct brw_tracked_state brw_vs_surfaces = {
+const struct brw_tracked_state brw_vs_abo_surfaces = {
    .dirty = {
    .dirty = {
-      .mesa = 0,
-      .brw = (BRW_NEW_VS_CONSTBUF |
-             BRW_NEW_NR_VS_SURFACES |
-             BRW_NEW_BATCH),
-      .cache = 0
+      .mesa = _NEW_PROGRAM,
+      .brw = BRW_NEW_BATCH | BRW_NEW_ATOMIC_BUFFER,
+      .cache = CACHE_NEW_VS_PROG,
    },
    },
-   .prepare = prepare_vs_surfaces,
-   .emit = upload_vs_surfaces,
+   .emit = brw_upload_vs_abo_surfaces,
 };
 };