[Mesa-dev] [PATCH v2 14/16] i965: Add fs_visitor::run_vs() to generate scalar vertex shader code
Kenneth Graunke
kenneth at whitecape.org
Mon Dec 1 14:47:43 PST 2014
On Monday, December 01, 2014 12:02:01 PM Kristian Høgsberg wrote:
> On Fri, Nov 14, 2014 at 4:21 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> > 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 <krh at 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.
>
> We only advertise the spec required minimum of 16 vertex attributes
> right now. The 3DSTATE_VS field counts pairs of vertex attributes
> which means we can handle up to 30 in scalar mode.
>
> Kristian
You're right, and it looks like the linker enforces this, so we should never
see a program that violates these constraints.
Thanks!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141201/ac36eb65/attachment.sig>
More information about the mesa-dev
mailing list