diff options
author | Keith Whitwell <keith@tungstengraphics.com> | 2006-02-01 15:54:42 +0000 |
---|---|---|
committer | Keith Whitwell <keith@tungstengraphics.com> | 2006-02-01 15:54:42 +0000 |
commit | a97a1439aec0dd8ad4b5c45ed6de760fa77c83fa (patch) | |
tree | c1429fd4abc19d055046866ed38191c39155c418 | |
parent | 2fd2910010f44785a34609f37cbb8b757a2e2ced (diff) |
Get batchbuffers working natively again. This code still
relies over-heavily on the DRI lock to protect offsets in the
command stream from changing before being queued on the ring,
and should be viewed as being a pretty temporary mechanism
before a more robust alternative is implemented, most likely
based on a batchbuffer relocation list that will be used
to patch prebuilt batchbuffers after validation takes place.
-rw-r--r-- | src/mesa/drivers/dri/i915/Makefile | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/bufmgr.h | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/bufmgr_fake.c | 20 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/i830_metaops.c | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/i915_context.c | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/i915_context.h | 1 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/i915_vtbl.c | 5 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_batchbuffer.c | 112 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_batchbuffer.h | 9 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_blit.c | 0 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_context.c | 11 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_context.h | 16 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_ioctl.h | 5 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_pixel.c | 25 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_screen.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_state.c | 7 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_tex.h | 8 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_tex_copy.c | 20 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i915/intel_tris.c | 44 |
19 files changed, 173 insertions, 123 deletions
diff --git a/src/mesa/drivers/dri/i915/Makefile b/src/mesa/drivers/dri/i915/Makefile index 132794d798c..d113619e9f9 100644 --- a/src/mesa/drivers/dri/i915/Makefile +++ b/src/mesa/drivers/dri/i915/Makefile @@ -29,7 +29,6 @@ DRIVER_SOURCES = \ intel_context.c \ intel_ioctl.c \ intel_pixel.c \ - intel_render.c \ intel_screen.c \ intel_span.c \ intel_state.c \ @@ -37,6 +36,7 @@ DRIVER_SOURCES = \ DISABLED = \ + intel_render.c \ i830_context.c \ i830_metaops.c \ i830_state.c \ diff --git a/src/mesa/drivers/dri/i915/bufmgr.h b/src/mesa/drivers/dri/i915/bufmgr.h index e435b9d975f..3761a82b598 100644 --- a/src/mesa/drivers/dri/i915/bufmgr.h +++ b/src/mesa/drivers/dri/i915/bufmgr.h @@ -137,7 +137,7 @@ int bmValidateBufferList( struct bufmgr *, struct bm_buffer_list *, unsigned flags ); -void bmFenceBufferList( struct bufmgr *, +unsigned bmFenceBufferList( struct bufmgr *, struct bm_buffer_list * ); void bmFreeBufferList( struct bm_buffer_list * ); diff --git a/src/mesa/drivers/dri/i915/bufmgr_fake.c b/src/mesa/drivers/dri/i915/bufmgr_fake.c index 7a2fec8bf42..d08a642a545 100644 --- a/src/mesa/drivers/dri/i915/bufmgr_fake.c +++ b/src/mesa/drivers/dri/i915/bufmgr_fake.c @@ -166,6 +166,7 @@ static int bmAllocMem( struct bufmgr *bm, if (buf->block) buf->block->buf = buf; + assert(buf->block); return buf->block != NULL; } @@ -255,6 +256,8 @@ static int move_buffers( struct bufmgr *bm, if (flags & BM_NO_UPLOAD) goto cleanup; + assert(!buffers[i]->mapped); + DBG("try to move buffer %d size 0x%x to pools 0x%x\n", buffers[i]->id, buffers[i]->size, flags & BM_MEM_MASK); @@ -308,7 +311,7 @@ static int move_buffers( struct bufmgr *bm, free_block(bm, newMem[i]); } - DBG("%s - fail\n", __FUNCTION__); + _mesa_printf("%s - fail\n", __FUNCTION__); return 0; } @@ -538,6 +541,8 @@ void bmBufferData(struct bufmgr *bm, DBG("bmBufferData %d sz 0x%x data: %p\n", buffer, size, data); + assert(!buf->mapped); + if (buf->block) { if ((buf->block->mem_type != BM_MEM_LOCAL && !bmTestFence(bm, buf->block->fence)) || (buf->size && buf->size != size) || @@ -699,6 +704,7 @@ int bmValidateBufferList( struct bufmgr *bm, if (!delayed_free(bm) && !evict_lru(bm, flags)) return 0; + exit(1); } @@ -706,7 +712,8 @@ int bmValidateBufferList( struct bufmgr *bm, DBG("%d: buf %d ofs 0x%x\n", i, bufs[i]->id, bufs[i]->block->mem->ofs); - list->elem[i].offset_return[0] = bufs[i]->block->mem->ofs; + if (list->elem[i].offset_return) + list->elem[i].offset_return[0] = bufs[i]->block->mem->ofs; if (list->elem[i].memtype_return) list->elem[i].memtype_return[0] = bufs[i]->block->mem_type; @@ -724,7 +731,7 @@ int bmValidateBufferList( struct bufmgr *bm, * The buffer manager knows how to emit and test fences directly * through the drm and without callbacks or whatever into the driver. */ -void bmFenceBufferList( struct bufmgr *bm, struct bm_buffer_list *list ) +unsigned bmFenceBufferList( struct bufmgr *bm, struct bm_buffer_list *list ) { DBG("%s (%d bufs)\n", __FUNCTION__, list->nr); @@ -741,7 +748,11 @@ void bmFenceBufferList( struct bufmgr *bm, struct bm_buffer_list *list ) move_to_head(&buf->block->pool->lru, buf->block); buf->block->fence = fence; } + + return fence; } + else + return 0; } @@ -761,6 +772,9 @@ unsigned bmSetFence( struct bufmgr *bm ) int bmTestFence( struct bufmgr *bm, unsigned fence ) { +/* if (fence % 1024 == 0) */ +/* _mesa_printf("%d %d\n", fence, bm->intel->sarea->last_dispatch); */ + return fence <= bm->intel->sarea->last_dispatch; } diff --git a/src/mesa/drivers/dri/i915/i830_metaops.c b/src/mesa/drivers/dri/i915/i830_metaops.c index 50511bfa7fd..8984b6c6ecd 100644 --- a/src/mesa/drivers/dri/i915/i830_metaops.c +++ b/src/mesa/drivers/dri/i915/i830_metaops.c @@ -442,7 +442,7 @@ i830TryTextureReadPixels( GLcontext *ctx, int textureFormat; GLenum glTextureFormat; int src_offset = i830->meta.Buffer[I830_DESTREG_CBUFADDR2]; - int destOffset = intelAgpOffsetFromVirtual( &i830->intel, pixels); + int destOffset = 0; int destFormat, depthFormat, destPitch; drm_clip_rect_t tmp; @@ -596,7 +596,7 @@ i830TryTextureDrawPixels( GLcontext *ctx, int textureFormat; GLenum glTextureFormat; int dst_offset = i830->meta.Buffer[I830_DESTREG_CBUFADDR2]; - int src_offset = intelAgpOffsetFromVirtual( intel, pixels ); + int src_offset = 0; if (INTEL_DEBUG & DEBUG_PIXEL) fprintf(stderr, "%s\n", __FUNCTION__); diff --git a/src/mesa/drivers/dri/i915/i915_context.c b/src/mesa/drivers/dri/i915/i915_context.c index 1d1e922e73e..ea54b673d2d 100644 --- a/src/mesa/drivers/dri/i915/i915_context.c +++ b/src/mesa/drivers/dri/i915/i915_context.c @@ -109,7 +109,7 @@ GLboolean i915CreateContext( const __GLcontextModes *mesaVis, if (!i915) return GL_FALSE; - _mesa_printf( "\ntexmem branch\n\n"); + _mesa_printf( "\ntexmem branch (i915)\n\n"); i915InitVtbl( i915 ); @@ -167,6 +167,7 @@ GLboolean i915CreateContext( const __GLcontextModes *mesaVis, intelScreen->depth.pitch, intelScreen->height); + intelInitBatchBuffer(intel); /* Advertise the full hardware capabilities. The new memory * manager should cope much better with overload situations: diff --git a/src/mesa/drivers/dri/i915/i915_context.h b/src/mesa/drivers/dri/i915/i915_context.h index 6d9c4ea6ce8..0db119cd413 100644 --- a/src/mesa/drivers/dri/i915/i915_context.h +++ b/src/mesa/drivers/dri/i915/i915_context.h @@ -43,6 +43,7 @@ #define I915_UPLOAD_PROGRAM 0x8 #define I915_UPLOAD_CONSTANTS 0x10 #define I915_UPLOAD_FOG 0x20 +#define I915_UPLOAD_INVARIENT 0x40 #define I915_UPLOAD_TEX(i) (0x00010000<<(i)) #define I915_UPLOAD_TEX_ALL (0x00ff0000) #define I915_UPLOAD_TEX_0_SHIFT 16 diff --git a/src/mesa/drivers/dri/i915/i915_vtbl.c b/src/mesa/drivers/dri/i915/i915_vtbl.c index 39156122974..4f4792c0eed 100644 --- a/src/mesa/drivers/dri/i915/i915_vtbl.c +++ b/src/mesa/drivers/dri/i915/i915_vtbl.c @@ -237,6 +237,11 @@ static void i915_emit_state( intelContextPtr intel ) if (VERBOSE) fprintf(stderr, "%s dirty: %x\n", __FUNCTION__, dirty); + if (dirty & I915_UPLOAD_INVARIENT) { + if (VERBOSE) fprintf(stderr, "I915_UPLOAD_INVARIENT:\n"); + i915_emit_invarient_state( intel ); + } + if (dirty & I915_UPLOAD_CTX) { if (VERBOSE) fprintf(stderr, "I915_UPLOAD_CTX:\n"); emit( i915, state->Ctx, sizeof(state->Ctx) ); diff --git a/src/mesa/drivers/dri/i915/intel_batchbuffer.c b/src/mesa/drivers/dri/i915/intel_batchbuffer.c index e8e61f49c13..6f54fdb1c5a 100644 --- a/src/mesa/drivers/dri/i915/intel_batchbuffer.c +++ b/src/mesa/drivers/dri/i915/intel_batchbuffer.c @@ -37,6 +37,7 @@ #include "intel_batchbuffer.h" #include "intel_context.h" +#include "bufmgr.h" @@ -59,6 +60,9 @@ void intelCopyBuffer( const __DRIdrawablePrivate *dPriv ) intelFlush( &intel->ctx ); LOCK_HARDWARE( intel ); + intelInstallBatchBuffer(intel); + intelValidateBuffers( intel ); + { intelScreenPrivate *intelScreen = intel->intelScreen; __DRIdrawablePrivate *dPriv = intel->driDrawable; @@ -117,6 +121,8 @@ void intelCopyBuffer( const __DRIdrawablePrivate *dPriv ) } } intelFlushBatchLocked( intel, GL_TRUE, GL_TRUE, GL_TRUE ); + assert(intel->buffer_list == NULL); + UNLOCK_HARDWARE( intel ); } @@ -273,6 +279,8 @@ void intelClearWithBlit(GLcontext *ctx, GLbitfield flags, GLboolean all, intelFlush( &intel->ctx ); LOCK_HARDWARE( intel ); + intelInstallBatchBuffer(intel); + intelValidateBuffers( intel ); { /* flip top to bottom */ cy = intel->driDrawable->h-cy1-ch; @@ -362,60 +370,72 @@ void intelClearWithBlit(GLcontext *ctx, GLbitfield flags, GLboolean all, -void intelDestroyBatchBuffer( GLcontext *ctx ) +void intelDestroyBatchBuffer( struct intel_context *intel ) { - intelContextPtr intel = INTEL_CONTEXT(ctx); - - if (intel->alloc.ptr) { - intelFreeAGP( intel, intel->alloc.ptr ); - intel->alloc.ptr = 0; - } } -void intelInitBatchBuffer( GLcontext *ctx ) +void intelInstallBatchBuffer( struct intel_context *intel ) { - intelContextPtr intel = INTEL_CONTEXT(ctx); + assert(!intel->batch.ptr); + + intel->alloc.current++; + intel->alloc.current %= INTEL_ALLOC_NR; + + DBG("%s: %d\n", __FUNCTION__, intel->alloc.current); + + intel->batch.size = INTEL_ALLOC_SIZE; + intel->batch.space = intel->batch.size; + intel->batch.start_offset = 0; - /* AGP allocation won't work: + intel->batch.ptr = bmMapBuffer( intel->bm, + intel->alloc.buffer[intel->alloc.current], + BM_WRITE | BM_MEM_AGP ); + + + assert(!intel->buffer_list); + intel->buffer_list = bmNewBufferList(); + + /* Add the batchbuffer */ - if (1 || !intel->intelScreen->allow_batchbuffer || getenv("INTEL_NO_BATCH")) { - intel->alloc.size = 8 * 1024; - intel->alloc.ptr = malloc( intel->alloc.size ); - intel->alloc.offset = 0; - } - else { - switch (intel->intelScreen->deviceID) { - case PCI_CHIP_I865_G: - /* HW bug? Seems to crash if batchbuffer crosses 4k boundary. - */ - intel->alloc.size = 8 * 1024; - break; - default: - /* This is the smallest amount of memory the kernel deals with. - * We'd ideally like to make this smaller. - */ - intel->alloc.size = 1 << intel->intelScreen->logTextureGranularity; - break; + bmAddBuffer(intel->buffer_list, + intel->alloc.buffer[intel->alloc.current], + BM_READ, + NULL, + &intel->batch.start_offset); + + + if (0) { + static int foo; + if (foo++ > 10) { + _mesa_printf("foo\n"); + exit(1); } - - intel->alloc.ptr = intelAllocateAGP( intel, intel->alloc.size ); - if (intel->alloc.ptr) - intel->alloc.offset = - intelAgpOffsetFromVirtual( intel, intel->alloc.ptr ); } +} - if (!intel->alloc.ptr) { - FALLBACK(intel, INTEL_FALLBACK_NO_BATCHBUFFER, 1); - } - else { - intel->prim.flush = 0; - intel->vtbl.emit_invarient_state( intel ); - - /* Make sure this gets to the hardware, even if we have no cliprects: - */ - LOCK_HARDWARE( intel ); - intelFlushBatchLocked( intel, GL_TRUE, GL_FALSE, GL_TRUE ); - UNLOCK_HARDWARE( intel ); - } +void intelInitBatchBuffer( struct intel_context *intel ) +{ + GLint i; + + _mesa_printf("%s: %d\n", __FUNCTION__, intel->alloc.current); + bmGenBuffers(intel->bm, + INTEL_ALLOC_NR, + intel->alloc.buffer); + + for (i = 0; i < INTEL_ALLOC_NR; i++) + bmBufferData(intel->bm, + intel->alloc.buffer[i], + INTEL_ALLOC_SIZE, + NULL, + BM_MEM_AGP); + + +} + + +void intelValidateBuffers( struct intel_context *intel ) +{ + if (!bmValidateBufferList(intel->bm, intel->buffer_list, BM_MEM_AGP)) + assert(0); } diff --git a/src/mesa/drivers/dri/i915/intel_batchbuffer.h b/src/mesa/drivers/dri/i915/intel_batchbuffer.h index 0d6aae93ae2..6e43fcb5f0e 100644 --- a/src/mesa/drivers/dri/i915/intel_batchbuffer.h +++ b/src/mesa/drivers/dri/i915/intel_batchbuffer.h @@ -42,6 +42,7 @@ do { \ if (VERBOSE) fprintf(stderr, \ "BEGIN_BATCH(%d) in %s, %d dwords free\n", \ (n), __FUNCTION__, intel->batch.space/4); \ + assert(intel->locked); \ if (intel->batch.space < (n)*4) \ intelFlushBatch(intel, GL_TRUE); \ batch_ptr = intel->batch.ptr; \ @@ -62,8 +63,11 @@ do { \ assert(intel->batch.space >= 0); \ } while(0) -extern void intelInitBatchBuffer( GLcontext *ctx ); -extern void intelDestroyBatchBuffer( GLcontext *ctx ); +extern void intelInitBatchBuffer( struct intel_context *intel ); +extern void intelDestroyBatchBuffer( struct intel_context *intel ); + +void intelInstallBatchBuffer( struct intel_context *intel ); + extern void intelStartInlinePrimitive( intelContextPtr intel, GLuint prim ); extern void intelWrapInlinePrimitive( intelContextPtr intel ); @@ -97,5 +101,6 @@ extern void intelEmitFillBlitLocked( intelContextPtr intel, GLuint *intelExtendInlinePrimitive( intelContextPtr intel, GLuint dwords ); +void intelValidateBuffers( struct intel_context *intel ); #endif diff --git a/src/mesa/drivers/dri/i915/intel_blit.c b/src/mesa/drivers/dri/i915/intel_blit.c new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/src/mesa/drivers/dri/i915/intel_blit.c diff --git a/src/mesa/drivers/dri/i915/intel_context.c b/src/mesa/drivers/dri/i915/intel_context.c index b9a7b8622d6..ff5a6e43f23 100644 --- a/src/mesa/drivers/dri/i915/intel_context.c +++ b/src/mesa/drivers/dri/i915/intel_context.c @@ -389,7 +389,7 @@ GLboolean intelInitContext( intelContextPtr intel, /* DRI_TEXMGR_DO_TEXTURE_RECT ); */ - intel->prim.flush = intelInitBatchBuffer; + intel->prim.flush = NULL; intel->prim.primitive = ~0; @@ -433,7 +433,7 @@ void intelDestroyContext(__DRIcontextPrivate *driContextPriv) _swrast_DestroyContext (&intel->ctx); intel->Fallback = 0; /* don't call _swrast_Flush later */ - intelDestroyBatchBuffer(&intel->ctx); + intelDestroyBatchBuffer(intel); if ( release_texture_heaps ) { @@ -581,6 +581,13 @@ void intelGetLock( intelContextPtr intel, GLuint flags ) __DRIscreenPrivate *sPriv = intel->driScreen; drmI830Sarea * sarea = intel->sarea; int me = intel->hHWContext; + static int foo = 0; + +/* _mesa_printf("%s\n", __FUNCTION__); */ +/* if (foo++ > 1) { */ +/* _mesa_printf("%s - foo\n", __FUNCTION__); */ +/* abort(); */ +/* } */ drmGetLock(intel->driFd, intel->hHWContext, flags); diff --git a/src/mesa/drivers/dri/i915/intel_context.h b/src/mesa/drivers/dri/i915/intel_context.h index 7f7f0f39088..1234a8241dc 100644 --- a/src/mesa/drivers/dri/i915/intel_context.h +++ b/src/mesa/drivers/dri/i915/intel_context.h @@ -146,6 +146,8 @@ struct intel_context GLuint Fallback; GLuint NewGLState; + GLuint last_fence; + struct { GLuint start_offset; GLint size; @@ -153,15 +155,16 @@ struct intel_context GLubyte *ptr; } batch; +#define INTEL_ALLOC_NR 64 +#define INTEL_ALLOC_SIZE 4096 + struct { - void *ptr; - GLint size; - GLuint offset; - GLuint active_buf; - GLuint irq_emitted; + GLuint buffer[INTEL_ALLOC_NR]; + GLuint current; } alloc; struct { + GLuint id; GLuint primitive; GLubyte *start_ptr; void (*flush)( GLcontext * ); @@ -211,11 +214,12 @@ struct intel_context GLenum render_primitive; GLenum reduced_primitive; GLuint vertex_size; - char *verts; /* points to tnl->clipspace.vertex_buf */ + GLubyte *verts; /* points to tnl->clipspace.vertex_buf */ struct intel_region *front_region; struct intel_region *back_region; + struct intel_region *draw_region; struct intel_region *depth_region; diff --git a/src/mesa/drivers/dri/i915/intel_ioctl.h b/src/mesa/drivers/dri/i915/intel_ioctl.h index d16dae8e870..89d2be06323 100644 --- a/src/mesa/drivers/dri/i915/intel_ioctl.h +++ b/src/mesa/drivers/dri/i915/intel_ioctl.h @@ -46,11 +46,6 @@ extern void intelRefillBatchLocked( intelContextPtr intel, GLboolean allow_unloc extern void intelFinish( GLcontext *ctx ); extern void intelFlush( GLcontext *ctx ); -extern void *intelAllocateAGP( intelContextPtr intel, GLsizei size ); -extern void intelFreeAGP( intelContextPtr intel, void *pointer ); - - -extern GLuint intelAgpOffsetFromVirtual( intelContextPtr intel, const GLvoid *p ); void intelWaitIrq( intelContextPtr intel, int seq ); int intelEmitIrqLocked( intelContextPtr intel ); diff --git a/src/mesa/drivers/dri/i915/intel_pixel.c b/src/mesa/drivers/dri/i915/intel_pixel.c index ee1e2f94074..cbd898f1f4c 100644 --- a/src/mesa/drivers/dri/i915/intel_pixel.c +++ b/src/mesa/drivers/dri/i915/intel_pixel.c @@ -180,7 +180,7 @@ intelTryReadPixels( GLcontext *ctx, int nbox = dPriv->numClipRects; int src_offset = intel->drawOffset; int src_pitch = intel->intelScreen->front.pitch; - int dst_offset = intelAgpOffsetFromVirtual( intel, pixels); + int dst_offset = 0; drm_clip_rect_t *box = dPriv->pClipRects; int i; @@ -261,7 +261,7 @@ static void do_draw_pix( GLcontext *ctx, drm_clip_rect_t *box = dPriv->pClipRects; int nbox = dPriv->numClipRects; int i; - int src_offset = intelAgpOffsetFromVirtual( intel, pixels); + int src_offset = 0; int src_pitch = pitch; if (INTEL_DEBUG & DEBUG_PIXEL) @@ -504,6 +504,7 @@ static GLboolean intelTryCopyPixels( GLcontext *ctx, intelFlush( &intel->ctx ); LOCK_HARDWARE( intel ); + intelInstallBatchBuffer( intel ); { __DRIdrawablePrivate *dPriv = intel->driDrawable; drm_clip_rect_t *box = dPriv->pClipRects; @@ -513,7 +514,6 @@ static GLboolean intelTryCopyPixels( GLcontext *ctx, GLuint dst_offset = 0; GLuint src_offset = 0; GLuint i; - struct bm_buffer_list *list = bmNewBufferList(); #if 0 dsty -= height; /* cope with pixel zoom */ @@ -547,9 +547,12 @@ static GLboolean intelTryCopyPixels( GLcontext *ctx, dsty += dPriv->y; - bmAddBuffer(list, dst->buffer, BM_WRITE, NULL, &dst_offset); - bmAddBuffer(list, src->buffer, BM_READ, NULL, &src_offset); - if (!bmValidateBufferList(intel->bm, list, BM_NO_EVICT|BM_NO_UPLOAD|BM_MEM_AGP)) + bmAddBuffer(intel->buffer_list, dst->buffer, BM_NO_EVICT|BM_NO_UPLOAD|BM_WRITE, + NULL, &dst_offset); + bmAddBuffer(intel->buffer_list, src->buffer, BM_NO_EVICT|BM_NO_UPLOAD|BM_READ, + NULL, &src_offset); + + if (!bmValidateBufferList(intel->bm, intel->buffer_list, BM_MEM_AGP)) goto out; /* Could do slightly more clipping: Eg, take the intersection of @@ -583,15 +586,9 @@ static GLboolean intelTryCopyPixels( GLcontext *ctx, bx, by, /* dstx, dsty */ bw, bh ); } - - intelFlushBatchLocked( intel, GL_TRUE, GL_FALSE, GL_FALSE); - bmFenceBufferList(intel->bm, list); - - out: - bmFreeBufferList(list); } - - + out: + intelFlushBatchLocked( intel, GL_TRUE, GL_FALSE, GL_FALSE); UNLOCK_HARDWARE( intel ); return GL_TRUE; } diff --git a/src/mesa/drivers/dri/i915/intel_screen.c b/src/mesa/drivers/dri/i915/intel_screen.c index 97d2b801f1e..bd127182e4b 100644 --- a/src/mesa/drivers/dri/i915/intel_screen.c +++ b/src/mesa/drivers/dri/i915/intel_screen.c @@ -166,7 +166,7 @@ static GLboolean intelInitDriver(__DRIscreenPrivate *sPriv) intelScreen->sarea_priv_offset = gDRIPriv->sarea_priv_offset; - if (0) intelPrintDRIInfo(intelScreen, sPriv, gDRIPriv); + if (1) intelPrintDRIInfo(intelScreen, sPriv, gDRIPriv); intelScreen->drmMinor = sPriv->drmMinor; diff --git a/src/mesa/drivers/dri/i915/intel_state.c b/src/mesa/drivers/dri/i915/intel_state.c index a2f2b207388..25a7553fad2 100644 --- a/src/mesa/drivers/dri/i915/intel_state.c +++ b/src/mesa/drivers/dri/i915/intel_state.c @@ -192,10 +192,17 @@ static void intelDrawBuffer(GLcontext *ctx, GLenum mode ) intelSetFrontClipRects( intel ); +/* if (intel->draw_region) */ +/* intel_region_release(intel, intel->draw_region); */ + if (front) { intel->drawOffset = screen->front.offset; +/* intel->draw_region = intel_region_reference(intel->front_region); */ + intel->draw_region = intel->front_region; } else { intel->drawOffset = screen->back.offset; +/* intel->draw_region = intel_region_reference(intel->back_region); */ + intel->draw_region = intel->back_region; } intel->vtbl.set_draw_offset( intel, intel->drawOffset ); diff --git a/src/mesa/drivers/dri/i915/intel_tex.h b/src/mesa/drivers/dri/i915/intel_tex.h index 33d2e279c95..be64cf03934 100644 --- a/src/mesa/drivers/dri/i915/intel_tex.h +++ b/src/mesa/drivers/dri/i915/intel_tex.h @@ -111,4 +111,12 @@ GLboolean intel_prevalidate_buffers( struct intel_context *intel ); GLboolean intel_validate_buffers( struct intel_context *intel ); void intel_fence_buffers( struct intel_context *intel ); + +void intel_tex_map_images( struct intel_context *intel, + struct intel_texture_object *intelObj ); + +void intel_tex_unmap_images( struct intel_context *intel, + struct intel_texture_object *intelObj ); + + #endif diff --git a/src/mesa/drivers/dri/i915/intel_tex_copy.c b/src/mesa/drivers/dri/i915/intel_tex_copy.c index 127a029d58c..0f202fdc878 100644 --- a/src/mesa/drivers/dri/i915/intel_tex_copy.c +++ b/src/mesa/drivers/dri/i915/intel_tex_copy.c @@ -105,9 +105,9 @@ static GLboolean do_copy_texsubimage( struct intel_context *intel, LOCK_HARDWARE(intel); + intelInstallBatchBuffer(intel); { __DRIdrawablePrivate *dPriv = intel->driDrawable; - struct bm_buffer_list *list = bmNewBufferList(); GLuint image_offset = intel_miptree_image_offset(intelImage->mt, intelImage->face, intelImage->level); @@ -131,9 +131,15 @@ static GLboolean do_copy_texsubimage( struct intel_context *intel, y += dPriv->y; - bmAddBuffer(list, intelImage->mt->region->buffer, BM_WRITE, NULL, &dst_offset); - bmAddBuffer(list, src->buffer, BM_READ, NULL, &src_offset); - if (!bmValidateBufferList(intel->bm, list, BM_MEM_AGP)) { + bmAddBuffer(intel->buffer_list, + intelImage->mt->region->buffer, + BM_WRITE, NULL, &dst_offset); + + bmAddBuffer(intel->buffer_list, + src->buffer, + BM_READ, NULL, &src_offset); + + if (!bmValidateBufferList(intel->bm, intel->buffer_list, BM_MEM_AGP)) { ret = GL_FALSE; goto out; } @@ -146,12 +152,8 @@ static GLboolean do_copy_texsubimage( struct intel_context *intel, x, y, dstx, dsty, width, height ); - - intelFlushBatchLocked( intel, GL_TRUE, GL_FALSE, GL_FALSE); - bmFenceBufferList(intel->bm, list); - out: - bmFreeBufferList(list); + intelFlushBatchLocked( intel, GL_TRUE, GL_FALSE, GL_FALSE); } diff --git a/src/mesa/drivers/dri/i915/intel_tris.c b/src/mesa/drivers/dri/i915/intel_tris.c index fe43a8e3d7d..e92aa3e0c41 100644 --- a/src/mesa/drivers/dri/i915/intel_tris.c +++ b/src/mesa/drivers/dri/i915/intel_tris.c @@ -87,12 +87,6 @@ static void intel_flush_inline_primitive( GLcontext *ctx ) intel->prim.primitive = ~0; intel->prim.start_ptr = 0; intel->prim.flush = 0; - - intelFlushBatch(intel, GL_TRUE); - intel_fence_buffers(intel); - UNLOCK_HARDWARE(intel); - - } @@ -101,30 +95,7 @@ static void intel_flush_inline_primitive( GLcontext *ctx ) void intelStartInlinePrimitive( intelContextPtr intel, GLuint prim ) { BATCH_LOCALS; - - if (0) - fprintf(stderr, "%s %x\n", __FUNCTION__, prim); - - - /* Finish any in-progress primitive: - */ - INTEL_FIREVERTICES( intel ); - - LOCK_HARDWARE(intel); - intel_validate_buffers( intel ); - intel->vtbl.emit_state( intel ); - /* Make sure there is some space in this buffer: - */ - if (intel->vertex_size * 10 * sizeof(GLuint) >= intel->batch.space) - intelFlushBatch(intel, GL_TRUE); - - if (((int)intel->batch.ptr) & 0x4) { - BEGIN_BATCH(1); - OUT_BATCH(0); - ADVANCE_BATCH(); - } - /* Emit a slot which will be filled with the inline primitive * command later. */ @@ -146,6 +117,9 @@ void intelWrapInlinePrimitive( intelContextPtr intel ) intel_flush_inline_primitive( &intel->ctx ); intelFlushBatch(intel, GL_TRUE); + intelInstallBatchBuffer( intel ); + intel_validate_buffers( intel ); + intel->vtbl.emit_state( intel ); intelStartInlinePrimitive( intel, prim ); } @@ -859,7 +833,14 @@ static void intelRunPipeline( GLcontext *ctx ) static void intelRenderStart( GLcontext *ctx ) { - INTEL_CONTEXT(ctx)->vtbl.render_start( INTEL_CONTEXT(ctx) ); + struct intel_context *intel = intel_context(ctx); + + intel->vtbl.render_start( INTEL_CONTEXT(ctx) ); + + LOCK_HARDWARE(intel); + intelInstallBatchBuffer( intel ); + intel_validate_buffers( intel ); + intel->vtbl.emit_state( intel ); } static void intelRenderFinish( GLcontext *ctx ) @@ -871,6 +852,9 @@ static void intelRenderFinish( GLcontext *ctx ) if (intel->prim.flush) intel->prim.flush(ctx); + + intelFlushBatch(intel, GL_TRUE); + UNLOCK_HARDWARE(intel); } |