On 08/22/2016 08:39 AM, Marek Olšák wrote:
From: Marek Olšák <[email protected]>

radeonsi needs to do some operations (DCC decompression) for OpenGL-OpenCL
interop and this is the only way to make it coherent with the current
context. It can optionally be set to NULL.
---
  src/gallium/auxiliary/util/u_transfer.c           |  1 +
  src/gallium/auxiliary/util/u_transfer.h           |  1 +
  src/gallium/auxiliary/vl/vl_winsys_dri3.c         |  2 +-
  src/gallium/drivers/ddebug/dd_screen.c            |  4 +++-
  src/gallium/drivers/ilo/ilo_resource.c            |  1 +
  src/gallium/drivers/llvmpipe/lp_texture.c         |  1 +
  src/gallium/drivers/noop/noop_pipe.c              |  1 +
  src/gallium/drivers/r300/r300_texture.c           |  1 +
  src/gallium/drivers/r300/r300_texture.h           |  1 +
  src/gallium/drivers/radeon/r600_texture.c         |  1 +
  src/gallium/drivers/rbug/rbug_screen.c            |  5 ++++-
  src/gallium/drivers/softpipe/sp_texture.c         |  1 +
  src/gallium/drivers/trace/tr_screen.c             |  5 ++++-
  src/gallium/include/pipe/p_screen.h               |  7 +++++++
  src/gallium/state_trackers/dri/dri2.c             | 13 +++++++------
  src/gallium/state_trackers/nine/swapchain9.c      |  3 ++-
  src/gallium/state_trackers/va/buffer.c            |  3 ++-
  src/gallium/state_trackers/vdpau/output.c         |  3 ++-
  src/gallium/state_trackers/vdpau/surface.c        |  3 ++-
  src/gallium/state_trackers/xa/xa_tracker.c        |  3 ++-
  src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c |  2 +-
  21 files changed, 46 insertions(+), 16 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_transfer.c 
b/src/gallium/auxiliary/util/u_transfer.c
index 82cf68d..ba4b9dc 100644
--- a/src/gallium/auxiliary/util/u_transfer.c
+++ b/src/gallium/auxiliary/util/u_transfer.c
@@ -104,20 +104,21 @@ void u_default_transfer_unmap( struct pipe_context *pipe,
  }


  static inline struct u_resource *
  u_resource( struct pipe_resource *res )
  {
     return (struct u_resource *)res;
  }

  boolean u_resource_get_handle_vtbl(struct pipe_screen *screen,
+                                   struct pipe_context *ctx,
                                     struct pipe_resource *resource,
                                     struct winsys_handle *handle,
                                     unsigned usage)
  {
     struct u_resource *ur = u_resource(resource);
     return ur->vtbl->resource_get_handle(screen, resource, handle);
  }

  void u_resource_destroy_vtbl(struct pipe_screen *screen,
                               struct pipe_resource *resource)
diff --git a/src/gallium/auxiliary/util/u_transfer.h 
b/src/gallium/auxiliary/util/u_transfer.h
index 7f680bc..ab787ab 100644
--- a/src/gallium/auxiliary/util/u_transfer.h
+++ b/src/gallium/auxiliary/util/u_transfer.h
@@ -66,20 +66,21 @@ struct u_resource_vtbl {
  };


  struct u_resource {
     struct pipe_resource b;
     const struct u_resource_vtbl *vtbl;
  };


  boolean u_resource_get_handle_vtbl(struct pipe_screen *screen,
+                                   struct pipe_context *ctx,
                                     struct pipe_resource *resource,
                                     struct winsys_handle *handle,
                                     unsigned usage);

  void u_resource_destroy_vtbl(struct pipe_screen *screen,
                               struct pipe_resource *resource);

  void *u_transfer_map_vtbl(struct pipe_context *context,
                            struct pipe_resource *resource,
                            unsigned level,
diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri3.c 
b/src/gallium/auxiliary/vl/vl_winsys_dri3.c
index 61d6205..3d596a6 100644
--- a/src/gallium/auxiliary/vl/vl_winsys_dri3.c
+++ b/src/gallium/auxiliary/vl/vl_winsys_dri3.c
@@ -236,21 +236,21 @@ dri3_alloc_back_buffer(struct vl_dri3_screen *scrn)
     templ.depth0 = 1;
     templ.array_size = 1;
     buffer->texture = scrn->base.pscreen->resource_create(scrn->base.pscreen,
                                                           &templ);
     if (!buffer->texture)
        goto unmap_shm;

     memset(&whandle, 0, sizeof(whandle));
     whandle.type= DRM_API_HANDLE_TYPE_FD;
     usage = PIPE_HANDLE_USAGE_EXPLICIT_FLUSH | PIPE_HANDLE_USAGE_READ;
-   scrn->base.pscreen->resource_get_handle(scrn->base.pscreen,
+   scrn->base.pscreen->resource_get_handle(scrn->base.pscreen, NULL,
                                             buffer->texture, &whandle,
                                             usage);
     buffer_fd = whandle.handle;
     buffer->pitch = whandle.stride;
     xcb_dri3_pixmap_from_buffer(scrn->conn,
                                 (pixmap = xcb_generate_id(scrn->conn)),
                                 scrn->drawable,
                                 0,
                                 scrn->width, scrn->height, buffer->pitch,
                                 scrn->depth, 32,
diff --git a/src/gallium/drivers/ddebug/dd_screen.c 
b/src/gallium/drivers/ddebug/dd_screen.c
index 3deba0a..4050e39 100644
--- a/src/gallium/drivers/ddebug/dd_screen.c
+++ b/src/gallium/drivers/ddebug/dd_screen.c
@@ -230,27 +230,29 @@ static void
  dd_screen_resource_destroy(struct pipe_screen *_screen,
                             struct pipe_resource *res)
  {
     struct pipe_screen *screen = dd_screen(_screen)->screen;

     screen->resource_destroy(screen, res);
  }

  static boolean
  dd_screen_resource_get_handle(struct pipe_screen *_screen,
+                              struct pipe_context *_pipe,
                                struct pipe_resource *resource,
                                struct winsys_handle *handle,
                                unsigned usage)
  {
     struct pipe_screen *screen = dd_screen(_screen)->screen;
+   struct pipe_context *pipe = dd_context(_pipe)->pipe;

-   return screen->resource_get_handle(screen, resource, handle, usage);
+   return screen->resource_get_handle(screen, pipe, resource, handle, usage);
  }


  /********************************************************************
   * fence
   */

  static void
  dd_screen_fence_reference(struct pipe_screen *_screen,
                            struct pipe_fence_handle **pdst,
diff --git a/src/gallium/drivers/ilo/ilo_resource.c 
b/src/gallium/drivers/ilo/ilo_resource.c
index 0afbfc6..7961288 100644
--- a/src/gallium/drivers/ilo/ilo_resource.c
+++ b/src/gallium/drivers/ilo/ilo_resource.c
@@ -718,20 +718,21 @@ ilo_resource_from_handle(struct pipe_screen *screen,
                           unsigned usage)
  {
     if (templ->target == PIPE_BUFFER)
        return NULL;
     else
        return tex_create(screen, templ, handle);
  }

  static boolean
  ilo_resource_get_handle(struct pipe_screen *screen,
+                        struct pipe_context *ctx,
                          struct pipe_resource *res,
                          struct winsys_handle *handle,
                          unsigned usage)
  {
     if (res->target == PIPE_BUFFER)
        return false;
     else
        return tex_get_handle(ilo_texture(res), handle);

  }
diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c 
b/src/gallium/drivers/llvmpipe/lp_texture.c
index 0d4c4ef..733253b 100644
--- a/src/gallium/drivers/llvmpipe/lp_texture.c
+++ b/src/gallium/drivers/llvmpipe/lp_texture.c
@@ -478,20 +478,21 @@ llvmpipe_resource_from_handle(struct pipe_screen *screen,

  no_dt:
     FREE(lpr);
  no_lpr:
     return NULL;
  }


  static boolean
  llvmpipe_resource_get_handle(struct pipe_screen *screen,
+                             struct pipe_context *ctx,
                              struct pipe_resource *pt,
                              struct winsys_handle *whandle,
                               unsigned usage)
  {
     struct sw_winsys *winsys = llvmpipe_screen(screen)->winsys;
     struct llvmpipe_resource *lpr = llvmpipe_resource(pt);

     assert(lpr->dt);
     if (!lpr->dt)
        return FALSE;
diff --git a/src/gallium/drivers/noop/noop_pipe.c 
b/src/gallium/drivers/noop/noop_pipe.c
index cf20681..4eb6051 100644
--- a/src/gallium/drivers/noop/noop_pipe.c
+++ b/src/gallium/drivers/noop/noop_pipe.c
@@ -128,20 +128,21 @@ static struct pipe_resource 
*noop_resource_from_handle(struct pipe_screen *scree
        struct pipe_resource *result;
        struct pipe_resource *noop_resource;

        result = oscreen->resource_from_handle(oscreen, templ, handle, usage);
        noop_resource = noop_resource_create(screen, result);
        pipe_resource_reference(&result, NULL);
        return noop_resource;
  }

  static boolean noop_resource_get_handle(struct pipe_screen *screen,
+                                       struct pipe_context *ctx,
                                        struct pipe_resource *resource,
                                        struct winsys_handle *handle,
                                          unsigned usage)
  {
        return FALSE;
  }

  static void noop_resource_destroy(struct pipe_screen *screen,
                                        struct pipe_resource *resource)
  {
diff --git a/src/gallium/drivers/r300/r300_texture.c 
b/src/gallium/drivers/r300/r300_texture.c
index 2fc93c2..5f459e4 100644
--- a/src/gallium/drivers/r300/r300_texture.c
+++ b/src/gallium/drivers/r300/r300_texture.c
@@ -1029,20 +1029,21 @@ static void r300_texture_destroy(struct pipe_screen 
*screen,
          if (texture == rscreen->cmask_resource) {
              rscreen->cmask_resource = NULL;
          }
          pipe_mutex_unlock(rscreen->cmask_mutex);
      }
      pb_reference(&tex->buf, NULL);
      FREE(tex);
  }

  boolean r300_resource_get_handle(struct pipe_screen* screen,
+                                 struct pipe_context *ctx,
                                   struct pipe_resource *texture,
                                   struct winsys_handle *whandle,
                                   unsigned usage)
  {
      struct radeon_winsys *rws = r300_screen(screen)->rws;
      struct r300_resource* tex = (struct r300_resource*)texture;

      if (!tex) {
          return FALSE;
      }
diff --git a/src/gallium/drivers/r300/r300_texture.h 
b/src/gallium/drivers/r300/r300_texture.h
index 4c33942..3341671 100644
--- a/src/gallium/drivers/r300/r300_texture.h
+++ b/src/gallium/drivers/r300/r300_texture.h
@@ -55,20 +55,21 @@ boolean r300_is_sampler_format_supported(enum pipe_format 
format);

  void r300_texture_setup_format_state(struct r300_screen *screen,
                                       struct r300_resource *tex,
                                       enum pipe_format format,
                                       unsigned level,
                                       unsigned width0_override,
                                       unsigned height0_override,
                                       struct r300_texture_format_state *out);

  boolean r300_resource_get_handle(struct pipe_screen* screen,
+                                 struct pipe_context *ctx,
                                  struct pipe_resource *texture,
                                  struct winsys_handle *whandle,
                                   unsigned usage);

  struct pipe_resource*
  r300_texture_from_handle(struct pipe_screen* screen,
                         const struct pipe_resource* base,
                         struct winsys_handle *whandle,
                           unsigned usage);

diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index 8c7bfa3..9629fbb 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -504,20 +504,21 @@ static void r600_degrade_tile_mode_to_linear(struct 
r600_common_context *rctx,
        assert(!rtex->dcc_offset);
        assert(!rtex->is_depth);

        r600_texture_reference(&new_tex, NULL);

        r600_dirty_all_framebuffer_states(rctx->screen);
        p_atomic_inc(&rctx->screen->dirty_tex_descriptor_counter);
  }

  static boolean r600_texture_get_handle(struct pipe_screen* screen,
+                                      struct pipe_context *ctx,
                                       struct pipe_resource *resource,
                                       struct winsys_handle *whandle,
                                         unsigned usage)
  {
        struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
        struct r600_common_context *aux_context =
                (struct r600_common_context*)rscreen->aux_context;
        struct r600_resource *res = (struct r600_resource*)resource;
        struct r600_texture *rtex = (struct r600_texture*)resource;
        struct radeon_bo_metadata metadata;
diff --git a/src/gallium/drivers/rbug/rbug_screen.c 
b/src/gallium/drivers/rbug/rbug_screen.c
index 8d21669..3742c10 100644
--- a/src/gallium/drivers/rbug/rbug_screen.c
+++ b/src/gallium/drivers/rbug/rbug_screen.c
@@ -169,30 +169,33 @@ rbug_screen_resource_from_handle(struct pipe_screen 
*_screen,

     result = screen->resource_from_handle(screen, templ, handle, usage);

     result = rbug_resource_create(rbug_screen(_screen), result);

     return result;
  }

  static boolean
  rbug_screen_resource_get_handle(struct pipe_screen *_screen,
+                                struct pipe_context *_pipe,
                                  struct pipe_resource *_resource,
                                  struct winsys_handle *handle,
                                  unsigned usage)
  {
     struct rbug_screen *rb_screen = rbug_screen(_screen);
+   struct rbug_context *rb_pipe = rbug_context(_pipe);
     struct rbug_resource *rb_resource = rbug_resource(_resource);
     struct pipe_screen *screen = rb_screen->screen;
     struct pipe_resource *resource = rb_resource->resource;

-   return screen->resource_get_handle(screen, resource, handle, usage);
+   return screen->resource_get_handle(screen, rb_pipe ? rb_pipe->pipe : NULL,
+                                      resource, handle, usage);
  }



  static void
  rbug_screen_resource_destroy(struct pipe_screen *screen,
                               struct pipe_resource *_resource)
  {
     rbug_resource_destroy(rbug_resource(_resource));
  }
diff --git a/src/gallium/drivers/softpipe/sp_texture.c 
b/src/gallium/drivers/softpipe/sp_texture.c
index 9c64397..8dca158 100644
--- a/src/gallium/drivers/softpipe/sp_texture.c
+++ b/src/gallium/drivers/softpipe/sp_texture.c
@@ -244,20 +244,21 @@ softpipe_resource_from_handle(struct pipe_screen *screen,
     return &spr->base;

   fail:
     FREE(spr);
     return NULL;
  }


  static boolean
  softpipe_resource_get_handle(struct pipe_screen *screen,
+                             struct pipe_context *ctx,
                               struct pipe_resource *pt,
                               struct winsys_handle *whandle,
                               unsigned usage)
  {
     struct sw_winsys *winsys = softpipe_screen(screen)->winsys;
     struct softpipe_resource *spr = softpipe_resource(pt);

     assert(spr->dt);
     if (!spr->dt)
        return FALSE;
diff --git a/src/gallium/drivers/trace/tr_screen.c 
b/src/gallium/drivers/trace/tr_screen.c
index 67241ca..493725c 100644
--- a/src/gallium/drivers/trace/tr_screen.c
+++ b/src/gallium/drivers/trace/tr_screen.c
@@ -326,32 +326,35 @@ trace_screen_resource_from_handle(struct pipe_screen 
*_screen,

     result = screen->resource_from_handle(screen, templ, handle, usage);

     result = trace_resource_create(trace_screen(_screen), result);

     return result;
  }

  static boolean
  trace_screen_resource_get_handle(struct pipe_screen *_screen,
+                                 struct pipe_context *_pipe,
                                  struct pipe_resource *_resource,
                                  struct winsys_handle *handle,
                                   unsigned usage)
  {
     struct trace_screen *tr_screen = trace_screen(_screen);
+   struct trace_context *tr_pipe = _pipe ? trace_context(_pipe) : NULL;
     struct trace_resource *tr_resource = trace_resource(_resource);
     struct pipe_screen *screen = tr_screen->screen;
     struct pipe_resource *resource = tr_resource->resource;

     /* TODO trace call */

-   return screen->resource_get_handle(screen, resource, handle, usage);
+   return screen->resource_get_handle(screen, tr_pipe ? tr_pipe->pipe : NULL,
+                                      resource, handle, usage);
  }



  static void
  trace_screen_resource_destroy(struct pipe_screen *_screen,
                              struct pipe_resource *_resource)
  {
     struct trace_screen *tr_scr = trace_screen(_screen);
     struct trace_resource *tr_res = trace_resource(_resource);
diff --git a/src/gallium/include/pipe/p_screen.h 
b/src/gallium/include/pipe/p_screen.h
index dd40e07..255647e 100644
--- a/src/gallium/include/pipe/p_screen.h
+++ b/src/gallium/include/pipe/p_screen.h
@@ -199,27 +199,34 @@ struct pipe_screen {
      */
     struct pipe_resource * (*resource_from_user_memory)(struct pipe_screen *,
                                                         const struct 
pipe_resource *t,
                                                         void *user_memory);

     /**
      * Get a winsys_handle from a texture. Some platforms/winsys requires
      * that the texture is created with a special usage flag like
      * DISPLAYTARGET or PRIMARY.
      *
+    * The context parameter can optionally be used to flush the resource and
+    * the context to make sure the resource is coherent with whatever user
+    * will use it. Some drivers may also use the context to convert
+    * the resource into a format compatible for sharing. The use case is
+    * OpenGL-OpenCL interop. The context parameter is allowed to be NULL.
+    *
      * NOTE: in the case of DRM_API_HANDLE_TYPE_FD handles, the caller
      * takes ownership of the FD.  (This is consistent with
      * EGL_MESA_image_dma_buf_export)
      *
      * \param usage  A combination of PIPE_HANDLE_USAGE_* flags.
      */
     boolean (*resource_get_handle)(struct pipe_screen *,
+                                  struct pipe_context *context,
                                  struct pipe_resource *tex,
                                  struct winsys_handle *handle,
                                  unsigned usage);


     void (*resource_destroy)(struct pipe_screen *,
                            struct pipe_resource *pt);


     /**
diff --git a/src/gallium/state_trackers/dri/dri2.c 
b/src/gallium/state_trackers/dri/dri2.c
index 9803b0e..f391c77 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -397,21 +397,21 @@ dri2_allocate_buffer(__DRIscreen *sPriv,
        FREE(buffer);
        return NULL;
     }

     memset(&whandle, 0, sizeof(whandle));
     if (screen->can_share_buffer)
        whandle.type = DRM_API_HANDLE_TYPE_SHARED;
     else
        whandle.type = DRM_API_HANDLE_TYPE_KMS;

-   screen->base.screen->resource_get_handle(screen->base.screen,
+   screen->base.screen->resource_get_handle(screen->base.screen, NULL,
           buffer->resource, &whandle,
           PIPE_HANDLE_USAGE_EXPLICIT_FLUSH | PIPE_HANDLE_USAGE_READ);

     buffer->base.attachment = attachment;
     buffer->base.name = whandle.handle;
     buffer->base.cpp = util_format_get_blocksize(pf);
     buffer->base.pitch = whandle.stride;

     return &buffer->base;
  }
@@ -956,39 +956,39 @@ dri2_query_image(__DRIimage *image, int attrib, int 
*value)
        usage = PIPE_HANDLE_USAGE_EXPLICIT_FLUSH | PIPE_HANDLE_USAGE_READ;
     else
        usage = PIPE_HANDLE_USAGE_READ_WRITE;

     memset(&whandle, 0, sizeof(whandle));

     switch (attrib) {
     case __DRI_IMAGE_ATTRIB_STRIDE:
        whandle.type = DRM_API_HANDLE_TYPE_KMS;
        image->texture->screen->resource_get_handle(image->texture->screen,
-            image->texture, &whandle, usage);
+            NULL, image->texture, &whandle, usage);
        *value = whandle.stride;
        return GL_TRUE;
     case __DRI_IMAGE_ATTRIB_HANDLE:
        whandle.type = DRM_API_HANDLE_TYPE_KMS;
        image->texture->screen->resource_get_handle(image->texture->screen,
-         image->texture, &whandle, usage);
+         NULL, image->texture, &whandle, usage);
        *value = whandle.handle;
        return GL_TRUE;
     case __DRI_IMAGE_ATTRIB_NAME:
        whandle.type = DRM_API_HANDLE_TYPE_SHARED;
        image->texture->screen->resource_get_handle(image->texture->screen,
-         image->texture, &whandle, usage);
+         NULL, image->texture, &whandle, usage);
        *value = whandle.handle;
        return GL_TRUE;
     case __DRI_IMAGE_ATTRIB_FD:
        whandle.type= DRM_API_HANDLE_TYPE_FD;
        image->texture->screen->resource_get_handle(image->texture->screen,
-         image->texture, &whandle, usage);
+         NULL, image->texture, &whandle, usage);
        *value = whandle.handle;
        return GL_TRUE;
     case __DRI_IMAGE_ATTRIB_FORMAT:
        *value = image->dri_format;
        return GL_TRUE;
     case __DRI_IMAGE_ATTRIB_WIDTH:
        *value = image->texture->width0;
        return GL_TRUE;
     case __DRI_IMAGE_ATTRIB_HEIGHT:
        *value = image->texture->height0;
@@ -1713,21 +1713,22 @@ dri2_interop_export_object(__DRIcontext *_ctx,
     case MESA_GLINTEROP_ACCESS_WRITE_ONLY:
        usage = PIPE_HANDLE_USAGE_WRITE;
        break;
     default:
        usage = 0;
     }

     memset(&whandle, 0, sizeof(whandle));
     whandle.type = DRM_API_HANDLE_TYPE_FD;

-   success = screen->resource_get_handle(screen, res, &whandle, usage);
+   success = screen->resource_get_handle(screen, st->pipe, res, &whandle,
+                                         usage);
     mtx_unlock(&ctx->Shared->Mutex);

     if (!success)
        return MESA_GLINTEROP_OUT_OF_HOST_MEMORY;

     out->dmabuf_fd = whandle.handle;
     out->out_driver_data_written = 0;

     if (res->target == PIPE_BUFFER)
        out->buf_offset += whandle.offset;
diff --git a/src/gallium/state_trackers/nine/swapchain9.c 
b/src/gallium/state_trackers/nine/swapchain9.c
index 08ee482..bc1c4b1 100644
--- a/src/gallium/state_trackers/nine/swapchain9.c
+++ b/src/gallium/state_trackers/nine/swapchain9.c
@@ -81,21 +81,22 @@ D3DWindowBuffer_create(struct NineSwapChain9 *This,
                         struct pipe_resource *resource,
                         int depth,
                         int for_frontbuffer_reading)
  {
      D3DWindowBuffer *ret;
      struct winsys_handle whandle;
      int stride, dmaBufFd;

      memset(&whandle, 0, sizeof(whandle));
      whandle.type = DRM_API_HANDLE_TYPE_FD;
-    This->screen->resource_get_handle(This->screen, resource, &whandle,
+    This->screen->resource_get_handle(This->screen, This->pipe, resource,
+                                      &whandle,
                                        for_frontbuffer_reading ?
                                            PIPE_HANDLE_USAGE_WRITE :
                                            PIPE_HANDLE_USAGE_EXPLICIT_FLUSH |
                                            PIPE_HANDLE_USAGE_READ);
      stride = whandle.stride;
      dmaBufFd = whandle.handle;
      ID3DPresent_NewD3DWindowBufferFromDmaBuf(This->present,
                                               dmaBufFd,
                                               resource->width0,
                                               resource->height0,
diff --git a/src/gallium/state_trackers/va/buffer.c 
b/src/gallium/state_trackers/va/buffer.c
index dfcebbe..3c9b9d1 100644
--- a/src/gallium/state_trackers/va/buffer.c
+++ b/src/gallium/state_trackers/va/buffer.c
@@ -295,21 +295,22 @@ vlVaAcquireBufferHandle(VADriverContextP ctx, VABufferID 
buf_id,
        case VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME: {
           struct winsys_handle whandle;

           pipe_mutex_lock(drv->mutex);
           drv->pipe->flush(drv->pipe, NULL, 0);
           pipe_mutex_unlock(drv->mutex);

           memset(&whandle, 0, sizeof(whandle));
           whandle.type = DRM_API_HANDLE_TYPE_FD;

-         if (!screen->resource_get_handle(screen, 
buf->derived_surface.resource,
+         if (!screen->resource_get_handle(screen, drv->pipe,
+                                          buf->derived_surface.resource,
                                            &whandle, 
PIPE_HANDLE_USAGE_READ_WRITE))
              return VA_STATUS_ERROR_INVALID_BUFFER;

           buf_info->handle = (intptr_t)whandle.handle;
           break;
        }
        default:
           return VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE;
        }

diff --git a/src/gallium/state_trackers/vdpau/output.c 
b/src/gallium/state_trackers/vdpau/output.c
index 0b4f081..85751ea 100644
--- a/src/gallium/state_trackers/vdpau/output.c
+++ b/src/gallium/state_trackers/vdpau/output.c
@@ -789,21 +789,22 @@ VdpStatus vlVdpOutputSurfaceDMABuf(VdpVideoSurface 
surface,

     pipe_mutex_lock(vlsurface->device->mutex);
     vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL);
     vlsurface->device->context->flush(vlsurface->device->context, NULL, 0);
     pipe_mutex_unlock(vlsurface->device->mutex);

     memset(&whandle, 0, sizeof(struct winsys_handle));
     whandle.type = DRM_API_HANDLE_TYPE_FD;

     pscreen = vlsurface->surface->texture->screen;
-   if (!pscreen->resource_get_handle(pscreen, vlsurface->surface->texture, 
&whandle,
+   if (!pscreen->resource_get_handle(pscreen, vlsurface->device->context,
+                                     vlsurface->surface->texture, &whandle,
                                     PIPE_HANDLE_USAGE_READ_WRITE))
        return VDP_STATUS_NO_IMPLEMENTATION;

     result->handle = whandle.handle;
     result->width = vlsurface->surface->width;
     result->height = vlsurface->surface->height;
     result->offset = whandle.offset;
     result->stride = whandle.stride;
     result->format = PipeToFormatRGBA(vlsurface->surface->format);

diff --git a/src/gallium/state_trackers/vdpau/surface.c 
b/src/gallium/state_trackers/vdpau/surface.c
index 177483e..69afce0 100644
--- a/src/gallium/state_trackers/vdpau/surface.c
+++ b/src/gallium/state_trackers/vdpau/surface.c
@@ -463,21 +463,22 @@ VdpStatus vlVdpVideoSurfaceDMABuf(VdpVideoSurface surface,
     pipe_mutex_unlock(p_surf->device->mutex);

     if (!surf)
        return VDP_STATUS_RESOURCES;

     memset(&whandle, 0, sizeof(struct winsys_handle));
     whandle.type = DRM_API_HANDLE_TYPE_FD;
     whandle.layer = surf->u.tex.first_layer;

     pscreen = surf->texture->screen;
-   if (!pscreen->resource_get_handle(pscreen, surf->texture, &whandle,
+   if (!pscreen->resource_get_handle(pscreen, p_surf->device->context,
+                                     surf->texture, &whandle,
                                     PIPE_HANDLE_USAGE_READ_WRITE))
        return VDP_STATUS_NO_IMPLEMENTATION;

     result->handle = whandle.handle;
     result->width = surf->width;
     result->height = surf->height;
     result->offset = whandle.offset;
     result->stride = whandle.stride;

     if (surf->format == PIPE_FORMAT_R8_UNORM)
diff --git a/src/gallium/state_trackers/xa/xa_tracker.c 
b/src/gallium/state_trackers/xa/xa_tracker.c
index e091b083..d98bd2d 100644
--- a/src/gallium/state_trackers/xa/xa_tracker.c
+++ b/src/gallium/state_trackers/xa/xa_tracker.c
@@ -542,21 +542,22 @@ xa_surface_handle(struct xa_surface *srf,
                  enum xa_handle_type type,
                  uint32_t * handle, unsigned int *stride)
  {
      struct winsys_handle whandle;

      struct pipe_screen *screen = srf->xa->screen;
      boolean res;

      memset(&whandle, 0, sizeof(whandle));
      whandle.type = handle_type(type);
-    res = screen->resource_get_handle(screen, srf->tex, &whandle,
+    res = screen->resource_get_handle(screen, srf->xa->default_ctx->pipe,
+                                      srf->tex, &whandle,
                                        PIPE_HANDLE_USAGE_READ_WRITE);
      if (!res)
        return -XA_ERR_INVAL;

      *handle = whandle.handle;
      *stride = whandle.stride;

      return XA_ERR_NONE;
  }

diff --git a/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c 
b/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c
index e130cd2..47cf7f0 100644
--- a/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c
+++ b/src/gallium/winsys/sw/wrapper/wrapper_sw_winsys.c
@@ -195,21 +195,21 @@ wsw_dt_from_handle(struct sw_winsys *ws,

  static boolean
  wsw_dt_get_handle(struct sw_winsys *ws,
                    struct sw_displaytarget *dt,
                    struct winsys_handle *whandle)
  {
     struct wrapper_sw_winsys *wsw = wrapper_sw_winsys(ws);
     struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt);
     struct pipe_resource *tex = wdt->tex;

-   return wsw->screen->resource_get_handle(wsw->screen, tex, whandle,
+   return wsw->screen->resource_get_handle(wsw->screen, NULL, tex, whandle,
                                             PIPE_HANDLE_USAGE_READ_WRITE);
  }

  static void *
  wsw_dt_map(struct sw_winsys *ws,
             struct sw_displaytarget *dt,
             unsigned flags)
  {
     struct wrapper_sw_displaytarget *wdt = wrapper_sw_displaytarget(dt);
     struct pipe_context *pipe = wdt->winsys->pipe;


Looks OK to me.

Reviewed-by: Brian Paul <[email protected]>

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to