Bump dri2proto dependency to 2.7. Bump DRI2INFOREC_VERSION to 7. This new protocol request effectively allows clients to perform feature detection on the DDX. The request was added in DRI2 protocol 1.4.
If I had DRI2GetParam in June 2011, when I was implementing support in the Intel DDX and Mesa for new hardware that required a new DRI2 attachment format, then I could have avoided a week of pain caused by the necessity of writing a horrid feature detection hack [1] in Mesa. In the future, when the work begins to add MSAA support to the Intel DDX, having a clean way to do feature detection will allow us to avoid revisiting and expanding that hack. [1] mesa, commit aea2236a, function intel_verify_dri2_has_hiz CC: Keith Packard <[email protected]> CC: Kristian Høgsberg <[email protected]> CC: Ian Romanick <[email protected]> CC: Eric Anholt <[email protected]> CC: Ville Syrjälä <[email protected]> CC: Michel Dänzer <[email protected]> CC: Jesse Barnes <[email protected]> CC: Chris Wilson <[email protected]> Signed-off-by: Chad Versace <[email protected]> --- configure.ac | 2 +- hw/xfree86/dri2/dri2.c | 30 ++++++++++++++++++++++++++++++ hw/xfree86/dri2/dri2.h | 34 +++++++++++++++++++++++++++++++++- hw/xfree86/dri2/dri2ext.c | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 6a41ea8..a2e22f7 100644 --- a/configure.ac +++ b/configure.ac @@ -773,7 +773,7 @@ RECORDPROTO="recordproto >= 1.13.99.1" SCRNSAVERPROTO="scrnsaverproto >= 1.1" RESOURCEPROTO="resourceproto >= 1.2.0" DRIPROTO="xf86driproto >= 2.1.0" -DRI2PROTO="dri2proto >= 2.6" +DRI2PROTO="dri2proto >= 2.7" XINERAMAPROTO="xineramaproto" BIGFONTPROTO="xf86bigfontproto >= 1.2.0" DGAPROTO="xf86dgaproto >= 2.0.99.1" diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 591ff3a..d40cea2 100644 --- a/hw/xfree86/dri2/dri2.c +++ b/hw/xfree86/dri2/dri2.c @@ -107,6 +107,7 @@ typedef struct _DRI2Screen { DRI2AuthMagicProcPtr AuthMagic; DRI2ReuseBufferNotifyProcPtr ReuseBufferNotify; DRI2SwapLimitValidateProcPtr SwapLimitValidate; + DRI2GetParamProcPtr GetParam; HandleExposuresProcPtr HandleExposures; @@ -1210,6 +1211,11 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info) ds->SwapLimitValidate = info->SwapLimitValidate; } + if (info->version >= 7) { + ds->GetParam = info->GetParam; + cur_minor = 4; + } + /* * if the driver doesn't provide an AuthMagic function or the info struct * version is too low, it relies on the old method (using libdrm) or fail @@ -1332,3 +1338,27 @@ DRI2Version(int *major, int *minor) if (minor != NULL) *minor = DRI2VersRec.minorversion; } + +int +DRI2GetParam(ClientPtr client, + DrawablePtr drawable, + CARD32 namespace_, + CARD64 param, + BOOL *is_param_recognized, + CARD64 *value) +{ + DRI2ScreenPtr ds = DRI2GetScreen(drawable->pScreen); + + switch (namespace_) { + case DRI2ParamNamespaceServer: + /* The server currently recognizes no parameters. */ + *is_param_recognized = FALSE; + return Success; + case DRI2ParamNamespaceDriver: + return ds->GetParam(client, drawable, namespace_, param, + is_param_recognized, value); + default: + client->errorValue = namespace_; + return BadValue; + } +} diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h index 00b3668..49489c7 100644 --- a/hw/xfree86/dri2/dri2.h +++ b/hw/xfree86/dri2/dri2.h @@ -176,9 +176,30 @@ typedef Bool (*DRI2SwapLimitValidateProcPtr) (DrawablePtr pDraw, int swap_limit); /** + * \brief Get the value of a parameter. + * + * The parameter's \a value is looked up in the \a namespace_ on the screen + * associated with \a pDrawable. + * + * Parameter names in the server namespace are invariant with + * respect to the loaded driver. Parameter names in the driver + * namespace are specific to the loaded driver. + * + * \param namespace_ is one of DRI2ParamNamespaceServer, + * DRI2ParamNamespaceDriver. + * \return \c Success or error code. + */ +typedef int (*DRI2GetParamProcPtr) (ClientPtr client, + DrawablePtr pDrawable, + CARD32 namespace_, + CARD64 param, + BOOL *is_param_recognized, + CARD64 *value); + +/** * Version of the DRI2InfoRec structure defined in this header */ -#define DRI2INFOREC_VERSION 6 +#define DRI2INFOREC_VERSION 7 typedef struct { unsigned int version; /**< Version of this struct */ @@ -211,6 +232,10 @@ typedef struct { DRI2ReuseBufferNotifyProcPtr ReuseBufferNotify; DRI2SwapLimitValidateProcPtr SwapLimitValidate; + + /* added in version 7 */ + + DRI2GetParamProcPtr GetParam; } DRI2InfoRec, *DRI2InfoPtr; extern _X_EXPORT int DRI2EventBase; @@ -308,4 +333,11 @@ extern _X_EXPORT void DRI2WaitMSCComplete(ClientPtr client, DrawablePtr pDraw, int frame, unsigned int tv_sec, unsigned int tv_usec); +extern _X_EXPORT int DRI2GetParam(ClientPtr client, + DrawablePtr pDrawable, + CARD32 namespace_, + CARD64 param, + BOOL *is_param_recognized, + CARD64 *value); + #endif diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c index 2579a5c..67a5aec 100644 --- a/hw/xfree86/dri2/dri2ext.c +++ b/hw/xfree86/dri2/dri2ext.c @@ -535,6 +535,40 @@ ProcDRI2WaitSBC(ClientPtr client) } static int +ProcDRI2GetParam(ClientPtr client) +{ + REQUEST(xDRI2GetParamReq); + xDRI2GetParamReply rep; + DrawablePtr pDrawable; + CARD64 param; + CARD64 value; + int status; + + REQUEST_SIZE_MATCH(xDRI2GetParamReq); + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; + + if (!validDrawable(client, stuff->drawable, DixReadAccess, + &pDrawable, &status)) + return status; + + param = vals_to_card64(stuff->param_lo, stuff->param_hi); + status = DRI2GetParam(client, + pDrawable, stuff->namespace_, param, + &rep.is_param_recognized, &value); + rep.value_hi = value >> 32; + rep.value_lo = value & 0xffffffff; + + if (status != Success) + return status; + + WriteToClient(client, sizeof(xDRI2GetParamReply), &rep); + + return status; +} + +static int ProcDRI2Dispatch(ClientPtr client) { REQUEST(xReq); @@ -572,6 +606,8 @@ ProcDRI2Dispatch(ClientPtr client) return ProcDRI2WaitSBC(client); case X_DRI2SwapInterval: return ProcDRI2SwapInterval(client); + case X_DRI2GetParam: + return ProcDRI2GetParam(client); default: return BadRequest; } -- 1.7.10.1 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
