Mesa (staging/19.2): gallium: extend resource_get_param to be as capable as resource_get_handle

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Sep 26 15:48:26 UTC 2019


Module: Mesa
Branch: staging/19.2
Commit: 95d87a897b9deb1019f0d3998b85ae42cff88b4b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=95d87a897b9deb1019f0d3998b85ae42cff88b4b

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Thu Aug 29 20:35:54 2019 -0400

gallium: extend resource_get_param to be as capable as resource_get_handle

Reviewed-by: Tapani Pälli <tapani.palli at intel.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
(cherry picked from commit d307aa56f9f92da79d4ebbf1f9a1b3e65156f258)

---

 src/gallium/auxiliary/driver_ddebug/dd_screen.c |  9 +++++++--
 src/gallium/auxiliary/driver_noop/noop_pipe.c   |  8 ++++++--
 src/gallium/auxiliary/driver_rbug/rbug_screen.c | 10 ++++++++--
 src/gallium/auxiliary/driver_trace/tr_screen.c  | 10 ++++++++--
 src/gallium/drivers/iris/iris_resource.c        |  5 ++++-
 src/gallium/include/pipe/p_screen.h             | 11 ++++++++++-
 src/gallium/state_trackers/dri/dri2.c           | 19 +++++++++++++------
 7 files changed, 56 insertions(+), 16 deletions(-)

diff --git a/src/gallium/auxiliary/driver_ddebug/dd_screen.c b/src/gallium/auxiliary/driver_ddebug/dd_screen.c
index 25cb2014210..b66d24babb9 100644
--- a/src/gallium/auxiliary/driver_ddebug/dd_screen.c
+++ b/src/gallium/auxiliary/driver_ddebug/dd_screen.c
@@ -313,14 +313,19 @@ dd_screen_resource_get_handle(struct pipe_screen *_screen,
 
 static bool
 dd_screen_resource_get_param(struct pipe_screen *_screen,
+                             struct pipe_context *_pipe,
                              struct pipe_resource *resource,
-                             unsigned int plane,
+                             unsigned plane,
+                             unsigned layer,
                              enum pipe_resource_param param,
+                             unsigned handle_usage,
                              uint64_t *value)
 {
    struct pipe_screen *screen = dd_screen(_screen)->screen;
+   struct pipe_context *pipe = _pipe ? dd_context(_pipe)->pipe : NULL;
 
-   return screen->resource_get_param(screen, resource, plane, param, value);
+   return screen->resource_get_param(screen, pipe, resource, plane, layer,
+                                     param, handle_usage, value);
 }
 
 static void
diff --git a/src/gallium/auxiliary/driver_noop/noop_pipe.c b/src/gallium/auxiliary/driver_noop/noop_pipe.c
index ec619fd33bc..722e15b97c7 100644
--- a/src/gallium/auxiliary/driver_noop/noop_pipe.c
+++ b/src/gallium/auxiliary/driver_noop/noop_pipe.c
@@ -157,9 +157,12 @@ static bool noop_resource_get_handle(struct pipe_screen *pscreen,
 }
 
 static bool noop_resource_get_param(struct pipe_screen *pscreen,
+                                    struct pipe_context *ctx,
                                     struct pipe_resource *resource,
-                                    unsigned int plane,
+                                    unsigned plane,
+                                    unsigned layer,
                                     enum pipe_resource_param param,
+                                    unsigned handle_usage,
                                     uint64_t *value)
 {
    struct noop_pipe_screen *noop_screen = (struct noop_pipe_screen*)pscreen;
@@ -172,7 +175,8 @@ static bool noop_resource_get_param(struct pipe_screen *pscreen,
    if (!tex)
       return false;
 
-   result = screen->resource_get_param(screen, tex, 0, param, value);
+   result = screen->resource_get_param(screen, NULL, tex, 0, 0, param,
+                                       handle_usage, value);
    pipe_resource_reference(&tex, NULL);
    return result;
 }
diff --git a/src/gallium/auxiliary/driver_rbug/rbug_screen.c b/src/gallium/auxiliary/driver_rbug/rbug_screen.c
index 247745fa533..a85d4e60e5b 100644
--- a/src/gallium/auxiliary/driver_rbug/rbug_screen.c
+++ b/src/gallium/auxiliary/driver_rbug/rbug_screen.c
@@ -217,17 +217,23 @@ rbug_screen_resource_get_handle(struct pipe_screen *_screen,
 
 static bool
 rbug_screen_resource_get_param(struct pipe_screen *_screen,
+                               struct pipe_context *_pipe,
                                struct pipe_resource *_resource,
-                               unsigned int plane,
+                               unsigned plane,
+                               unsigned layer,
                                enum pipe_resource_param param,
+                               unsigned handle_usage,
                                uint64_t *value)
 {
    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_param(screen, resource, plane, param, value);
+   return screen->resource_get_param(screen, rb_pipe ? rb_pipe->pipe : NULL,
+                                     resource, plane, layer, param,
+                                     handle_usage, value);
 }
 
 
diff --git a/src/gallium/auxiliary/driver_trace/tr_screen.c b/src/gallium/auxiliary/driver_trace/tr_screen.c
index 0417e2339c2..380e3ea7511 100644
--- a/src/gallium/auxiliary/driver_trace/tr_screen.c
+++ b/src/gallium/auxiliary/driver_trace/tr_screen.c
@@ -409,17 +409,23 @@ trace_screen_resource_get_handle(struct pipe_screen *_screen,
 
 static bool
 trace_screen_resource_get_param(struct pipe_screen *_screen,
+                                struct pipe_context *_pipe,
                                 struct pipe_resource *resource,
-                                unsigned int plane,
+                                unsigned plane,
+                                unsigned layer,
                                 enum pipe_resource_param param,
+                                unsigned handle_usage,
                                 uint64_t *value)
 {
    struct trace_screen *tr_screen = trace_screen(_screen);
+   struct trace_context *tr_pipe = _pipe ? trace_context(_pipe) : NULL;
    struct pipe_screen *screen = tr_screen->screen;
 
    /* TODO trace call */
 
-   return screen->resource_get_param(screen, resource, plane, param, value);
+   return screen->resource_get_param(screen, tr_pipe ? tr_pipe->pipe : NULL,
+                                     resource, plane, layer, param,
+                                     handle_usage, value);
 }
 
 static void
diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c
index 341375822d4..ce9b7360e97 100644
--- a/src/gallium/drivers/iris/iris_resource.c
+++ b/src/gallium/drivers/iris/iris_resource.c
@@ -1025,9 +1025,12 @@ iris_flush_resource(struct pipe_context *ctx, struct pipe_resource *resource)
 
 static bool
 iris_resource_get_param(struct pipe_screen *screen,
+                        struct pipe_context *context,
                         struct pipe_resource *resource,
-                        unsigned int plane,
+                        unsigned plane,
+                        unsigned layer,
                         enum pipe_resource_param param,
+                        unsigned handle_usage,
                         uint64_t *value)
 {
    struct iris_resource *res = (struct iris_resource *)resource;
diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h
index 1d0e5c53668..9a1fc37280e 100644
--- a/src/gallium/include/pipe/p_screen.h
+++ b/src/gallium/include/pipe/p_screen.h
@@ -265,11 +265,20 @@ struct pipe_screen {
    /**
     * Get info for the given pipe resource without the need to get a
     * winsys_handle.
+    *
+    * 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 context parameter
+    * is allowed to be NULL.
     */
    bool (*resource_get_param)(struct pipe_screen *screen,
+                              struct pipe_context *context,
                               struct pipe_resource *resource,
-                              unsigned int plane,
+                              unsigned plane,
+                              unsigned layer,
                               enum pipe_resource_param param,
+                              unsigned handle_usage,
                               uint64_t *value);
 
    /**
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
index 2b43de9df5d..2522d8e4019 100644
--- a/src/gallium/state_trackers/dri/dri2.c
+++ b/src/gallium/state_trackers/dri/dri2.c
@@ -1128,14 +1128,15 @@ dri2_query_image_by_resource_handle(__DRIimage *image, int attrib, int *value)
 
 static bool
 dri2_resource_get_param(__DRIimage *image, enum pipe_resource_param param,
-                        uint64_t *value)
+                        unsigned handle_usage, uint64_t *value)
 {
    struct pipe_screen *pscreen = image->texture->screen;
    if (!pscreen->resource_get_param)
       return false;
 
-   return pscreen->resource_get_param(pscreen, image->texture, image->plane,
-                                      param, value);
+   return pscreen->resource_get_param(pscreen, NULL, image->texture,
+                                      image->plane, 0, param, handle_usage,
+                                      value);
 }
 
 static bool
@@ -1143,6 +1144,7 @@ dri2_query_image_by_resource_param(__DRIimage *image, int attrib, int *value)
 {
    enum pipe_resource_param param;
    uint64_t res_param;
+   unsigned handle_usage;
 
    if (!image->texture->screen->resource_get_param)
       return false;
@@ -1174,7 +1176,12 @@ dri2_query_image_by_resource_param(__DRIimage *image, int attrib, int *value)
       return false;
    }
 
-   if (!dri2_resource_get_param(image, param, &res_param))
+   if (image->use & __DRI_IMAGE_USE_BACKBUFFER)
+      handle_usage = PIPE_HANDLE_USAGE_EXPLICIT_FLUSH;
+   else
+      handle_usage = PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE;
+
+   if (!dri2_resource_get_param(image, param, handle_usage, &res_param))
       return false;
 
    switch (attrib) {
@@ -1312,7 +1319,7 @@ dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate)
       return NULL;
    } else if (plane > 0) {
       uint64_t planes;
-      if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_NPLANES,
+      if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_NPLANES, 0,
                                    &planes) ||
           plane >= planes) {
          return NULL;
@@ -1321,7 +1328,7 @@ dri2_from_planar(__DRIimage *image, int plane, void *loaderPrivate)
 
    if (image->dri_components == 0) {
       uint64_t modifier;
-      if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_MODIFIER,
+      if (!dri2_resource_get_param(image, PIPE_RESOURCE_PARAM_MODIFIER, 0,
                                    &modifier) ||
           modifier == DRM_FORMAT_MOD_INVALID) {
          return NULL;




More information about the mesa-commit mailing list