On Monday, June 27, 2016 2:50:02 PM PDT Iago Toral wrote: > On Sun, 2016-06-26 at 01:53 -0700, Kenneth Graunke wrote: > > emit_urb_writes() contains code to emit an EOT write with no actual > > data when there are no output varyings. This makes sense for the VS > > and TES stages, where it's called once at the end of the program. > > > > However, in the geometry shader stage, emit_urb_writes() is called once > > for every EmitVertex(). We explicitly emit a URB write with EOT set at > > the end of the shader, separately from this path. So we'd better not > > terminate the thread. This could get us into trouble for shaders which > > do EmitVertex() with no varyings followed by SSBO/image/atomic writes. > > > > It also caused us to emit multiple sends with EOT set, which apparently > > confuses the register allocator into not using g112-g127 for all but > > the first one. This caused EU validation failures in OglGSCloth > > shaders in shader-db. (The actual application was fine, but shader-db > > thinks there are no outputs because it doesn't understand transform > > feedback.) > > > > Cc: [email protected] > > Signed-off-by: Kenneth Graunke <[email protected]> > > --- > > src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 4 ++++ > > 1 file changed, 4 insertions(+) > > > > diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > > b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > > index 3a49794..4a1ff30 100644 > > --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > > +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp > > @@ -594,6 +594,10 @@ fs_visitor::emit_urb_writes(const fs_reg > > &gs_vertex_count) > > * "The write data payload can be between 1 and 8 message phases > > long." > > */ > > if (vue_map->slots_valid == 0) { > > + /* For GS, just turn EmitVertex() into a no-op. */ > > Maybe it would be better to explain in this comment why we can do this > safely here, which as you say would be because for GS we will send a > send with EOT set at the end of the shader in any case. > > Both patches are: > Reviewed-by: Iago Toral Quiroga <[email protected]>
Good call. I've updated this locally to:
/* For GS, just turn EmitVertex() into a no-op. We don't want it to
* end the thread, and emit_gs_thread_end() already emits a SEND with
* EOT at the end of the program for us.
*/
Thanks Iago!
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
