Mesa (master): freedreno: Implement memory object create/destroy for GL_EXT_memory_object
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Aug 18 20:57:07 UTC 2020
Module: Mesa
Branch: master
Commit: 0eecd3d68466327567df7da468cc2088a652e22f
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0eecd3d68466327567df7da468cc2088a652e22f
Author: Eduardo Lima Mitev <elima at igalia.com>
Date: Tue Apr 7 08:52:25 2020 +0200
freedreno: Implement memory object create/destroy for GL_EXT_memory_object
v2: Add implementation of fd_memobj_destroy() virtual func, which was newly
added.
v3: The memobj bo must be non-NULL and destroyed as part of memobj
destruction (instead of its reference being stolen). (Rob Clark)
Reviewed-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4565>
---
src/gallium/drivers/freedreno/freedreno_resource.c | 37 ++++++++++++++++++++++
src/gallium/drivers/freedreno/freedreno_resource.h | 11 +++++++
2 files changed, 48 insertions(+)
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index 07baa7d293b..1696cb8cc9c 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -1173,6 +1173,39 @@ fd_layout_resource_for_modifier(struct fd_resource *rsc, uint64_t modifier)
}
}
+static struct pipe_memory_object *
+fd_memobj_create_from_handle(struct pipe_screen *pscreen,
+ struct winsys_handle *whandle,
+ bool dedicated)
+{
+ struct fd_memory_object *memobj = CALLOC_STRUCT(fd_memory_object);
+ if (!memobj)
+ return NULL;
+
+ struct fd_bo *bo = fd_screen_bo_from_handle(pscreen, whandle);
+ if (!bo) {
+ free(memobj);
+ return NULL;
+ }
+
+ memobj->b.dedicated = dedicated;
+ memobj->bo = bo;
+
+ return &memobj->b;
+}
+
+static void
+fd_memobj_destroy(struct pipe_screen *pscreen,
+ struct pipe_memory_object *pmemobj)
+{
+ struct fd_memory_object *memobj = fd_memory_object(pmemobj);
+
+ assert(memobj->bo);
+ fd_bo_del(memobj->bo);
+
+ free(pmemobj);
+}
+
void
fd_resource_screen_init(struct pipe_screen *pscreen)
{
@@ -1197,6 +1230,10 @@ fd_resource_screen_init(struct pipe_screen *pscreen)
screen->supported_modifiers = supported_modifiers;
screen->num_supported_modifiers = ARRAY_SIZE(supported_modifiers);
}
+
+ /* GL_EXT_memory_object */
+ pscreen->memobj_create_from_handle = fd_memobj_create_from_handle;
+ pscreen->memobj_destroy = fd_memobj_destroy;
}
static void
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.h b/src/gallium/drivers/freedreno/freedreno_resource.h
index 9419097dcdf..f2382d75be2 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.h
+++ b/src/gallium/drivers/freedreno/freedreno_resource.h
@@ -101,6 +101,11 @@ struct fd_resource {
struct fd_bo *lrz;
};
+struct fd_memory_object {
+ struct pipe_memory_object b;
+ struct fd_bo *bo;
+};
+
static inline struct fd_resource *
fd_resource(struct pipe_resource *ptex)
{
@@ -113,6 +118,12 @@ fd_resource_const(const struct pipe_resource *ptex)
return (const struct fd_resource *)ptex;
}
+static inline struct fd_memory_object *
+fd_memory_object (struct pipe_memory_object *pmemobj)
+{
+ return (struct fd_memory_object *)pmemobj;
+}
+
static inline bool
pending(struct fd_resource *rsc, bool write)
{
More information about the mesa-commit
mailing list