Mesa (main): iris: Allow non-page-aligned userptr

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Apr 6 23:41:20 UTC 2022


Module: Mesa
Branch: main
Commit: 5fd2f462fb9bdf05dd2b2a7d0718e4f820458505
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5fd2f462fb9bdf05dd2b2a7d0718e4f820458505

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Wed Apr  6 14:22:23 2022 -0500

iris: Allow non-page-aligned userptr

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15779>

---

 src/gallium/drivers/iris/iris_resource.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c
index 9a111b9391d..ca93b82025e 100644
--- a/src/gallium/drivers/iris/iris_resource.c
+++ b/src/gallium/drivers/iris/iris_resource.c
@@ -1177,11 +1177,24 @@ iris_resource_from_user_memory(struct pipe_screen *pscreen,
 
    assert(templ->target == PIPE_BUFFER);
 
+   /* The userptr ioctl only works on whole pages.  Because we know that
+    * things will exist in memory at a page granularity, we can expand the
+    * range given by the client into the whole number of pages and use an
+    * offset on the resource to make it looks like it starts at the user's
+    * pointer.
+    */
+   size_t page_size = getpagesize();
+   assert(util_is_power_of_two_nonzero(page_size));
+   size_t offset = (uintptr_t)user_memory & (page_size - 1);
+   void *mem_start = (char *)user_memory - offset;
+   size_t mem_size = offset + templ->width0;
+   mem_size = ALIGN_NPOT(mem_size, page_size);
+
    res->internal_format = templ->format;
    res->base.is_user_ptr = true;
-   res->bo = iris_bo_create_userptr(bufmgr, "user",
-                                    user_memory, templ->width0,
+   res->bo = iris_bo_create_userptr(bufmgr, "user", mem_start, mem_size,
                                     IRIS_MEMZONE_OTHER);
+   res->offset = offset;
    if (!res->bo) {
       iris_resource_destroy(pscreen, &res->base.b);
       return NULL;



More information about the mesa-commit mailing list