Hi Axel, EVE Online is no longer crashing for me with these patches. Thanks!
Tested-by: James Harvey <lothmor...@gmail.com> On 03/15/2017 02:56 PM, Axel Davy wrote: > Surfaces and Volumes can be freed in the worker thread. > > This fixes these dtor. > Especially if they were freed by nine_context_box_upload, > the counter was decremented after the destructions, which > lead to deadlock. > > Fixes bugzilla 99246. > > CC: "17.0" <mesa-sta...@lists.freedesktop.org> > Signed-off-by: Axel Davy <axel.d...@ens.fr> > --- > src/gallium/state_trackers/nine/nine_csmt_helper.h | 2 +- > src/gallium/state_trackers/nine/surface9.c | 10 ++++++++-- > src/gallium/state_trackers/nine/volume9.c | 10 ++++++++-- > 3 files changed, 17 insertions(+), 5 deletions(-) > > diff --git a/src/gallium/state_trackers/nine/nine_csmt_helper.h > b/src/gallium/state_trackers/nine/nine_csmt_helper.h > index b0bbc054fc..dc46bbd3a2 100644 > --- a/src/gallium/state_trackers/nine/nine_csmt_helper.h > +++ b/src/gallium/state_trackers/nine/nine_csmt_helper.h > @@ -233,8 +233,8 @@ name##_rx( struct NineDevice9 *device, struct > csmt_instruction *instr ) \ > name##_priv( \ > device ARGS_FOR_CALL( __VA_ARGS__ ) \ > ); \ > - ARGS_FOR_UNBIND( __VA_ARGS__ ) \ > p_atomic_dec(args->counter); \ > + ARGS_FOR_UNBIND( __VA_ARGS__ ) \ > return 0; \ > } \ > \ > diff --git a/src/gallium/state_trackers/nine/surface9.c > b/src/gallium/state_trackers/nine/surface9.c > index 836369cafd..d917fa1f86 100644 > --- a/src/gallium/state_trackers/nine/surface9.c > +++ b/src/gallium/state_trackers/nine/surface9.c > @@ -204,9 +204,15 @@ NineSurface9_dtor( struct NineSurface9 *This ) > { > DBG("This=%p\n", This); > > - if (This->transfer) > - NineSurface9_UnlockRect(This); > + if (This->transfer) { > + struct pipe_context *pipe = > nine_context_get_pipe_multithread(This->base.base.device); > + pipe->transfer_unmap(pipe, This->transfer); > + This->transfer = NULL; > + } > > + /* Note: Following condition cannot happen currently, since we > + * refcount the surface in the functions increasing > + * pending_uploads_counter. */ > if (p_atomic_read(&This->pending_uploads_counter)) > nine_csmt_process(This->base.base.device); > > diff --git a/src/gallium/state_trackers/nine/volume9.c > b/src/gallium/state_trackers/nine/volume9.c > index 11236a02e7..62af3e6225 100644 > --- a/src/gallium/state_trackers/nine/volume9.c > +++ b/src/gallium/state_trackers/nine/volume9.c > @@ -142,9 +142,15 @@ NineVolume9_dtor( struct NineVolume9 *This ) > { > DBG("This=%p\n", This); > > - if (This->transfer) > - NineVolume9_UnlockBox(This); > + if (This->transfer) { > + struct pipe_context *pipe = > nine_context_get_pipe_multithread(This->base.device); > + pipe->transfer_unmap(pipe, This->transfer); > + This->transfer = NULL; > + } > > + /* Note: Following condition cannot happen currently, since we > + * refcount the volume in the functions increasing > + * pending_uploads_counter. */ > if (p_atomic_read(&This->pending_uploads_counter)) > nine_csmt_process(This->base.device); > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev