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
@@ -3742,12 +3742,13 @@ static int init_screen(ScreenPtr pScreen, int i, Bool gpu)
pScreen->ClipNotify = 0; /* for R4 ddx compatibility */
pScreen->CreateScreenResources = 0;
xorg_list_init(&pScreen->pixmap_dirty_list);
xorg_list_init(&pScreen->unattached_list);
xorg_list_init(&pScreen->output_slave_list);
+ xorg_list_init(&pScreen->offload_slave_list);
/*
* This loop gets run once for every Screen that gets added,
* but thats ok. If the ddx layer initializes the formats
* one at a time calling AddScreen() after each, then each
* iteration will make it a little more accurate. Worst case
@@ -3924,6 +3925,24 @@ void
DetachOutputGPU(ScreenPtr slave)
{
assert(slave->isGPU);
xorg_list_del(&slave->output_head);
slave->current_master = NULL;
}
+
+void
+AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr new)
+{
+ assert(new->isGPU);
+ assert(!new->current_master);
+ xorg_list_add(&new->offload_head, &pScreen->offload_slave_list);
+ new->current_master = pScreen;
+}
+
+void
+DetachOffloadGPU(ScreenPtr slave)
+{
+ assert(slave->isGPU);
+ xorg_list_del(&slave->offload_head);
+ slave->current_master = NULL;
+}
+
diff --git a/include/screenint.h b/include/screenint.h
index b992cc224..e36b4d8d4 100644
--- a/include/screenint.h
+++ b/include/screenint.h
@@ -79,9 +79,15 @@ DetachUnboundGPU(ScreenPtr unbound);
extern _X_EXPORT void
AttachOutputGPU(ScreenPtr pScreen, ScreenPtr new);
extern _X_EXPORT void
DetachOutputGPU(ScreenPtr output);
+extern _X_EXPORT void
+AttachOffloadGPU(ScreenPtr pScreen, ScreenPtr new);
+
+extern _X_EXPORT void
+DetachOffloadGPU(ScreenPtr slave);
+
typedef struct _ColormapRec *ColormapPtr;
#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
@@ -504,12 +504,15 @@ typedef struct _Screen {
SetSharedPixmapBackingProcPtr SetSharedPixmapBacking;
StartPixmapTrackingProcPtr StartPixmapTracking;
StopPixmapTrackingProcPtr StopPixmapTracking;
struct xorg_list pixmap_dirty_list;
+ struct xorg_list offload_slave_list;
+ struct xorg_list offload_head;
+
} ScreenRec;
static inline RegionPtr
BitmapToRegion(ScreenPtr _pScreen, PixmapPtr pPix)
{
return (*(_pScreen)->BitmapToRegion) (pPix); /* no mi version?! */
diff --git a/randr/rrprovider.c b/randr/rrprovider.c
index f35ca6a1d..8385d3f5f 100644
--- a/randr/rrprovider.c
+++ b/randr/rrprovider.c
@@ -73,12 +73,16 @@ ProcRRGetProviders (ClientPtr client)
if (pScrPriv->provider)
total_providers++;
xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
pScrPriv = rrGetScrPriv(iter);
total_providers += pScrPriv->provider ? 1 : 0;
}
+ xorg_list_for_each_entry(iter, &pScreen->offload_slave_list, offload_head) {
+ pScrPriv = rrGetScrPriv(iter);
+ total_providers += pScrPriv->provider ? 1 : 0;
+ }
xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) {
pScrPriv = rrGetScrPriv(iter);
total_providers += pScrPriv->provider ? 1 : 0;
}
pScrPriv = rrGetScrPriv(pScreen);
@@ -109,12 +113,15 @@ ProcRRGetProviders (ClientPtr client)
providers = (RRProvider *)extra;
ADD_PROVIDER(pScreen);
xorg_list_for_each_entry(iter, &pScreen->output_slave_list, output_head) {
ADD_PROVIDER(iter);
}
+ xorg_list_for_each_entry(iter, &pScreen->offload_slave_list, offload_head) {
+ ADD_PROVIDER(iter);
+ }
xorg_list_for_each_entry(iter, &pScreen->unattached_list, unattached_head) {
ADD_PROVIDER(iter);
}
}
if (client->swapped) {