<div dir="ltr"><div><br></div><div>Still playing with OpenSWR and I found some issues with glmark2 when running on a (OpenSWR originally intended) many core system.</div><div><br></div><div>glmark2 seems to enjoy creating and destroying GLX contexts without destroying the 'screen' and OpenSWR doesn't seem to have tested such scenarios.  The two related issues I found:</div><div><br></div><div>1) OpenSWR was hanging on fences after GLX context was destroyed because previous fence SYNC tasks were not completed.  The swr_destroy() function creates a couple of new fences (for the framebuffer I guess) and stops the threads before these fences corresponding SYNC tasks can complete.  As the fence is per screen, not per context, the new context get stucks at the first attempt to wait on a fence. [for glmark2 a workaround was to use the --reuse-context option]</div><div>2) OpenSWR was hanging when destroying the screen.  The swr_destroy_screen() waits on any pending fences, but if the context was already destroyed the threads are already dead too and because of 1) there may be pending fences that will never complete.  If the context is supposed to be destroyed before the screen destruction I'm not sure why there should be a fence there anyway.  [for glmark2 the workaround was to kill glmark2 by hand]</div><div><br></div><div>The patch below seems to solve it.  Make swr_destroy() wait for all fences before completing the destruction of the context.</div><div><br></div><div><div>diff --git a/src/gallium/drivers/swr/swr_context.cpp b/src/gallium/drivers/swr/swr_context.cpp</div><div>index 15e60cd..02c6db6 100644</div><div>--- a/src/gallium/drivers/swr/swr_context.cpp</div><div>+++ b/src/gallium/drivers/swr/swr_context.cpp</div><div>@@ -315,6 +315,8 @@ swr_destroy(struct pipe_context *pipe)</div><div>       pipe_sampler_view_reference(&ctx->sampler_views[PIPE_SHADER_VERTEX][i], NULL);</div><div>    }</div><div><br></div><div>+   swr_fence_finish(pipe->screen, NULL, screen->flush_fence, 0);</div><div>+</div><div>    if (ctx->swrContext)</div><div>       SwrDestroyContext(ctx->swrContext);</div></div><div><br></div><div>Victor</div></div>