diff options
author | Dave Airlie <airlied@redhat.com> | 2012-07-05 15:41:22 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-07-07 10:37:11 +0100 |
commit | 4c92eb00f97f7b8258de8e366226880382cc9ce9 (patch) | |
tree | 829811ff50ab60864d19d82f3041344299cb18ab | |
parent | bec4cb72c55bb6dee09c65c0844af201067a090f (diff) |
randr: add output source setup
This adds the output sources to the associated list and adds the protocol
handler for the randr SetProviderOutputSource.
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-- | randr/randrstr.h | 8 | ||||
-rw-r--r-- | randr/rrdispatch.c | 2 | ||||
-rw-r--r-- | randr/rrprovider.c | 58 |
3 files changed, 66 insertions, 2 deletions
diff --git a/randr/randrstr.h b/randr/randrstr.h index ac93414cc..5ca8830de 100644 --- a/randr/randrstr.h +++ b/randr/randrstr.h @@ -161,12 +161,13 @@ struct _rrProvider { ScreenPtr pScreen; uint32_t capabilities; char *name; int nameLength; RRPropertyPtr properties; Bool pendingProperties; + struct _rrProvider *output_source; }; #if RANDR_12_INTERFACE typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr pScreen, CARD16 width, CARD16 height, @@ -218,12 +219,16 @@ typedef Bool (*RRProviderSetPropertyProcPtr) (ScreenPtr pScreen, Atom property, RRPropertyValuePtr value); typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation * rotations); typedef Bool (*RRCloseScreenProcPtr) (ScreenPtr pscreen); +typedef Bool (*RRProviderSetOutputSourceProcPtr)(ScreenPtr pScreen, + RRProviderPtr provider, + RRProviderPtr output_source); + /* These are for 1.0 compatibility */ typedef struct _rrRefresh { CARD16 rate; RRModePtr mode; } RRScreenRate, *RRScreenRatePtr; @@ -269,12 +274,13 @@ typedef struct _rrScrPriv { RRGetPanningProcPtr rrGetPanning; RRSetPanningProcPtr rrSetPanning; #endif /* TODO #if RANDR_15_INTERFACE */ RRCrtcSetScanoutPixmapProcPtr rrCrtcSetScanoutPixmap; + RRProviderSetOutputSourceProcPtr rrProviderSetOutputSource; RRProviderGetPropertyProcPtr rrProviderGetProperty; RRProviderSetPropertyProcPtr rrProviderSetProperty; /* * Private part of the structure; not considered part of the ABI */ TimeStamp lastSetTime; /* last changed by client */ @@ -876,12 +882,14 @@ RRProviderInitErrorValue(void); extern _X_EXPORT int ProcRRGetProviders(ClientPtr client); extern _X_EXPORT int ProcRRGetProviderInfo(ClientPtr client); +extern _X_EXPORT int +ProcRRSetProviderOutputSource(ClientPtr client); extern _X_EXPORT Bool RRProviderInit(void); extern _X_EXPORT RRProviderPtr RRProviderCreate(ScreenPtr pScreen, const char *name, diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c index 054e47a7a..6fe51c77a 100644 --- a/randr/rrdispatch.c +++ b/randr/rrdispatch.c @@ -243,13 +243,13 @@ int (*ProcRandrVector[RRNumberRequests]) (ClientPtr) = { ProcRRSetOutputPrimary, /* 30 */ ProcRRGetOutputPrimary, /* 31 */ /* V1.4 additions */ ProcRRGetProviders, /* 32 */ ProcRRGetProviderInfo, /* 33 */ NULL, /* 34 */ - NULL, /* 35 */ + ProcRRSetProviderOutputSource, /* 35 */ ProcRRListProviderProperties, /* 36 */ ProcRRQueryProviderProperty, /* 37 */ ProcRRConfigureProviderProperty, /* 38 */ ProcRRChangeProviderProperty, /* 39 */ ProcRRDeleteProviderProperty, /* 40 */ ProcRRGetProviderProperty, /* 41 */ diff --git a/randr/rrprovider.c b/randr/rrprovider.c index 377320032..f35ca6a1d 100644 --- a/randr/rrprovider.c +++ b/randr/rrprovider.c @@ -134,13 +134,13 @@ ProcRRGetProviders (ClientPtr client) int ProcRRGetProviderInfo (ClientPtr client) { REQUEST(xRRGetProviderInfoReq); xRRGetProviderInfoReply rep; - rrScrPrivPtr pScrPriv; + rrScrPrivPtr pScrPriv, pScrProvPriv; RRProviderPtr provider; ScreenPtr pScreen; CARD8 *extra; unsigned int extraLen = 0; RRCrtc *crtcs; RROutput *outputs; @@ -165,12 +165,16 @@ ProcRRGetProviderInfo (ClientPtr client) rep.timestamp = pScrPriv->lastSetTime.milliseconds; rep.nCrtcs = pScrPriv->numCrtcs; rep.nOutputs = pScrPriv->numOutputs; /* count associated providers */ rep.nAssociatedProviders = 0; + if (provider->output_source) + rep.nAssociatedProviders++; + xorg_list_for_each_entry(provscreen, &pScreen->output_slave_list, output_head) + rep.nAssociatedProviders++; rep.length = (pScrPriv->numCrtcs + pScrPriv->numOutputs + (rep.nAssociatedProviders * 2) + bytes_to_int32(rep.nameLength)); extraLen = rep.length << 2; if (extraLen) { extra = malloc(extraLen); @@ -195,12 +199,32 @@ ProcRRGetProviderInfo (ClientPtr client) for (i = 0; i < pScrPriv->numOutputs; i++) { outputs[i] = pScrPriv->outputs[i]->id; if (client->swapped) swapl(&outputs[i]); } + i = 0; + if (provider->output_source) { + providers[i] = provider->output_source->id; + if (client->swapped) + swapl(&providers[i]); + prov_cap[i] = RR_Capability_SourceOutput; + swapl(&prov_cap[i]); + i++; + } + xorg_list_for_each_entry(provscreen, &pScreen->output_slave_list, output_head) { + pScrProvPriv = rrGetScrPriv(provscreen); + providers[i] = pScrProvPriv->provider->id; + if (client->swapped) + swapl(&providers[i]); + prov_cap[i] = RR_Capability_SinkOutput; + if (client->swapped) + swapl(&prov_cap[i]); + i++; + } + memcpy(name, provider->name, rep.nameLength); if (client->swapped) { swaps(&rep.sequenceNumber); swapl(&rep.length); swapl(&rep.capabilities); swaps(&rep.nCrtcs); @@ -213,12 +237,44 @@ ProcRRGetProviderInfo (ClientPtr client) WriteToClient (client, extraLen, (char *) extra); free(extra); } return Success; } +int +ProcRRSetProviderOutputSource(ClientPtr client) +{ + REQUEST(xRRSetProviderOutputSourceReq); + rrScrPrivPtr pScrPriv; + RRProviderPtr provider, source_provider = NULL; + ScreenPtr pScreen; + + REQUEST_AT_LEAST_SIZE(xRRSetProviderOutputSourceReq); + + VERIFY_RR_PROVIDER(stuff->provider, provider, DixReadAccess); + + if (!(provider->capabilities & RR_Capability_SinkOutput)) + return BadValue; + + if (stuff->source_provider) { + VERIFY_RR_PROVIDER(stuff->source_provider, source_provider, DixReadAccess); + + if (!(source_provider->capabilities & RR_Capability_SourceOutput)) + return BadValue; + } + + pScreen = provider->pScreen; + pScrPriv = rrGetScrPriv(pScreen); + + pScrPriv->rrProviderSetOutputSource(pScreen, provider, source_provider); + + RRTellChanged (pScreen); + + return Success; +} + RRProviderPtr RRProviderCreate(ScreenPtr pScreen, const char *name, int nameLength) { RRProviderPtr provider; rrScrPrivPtr pScrPriv; |