[Mesa-dev] [PATCH v4 6/6] i965: gl_BaseVertex must be zero for non-indexed draw calls

Jason Ekstrand jason at jlekstrand.net
Tue Apr 17 19:09:02 UTC 2018


On April 17, 2018 10:31:53 Ian Romanick <idr at freedesktop.org> wrote:

On 04/10/2018 09:26 AM, Jason Ekstrand wrote:
On Tue, Apr 10, 2018 at 1:28 AM, Antia Puentes <apuentes at igalia.com
<mailto:apuentes at igalia.com>> wrote:

On 07/04/18 08:21, Jason Ekstrand wrote:

Oh, boy, this is tricky... First of all, it's a bit of a bummer
that we can't just load the indirect buffer again for this.  Not
too much to do about it, I guess.

Second, there be very scary dragons here.  It turns out that, at
least on Haswell (and possibly other platforms), reading from
state registers while rendering is in-flight can lead to GPU
hangs.  Yes, I said "reading".  We found this out the hard way
while working on Vulkan indirect clear colors.  The better thing
to do here would be to use GPRs when available (I think they're
safe but I'm not sure) or to do a MI_COPY_MEM_MEM which, of
course, is only available on gen8+.  On Ivy Bridge (and haswell if
we're going to do a store_register_mem from a state register), we
need to do a mi_flush *before* the store as well.

I see that this is complicated, I have thought in a different way to
implement this.
Instead of moving gl_BaseVertex to a VE2 and reading its value from
state registers:

- VE1 remains as: <firstvertex, BaseInstance, VertexID, InstanceID>
-> Patches 1-5 are still valid (I think) and we can still calculate
the VertexID as FirstVertex + VertexIDZeroBased.

- VE2 contains: <Draw ID, IsIndexedDraw, 0, 0>,
->when asked for glBaseVertex (nir_instrinsic_load_base_vertex), we
would return the value stored in FirstVertex is the draw call is
indexed, zero if it is not.

How does it sound?.

That sounds fine to me.  It's one extra instruciton in the shader (it

Unless there are objections, I'm going to push patches 1 through 5 (with
the extra comment Jason suggested in patch 4) in the morning.

Fine by me. I don't recall having any major objections.


could be an AND if IsIndexedDraw is 0/~0) and lets us avoid trying to do
command-stream copying of data.  If I understand correcctly, Vulkan will
never hit this path because it will always use FIRST_VERETX and not
BASE_VERTEX.  Is that correct?





More information about the mesa-dev mailing list