egl/kopper: Pass ancillary invalidate flush flags down to gallium.
authorEmma Anholt <emma@anholt.net>
Tue, 14 Feb 2023 18:32:57 +0000 (10:32 -0800)
committerMarge Bot <emma+marge@anholt.net>
Wed, 15 Feb 2023 19:17:07 +0000 (19:17 +0000)
We can just add the flags to the kopper interface, since it's private to
Mesa.  This gets us depth/stencil invalidation on swapbuffers, which is
critical for tiler performance.

glmark2-es2 -b texture (windowed) goes from 1650 to 1930 fps on
zink+turnip with ZINK_DEBUG=rp.

Part of #7321 (we're still a little behind freedreno's 2180 fps)

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21317>

include/kopper_interface.h
src/egl/drivers/dri2/platform_x11.c
src/gallium/frontends/dri/kopper.c
src/glx/drisw_glx.c

index 3db53e8..261d122 100644 (file)
@@ -61,7 +61,8 @@ struct __DRIkopperExtensionRec {
                                         const __DRIconfig *config,
                                         void *loaderPrivate,
                                         int pixmap);
-    int64_t (*swapBuffers)(__DRIdrawable *draw);
+    /* flags is a set of __DRI2_FLUSH_* flags */
+    int64_t (*swapBuffers)(__DRIdrawable *draw, uint32_t flush_flags);
     void (*setSwapInterval)(__DRIdrawable *drawable, int interval);
     int (*queryBufferAge)(__DRIdrawable *drawable);
 };
index 1dc2c1f..a362cce 100644 (file)
@@ -953,7 +953,12 @@ dri2_x11_swap_buffers(_EGLDisplay *disp, _EGLSurface *draw)
    struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
 
    if (dri2_dpy->kopper) {
-      dri2_dpy->kopper->swapBuffers(dri2_surf->dri_drawable);
+      /* From the EGL 1.4 spec (page 52):
+       *
+       *     "The contents of ancillary buffers are always undefined
+       *      after calling eglSwapBuffers."
+       */
+      dri2_dpy->kopper->swapBuffers(dri2_surf->dri_drawable, __DRI2_FLUSH_INVALIDATE_ANCILLARY);
       return EGL_TRUE;
    } else if (!dri2_dpy->flush) {
       /* aka the swrast path, which does the swap in the gallium driver. */
index 9e80569..12141d4 100644 (file)
@@ -840,7 +840,7 @@ kopper_create_drawable(struct dri_screen *screen, const struct gl_config *visual
 }
 
 static int64_t
-kopperSwapBuffers(__DRIdrawable *dPriv)
+kopperSwapBuffers(__DRIdrawable *dPriv, uint32_t flush_flags)
 {
    struct dri_drawable *drawable = dri_drawable(dPriv);
    struct dri_context *ctx = dri_get_current();
@@ -861,7 +861,7 @@ kopperSwapBuffers(__DRIdrawable *dPriv)
    drawable->texture_stamp = drawable->lastStamp - 1;
 
    dri_flush(opaque_dri_context(ctx), opaque_dri_drawable(drawable),
-             __DRI2_FLUSH_DRAWABLE | __DRI2_FLUSH_CONTEXT,
+             __DRI2_FLUSH_DRAWABLE | __DRI2_FLUSH_CONTEXT | flush_flags,
              __DRI2_THROTTLE_SWAPBUFFER);
 
    kopper_copy_to_front(ctx->st->pipe, drawable, ptex);
@@ -881,7 +881,7 @@ kopperSwapBuffers(__DRIdrawable *dPriv)
 static void
 kopper_swap_buffers(struct dri_drawable *drawable)
 {
-   kopperSwapBuffers(opaque_dri_drawable(drawable));
+   kopperSwapBuffers(opaque_dri_drawable(drawable), 0);
 }
 
 static __DRIdrawable *
index 0e41f85..b69eb7c 100644 (file)
@@ -752,7 +752,7 @@ driswSwapBuffers(__GLXDRIdrawable * pdraw,
    }
 
    if (psc->kopper)
-       return psc->kopper->swapBuffers (pdp->driDrawable);
+       return psc->kopper->swapBuffers (pdp->driDrawable, 0);
 
    psc->core->swapBuffers(pdp->driDrawable);