From patchwork Tue Apr 18 10:07:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Michel_D=C3=A4nzer?= X-Patchwork-Id: 9685271 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E1F6A602C2 for ; Tue, 18 Apr 2017 10:08:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D7EF9283FF for ; Tue, 18 Apr 2017 10:08:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CC78628404; Tue, 18 Apr 2017 10:08:08 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 6E682283FF for ; Tue, 18 Apr 2017 10:08:08 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 045FF89EB7; Tue, 18 Apr 2017 10:08:06 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from netline-mail3.netline.ch (mail.netline.ch [148.251.143.178]) by gabe.freedesktop.org (Postfix) with ESMTP id BC18689DFC; Tue, 18 Apr 2017 10:08:03 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by netline-mail3.netline.ch (Postfix) with ESMTP id 0EAA02AA0FC; Tue, 18 Apr 2017 12:08:03 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at netline-mail3.netline.ch Received: from netline-mail3.netline.ch ([127.0.0.1]) by localhost (netline-mail3.netline.ch [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 7BQLmQ_tjcYr; Tue, 18 Apr 2017 12:08:02 +0200 (CEST) Received: from kaveri (42-144-27-164.rev.home.ne.jp [42.144.27.164]) by netline-mail3.netline.ch (Postfix) with ESMTPSA id 2BA1E2AA0B8; Tue, 18 Apr 2017 12:08:02 +0200 (CEST) Received: from daenzer by kaveri with local (Exim 4.89) (envelope-from ) id 1d0Q38-0003oa-Qn; Tue, 18 Apr 2017 19:07:54 +0900 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= To: xorg-devel@lists.x.org Date: Tue, 18 Apr 2017 19:07:54 +0900 Message-Id: <20170418100754.14621-2-michel@daenzer.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170418100754.14621-1-michel@daenzer.net> References: <20170418100754.14621-1-michel@daenzer.net> MIME-Version: 1.0 Cc: nouveau@lists.freedesktop.org, intel-gfx@lists.freedesktop.org Subject: [Intel-gfx] [PATCH xf86-video-amdgpu] Adapt to PixmapDirtyUpdateRec::src being a DrawablePtr X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP From: Michel Dänzer Signed-off-by: Michel Dänzer --- Chris / Ilia / Ben, this should be manageable for the intel/nouveau drivers, right? src/amdgpu_drv.h | 26 ++++++++++++++++++++++++++ src/amdgpu_kms.c | 18 +++++++++--------- src/drmmode_display.c | 8 ++++++-- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/amdgpu_drv.h b/src/amdgpu_drv.h index e5c44dc36..9e088e71a 100644 --- a/src/amdgpu_drv.h +++ b/src/amdgpu_drv.h @@ -170,6 +170,32 @@ typedef enum { #define AMDGPU_PIXMAP_SHARING 1 #define amdgpu_is_gpu_screen(screen) (screen)->isGPU #define amdgpu_is_gpu_scrn(scrn) (scrn)->is_gpu + +static inline ScreenPtr +amdgpu_dirty_master(PixmapDirtyUpdatePtr dirty) +{ +#ifdef HAS_DIRTYTRACKING_DRAWABLE_SRC + ScreenPtr screen = dirty->src->pScreen; +#else + ScreenPtr screen = dirty->src->drawable.pScreen; +#endif + + if (screen->current_master) + return screen->current_master; + + return screen; +} + +static inline Bool +amdgpu_dirty_src_equals(PixmapDirtyUpdatePtr dirty, PixmapPtr pixmap) +{ +#ifdef HAS_DIRTYTRACKING_DRAWABLE_SRC + return dirty->src == &pixmap->drawable; +#else + return dirty->src == pixmap; +#endif +} + #else #define amdgpu_is_gpu_screen(screen) 0 #define amdgpu_is_gpu_scrn(scrn) 0 diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 0182cbe0a..29d3d076f 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -448,7 +448,7 @@ dirty_region(PixmapDirtyUpdatePtr dirty) static void redisplay_dirty(PixmapDirtyUpdatePtr dirty, RegionPtr region) { - ScrnInfoPtr scrn = xf86ScreenToScrn(dirty->src->drawable.pScreen); + ScrnInfoPtr scrn = xf86ScreenToScrn(dirty->slave_dst->drawable.pScreen); if (RegionNil(region)) goto out; @@ -481,12 +481,12 @@ amdgpu_prime_scanout_update_abort(xf86CrtcPtr crtc, void *event_data) void amdgpu_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) { - ScreenPtr master_screen = dirty->src->master_pixmap->drawable.pScreen; + ScreenPtr master_screen = amdgpu_dirty_master(dirty); PixmapDirtyUpdatePtr ent; RegionPtr region; xorg_list_for_each_entry(ent, &master_screen->pixmap_dirty_list, ent) { - if (ent->slave_dst != dirty->src) + if (!amdgpu_dirty_src_equals(dirty, ent->slave_dst)) continue; region = dirty_region(ent); @@ -501,7 +501,7 @@ amdgpu_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) static Bool master_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) { - ScreenPtr master_screen = dirty->src->master_pixmap->drawable.pScreen; + ScreenPtr master_screen = amdgpu_dirty_master(dirty); return master_screen->SyncSharedPixmap != NULL; } @@ -517,7 +517,7 @@ slave_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) static void call_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) { - ScreenPtr master_screen = dirty->src->master_pixmap->drawable.pScreen; + ScreenPtr master_screen = amdgpu_dirty_master(dirty); master_screen->SyncSharedPixmap(dirty); } @@ -527,7 +527,7 @@ call_sync_shared_pixmap(PixmapDirtyUpdatePtr dirty) static Bool master_has_sync_shared_pixmap(ScrnInfoPtr scrn, PixmapDirtyUpdatePtr dirty) { - ScrnInfoPtr master_scrn = xf86ScreenToScrn(dirty->src->master_pixmap->drawable.pScreen); + ScrnInfoPtr master_scrn = xf86ScreenToScrn(amdgpu_dirty_master(dirty)); return master_scrn->driverName == scrn->driverName; } @@ -581,7 +581,7 @@ amdgpu_prime_scanout_do_update(xf86CrtcPtr crtc, unsigned scanout_id) Bool ret = FALSE; xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list, ent) { - if (dirty->src == scanoutpix && dirty->slave_dst == + if (amdgpu_dirty_src_equals(dirty, scanoutpix) && dirty->slave_dst == drmmode_crtc->scanout[scanout_id ^ drmmode_crtc->tear_free].pixmap) { RegionPtr region; @@ -738,10 +738,10 @@ amdgpu_dirty_update(ScrnInfoPtr scrn) PixmapDirtyUpdatePtr region_ent = ent; if (master_has_sync_shared_pixmap(scrn, ent)) { - ScreenPtr master_screen = ent->src->master_pixmap->drawable.pScreen; + ScreenPtr master_screen = amdgpu_dirty_master(ent); xorg_list_for_each_entry(region_ent, &master_screen->pixmap_dirty_list, ent) { - if (region_ent->slave_dst == ent->src) + if (amdgpu_dirty_src_equals(ent, region_ent->slave_dst)) break; } } diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 5e0c4133b..06103ed56 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -681,7 +681,7 @@ drmmode_crtc_prime_scanout_update(xf86CrtcPtr crtc, DisplayModePtr mode, xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list, ent) { - if (dirty->src == crtc->randr_crtc->scanout_pixmap && + if (amdgpu_dirty_src_equals(dirty, crtc->randr_crtc->scanout_pixmap) && dirty->slave_dst == drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap) { dirty->slave_dst = @@ -1216,7 +1216,11 @@ static Bool drmmode_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix) return FALSE; } -#ifdef HAS_DIRTYTRACKING_ROTATION +#ifdef HAS_DIRTYTRACKING_DRAWABLE_SRC + PixmapStartDirtyTracking(&ppix->drawable, + drmmode_crtc->scanout[scanout_id].pixmap, + 0, 0, 0, 0, RR_Rotate_0); +#elif defined(HAS_DIRTYTRACKING_ROTATION) PixmapStartDirtyTracking(ppix, drmmode_crtc->scanout[scanout_id].pixmap, 0, 0, 0, 0, RR_Rotate_0); #elif defined(HAS_DIRTYTRACKING2)