iris: Implement pipe_screen::resource_get_param
authorJordan Justen <jordan.l.justen@intel.com>
Fri, 2 Aug 2019 08:21:12 +0000 (01:21 -0700)
committerJordan Justen <jordan.l.justen@intel.com>
Tue, 13 Aug 2019 08:12:30 +0000 (01:12 -0700)
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/gallium/drivers/iris/iris_resource.c

index d94bafce8ef8fcab513f967c509b46e6c2f85d1c..ac113e3e18136d5f617cd8a36287a9dfc636d54c 100644 (file)
@@ -827,6 +827,53 @@ iris_flush_resource(struct pipe_context *ctx, struct pipe_resource *resource)
                                 mod ? mod->supports_clear_color : false);
 }
 
+static bool
+iris_resource_get_param(struct pipe_screen *screen,
+                        struct pipe_resource *resource,
+                        unsigned int plane,
+                        enum pipe_resource_param param,
+                        uint64_t *value)
+{
+   struct iris_resource *res = (struct iris_resource *)resource;
+   bool mod_with_aux =
+      res->mod_info && res->mod_info->aux_usage != ISL_AUX_USAGE_NONE;
+   bool wants_aux = mod_with_aux && plane > 0;
+   struct iris_bo *bo = wants_aux ? res->aux.bo : res->bo;
+   bool result;
+   unsigned handle;
+
+   switch (param) {
+   case PIPE_RESOURCE_PARAM_NPLANES:
+      *value = mod_with_aux ? 2 : 1;
+      return true;
+   case PIPE_RESOURCE_PARAM_STRIDE:
+      *value = wants_aux ? res->aux.surf.row_pitch_B : res->surf.row_pitch_B;
+      return true;
+   case PIPE_RESOURCE_PARAM_OFFSET:
+      *value = wants_aux ? res->aux.offset : 0;
+      return true;
+   case PIPE_RESOURCE_PARAM_MODIFIER:
+      *value = res->mod_info ? res->mod_info->modifier :
+               tiling_to_modifier(res->bo->tiling_mode);
+      return true;
+   case PIPE_RESOURCE_PARAM_HANDLE_TYPE_SHARED:
+      result = iris_bo_flink(bo, &handle) == 0;
+      if (result)
+         *value = handle;
+      return result;
+   case PIPE_RESOURCE_PARAM_HANDLE_TYPE_KMS:
+      *value = iris_bo_export_gem_handle(bo);
+      return true;
+   case PIPE_RESOURCE_PARAM_HANDLE_TYPE_FD:
+      result = iris_bo_export_dmabuf(bo, (int *) &handle) == 0;
+      if (result)
+         *value = handle;
+      return result;
+   default:
+      return false;
+   }
+}
+
 static bool
 iris_resource_get_handle(struct pipe_screen *pscreen,
                          struct pipe_context *ctx,
@@ -1640,6 +1687,7 @@ iris_init_screen_resource_functions(struct pipe_screen *pscreen)
    pscreen->resource_from_user_memory = iris_resource_from_user_memory;
    pscreen->resource_from_handle = iris_resource_from_handle;
    pscreen->resource_get_handle = iris_resource_get_handle;
+   pscreen->resource_get_param = iris_resource_get_param;
    pscreen->resource_destroy = u_transfer_helper_resource_destroy;
    pscreen->transfer_helper =
       u_transfer_helper_create(&transfer_vtbl, true, true, false, true);