void i830FlushPrimsLocked( i830ContextPtr imesa ) { XF86DRIClipRectPtr pbox = (XF86DRIClipRectPtr)imesa->pClipRects; int nbox = imesa->numClipRects; drmBufPtr buffer = imesa->vertex_buffer; I830SAREAPtr sarea = imesa->sarea; drmI830Vertex vertex; int i, nr; if (I830_DEBUG & DEBUG_IOCTL) fprintf(stderr, "%s dirty: %08x\n", __FUNCTION__, imesa->dirty); vertex.idx = buffer->idx; vertex.used = imesa->vertex_low; vertex.discard = 0; sarea->vertex_prim = imesa->hw_primitive; /* Reset imesa vars: */ imesa->vertex_buffer = 0; imesa->vertex_addr = 0; imesa->vertex_low = 0; imesa->vertex_high = 0; imesa->vertex_last_prim = 0; if (imesa->dirty) { if (I830_DEBUG & DEBUG_SANITY) i830EmitHwStateLockedDebug(imesa); else i830EmitHwStateLocked(imesa); } if (I830_DEBUG & DEBUG_IOCTL) fprintf(stderr,"%s: Vertex idx %d used %d discard %d\n", __FUNCTION__, vertex.idx, vertex.used, vertex.discard); if (!nbox) { vertex.used = 0; vertex.discard = 1; if (drmCommandWrite (imesa->driFd, DRM_I830_VERTEX, &vertex, sizeof(drmI830Vertex))) { fprintf(stderr, "DRM_I830_VERTEX: %d\n", -errno); UNLOCK_HARDWARE(imesa); exit(1); } return; } for (i = 0 ; i < nbox ; i = nr ) { XF86DRIClipRectPtr b = sarea->boxes; int j; nr = MIN2(i + I830_NR_SAREA_CLIPRECTS, nbox); sarea->nbox = nr - i; for ( j = i ; j < nr ; j++) { b[j-i] = pbox[j]; } /* Finished with the buffer? */ if (nr == nbox) vertex.discard = 1; /* Do a bunch of sanity checks on the vertices sent to the hardware */ if (I830_DEBUG & DEBUG_SANITY) { i830VertexSanity(imesa, vertex); for ( j = 0 ; j < sarea->nbox ; j++) { fprintf(stderr, "box %d/%d %d,%d %d,%d\n", j, sarea->nbox, b[j].x1, b[j].y1, b[j].x2, b[j].y2); } } drmCommandWrite (imesa->driFd, DRM_I830_VERTEX, &vertex, sizeof(drmI830Vertex)); age_imesa(imesa, imesa->sarea->last_enqueue); } imesa->dirty = 0; imesa->upload_cliprects = GL_FALSE; }
void i810FlushPrimsLocked( i810ContextPtr imesa ) { drm_clip_rect_t *pbox = imesa->pClipRects; int nbox = imesa->numClipRects; drmBufPtr buffer = imesa->vertex_buffer; I810SAREAPtr sarea = imesa->sarea; drmI810Vertex vertex; int i; if (I810_DEBUG & DEBUG_STATE) i810PrintDirty( __FUNCTION__, imesa->dirty ); if (imesa->dirty) emit_state( imesa ); vertex.idx = buffer->idx; vertex.used = imesa->vertex_low; vertex.discard = 0; sarea->vertex_prim = imesa->hw_primitive; if (!nbox) { vertex.used = 0; } else if (nbox > I810_NR_SAREA_CLIPRECTS) { imesa->upload_cliprects = GL_TRUE; } if (!nbox || !imesa->upload_cliprects) { if (nbox == 1) sarea->nbox = 0; else sarea->nbox = nbox; vertex.discard = 1; drmCommandWrite(imesa->driFd, DRM_I810_VERTEX, &vertex, sizeof(drmI810Vertex)); age_imesa(imesa, sarea->last_enqueue); } else { for (i = 0 ; i < nbox ; ) { int nr = MIN2(i + I810_NR_SAREA_CLIPRECTS, nbox); drm_clip_rect_t *b = (drm_clip_rect_t *)sarea->boxes; if (imesa->scissor) { sarea->nbox = 0; for ( ; i < nr ; i++) { b->x1 = pbox[i].x1 - imesa->drawX; b->y1 = pbox[i].y1 - imesa->drawY; b->x2 = pbox[i].x2 - imesa->drawX; b->y2 = pbox[i].y2 - imesa->drawY; if (intersect_rect(b, b, &imesa->scissor_rect)) { sarea->nbox++; b++; } } /* Culled? */ if (!sarea->nbox) { if (nr < nbox) continue; vertex.used = 0; } } else { sarea->nbox = nr - i; for ( ; i < nr ; i++, b++) { b->x1 = pbox[i].x1 - imesa->drawX; b->y1 = pbox[i].y1 - imesa->drawY; b->x2 = pbox[i].x2 - imesa->drawX; b->y2 = pbox[i].y2 - imesa->drawY; } } /* Finished with the buffer? */ if (nr == nbox) vertex.discard = 1; drmCommandWrite(imesa->driFd, DRM_I810_VERTEX, &vertex, sizeof(drmI810Vertex)); age_imesa(imesa, imesa->sarea->last_enqueue); } } /* Reset imesa vars: */ imesa->vertex_buffer = 0; imesa->vertex_addr = 0; imesa->vertex_low = 0; imesa->vertex_high = 0; imesa->vertex_last_prim = 0; imesa->dirty = 0; imesa->upload_cliprects = GL_FALSE; }