X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fpanfrost%2Fpan_drm.c;h=4b8c197be0e5e2d0d1fe36364ae1430707c085dc;hb=b19d1a1e639cb7cce2eb4d0856317512aca6e01b;hp=0a7cf47c6a36ecd039cd260da56fb10cf960473d;hpb=b0f67c066fd470eb4b5cc403d7db7bfccbefc133;p=mesa.git diff --git a/src/gallium/drivers/panfrost/pan_drm.c b/src/gallium/drivers/panfrost/pan_drm.c index 0a7cf47c6a3..4b8c197be0e 100644 --- a/src/gallium/drivers/panfrost/pan_drm.c +++ b/src/gallium/drivers/panfrost/pan_drm.c @@ -206,7 +206,7 @@ panfrost_drm_submit_job(struct panfrost_context *ctx, u64 job_desc, int reqs, st struct panfrost_screen *screen = pan_screen(gallium->screen); struct panfrost_drm *drm = (struct panfrost_drm *)screen->driver; struct drm_panfrost_submit submit = {0,}; - int bo_handles[2]; + int bo_handles[7]; submit.in_syncs = (u64) (uintptr_t) &ctx->out_sync; submit.in_sync_count = 1; @@ -216,8 +216,6 @@ panfrost_drm_submit_job(struct panfrost_context *ctx, u64 job_desc, int reqs, st submit.jc = job_desc; submit.requirements = reqs; - /* TODO: We should be passing the transient data as a BO, so the kernel doesn't unmap while in use */ - if (surf) { struct panfrost_resource *res = pan_resource(surf->texture); assert(res->bo->gem_handle > 0); @@ -227,6 +225,14 @@ panfrost_drm_submit_job(struct panfrost_context *ctx, u64 job_desc, int reqs, st bo_handles[submit.bo_handle_count++] = res->bo->checksum_slab.gem_handle; } + /* TODO: Add here the transient pools */ + bo_handles[submit.bo_handle_count++] = ctx->shaders.gem_handle; + bo_handles[submit.bo_handle_count++] = ctx->scratchpad.gem_handle; + bo_handles[submit.bo_handle_count++] = ctx->tiler_heap.gem_handle; + bo_handles[submit.bo_handle_count++] = ctx->varying_mem.gem_handle; + bo_handles[submit.bo_handle_count++] = ctx->misc_0.gem_handle; + submit.bo_handles = (u64)bo_handles; + /* Dump memory _before_ submitting so we're not corrupted with actual GPU results */ pantrace_dump_memory(); @@ -290,6 +296,13 @@ panfrost_drm_force_flush_fragment(struct panfrost_context *ctx, struct pipe_fence_handle **fence) { struct pipe_context *gallium = (struct pipe_context *) ctx; + struct panfrost_screen *screen = pan_screen(gallium->screen); + struct panfrost_drm *drm = (struct panfrost_drm *)screen->driver; + + if (!screen->last_fragment_flushed) { + drmSyncobjWait(drm->fd, &ctx->out_sync, 1, INT64_MAX, 0, NULL); + screen->last_fragment_flushed = true; + } if (fence) { struct panfrost_fence *f = panfrost_fence_create(ctx);