From: Michel Dänzer <michel.daen...@amd.com>

Signed-off-by: Michel Dänzer <michel.daen...@amd.com>
---
 src/drmmode_display.c        | 16 +++-------------
 src/radeon.h                 |  1 +
 src/radeon_bo_helper.c       | 10 ++++++++++
 src/radeon_bo_helper.h       |  3 +++
 src/radeon_glamor_wrappers.c | 21 ++++++++++-----------
 src/radeon_kms.c             |  6 ++----
 src/radeon_present.c         |  4 +---
 7 files changed, 30 insertions(+), 31 deletions(-)

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 54b09730d..3c4d94fd9 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -726,8 +726,7 @@ drmmode_crtc_prime_scanout_update(xf86CrtcPtr crtc, 
DisplayModePtr mode,
                                          gc, 0, 0, mode->HDisplay, 
mode->VDisplay,
                                          0, 0);
                        FreeScratchGC(gc);
-                       radeon_cs_flush_indirect(scrn);
-                       radeon_bo_wait(drmmode_crtc->scanout[0].bo);
+                       radeon_finish(scrn, drmmode_crtc->scanout[0].bo);
                }
        }
 
@@ -785,8 +784,7 @@ drmmode_crtc_scanout_update(xf86CrtcPtr crtc, 
DisplayModePtr mode,
                radeon_scanout_do_update(crtc, scanout_id,
                                         screen->GetWindowPixmap(screen->root),
                                         *box);
-               radeon_cs_flush_indirect(scrn);
-               radeon_bo_wait(drmmode_crtc->scanout[scanout_id].bo);
+               radeon_finish(scrn, drmmode_crtc->scanout[scanout_id].bo);
        }
 }
 
@@ -2240,7 +2238,6 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int 
height)
        int aligned_height;
        uint32_t screen_size;
        int cpp = info->pixel_bytes;
-       struct radeon_bo *front_bo;
        struct radeon_surface surface;
        uint32_t tiling_flags = 0, base_align;
        PixmapPtr ppix = screen->GetScreenPixmap(screen);
@@ -2249,12 +2246,6 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, 
int height)
        if (scrn->virtualX == width && scrn->virtualY == height)
                return TRUE;
 
-       front_bo = info->front_bo;
-       radeon_cs_flush_indirect(scrn);
-
-       if (front_bo)
-               radeon_bo_wait(front_bo);
-
        if (info->allowColorTiling && !info->shadow_primary) {
                if (info->ChipFamily >= CHIP_FAMILY_R600) {
                        if (info->allowColorTiling2D) {
@@ -2364,8 +2355,7 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int 
height)
        }
 
        radeon_pixmap_clear(ppix);
-       radeon_cs_flush_indirect(scrn);
-       radeon_bo_wait(info->front_bo);
+       radeon_finish(scrn, info->front_bo);
 
        for (i = 0; i < xf86_config->num_crtc; i++) {
                xf86CrtcPtr crtc = xf86_config->crtc[i];
diff --git a/src/radeon.h b/src/radeon.h
index c2ae6606e..499e89f92 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -895,6 +895,7 @@ radeon_pixmap_get_fb(PixmapPtr pix)
     return *fb_ptr;
 }
 
+
 #define CP_PACKET0(reg, n)                                             \
        (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2))
 #define CP_PACKET1(reg0, reg1)                                         \
diff --git a/src/radeon_bo_helper.c b/src/radeon_bo_helper.c
index 376589427..7cfe91265 100644
--- a/src/radeon_bo_helper.c
+++ b/src/radeon_bo_helper.c
@@ -235,6 +235,16 @@ radeon_alloc_pixmap_bo(ScrnInfoPtr pScrn, int width, int 
height, int depth,
     return bo;
 }
 
+
+/* Flush and wait for the BO to become idle */
+void
+radeon_finish(ScrnInfoPtr scrn, struct radeon_bo *bo)
+{
+    radeon_cs_flush_indirect(scrn);
+    radeon_bo_wait(bo);
+}
+
+
 /* Clear the pixmap contents to black */
 void
 radeon_pixmap_clear(PixmapPtr pixmap)
diff --git a/src/radeon_bo_helper.h b/src/radeon_bo_helper.h
index e1856adb1..fa99201b2 100644
--- a/src/radeon_bo_helper.h
+++ b/src/radeon_bo_helper.h
@@ -28,6 +28,9 @@ radeon_alloc_pixmap_bo(ScrnInfoPtr pScrn, int width, int 
height, int depth,
                       int usage_hint, int bitsPerPixel, int *new_pitch,
                       struct radeon_surface *new_surface, uint32_t 
*new_tiling);
 
+extern void
+radeon_finish(ScrnInfoPtr scrn, struct radeon_bo *bo);
+
 extern void
 radeon_pixmap_clear(PixmapPtr pixmap);
 
diff --git a/src/radeon_glamor_wrappers.c b/src/radeon_glamor_wrappers.c
index d73742528..94700a7b9 100644
--- a/src/radeon_glamor_wrappers.c
+++ b/src/radeon_glamor_wrappers.c
@@ -58,13 +58,13 @@ radeon_glamor_prepare_access_cpu(ScrnInfoPtr scrn, 
RADEONInfoPtr info,
        struct radeon_bo *bo = priv->bo;
        int ret;
 
-       /* When falling back to swrast, flush all pending operations */
-       if (need_sync) {
-               glamor_block_handler(scrn->pScreen);
-               info->gpu_flushed++;
-       }
-
        if (!pixmap->devPrivate.ptr) {
+               /* When falling back to swrast, flush all pending operations */
+               if (need_sync) {
+                       glamor_block_handler(scrn->pScreen);
+                       info->gpu_flushed++;
+               }
+
                ret = radeon_bo_map(bo, 1);
                if (ret) {
                        xf86DrvMsg(scrn->scrnIndex, X_WARNING,
@@ -76,11 +76,10 @@ radeon_glamor_prepare_access_cpu(ScrnInfoPtr scrn, 
RADEONInfoPtr info,
                }
 
                pixmap->devPrivate.ptr = bo->ptr;
-               info->gpu_synced = info->gpu_flushed;
-       } else if (need_sync) {
-               radeon_bo_wait(bo);
-               info->gpu_synced = info->gpu_flushed;
-       }
+       } else if (need_sync)
+               radeon_finish(scrn, bo);
+
+       info->gpu_synced = info->gpu_flushed;
 
        return TRUE;
 }
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 8579aaf81..d4b59e81b 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -1681,8 +1681,7 @@ void RADEONWindowExposures_oneshot(WindowPtr pWin, 
RegionPtr pRegion
     pScreen->WindowExposures(pWin, pRegion);
 #endif
 
-    radeon_cs_flush_indirect(pScrn);
-    radeon_bo_wait(info->front_bo);
+    radeon_finish(pScrn, info->front_bo);
     drmmode_set_desired_modes(pScrn, &info->drmmode, TRUE);
 }
 
@@ -2585,8 +2584,7 @@ void RADEONLeaveVT_KMS(ScrnInfoPtr pScrn)
                    radeon_pixmap_get_fb(black_scanout.pixmap);
 
                radeon_pixmap_clear(black_scanout.pixmap);
-               radeon_cs_flush_indirect(pScrn);
-               radeon_bo_wait(black_scanout.bo);
+               radeon_finish(pScrn, black_scanout.bo);
 
                for (i = 0; i < xf86_config->num_crtc; i++) {
                    crtc = xf86_config->crtc[i];
diff --git a/src/radeon_present.c b/src/radeon_present.c
index d734b9d44..66805d7df 100644
--- a/src/radeon_present.c
+++ b/src/radeon_present.c
@@ -404,8 +404,6 @@ radeon_present_unflip(ScreenPtr screen, uint64_t event_id)
        FLIP_ASYNC : FLIP_VSYNC;
     int i;
 
-    radeon_cs_flush_indirect(scrn);
-
     if (!radeon_present_check_unflip(scrn))
        goto modeset;
 
@@ -424,7 +422,7 @@ radeon_present_unflip(ScreenPtr screen, uint64_t event_id)
        return;
 
 modeset:
-    radeon_bo_wait(info->front_bo);
+    radeon_finish(scrn, info->front_bo);
     for (i = 0; i < config->num_crtc; i++) {
        xf86CrtcPtr crtc = config->crtc[i];
        drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
-- 
2.18.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to