Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Sat, Oct 19, 2013 at 12:09 PM, Christian König <deathsim...@vodafone.de> wrote: > From: Christian König <christian.koe...@amd.com> > > Using atomic function for ncs is superfluous since it is > protected by a mutex anyway. Also lock the mutex only once > while retrieving the next CS for submission. > > Signed-off-by: Christian König <christian.koe...@amd.com> > --- > src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 31 > ++++++++--------------- > 1 file changed, 10 insertions(+), 21 deletions(-) > > diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c > b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c > index 4f43093..f8aeb96 100644 > --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c > +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c > @@ -542,13 +542,12 @@ void radeon_drm_ws_queue_cs(struct radeon_drm_winsys > *ws, struct radeon_drm_cs * > { > retry: > pipe_mutex_lock(ws->cs_stack_lock); > - if (p_atomic_read(&ws->ncs) >= RING_LAST) { > + if (ws->ncs >= RING_LAST) { > /* no room left for a flush */ > pipe_mutex_unlock(ws->cs_stack_lock); > goto retry; > } > - ws->cs_stack[p_atomic_read(&ws->ncs)] = cs; > - p_atomic_inc(&ws->ncs); > + ws->cs_stack[ws->ncs++] = cs; > pipe_mutex_unlock(ws->cs_stack_lock); > pipe_semaphore_signal(&ws->cs_queued); > } > @@ -557,41 +556,31 @@ static PIPE_THREAD_ROUTINE(radeon_drm_cs_emit_ioctl, > param) > { > struct radeon_drm_winsys *ws = (struct radeon_drm_winsys *)param; > struct radeon_drm_cs *cs; > - unsigned i, empty_stack; > + unsigned i; > > while (1) { > pipe_semaphore_wait(&ws->cs_queued); > if (ws->kill_thread) > break; > -next: > + > pipe_mutex_lock(ws->cs_stack_lock); > cs = ws->cs_stack[0]; > + for (i = 1; i < ws->ncs; i++) > + ws->cs_stack[i - 1] = ws->cs_stack[i]; > + ws->cs_stack[--ws->ncs] = NULL; > pipe_mutex_unlock(ws->cs_stack_lock); > > if (cs) { > radeon_drm_cs_emit_ioctl_oneshot(cs, cs->cst); > - > - pipe_mutex_lock(ws->cs_stack_lock); > - for (i = 1; i < p_atomic_read(&ws->ncs); i++) { > - ws->cs_stack[i - 1] = ws->cs_stack[i]; > - } > - ws->cs_stack[p_atomic_read(&ws->ncs) - 1] = NULL; > - empty_stack = p_atomic_dec_zero(&ws->ncs); > - pipe_mutex_unlock(ws->cs_stack_lock); > - > pipe_semaphore_signal(&cs->flush_completed); > - > - if (!empty_stack) { > - goto next; > - } > } > } > pipe_mutex_lock(ws->cs_stack_lock); > - for (i = 0; i < p_atomic_read(&ws->ncs); i++) { > + for (i = 0; i < ws->ncs; i++) { > pipe_semaphore_signal(&ws->cs_stack[i]->flush_completed); > ws->cs_stack[i] = NULL; > } > - p_atomic_set(&ws->ncs, 0); > + ws->ncs = 0; > pipe_mutex_unlock(ws->cs_stack_lock); > return NULL; > } > @@ -655,7 +644,7 @@ struct radeon_winsys *radeon_drm_winsys_create(int fd) > pipe_mutex_init(ws->cmask_owner_mutex); > pipe_mutex_init(ws->cs_stack_lock); > > - p_atomic_set(&ws->ncs, 0); > + ws->ncs = 0; > pipe_semaphore_init(&ws->cs_queued, 0); > if (ws->num_cpus > 1 && debug_get_option_thread()) > ws->thread = pipe_thread_create(radeon_drm_cs_emit_ioctl, ws); > -- > 1.8.1.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev