Skip to content
  • Iago Toral's avatar
    v3d: fix TF primitive counts for resume without draw · 2eace10c
    Iago Toral authored and Iago Toral's avatar Iago Toral committed
    
    
    The V3D documentation states that primitive counters are reset when
    we emit Tile Binning Mode Configuration items, which we do at the start
    of each draw call, however, in the actual hardware this doesn't seem to
    take effect when transform feedback is not active (this doesn't happen in
    the simulator). This causes a problem in the following scenario:
    
    glBeginTransformFeedback()
       glDrawArrays()
       glPauseTransformFeedback()
       glDrawArrays()
       glResumeTransformFeedback()
    glEndTransformFeedback()
    
    The TF pause will trigger a flush of the primitive counters, which results
    in a correct number of primitives up to that point. In theory, the counter
    should then be reset when we execute the draw after pausing TF, but that
    doesn't happen, and since TF is enabled again by the resume command before
    we end recording, by the time we end the transform feedback recording we
    again check the counters, but instead of reading 0, we read again the same
    value we read at the time we paused, incorrectly accumulating that value
    again.
    
    In theory, we should be able to avoid this by using the other method to
    reset the primitive counters: using operation 1 instead of 0 when we
    flush the counts to the buffer at the time we pause, but again, this
    doesn't seem to be work and we still see obsolete counts by the time we
    end transform feedback.
    
    This patch fixes the problem by not accumulating TF primitive counts
    unless we know we have actually queued draw calls during transform
    feedback, since that seems to effectively reset the counters. This should
    also be more performant, since it saves unnecessary stalls for the
    primitive counters to be updated when we know there haven't been any
    new primitives drawn.
    
    Fixes CTS tests:
    dEQP-GLES3.functional.transform_feedback.*
    
    Reviewed-by: default avatarEric Anholt <eric@anholt.net>
    2eace10c