[PATCH 09/12] DRI2: advertise lowest supported DRI2 protocol version

Ian Romanick idr at freedesktop.org
Mon Mar 22 15:34:54 PDT 2010


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Jesse Barnes wrote:
> Update our supported DRI2 protocol version as each driver does
> DRI2ScreenInit, since depending on available kernel features, each DDX
> may support different callbacks and therefore protocol.
> 
> Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
> ---
>  hw/xfree86/dri2/dri2.c      |   12 ++++++++++++
>  hw/xfree86/dri2/dri2.h      |    3 +++
>  hw/xfree86/dri2/dri2ext.c   |    4 ++--
>  include/protocol-versions.h |    4 ----
>  4 files changed, 17 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
> index 9825a55..3fc7f4e 100644
> --- a/hw/xfree86/dri2/dri2.c
> +++ b/hw/xfree86/dri2/dri2.c
> @@ -45,6 +45,9 @@
>  
>  #include "xf86.h"
>  
> +CARD8 dri2_major; /* version of DRI2 supported by DDX */
> +CARD8 dri2_minor;
> +
>  static int dri2ScreenPrivateKeyIndex;
>  static DevPrivateKey dri2ScreenPrivateKey = &dri2ScreenPrivateKeyIndex;
>  static int dri2WindowPrivateKeyIndex;
> @@ -848,6 +851,7 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
>  	"VDPAU", /* DRI2DriverVDPAU */
>      };
>      unsigned int i;
> +    CARD8 cur_minor;
>  
>      if (info->version < 3)
>  	return FALSE;
> @@ -864,6 +868,7 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
>  
>      ds->fd	       = info->fd;
>      ds->deviceName     = info->deviceName;
> +    dri2_major         = 1;
>  
>      ds->CreateBuffer   = info->CreateBuffer;
>      ds->DestroyBuffer  = info->DestroyBuffer;
> @@ -873,8 +878,15 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
>  	ds->ScheduleSwap = info->ScheduleSwap;
>  	ds->ScheduleWaitMSC = info->ScheduleWaitMSC;
>  	ds->GetMSC = info->GetMSC;
> +	cur_minor = 2;
> +    } else {
> +	cur_minor = 1;
>      }
>  
> +    /* Initialize minor if needed and set to minimum provied by DDX */
> +    if (!dri2_minor || dri2_minor > cur_minor)
> +	dri2_minor = cur_minor;
> +

Doesn't this fail if one driver says "DRI2 version 1.0" and the next
driver says "DRI2 version 1.2"?   If the protocol version cannot be
queried before the drivers are initialized, it may be better to just set
it to MAX_INT and 'dri2_minor = MIN(dri2_minor, cur_minor)'.

>      if (info->version == 3 || info->numDrivers == 0) {
>  	/* Driver too old: use the old-style driverName field */
>  	ds->numDrivers = 1;
> diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h
> index 1c8626b..066cc39 100644
> --- a/hw/xfree86/dri2/dri2.h
> +++ b/hw/xfree86/dri2/dri2.h
> @@ -46,6 +46,9 @@ typedef struct {
>      void *driverPrivate;
>  } DRI2BufferRec, *DRI2BufferPtr;
>  
> +extern CARD8 dri2_major; /* version of DRI2 supported by DDX */
> +extern CARD8 dri2_minor;
> +
>  typedef DRI2BufferRec DRI2Buffer2Rec, *DRI2Buffer2Ptr;
>  typedef void (*DRI2SwapEventPtr)(ClientPtr client, void *data, int type,
>  				 CARD64 ust, CARD64 msc, CARD64 sbc);
> diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
> index bd92fd3..7a9f8ca 100644
> --- a/hw/xfree86/dri2/dri2ext.c
> +++ b/hw/xfree86/dri2/dri2ext.c
> @@ -80,8 +80,8 @@ ProcDRI2QueryVersion(ClientPtr client)
>      rep.type = X_Reply;
>      rep.length = 0;
>      rep.sequenceNumber = client->sequence;
> -    rep.majorVersion = SERVER_DRI2_MAJOR_VERSION;
> -    rep.minorVersion = SERVER_DRI2_MINOR_VERSION;
> +    rep.majorVersion = dri2_major;
> +    rep.minorVersion = dri2_minor;
>  
>      if (client->swapped) {
>      	swaps(&rep.sequenceNumber, n);
> diff --git a/include/protocol-versions.h b/include/protocol-versions.h
> index c74b7fa..97ef5da 100644
> --- a/include/protocol-versions.h
> +++ b/include/protocol-versions.h
> @@ -51,10 +51,6 @@
>  #define SERVER_DMX_MINOR_VERSION		2
>  #define SERVER_DMX_PATCH_VERSION		20040604
>  
> -/* DRI2 */
> -#define SERVER_DRI2_MAJOR_VERSION		1
> -#define SERVER_DRI2_MINOR_VERSION		2
> -
>  /* Generic event extension */
>  #define SERVER_GE_MAJOR_VERSION                 1
>  #define SERVER_GE_MINOR_VERSION                 0

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkun8IwACgkQX1gOwKyEAw9pgACeIUN3YYVQOFzZNXcjgLrcD2uE
MQMAnjDDYfVwnHGYyh4XBr1drZQeCN5J
=HmEQ
-----END PGP SIGNATURE-----


More information about the xorg-devel mailing list