⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radeon_ioctl.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
	 if (rmesa->do_usleeps) 	    DO_USLEEP( 1 );	 LOCK_HARDWARE( rmesa );       }   }}/* Copy the back color buffer to the front color buffer. */void radeonCopyBuffer( __DRIdrawablePrivate *dPriv,		       const drm_clip_rect_t	  *rect){   radeonContextPtr rmesa;   GLint nbox, i, ret;   GLboolean   missed_target;   int64_t ust;   __DRIscreenPrivate *psp;   assert(dPriv);   assert(dPriv->driContextPriv);   assert(dPriv->driContextPriv->driverPrivate);   rmesa = (radeonContextPtr) dPriv->driContextPriv->driverPrivate;   if ( RADEON_DEBUG & DEBUG_IOCTL ) {      fprintf( stderr, "\n%s( %p )\n\n", __FUNCTION__, (void *) rmesa->glCtx );   }   RADEON_FIREVERTICES( rmesa );   LOCK_HARDWARE( rmesa );   /* Throttle the frame rate -- only allow one pending swap buffers    * request at a time.    */   radeonWaitForFrameCompletion( rmesa );   if (!rect)   {       UNLOCK_HARDWARE( rmesa );       driWaitForVBlank( dPriv, & missed_target );       LOCK_HARDWARE( rmesa );   }   nbox = dPriv->numClipRects; /* must be in locked region */   for ( i = 0 ; i < nbox ; ) {      GLint nr = MIN2( i + RADEON_NR_SAREA_CLIPRECTS , nbox );      drm_clip_rect_t *box = dPriv->pClipRects;      drm_clip_rect_t *b = rmesa->sarea->boxes;      GLint n = 0;      for ( ; i < nr ; i++ ) {	  *b = box[i];	  if (rect)	  {	      if (rect->x1 > b->x1)		  b->x1 = rect->x1;	      if (rect->y1 > b->y1)		  b->y1 = rect->y1;	      if (rect->x2 < b->x2)		  b->x2 = rect->x2;	      if (rect->y2 < b->y2)		  b->y2 = rect->y2;	      if (b->x1 >= b->x2 || b->y1 >= b->y2)		  continue;	  }	  b++;	  n++;      }      rmesa->sarea->nbox = n;      if (!n)	 continue;      ret = drmCommandNone( rmesa->dri.fd, DRM_RADEON_SWAP );      if ( ret ) {	 fprintf( stderr, "DRM_RADEON_SWAP_BUFFERS: return = %d\n", ret );	 UNLOCK_HARDWARE( rmesa );	 exit( 1 );      }   }   UNLOCK_HARDWARE( rmesa );   if (!rect)   {       psp = dPriv->driScreenPriv;       rmesa->swap_count++;       (*psp->systemTime->getUST)( & ust );       if ( missed_target ) {	   rmesa->swap_missed_count++;	   rmesa->swap_missed_ust = ust - rmesa->swap_ust;       }       rmesa->swap_ust = ust;       rmesa->hw.all_dirty = GL_TRUE;   }}void radeonPageFlip( __DRIdrawablePrivate *dPriv ){   radeonContextPtr rmesa;   GLint ret;   GLboolean   missed_target;   __DRIscreenPrivate *psp;   assert(dPriv);   assert(dPriv->driContextPriv);   assert(dPriv->driContextPriv->driverPrivate);   rmesa = (radeonContextPtr) dPriv->driContextPriv->driverPrivate;   psp = dPriv->driScreenPriv;   if ( RADEON_DEBUG & DEBUG_IOCTL ) {      fprintf(stderr, "%s: pfCurrentPage: %d\n", __FUNCTION__,	      rmesa->sarea->pfCurrentPage);   }   RADEON_FIREVERTICES( rmesa );   LOCK_HARDWARE( rmesa );   /* Need to do this for the perf box placement:    */   if (dPriv->numClipRects)   {      drm_clip_rect_t *box = dPriv->pClipRects;      drm_clip_rect_t *b = rmesa->sarea->boxes;      b[0] = box[0];      rmesa->sarea->nbox = 1;   }   /* Throttle the frame rate -- only allow a few pending swap buffers    * request at a time.    */   radeonWaitForFrameCompletion( rmesa );   UNLOCK_HARDWARE( rmesa );   driWaitForVBlank( dPriv, & missed_target );   if ( missed_target ) {      rmesa->swap_missed_count++;      (void) (*psp->systemTime->getUST)( & rmesa->swap_missed_ust );   }   LOCK_HARDWARE( rmesa );   ret = drmCommandNone( rmesa->dri.fd, DRM_RADEON_FLIP );   UNLOCK_HARDWARE( rmesa );   if ( ret ) {      fprintf( stderr, "DRM_RADEON_FLIP: return = %d\n", ret );      exit( 1 );   }   rmesa->swap_count++;   (void) (*psp->systemTime->getUST)( & rmesa->swap_ust );   /* Get ready for drawing next frame.  Update the renderbuffers'    * flippedOffset/Pitch fields so we draw into the right place.    */   driFlipRenderbuffers(rmesa->glCtx->WinSysDrawBuffer,                        rmesa->sarea->pfCurrentPage);   radeonUpdateDrawBuffer(rmesa->glCtx);}/* ================================================================ * Buffer clear */#define RADEON_MAX_CLEARS	256static void radeonClear( GLcontext *ctx, GLbitfield mask ){   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;   drm_radeon_sarea_t *sarea = rmesa->sarea;   u_int32_t clear;   GLuint flags = 0;   GLuint color_mask = 0;   GLint ret, i;   GLint cx, cy, cw, ch;   if ( RADEON_DEBUG & DEBUG_IOCTL ) {      fprintf( stderr, "radeonClear\n");   }   {      LOCK_HARDWARE( rmesa );      UNLOCK_HARDWARE( rmesa );      if ( dPriv->numClipRects == 0 ) 	 return;   }      radeonFlush( ctx );    if ( mask & BUFFER_BIT_FRONT_LEFT ) {      flags |= RADEON_FRONT;      color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];      mask &= ~BUFFER_BIT_FRONT_LEFT;   }   if ( mask & BUFFER_BIT_BACK_LEFT ) {      flags |= RADEON_BACK;      color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];      mask &= ~BUFFER_BIT_BACK_LEFT;   }   if ( mask & BUFFER_BIT_DEPTH ) {      flags |= RADEON_DEPTH;      mask &= ~BUFFER_BIT_DEPTH;   }   if ( (mask & BUFFER_BIT_STENCIL) && rmesa->state.stencil.hwBuffer ) {      flags |= RADEON_STENCIL;      mask &= ~BUFFER_BIT_STENCIL;   }   if ( mask ) {      if (RADEON_DEBUG & DEBUG_FALLBACKS)	 fprintf(stderr, "%s: swrast clear, mask: %x\n", __FUNCTION__, mask);      _swrast_Clear( ctx, mask );   }   if ( !flags )       return;   if (rmesa->using_hyperz) {      flags |= RADEON_USE_COMP_ZBUF;/*      if (rmesa->radeonScreen->chipset & RADEON_CHIPSET_TCL)          flags |= RADEON_USE_HIERZ; */      if (!(rmesa->state.stencil.hwBuffer) ||	 ((flags & RADEON_DEPTH) && (flags & RADEON_STENCIL) &&	    ((rmesa->state.stencil.clear & RADEON_STENCIL_WRITE_MASK) == RADEON_STENCIL_WRITE_MASK))) {	  flags |= RADEON_CLEAR_FASTZ;      }   }   LOCK_HARDWARE( rmesa );   /* compute region after locking: */   cx = ctx->DrawBuffer->_Xmin;   cy = ctx->DrawBuffer->_Ymin;   cw = ctx->DrawBuffer->_Xmax - cx;   ch = ctx->DrawBuffer->_Ymax - cy;   /* Flip top to bottom */   cx += dPriv->x;   cy  = dPriv->y + dPriv->h - cy - ch;   /* Throttle the number of clear ioctls we do.    */   while ( 1 ) {      int ret;      drm_radeon_getparam_t gp;      gp.param = RADEON_PARAM_LAST_CLEAR;      gp.value = (int *)&clear;      ret = drmCommandWriteRead( rmesa->dri.fd,				 DRM_RADEON_GETPARAM, &gp, sizeof(gp) );      if ( ret ) {	 fprintf( stderr, "%s: drm_radeon_getparam_t: %d\n", __FUNCTION__, ret );	 exit(1);      }      if ( sarea->last_clear - clear <= RADEON_MAX_CLEARS ) {	 break;      }      if ( rmesa->do_usleeps ) {	 UNLOCK_HARDWARE( rmesa );	 DO_USLEEP( 1 );	 LOCK_HARDWARE( rmesa );      }   }   /* Send current state to the hardware */   radeonFlushCmdBufLocked( rmesa, __FUNCTION__ );   for ( i = 0 ; i < dPriv->numClipRects ; ) {      GLint nr = MIN2( i + RADEON_NR_SAREA_CLIPRECTS, dPriv->numClipRects );      drm_clip_rect_t *box = dPriv->pClipRects;      drm_clip_rect_t *b = rmesa->sarea->boxes;      drm_radeon_clear_t clear;      drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS];      GLint n = 0;      if (cw != dPriv->w || ch != dPriv->h) {         /* clear subregion */	 for ( ; i < nr ; i++ ) {	    GLint x = box[i].x1;	    GLint y = box[i].y1;	    GLint w = box[i].x2 - x;	    GLint h = box[i].y2 - y;	    if ( x < cx ) w -= cx - x, x = cx;	    if ( y < cy ) h -= cy - y, y = cy;	    if ( x + w > cx + cw ) w = cx + cw - x;	    if ( y + h > cy + ch ) h = cy + ch - y;	    if ( w <= 0 ) continue;	    if ( h <= 0 ) continue;	    b->x1 = x;	    b->y1 = y;	    b->x2 = x + w;	    b->y2 = y + h;	    b++;	    n++;	 }      } else {         /* clear whole buffer */	 for ( ; i < nr ; i++ ) {	    *b++ = box[i];	    n++;	 }      }      rmesa->sarea->nbox = n;      clear.flags       = flags;      clear.clear_color = rmesa->state.color.clear;      clear.clear_depth = rmesa->state.depth.clear;      clear.color_mask  = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];      clear.depth_mask  = rmesa->state.stencil.clear;      clear.depth_boxes = depth_boxes;      n--;      b = rmesa->sarea->boxes;      for ( ; n >= 0 ; n-- ) {	 depth_boxes[n].f[CLEAR_X1] = (float)b[n].x1;	 depth_boxes[n].f[CLEAR_Y1] = (float)b[n].y1;	 depth_boxes[n].f[CLEAR_X2] = (float)b[n].x2;	 depth_boxes[n].f[CLEAR_Y2] = (float)b[n].y2;	 depth_boxes[n].f[CLEAR_DEPTH] = 	    (float)rmesa->state.depth.clear;      }      ret = drmCommandWrite( rmesa->dri.fd, DRM_RADEON_CLEAR,			     &clear, sizeof(drm_radeon_clear_t));      if ( ret ) {	 UNLOCK_HARDWARE( rmesa );	 fprintf( stderr, "DRM_RADEON_CLEAR: return = %d\n", ret );	 exit( 1 );      }   }   UNLOCK_HARDWARE( rmesa );   rmesa->hw.all_dirty = GL_TRUE;}void radeonWaitForIdleLocked( radeonContextPtr rmesa ){    int fd = rmesa->dri.fd;    int to = 0;    int ret, i = 0;    rmesa->c_drawWaits++;    do {        do {            ret = drmCommandNone( fd, DRM_RADEON_CP_IDLE);        } while ( ret && errno == EBUSY && i++ < RADEON_IDLE_RETRY );    } while ( ( ret == -EBUSY ) && ( to++ < RADEON_TIMEOUT ) );    if ( ret < 0 ) {	UNLOCK_HARDWARE( rmesa );	fprintf( stderr, "Error: Radeon timed out... exiting\n" );	exit( -1 );    }}static void radeonWaitForIdle( radeonContextPtr rmesa ){   LOCK_HARDWARE(rmesa);   radeonWaitForIdleLocked( rmesa );   UNLOCK_HARDWARE(rmesa);}void radeonFlush( GLcontext *ctx ){   radeonContextPtr rmesa = RADEON_CONTEXT( ctx );   if (RADEON_DEBUG & DEBUG_IOCTL)      fprintf(stderr, "%s\n", __FUNCTION__);   if (rmesa->dma.flush)      rmesa->dma.flush( rmesa );   radeonEmitState( rmesa );      if (rmesa->store.cmd_used)      radeonFlushCmdBuf( rmesa, __FUNCTION__ );}/* Make sure all commands have been sent to the hardware and have * completed processing. */void radeonFinish( GLcontext *ctx ){   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);   radeonFlush( ctx );   if (rmesa->do_irqs) {      LOCK_HARDWARE( rmesa );      radeonEmitIrqLocked( rmesa );      UNLOCK_HARDWARE( rmesa );      radeonWaitIrq( rmesa );   }   else      radeonWaitForIdle( rmesa );}void radeonInitIoctlFuncs( GLcontext *ctx ){    ctx->Driver.Clear = radeonClear;    ctx->Driver.Finish = radeonFinish;    ctx->Driver.Flush = radeonFlush;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -