dri2: ignore BadDrawable errors. 33/833/1
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Wed, 20 Jul 2011 15:44:29 +0000 (17:44 +0200)
committerAustin Yuan <shengquan.yuan@gmail.com>
Tue, 26 Jul 2011 06:07:43 +0000 (14:07 +0800)
Hi,

This patch fixes the following error.

X Error of failed request:  BadDrawable (invalid Pixmap or Window parameter)
  Major opcode of failed request:  137 (DRI2)
  Minor opcode of failed request:  4 (DRI2DestroyDrawable)
  Resource id in failed request:  0x4800001
  Serial number of failed request:  30
  Current serial number in output stream:  32

The X drawable can die before we notice it in free_drawable_hashtable(),
called through vaTerminate(). This patch is ported from Mesa (GLX/DRI2).

Regards,
Gwenole.

va/x11/va_dri2.c

index 4915651..1c91bca 100644 (file)
@@ -44,6 +44,9 @@
 #define DRI2DriverDRI 0
 #endif
 
+static int
+VA_DRI2Error(Display *dpy, xError *err, XExtCodes *codes, int *ret_code);
+
 static char va_dri2ExtensionName[] = DRI2_NAME;
 static XExtensionInfo _va_dri2_info_data;
 static XExtensionInfo *va_dri2Info = &_va_dri2_info_data;
@@ -58,7 +61,7 @@ static /* const */ XExtensionHooks va_dri2ExtensionHooks = {
     VA_DRI2CloseDisplay,               /* close_display */
     NULL,                              /* wire_to_event */
     NULL,                              /* event_to_wire */
-    NULL,                              /* error */
+    VA_DRI2Error,                      /* error */
     NULL,                              /* error_string */
 };
 
@@ -67,6 +70,22 @@ static XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay, va_dri2Info,
                                   &va_dri2ExtensionHooks, 
                                   0, NULL)
 
+static int
+VA_DRI2Error(Display *dpy, xError *err, XExtCodes *codes, int *ret_code)
+{
+    /*
+     * If the X drawable was destroyed before the VA drawable, the DRI2 drawable
+     * will be gone by the time we call VA_DRI2DestroyDrawable(). So, simply
+     * ignore BadDrawable errors in that case.
+     */
+    if (err->majorCode == codes->major_opcode &&
+        err->errorCode == BadDrawable &&
+        err->minorCode == X_DRI2DestroyDrawable)
+       return True;
+
+    return False;
+}
+
 Bool VA_DRI2QueryExtension(Display *dpy, int *eventBase, int *errorBase)
 {
     XExtDisplayInfo *info = DRI2FindDisplay(dpy);