st/mesa: flush the bitmap cache before st/dri and vbo flushes
authorMarek Olšák <marek.olsak@amd.com>
Thu, 23 Jan 2020 00:14:50 +0000 (19:14 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 10 Mar 2020 01:26:55 +0000 (21:26 -0400)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3986>

src/mesa/state_tracker/st_cb_flush.c
src/mesa/state_tracker/st_manager.c

index 36f7f2320c8ee4770d8dcf939a1328c0a107e721..08b645433ac40d15a33434b904e784285ea322f5 100644 (file)
@@ -52,8 +52,6 @@ st_flush(struct st_context *st,
          struct pipe_fence_handle **fence,
          unsigned flags)
 {
-   st_flush_bitmap_cache(st);
-
    /* We want to call this function periodically.
     * Typically, it has nothing to do so it shouldn't be expensive.
     */
@@ -71,6 +69,7 @@ st_finish(struct st_context *st)
 {
    struct pipe_fence_handle *fence = NULL;
 
+   st_flush_bitmap_cache(st);
    st_flush(st, &fence, PIPE_FLUSH_ASYNC | PIPE_FLUSH_HINT_FINISH);
 
    if (fence) {
@@ -92,6 +91,8 @@ st_glFlush(struct gl_context *ctx)
 {
    struct st_context *st = st_context(ctx);
 
+   st_flush_bitmap_cache(st);
+
    /* Don't call st_finish() here.  It is not the state tracker's
     * responsibilty to inject sleeps in the hope of avoiding buffer
     * synchronization issues.  Calling finish() here will just hide
index f3954039feb3102a440afe56fe1de5c94d2ebcbf..99404015c32da5582ee5be118dacc579d1805511 100644 (file)
@@ -661,6 +661,10 @@ st_context_flush(struct st_context_iface *stctxi, unsigned flags,
    if (flags & ST_FLUSH_FENCE_FD)
       pipe_flags |= PIPE_FLUSH_FENCE_FD;
 
+   /* If both the bitmap cache is dirty and there are unflushed vertices,
+    * it means that glBitmap was called first and then glBegin.
+    */
+   st_flush_bitmap_cache(st);
    FLUSH_VERTICES(st->ctx, 0);
 
    /* Notify the caller that we're ready to flush */