dri2: Add DRI2GetParam request (v2)
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 to write 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 v2: If driver doesn't define ds->GetParam, dont' crash. Fall back to default behavior, per keithp. Reviewed-by: Keith Packard <keithp@keithp.com> Reviewed-by: Eric Anholt <eric@anholt.net> (v1) Reviewed-by: Ian Romanick <idr@freedesktop.org> (v1) Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
This commit is contained in:
parent
594b4a4f06
commit
78f0d9cdc4
|
@ -773,7 +773,7 @@ RECORDPROTO="recordproto >= 1.13.99.1"
|
||||||
SCRNSAVERPROTO="scrnsaverproto >= 1.1"
|
SCRNSAVERPROTO="scrnsaverproto >= 1.1"
|
||||||
RESOURCEPROTO="resourceproto >= 1.2.0"
|
RESOURCEPROTO="resourceproto >= 1.2.0"
|
||||||
DRIPROTO="xf86driproto >= 2.1.0"
|
DRIPROTO="xf86driproto >= 2.1.0"
|
||||||
DRI2PROTO="dri2proto >= 2.6"
|
DRI2PROTO="dri2proto >= 2.7"
|
||||||
XINERAMAPROTO="xineramaproto"
|
XINERAMAPROTO="xineramaproto"
|
||||||
BIGFONTPROTO="xf86bigfontproto >= 1.2.0"
|
BIGFONTPROTO="xf86bigfontproto >= 1.2.0"
|
||||||
DGAPROTO="xf86dgaproto >= 2.0.99.1"
|
DGAPROTO="xf86dgaproto >= 2.0.99.1"
|
||||||
|
|
|
@ -107,6 +107,7 @@ typedef struct _DRI2Screen {
|
||||||
DRI2AuthMagicProcPtr AuthMagic;
|
DRI2AuthMagicProcPtr AuthMagic;
|
||||||
DRI2ReuseBufferNotifyProcPtr ReuseBufferNotify;
|
DRI2ReuseBufferNotifyProcPtr ReuseBufferNotify;
|
||||||
DRI2SwapLimitValidateProcPtr SwapLimitValidate;
|
DRI2SwapLimitValidateProcPtr SwapLimitValidate;
|
||||||
|
DRI2GetParamProcPtr GetParam;
|
||||||
|
|
||||||
HandleExposuresProcPtr HandleExposures;
|
HandleExposuresProcPtr HandleExposures;
|
||||||
|
|
||||||
|
@ -1210,6 +1211,11 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
|
||||||
ds->SwapLimitValidate = info->SwapLimitValidate;
|
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
|
* 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
|
* version is too low, it relies on the old method (using libdrm) or fail
|
||||||
|
@ -1332,3 +1338,38 @@ DRI2Version(int *major, int *minor)
|
||||||
if (minor != NULL)
|
if (minor != NULL)
|
||||||
*minor = DRI2VersRec.minorversion;
|
*minor = DRI2VersRec.minorversion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DRI2GetParam(ClientPtr client,
|
||||||
|
DrawablePtr drawable,
|
||||||
|
CARD64 param,
|
||||||
|
BOOL *is_param_recognized,
|
||||||
|
CARD64 *value)
|
||||||
|
{
|
||||||
|
DRI2ScreenPtr ds = DRI2GetScreen(drawable->pScreen);
|
||||||
|
char high_byte = (param >> 24);
|
||||||
|
|
||||||
|
switch (high_byte) {
|
||||||
|
case 0:
|
||||||
|
/* Parameter names whose high_byte is 0 are reserved for the X
|
||||||
|
* server. The server currently recognizes no parameters.
|
||||||
|
*/
|
||||||
|
goto not_recognized;
|
||||||
|
case 1:
|
||||||
|
/* Parameter names whose high byte is 1 are reserved for the DDX. */
|
||||||
|
if (ds->GetParam)
|
||||||
|
return ds->GetParam(client, drawable, param,
|
||||||
|
is_param_recognized, value);
|
||||||
|
else
|
||||||
|
goto not_recognized;
|
||||||
|
default:
|
||||||
|
/* Other parameter names are reserved for future use. They are never
|
||||||
|
* recognized.
|
||||||
|
*/
|
||||||
|
goto not_recognized;
|
||||||
|
}
|
||||||
|
|
||||||
|
not_recognized:
|
||||||
|
*is_param_recognized = FALSE;
|
||||||
|
return Success;
|
||||||
|
}
|
||||||
|
|
|
@ -175,10 +175,24 @@ typedef void (*DRI2InvalidateProcPtr) (DrawablePtr pDraw, void *data, XID id);
|
||||||
typedef Bool (*DRI2SwapLimitValidateProcPtr) (DrawablePtr pDraw,
|
typedef Bool (*DRI2SwapLimitValidateProcPtr) (DrawablePtr pDraw,
|
||||||
int swap_limit);
|
int swap_limit);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get the value of a parameter.
|
||||||
|
*
|
||||||
|
* The parameter's \a value is looked up on the screen associated with
|
||||||
|
* \a pDrawable.
|
||||||
|
*
|
||||||
|
* \return \c Success or error code.
|
||||||
|
*/
|
||||||
|
typedef int (*DRI2GetParamProcPtr) (ClientPtr client,
|
||||||
|
DrawablePtr pDrawable,
|
||||||
|
CARD64 param,
|
||||||
|
BOOL *is_param_recognized,
|
||||||
|
CARD64 *value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Version of the DRI2InfoRec structure defined in this header
|
* Version of the DRI2InfoRec structure defined in this header
|
||||||
*/
|
*/
|
||||||
#define DRI2INFOREC_VERSION 6
|
#define DRI2INFOREC_VERSION 7
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned int version; /**< Version of this struct */
|
unsigned int version; /**< Version of this struct */
|
||||||
|
@ -211,6 +225,10 @@ typedef struct {
|
||||||
|
|
||||||
DRI2ReuseBufferNotifyProcPtr ReuseBufferNotify;
|
DRI2ReuseBufferNotifyProcPtr ReuseBufferNotify;
|
||||||
DRI2SwapLimitValidateProcPtr SwapLimitValidate;
|
DRI2SwapLimitValidateProcPtr SwapLimitValidate;
|
||||||
|
|
||||||
|
/* added in version 7 */
|
||||||
|
|
||||||
|
DRI2GetParamProcPtr GetParam;
|
||||||
} DRI2InfoRec, *DRI2InfoPtr;
|
} DRI2InfoRec, *DRI2InfoPtr;
|
||||||
|
|
||||||
extern _X_EXPORT int DRI2EventBase;
|
extern _X_EXPORT int DRI2EventBase;
|
||||||
|
@ -308,4 +326,10 @@ extern _X_EXPORT void DRI2WaitMSCComplete(ClientPtr client, DrawablePtr pDraw,
|
||||||
int frame, unsigned int tv_sec,
|
int frame, unsigned int tv_sec,
|
||||||
unsigned int tv_usec);
|
unsigned int tv_usec);
|
||||||
|
|
||||||
|
extern _X_EXPORT int DRI2GetParam(ClientPtr client,
|
||||||
|
DrawablePtr pDrawable,
|
||||||
|
CARD64 param,
|
||||||
|
BOOL *is_param_recognized,
|
||||||
|
CARD64 *value);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -534,6 +534,37 @@ ProcDRI2WaitSBC(ClientPtr client)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ProcDRI2GetParam(ClientPtr client)
|
||||||
|
{
|
||||||
|
REQUEST(xDRI2GetParamReq);
|
||||||
|
xDRI2GetParamReply rep;
|
||||||
|
DrawablePtr pDrawable;
|
||||||
|
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;
|
||||||
|
|
||||||
|
status = DRI2GetParam(client, pDrawable, stuff->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
|
static int
|
||||||
ProcDRI2Dispatch(ClientPtr client)
|
ProcDRI2Dispatch(ClientPtr client)
|
||||||
{
|
{
|
||||||
|
@ -572,6 +603,8 @@ ProcDRI2Dispatch(ClientPtr client)
|
||||||
return ProcDRI2WaitSBC(client);
|
return ProcDRI2WaitSBC(client);
|
||||||
case X_DRI2SwapInterval:
|
case X_DRI2SwapInterval:
|
||||||
return ProcDRI2SwapInterval(client);
|
return ProcDRI2SwapInterval(client);
|
||||||
|
case X_DRI2GetParam:
|
||||||
|
return ProcDRI2GetParam(client);
|
||||||
default:
|
default:
|
||||||
return BadRequest;
|
return BadRequest;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user