v3d: Respect user-passed strides for BO imports.
authorEric Anholt <eric@anholt.net>
Thu, 1 Nov 2018 19:15:25 +0000 (12:15 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 1 Nov 2018 20:54:36 +0000 (13:54 -0700)
If the caller has passed in a stride for (linear) BO import, we should use
that stride when rendering to the BO (or, if we some day support texturing
from linear-imported BOs, when doing the linear-to-UIF shadow copy).  This
lets us remove the extra stride-changing relayout in the simulator.

src/gallium/drivers/v3d/v3d_bufmgr.c
src/gallium/drivers/v3d/v3d_bufmgr.h
src/gallium/drivers/v3d/v3d_context.h
src/gallium/drivers/v3d/v3d_resource.c
src/gallium/drivers/v3d/v3d_simulator.c

index d01b60e32235379be969da1274e4defecd1764d0..970c38e08fe643d2dd0be51033cc79ab34004c80 100644 (file)
@@ -331,7 +331,6 @@ v3d_bo_last_unreference_locked_timed(struct v3d_bo *bo, time_t time)
 
 static struct v3d_bo *
 v3d_bo_open_handle(struct v3d_screen *screen,
-                   uint32_t winsys_stride,
                    uint32_t handle, uint32_t size)
 {
         struct v3d_bo *bo;
@@ -355,8 +354,7 @@ v3d_bo_open_handle(struct v3d_screen *screen,
         bo->private = false;
 
 #ifdef USE_V3D_SIMULATOR
-        v3d_simulator_open_from_handle(screen->fd, winsys_stride,
-                                       bo->handle, bo->size);
+        v3d_simulator_open_from_handle(screen->fd, bo->handle, bo->size);
         bo->map = malloc(bo->size);
 #endif
 
@@ -382,8 +380,7 @@ done:
 }
 
 struct v3d_bo *
-v3d_bo_open_name(struct v3d_screen *screen, uint32_t name,
-                 uint32_t winsys_stride)
+v3d_bo_open_name(struct v3d_screen *screen, uint32_t name)
 {
         struct drm_gem_open o = {
                 .name = name
@@ -395,11 +392,11 @@ v3d_bo_open_name(struct v3d_screen *screen, uint32_t name,
                 return NULL;
         }
 
-        return v3d_bo_open_handle(screen, winsys_stride, o.handle, o.size);
+        return v3d_bo_open_handle(screen, o.handle, o.size);
 }
 
 struct v3d_bo *
-v3d_bo_open_dmabuf(struct v3d_screen *screen, int fd, uint32_t winsys_stride)
+v3d_bo_open_dmabuf(struct v3d_screen *screen, int fd)
 {
         uint32_t handle;
         int ret = drmPrimeFDToHandle(screen->fd, fd, &handle);
@@ -416,7 +413,7 @@ v3d_bo_open_dmabuf(struct v3d_screen *screen, int fd, uint32_t winsys_stride)
                 return NULL;
         }
 
-        return v3d_bo_open_handle(screen, winsys_stride, handle, size);
+        return v3d_bo_open_handle(screen, handle, size);
 }
 
 int
index 8fbde5ae9afdcf8ec97810d10d88b04c212d773d..48629c653560cac6e387e31b62c405012e17c363 100644 (file)
@@ -60,10 +60,8 @@ struct v3d_bo *v3d_bo_alloc(struct v3d_screen *screen, uint32_t size,
                             const char *name);
 void v3d_bo_last_unreference(struct v3d_bo *bo);
 void v3d_bo_last_unreference_locked_timed(struct v3d_bo *bo, time_t time);
-struct v3d_bo *v3d_bo_open_name(struct v3d_screen *screen, uint32_t name,
-                                uint32_t winsys_stride);
-struct v3d_bo *v3d_bo_open_dmabuf(struct v3d_screen *screen, int fd,
-                                  uint32_t winsys_stride);
+struct v3d_bo *v3d_bo_open_name(struct v3d_screen *screen, uint32_t name);
+struct v3d_bo *v3d_bo_open_dmabuf(struct v3d_screen *screen, int fd);
 bool v3d_bo_flink(struct v3d_bo *bo, uint32_t *name);
 int v3d_bo_get_dmabuf(struct v3d_bo *bo);
 
index 70643e000b087e867d7ca5aed0d11ad1f78f8dcd..8e44bbae9066d8f3a17abb37ab5568506fcb17fb 100644 (file)
@@ -480,8 +480,7 @@ int v3d_simulator_flush(struct v3d_context *v3d,
                         struct drm_v3d_submit_cl *args,
                         struct v3d_job *job);
 int v3d_simulator_ioctl(int fd, unsigned long request, void *arg);
-void v3d_simulator_open_from_handle(int fd, uint32_t winsys_stride,
-                                    int handle, uint32_t size);
+void v3d_simulator_open_from_handle(int fd, int handle, uint32_t size);
 
 static inline int
 v3d_ioctl(int fd, unsigned long request, void *arg)
index dd0db8cfd89fb54943acfa194ca2643b888e584c..b9c578b9cf54e223ab94968eb78e965b6c41587b 100644 (file)
@@ -396,7 +396,7 @@ v3d_get_ub_pad(struct v3d_resource *rsc, uint32_t height)
 }
 
 static void
-v3d_setup_slices(struct v3d_resource *rsc)
+v3d_setup_slices(struct v3d_resource *rsc, uint32_t winsys_stride)
 {
         struct pipe_resource *prsc = &rsc->base;
         uint32_t width = prsc->width0;
@@ -498,7 +498,10 @@ v3d_setup_slices(struct v3d_resource *rsc)
                 }
 
                 slice->offset = offset;
-                slice->stride = level_width * rsc->cpp;
+                if (winsys_stride)
+                        slice->stride = winsys_stride;
+                else
+                        slice->stride = level_width * rsc->cpp;
                 slice->padded_height = level_height;
                 slice->size = level_height * slice->stride;
 
@@ -674,7 +677,7 @@ v3d_resource_create_with_modifiers(struct pipe_screen *pscreen,
 
         rsc->internal_format = prsc->format;
 
-        v3d_setup_slices(rsc);
+        v3d_setup_slices(rsc, 0);
         if (!v3d_resource_bo_alloc(rsc))
                 goto fail;
 
@@ -730,12 +733,10 @@ v3d_resource_from_handle(struct pipe_screen *pscreen,
 
         switch (whandle->type) {
         case WINSYS_HANDLE_TYPE_SHARED:
-                rsc->bo = v3d_bo_open_name(screen,
-                                           whandle->handle, whandle->stride);
+                rsc->bo = v3d_bo_open_name(screen, whandle->handle);
                 break;
         case WINSYS_HANDLE_TYPE_FD:
-                rsc->bo = v3d_bo_open_dmabuf(screen,
-                                             whandle->handle, whandle->stride);
+                rsc->bo = v3d_bo_open_dmabuf(screen, whandle->handle);
                 break;
         default:
                 fprintf(stderr,
@@ -749,7 +750,7 @@ v3d_resource_from_handle(struct pipe_screen *pscreen,
 
         rsc->internal_format = prsc->format;
 
-        v3d_setup_slices(rsc);
+        v3d_setup_slices(rsc, whandle->stride);
         v3d_debug_resource_layout(rsc, "import");
 
         if (whandle->stride != slice->stride) {
index e73cc6443a3dfd267b04c092d98c29c37d6a2ce9..a9ff0f4a91cb2d38ac6f394156d45f517caddb62 100644 (file)
@@ -104,9 +104,6 @@ struct v3d_simulator_bo {
         uint32_t size;
         void *vaddr;
 
-        void *winsys_map;
-        uint32_t winsys_stride;
-
         int handle;
 };
 
@@ -200,9 +197,6 @@ v3d_free_simulator_bo(struct v3d_simulator_bo *sim_bo)
 {
         struct v3d_simulator_file *sim_file = sim_bo->file;
 
-        if (sim_bo->winsys_map)
-                munmap(sim_bo->winsys_map, sim_bo->size);
-
         set_gmp_flags(sim_file, sim_bo->block->ofs, sim_bo->size, 0x0);
 
         mtx_lock(&sim_state.mutex);
@@ -274,30 +268,8 @@ v3d_simulator_flush(struct v3d_context *v3d,
         struct v3d_screen *screen = v3d->screen;
         int fd = screen->fd;
         struct v3d_simulator_file *file = v3d_get_simulator_file_for_fd(fd);
-        struct v3d_surface *csurf = v3d_surface(v3d->framebuffer.cbufs[0]);
-        struct v3d_resource *ctex = csurf ? v3d_resource(csurf->base.texture) : NULL;
-        struct v3d_simulator_bo *csim_bo = ctex ? v3d_get_simulator_bo(file, ctex->bo->handle) : NULL;
-        uint32_t winsys_stride = ctex ? csim_bo->winsys_stride : 0;
-        uint32_t sim_stride = ctex ? ctex->slices[0].stride : 0;
-        uint32_t row_len = MIN2(sim_stride, winsys_stride);
         int ret;
 
-        if (ctex && csim_bo->winsys_map) {
-#if 0
-                fprintf(stderr, "%dx%d %d %d %d\n",
-                        ctex->base.b.width0, ctex->base.b.height0,
-                        winsys_stride,
-                        sim_stride,
-                        ctex->bo->size);
-#endif
-
-                for (int y = 0; y < ctex->base.height0; y++) {
-                        memcpy(ctex->bo->map + y * sim_stride,
-                               csim_bo->winsys_map + y * winsys_stride,
-                               row_len);
-                }
-        }
-
         ret = v3d_simulator_pin_bos(fd, job);
         if (ret)
                 return ret;
@@ -311,48 +283,9 @@ v3d_simulator_flush(struct v3d_context *v3d,
         if (ret)
                 return ret;
 
-        if (ctex && csim_bo->winsys_map) {
-                for (int y = 0; y < ctex->base.height0; y++) {
-                        memcpy(csim_bo->winsys_map + y * winsys_stride,
-                               ctex->bo->map + y * sim_stride,
-                               row_len);
-                }
-        }
-
         return 0;
 }
 
-/**
- * Map the underlying GEM object from the real hardware GEM handle.
- */
-static void *
-v3d_simulator_map_winsys_bo(int fd, struct v3d_simulator_bo *sim_bo)
-{
-        int ret;
-        void *map;
-
-        struct drm_mode_map_dumb map_dumb = {
-                .handle = sim_bo->handle,
-        };
-        ret = drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &map_dumb);
-        if (ret != 0) {
-                fprintf(stderr, "map ioctl failure\n");
-                abort();
-        }
-
-        map = mmap(NULL, sim_bo->size, PROT_READ | PROT_WRITE, MAP_SHARED,
-                   fd, map_dumb.offset);
-        if (map == MAP_FAILED) {
-                fprintf(stderr,
-                        "mmap of bo %d (offset 0x%016llx, size %d) failed\n",
-                        sim_bo->handle, (long long)map_dumb.offset,
-                        (int)sim_bo->size);
-                abort();
-        }
-
-        return map;
-}
-
 /**
  * Do fixups after a BO has been opened from a handle.
  *
@@ -360,14 +293,9 @@ v3d_simulator_map_winsys_bo(int fd, struct v3d_simulator_bo *sim_bo)
  * time, but we're still using drmPrimeFDToHandle() so we have this helper to
  * be called afterward instead.
  */
-void v3d_simulator_open_from_handle(int fd, uint32_t winsys_stride,
-                                    int handle, uint32_t size)
+void v3d_simulator_open_from_handle(int fd, int handle, uint32_t size)
 {
-        struct v3d_simulator_bo *sim_bo =
-                v3d_create_simulator_bo(fd, handle, size);
-
-        sim_bo->winsys_stride = winsys_stride;
-        sim_bo->winsys_map = v3d_simulator_map_winsys_bo(fd, sim_bo);
+        v3d_create_simulator_bo(fd, handle, size);
 }
 
 /**