Re: [PATCH 11/36] xfree86: add framework for provider support in ddx.
On Mon, Jul 2, 2012 at 8:35 PM, Dave Airlie airl...@gmail.com wrote: On Mon, Jul 2, 2012 at 8:07 PM, Keith Packard kei...@keithp.com wrote: Dave Airlie airl...@gmail.com writes: +xf86ProviderPtr +xf86ProviderCreate(ScrnInfoPtr scrn, + const xf86ProviderFuncsRec *funcs, const char *name) +{ +xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); +xf86ProviderPtr provider; +int len; + +if (xf86_config-provider) +return xf86_config-provider; A 'create' function shouldn't return an existing object; that's more like a 'get' function. Do you expect callers to not know if the object exists yet? I suppose it shouldn't happen, I was just being careful, we should only have one provider object per device, maybe I should just make that an assert. * Requests that the driver resize the screen. @@ -681,6 +731,7 @@ typedef struct _xf86CrtcConfig { /* callback when crtc configuration changes */ xf86_crtc_notify_proc_ptr xf86_crtc_notify; +xf86ProviderPtr provider; } xf86CrtcConfigRec, *xf86CrtcConfigPtr; Could the elements of 'provider' just become members of the crtc config rec? will check that tomorrow, probably could do alright, but I just liked keeping things in an object. @@ -1552,6 +1552,19 @@ xf86RandR12CreateObjects12(ScreenPtr pScreen) output-funcs-create_resources(output); RRPostPendingProperties(output-randr_output); } + +{ +xf86ProviderPtr provider = config-provider; +provider-randr_provider = RRProviderCreate(pScreen, provider-name, + strlen(provider-name), provider); + +if (provider-scrn-is_gpu) { +RRProviderSetRolesAbilities(provider-randr_provider, provider-scrn-roles, +provider-scrn-abilities); +RRProviderSetCurrentRole(provider-randr_provider, provider-scrn-current_role); +} +} + Ok, I'm lost here -- this assumes that config-provider exists, and yet xf86ProviderCreate isn't being called with some default values in case the driver doesn't do that yet. Yeah I should check here in case drivers don't create a provider object alright. I could move the provider stuff into the toplevel struct alright, though that would mean a one provider per GPU model which is what I think is correct. I suppose I need to review the randr protocol bits first before I decide. Dave. ___ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
[PATCH 11/36] xfree86: add framework for provider support in ddx.
From: Dave Airlie airl...@redhat.com This adds the framework for DDX provider support. Signed-off-by: Dave Airlie airl...@redhat.com --- hw/xfree86/common/xf86str.h|4 +++ hw/xfree86/modes/xf86Crtc.c| 46 ++ hw/xfree86/modes/xf86Crtc.h| 58 ++ hw/xfree86/modes/xf86RandR12.c | 60 4 files changed, 168 insertions(+) diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h index 6bd6a62..56397f1 100644 --- a/hw/xfree86/common/xf86str.h +++ b/hw/xfree86/common/xf86str.h @@ -814,6 +814,10 @@ typedef struct _ScrnInfoRec { funcPointer reservedFuncs[NUM_RESERVED_FUNCS]; Bool is_gpu; +uint32_t roles; +uint32_t abilities; +uint32_t current_role; + } ScrnInfoRec; typedef struct { diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 2c8878f..238fb91 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -3202,3 +3202,49 @@ xf86_crtc_supports_gamma(ScrnInfoPtr pScrn) return FALSE; } + +xf86ProviderPtr +xf86ProviderCreate(ScrnInfoPtr scrn, + const xf86ProviderFuncsRec *funcs, const char *name) +{ +xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); +xf86ProviderPtr provider; +int len; + +if (xf86_config-provider) +return xf86_config-provider; + +if (name) +len = strlen(name) + 1; +else +len = 0; + +provider = calloc(sizeof(xf86ProviderRec) + len, 1); +if (!provider) +return NULL; + +provider-scrn = scrn; +provider-funcs = funcs; +if (name) { +provider-name = (char *) (provider + 1); +strcpy(provider-name, name); +} +#ifdef RANDR_12_INTERFACE +provider-randr_provider = NULL; +#endif + +xf86_config-provider = provider; +return provider; +} + +void +xf86SetCurrentRole(ScrnInfoPtr scrn, uint32_t role) +{ +xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); +scrn-current_role = role; + +if (config-provider) +if (config-provider-randr_provider) +RRProviderSetCurrentRole(config-provider-randr_provider, scrn-current_role); +} + diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index a6a3c2e..55466b6 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -50,6 +50,7 @@ typedef struct _xf86Crtc xf86CrtcRec, *xf86CrtcPtr; typedef struct _xf86Output xf86OutputRec, *xf86OutputPtr; +typedef struct _xf86Provider xf86ProviderRec, *xf86ProviderPtr; /* define a standard for connector types */ typedef enum _xf86ConnectorType { @@ -607,6 +608,55 @@ struct _xf86Output { INT16 initialBorder[4]; }; +typedef struct _xf86ProviderFuncs { +/** + * Called to allow the output a chance to create properties after the + * RandR objects have been created. + */ +void + (*create_resources) (xf86ProviderPtr provider); + +/** + * Callback when an provider's property has changed. + */ +Bool +(*set_property) (xf86ProviderPtr provider, + Atom property, RRPropertyValuePtr value); + +/** + * Callback to get an updated property value + */ +Bool +(*get_property) (xf86ProviderPtr provider, Atom property); + +/** + * Clean up driver-specific bits of the provider + */ +void + (*destroy) (xf86ProviderPtr provider); + +} xf86ProviderFuncsRec, *xf86ProviderFuncsPtr; + +struct _xf86Provider { +/** + * ABI versioning + */ +int version; + +ScrnInfoPtr scrn; + +/** Provider name */ +char *name; + +/** provider-specific functions */ +const xf86ProviderFuncsRec *funcs; +#ifdef RANDR_12_INTERFACE +RRProviderPtr randr_provider; +#else +void *randr_provider; +#endif +}; + typedef struct _xf86CrtcConfigFuncs { /** * Requests that the driver resize the screen. @@ -681,6 +731,7 @@ typedef struct _xf86CrtcConfig { /* callback when crtc configuration changes */ xf86_crtc_notify_proc_ptr xf86_crtc_notify; +xf86ProviderPtr provider; } xf86CrtcConfigRec, *xf86CrtcConfigPtr; extern _X_EXPORT int xf86CrtcConfigPrivateIndex; @@ -975,4 +1026,11 @@ extern _X_EXPORT void extern _X_EXPORT Bool xf86_crtc_supports_gamma(ScrnInfoPtr pScrn); +extern _X_EXPORT xf86ProviderPtr +xf86ProviderCreate(ScrnInfoPtr scrn, + const xf86ProviderFuncsRec * funcs, const char *name); + +extern _X_EXPORT void +xf86SetCurrentRole(ScrnInfoPtr scrn, uint32_t role); + #endif /* _XF86CRTC_H_ */ diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 59b6f82..78cad63 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -1552,6 +1552,19 @@ xf86RandR12CreateObjects12(ScreenPtr pScreen) output-funcs-create_resources(output);
Re: [PATCH 11/36] xfree86: add framework for provider support in ddx.
Dave Airlie airl...@gmail.com writes: +xf86ProviderPtr +xf86ProviderCreate(ScrnInfoPtr scrn, + const xf86ProviderFuncsRec *funcs, const char *name) +{ +xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); +xf86ProviderPtr provider; +int len; + +if (xf86_config-provider) +return xf86_config-provider; A 'create' function shouldn't return an existing object; that's more like a 'get' function. Do you expect callers to not know if the object exists yet? +struct _xf86Provider { +/** + * ABI versioning + */ +int version; + +ScrnInfoPtr scrn; + +/** Provider name */ +char *name; + +/** provider-specific functions */ +const xf86ProviderFuncsRec *funcs; +#ifdef RANDR_12_INTERFACE +RRProviderPtr randr_provider; +#else +void *randr_provider; +#endif +}; + typedef struct _xf86CrtcConfigFuncs { /** * Requests that the driver resize the screen. @@ -681,6 +731,7 @@ typedef struct _xf86CrtcConfig { /* callback when crtc configuration changes */ xf86_crtc_notify_proc_ptr xf86_crtc_notify; +xf86ProviderPtr provider; } xf86CrtcConfigRec, *xf86CrtcConfigPtr; Could the elements of 'provider' just become members of the crtc config rec? @@ -1552,6 +1552,19 @@ xf86RandR12CreateObjects12(ScreenPtr pScreen) output-funcs-create_resources(output); RRPostPendingProperties(output-randr_output); } + +{ +xf86ProviderPtr provider = config-provider; +provider-randr_provider = RRProviderCreate(pScreen, provider-name, +strlen(provider-name), provider); + +if (provider-scrn-is_gpu) { +RRProviderSetRolesAbilities(provider-randr_provider, provider-scrn-roles, +provider-scrn-abilities); +RRProviderSetCurrentRole(provider-randr_provider, provider-scrn-current_role); +} +} + Ok, I'm lost here -- this assumes that config-provider exists, and yet xf86ProviderCreate isn't being called with some default values in case the driver doesn't do that yet. -- keith.pack...@intel.com pgpFixA0LHsZU.pgp Description: PGP signature ___ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
Re: [PATCH 11/36] xfree86: add framework for provider support in ddx.
On Mon, Jul 2, 2012 at 8:07 PM, Keith Packard kei...@keithp.com wrote: Dave Airlie airl...@gmail.com writes: +xf86ProviderPtr +xf86ProviderCreate(ScrnInfoPtr scrn, + const xf86ProviderFuncsRec *funcs, const char *name) +{ +xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); +xf86ProviderPtr provider; +int len; + +if (xf86_config-provider) +return xf86_config-provider; A 'create' function shouldn't return an existing object; that's more like a 'get' function. Do you expect callers to not know if the object exists yet? I suppose it shouldn't happen, I was just being careful, we should only have one provider object per device, maybe I should just make that an assert. * Requests that the driver resize the screen. @@ -681,6 +731,7 @@ typedef struct _xf86CrtcConfig { /* callback when crtc configuration changes */ xf86_crtc_notify_proc_ptr xf86_crtc_notify; +xf86ProviderPtr provider; } xf86CrtcConfigRec, *xf86CrtcConfigPtr; Could the elements of 'provider' just become members of the crtc config rec? will check that tomorrow, probably could do alright, but I just liked keeping things in an object. @@ -1552,6 +1552,19 @@ xf86RandR12CreateObjects12(ScreenPtr pScreen) output-funcs-create_resources(output); RRPostPendingProperties(output-randr_output); } + +{ +xf86ProviderPtr provider = config-provider; +provider-randr_provider = RRProviderCreate(pScreen, provider-name, +strlen(provider-name), provider); + +if (provider-scrn-is_gpu) { +RRProviderSetRolesAbilities(provider-randr_provider, provider-scrn-roles, +provider-scrn-abilities); +RRProviderSetCurrentRole(provider-randr_provider, provider-scrn-current_role); +} +} + Ok, I'm lost here -- this assumes that config-provider exists, and yet xf86ProviderCreate isn't being called with some default values in case the driver doesn't do that yet. Yeah I should check here in case drivers don't create a provider object alright. Dave. ___ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel