Пример #1
0
void chal_Dump(chal_t *cdev,char *name) {
	uint16_t i,bit,rix,six,pix,rv,regval,*regaddr,isdir;
	uint16_t startrix=0,endrix=0,printbit=0;
	chal_Reg_t *cr;
	chal_Pin_t cpin;
	char *color;

	_printf(_T("%sCONFIGURATION MAPPING - BASEADDR=0x%08X%s\r\n"),
		GREEN,(unsigned)cdev->baseaddr,DEFAULT_COLOR);

		// no args, print only registers and their 16-bit values
	if (name == NULL) {
		startrix=0;
		endrix 	=CHAL_MAXREG;
		printbit=_PRINT_NONE;
		goto _doprint;
	}

		// 'all': print all registers and all signals
	if (strcmp(name,"all") == 0) {
		startrix=0;
		endrix 	=CHAL_MAXREG;
		printbit=_PRINT_ALL;
		goto _doprint;
	}

		// pix: print only register and one signal
		// pix is always specified in decimal, so check that
		// it is not hex first
	if ((*name >= '0' && *name <= '9') && !(*name=='0' && *(name+1)=='x')) {
		pix = (uint16_t)mystrtoul(name,0,10);
		if (pix != 0) {
			chal_LookupByPix(cdev,pix,&cpin);
			startrix = cpin.rix;
			endrix   = cpin.rix+1;
			printbit = cpin.six;
			goto _doprint;
		}
	}

		// signal name: print only register and one signal
	rv = chal_LookupByName(cdev,name,&cpin);
	if (rv != CHAL_ERROR) {
			// name is a signal
		startrix = cpin.rix;
		endrix   = cpin.rix+1;
		printbit = cpin.six;
		goto _doprint;
	}

		// register name: print register and all its signals
	rix = chal_LookupReg(cdev,name);
	if (rix != CHAL_ERROR) {
		startrix = rix;
		endrix   = rix+1;
		printbit = _PRINT_ALL;
		DEBUG_WHERE(CYAN);
		goto _doprint;
	}

		// If we get this far, then bad argument.
	_printf(_T("%sCannot find Signal or Register %s\r\n"),RED,name);
	goto _exit;

  _doprint:

	if ( endrix > CHAL_MAXREG ) {
		endrix = CHAL_MAXREG;
	}

	for (rix=startrix;rix<endrix;++rix) {
		cr = cdev->reglist[rix];
		if (cr == NULL) continue;		// skip this register

		regaddr=(uint16_t *)( (unsigned)cdev->baseaddr+cr->offset );
		regval=*regaddr;

			// isdir used to select printing "in/out" rather than HI/LO
		isdir = (cr->type == CHAL_dir)? 2 : 0;

		_printf(_T("%s%3s REG_%s%02X [0x%08X] "),
			DEFAULT_COLOR,
			chal_Type[cr->type],
			AMBER,rix,(unsigned)cdev->baseaddr+cr->offset);

		if (regval == 0x0000 || regval == 0xFFFF) {
			color=FOREST;
		} else {
			color=GREEN;
		}
		_printf(_T("%s0x%04X%s "), color,regval,DEFAULT_COLOR);

		for (i=0;i<CHAL_NRALIAS;++i) {
			if (cr->regname[i] != 0) {
				_printf(fmt16hs,CYAN,cr->regname[i]);
			}
		}
		_printf(_T("\r\n"));

		if (printbit == _PRINT_NONE) continue;

		for (six=0;six<16;++six) {
			bit = regval & 0x1;
			regval >>= 1;
			if (*cr->signame[six][0] == 0) continue;	// skip this bit
			if (!(printbit==_PRINT_ALL || printbit==six)) continue;
			
			pix = CHAL_PIX(rix,six);
			_printf(_T("\t%s PIX_%04d (Bit_%02d) "),
				chal_Val[isdir + bit],pix,six);
			for (i=0;i<CHAL_NSALIAS;++i) {
				if (*cr->signame[six][i] != '-') {
					_printf(fmths,YELLOW,cr->signame[six][i]);
				}
			}
			_printf(_T("\r\n"));
		}
		_printf(_T("\r\n"));
	}

  _exit:
	_printf(_T("%hs\r\n"),DEFAULT_COLOR);
    return;
}
Пример #2
0
GLboolean s3vCreateContext(const __GLcontextModes *glVisual,
			   __DRIcontextPrivate *driContextPriv,
                     	   void *sharedContextPrivate)
{
	GLcontext *ctx, *shareCtx;
	__DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
	s3vContextPtr vmesa;
	s3vScreenPtr s3vScrn;
	S3VSAREAPtr saPriv=(S3VSAREAPtr)(((char*)sPriv->pSAREA) + 
                            sizeof(drm_sarea_t));
        struct dd_function_table functions;

	DEBUG_WHERE(("*** s3vCreateContext ***\n"));

	vmesa = (s3vContextPtr) CALLOC( sizeof(*vmesa) );
	if ( !vmesa ) return GL_FALSE;

	/* Allocate the Mesa context */
	if (sharedContextPrivate)
		shareCtx = ((s3vContextPtr) sharedContextPrivate)->glCtx;
	else
		shareCtx = NULL;

        _mesa_init_driver_functions(&functions);

	vmesa->glCtx = _mesa_create_context(glVisual, shareCtx, &functions,
                                            (void *)vmesa);
	if (!vmesa->glCtx) {
		FREE(vmesa);
		return GL_FALSE;
	}

	vmesa->driContext = driContextPriv;
	vmesa->driScreen = sPriv;
	vmesa->driDrawable = NULL; /* Set by XMesaMakeCurrent */

	vmesa->hHWContext = driContextPriv->hHWContext;
	vmesa->driHwLock = (drmLock *)&sPriv->pSAREA->lock;
	vmesa->driFd = sPriv->fd;
	vmesa->sarea = saPriv;

	s3vScrn = vmesa->s3vScreen = (s3vScreenPtr)(sPriv->private);

	ctx = vmesa->glCtx;

	ctx->Const.MaxTextureLevels = 11;  /* it is (11-1) -> 1024 * 1024 FIXME */

	ctx->Const.MaxTextureUnits = 1; /* FIXME: or 2 ? */

	/* No wide points.
	 */
	ctx->Const.MinPointSize = 1.0;
	ctx->Const.MinPointSizeAA = 1.0;
	ctx->Const.MaxPointSize = 1.0;
	ctx->Const.MaxPointSizeAA = 1.0;

	/* No wide lines.
	 */
	ctx->Const.MinLineWidth = 1.0;
	ctx->Const.MinLineWidthAA = 1.0;
	ctx->Const.MaxLineWidth = 1.0;
	ctx->Const.MaxLineWidthAA = 1.0;
	ctx->Const.LineWidthGranularity = 1.0;

	ctx->Const.MaxDrawBuffers = 1;

	vmesa->texHeap = mmInit( 0, vmesa->s3vScreen->textureSize );
	DEBUG(("vmesa->s3vScreen->textureSize = 0x%x\n",
		vmesa->s3vScreen->textureSize));
	
	/* NOTE */
	/* mmInit(offset, size); */

	/* allocates a structure like this:

	struct mem_block_t {
		struct mem_block_t *next;
		struct mem_block_t *heap;
		int ofs,size;
		int align;
		int free:1;
		int reserved:1;
	};

	*/

	make_empty_list(&vmesa->TexObjList);
	make_empty_list(&vmesa->SwappedOut);

	vmesa->CurrentTexObj[0] = 0;
	vmesa->CurrentTexObj[1] = 0; /* FIXME */

	vmesa->RenderIndex = ~0;

	/* Initialize the software rasterizer and helper modules.
	 */
	_swrast_CreateContext( ctx );
	_vbo_CreateContext( ctx );
	_tnl_CreateContext( ctx );
	_swsetup_CreateContext( ctx );

	/* Install the customized pipeline:
	 */
#if 0
	_tnl_destroy_pipeline( ctx );
	_tnl_install_pipeline( ctx, s3v_pipeline );
#endif
	/* Configure swrast to match hardware characteristics:
	 */
#if 0
	_swrast_allow_pixel_fog( ctx, GL_FALSE );
	_swrast_allow_vertex_fog( ctx, GL_TRUE );
#endif
	vmesa->_3d_mode = 0;

	/* 3D lines / gouraud tris */
	vmesa->CMD = ( AUTO_EXEC_ON | HW_CLIP_ON | DEST_COL_1555
			| FOG_OFF | ALPHA_OFF | Z_OFF | Z_UPDATE_OFF
			| Z_LESS | TEX_WRAP_ON | TEX_MODULATE | LINEAR
			| TEX_COL_ARGB1555 | CMD_3D );

	vmesa->_alpha[0] = vmesa->_alpha[1] = ALPHA_OFF;
	vmesa->alpha_cmd = vmesa->_alpha[0];
	vmesa->_tri[0] = DO_GOURAUD_TRI;
	vmesa->_tri[1] = DO_TEX_LIT_TRI;
	vmesa->prim_cmd = vmesa->_tri[0];

	/* printf("first vmesa->CMD = 0x%x\n", vmesa->CMD); */

	vmesa->TexOffset = vmesa->s3vScreen->texOffset;

	s3vInitVB( ctx );
	s3vInitExtensions( ctx );
	s3vInitDriverFuncs( ctx );
	s3vInitStateFuncs( ctx );
	s3vInitSpanFuncs( ctx );
	s3vInitTextureFuncs( ctx );
	s3vInitTriFuncs( ctx );
	s3vInitState( vmesa );

	driContextPriv->driverPrivate = (void *)vmesa;

	/* HACK */
	vmesa->bufSize = S3V_DMA_BUF_SZ;

	DEBUG(("vmesa->bufSize = %i\n", vmesa->bufSize));
	DEBUG(("vmesa->bufCount = %i\n", vmesa->bufCount));


	/* dma init */
	DEBUG_BUFS(("GET_FIRST_DMA\n"));
	
	vmesa->_bufNum = 0;

	GET_FIRST_DMA(vmesa->driFd, vmesa->hHWContext,
	1, &(vmesa->bufIndex[0]), &(vmesa->bufSize),
	&vmesa->_buf[0], &vmesa->bufCount, s3vScrn);

	GET_FIRST_DMA(vmesa->driFd, vmesa->hHWContext,
    1, &(vmesa->bufIndex[1]), &(vmesa->bufSize),
    &vmesa->_buf[1], &vmesa->bufCount, s3vScrn);

	vmesa->buf = vmesa->_buf[vmesa->_bufNum];
	
/*
	vmesa->CMD = (AUTO_EXEC_ON | HW_CLIP_ON | DEST_COL_1555
	| FOG_OFF | ALPHA_OFF | Z_OFF | Z_UPDATE_OFF
	| DO_GOURAUD_TRI | CMD_3D);

	vmesa->TexOffset = vmesa->s3vScreen->texOffset;
*/

/* ... but we should support only 15 bit in virge (out of 8/15/24)... */

	DEBUG(("glVisual->depthBits = %i\n", glVisual->depthBits));

	switch (glVisual->depthBits) {
	case 8:
		break;
	
	case 15:
	case 16:
		vmesa->depth_scale = 1.0f / 0xffff; 
		break;
	case 24:
		vmesa->depth_scale = 1.0f / 0xffffff;
		break;
	default:
		break;
	}

	vmesa->cull_zero = 0.0f;

	vmesa->DepthSize = glVisual->depthBits;
	vmesa->Flags  = S3V_FRONT_BUFFER;
	vmesa->Flags |= (glVisual->doubleBufferMode ? S3V_BACK_BUFFER : 0);
	vmesa->Flags |= (vmesa->DepthSize > 0 ? S3V_DEPTH_BUFFER : 0);

	vmesa->EnabledFlags = S3V_FRONT_BUFFER;
	vmesa->EnabledFlags |= (glVisual->doubleBufferMode ? S3V_BACK_BUFFER : 0);


	if (vmesa->Flags & S3V_BACK_BUFFER) {
       	vmesa->readOffset = vmesa->drawOffset = vmesa->s3vScreen->backOffset;
	} else {
	   	vmesa->readOffset = vmesa->drawOffset = 0;
	}

	s3vInitHW( vmesa );

	driContextPriv->driverPrivate = (void *)vmesa;

	return GL_TRUE;
}