Mesa (master): i965: Initial implementation for EXT_memory_object_*

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Apr 28 15:02:47 UTC 2021


Module: Mesa
Branch: master
Commit: f73aeca0ce3ef4c09c2d07d5c7b2724cc84f1e91
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f73aeca0ce3ef4c09c2d07d5c7b2724cc84f1e91

Author: Rohan Garg <rohan.garg at collabora.com>
Date:   Mon Jun  8 22:34:26 2020 +0200

i965: Initial implementation for EXT_memory_object_*

Signed-off-by: Rohan Garg <rohan.garg at collabora.com>
Reviewed-by: Eleni Maria Stea <estea at igalia.com>
Reviewed-by: Tapani Pälli <tapani.palli at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5594>

---

 src/mesa/drivers/dri/i965/brw_buffer_objects.h  | 11 ++++
 src/mesa/drivers/dri/i965/brw_context.c         | 26 +++++++++
 src/mesa/drivers/dri/i965/brw_surface_formats.c |  7 +++
 src/mesa/drivers/dri/i965/brw_tex.c             | 73 +++++++++++++++++++++++++
 4 files changed, 117 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_buffer_objects.h b/src/mesa/drivers/dri/i965/brw_buffer_objects.h
index fef07232e82..3ed09304ffa 100644
--- a/src/mesa/drivers/dri/i965/brw_buffer_objects.h
+++ b/src/mesa/drivers/dri/i965/brw_buffer_objects.h
@@ -127,4 +127,15 @@ brw_buffer_object(struct gl_buffer_object *obj)
    return (struct brw_buffer_object *) obj;
 }
 
+struct brw_memory_object {
+   struct gl_memory_object Base;
+   struct brw_bo *bo;
+};
+
+static inline struct brw_memory_object *
+brw_memory_object(struct gl_memory_object *obj)
+{
+   return (struct brw_memory_object *)obj;
+}
+
 #endif
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
index 252640f8167..dc5a5ea3d8e 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -46,6 +46,7 @@
 #include "main/stencil.h"
 #include "main/state.h"
 #include "main/spirv_extensions.h"
+#include "main/externalobjects.h"
 
 #include "vbo/vbo.h"
 
@@ -158,6 +159,29 @@ brw_set_background_context(struct gl_context *ctx,
    backgroundCallable->setBackgroundContext(driContext->loaderPrivate);
 }
 
+static void
+brw_delete_memoryobj(struct gl_context *ctx, struct gl_memory_object *memObj)
+{
+   struct brw_memory_object *memory_object = brw_memory_object(memObj);
+   brw_bo_unreference(memory_object->bo);
+   _mesa_delete_memory_object(ctx, memObj);
+}
+
+static void
+brw_import_memoryobj_fd(struct gl_context *ctx,
+                       struct gl_memory_object *obj,
+                       GLuint64 size,
+                       int fd)
+{
+   struct brw_context *brw = brw_context(ctx);
+   struct brw_memory_object *memory_object = brw_memory_object(obj);
+
+   memory_object->bo = brw_bo_gem_create_from_prime(brw->bufmgr, fd);
+   brw_bo_reference(memory_object->bo);
+   assert(memory_object->bo->size >= size);
+   close(fd);
+}
+
 static void
 brw_viewport(struct gl_context *ctx)
 {
@@ -437,6 +461,8 @@ brw_init_driver_functions(struct brw_context *brw,
 
    functions->SetBackgroundContext = brw_set_background_context;
 
+   functions->DeleteMemoryObject = brw_delete_memoryobj;
+   functions->ImportMemoryObjectFd = brw_import_memoryobj_fd;
    functions->GetDeviceUuid = brw_get_device_uuid;
    functions->GetDriverUuid = brw_get_driver_uuid;
 }
diff --git a/src/mesa/drivers/dri/i965/brw_surface_formats.c b/src/mesa/drivers/dri/i965/brw_surface_formats.c
index c3197832d6a..c3bdac4befc 100644
--- a/src/mesa/drivers/dri/i965/brw_surface_formats.c
+++ b/src/mesa/drivers/dri/i965/brw_surface_formats.c
@@ -197,6 +197,7 @@ brw_isl_format_for_mesa_format(mesa_format mesa_format)
       [MESA_FORMAT_RGBX_UNORM16] = ISL_FORMAT_R16G16B16X16_UNORM,
       [MESA_FORMAT_RGBX_FLOAT16] = ISL_FORMAT_R16G16B16X16_FLOAT,
       [MESA_FORMAT_RGBX_FLOAT32] = ISL_FORMAT_R32G32B32X32_FLOAT,
+      [MESA_FORMAT_Z_UNORM16] = ISL_FORMAT_R16_UNORM,
    };
 
    assert(mesa_format < MESA_FORMAT_COUNT);
@@ -224,6 +225,12 @@ brw_screen_init_surface_formats(struct brw_screen *screen)
 
       render = texture = brw_isl_format_for_mesa_format(format);
 
+      /* Only exposed with EXT_memory_object_* support which
+       * is not for older gens.
+       */
+      if (gen < 70 && format == MESA_FORMAT_Z_UNORM16)
+         continue;
+
       if (texture == ISL_FORMAT_UNSUPPORTED)
          continue;
 
diff --git a/src/mesa/drivers/dri/i965/brw_tex.c b/src/mesa/drivers/dri/i965/brw_tex.c
index e9cd6fe963f..ee2a5f3ced7 100644
--- a/src/mesa/drivers/dri/i965/brw_tex.c
+++ b/src/mesa/drivers/dri/i965/brw_tex.c
@@ -10,6 +10,7 @@
 #include "brw_mipmap_tree.h"
 #include "brw_tex.h"
 #include "brw_fbo.h"
+#include "brw_state.h"
 #include "util/u_memory.h"
 
 #define FILE_DEBUG_FLAG DEBUG_TEXTURE
@@ -321,6 +322,77 @@ brw_texture_barrier(struct gl_context *ctx)
    }
 }
 
+/* Return the usual surface usage flags for the given format. */
+static isl_surf_usage_flags_t
+isl_surf_usage(mesa_format format)
+{
+   switch(_mesa_get_format_base_format(format)) {
+   case GL_DEPTH_COMPONENT:
+      return ISL_SURF_USAGE_DEPTH_BIT | ISL_SURF_USAGE_TEXTURE_BIT;
+   case GL_DEPTH_STENCIL:
+      return ISL_SURF_USAGE_DEPTH_BIT | ISL_SURF_USAGE_STENCIL_BIT |
+             ISL_SURF_USAGE_TEXTURE_BIT;
+   case GL_STENCIL_INDEX:
+      return ISL_SURF_USAGE_STENCIL_BIT | ISL_SURF_USAGE_TEXTURE_BIT;
+   default:
+      return ISL_SURF_USAGE_RENDER_TARGET_BIT | ISL_SURF_USAGE_TEXTURE_BIT;
+   }
+}
+
+static GLboolean
+intel_texture_for_memory_object(struct gl_context *ctx,
+                                          struct gl_texture_object *tex_obj,
+                                          struct gl_memory_object *mem_obj,
+                                          GLsizei levels, GLsizei width,
+                                          GLsizei height, GLsizei depth,
+                                          GLuint64 offset)
+{
+   struct brw_context *brw = brw_context(ctx);
+   struct brw_memory_object *intel_memobj = brw_memory_object(mem_obj);
+   struct brw_texture_object *intel_texobj = brw_texture_object(tex_obj);
+   struct gl_texture_image *image = tex_obj->Image[0][0];
+   struct isl_surf surf;
+
+   isl_tiling_flags_t tiling_flags = ISL_TILING_ANY_MASK;
+   if (tex_obj->TextureTiling == GL_LINEAR_TILING_EXT)
+      tiling_flags = ISL_TILING_LINEAR_BIT;
+
+   UNUSED const bool isl_surf_created_successfully =
+      isl_surf_init(&brw->screen->isl_dev, &surf,
+                    .dim = get_isl_surf_dim(tex_obj->Target),
+                    .format = brw_isl_format_for_mesa_format(image->TexFormat),
+                    .width = width,
+                    .height = height,
+                    .depth = depth,
+                    .levels = levels,
+                    .array_len = tex_obj->Target == GL_TEXTURE_3D ? 1 : depth,
+                    .samples = MAX2(image->NumSamples, 1),
+                    .usage = isl_surf_usage(image->TexFormat),
+                    .tiling_flags = tiling_flags);
+
+   assert(isl_surf_created_successfully);
+
+   intel_texobj->mt = brw_miptree_create_for_bo(brw,
+                                                intel_memobj->bo,
+                                                image->TexFormat,
+                                                offset,
+                                                width,
+                                                height,
+                                                depth,
+                                                surf.row_pitch_B,
+                                                surf.tiling,
+                                                MIPTREE_CREATE_NO_AUX);
+   assert(intel_texobj->mt);
+   brw_alloc_texture_image_buffer(ctx, image);
+
+   intel_texobj->needs_validate = false;
+   intel_texobj->validated_first_level = 0;
+   intel_texobj->validated_last_level = levels - 1;
+   intel_texobj->_Format = image->TexFormat;
+
+   return GL_TRUE;
+}
+
 void
 brw_init_texture_functions(struct dd_function_table *functions)
 {
@@ -335,4 +407,5 @@ brw_init_texture_functions(struct dd_function_table *functions)
    functions->UnmapTextureImage = brw_unmap_texture_image;
    functions->TextureView = brw_texture_view;
    functions->TextureBarrier = brw_texture_barrier;
+   functions->SetTextureStorageForMemoryObject = intel_texture_for_memory_object;
 }



More information about the mesa-commit mailing list