OSDN Git Service

gallium/winsys/kms: Fix double refcount when importing from prime FD (v2)
[android-x86/external-mesa.git] / src / gallium / winsys / sw / kms-dri / kms_dri_sw_winsys.c
index 900c49f..0585fcc 100644 (file)
@@ -111,6 +111,7 @@ kms_sw_displaytarget_create(struct sw_winsys *ws,
                             enum pipe_format format,
                             unsigned width, unsigned height,
                             unsigned alignment,
+                            const void *front_private,
                             unsigned *stride)
 {
    struct kms_sw_winsys *kms_sw = kms_sw_winsys(ws);
@@ -265,11 +266,16 @@ kms_sw_displaytarget_from_handle(struct sw_winsys *ws,
    assert(whandle->type == DRM_API_HANDLE_TYPE_KMS ||
           whandle->type == DRM_API_HANDLE_TYPE_FD);
 
+   if (whandle->offset != 0) {
+      DEBUG_PRINT("KMS-DEBUG: attempt to import unsupported winsys offset %d\n",
+                  whandle->offset);
+      return NULL;
+   }
+
    switch(whandle->type) {
    case DRM_API_HANDLE_TYPE_FD:
       kms_sw_dt = kms_sw_displaytarget_add_from_prime(kms_sw, whandle->handle);
       if (kms_sw_dt) {
-         kms_sw_dt->ref_count++;
          kms_sw_dt->width = templ->width0;
          kms_sw_dt->height = templ->height0;
          kms_sw_dt->stride = whandle->stride;
@@ -308,17 +314,20 @@ kms_sw_displaytarget_get_handle(struct sw_winsys *winsys,
    case DRM_API_HANDLE_TYPE_KMS:
       whandle->handle = kms_sw_dt->handle;
       whandle->stride = kms_sw_dt->stride;
+      whandle->offset = 0;
       return TRUE;
    case DRM_API_HANDLE_TYPE_FD:
       if (!drmPrimeHandleToFD(kms_sw->fd, kms_sw_dt->handle,
                              DRM_CLOEXEC, (int*)&whandle->handle)) {
          whandle->stride = kms_sw_dt->stride;
+         whandle->offset = 0;
          return TRUE;
       }
       /* fallthrough */
    default:
       whandle->handle = 0;
       whandle->stride = 0;
+      whandle->offset = 0;
       return FALSE;
    }
 }