summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-05-26 13:11:01 +0100
committerDave Airlie <airlied@redhat.com>2012-07-07 10:37:45 +0100
commit12905dfaf01088a00f4a0a78cffba03329e7b724 (patch)
treecdc23a5354e8484c6a36899f457838927c1132e2
parenta7c01da54ab43f9d29333ccbd79dfc001f9dc5e3 (diff)
dix/xf86: initial offload slave tracking (v1.1)
add the linked list and provider hooks. v1.1: add another assert in the add path. Reviewed-by: Keith Packard <keithp@keithp.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--dix/dispatch.c19
-rw-r--r--include/screenint.h6
-rw-r--r--include/scrnintstr.h3
-rw-r--r--randr/rrprovider.c7
4 files changed, 35 insertions, 0 deletions
diff --git a/dix/dispatch.c b/dix/dispatch.c
index bc803d78f..bcce22fdb 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -3745,6 +3745,7 @@ static int init_screen(ScreenPtr pScreen, int i, Bool gpu)
3745 xorg_list_init(&pScreen->pixmap_dirty_list); 3745 xorg_list_init(&pScreen->pixmap_dirty_list);
3746 xorg_list_init(&pScreen->unattached_list); 3746 xorg_list_init(&pScreen->unattached_list);
3747 xorg_list_init(&pScreen->output_slave_list); 3747 xorg_list_init(&pScreen->output_slave_list);
3748 xorg_list_init(&pScreen->offload_slave_list);
3748 3749
3749 /* 3750 /*
3750 * This loop gets run once for every Screen that gets added, 3751 * This loop gets run once for every Screen that gets added,
@@ -3927,3 +3928,21 @@ DetachOutputGPU(ScreenPtr slave)
3927 xorg_list_del(&slave->output_head); 3928 xorg_list_del(&slave->output_head);
3928 slave->current_master = NULL; 3929 slave->current_master = NULL;
3929} 3930}
3931
3932void
3933AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr new)
3934{
3935 assert(new->isGPU);
3936 assert(!new->current_master);
3937 xorg_list_add(&new->offload_head, &pScreen->offload_slave_list);
3938 new->current_master = pScreen;
3939}
3940
3941void
3942DetachOffloadGPU(ScreenPtr slave)
3943{
3944 assert(slave->isGPU);
3945 xorg_list_del(&slave->offload_head);
3946 slave->current_master = NULL;
3947}
3948
diff --git a/include/screenint.h b/include/screenint.h
index b992cc224..e36b4d8d4 100644
--- a/include/screenint.h
+++ b/include/screenint.h
@@ -82,6 +82,12 @@ AttachOutputGPU(ScreenPtr pScreen, ScreenPtr new);
82extern _X_EXPORT void 82extern _X_EXPORT void
83DetachOutputGPU(ScreenPtr output); 83DetachOutputGPU(ScreenPtr output);
84 84
85extern _X_EXPORT void
86AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr new);
87
88extern _X_EXPORT void
89DetachOffloadGPU(ScreenPtr slave);
90
85typedef struct _ColormapRec *ColormapPtr; 91typedef struct _ColormapRec *ColormapPtr;
86 92
87#endif /* SCREENINT_H */ 93#endif /* SCREENINT_H */
diff --git a/include/scrnintstr.h b/include/scrnintstr.h
index 5ef37ed9a..80601b9f2 100644
--- a/include/scrnintstr.h
+++ b/include/scrnintstr.h
@@ -507,6 +507,9 @@ typedef struct _Screen {
507 StopPixmapTrackingProcPtr StopPixmapTracking; 507 StopPixmapTrackingProcPtr StopPixmapTracking;
508 508
509 struct xorg_list pixmap_dirty_list; 509 struct xorg_list pixmap_dirty_list;
510 struct xorg_list offload_slave_list;
511 struct xorg_list offload_head;
512
510} ScreenRec; 513} ScreenRec;
511 514
512static inline RegionPtr 515static inline RegionPtr
diff --git a/randr/rrprovider.c b/randr/rrprovider.c
index f35ca6a1d..8385d3f5f 100644
--- a/randr/rrprovider.c
+++ b/randr/rrprovider.c
@@ -76,6 +76,10 @@ ProcRRGetProviders (ClientPtr client)
76 pScrPriv = rrGetScrPriv(iter); 76 pScrPriv = rrGetScrPriv(iter);
77 total_providers += pScrPriv->provider ? 1 : 0; 77 total_providers += pScrPriv->provider ? 1 : 0;
78 } 78 }
79 xorg_list_for_each_entry(iter, &pScreen->offload_slave_list, offload_head) {
80 pScrPriv = rrGetScrPriv(iter);
81 total_providers += pScrPriv->provider ? 1 : 0;
82 }
79 xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) { 83 xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) {
80 pScrPriv = rrGetScrPriv(iter); 84 pScrPriv = rrGetScrPriv(iter);
81 total_providers += pScrPriv->provider ? 1 : 0; 85 total_providers += pScrPriv->provider ? 1 : 0;
@@ -112,6 +116,9 @@ ProcRRGetProviders (ClientPtr client)
112 xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) { 116 xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
113 ADD_PROVIDER(iter); 117 ADD_PROVIDER(iter);
114 } 118 }
119 xorg_list_for_each_entry(iter, &pScreen->offload_slave_list, offload_head) {
120 ADD_PROVIDER(iter);
121 }
115 xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) { 122 xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) {
116 ADD_PROVIDER(iter); 123 ADD_PROVIDER(iter);
117 } 124 }