📄 mach64_ioctl.c
字号:
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 + -