gallium: push offset down to driver
authorStanimir Varbanov <stanimir.varbanov@linaro.org>
Thu, 26 May 2016 22:10:37 +0000 (01:10 +0300)
committerEmil Velikov <emil.l.velikov@gmail.com>
Mon, 30 May 2016 09:26:35 +0000 (10:26 +0100)
Push offset down to drivers when importing dmabuf. This is needed
to more fully support EGL_EXT_image_dma_buf_import when a non-zero
offset is specified.

Tesing has been done for freedreno, and compile tested following
gallium drivers:
nouveau,svga,virgl,r600,r300,radeonsi,swrast,i915,ilo

Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
src/gallium/drivers/nouveau/nouveau_screen.c
src/gallium/drivers/vc4/vc4_screen.c
src/gallium/state_trackers/dri/dri2.c
src/gallium/winsys/i915/drm/i915_drm_buffer.c
src/gallium/winsys/intel/drm/intel_drm_winsys.c
src/gallium/winsys/radeon/drm/radeon_drm_bo.c
src/gallium/winsys/svga/drm/vmw_screen_dri.c
src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
src/gallium/winsys/virgl/drm/virgl_drm_winsys.c

index 4ca9e5c06cde9c2913b4b36c313fbb783f8182cc..2c421cc748c1214037bc0f1127d9bc0ca4a6a6e2 100644 (file)
@@ -89,6 +89,12 @@ nouveau_screen_bo_from_handle(struct pipe_screen *pscreen,
    struct nouveau_bo *bo = 0;
    int ret;
 
+   if (whandle->offset != 0) {
+      debug_printf("%s: attempt to import unsupported winsys offset %d\n",
+                   __FUNCTION__, whandle->offset);
+      return NULL;
+   }
+
    if (whandle->type != DRM_API_HANDLE_TYPE_SHARED &&
        whandle->type != DRM_API_HANDLE_TYPE_FD) {
       debug_printf("%s: attempt to import unsupported handle type %d\n",
index 5ab1682b25a50f30c65dee8f4a4bf9c7e09bdc6d..733275a8f7b9fbb8b069d2136a26b85f62e4a096 100644 (file)
@@ -559,6 +559,13 @@ vc4_screen_bo_from_handle(struct pipe_screen *pscreen,
 {
         struct vc4_screen *screen = vc4_screen(pscreen);
 
+        if (whandle->offset != 0) {
+                fprintf(stderr,
+                        "Attempt to import unsupported winsys offset %u\n",
+                        whandle->offset);
+                return NULL;
+        }
+
         switch (whandle->type) {
         case DRM_API_HANDLE_TYPE_SHARED:
                 return vc4_bo_open_name(screen, whandle->handle, whandle->stride);
index 182d4e6b3e2e0088dbcc1871f93a5751e7a8f2e9..8dea6715d7dd3f3f0e62377c992e2311d5a8d91a 100644 (file)
@@ -790,8 +790,6 @@ dri2_create_image_from_winsys(__DRIscreen *_screen,
    templ.depth0 = 1;
    templ.array_size = 1;
 
-   whandle->offset = 0;
-
    img->texture = screen->base.screen->resource_from_handle(screen->base.screen,
          &templ, whandle, PIPE_HANDLE_USAGE_READ_WRITE);
    if (!img->texture) {
@@ -842,7 +840,7 @@ dri2_create_image_from_fd(__DRIscreen *_screen,
    __DRIimage *img = NULL;
    unsigned err = __DRI_IMAGE_ERROR_SUCCESS;
 
-   if (num_fds != 1 || offsets[0] != 0) {
+   if (num_fds != 1) {
       err = __DRI_IMAGE_ERROR_BAD_MATCH;
       goto exit;
    }
@@ -1056,8 +1054,6 @@ dri2_from_names(__DRIscreen *screen, int width, int height, int format,
 
    if (num_names != 1)
       return NULL;
-   if (offsets[0] != 0)
-      return NULL;
 
    format = convert_fourcc(format, &dri_components);
    if (format == -1)
@@ -1067,6 +1063,7 @@ dri2_from_names(__DRIscreen *screen, int width, int height, int format,
    whandle.type = DRM_API_HANDLE_TYPE_SHARED;
    whandle.handle = names[0];
    whandle.stride = strides[0];
+   whandle.offset = offsets[0];
 
    img = dri2_create_image_from_winsys(screen, width, height, format,
                                        &whandle, loaderPrivate);
index c0698529e1cf246ef4f796043c125da08e35d3d0..ba454ecf54c0298b13d6a641c411c4fbfda7f3f1 100644 (file)
@@ -101,6 +101,9 @@ i915_drm_buffer_from_handle(struct i915_winsys *iws,
    if ((whandle->type != DRM_API_HANDLE_TYPE_SHARED) && (whandle->type != DRM_API_HANDLE_TYPE_FD))
       return NULL;
 
+   if (whandle->offset != 0)
+      return NULL;
+
    buf = CALLOC_STRUCT(i915_drm_buffer);
    if (!buf)
       return NULL;
index 1c5aabe330445a9a1d585f670fcdb397bff6179a..d3bc430307719edcf3ef70dc809084d9280e6e10 100644 (file)
@@ -313,6 +313,11 @@ intel_winsys_import_handle(struct intel_winsys *winsys,
    drm_intel_bo *bo;
    int err;
 
+   if (handle->offset != 0) {
+      debug_error("attempt to import unsupported winsys offset");
+      return NULL;
+   }
+
    switch (handle->type) {
    case DRM_API_HANDLE_TYPE_SHARED:
       {
index 950cbb3e55f2b43f99e72cabb0a1c7fd6771949f..2c10e2eb6226b308422c2038f7a2d3e5ed218629 100644 (file)
@@ -858,6 +858,12 @@ static struct pb_buffer *radeon_winsys_bo_from_handle(struct radeon_winsys *rws,
     unsigned handle;
     uint64_t size = 0;
 
+    if (!offset && whandle->offset != 0) {
+        fprintf(stderr, "attempt to import unsupported winsys offset %u\n",
+                whandle->offset);
+        return NULL;
+    }
+
     /* We must maintain a list of pairs <handle, bo>, so that we always return
      * the same BO for one particular handle. If we didn't do that and created
      * more than one BO for the same handle and then relocated them in a CS,
index baa22a90beb912bf2e547756b57a0257ba0d9395..eae678a635819cded34bd1949249a60be1c51df0 100644 (file)
@@ -186,6 +186,12 @@ vmw_drm_gb_surface_from_handle(struct svga_winsys_screen *sws,
     uint32_t handle;
     int ret;
 
+    if (whandle->offset != 0) {
+       fprintf(stderr, "Attempt to import unsupported winsys offset %u\n",
+               whandle->offset);
+       return NULL;
+    }
+
     ret = vmw_ioctl_gb_surface_ref(vws, whandle, &flags, format,
                                    &mip_levels, &handle, &desc.region);
 
@@ -253,6 +259,12 @@ vmw_drm_surface_from_handle(struct svga_winsys_screen *sws,
     int ret;
     int i;
 
+    if (whandle->offset != 0) {
+       fprintf(stderr, "Attempt to import unsupported winsys offset %u\n",
+               whandle->offset);
+       return NULL;
+    }
+
     switch (whandle->type) {
     case DRM_API_HANDLE_TYPE_SHARED:
     case DRM_API_HANDLE_TYPE_KMS:
index 9aaee8844be28808ef65bb2b46c3da13363d847a..21ac0d7dae836f5e47da6b950da053d4cad6819e 100644 (file)
@@ -266,6 +266,12 @@ 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);
index ba009882ec201017b4bd6ef552580bc253c3736a..c77b8994291b9cf58c25e8ea35c68c9aa8266b34 100644 (file)
@@ -380,6 +380,12 @@ virgl_drm_winsys_resource_create_handle(struct virgl_winsys *qws,
    struct virgl_hw_res *res;
    uint32_t handle = whandle->handle;
 
+   if (whandle->offset != 0) {
+      fprintf(stderr, "attempt to import unsupported winsys offset %u\n",
+              whandle->offset);
+      return NULL;
+   }
+
    pipe_mutex_lock(qdws->bo_handles_mutex);
 
    if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) {