On Thursday, November 13, 2014 04:28:20 PM Kristian Høgsberg wrote: > This patch uses the previous refactoring to add a new run_vs() method > that generates vertex shader code using the scalar visitor and > optimizer. > > Signed-off-by: Kristian Høgsberg <k...@bitplanet.net> > --- > src/mesa/drivers/dri/i965/brw_fs.cpp | 99 ++++++++- > src/mesa/drivers/dri/i965/brw_fs.h | 21 +- > src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 303 ++++++++++++++++++++++++++- > 3 files changed, 412 insertions(+), 11 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp > index 4dce0a2..8007977 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp > @@ -1828,6 +1828,56 @@ fs_visitor::assign_urb_setup() > urb_start + prog_data->num_varying_inputs * 2; > } > > +void > +fs_visitor::assign_vs_urb_setup() > +{ > + brw_vs_prog_data *vs_prog_data = (brw_vs_prog_data *) prog_data; > + int grf, count, slot, channel, attr; > + > + assert(stage == MESA_SHADER_VERTEX); > + count = _mesa_bitcount_64(vs_prog_data->inputs_read); > + if (vs_prog_data->uses_vertexid || vs_prog_data->uses_instanceid) > + count++; > + > + /* Each attribute is 4 regs. */ > + this->first_non_payload_grf = > + payload.num_regs + prog_data->curb_read_length + count * 4; > + > + unsigned vue_entries = > + MAX2(count, vs_prog_data->base.vue_map.num_slots); > + > + vs_prog_data->base.urb_entry_size = ALIGN(vue_entries, 4) / 4; > + vs_prog_data->base.urb_read_length = (count + 1) / 2; > + > + assert(vs_prog_data->base.urb_read_length <= 15);
What enforces this assertion? It obviously needs to be true, since the "Vertex URB Entry Read Length" field in 3DSTATE_VS has a maximum value of 15 in SIMD8 mode. But this looks like the exact same calculation done in vec4_vs_visitor::setup_attributes, and the limit there is [1, 63]. The documentation indicates that the API may allow more vertex attributes than can practically be supported by pushing VUEs in as payload registers: "The EU limit of 128 GRFs imposes a maximum limit of 30 elements per vertex pushed into the payload, though the practical limit may be lower. If input vertices exceed the practical limit, software must decide between resorting to pulling elements during thread execution or dropping back to SIMD4x2 dispatch." I don't see any code in this series for falling back, nor for pulling VUEs out of the URB (and avoiding overwriting them before they're loaded), so I expect this would simply assert fail on a vertex shader with too many inputs. --Ken
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev