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