Beispiel #1
0
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;
}
Beispiel #2
0
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;
}