Mesa (main): zink: add a pipe_screen::resource_get_param hook

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 13 00:32:41 UTC 2021


Module: Mesa
Branch: main
Commit: 9b40fc4892c24a5eb5558719682fad6bfc3dd79b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9b40fc4892c24a5eb5558719682fad6bfc3dd79b

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri Apr  9 10:12:40 2021 -0400

zink: add a pipe_screen::resource_get_param hook

this is used for querying image properties

Acked-by: Dave Airlie <airlied at redhat.com>
Reviewed-by: Emil Velikov <emil.l.velikov at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10782>

---

 src/gallium/drivers/zink/zink_resource.c | 131 ++++++++++++++++++++++++++-----
 1 file changed, 110 insertions(+), 21 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index 2db497069b5..b82bc90673a 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -327,6 +327,7 @@ static VkImageUsageFlags
 get_image_usage(struct zink_screen *screen, VkImageCreateInfo *ici, const struct pipe_resource *templ, unsigned bind, unsigned modifiers_count, const uint64_t *modifiers, uint64_t *mod)
 {
    VkImageTiling tiling = ici->tiling;
+#ifdef ZINK_USE_DMABUF
    *mod = DRM_FORMAT_MOD_INVALID;
    if (modifiers_count) {
       assert(tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT);
@@ -351,7 +352,9 @@ get_image_usage(struct zink_screen *screen, VkImageCreateInfo *ici, const struct
             }
          }
       }
-   } else {
+   } else
+#endif
+   {
       VkFormatProperties props = screen->format_props[templ->format];
       VkFormatFeatureFlags feats = tiling == VK_IMAGE_TILING_LINEAR ? props.linearTilingFeatures : props.optimalTilingFeatures;
       VkImageUsageFlags usage = get_image_usage_for_feats(screen, feats, templ, bind);
@@ -361,7 +364,9 @@ get_image_usage(struct zink_screen *screen, VkImageCreateInfo *ici, const struct
             return usage;
       }
    }
+#ifdef ZINK_USE_DMABUF
    *mod = DRM_FORMAT_MOD_INVALID;
+#endif
    return 0;
 }
 
@@ -805,28 +810,115 @@ zink_resource_create(struct pipe_screen *pscreen,
 }
 
 static bool
-zink_resource_get_handle(struct pipe_screen *pscreen,
-                         struct pipe_context *context,
-                         struct pipe_resource *tex,
-                         struct winsys_handle *whandle,
-                         unsigned usage)
+zink_resource_get_param(struct pipe_screen *pscreen, struct pipe_context *pctx,
+                        struct pipe_resource *pres,
+                        unsigned plane,
+                        unsigned layer,
+                        unsigned level,
+                        enum pipe_resource_param param,
+                        unsigned handle_usage,
+                        uint64_t *value)
 {
-   struct zink_resource *res = zink_resource(tex);
    struct zink_screen *screen = zink_screen(pscreen);
+   struct zink_resource *res = zink_resource(pres);
    //TODO: remove for wsi
    struct zink_resource_object *obj = res->scanout_obj ? res->scanout_obj : res->obj;
+   VkImageAspectFlags aspect = obj->modifier_aspect ? obj->modifier_aspect : res->aspect;
+   struct winsys_handle whandle;
+   switch (param) {
+   case PIPE_RESOURCE_PARAM_NPLANES:
+      /* not yet implemented */
+      *value = 1;
+      break;
 
-   if (res->base.b.target != PIPE_BUFFER) {
+   case PIPE_RESOURCE_PARAM_STRIDE: {
       VkImageSubresource sub_res = {0};
       VkSubresourceLayout sub_res_layout = {0};
 
-      sub_res.aspectMask = obj->modifier_aspect ? obj->modifier_aspect : res->aspect;
+      sub_res.aspectMask = aspect;
 
       vkGetImageSubresourceLayout(screen->dev, obj->image, &sub_res, &sub_res_layout);
 
-      whandle->stride = sub_res_layout.rowPitch;
+      *value = sub_res_layout.rowPitch;
+      break;
+   }
+
+   case PIPE_RESOURCE_PARAM_OFFSET: {
+         VkImageSubresource isr = {
+            aspect,
+            level,
+            layer
+         };
+         VkSubresourceLayout srl;
+         vkGetImageSubresourceLayout(screen->dev, obj->image, &isr, &srl);
+         *value = srl.offset;
+         break;
+   }
+
+   case PIPE_RESOURCE_PARAM_MODIFIER: {
+#ifdef ZINK_USE_DMABUF
+      *value = DRM_FORMAT_MOD_INVALID;
+      if (!screen->info.have_EXT_image_drm_format_modifier)
+         return false;
+      VkImageDrmFormatModifierPropertiesEXT prop;
+      prop.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT;
+      prop.pNext = NULL;
+      if (screen->vk.GetImageDrmFormatModifierPropertiesEXT(screen->dev, obj->image, &prop) == VK_SUCCESS)
+         *value = prop.drmFormatModifier;
+      break;
+#else
+      return false;
+#endif
+   }
+
+   case PIPE_RESOURCE_PARAM_LAYER_STRIDE: {
+         VkImageSubresource isr = {
+            aspect,
+            level,
+            layer
+         };
+         VkSubresourceLayout srl;
+         vkGetImageSubresourceLayout(screen->dev, obj->image, &isr, &srl);
+         if (res->base.b.target == PIPE_TEXTURE_3D)
+            *value = srl.depthPitch;
+         else
+            *value = srl.arrayPitch;
+         break;
    }
 
+   case PIPE_RESOURCE_PARAM_HANDLE_TYPE_SHARED:
+   case PIPE_RESOURCE_PARAM_HANDLE_TYPE_KMS:
+   case PIPE_RESOURCE_PARAM_HANDLE_TYPE_FD: {
+      memset(&whandle, 0, sizeof(whandle));
+      if (param == PIPE_RESOURCE_PARAM_HANDLE_TYPE_SHARED)
+         whandle.type = WINSYS_HANDLE_TYPE_SHARED;
+      else if (param == PIPE_RESOURCE_PARAM_HANDLE_TYPE_KMS)
+         whandle.type = WINSYS_HANDLE_TYPE_KMS;
+      else if (param == PIPE_RESOURCE_PARAM_HANDLE_TYPE_FD)
+         whandle.type = WINSYS_HANDLE_TYPE_FD;
+
+      if (!pscreen->resource_get_handle(pscreen, pctx, pres, &whandle, handle_usage))
+         return false;
+
+      *value = whandle.handle;
+      break;
+   }
+   }
+   return true;
+}
+
+static bool
+zink_resource_get_handle(struct pipe_screen *pscreen,
+                         struct pipe_context *context,
+                         struct pipe_resource *tex,
+                         struct winsys_handle *whandle,
+                         unsigned usage)
+{
+   struct zink_resource *res = zink_resource(tex);
+   struct zink_screen *screen = zink_screen(pscreen);
+   //TODO: remove for wsi
+   struct zink_resource_object *obj = res->scanout_obj ? res->scanout_obj : res->obj;
+
    if (whandle->type == WINSYS_HANDLE_TYPE_FD) {
 #ifdef ZINK_USE_DMABUF
       VkMemoryGetFdInfoKHR fd_info = {0};
@@ -839,17 +931,13 @@ zink_resource_get_handle(struct pipe_screen *pscreen,
       if (result != VK_SUCCESS)
          return false;
       whandle->handle = fd;
-      if (screen->info.have_EXT_image_drm_format_modifier) {
-         VkImageDrmFormatModifierPropertiesEXT props = {
-            .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
-         };
-         screen->vk.GetImageDrmFormatModifierPropertiesEXT(screen->dev,
-                                                           res->obj->image,
-                                                           &props);
-         whandle->modifier = props.drmFormatModifier;
-      } else
-         whandle->modifier = DRM_FORMAT_MOD_INVALID;
-
+      uint64_t value;
+      zink_resource_get_param(pscreen, context, tex, 0, 0, 0, PIPE_RESOURCE_PARAM_MODIFIER, 0, &value);
+      whandle->modifier = value;
+      zink_resource_get_param(pscreen, context, tex, 0, 0, 0, PIPE_RESOURCE_PARAM_OFFSET, 0, &value);
+      whandle->offset = value;
+      zink_resource_get_param(pscreen, context, tex, 0, 0, 0, PIPE_RESOURCE_PARAM_STRIDE, 0, &value);
+      whandle->stride = value;
 #else
       return false;
 #endif
@@ -1535,6 +1623,7 @@ zink_screen_resource_init(struct pipe_screen *pscreen)
       pscreen->resource_get_handle = zink_resource_get_handle;
       pscreen->resource_from_handle = zink_resource_from_handle;
    }
+   pscreen->resource_get_param = zink_resource_get_param;
    simple_mtx_init(&screen->mem_cache_mtx, mtx_plain);
    screen->resource_mem_cache = _mesa_hash_table_create(NULL, mem_hash, mem_equals);
    return !!screen->resource_mem_cache;



More information about the mesa-commit mailing list