[PATCH 09/14] xfree86: add framework for provider support in ddx.

Dave Airlie airlied at gmail.com
Thu Jun 14 07:43:43 PDT 2012


From: Dave Airlie <airlied at redhat.com>

This adds the framework for DDX provider support.

Signed-off-by: Dave Airlie <airlied at 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);
         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);
+        }
+    }
+
     return TRUE;
 }
 
@@ -1746,6 +1759,49 @@ xf86RandR12EnterVT(ScrnInfoPtr pScrn)
 }
 
 static Bool
+xf86RandR15ProviderSetRole(ScreenPtr pScreen,
+                           RRProviderPtr provider,
+                           uint32_t new_role)
+{
+    /* do nothing so far */
+    return TRUE;
+}
+
+static Bool
+xf86RandR15ProviderSetProperty(ScreenPtr pScreen,
+                             RRProviderPtr randr_provider,
+                             Atom property, RRPropertyValuePtr value)
+{
+    xf86ProviderPtr provider = randr_provider->devPrivate;
+
+    /* If we don't have any property handler, then we don't care what the
+     * user is setting properties to.
+     */
+    if (provider->funcs->set_property == NULL)
+        return TRUE;
+
+    /*
+     * This function gets called even when vtSema is FALSE, as
+     * drivers will need to remember the correct value to apply
+     * when the VT switch occurs
+     */
+    return provider->funcs->set_property(provider, property, value);
+}
+
+static Bool
+xf86RandR15ProviderGetProperty(ScreenPtr pScreen,
+                               RRProviderPtr randr_provider, Atom property)
+{
+    xf86ProviderPtr provider = randr_provider->devPrivate;
+
+    if (provider->funcs->get_property == NULL)
+        return TRUE;
+
+    /* Should be safe even w/o vtSema */
+    return provider->funcs->get_property(provider, property);
+}
+
+static Bool
 xf86RandR12Init12(ScreenPtr pScreen)
 {
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
@@ -1767,6 +1823,10 @@ xf86RandR12Init12(ScreenPtr pScreen)
 #endif
     rp->rrModeDestroy = xf86RandR12ModeDestroy;
     rp->rrSetConfig = NULL;
+
+    rp->rrProviderSetRole = xf86RandR15ProviderSetRole;
+    rp->rrProviderSetProperty = xf86RandR15ProviderSetProperty;
+    rp->rrProviderGetProperty = xf86RandR15ProviderGetProperty;
     pScrn->PointerMoved = xf86RandR12PointerMoved;
     pScrn->ChangeGamma = xf86RandR12ChangeGamma;
 
-- 
1.7.10.2



More information about the xorg-devel mailing list