From 7c71ef3a3d0cf2620525f468960cdc76a0fb0d33 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 12 Dec 2007 10:25:19 -0800 Subject: [intel] Move bufmgr back to context instead of screen, fixing glthreads. Putting the bufmgr in the screen is not thread-safe since the emit_reloc changes. It also led to a significant performance hit from pthread usage for the attempted thread-safety (up to 12% of a cpu spent on refcounting protection in single-threaded 965). The motivation had been to allow multi-context bufmgr sharing in classic mode, but it wasn't worth the cost. --- src/mesa/drivers/dri/i965/intel_ioctl.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) (limited to 'src/mesa/drivers/dri/i965/intel_ioctl.c') diff --git a/src/mesa/drivers/dri/i965/intel_ioctl.c b/src/mesa/drivers/dri/i965/intel_ioctl.c index 50ad4e4f1f..91677c0c52 100644 --- a/src/mesa/drivers/dri/i965/intel_ioctl.c +++ b/src/mesa/drivers/dri/i965/intel_ioctl.c @@ -52,15 +52,15 @@ static void intelWaitIdleLocked( struct intel_context *intel ) if (INTEL_DEBUG & DEBUG_SYNC) fprintf(stderr, "waiting for idle\n"); - fence = intelEmitIrqLocked(intel->intelScreen); - intelWaitIrq(intel->intelScreen, fence); + fence = intelEmitIrqLocked(intel); + intelWaitIrq(intel, fence); } -int intelEmitIrqLocked( intelScreenPrivate *intelScreen ) +int intelEmitIrqLocked( struct intel_context *intel ) { int seq = 1; - if (!intelScreen->no_hw) { + if (!intel->no_hw) { drmI830IrqEmit ie; int ret; /* @@ -69,7 +69,7 @@ int intelEmitIrqLocked( intelScreenPrivate *intelScreen ) */ ie.irq_seq = &seq; - ret = drmCommandWriteRead( intelScreen->driScrnPriv->fd, + ret = drmCommandWriteRead( intel->driFd, DRM_I830_IRQ_EMIT, &ie, sizeof(ie) ); if ( ret ) { @@ -84,14 +84,12 @@ int intelEmitIrqLocked( intelScreenPrivate *intelScreen ) return seq; } -void intelWaitIrq( intelScreenPrivate *intelScreen, int seq ) +void intelWaitIrq( struct intel_context *intel, int seq ) { - if (!intelScreen->no_hw) { + if (!intel->no_hw) { drmI830IrqWait iw; int ret, lastdispatch; - volatile drmI830Sarea *sarea = (volatile drmI830Sarea *) - (((GLubyte *)intelScreen->driScrnPriv->pSAREA) + - intelScreen->sarea_priv_offset); + volatile drmI830Sarea *sarea = intel->sarea; if (0) fprintf(stderr, "%s %d\n", __FUNCTION__, seq ); @@ -100,7 +98,7 @@ void intelWaitIrq( intelScreenPrivate *intelScreen, int seq ) do { lastdispatch = sarea->last_dispatch; - ret = drmCommandWrite( intelScreen->driScrnPriv->fd, + ret = drmCommandWrite( intel->driFd, DRM_I830_IRQ_WAIT, &iw, sizeof(iw) ); /* This seems quite often to return before it should!?! @@ -151,7 +149,7 @@ void intel_batch_ioctl( struct intel_context *intel, batch.start, batch.start + batch.used * 4); - if (!intel->intelScreen->no_hw) { + if (!intel->no_hw) { if (drmCommandWrite (intel->driFd, DRM_I830_BATCHBUFFER, &batch, sizeof(batch))) { fprintf(stderr, "DRM_I830_BATCHBUFFER: %d\n", -errno); @@ -190,7 +188,7 @@ intel_exec_ioctl(struct intel_context *intel, execbuf.ops_list = (unsigned)start; // TODO execbuf.fence_arg.flags = DRM_FENCE_FLAG_SHAREABLE | DRM_I915_FENCE_FLAG_FLUSHED; - if (intel->intelScreen->no_hw) + if (intel->no_hw) return; if (drmCommandWriteRead(intel->driFd, DRM_I915_EXECBUFFER, &execbuf, @@ -201,7 +199,7 @@ intel_exec_ioctl(struct intel_context *intel, } - fo = intel_ttm_fence_create_from_arg(intel->intelScreen->bufmgr, "fence buffers", + fo = intel_ttm_fence_create_from_arg(intel->bufmgr, "fence buffers", &execbuf.fence_arg); if (!fo) { fprintf(stderr, "failed to fence handle: %08x\n", execbuf.fence_arg.handle); -- cgit v1.2.3