From: Dave Airlie <[email protected]> A provider object represents a GPU or virtual device that provides rendering or output services to the X server.
This is the first rev of a protocol to enumerate providers devices, set their roles, and provide generic properties based on output properties for them Signed-off-by: Dave Airlie <[email protected]> --- randr.h | 27 +++++- randrproto.h | 149 ++++++++++++++++++++++++++++++++ randrproto.txt | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 429 insertions(+), 4 deletions(-) diff --git a/randr.h b/randr.h index 9cb9403..02988f8 100644 --- a/randr.h +++ b/randr.h @@ -44,7 +44,7 @@ typedef unsigned long XRandrModeFlags; #define RRNumberErrors 3 #define RRNumberEvents 2 -#define RRNumberRequests 37 +#define RRNumberRequests 40 #define X_RRQueryVersion 0 /* we skip 1 to make old clients fail pretty immediately */ @@ -114,6 +114,16 @@ typedef unsigned long XRandrModeFlags; #define X_RRGetCrtcSpriteTransform 35 #define X_RRSetCrtcConfigs 36 +/* v1.5 */ +#define X_RRGetProviders 37 +#define X_RRGetProviderInfo 38 +#define X_RRSetProviderRoles 39 +#define X_RRListProviderProperties 40 +#define X_RRQueryProviderProperty 41 +#define X_RRChangeProviderProperty 42 +#define X_RRDeleteProviderProperty 43 +#define X_RRGetProviderProperty 44 + /* Event selection bits */ #define RRScreenChangeNotifyMask (1L << 0) /* V1.2 additions */ @@ -129,7 +139,7 @@ typedef unsigned long XRandrModeFlags; #define RRNotify_CrtcChange 0 #define RRNotify_OutputChange 1 #define RRNotify_OutputProperty 2 - +#define RRNotify_ProviderProperty 3 /* used in the rotation field; rotation and reflection in 0.1 proto. */ #define RR_Rotate_0 1 #define RR_Rotate_90 2 @@ -184,4 +194,17 @@ typedef unsigned long XRandrModeFlags; #define RR_PROPERTY_BORDER "Border" #define RR_PROPERTY_BORDER_DIMENSIONS "BorderDimensions" +#define RR_Provider_Flag_Dynamic 1 +#define RR_Provider_Flag_MultiMaster 2 + +#define RR_Role_Undefined 0 +#define RR_Role_Master 1 +#define RR_Role_Slave_Offload 2 +#define RR_Role_Slave_Output 4 + +/* abilities for the provider */ +#define RR_Ability_None 0 +#define RR_Ability_Offload_Slaves 1 +#define RR_Ability_Output_Slaves 2 + #endif /* _RANDR_H_ */ diff --git a/randrproto.h b/randrproto.h index 00bae2d..2abafe7 100644 --- a/randrproto.h +++ b/randrproto.h @@ -48,6 +48,7 @@ #define RROutput CARD32 #define RRMode CARD32 #define RRCrtc CARD32 +#define RRProvider CARD32 #define RRModeFlags CARD32 #define PictFormat CARD32 @@ -766,6 +767,137 @@ typedef struct { } xRRSetCrtcConfigsReply; #define sz_xRRSetCrtcConfigsReply 32 +typedef struct { + CARD8 reqType; + CARD8 randrReqType; + CARD16 length B16; + Window window B32; +} xRRGetProvidersReq; +#define sz_xRRGetProvidersReq 8 + +typedef struct { + BYTE type; + CARD8 pad; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 nProviders; + CARD16 max_master; + Time timestamp B32; + CARD32 flags B32; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xRRGetProvidersReply; +#define sz_xRRGetProvidersReply 32 + +typedef struct { + CARD8 reqType; + CARD8 randrReqType; + CARD16 length B16; + RRProvider provider B32; + Time configTimestamp B32; +} xRRGetProviderInfoReq; +#define sz_xRRGetProviderInfoReq 12 + +typedef struct { + BYTE type; + CARD8 status; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD32 current_role B32; + CARD32 allowed_roles B32; + CARD32 abilities B32; + CARD16 nCrtcs B16; + CARD16 nOutputs B16; + CARD16 nameLength B16; + CARD16 pad1 B16; + CARD32 pad2 B32; +} xRRGetProviderInfoReply; +#define sz_xRRGetProviderInfoReply 32 + +typedef struct { + CARD8 reqType; + CARD8 randrReqType; + CARD16 length B16; + CARD16 numProviders B16; + CARD16 pad1 B16; + Time configTimestamp B32; +} xRRSetProviderRolesReq; +#define sz_xRRSetProviderRolesReq 12 + + +typedef struct { + CARD8 reqType; + CARD8 randrReqType; + CARD16 length B16; + RRProvider provider B32; +} xRRListProviderPropertiesReq; +#define sz_xRRListProviderPropertiesReq 8 + +typedef struct { + BYTE type; + CARD8 pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 nProperties B16; + CARD16 pad1 B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xRRListProviderPropertiesReply; +#define sz_xRRListProviderPropertiesReply 32 + +typedef struct { + CARD8 reqType; + CARD8 randrReqType; + CARD16 length B16; + RRProvider provider B32; + Atom property B32; +} xRRQueryProviderPropertyReq; +#define sz_xRRQueryProviderPropertyReq 12 + +typedef struct { + BYTE type; + BYTE pad0; + CARD16 sequenceNumber B16; + CARD32 length B32; + BOOL pending; + BOOL range; + BOOL immutable; + BYTE pad1; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xRRQueryProviderPropertyReply; +#define sz_xRRQueryProviderPropertyReply 32 + +typedef struct { + CARD8 reqType; + CARD8 randrReqType; + CARD16 length B16; + RRProvider provider B32; + Atom property B32; + Atom type B32; + CARD8 format; + CARD8 mode; + CARD16 pad; + CARD32 nUnits B32; +} xRRChangeProviderPropertyReq; +#define sz_xRRChangeProviderPropertyReq 24 + +typedef struct { + CARD8 reqType; + CARD8 randrReqType; + CARD16 length B16; + RRProvider provider B32; + Atom property B32; +} xRRDeleteProviderPropertyReq; +#define sz_xRRDeleteProviderPropertyReq 12 + /* * event */ @@ -836,6 +968,22 @@ typedef struct { #define sz_xRROutputPropertyNotifyEvent 32 typedef struct { + CARD8 type; /* always evBase + RRNotify */ + CARD8 subCode; /* RRNotify_ProviderProperty */ + CARD16 sequenceNumber B16; + Window window B32; /* window requesting notification */ + RRProvider provider B32; /* affected output */ + Atom atom B32; /* property name */ + Time timestamp B32; /* time crtc was changed */ + CARD8 state; /* NewValue or Deleted */ + CARD8 pad1; + CARD16 pad2 B16; + CARD32 pad3 B32; + CARD32 pad4 B32; +} xRROutputPropertyNotifyEvent; +#define sz_xRRProviderPropertyNotifyEvent 32 + +typedef struct { CARD8 reqType; CARD8 randrReqType; CARD16 length B16; @@ -906,6 +1054,7 @@ typedef struct { #undef RROutput #undef RRMode #undef RRCrtc +#undef RRProvider #undef Drawable #undef Window #undef Font diff --git a/randrproto.txt b/randrproto.txt index e90b1cd..0bf2b1f 100644 --- a/randrproto.txt +++ b/randrproto.txt @@ -1,6 +1,6 @@ The X Resize, Rotate and Reflect Extension - Version 1.4.0 - 2009-10-5 + Version 1.5.0 + 2012-05-31 Jim Gettys [email protected] @@ -172,6 +172,28 @@ In both of these cases, the Sprite transforms are necessary to ensure that the sprite appears at the desired spot on each CRTC and with the right shape. +1.5 Introduction to version 1.5 of the extension + +Version 1.5 adds a new object called a provider object. A provider object +represents a GPU or virtual device providing services to the X server. +Providers have a set of abilities and a set of possible roles. + +Provider objects are used to control multi-GPU systems. Provider roles can +be dynamically configured to provide support for: + + 1) Output slaving: plug in a USB device, but have its output rendered + using the main GPU. On some dual-GPU laptops, the second GPU isn't + connected to the LVDS panel, so we need to use the first GPU as an output + slave for the second GPU. + + 2) DRI2 offload - For dual-GPU laptops, allow DRI2 applications to be run + on the second GPU and display on the first GPU. + + 3) GPU switching - Allow switching between two GPUs as the main screen + renderer. + + 4) multiple GPU rendering - This replaces Xinerama. + 1.99 Acknowledgements Our thanks to the contributors to the design found on the xpert mailing @@ -446,6 +468,24 @@ CRTCCONFIG { crtc: CRTC ❧❧❧❧❧❧❧❧❧❧❧ +5.5. Protocol Types added in version 1.5 of the extension + +PROVIDER { XID } + +ABILITYMASK { Offload, Output } + Abilities that this device can work with. + Offload: This device as a master can work with offload slaves. + Output: This device as a master can work with output slaves. + +ROLEMASK { Master, Offload, Output } + List of roles a device can have. + Master: A primary display and primary renderer. + Offload: A DRI2 rendering offload device. + Output: An output device that can accept a shadow + pixmap to display as its scanout buffer. + + ❧❧❧❧❧❧❧❧❧❧❧ + 6. Extension Initialization The name of this extension is "RANDR". @@ -1483,6 +1523,200 @@ dynamic changes in the display environment. ❧❧❧❧❧❧❧❧❧❧❧ +7.4 Extension Requests added in version 1.5 of the extension. + +┌─── + RRGetProviders + window : WINDOW + ▶ + timestamp: TIMESTAMP + providers: LISTofPROVIDER +└─── + Errors: Window + + RRGetPRoviders returns the list of providers connected to the screen + associated with 'window'. + + 'timestamp' indicates when the configuration was last set. + + 'providers' contains the list of PROVIDERs associated with the + screen. + +┌─── + RRGetProviderInfo + provider: PROVIDER + ▶ + abilities: ABILITYMASK + roles: ROLEMASK + current_role: ROLEMASK + name: STRING + crtcs: LISTofCRTC + outputs: LISTofOUTPUT +└─── + Errors: Window + + RRGetProviderInfo return information about the specified provider. + The abilities the provider can support for other providers, and the + roles it can perform. The current_role the provider is operating + in. It also providers the list of crtcs and outputs that this + provider is responsible for. + + 'name' is a UTF-8 encoded strings to be presented to the user to + indicate the device or driver supplied name. + +┌─── + RRSetProviderRoles + providers: LISTofPROVIDER + role: LISTofROLEMASK + ▶ +└─── + Errors: Window + + RRSetProviderRoles allows the roles of the multiple specified providers + to be changed. + +┌─── + RRListProviderProperties + provider:PROVIDERS + ▶ + atoms: LISTof ATOM +└─── + Errors: Provider + + This request returns the atoms of properties currently defined on + the provider. + +┌─── + RRQueryProviderProperty + provider: PROVIDER + property: ATOM + ▶ + pending: BOOL + range: BOOL + immutable: BOOL + valid-values: LISTofINT32 +└─── + Errors: Name, Atom, Provider + + If the specified property does not exist for the specified provider, + then a Name error is returned. + + If 'pending' is TRUE, changes made to property values with + RRChangeProviderProperty will be saved in the pending property value + and be automatically copied to the current value on the next + RRSetCrtcConfig request involving the named output. If 'pending' is + FALSE, changes are copied immediately. + + If 'range' is TRUE, then the valid-values list will contain + precisely two values indicating the minimum and maximum allowed + values. If 'range' is FALSE, then the valid-values list will contain + the list of possible values; attempts to set other values will + result in a Value error. + + If 'immutable' is TRUE, then the property configuration cannot be + changed by clients. Immutable properties are interpreted by the X + server. + +┌─── + RRChangeProviderProperty + provider: PROVIDER + property, type: ATOM + format: {8, 16, 32} + mode: { Replace, Prepend, Append } + data: LISTofINT8 or LISTofINT16 or LISTofINT32 +└─── + Errors: Alloc, Atom, Match, Value, Provider + + This request alters the value of the property for the specified + provider. If the property is marked as a 'pending' property, only the + pending value of the property is changed. Otherwise, changes are + reflected in both the pending and current values of the property. + The type is uninterpreted by the server. The format specifies + whether the data should be viewed as a list of 8-bit, 16-bit, or + 32-bit quantities so that the server can correctly byte-swap as + necessary. + + If the mode is Replace, the previous property value is discarded. + If the mode is Prepend or Append, then the type and format must + match the existing property value (or a Match error results). If + the property is undefined, it is treated as defined with the correct + type and format with zero-length data. + + For Prepend, the data is tacked on to the beginning of the existing + data, and for Append, it is tacked on to the end of the existing data. + + This request generates a ProviderPropertyNotify + + The lifetime of a property is not tied to the storing client. + Properties remain until explicitly deleted, until the provider is + destroyed, or until server reset (see section 10). + + The maximum size of a property is server-dependent and may vary + dynamically. +┌─── + RRDeleteProviderProperty + provider: Provider + property: ATOM +└─── + Errors: Atom, Provider + + This request deletes the property from the specified window if the + property exists and generates a ProviderPropertyNotify event unless + the property does not exist. + +┌─── + RRGetProviderProperty + provider: PROVIDER + property: ATOM + type: ATOM or AnyPropertyType + long-offset, long-length: CARD32 + delete: BOOL + pending: BOOL + ▶ + type: ATOM or None + format: {0, 8, 16, 32} + bytes-after: CARD32 + value: LISTofINT8 or LISTofINT16 or LISTofINT32 +└─── + Errors: Atom, Value, Output + + If the specified property does not exist for the specified output, + then the return type is None, the format and bytes-after are zero, + and the value is empty. The delete argument is ignored in this + case. + + If the specified property exists but its type does not match the + specified type, then the return type is the actual type of the + property, the format is the actual format of the property (never + zero), the bytes-after is the length of the property in bytes (even + if the format is 16 or 32), and the value is empty. The delete + argument is ignored in this case. + + If the specified property exists and either AnyPropertyType is + specified or the specified type matches the actual type of the + property, then the return type is the actual type of the property, + the format is the actual format of the property (never zero), and + the bytes-after and value are as follows, given: + + N = actual length of the stored property in bytes + (even if the format is 16 or 32) + I = 4 × offset + T = N - I + L = MINIMUM(T, 4 × long-length) + A = N - (I + L) + + If 'pending' is true, and if the property holds a pending value, + then the value returned will be the pending value of the property + rather than the current value. The returned value starts at byte + index I in the property (indexing from 0), and its length in bytes + is L. However, it is a Value error if long-offset is given such + that L is negative. The value of bytes-after is A, giving the + number of trailing unread bytes in the stored property. If delete + is True and the bytes-after is zero, the property is also deleted + from the output, and a RROutputPropertyNotify event is generated. + + + ❧❧❧❧❧❧❧❧❧❧❧ 8. Extension Events Clients MAY select for ConfigureNotify on the root window to be @@ -1619,6 +1853,25 @@ factors, such as re-cabling a monitor, etc. just at the time when a display manager or log in script might be changing the monitor size or configuration. +8.2 Events added in version 1.5 of the RandR extension +┌─── + RRProviderPropertyNotify: + window: WINDOW window requesting notification + provider: PROVIDER providre affected by change + atom: ATOM affected property + time: TIMESTAMP time property was changed + state: { NewValue, Deleted } new property state +└─── + + This event is reported to clients selecting RRProviderPropertyChange + on the window and is generated with state NewValue when a property + of the window is changed using RRChangeProviderProperty even when + adding zero-length data and when replacing all or part of a property + with identical data. It is generated with state Deleted when a + property of the window is deleted using either + RRDeleteProviderProperty or RRGetProviderProperty. The timestamp + indicates the server time when the property was changed. + ❧❧❧❧❧❧❧❧❧❧❧ 9. Properties -- 1.7.10.2 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
