diff options
author | Eric Anholt <eric@anholt.net> | 2007-12-12 10:25:19 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2007-12-12 11:52:10 -0800 |
commit | 7c71ef3a3d0cf2620525f468960cdc76a0fb0d33 (patch) | |
tree | 7b7e071b5c854bc5b737401990b54e488febf650 /src/mesa/drivers/dri/i965/intel_ioctl.c | |
parent | 00e10a1385bfd376f5f45ad94e3543ac87f15de8 (diff) |
[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.
Diffstat (limited to 'src/mesa/drivers/dri/i965/intel_ioctl.c')
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_ioctl.c | 26 |
1 files changed, 12 insertions, 14 deletions
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); |