Commit 43a397c5 authored by Eric Anholt's avatar Eric Anholt

vc4: Drop the winsys_stride relayout in the simluator

Since 0c1dd9de ("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.
parent 4e1b163e
......@@ -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
......
......@@ -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);
......
......@@ -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)
......
......@@ -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,
......
......@@ -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,50 +419,9 @@ 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.
*
......@@ -499,14 +429,9 @@ vc4_simulator_map_winsys_bo(int fd, struct vc4_simulator_bo *sim_bo)
* 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);
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment