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

📄 mach64_ioctl.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
      ret = drmCommandWrite( mmesa->driFd, DRM_MACH64_CLEAR,			     &clear, sizeof(drm_mach64_clear_t) );      if (ret < 0) {	 UNLOCK_HARDWARE( mmesa );	 fprintf( stderr, "DRM_MACH64_CLEAR: return = %d\n", ret );	 exit( -1 );      }   }   x += w;   w = 20;   b[0].x1 = x;   /* show approx. ratio of AGP/card textures used - Blue = AGP, Purple = Card */   if ( mmesa->c_texsrc_agp || mmesa->c_texsrc_card ) {      color = mach64PackColor( mmesa->mach64Screen->cpp, 0, 0, 255, 0 );      w = ((GLfloat)mmesa->c_texsrc_agp / (GLfloat)(mmesa->c_texsrc_agp + mmesa->c_texsrc_card))*20;      if (w > 1) {	 b[0].x2 = x + w;	 clear.x = x;	 clear.y = y;	 clear.w = w;	 clear.h = h;	 clear.clear_color = color;	 ret = drmCommandWrite( mmesa->driFd, DRM_MACH64_CLEAR,				&clear, sizeof(drm_mach64_clear_t) );	 if (ret < 0) {	    UNLOCK_HARDWARE( mmesa );	    fprintf( stderr, "DRM_MACH64_CLEAR: return = %d\n", ret );	    exit( -1 );	 }      }      x += w;      w = 20 - w;      if (w > 1) {	 b[0].x1 = x;	 b[0].x2 = x + w;	 color = mach64PackColor( mmesa->mach64Screen->cpp, 255, 0, 255, 0 );	 clear.x = x;	 clear.y = y;	 clear.w = w;	 clear.h = h;	 clear.clear_color = color;	 ret = drmCommandWrite( mmesa->driFd, DRM_MACH64_CLEAR,				&clear, sizeof(drm_mach64_clear_t) );	 if (ret < 0) {	    UNLOCK_HARDWARE( mmesa );	    fprintf( stderr, "DRM_MACH64_CLEAR: return = %d\n", ret );	    exit( -1 );	 }      }   }     x += w;   w = 8;   b[0].x1 = x;   b[0].x2 = x + w;   /* Yellow box if we swapped textures */   if ( mmesa->c_textureSwaps ) {      color = mach64PackColor( mmesa->mach64Screen->cpp, 255, 255, 0, 0 );      clear.x = x;      clear.y = y;      clear.w = w;      clear.h = h;      clear.clear_color = color;      ret = drmCommandWrite( mmesa->driFd, DRM_MACH64_CLEAR,				&clear, sizeof(drm_mach64_clear_t) );      if (ret < 0) {	 UNLOCK_HARDWARE( mmesa );	 fprintf( stderr, "DRM_MACH64_CLEAR: return = %d\n", ret );	 exit( -1 );      }         }   h = 4;   x += 8;   b[0].x1 = x;   b[0].y2 = y + h;   /* Purple bar for card memory texture blits/uploads */   if ( mmesa->c_textureBytes ) {      color = mach64PackColor( mmesa->mach64Screen->cpp, 255, 0, 255, 0 );      w = mmesa->c_textureBytes / 16384;      if ( w <= 0 ) 	 w = 1;       if (w > (mmesa->driDrawable->w - 44))	 w = mmesa->driDrawable->w - 44;      b[0].x2 = x + w;      clear.x = x;      clear.y = y;      clear.w = w;      clear.h = h;      clear.clear_color = color;      ret = drmCommandWrite( mmesa->driFd, DRM_MACH64_CLEAR,				&clear, sizeof(drm_mach64_clear_t) );      if (ret < 0) {	 UNLOCK_HARDWARE( mmesa );	 fprintf( stderr, "DRM_MACH64_CLEAR: return = %d\n", ret );	 exit( -1 );      }   }   /* Blue bar for AGP memory texture blits/uploads */   if ( mmesa->c_agpTextureBytes ) {      color = mach64PackColor( mmesa->mach64Screen->cpp, 0, 0, 255, 0 );      w = mmesa->c_agpTextureBytes / 16384;      if ( w <= 0 ) 	 w = 1;       if (w > (mmesa->driDrawable->w - 44))	 w = mmesa->driDrawable->w - 44;      y += 4;      b[0].x2 = x + w;      b[0].y1 = y;      b[0].y2 = y + h;      clear.x = x;      clear.y = y;      clear.w = w;      clear.h = h;      clear.clear_color = color;      ret = drmCommandWrite( mmesa->driFd, DRM_MACH64_CLEAR,				&clear, sizeof(drm_mach64_clear_t) );      if (ret < 0) {	 UNLOCK_HARDWARE( mmesa );	 fprintf( stderr, "DRM_MACH64_CLEAR: return = %d\n", ret );	 exit( -1 );      }   }   /* Pink bar for number of vertex buffers used */   if ( mmesa->c_vertexBuffers ) {      color = mach64PackColor( mmesa->mach64Screen->cpp, 196, 128, 128, 0 );      w = mmesa->c_vertexBuffers;      if (w > (mmesa->driDrawable->w))	 w = mmesa->driDrawable->w;      h = 8;      x = mmesa->drawX;      y = mmesa->drawY + 8;      b[0].x1 = x;      b[0].x2 = x + w;      b[0].y1 = y;      b[0].y2 = y + h;      clear.x = x;      clear.y = y;      clear.w = w;      clear.h = h;      clear.clear_color = color;      ret = drmCommandWrite( mmesa->driFd, DRM_MACH64_CLEAR,				&clear, sizeof(drm_mach64_clear_t) );      if (ret < 0) {	 UNLOCK_HARDWARE( mmesa );	 fprintf( stderr, "DRM_MACH64_CLEAR: return = %d\n", ret );	 exit( -1 );      }   }   /* restore cliprects */   mmesa->sarea->nbox = nbox;   b[0].x1 = x1;   b[0].y1 = y1;   b[0].x2 = x2;   b[0].y2 = y2;}#endif/* ================================================================ * Buffer clear */static void mach64DDClear( GLcontext *ctx, GLbitfield mask ){   mach64ContextPtr mmesa = MACH64_CONTEXT( ctx );   __DRIdrawablePrivate *dPriv = mmesa->driDrawable;   drm_mach64_clear_t clear;   GLuint flags = 0;   GLint i;   GLint ret;   GLint cx, cy, cw, ch;   if ( MACH64_DEBUG & DEBUG_VERBOSE_API ) {      fprintf( stderr, "mach64DDClear\n");   }#if ENABLE_PERF_BOXES   /* Bump the performance counter */   mmesa->c_clears++;#endif   FLUSH_BATCH( mmesa );   /* The only state changes we care about here are the RGBA colormask    * and scissor/clipping.  We'll just update that state, if needed.    */   if ( mmesa->new_state & (MACH64_NEW_MASKS | MACH64_NEW_CLIP) ) {      const GLuint save_state = mmesa->new_state;      mmesa->new_state &= (MACH64_NEW_MASKS | MACH64_NEW_CLIP);      mach64DDUpdateHWState( ctx );      mmesa->new_state = save_state & ~(MACH64_NEW_MASKS | MACH64_NEW_CLIP);   }   if ( mask & BUFFER_BIT_FRONT_LEFT ) {      flags |= MACH64_FRONT;      mask &= ~BUFFER_BIT_FRONT_LEFT;   }   if ( mask & BUFFER_BIT_BACK_LEFT ) {      flags |= MACH64_BACK;      mask &= ~BUFFER_BIT_BACK_LEFT;   }   if ( ( mask & BUFFER_BIT_DEPTH ) && ctx->Depth.Mask ) {      flags |= MACH64_DEPTH;      mask &= ~BUFFER_BIT_DEPTH;   }   if ( mask )      _swrast_Clear( ctx, mask );   if ( !flags )      return;   LOCK_HARDWARE( mmesa );   /* 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 += mmesa->drawX;   cy  = mmesa->drawY + dPriv->h - cy - ch;   /* HACK?    */   if ( mmesa->dirty & ~MACH64_UPLOAD_CLIPRECTS ) {      mach64EmitHwStateLocked( mmesa );   }   for ( i = 0 ; i < mmesa->numClipRects ; ) {      int nr = MIN2( i + MACH64_NR_SAREA_CLIPRECTS, mmesa->numClipRects );      drm_clip_rect_t *box = mmesa->pClipRects;      drm_clip_rect_t *b = mmesa->sarea->boxes;      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 window */	 for ( ; i < nr ; i++ ) {	    *b++ = box[i];	    n++;	 }      }      mmesa->sarea->nbox = n;      if ( MACH64_DEBUG & DEBUG_VERBOSE_IOCTL ) {	 fprintf( stderr,		  "DRM_MACH64_CLEAR: flag 0x%x color %x depth %x nbox %d\n",		  flags,		  (GLuint)mmesa->ClearColor,		  (GLuint)mmesa->ClearDepth,		  mmesa->sarea->nbox );      }      clear.flags = flags;      clear.x = cx;      clear.y = cy;      clear.w = cw;      clear.h = ch;      clear.clear_color = mmesa->ClearColor;      clear.clear_depth = mmesa->ClearDepth;      ret = drmCommandWrite( mmesa->driFd, DRM_MACH64_CLEAR,			     &clear, sizeof(drm_mach64_clear_t) );      if ( ret ) {	 UNLOCK_HARDWARE( mmesa );	 fprintf( stderr, "DRM_MACH64_CLEAR: return = %d\n", ret );	 exit( -1 );      }   }   UNLOCK_HARDWARE( mmesa );   mmesa->dirty |= (MACH64_UPLOAD_CONTEXT |		    MACH64_UPLOAD_MISC |		    MACH64_UPLOAD_CLIPRECTS);}void mach64WaitForIdleLocked( mach64ContextPtr mmesa ){   int fd = mmesa->driFd;   int to = 0;   int ret;   do {      ret = drmCommandNone( fd, DRM_MACH64_IDLE );   } while ( ( ret == -EBUSY ) && ( to++ < MACH64_TIMEOUT ) );   if ( ret < 0 ) {      drmCommandNone( fd, DRM_MACH64_RESET );      UNLOCK_HARDWARE( mmesa );      fprintf( stderr, "Error: Mach64 timed out... exiting\n" );      exit( -1 );   }}/* Flush the DMA queue to the hardware */void mach64FlushDMALocked( mach64ContextPtr mmesa ){   int fd = mmesa->driFd;   int ret;   ret = drmCommandNone( fd, DRM_MACH64_FLUSH );   if ( ret < 0 ) {      drmCommandNone( fd, DRM_MACH64_RESET );      UNLOCK_HARDWARE( mmesa );      fprintf( stderr, "Error flushing DMA... exiting\n" );      exit( -1 );   }   mmesa->dirty |= (MACH64_UPLOAD_CONTEXT |		    MACH64_UPLOAD_MISC |		    MACH64_UPLOAD_CLIPRECTS);}/* For client-side state emits - currently unused */void mach64UploadHwStateLocked( mach64ContextPtr mmesa ){   drm_mach64_sarea_t *sarea = mmesa->sarea;      drm_mach64_context_regs_t *regs = &sarea->context_state;   unsigned int dirty = sarea->dirty;   CARD32 offset = ((regs->tex_size_pitch & 0xf0) >> 2);   DMALOCALS;   DMAGETPTR( 19*2 );   if ( dirty & MACH64_UPLOAD_MISC ) {      DMAOUTREG( MACH64_DP_MIX, regs->dp_mix );      DMAOUTREG( MACH64_DP_SRC, regs->dp_src );      DMAOUTREG( MACH64_CLR_CMP_CNTL, regs->clr_cmp_cntl );      DMAOUTREG( MACH64_GUI_TRAJ_CNTL, regs->gui_traj_cntl );      DMAOUTREG( MACH64_SC_LEFT_RIGHT, regs->sc_left_right );      DMAOUTREG( MACH64_SC_TOP_BOTTOM, regs->sc_top_bottom );      sarea->dirty &= ~MACH64_UPLOAD_MISC;   }   if ( dirty & MACH64_UPLOAD_DST_OFF_PITCH ) {      DMAOUTREG( MACH64_DST_OFF_PITCH, regs->dst_off_pitch );      sarea->dirty &= ~MACH64_UPLOAD_DST_OFF_PITCH;   }   if ( dirty & MACH64_UPLOAD_Z_OFF_PITCH ) {      DMAOUTREG( MACH64_Z_OFF_PITCH, regs->z_off_pitch );      sarea->dirty &= ~MACH64_UPLOAD_Z_OFF_PITCH;   }   if ( dirty & MACH64_UPLOAD_Z_ALPHA_CNTL ) {      DMAOUTREG( MACH64_Z_CNTL, regs->z_cntl );      DMAOUTREG( MACH64_ALPHA_TST_CNTL, regs->alpha_tst_cntl );      sarea->dirty &= ~MACH64_UPLOAD_Z_ALPHA_CNTL;   }   if ( dirty & MACH64_UPLOAD_SCALE_3D_CNTL ) {      DMAOUTREG( MACH64_SCALE_3D_CNTL, regs->scale_3d_cntl );      sarea->dirty &= ~MACH64_UPLOAD_SCALE_3D_CNTL;   }   if ( dirty & MACH64_UPLOAD_DP_FOG_CLR ) {      DMAOUTREG( MACH64_DP_FOG_CLR, regs->dp_fog_clr );      sarea->dirty &= ~MACH64_UPLOAD_DP_FOG_CLR;   }   if ( dirty & MACH64_UPLOAD_DP_WRITE_MASK ) {      DMAOUTREG( MACH64_DP_WRITE_MASK, regs->dp_write_mask );      sarea->dirty &= ~MACH64_UPLOAD_DP_WRITE_MASK;   }   if ( dirty & MACH64_UPLOAD_DP_PIX_WIDTH ) {      DMAOUTREG( MACH64_DP_PIX_WIDTH, regs->dp_pix_width );      sarea->dirty &= ~MACH64_UPLOAD_DP_PIX_WIDTH;   }   if ( dirty & MACH64_UPLOAD_SETUP_CNTL ) {      DMAOUTREG( MACH64_SETUP_CNTL, regs->setup_cntl );      sarea->dirty &= ~MACH64_UPLOAD_SETUP_CNTL;   }   if ( dirty & MACH64_UPLOAD_TEXTURE ) {      DMAOUTREG( MACH64_TEX_SIZE_PITCH, regs->tex_size_pitch );      DMAOUTREG( MACH64_TEX_CNTL, regs->tex_cntl );      DMAOUTREG( MACH64_SECONDARY_TEX_OFF, regs->secondary_tex_off );      DMAOUTREG( MACH64_TEX_0_OFF + offset, regs->tex_offset );      sarea->dirty &= ~MACH64_UPLOAD_TEXTURE;   }#if 0   if ( dirty & MACH64_UPLOAD_CLIPRECTS ) {      DMAOUTREG( MACH64_SC_LEFT_RIGHT, regs->sc_left_right );      DMAOUTREG( MACH64_SC_TOP_BOTTOM, regs->sc_top_bottom );      sarea->dirty &= ~MACH64_UPLOAD_CLIPRECTS;   }#endif   sarea->dirty = 0;   DMAADVANCE();}void mach64InitIoctlFuncs( struct dd_function_table *functions ){    functions->Clear = mach64DDClear;}

⌨️ 快捷键说明

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