[Mesa-dev] [PATCH] indices: fix provoking vertex for quads/quadstrips

Ilia Mirkin imirkin at alum.mit.edu
Tue Apr 7 09:00:30 PDT 2015


Mystery semi-solved? Previously u_primconvert would always select
*FIRST* provoking order when flatshading wasn't enabled, but the quads
would still follow the "last" logic. No big deal. I added support for
quads to be able to follow the provoking vertex convention, but now
the way that the quad is split into tris is different (to make it so
that both tris start with vertex 0). This probably tickles one of the
effects that you allude to.

Soo.... I just changed it to only look at flatshading_first, which
will now generally make it use the LAST provoking order. Problem
solved? Not really, but piglits pass, and this seems more consistent.

On Tue, Apr 7, 2015 at 11:06 AM, Roland Scheidegger <sroland at vmware.com> wrote:
> It will look different with llvmpipe if you use the right debug
> variables (GALLIVM_DEBUG=no_brilinear,no_quad_lod,no_rho_approx), though
> still fail.
> I think the test may not be really valid. This is because if you use
> texgrad, the driver/hw probably will (or should) use per-pixel lod. But
> if you don't, it is of course per-quad. For the smallest mip it will
> only give the same results here if you pick the "right" (top/bottom,
> left/right) values for doing the lod calculations with implicit lod
> (that is, the one from the actually active pixel in the quad, so if the
> active pixel was top/left you must calculate ddx with the top values,
> and ddy with the left values). And I don't think that is a requirement
> anywhere. At least that's what I remember...
> And the cube test is probably not quite right neither (though llvmpipe
> passes it with those mentioned variables, that is more due to the
> implementation of cube mapping though - the cube face selection must be
> done per pixel and not per quad and there's tons of code to get lods
> right be it implicit or explicit).
> Don't know though why the test would regress this, as it shouldn't
> affect it at all with last provoking vertex.
>
> Am 07.04.2015 um 16:28 schrieb Ilia Mirkin:
>> Oh fun, those tests also fail with nvc0 and llvmpipe. But pass on
>> softpipe. (The llvmpipe fail is visually different from the nvc0 and
>> freedreno/a3xx one though.)
>>
>> On Tue, Apr 7, 2015 at 10:25 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>>> Weird, this seems to regress
>>>
>>> bin/arb_shader_texture_lod-texgrad
>>> bin/arb_shader_texture_lod-texgradcube
>>>
>>> Visually they look the same, but piglit finds small differences.
>>>
>>> On Tue, Apr 7, 2015 at 2:20 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>>>> On Tue, Apr 7, 2015 at 1:44 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>>>>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>>>>> ---
>>>>>
>>>>> Pushing this through a complete piglit run, but it seems to fix
>>>>>
>>>>>   bin/arb-provoking-vertex-render
>>>>>
>>>>> on a3xx. Please take special care to double-check that I didn't mess
>>>>> up cw/ccw order or something. I'm especially weak on the quadstrip
>>>>> case.
>>>>>
>>>>>  src/gallium/auxiliary/indices/u_indices_gen.py | 13 ++++++++++---
>>>>>  1 file changed, 10 insertions(+), 3 deletions(-)
>>>>>
>>>>> diff --git a/src/gallium/auxiliary/indices/u_indices_gen.py b/src/gallium/auxiliary/indices/u_indices_gen.py
>>>>> index 687a717..b17d132 100644
>>>>> --- a/src/gallium/auxiliary/indices/u_indices_gen.py
>>>>> +++ b/src/gallium/auxiliary/indices/u_indices_gen.py
>>>>> @@ -142,8 +142,12 @@ def do_tri( intype, outtype, ptr, v0, v1, v2, inpv, outpv ):
>>>>>              tri( intype, outtype, ptr, v2, v0, v1 )
>>>>>
>>>>>  def do_quad( intype, outtype, ptr, v0, v1, v2, v3, inpv, outpv ):
>>>>> -    do_tri( intype, outtype, ptr+'+0',  v0, v1, v3, inpv, outpv );
>>>>> -    do_tri( intype, outtype, ptr+'+3',  v1, v2, v3, inpv, outpv );
>>>>> +    if inpv == LAST:
>>>>> +        do_tri( intype, outtype, ptr+'+0',  v0, v1, v3, inpv, outpv );
>>>>> +        do_tri( intype, outtype, ptr+'+3',  v1, v2, v3, inpv, outpv );
>>>>> +    else:
>>>>> +        do_tri( intype, outtype, ptr+'+0',  v0, v1, v3, inpv, outpv );
>>>>> +        do_tri( intype, outtype, ptr+'+3',  v0, v3, v2, inpv, outpv );
>>>>
>>>> Erm, make that v0, v1, v2; v0, v2, v3. Oops :)
>>>>
>>>>>
>>>>>  def name(intype, outtype, inpv, outpv, pr, prim):
>>>>>      if intype == GENERATE:
>>>>> @@ -331,7 +335,10 @@ def quadstrip(intype, outtype, inpv, outpv, pr):
>>>>>          print '         i += 4;'
>>>>>          print '         goto restart;'
>>>>>          print '      }'
>>>>> -    do_quad( intype, outtype, 'out+j', 'i+2', 'i+0', 'i+1', 'i+3', inpv, outpv );
>>>>> +    if inpv == LAST:
>>>>> +        do_quad( intype, outtype, 'out+j', 'i+2', 'i+0', 'i+1', 'i+3', inpv, outpv );
>>>>> +    else:
>>>>> +        do_quad( intype, outtype, 'out+j', 'i+0', 'i+1', 'i+3', 'i+2', inpv, outpv );
>>>>>      print '   }'
>>>>>      postamble()
>>>>>
>>>>> --
>>>>> 2.0.5
>>>>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=AwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Vjtt0vs_iqoI31UfJxBl7yv9I2FeiaeAYgMTLKRBc_I&m=WCe6lxrKqxKgvrVHuTpgj1fH76sE-mwWzExbv9DnLQs&s=R37n-HrF-x56UKswGlBbLHCIlZvTk6p-Z99737VvlS8&e=
>>
>


More information about the mesa-dev mailing list