diff options
author | Rob Clark <robclark@freedesktop.org> | 2014-02-19 11:01:23 -0500 |
---|---|---|
committer | Rob Clark <robclark@freedesktop.org> | 2014-02-19 11:47:40 -0500 |
commit | c5de5abbd90333fe1359283fb3a5e457b0f389f3 (patch) | |
tree | 20d6c72bfadcf60f82f5880c4b93eaf0c3c5c7ae /freedreno/msm | |
parent | 128e74cf6492025e63e035566bd6e2203e8da5e1 (diff) | |
download | libdrm-c5de5abbd90333fe1359283fb3a5e457b0f389f3.tar.gz libdrm-c5de5abbd90333fe1359283fb3a5e457b0f389f3.tar.bz2 libdrm-c5de5abbd90333fe1359283fb3a5e457b0f389f3.zip |
freedreno: some msm-ring reset/flush fixes
Need to update timestamp on all ring's associated with a submit (ie.
both the binning pass and main ring). Also, make sure nr_reloc's
in particular gets cleared if the rb is reset.
Signed-off-by: Rob Clark <robclark@freedesktop.org>
Diffstat (limited to 'freedreno/msm')
-rw-r--r-- | freedreno/msm/msm_ringbuffer.c | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/freedreno/msm/msm_ringbuffer.c b/freedreno/msm/msm_ringbuffer.c index f3e951f9..c9c92561 100644 --- a/freedreno/msm/msm_ringbuffer.c +++ b/freedreno/msm/msm_ringbuffer.c @@ -169,6 +169,22 @@ static uint32_t find_next_reloc_idx(struct msm_ringbuffer *msm_ring, return i; } +static void flush_reset(struct fd_ringbuffer *ring) +{ + struct msm_ringbuffer *msm_ring = to_msm_ringbuffer(ring); + unsigned i; + + /* for each of the cmd buffers, clear their reloc's: */ + for (i = 0; i < msm_ring->nr_cmds; i++) { + struct msm_ringbuffer *target_ring = to_msm_ringbuffer(msm_ring->rings[i]); + target_ring->nr_relocs = 0; + } + + msm_ring->nr_relocs = 0; + msm_ring->nr_cmds = 0; + msm_ring->nr_bos = 0; +} + static int msm_ringbuffer_flush(struct fd_ringbuffer *ring, uint32_t *last_start) { struct msm_ringbuffer *msm_ring = to_msm_ringbuffer(ring); @@ -205,8 +221,16 @@ static int msm_ringbuffer_flush(struct fd_ringbuffer *ring, uint32_t *last_start ret = drmCommandWriteRead(ring->pipe->dev->fd, DRM_MSM_GEM_SUBMIT, &req, sizeof(req)); - if (ret) + if (ret) { ERROR_MSG("submit failed: %d (%s)", ret, strerror(errno)); + } else { + /* update timestamp on all rings associated with submit: */ + for (i = 0; i < msm_ring->nr_cmds; i++) { + struct fd_ringbuffer *target_ring = msm_ring->rings[i]; + if (!ret) + target_ring->last_timestamp = req.fence; + } + } LIST_FOR_EACH_ENTRY_SAFE(msm_bo, tmp, &msm_ring->submit_list, list[id]) { struct list_head *list = &msm_bo->list[id]; @@ -215,18 +239,16 @@ static int msm_ringbuffer_flush(struct fd_ringbuffer *ring, uint32_t *last_start fd_bo_del(&msm_bo->base); } - /* for each of the cmd buffers, clear their reloc's: */ - for (i = 0; i < msm_ring->nr_cmds; i++) { - struct msm_ringbuffer *target_ring = to_msm_ringbuffer(msm_ring->rings[i]); - target_ring->nr_relocs = 0; - } - - msm_ring->nr_cmds = 0; - msm_ring->nr_bos = 0; + flush_reset(ring); return ret; } +static void msm_ringbuffer_reset(struct fd_ringbuffer *ring) +{ + flush_reset(ring); +} + static void msm_ringbuffer_emit_reloc(struct fd_ringbuffer *ring, const struct fd_reloc *r) { @@ -285,6 +307,7 @@ static void msm_ringbuffer_destroy(struct fd_ringbuffer *ring) static struct fd_ringbuffer_funcs funcs = { .hostptr = msm_ringbuffer_hostptr, .flush = msm_ringbuffer_flush, + .reset = msm_ringbuffer_reset, .emit_reloc = msm_ringbuffer_emit_reloc, .emit_reloc_ring = msm_ringbuffer_emit_reloc_ring, .destroy = msm_ringbuffer_destroy, |