From: Eric Anholt Date: Thu, 1 Nov 2018 21:34:02 +0000 (-0700) Subject: vc4: Drop the winsys_stride relayout in the simluator X-Git-Tag: upstream/19.0.0~1791 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=43a397c5804987a564e0f154c34018d512d58116;p=platform%2Fupstream%2Fmesa.git vc4: Drop the winsys_stride relayout in the simluator Since 0c1dd9dee0da ("broadcom/vc4: Allow importing linear BOs with arbitrary offset/stride."), we have the vc4-side BO properly laid out (assuming it's linear) in the winsys BO so that we can skip this extra copy. --- diff --git a/src/gallium/drivers/vc4/vc4_bufmgr.c b/src/gallium/drivers/vc4/vc4_bufmgr.c index 54f9d9c..716ca50 100644 --- a/src/gallium/drivers/vc4/vc4_bufmgr.c +++ b/src/gallium/drivers/vc4/vc4_bufmgr.c @@ -386,7 +386,6 @@ vc4_bo_last_unreference_locked_timed(struct vc4_bo *bo, time_t time) static struct vc4_bo * vc4_bo_open_handle(struct vc4_screen *screen, - uint32_t winsys_stride, uint32_t handle, uint32_t size) { struct vc4_bo *bo; @@ -410,8 +409,7 @@ vc4_bo_open_handle(struct vc4_screen *screen, bo->private = false; #ifdef USE_VC4_SIMULATOR - vc4_simulator_open_from_handle(screen->fd, winsys_stride, - bo->handle, bo->size); + vc4_simulator_open_from_handle(screen->fd, bo->handle, bo->size); bo->map = malloc(bo->size); #endif @@ -423,8 +421,7 @@ done: } struct vc4_bo * -vc4_bo_open_name(struct vc4_screen *screen, uint32_t name, - uint32_t winsys_stride) +vc4_bo_open_name(struct vc4_screen *screen, uint32_t name) { struct drm_gem_open o = { .name = name @@ -436,11 +433,11 @@ vc4_bo_open_name(struct vc4_screen *screen, uint32_t name, return NULL; } - return vc4_bo_open_handle(screen, winsys_stride, o.handle, o.size); + return vc4_bo_open_handle(screen, o.handle, o.size); } struct vc4_bo * -vc4_bo_open_dmabuf(struct vc4_screen *screen, int fd, uint32_t winsys_stride) +vc4_bo_open_dmabuf(struct vc4_screen *screen, int fd) { uint32_t handle; int ret = drmPrimeFDToHandle(screen->fd, fd, &handle); @@ -457,7 +454,7 @@ vc4_bo_open_dmabuf(struct vc4_screen *screen, int fd, uint32_t winsys_stride) return NULL; } - return vc4_bo_open_handle(screen, winsys_stride, handle, size); + return vc4_bo_open_handle(screen, handle, size); } int diff --git a/src/gallium/drivers/vc4/vc4_bufmgr.h b/src/gallium/drivers/vc4/vc4_bufmgr.h index 9fa4774..30a388e 100644 --- a/src/gallium/drivers/vc4/vc4_bufmgr.h +++ b/src/gallium/drivers/vc4/vc4_bufmgr.h @@ -66,10 +66,8 @@ struct vc4_bo *vc4_bo_alloc_shader(struct vc4_screen *screen, const void *data, uint32_t size); void vc4_bo_last_unreference(struct vc4_bo *bo); void vc4_bo_last_unreference_locked_timed(struct vc4_bo *bo, time_t time); -struct vc4_bo *vc4_bo_open_name(struct vc4_screen *screen, uint32_t name, - uint32_t winsys_stride); -struct vc4_bo *vc4_bo_open_dmabuf(struct vc4_screen *screen, int fd, - uint32_t winsys_stride); +struct vc4_bo *vc4_bo_open_name(struct vc4_screen *screen, uint32_t name); +struct vc4_bo *vc4_bo_open_dmabuf(struct vc4_screen *screen, int fd); bool vc4_bo_flink(struct vc4_bo *bo, uint32_t *name); int vc4_bo_get_dmabuf(struct vc4_bo *bo); diff --git a/src/gallium/drivers/vc4/vc4_context.h b/src/gallium/drivers/vc4/vc4_context.h index ce8bcff..3f1dac3 100644 --- a/src/gallium/drivers/vc4/vc4_context.h +++ b/src/gallium/drivers/vc4/vc4_context.h @@ -490,8 +490,7 @@ int vc4_simulator_flush(struct vc4_context *vc4, struct drm_vc4_submit_cl *args, struct vc4_job *job); int vc4_simulator_ioctl(int fd, unsigned long request, void *arg); -void vc4_simulator_open_from_handle(int fd, uint32_t winsys_stride, - int handle, uint32_t size); +void vc4_simulator_open_from_handle(int fd, int handle, uint32_t size); static inline int vc4_ioctl(int fd, unsigned long request, void *arg) diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c index 94784bb..351eb8c 100644 --- a/src/gallium/drivers/vc4/vc4_resource.c +++ b/src/gallium/drivers/vc4/vc4_resource.c @@ -614,12 +614,10 @@ vc4_resource_from_handle(struct pipe_screen *pscreen, switch (whandle->type) { case WINSYS_HANDLE_TYPE_SHARED: - rsc->bo = vc4_bo_open_name(screen, - whandle->handle, whandle->stride); + rsc->bo = vc4_bo_open_name(screen, whandle->handle); break; case WINSYS_HANDLE_TYPE_FD: - rsc->bo = vc4_bo_open_dmabuf(screen, - whandle->handle, whandle->stride); + rsc->bo = vc4_bo_open_dmabuf(screen, whandle->handle); break; default: fprintf(stderr, diff --git a/src/gallium/drivers/vc4/vc4_simulator.c b/src/gallium/drivers/vc4/vc4_simulator.c index 37c098a..71ac664 100644 --- a/src/gallium/drivers/vc4/vc4_simulator.c +++ b/src/gallium/drivers/vc4/vc4_simulator.c @@ -99,8 +99,6 @@ struct vc4_simulator_bo { /** Area for this BO within sim_state->mem */ struct mem_block *block; - void *winsys_map; - uint32_t winsys_stride; int handle; }; @@ -171,11 +169,6 @@ static void vc4_free_simulator_bo(struct vc4_simulator_bo *sim_bo) { struct vc4_simulator_file *sim_file = sim_bo->file; - struct drm_vc4_bo *bo = &sim_bo->base; - struct drm_gem_cma_object *obj = &bo->base; - - if (sim_bo->winsys_map) - munmap(sim_bo->winsys_map, obj->base.size); mtx_lock(&sim_state.mutex); u_mmFreeMem(sim_bo->block); @@ -366,12 +359,6 @@ vc4_simulator_flush(struct vc4_context *vc4, struct vc4_screen *screen = vc4->screen; int fd = screen->fd; struct vc4_simulator_file *file = vc4_get_simulator_file_for_fd(fd); - struct vc4_surface *csurf = vc4_surface(vc4->framebuffer.cbufs[0]); - struct vc4_resource *ctex = csurf ? vc4_resource(csurf->base.texture) : NULL; - struct vc4_simulator_bo *csim_bo = ctex ? vc4_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); struct vc4_exec_info exec; struct drm_device *dev = &file->dev; int ret; @@ -379,22 +366,6 @@ vc4_simulator_flush(struct vc4_context *vc4, memset(&exec, 0, sizeof(exec)); list_inithead(&exec.unref_list); - 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); - } - } - exec.args = args; ret = vc4_simulator_pin_bos(dev, job, &exec); @@ -448,65 +419,19 @@ vc4_simulator_flush(struct vc4_context *vc4, vc4_free_simulator_bo(sim_bo); } - 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 * -vc4_simulator_map_winsys_bo(int fd, struct vc4_simulator_bo *sim_bo) -{ - struct drm_vc4_bo *bo = &sim_bo->base; - struct drm_gem_cma_object *obj = &bo->base; - 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, obj->base.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)obj->base.size); - abort(); - } - - return map; -} - -/** * Do fixups after a BO has been opened from a handle. * * This could be done at DRM_IOCTL_GEM_OPEN/DRM_IOCTL_GEM_PRIME_FD_TO_HANDLE * time, but we're still using drmPrimeFDToHandle() so we have this helper to * be called afterward instead. */ -void vc4_simulator_open_from_handle(int fd, uint32_t winsys_stride, - int handle, uint32_t size) +void vc4_simulator_open_from_handle(int fd, int handle, uint32_t size) { - struct vc4_simulator_bo *sim_bo = - vc4_create_simulator_bo(fd, handle, size); - - sim_bo->winsys_stride = winsys_stride; - sim_bo->winsys_map = vc4_simulator_map_winsys_bo(fd, sim_bo); + vc4_create_simulator_bo(fd, handle, size); } /**