Floating-point exception in do_clip_tri
With llvmpipe/gallium, I get floating point exceptions for some triangles in do_clip_tri.
A simple repro is like this (I've skipped initializing the gl context and framebuffer etc.):
glBegin(GL_TRIANGLES);
glColor3f(0.0, 0.0, 0.0);
glVertex4f(-11.017273, 6.718994, -8.673355, 8.827454);
glVertex4f(-1.190613, 12.190186, 1.494667, -1.489929);
glVertex4f(4.997009, 7.971436, -5.887838, 5.957642);
glEnd();
This results in a divide by zero exception like this:
@ 0x7ffa75f871ea (unknown) mesa/v17/src/gallium/auxiliary/draw/draw_pipe_clip.c:173 interp
@ 0x7ffa6c17c5aa 1328 base/process_state.cc:1120 FailureSignalHandler()
@ 0x7ffa6b62d9a0 1998039024 (unknown)
@ 0x7ffa75f86b29 768 mesa/v17/src/gallium/auxiliary/draw/draw_pipe_clip.c:540 do_clip_tri
@ 0x7ffa75f8641d 48 mesa/v17/src/gallium/auxiliary/draw/draw_pipe_clip.c:767 clip_tri
@ 0x7ffa75f85b4b 32 mesa/v17/src/gallium/auxiliary/draw/draw_pipe_clip.c:929 clip_first_tri
@ 0x7ffa75f8d2cf 48 mesa/v17/src/gallium/auxiliary/draw/draw_pipe_validate.c:284 validate_tri
@ 0x7ffa75f7ff2c 96 mesa/v17/src/gallium/auxiliary/draw/draw_pipe.c:166 do_triangle
@ 0x7ffa75f7ed35 368 mesa/v17/src/gallium/auxiliary/draw/draw_decompose_tmp.h:103 pipe_run_linear
@ 0x7ffa75f7e9dd 64 mesa/v17/src/gallium/auxiliary/draw/draw_pipe.c:333 draw_pipeline_run_linear
@ 0x7ffa75f988b6 48 mesa/v17/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c:315 pipeline
@ 0x7ffa75f985bf 400 mesa/v17/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c:466 llvm_pipeline_generic
@ 0x7ffa75f97aab 128 mesa/v17/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c:543 llvm_middle_end_linear_run
@ 0x7ffa75fa1e34 48 mesa/v17/src/gallium/auxiliary/draw/draw_pt_vsplit_tmp.h:226 vsplit_segment_simple_linear
@ 0x7ffa75fa0ef6 112 mesa/v17/src/gallium/auxiliary/draw/draw_split_tmp.h:60 vsplit_run_linear
@ 0x7ffa75f92dce 96 mesa/v17/src/gallium/auxiliary/draw/draw_pt.c:149 draw_pt_arrays
@ 0x7ffa75f92616 176 mesa/v17/src/gallium/auxiliary/draw/draw_pt.c:564 draw_vbo
@ 0x7ffa761576a4 96 mesa/v17/src/gallium/drivers/llvmpipe/lp_draw_arrays.c:132 llvmpipe_draw_vbo
@ 0x7ffa75f6cab6 48 mesa/v17/src/gallium/auxiliary/cso_cache/cso_context.c:1728 cso_draw_vbo
@ 0x7ffa761d2cd9 256 mesa/v17/src/mesa/state_tracker/st_draw.c:276 st_draw_vbo
@ 0x7ffa6cb2fb2f 80 mesa/v17/src/mesa/vbo/vbo_exec_draw.c:437 vbo_exec_vtx_flush
@ 0x7ffa6caf807b 32 mesa/v17/src/mesa/vbo/vbo_exec_api.c:631 vbo_exec_FlushVertices_internal
@ 0x7ffa6caf7fe6 48 mesa/v17/src/mesa/vbo/vbo_exec_api.c:1285 vbo_exec_FlushVertices
@ 0x7ffa6c89f89d 64 mesa/v17/src/mesa/main/fbobject.c:2655 _mesa_DeleteFramebuffers
[Yes, I'm still running v17 mesa, but looking at the code here: https://gitlab.freedesktop.org/mesa/mesa/blob/master/src/gallium/auxiliary/draw/draw_pipe_clip.c#L167 it seems like the issue is not fixed].
I think this could probably be avoided by deferring the projective division until after all of the clipping is done (since the points at infinity should get clipped away), but I'm not sure if this would cause other issues.