i965/gs: Stop storing an input VUE map in the GS program key.
authorPaul Berry <stereotype441@gmail.com>
Mon, 2 Sep 2013 21:02:22 +0000 (14:02 -0700)
committerPaul Berry <stereotype441@gmail.com>
Mon, 16 Sep 2013 19:53:40 +0000 (12:53 -0700)
Now that the vertex shader output VUE map is determined solely by a
64-bit bitfield, we don't have to store it in its entirety in the
geometry shader program key; instead, we can just store the bitfield,
and let the geometry shader infer the VUE map at compile time.

This dramatically reduces the size of the geometry shader program key,
which we want to keep small since it gets recomputed whenever the
active program changes.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_vec4_gs.c
src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp
src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.h

index 2d1d163bad143e0db1b0078ec1274ddef2aab8e5..c5261072600684786a655346171e1dafc7423769 100644 (file)
@@ -200,10 +200,12 @@ do_gs_prog(struct brw_context *brw,
 
    c.prog_data.output_topology = prim_to_hw_prim[gp->program.OutputType];
 
+   brw_compute_vue_map(brw, &c.input_vue_map, c.key.input_varyings);
+
    /* GS inputs are read from the VUE 256 bits (2 vec4's) at a time, so we
     * need to program a URB read length of ceiling(num_slots / 2).
     */
-   c.prog_data.base.urb_read_length = (c.key.input_vue_map.num_slots + 1) / 2;
+   c.prog_data.base.urb_read_length = (c.input_vue_map.num_slots + 1) / 2;
 
    void *mem_ctx = ralloc_context(NULL);
    unsigned program_size;
@@ -272,7 +274,7 @@ brw_upload_gs_prog(struct brw_context *brw)
                                       &key.base.tex);
 
    /* BRW_NEW_VUE_MAP_VS */
-   key.input_vue_map = brw->vue_map_vs;
+   key.input_varyings = brw->vue_map_vs.slots_valid;
 
    if (!brw_search_cache(&brw->cache, BRW_GS_PROG,
                          &key, sizeof(key),
index 960f97032520e439a2a925b524329199a7ed0659..cb7de8d17bf19ede3d321eee2308ad7072430bf5 100644 (file)
@@ -70,8 +70,8 @@ vec4_gs_visitor::setup_varying_inputs(int payload_reg, int *attribute_map)
    assert(num_input_vertices <= MAX_GS_INPUT_VERTICES);
    unsigned input_array_stride = c->prog_data.base.urb_read_length * 2;
 
-   for (int slot = 0; slot < c->key.input_vue_map.num_slots; slot++) {
-      int varying = c->key.input_vue_map.slot_to_varying[slot];
+   for (int slot = 0; slot < c->input_vue_map.num_slots; slot++) {
+      int varying = c->input_vue_map.slot_to_varying[slot];
       for (unsigned vertex = 0; vertex < num_input_vertices; vertex++) {
          attribute_map[BRW_VARYING_SLOT_COUNT * vertex + varying] =
             payload_reg + input_array_stride * vertex + slot;
index 90dd1de7c7add1237aab943a215cc3b9f9219d75..e8da2e351a26d28efdbeb40ad2e60bca404f4873 100644 (file)
@@ -37,7 +37,7 @@ struct brw_gs_prog_key
 {
    struct brw_vec4_prog_key base;
 
-   struct brw_vue_map input_vue_map;
+   GLbitfield64 input_varyings;
 };
 
 
@@ -49,6 +49,7 @@ struct brw_gs_compile
    struct brw_vec4_compile base;
    struct brw_gs_prog_key key;
    struct brw_gs_prog_data prog_data;
+   struct brw_vue_map input_vue_map;
 
    struct brw_geometry_program *gp;