[Mesa-stable] [Mesa-dev] [PATCH] nv50: avoid using inline vertex data submit when gl_VertexID is used

Samuel Pitoiset samuel.pitoiset at gmail.com
Mon Aug 24 13:12:41 PDT 2015



On 08/24/2015 10:02 PM, Ilia Mirkin wrote:
> 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.

No rush for this one though.

>
> 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.

Good, I'd be happy to have a look at this second approach.

>
> 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