Mesa (master): freedreno: implement pipe screen's resource_from_memobj

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Aug 18 20:57:08 UTC 2020


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

Author: Eduardo Lima Mitev <elima at igalia.com>
Date:   Wed Apr  8 13:59:48 2020 +0200

freedreno: implement pipe screen's resource_from_memobj

v2: Use 'prsc' and 'rsc', 'pmemobj' and 'memobj' for consistency with
    rest of the code. (Rob Clark)

v3: - Use the existing flag PIPE_BIND_LINEAR instead (Marek Olšák)
    - Assert that the resource is not intended for scanout (Rob Clark)
    - Use the fd_resource_allocate_and_resolve() helper (Rob Clark)
    - Check that bo's resolved size fit into memobj's bo size (Rob Clark)

v4: Don't steal memobj's bo, but share it instead by getting a new
ref. (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 | 44 ++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c
index 624714718de..45bff983bdc 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -1202,6 +1202,49 @@ fd_layout_resource_for_modifier(struct fd_resource *rsc, uint64_t modifier)
 	}
 }
 
+static struct pipe_resource *
+fd_resource_from_memobj(struct pipe_screen *pscreen,
+						const struct pipe_resource *tmpl,
+						struct pipe_memory_object *pmemobj,
+						uint64_t offset)
+{
+	struct fd_screen *screen = fd_screen(pscreen);
+	struct fd_memory_object *memobj = fd_memory_object(pmemobj);
+	struct pipe_resource *prsc;
+	struct fd_resource *rsc;
+	uint32_t size;
+	assert(memobj->bo);
+
+	/* We shouldn't get a scanout buffer here. */
+	assert(!(tmpl->bind & PIPE_BIND_SCANOUT));
+
+	uint64_t modifiers = DRM_FORMAT_MOD_INVALID;
+	if (tmpl->bind & PIPE_BIND_LINEAR) {
+		modifiers = DRM_FORMAT_MOD_LINEAR;
+	} else if (is_a6xx(screen) && tmpl->width0 >= FDL_MIN_UBWC_WIDTH) {
+		modifiers = DRM_FORMAT_MOD_QCOM_COMPRESSED;
+	}
+
+	/* Allocate new pipe resource. */
+	prsc = fd_resource_allocate_and_resolve(pscreen, tmpl, &modifiers, 1, &size);
+	if (!prsc)
+		return NULL;
+	rsc = fd_resource(prsc);
+
+	/* bo's size has to be large enough, otherwise cleanup resource and fail
+	 * gracefully.
+	 */
+	if (fd_bo_size(memobj->bo) < size) {
+		fd_resource_destroy(pscreen, prsc);
+		return NULL;
+	}
+
+	/* Share the bo with the memory object. */
+	rsc->bo = fd_bo_ref(memobj->bo);
+
+	return prsc;
+}
+
 static struct pipe_memory_object *
 fd_memobj_create_from_handle(struct pipe_screen *pscreen,
 							 struct winsys_handle *whandle,
@@ -1263,6 +1306,7 @@ fd_resource_screen_init(struct pipe_screen *pscreen)
 	/* GL_EXT_memory_object */
 	pscreen->memobj_create_from_handle = fd_memobj_create_from_handle;
 	pscreen->memobj_destroy = fd_memobj_destroy;
+	pscreen->resource_from_memobj = fd_resource_from_memobj;
 }
 
 static void



More information about the mesa-commit mailing list