diff options
author | Juan A. Suarez Romero <jasuarez@igalia.com> | 2016-04-04 12:47:57 +0200 |
---|---|---|
committer | Alejandro PiƱeiro <apinheiro@igalia.com> | 2016-05-17 09:05:55 +0200 |
commit | b7423b485e11b768f68e8d5865fbc74b07ee6d48 (patch) | |
tree | 6debd2fa15555c52c66fbce1983609770d3ea670 | |
parent | b0fb08e179d784ca319c3c547a874fd24ce93c3f (diff) | |
download | external_mesa3d-b7423b485e11b768f68e8d5865fbc74b07ee6d48.zip external_mesa3d-b7423b485e11b768f68e8d5865fbc74b07ee6d48.tar.gz external_mesa3d-b7423b485e11b768f68e8d5865fbc74b07ee6d48.tar.bz2 |
i965/vec4: use attribute slots to calculate URB read length
Do not use total attributes because a dvec3/dvec4 attribute requires two
slots. So rather use total attribute slots.
v2: do not use loop to calculate required attribute slots (Kenneth
Graunke)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp index 385afc1..ac8dd6f 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp @@ -2104,14 +2104,20 @@ brw_compile_vs(const struct brw_compiler *compiler, void *log_data, nr_attributes++; } + unsigned nr_attribute_slots = + nr_attributes + + _mesa_bitcount_64(shader->info.double_inputs_read); + /* The 3DSTATE_VS documentation lists the lower bound on "Vertex URB Entry * Read Length" as 1 in vec4 mode, and 0 in SIMD8 mode. Empirically, in * vec4 mode, the hardware appears to wedge unless we read something. */ if (is_scalar) - prog_data->base.urb_read_length = DIV_ROUND_UP(nr_attributes, 2); + prog_data->base.urb_read_length = + DIV_ROUND_UP(nr_attribute_slots, 2); else - prog_data->base.urb_read_length = DIV_ROUND_UP(MAX2(nr_attributes, 1), 2); + prog_data->base.urb_read_length = + DIV_ROUND_UP(MAX2(nr_attribute_slots, 1), 2); prog_data->nr_attributes = nr_attributes; @@ -2120,7 +2126,7 @@ brw_compile_vs(const struct brw_compiler *compiler, void *log_data, * the larger of the two. */ const unsigned vue_entries = - MAX2(nr_attributes, (unsigned)prog_data->base.vue_map.num_slots); + MAX2(nr_attribute_slots, (unsigned)prog_data->base.vue_map.num_slots); if (compiler->devinfo->gen == 6) prog_data->base.urb_entry_size = DIV_ROUND_UP(vue_entries, 8); |