From: Marek Olšák Date: Fri, 30 Aug 2019 00:35:54 +0000 (-0400) Subject: gallium: extend resource_get_param to be as capable as resource_get_handle X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d307aa56f9f92da79d4ebbf1f9a1b3e65156f258;p=mesa.git gallium: extend resource_get_param to be as capable as resource_get_handle Reviewed-by: Tapani Pälli Reviewed-by: Kenneth Graunke --- 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 5b1fde7aac6..a140b3f1c6f 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 47b9f0f7393..574ddaea5c7 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -1146,14 +1146,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 @@ -1161,6 +1162,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; @@ -1192,7 +1194,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) { @@ -1330,7 +1337,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; @@ -1339,7 +1346,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;