diff --git a/linux/mga_dma.c b/linux/mga_dma.c index b3ee658a..16c3eca8 100644 --- a/linux/mga_dma.c +++ b/linux/mga_dma.c @@ -462,17 +462,15 @@ static void mga_dma_dispatch_vertex(drm_device_t *dev, drm_buf_t *buf) PRIMRESET(dev_priv); count = buf_priv->nbox; - if (count == 0) - count = 1; - mgaEmitState( dev_priv, buf_priv ); + if (count) + mgaEmitState( dev_priv, buf_priv ); printk("dispatch vertex addr 0x%lx, length 0x%x nbox %d\n", address, length, buf_priv->nbox); for (i = 0 ; i < count ; i++) { - if (i < buf_priv->nbox) - mgaEmitClipRect( dev_priv, &buf_priv->boxes[i] ); + mgaEmitClipRect( dev_priv, &buf_priv->boxes[i] ); PRIMGETPTR(dev_priv); PRIMOUTREG( MGAREG_DMAPAD, 0); @@ -481,7 +479,6 @@ static void mga_dma_dispatch_vertex(drm_device_t *dev, drm_buf_t *buf) PRIMOUTREG( MGAREG_SECEND, (((__u32)(address + length)) | use_agp)); PRIMADVANCE( dev_priv ); - } PRIMGETPTR(dev_priv); diff --git a/linux/mga_state.c b/linux/mga_state.c index 2bf83347..534c28ae 100644 --- a/linux/mga_state.c +++ b/linux/mga_state.c @@ -119,8 +119,8 @@ static void mgaG200EmitTex( drm_mga_private_t *dev_priv, PRIMOUTREG(0x2d00 + 24*4, regs[MGA_TEXREG_WIDTH] ); PRIMOUTREG(0x2d00 + 34*4, regs[MGA_TEXREG_HEIGHT] ); - PRIMOUTREG( MGAREG_DMAPAD, 0 ); - PRIMOUTREG( MGAREG_DMAPAD, 0 ); + PRIMOUTREG( MGAREG_TEXTRANS, 0xffff ); + PRIMOUTREG( MGAREG_TEXTRANSHIGH, 0xffff ); PRIMOUTREG( MGAREG_DMAPAD, 0 ); PRIMADVANCE( dev_priv ); @@ -153,19 +153,20 @@ static void mgaG400EmitTex0( drm_mga_private_t *dev_priv, PRIMOUTREG(0x2d00 + 57*4, 0); PRIMOUTREG(0x2d00 + 53*4, 0); PRIMOUTREG(0x2d00 + 61*4, 0); + PRIMOUTREG( MGAREG_DMAPAD, 0 ); if (!multitex) { PRIMOUTREG(0x2d00 + 52*4, 0x40 ); PRIMOUTREG(0x2d00 + 60*4, 0x40 ); + PRIMOUTREG( MGAREG_DMAPAD, 0 ); + PRIMOUTREG( MGAREG_DMAPAD, 0 ); } - PRIMOUTREG(0x2d00 + 54*4, regs[MGA_TEXREG_WIDTH] | 0x40 ); - PRIMOUTREG(0x2d00 + 62*4, regs[MGA_TEXREG_HEIGHT] | 0x40 ); + PRIMOUTREG( 0x2d00 + 54*4, regs[MGA_TEXREG_WIDTH] | 0x40 ); + PRIMOUTREG( 0x2d00 + 62*4, regs[MGA_TEXREG_HEIGHT] | 0x40 ); + PRIMOUTREG( MGAREG_TEXTRANS, 0xffff ); + PRIMOUTREG( MGAREG_TEXTRANSHIGH, 0xffff ); - PRIMOUTREG( MGAREG_DMAPAD, 0 ); - PRIMOUTREG( MGAREG_DMAPAD, 0 ); /* some of these will be truncated */ - PRIMOUTREG( MGAREG_DMAPAD, 0 ); - PRIMOUTREG( MGAREG_DMAPAD, 0 ); PRIMADVANCE( dev_priv ); } @@ -203,9 +204,9 @@ static void mgaG400EmitTex1( drm_mga_private_t *dev_priv, PRIMOUTREG(0x2d00 + 52*4, regs[MGA_TEXREG_WIDTH] | 0x40 ); PRIMOUTREG(0x2d00 + 60*4, regs[MGA_TEXREG_HEIGHT] | 0x40 ); + PRIMOUTREG( MGAREG_TEXTRANS, 0xffff ); + PRIMOUTREG( MGAREG_TEXTRANSHIGH, 0xffff ); PRIMOUTREG(MGAREG_TEXCTL2, regs[MGA_TEXREG_CTL2] ); - PRIMOUTREG(MGAREG_DMAPAD, 0); - PRIMOUTREG(MGAREG_DMAPAD, 0 ); PRIMADVANCE( dev_priv ); /* padded */ } @@ -298,26 +299,26 @@ void mgaEmitState( drm_mga_private_t *dev_priv, drm_mga_buf_priv_t *buf_priv ) unsigned int dirty = buf_priv->dirty; if (dev_priv->chipset == MGA_CARD_TYPE_G400) { + if (dirty & MGA_UPLOAD_PIPE) + mgaG400EmitPipe( dev_priv, buf_priv ); + if (dirty & MGA_UPLOAD_CTX) mgaEmitContext( dev_priv, buf_priv ); - if (dirty & MGA_UPLOAD_TEX1) - mgaG400EmitTex1( dev_priv, buf_priv ); - if (dirty & MGA_UPLOAD_TEX0) mgaG400EmitTex0( dev_priv, buf_priv ); - if (dirty & MGA_UPLOAD_PIPE) - mgaG400EmitPipe( dev_priv, buf_priv ); + if (dirty & MGA_UPLOAD_TEX1) + mgaG400EmitTex1( dev_priv, buf_priv ); } else { + if (dirty & MGA_UPLOAD_PIPE) + mgaG200EmitPipe( dev_priv, buf_priv ); + if (dirty & MGA_UPLOAD_CTX) mgaEmitContext( dev_priv, buf_priv ); if (dirty & MGA_UPLOAD_TEX0) mgaG200EmitTex( dev_priv, buf_priv ); - - if (dirty & MGA_UPLOAD_PIPE) - mgaG200EmitPipe( dev_priv, buf_priv ); } }