Update MGA composite patch commit. (some files were missing in the previous
commit)
This commit is contained in:
		
							parent
							
								
									e56e24af25
								
							
						
					
					
						commit
						da78a4ddd8
					
				| 
						 | 
					@ -0,0 +1,192 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * $Id$
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright © 2004 Damien Ciabrini
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission to use, copy, modify, distribute, and sell this software and its
 | 
				
			||||||
 | 
					 * documentation for any purpose is hereby granted without fee, provided that
 | 
				
			||||||
 | 
					 * the above copyright notice appear in all copies and that both that
 | 
				
			||||||
 | 
					 * copyright notice and this permission notice appear in supporting
 | 
				
			||||||
 | 
					 * documentation, and that the name of Anders Carlsson not be used in
 | 
				
			||||||
 | 
					 * advertising or publicity pertaining to distribution of the software without
 | 
				
			||||||
 | 
					 * specific, written prior permission.  Anders Carlsson makes no
 | 
				
			||||||
 | 
					 * representations about the suitability of this software for any purpose.  It
 | 
				
			||||||
 | 
					 * is provided "as is" without express or implied warranty.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * DAMIEN CIABRINI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
				
			||||||
 | 
					 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
				
			||||||
 | 
					 * EVENT SHALL ANDERS CARLSSON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | 
				
			||||||
 | 
					 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | 
				
			||||||
 | 
					 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | 
				
			||||||
 | 
					 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
				
			||||||
 | 
					 * PERFORMANCE OF THIS SOFTWARE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					/* $Header$ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __G400_COMMON_H__
 | 
				
			||||||
 | 
					#define __G400_COMMON_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Color registers */
 | 
				
			||||||
 | 
					#define MGA_REG_DR4             		(0x1CD0)
 | 
				
			||||||
 | 
					#define MGA_REG_DR6             		(0x1CD8)
 | 
				
			||||||
 | 
					#define MGA_REG_DR7             		(0x1CDC)
 | 
				
			||||||
 | 
					#define MGA_REG_DR8             		(0x1CE0)
 | 
				
			||||||
 | 
					#define MGA_REG_DR10            		(0x1CE8)
 | 
				
			||||||
 | 
					#define MGA_REG_DR11            		(0x1CEC)
 | 
				
			||||||
 | 
					#define MGA_REG_DR12            		(0x1CF0)
 | 
				
			||||||
 | 
					#define MGA_REG_DR14            		(0x1CF8)
 | 
				
			||||||
 | 
					#define MGA_REG_DR15            		(0x1CFC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Alpha registers */
 | 
				
			||||||
 | 
					#define MGA_REG_ALPHASTART      		(0x2C70)
 | 
				
			||||||
 | 
					#define MGA_REG_ALPHAXINC       		(0x2C74)
 | 
				
			||||||
 | 
					#define MGA_REG_ALPHAYINC       		(0x2C78)
 | 
				
			||||||
 | 
					#define MGA_REG_ALPHACTRL       		(0x2C7C)
 | 
				
			||||||
 | 
					#    define MGA_SRC_ZERO                     	(0x00000000)
 | 
				
			||||||
 | 
					#    define MGA_SRC_ONE                      	(0x00000001)
 | 
				
			||||||
 | 
					#    define MGA_SRC_DST_COLOR                	(0x00000002)
 | 
				
			||||||
 | 
					#    define MGA_SRC_ONE_MINUS_DST_COLOR      	(0x00000003)
 | 
				
			||||||
 | 
					#    define MGA_SRC_ALPHA                    	(0x00000004)
 | 
				
			||||||
 | 
					#    define MGA_SRC_ONE_MINUS_SRC_ALPHA      	(0x00000005)
 | 
				
			||||||
 | 
					#    define MGA_SRC_DST_ALPHA                	(0x00000006)
 | 
				
			||||||
 | 
					#    define MGA_SRC_ONE_MINUS_DST_ALPHA      	(0x00000007)
 | 
				
			||||||
 | 
					#    define MGA_SRC_SRC_ALPHA_SATURATE       	(0x00000008)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#    define MGA_DST_ZERO                     	(0x00000000)
 | 
				
			||||||
 | 
					#    define MGA_DST_ONE                      	(0x00000010)
 | 
				
			||||||
 | 
					#    define MGA_DST_SRC_COLOR                	(0x00000020)
 | 
				
			||||||
 | 
					#    define MGA_DST_ONE_MINUS_SRC_COLOR      	(0x00000030)
 | 
				
			||||||
 | 
					#    define MGA_DST_SRC_ALPHA                	(0x00000040)
 | 
				
			||||||
 | 
					#    define MGA_DST_ONE_MINUS_SRC_ALPHA      	(0x00000050)
 | 
				
			||||||
 | 
					#    define MGA_DST_DST_ALPHA                	(0x00000060)
 | 
				
			||||||
 | 
					#    define MGA_DST_ONE_MINUS_DST_ALPHA      	(0x00000070)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#    define MGA_ALPHACHANNEL                 	(0x00000100)
 | 
				
			||||||
 | 
					#    define MGA_VIDEOALPHA                   	(0x00000200)
 | 
				
			||||||
 | 
					#    define MGA_DIFFUSEDALPHA                	(0x01000000)
 | 
				
			||||||
 | 
					#    define MGA_MODULATEDALPHA               	(0x02000000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Textures registers */
 | 
				
			||||||
 | 
					#define MGA_REG_TEXORG 				(0x2c24)
 | 
				
			||||||
 | 
					#define MGA_REG_TEXORG1				(0x2ca4)
 | 
				
			||||||
 | 
					#define MGA_REG_TEXWIDTH        		(0x2C28)
 | 
				
			||||||
 | 
					#define MGA_REG_TEXHEIGHT       		(0x2C2C)
 | 
				
			||||||
 | 
					#define MGA_REG_TMR0            		(0x2C00)
 | 
				
			||||||
 | 
					#define MGA_REG_TMR1            		(0x2C04)
 | 
				
			||||||
 | 
					#define MGA_REG_TMR2            		(0x2C08)
 | 
				
			||||||
 | 
					#define MGA_REG_TMR3            		(0x2C0C)
 | 
				
			||||||
 | 
					#define MGA_REG_TMR4            		(0x2C10)
 | 
				
			||||||
 | 
					#define MGA_REG_TMR5            		(0x2C14)
 | 
				
			||||||
 | 
					#define MGA_REG_TMR6            		(0x2C18)
 | 
				
			||||||
 | 
					#define MGA_REG_TMR7            		(0x2C1C)
 | 
				
			||||||
 | 
					#define MGA_REG_TMR8            		(0x2C20)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Texture Control Registers */
 | 
				
			||||||
 | 
					#define MGA_REG_TEXCTL          		(0x2C30)
 | 
				
			||||||
 | 
					#    define MGA_TW4				(0x00000000)
 | 
				
			||||||
 | 
					#    define MGA_TW8           			(0x00000001)
 | 
				
			||||||
 | 
					#    define MGA_TW15          			(0x00000002)
 | 
				
			||||||
 | 
					#    define MGA_TW16          			(0x00000003)
 | 
				
			||||||
 | 
					#    define MGA_TW12          			(0x00000004)
 | 
				
			||||||
 | 
					#    define MGA_TW32				(0x00000006)
 | 
				
			||||||
 | 
					#    define MGA_TW8A          			(0x00000007)
 | 
				
			||||||
 | 
					#    define MGA_TW8AL         			(0x00000008)
 | 
				
			||||||
 | 
					#    define MGA_TW422         			(0x0000000A)
 | 
				
			||||||
 | 
					#    define MGA_TW422UYVY     			(0x0000000B)
 | 
				
			||||||
 | 
					#    define MGA_PITCHEXT			(0x00000100)
 | 
				
			||||||
 | 
					#    define MGA_NOPERSPECTIVE			(0x00200000)
 | 
				
			||||||
 | 
					#    define MGA_TAKEY           	     	(0x02000000)
 | 
				
			||||||
 | 
					#    define MGA_TAMASK				(0x04000000)
 | 
				
			||||||
 | 
					#    define MGA_CLAMPUV				(0x18000000)
 | 
				
			||||||
 | 
					#define MGA_REG_TEXCTL2         		(0x2C3C)
 | 
				
			||||||
 | 
					#    define MGA_G400_TC2_MAGIC			(0x00008000)
 | 
				
			||||||
 | 
					#    define MGA_TC2_DECALBLEND 			(0x00000001)
 | 
				
			||||||
 | 
					#    define MGA_TC2_IDECAL 			(0x00000002)
 | 
				
			||||||
 | 
					#    define MGA_TC2_DECALDIS 			(0x00000004)
 | 
				
			||||||
 | 
					#    define MGA_TC2_CKSTRANSDIS 		(0x00000010)
 | 
				
			||||||
 | 
					#    define MGA_TC2_BORDEREN 			(0x00000020)
 | 
				
			||||||
 | 
					#    define MGA_TC2_SPECEN 			(0x00000040)
 | 
				
			||||||
 | 
					#    define MGA_TC2_DUALTEX 			(0x00000080)
 | 
				
			||||||
 | 
					#    define MGA_TC2_TABLEFOG 			(0x00000100)
 | 
				
			||||||
 | 
					#    define MGA_TC2_BUMPMAP 			(0x00000200)
 | 
				
			||||||
 | 
					#    define MGA_TC2_SELECT_TMU1 		(0x80000000)
 | 
				
			||||||
 | 
					#define MGA_REG_TEXFILTER       		(0x2C58)
 | 
				
			||||||
 | 
					#    define MGA_MIN_NRST            		(0x00000000)
 | 
				
			||||||
 | 
					#    define MGA_MIN_BILIN           		(0x00000002)
 | 
				
			||||||
 | 
					#    define MGA_MIN_ANISO           		(0x0000000D)
 | 
				
			||||||
 | 
					#    define MGA_MAG_NRST            		(0x00000000)
 | 
				
			||||||
 | 
					#    define MGA_MAG_BILIN           		(0x00000020)
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					/* Multi-Textures Control Registers */
 | 
				
			||||||
 | 
					#define MGA_REG_TDUALSTAGE0   			(0x2CF8)
 | 
				
			||||||
 | 
					#define MGA_REG_TDUALSTAGE1   			(0x2CFC)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG2_DIFFUSE 		(0x00000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG2_SPECULAR 	(0x00000001)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG2_FCOL 		(0x00000002)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG2_PREVSTAGE 	(0x00000003)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ALPHA_DIFFUSE 	(0x00000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ALPHA_FCOL 		(0x00000004)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ALPHA_CURRTEX 	(0x00000008)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ALPHA_PREVTEX 	(0x0000000c)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ALPHA_PREVSTAGE 	(0x00000010)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG1_REPLICATEALPHA 	(0x00000020)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG1_INV 		(0x00000040)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG2_REPLICATEALPHA 	(0x00000080)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG2_INV 		(0x00000100)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ALPHA1INV 		(0x00000200)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ALPHA2INV 		(0x00000400)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG1MUL_ALPHA1 	(0x00000800)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG2MUL_ALPHA2 	(0x00001000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG1ADD_MULOUT 	(0x00002000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ARG2ADD_MULOUT 	(0x00004000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_MODBRIGHT_2X 		(0x00008000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_MODBRIGHT_4X 		(0x00010000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ADD_SUB 		(0x00000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ADD_ADD 		(0x00020000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ADD2X 		(0x00040000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_ADDBIAS 		(0x00080000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_BLEND 		(0x00100000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_SEL_ARG1 		(0x00000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_SEL_ARG2 		(0x00200000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_SEL_ADD 		(0x00400000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_COLOR_SEL_MUL 		(0x00600000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_ARG1_INV 		(0x00800000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_ARG2_DIFFUSE 		(0x00000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_ARG2_FCOL 		(0x01000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_ARG2_PREVTEX 		(0x02000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_ARG2_PREVSTAGE 	(0x03000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_ARG2_INV 		(0x04000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_ADD 			(0x08000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_ADDBIAS 		(0x10000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_ADD2X 		(0x20000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_SEL_ARG1 		(0x00000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_SEL_ARG2 		(0x40000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_SEL_ADD 		(0x80000000)
 | 
				
			||||||
 | 
					#    define MGA_TDS_ALPHA_SEL_MUL 		(0xc0000000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Composition Prototypes. MMIO Access */
 | 
				
			||||||
 | 
					Bool
 | 
				
			||||||
 | 
					mgaPrepareBlend(int op, PicturePtr pSrcPicture, PicturePtr pDstPicture,
 | 
				
			||||||
 | 
							PixmapPtr pSrc, PixmapPtr pDst);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mgaBlend(int srcX, int srcY, int dstX, int dstY, int width, int height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mgaDoneBlend(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bool
 | 
				
			||||||
 | 
					mgaPrepareComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
 | 
				
			||||||
 | 
							    PicturePtr pDstPicture, PixmapPtr pSrc,
 | 
				
			||||||
 | 
							    PixmapPtr pMask, PixmapPtr pDst);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mgaComposite(int srcX, int srcY, int maskX, int maskY,
 | 
				
			||||||
 | 
						     int dstX, int dstY, int w, int h);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mgaDoneComposite(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,306 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * $Id$
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright © 2004 Damien Ciabrini
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission to use, copy, modify, distribute, and sell this software and its
 | 
				
			||||||
 | 
					 * documentation for any purpose is hereby granted without fee, provided that
 | 
				
			||||||
 | 
					 * the above copyright notice appear in all copies and that both that
 | 
				
			||||||
 | 
					 * copyright notice and this permission notice appear in supporting
 | 
				
			||||||
 | 
					 * documentation, and that the name of Anders Carlsson not be used in
 | 
				
			||||||
 | 
					 * advertising or publicity pertaining to distribution of the software without
 | 
				
			||||||
 | 
					 * specific, written prior permission.  Anders Carlsson makes no
 | 
				
			||||||
 | 
					 * representations about the suitability of this software for any purpose.  It
 | 
				
			||||||
 | 
					 * is provided "as is" without express or implied warranty.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * DAMIEN CIABRINI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
				
			||||||
 | 
					 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
				
			||||||
 | 
					 * EVENT SHALL ANDERS CARLSSON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | 
				
			||||||
 | 
					 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | 
				
			||||||
 | 
					 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | 
				
			||||||
 | 
					 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
				
			||||||
 | 
					 * PERFORMANCE OF THIS SOFTWARE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					/* $Header$ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HAVE_CONFIG_H
 | 
				
			||||||
 | 
					#include <config.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "mga.h"
 | 
				
			||||||
 | 
					#include "g400_common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static PixmapPtr currentSrc;
 | 
				
			||||||
 | 
					static PixmapPtr currentMask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static CARD32 mgaBlendOP[14] = {
 | 
				
			||||||
 | 
					    /* Clear */
 | 
				
			||||||
 | 
					    MGA_SRC_ZERO	        | MGA_DST_ZERO,
 | 
				
			||||||
 | 
					    /* Src */
 | 
				
			||||||
 | 
					    MGA_SRC_ONE			| MGA_DST_ZERO,
 | 
				
			||||||
 | 
					    /* Dst */
 | 
				
			||||||
 | 
					    MGA_SRC_ZERO	        | MGA_DST_ONE,
 | 
				
			||||||
 | 
					    /* Over */
 | 
				
			||||||
 | 
					    MGA_SRC_ALPHA               | MGA_DST_ONE_MINUS_SRC_ALPHA,
 | 
				
			||||||
 | 
					    /* OverReverse */
 | 
				
			||||||
 | 
					    MGA_SRC_ONE_MINUS_DST_ALPHA | MGA_DST_ONE,
 | 
				
			||||||
 | 
					    /* In */
 | 
				
			||||||
 | 
					    MGA_SRC_DST_ALPHA           | MGA_DST_ZERO,
 | 
				
			||||||
 | 
					    /* InReverse */
 | 
				
			||||||
 | 
					    MGA_SRC_ZERO	        | MGA_DST_SRC_ALPHA,
 | 
				
			||||||
 | 
					    /* Out */
 | 
				
			||||||
 | 
					    MGA_SRC_ONE_MINUS_DST_ALPHA | MGA_DST_ZERO,
 | 
				
			||||||
 | 
					    /* OutReverse */
 | 
				
			||||||
 | 
					    MGA_SRC_ZERO	        | MGA_DST_ONE_MINUS_SRC_ALPHA,
 | 
				
			||||||
 | 
					    /* Atop */
 | 
				
			||||||
 | 
					    MGA_SRC_DST_ALPHA	        | MGA_DST_ONE_MINUS_SRC_ALPHA,
 | 
				
			||||||
 | 
					    /* AtopReverse */
 | 
				
			||||||
 | 
					    MGA_SRC_ONE_MINUS_DST_ALPHA | MGA_DST_SRC_ALPHA,
 | 
				
			||||||
 | 
					    /* Xor */
 | 
				
			||||||
 | 
					    MGA_SRC_ONE_MINUS_DST_ALPHA | MGA_DST_ONE_MINUS_SRC_ALPHA,
 | 
				
			||||||
 | 
					    /* Add */
 | 
				
			||||||
 | 
					    MGA_SRC_ONE                 | MGA_DST_ONE,
 | 
				
			||||||
 | 
					    /* Saturate */
 | 
				
			||||||
 | 
					    MGA_SRC_SRC_ALPHA_SATURATE  | MGA_DST_ONE
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int MGA_LOG2( int val )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int ret = 0;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    while (val >> ret)
 | 
				
			||||||
 | 
						ret++;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return ((1 << (ret-1)) == val) ? (ret-1) : ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bool
 | 
				
			||||||
 | 
					mgaPrepareBlend (int		op,
 | 
				
			||||||
 | 
							 PicturePtr	pSrcPicture,
 | 
				
			||||||
 | 
							 PicturePtr	pDstPicture,
 | 
				
			||||||
 | 
							 PixmapPtr	pSrc,
 | 
				
			||||||
 | 
							 PixmapPtr	pDst)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return mgaPrepareComposite (op, pSrcPicture, NULL, pDstPicture,
 | 
				
			||||||
 | 
									pSrc, NULL, pDst);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mgaBlend (int	srcX,
 | 
				
			||||||
 | 
						  int	srcY,
 | 
				
			||||||
 | 
						  int	dstX,
 | 
				
			||||||
 | 
						  int	dstY,
 | 
				
			||||||
 | 
						  int	width,
 | 
				
			||||||
 | 
						  int	height)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    mgaComposite (srcX, srcY, 0, 0, dstX, dstY, width, height);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mgaDoneBlend (void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    mgaDoneComposite ();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Bool
 | 
				
			||||||
 | 
					PrepareSourceTexture (int		tmu,
 | 
				
			||||||
 | 
							      PicturePtr 	pSrcPicture,
 | 
				
			||||||
 | 
							      PixmapPtr 	pSrc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    KdScreenPriv (pSrc->drawable.pScreen);  
 | 
				
			||||||
 | 
					    int mem_base=(int)pScreenPriv->screen->memory_base;
 | 
				
			||||||
 | 
					    int pitch = pSrc->devKind / (pSrc->drawable.bitsPerPixel >> 3); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int w = pSrc->drawable.width;
 | 
				
			||||||
 | 
					    int h = pSrc->drawable.height;
 | 
				
			||||||
 | 
					    int w_log2 = MGA_LOG2(w);
 | 
				
			||||||
 | 
					    int h_log2 = MGA_LOG2(h);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    int texctl=MGA_PITCHEXT | ((pitch&0x7ff)<<9) | 
 | 
				
			||||||
 | 
						MGA_TAKEY | MGA_CLAMPUV | MGA_NOPERSPECTIVE;  
 | 
				
			||||||
 | 
					    int texctl2=MGA_G400_TC2_MAGIC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((w > 2047) || (h > 2047))
 | 
				
			||||||
 | 
						MGA_FALLBACK(("Picture too large for composition (%dx%d)\n", w, h));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (pSrcPicture->format) {
 | 
				
			||||||
 | 
					    case PICT_a8r8g8b8:
 | 
				
			||||||
 | 
					    case PICT_x8r8g8b8:
 | 
				
			||||||
 | 
					    case PICT_a8b8g8r8:
 | 
				
			||||||
 | 
					    case PICT_x8b8g8r8:
 | 
				
			||||||
 | 
						texctl |= MGA_TW32;
 | 
				
			||||||
 | 
						break;
 | 
				
			||||||
 | 
					    case PICT_r5g6b5:
 | 
				
			||||||
 | 
					    case PICT_b5g6r5:
 | 
				
			||||||
 | 
						texctl |= MGA_TW16;
 | 
				
			||||||
 | 
						break;
 | 
				
			||||||
 | 
					    case PICT_a8:
 | 
				
			||||||
 | 
						texctl |= MGA_TW8A;
 | 
				
			||||||
 | 
						break;
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
						MGA_FALLBACK(("unsupported Picture format for composition (%x)\n",
 | 
				
			||||||
 | 
							      pSrcPicture->format));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (tmu == 1) texctl2 |= MGA_TC2_DUALTEX | MGA_TC2_SELECT_TMU1;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    mgaWaitAvail (6);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TEXCTL2, texctl2);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TEXCTL, texctl);  
 | 
				
			||||||
 | 
					    /* Source (texture) address + pitch */
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TEXORG, ((int)pSrc->devPrivate.ptr - mem_base));
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TEXWIDTH, (w-1)<<18 | ((8-w_log2)&63)<<9 | w_log2);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TEXHEIGHT, (h-1)<<18 | ((8-h_log2)&63)<<9 | h_log2);
 | 
				
			||||||
 | 
					    /* Disable filtering since we aren't doing stretch blit */
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TEXFILTER, (0x10<<21) | MGA_MAG_NRST | MGA_MIN_NRST);
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    if (tmu == 1) {
 | 
				
			||||||
 | 
						mgaWaitAvail (1);
 | 
				
			||||||
 | 
						MGA_OUT32 (mmio, MGA_REG_TEXCTL2, MGA_G400_TC2_MAGIC | MGA_TC2_DUALTEX);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bool
 | 
				
			||||||
 | 
					mgaPrepareComposite (int		op,
 | 
				
			||||||
 | 
							     PicturePtr		pSrcPicture,
 | 
				
			||||||
 | 
							     PicturePtr		pMaskPicture,
 | 
				
			||||||
 | 
							     PicturePtr		pDstPicture,
 | 
				
			||||||
 | 
							     PixmapPtr		pSrc,
 | 
				
			||||||
 | 
							     PixmapPtr		pMask,
 | 
				
			||||||
 | 
							     PixmapPtr		pDst)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    KdScreenPriv (pSrc->drawable.pScreen);  
 | 
				
			||||||
 | 
					    int mem_base=(int)pScreenPriv->screen->memory_base;
 | 
				
			||||||
 | 
					    int cmd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* sometimes mgaPrepareComposite is given the same pointer for Src
 | 
				
			||||||
 | 
					     * and Mask. PSrcPicture is an unsupported format (x8b8g8r8) whereas
 | 
				
			||||||
 | 
					     * pMaskPicture is supported (a8r8g8b8). We Choose to render a
 | 
				
			||||||
 | 
					     * simple blend and using pMaskPicture as the Source.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    if (pMask == pSrc) {
 | 
				
			||||||
 | 
						pMask=NULL;
 | 
				
			||||||
 | 
						pMaskPicture=NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mgaWaitIdle();
 | 
				
			||||||
 | 
					    /* Init MGA (clipping) */
 | 
				
			||||||
 | 
					    mgaSetup (pSrc->drawable.pScreen, pDst->drawable.bitsPerPixel, 5);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR1, 0); 
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR2, 0);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR3, 0);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR4, 0); 
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR5, 0); 
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR6, 0);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR7, 0);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR8, 0x10000); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Destination flags */
 | 
				
			||||||
 | 
					    mgaWaitAvail (2);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_DSTORG, ((int)pDst->devPrivate.ptr - mem_base));
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_PITCH,
 | 
				
			||||||
 | 
						       pDst->devKind / (pDst->drawable.bitsPerPixel >> 3));
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /* Source(s) flags */
 | 
				
			||||||
 | 
					    if (!PrepareSourceTexture (0, pSrcPicture, pSrc)) return FALSE;
 | 
				
			||||||
 | 
					    if (pMask != NULL)
 | 
				
			||||||
 | 
						if (!PrepareSourceTexture (1, pMaskPicture, pMask)) return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* MultiTexture modulation */
 | 
				
			||||||
 | 
					    mgaWaitAvail (2);  
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TDUALSTAGE0, MGA_TDS_COLOR_SEL_ARG1);
 | 
				
			||||||
 | 
					    if (pMask != NULL) {
 | 
				
			||||||
 | 
						if (PICT_FORMAT_A (pSrcPicture->format) == 0) {
 | 
				
			||||||
 | 
						    MGA_OUT32 (mmio, MGA_REG_TDUALSTAGE1, 
 | 
				
			||||||
 | 
							       MGA_TDS_COLOR_ARG2_PREVSTAGE | MGA_TDS_COLOR_SEL_ARG2 |
 | 
				
			||||||
 | 
							       MGA_TDS_ALPHA_SEL_ARG1);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
						    MGA_OUT32 (mmio, MGA_REG_TDUALSTAGE1, 
 | 
				
			||||||
 | 
							       MGA_TDS_COLOR_ARG2_PREVSTAGE | MGA_TDS_COLOR_SEL_ARG2 |
 | 
				
			||||||
 | 
							       MGA_TDS_ALPHA_ARG2_PREVSTAGE | MGA_TDS_ALPHA_SEL_MUL);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
						MGA_OUT32 (mmio, MGA_REG_TDUALSTAGE1, 0);    
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    cmd = MGA_OPCOD_TEXTURE_TRAP | MGA_ATYPE_RSTR | 0x000c0000 |
 | 
				
			||||||
 | 
						MGA_DWGCTL_SHIFTZERO | MGA_DWGCTL_SGNZERO | MGA_DWGCTL_ARZERO |
 | 
				
			||||||
 | 
						MGA_ATYPE_I;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    mgaWaitAvail (2);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_DWGCTL, cmd);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_ALPHACTRL, MGA_ALPHACHANNEL | mgaBlendOP[op]);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    currentSrc=pSrc;
 | 
				
			||||||
 | 
					    currentMask=pMask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mgaComposite (int	srcX,
 | 
				
			||||||
 | 
						      int	srcY,
 | 
				
			||||||
 | 
						      int	maskX,
 | 
				
			||||||
 | 
						      int	maskY,
 | 
				
			||||||
 | 
						      int	dstX,
 | 
				
			||||||
 | 
						      int	dstY,
 | 
				
			||||||
 | 
						      int	width,
 | 
				
			||||||
 | 
						      int	height)
 | 
				
			||||||
 | 
					{  
 | 
				
			||||||
 | 
					    int src_w2 = MGA_LOG2 (currentSrc->drawable.width);
 | 
				
			||||||
 | 
					    int src_h2 = MGA_LOG2 (currentSrc->drawable.height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Source positions can be outside source textures' boundaries.
 | 
				
			||||||
 | 
					     * We clamp the values here to avoid rendering glitches.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    srcX=srcX % currentSrc->drawable.width;
 | 
				
			||||||
 | 
					    srcY=srcY % currentSrc->drawable.height;
 | 
				
			||||||
 | 
					    maskX=maskX % currentMask->drawable.width;
 | 
				
			||||||
 | 
					    maskY=maskY % currentMask->drawable.height;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    mgaWaitAvail (4);
 | 
				
			||||||
 | 
					    /* Start position in the texture */
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR6, srcX<<(20-src_w2));
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR7, srcY<<(20-src_h2));
 | 
				
			||||||
 | 
					    /* Increments (1 since we aren't doing stretch blit) */
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR0, 1<<(20-src_w2));
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_TMR3, 1<<(20-src_h2));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (currentMask != NULL) {
 | 
				
			||||||
 | 
						int mask_w2 = MGA_LOG2 (currentMask->drawable.width);
 | 
				
			||||||
 | 
						int mask_h2 = MGA_LOG2 (currentMask->drawable.height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mgaWaitAvail (6);
 | 
				
			||||||
 | 
						MGA_OUT32  (mmio, MGA_REG_TEXCTL2,
 | 
				
			||||||
 | 
							    MGA_G400_TC2_MAGIC | MGA_TC2_DUALTEX | MGA_TC2_SELECT_TMU1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MGA_OUT32 (mmio, MGA_REG_TMR6, maskX<<(20-mask_w2));
 | 
				
			||||||
 | 
						MGA_OUT32 (mmio, MGA_REG_TMR7, maskY<<(20-mask_h2));
 | 
				
			||||||
 | 
						MGA_OUT32 (mmio, MGA_REG_TMR0, 1<<(20-mask_w2));
 | 
				
			||||||
 | 
						MGA_OUT32 (mmio, MGA_REG_TMR3, 1<<(20-mask_h2));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MGA_OUT32 (mmio, MGA_REG_TEXCTL2, MGA_G400_TC2_MAGIC | MGA_TC2_DUALTEX);
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    /* Destination Bounding Box
 | 
				
			||||||
 | 
					     * (Boundary Right | Boundary Left, Y dest | Height)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    mgaWaitAvail (2);
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_FXBNDRY,
 | 
				
			||||||
 | 
						       ((dstX + width) << 16) | (dstX & 0xffff));
 | 
				
			||||||
 | 
					    MGA_OUT32 (mmio, MGA_REG_YDSTLEN | MGA_REG_EXEC,
 | 
				
			||||||
 | 
						       (dstY << 16) | (height & 0xffff));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mgaDoneComposite (void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -134,7 +134,7 @@ mgaUnmapReg (KdCardInfo *card, MgaCardInfo *mgac)
 | 
				
			||||||
			   KD_MAPPED_MODE_REGISTERS);
 | 
								   KD_MAPPED_MODE_REGISTERS);
 | 
				
			||||||
	KdUnmapDevice ((void *) mgac->reg_base, MGA_REG_SIZE (card));
 | 
						KdUnmapDevice ((void *) mgac->reg_base, MGA_REG_SIZE (card));
 | 
				
			||||||
	mgac->reg_base = 0;
 | 
						mgac->reg_base = 0;
 | 
				
			||||||
	// mgac->reg = 0;
 | 
						/* mgac->reg = 0; */
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,7 +85,7 @@ mgaSetup (ScreenPtr pScreen, int dest_bpp, int wait)
 | 
				
			||||||
    return FALSE;
 | 
					    return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mgaWaitAvail (wait + 4);
 | 
					  mgaWaitAvail (wait + 4);
 | 
				
			||||||
  // Set the format of the destination pixmap
 | 
					  /* Set the format of the destination pixmap */
 | 
				
			||||||
  switch (dest_bpp) {
 | 
					  switch (dest_bpp) {
 | 
				
			||||||
  case 8:
 | 
					  case 8:
 | 
				
			||||||
    MGA_OUT32 (mmio, MGA_REG_MACCESS, MGA_PW8);
 | 
					    MGA_OUT32 (mmio, MGA_REG_MACCESS, MGA_PW8);
 | 
				
			||||||
| 
						 | 
					@ -112,7 +112,9 @@ mgaPrepareSolid (PixmapPtr pPixmap, int alu, Pixel pm, Pixel fg)
 | 
				
			||||||
    KdScreenPriv(pPixmap->drawable.pScreen);
 | 
					    KdScreenPriv(pPixmap->drawable.pScreen);
 | 
				
			||||||
    int cmd;
 | 
					    int cmd;
 | 
				
			||||||
    int dst_org;
 | 
					    int dst_org;
 | 
				
			||||||
    // We must pad pm and fg depending on the format of the destination pixmap
 | 
					    /* We must pad pm and fg depending on the format of the
 | 
				
			||||||
 | 
					     * destination pixmap 
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    switch (pPixmap->drawable.bitsPerPixel) {
 | 
					    switch (pPixmap->drawable.bitsPerPixel) {
 | 
				
			||||||
    case 16:
 | 
					    case 16:
 | 
				
			||||||
        fg |= fg << 16;
 | 
					        fg |= fg << 16;
 | 
				
			||||||
| 
						 | 
					@ -226,7 +228,7 @@ mgaDoneCopy (void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool
 | 
					static Bool
 | 
				
			||||||
mgaUploadToScreen(PixmapPtr pDst, char *src, int src_pitch) {
 | 
					mgaUploadToScreen(PixmapPtr pDst, char *src, int src_pitch) {
 | 
				
			||||||
  //fprintf(stderr,"Upload to Screen %p [%d]\n",src,src_pitch);
 | 
					  /* fprintf(stderr,"Upload to Screen %p [%d]\n",src,src_pitch); */
 | 
				
			||||||
  return TRUE;
 | 
					  return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -259,7 +261,7 @@ mgaDrawInit (ScreenPtr pScreen)
 | 
				
			||||||
	mgaKaa.Composite=mgaComposite;
 | 
						mgaKaa.Composite=mgaComposite;
 | 
				
			||||||
	mgaKaa.DoneComposite=mgaDoneComposite;
 | 
						mgaKaa.DoneComposite=mgaDoneComposite;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    //mgaKaa.UploadToScreen=mgaUploadToScreen;
 | 
					    /*mgaKaa.UploadToScreen=mgaUploadToScreen;*/
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
    if (!kaaDrawInit (pScreen, &mgaKaa))
 | 
					    if (!kaaDrawInit (pScreen, &mgaKaa))
 | 
				
			||||||
	return FALSE;
 | 
						return FALSE;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue