[Mesa-stable] [Mesa-dev] [PATCH] nv50: avoid using inline vertex data submit when gl_VertexID is used
Ilia Mirkin
imirkin at alum.mit.edu
Mon Aug 24 13:02:55 PDT 2015
Edge flag stuff is annoying. Pretty sure only blender uses it. shade
model = flat should get fixed on nv50 before edge flags, since blender
uses that too, and it's produces much worse visual artifacts.
I'm having second thoughts about this patch. I think I'm going to go
back to my previous approach of just calling
nv50_vertex_arrays_validate when vbo_fifo && vertexid. I suspect that
vertexid usage with small draws from client buffers is next to
inexistent, no need to re-emit this stuff so often.
On Mon, Aug 24, 2015 at 4:07 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>
> This fix is simpler than I was expected. What about the edge flag stuff now?
> :)
>
>
> On 08/24/2015 05:51 PM, Ilia Mirkin wrote:
>>
>> The hardware only generates vertexid when vertices come from a VBO. This
>> fixes:
>>
>> vertexid-drawelements
>> vertexid-drawarrays
>>
>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>> Cc: "11.0" <mesa-stable at lists.freedesktop.org>
>> ---
>> src/gallium/drivers/nouveau/nv50/nv50_program.c | 1 +
>> src/gallium/drivers/nouveau/nv50/nv50_program.h | 1 +
>> src/gallium/drivers/nouveau/nv50/nv50_state_validate.c | 3 ++-
>> src/gallium/drivers/nouveau/nv50/nv50_vbo.c | 8 ++++++++
>> 4 files changed, 12 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.c
>> b/src/gallium/drivers/nouveau/nv50/nv50_program.c
>> index 02dc367..eff4477 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_program.c
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.c
>> @@ -66,6 +66,7 @@ nv50_vertprog_assign_slots(struct nv50_ir_prog_info
>> *info)
>> case TGSI_SEMANTIC_VERTEXID:
>> prog->vp.attrs[2] |= NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID;
>> prog->vp.attrs[2] |=
>> NV50_3D_VP_GP_BUILTIN_ATTR_EN_VERTEX_ID_DRAW_ARRAYS_ADD_START;
>> + prog->vp.vertexid = 1;
>> continue;
>> default:
>> break;
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_program.h
>> b/src/gallium/drivers/nouveau/nv50/nv50_program.h
>> index 5d3ff56..f4e8e94 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_program.h
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_program.h
>> @@ -76,6 +76,7 @@ struct nv50_program {
>> ubyte psiz; /* output slot of point size */
>> ubyte bfc[2]; /* indices into varying for FFC (FP) or BFC
>> (VP) */
>> ubyte edgeflag;
>> + ubyte vertexid;
>> ubyte clpd[2]; /* output slot of clip distance[i]'s 1st
>> component */
>> ubyte clpd_nr;
>> } vp;
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c
>> b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c
>> index b304a17..66dcf43 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c
>> @@ -503,7 +503,8 @@ static struct state_validate {
>> { nv50_validate_samplers, NV50_NEW_SAMPLERS },
>> { nv50_stream_output_validate, NV50_NEW_STRMOUT |
>> NV50_NEW_VERTPROG | NV50_NEW_GMTYPROG
>> },
>> - { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS },
>> + { nv50_vertex_arrays_validate, NV50_NEW_VERTEX | NV50_NEW_ARRAYS |
>> + NV50_NEW_VERTPROG },
>> { nv50_validate_min_samples, NV50_NEW_MIN_SAMPLES },
>> };
>> #define validate_list_len (sizeof(validate_list) /
>> sizeof(validate_list[0]))
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
>> b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
>> index 600b973..fb4305f 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
>> @@ -301,6 +301,14 @@ nv50_vertex_arrays_validate(struct nv50_context
>> *nv50)
>> unsigned i;
>> const unsigned n = MAX2(vertex->num_elements,
>> nv50->state.num_vtxelts);
>> + /* A vertexid is not generated for inline data uploads. Have to use
>> a
>> + * VBO. This check must come after the vertprog has been validated,
>> + * otherwise vertexid may be unset.
>> + */
>> + assert(nv50->vertprog->translated);
>> + if (nv50->vertprog->vp.vertexid)
>> + nv50->vbo_push_hint = 0;
>> +
>> if (unlikely(vertex->need_conversion))
>> nv50->vbo_fifo = ~0;
>> else
>
>
More information about the mesa-stable
mailing list