On April 17, 2018 10:31:53 Ian Romanick <i...@freedesktop.org> wrote:
On 04/10/2018 09:26 AM, Jason Ekstrand wrote: On Tue, Apr 10, 2018 at 1:28 AM, Antia Puentes <apuen...@igalia.com <mailto:apuen...@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? _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev