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