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

📄 blt.cpp

📁 Sm501 VGA芯片wince下驱动代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	ULONG	m_ulSrc;
	int dstX = pBltParms->prclDst->left;
	int dstY = pBltParms->prclDst->top;
	int dimX = pBltParms->prclDst->right  - dstX;
	int dimXSave = dimX;
	int dimY = pBltParms->prclDst->bottom - dstY;
	int i=0,j=0;

	int dstWidth = ((SMISurf*) (pBltParms->pDst))->AlignedWidth();


	COLOR color = pBltParms->solidColor;
	if (pBltParms->pLookup)
		color = (pBltParms->pLookup)[color];
	if (pBltParms->pConvert)
		color = (pBltParms->pColorConverter->*(pBltParms->pConvert))(color);

	PUCHAR patBuffer = (PUCHAR) ((SMISurf *) (pBltParms->pMask))->Buffer();
	int patStride    = ((SMISurf *) (pBltParms->pMask))->Stride();
	int patWidth     = abs(patStride) * 8;
	int patLeft      = pBltParms->prclMask->left;
	int patTop       = pBltParms->prclMask->top;
	int patBottom    = pBltParms->prclMask->bottom;
	int offLeft	 	 = (patLeft & 0x07);

	patBuffer += patTop * patStride + patLeft / 8;

	int BytesPerScan  = (dimXSave + offLeft + 7) / 8;
	int Bytes4PerScan = (BytesPerScan + 3) & ~3;
	int BytesRemain	  = BytesPerScan & 3;
	int nLong = BytesPerScan & ~3;
	ULONG Pattern;
	ulong DPR = 0x100000;

#ifdef CMDLIST
    VALIDATE_SLOT(cmd_ptr, 24+(Bytes4PerScan/4+1)*dimY*2);
    
    INSERTCMD_STATUS(cmd_ptr,
        FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_ENGINE) |
        FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_FIFO) |
        FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_SETUP) |
        FIELD_GET_MASK(CMD_INTPR_STATUS, CSC_STATUS) |
        FIELD_GET_MASK(CMD_INTPR_STATUS, COMMAND_FIFO) |
        FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_MEMORY_FIFO) ,
        FIELD_INIT(CMD_INTPR_STATUS, 2D_ENGINE, IDLE) |
        FIELD_INIT(CMD_INTPR_STATUS, 2D_FIFO, EMPTY) |
        FIELD_INIT(CMD_INTPR_STATUS, 2D_SETUP, IDLE) |
        FIELD_INIT(CMD_INTPR_STATUS, CSC_STATUS, IDLE) |
        FIELD_INIT(CMD_INTPR_STATUS, COMMAND_FIFO, EMPTY) |
        FIELD_INIT(CMD_INTPR_STATUS, 2D_MEMORY_FIFO, EMPTY)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_SOURCE),
        FIELD_INIT_VAL(DE_SOURCE, X_K1, offLeft) |
        FIELD_INIT_VAL(DE_SOURCE, Y_K2, patTop)
        );
    INSERTCMD_LOADREG_D(cmd_ptr, 
        REG(DE_WINDOW_WIDTH),
        FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, dstWidth) |
        FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, dstWidth)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_WINDOW_DESTINATION_BASE),
        ((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
        );
    INSERTCMD_LOADREG_D(cmd_ptr,   
        REG(DE_PITCH),
        FIELD_INIT_VAL(DE_PITCH, DESTINATION, dstWidth) |
        FIELD_INIT_VAL(DE_PITCH, SOURCE, dstWidth)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_DESTINATION),
        FIELD_INIT_VAL(DE_DESTINATION, X, dstX) |
        FIELD_INIT_VAL(DE_DESTINATION, Y, dstY)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_DIMENSION),
        FIELD_INIT_VAL(DE_DIMENSION, X, dimX) |
        FIELD_INIT_VAL(DE_DIMENSION, Y_ET, dimY)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_FOREGROUND),
        FIELD_INIT_VAL(DE_FOREGROUND, COLOR, color)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_BACKGROUND),
        FIELD_INIT_VAL(DE_BACKGROUND, COLOR, ~color)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_COLOR_COMPARE),
        FIELD_INIT_VAL(DE_COLOR_COMPARE, COLOR, color)
        );
    
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_CONTROL),
        FIELD_INIT(DE_CONTROL, STATUS, START) |
        FIELD_INIT(DE_CONTROL, UPDATE_DESTINATION_X, DISABLE) |
        FIELD_INIT(DE_CONTROL, QUICK_START, DISABLE) |
        FIELD_INIT(DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |
        FIELD_INIT(DE_CONTROL, HOST, MONO) |
        FIELD_INIT(DE_CONTROL, COMMAND, HOST_WRITE) |
        FIELD_INIT(DE_CONTROL, ROP_SELECT, ROP2) |
        FIELD_INIT(DE_CONTROL, TRANSPARENCY_MATCH, OPAQUE) |
        FIELD_INIT(DE_CONTROL, TRANSPARENCY_SELECT, SOURCE) |
        FIELD_INIT(DE_CONTROL, TRANSPARANCY, ENABLE) |
        FIELD_INIT_VAL(DE_CONTROL, ROP, 0x0C)
        );
    
   
#else //------- CMDLIST --------
    WaitForNotBusy();
	reg_SourceXY = (offLeft << 16) | patTop;
	reg_DestXY = (dstX << 16) | dstY;
	reg_DimXY  = (dimX << 16) | dimY;
	reg_FgColor    = color;
	reg_BgColor    = ~color;
	reg_ColorCmp   = color;
// Problem is on the Xscale 64bit PCI system. Data is 
// transfering in 64bit ( 2 (32bit) sets). The 1st set has byte enable & the 2nd set doesn't have.
// Which means 2 sets of DPR registers get written if the DPR register does not have byte enble
// status check. Our DPR34 and DPR38 registers does not have byte enble status check. 
// Therefore we need to save and restore DPR34 and DPR38 every time we write to DPR30 & DPR3C. 
// FW 7/26/05
	Pattern = PEEK_32(DPR+0x38);
	reg_RowPitch    = (dstWidth << 16) | dstWidth;
	reg_WindowWidth = (dstWidth << 16) | dstWidth;
	reg_PatternHigh = Pattern;

	POKE_32(DE_WINDOW_DESTINATION_BASE,
		FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, EXT, m_SMISettings.m_bUMA) |
		FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS, 
			VgxSurfAddr(((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory())) |
		0);

	reg_ROPCommand = 0x0C
				   | USE_ROP2
				   | CMD_HOSTBLT_WRITE
				   | SOURCE_IS_MONO
				   | TRANSPARENCY_ENABLE
				   | SRC_CONTROL_TRANSP
				   | MATCH_PIXEL_OPAQUE
				   | START_DRAWING_ENGINE;
#endif //CMDLIST

//  Don't change the following code.
//  I already fixed the text corruption in ARM, strongARM and SHx platforms.
//	John 2/27/2002
	if (patStride < 0)
	{
		if (nLong)
		{
#ifdef CMDLIST
            INSERTCMD_LOADREG_E(cmd_ptr, REG(DE_DATAPORT), ( nLong/4) );
#endif
			for (i=0;i<(nLong/4);i++)
			{
				memcpy(&m_ulSrc, (patBuffer + i*4), 4);
#ifdef CMDLIST
            INSERTCMD_LOADDATA(cmd_ptr, m_ulSrc );
#else  //CMDLIST
            *(PULONG) m_pMMIO = m_ulSrc;
#endif //CMDLIST
			}
#ifdef CMDLIST
            INSERTCMD_PADQWORD(cmd_ptr, ( nLong/4) );
#endif
		}
		if (BytesRemain)
		{
			memcpy(&m_ulSrc, patBuffer + nLong, BytesRemain);
#ifdef CMDLIST
            INSERTCMD_LOADREG_D(cmd_ptr,  REG(DE_DATAPORT), m_ulSrc );
#else  //CMDLIST
            *(PULONG) m_pMMIO = m_ulSrc;
#endif //CMDLIST
		}
		patBuffer += patStride;
	}

#ifdef CMDLIST
    if (dimY>1) //aviod INSERTCMD_LOADREG_E() with counter 0 which cause hang
        INSERTCMD_LOADREG_E(cmd_ptr, REG(DE_DATAPORT), ((dimY-1)*(Bytes4PerScan/4)) );
#endif
	for (i = 1; i < dimY; i++)
	{
		for (j=0;j<(Bytes4PerScan/4);j++)
		{
			memcpy(&m_ulSrc, patBuffer+j*4, 4);
#ifdef CMDLIST
            INSERTCMD_LOADDATA(cmd_ptr, m_ulSrc );
#else  //CMDLIST
            *(PULONG) m_pMMIO = m_ulSrc;
#endif //CMDLIST
        }
		patBuffer += patStride;
	}
#ifdef CMDLIST
    INSERTCMD_PADQWORD(cmd_ptr, ((dimY-1)*(Bytes4PerScan/4)) );
#endif

	if (patStride > 0)
	{
		if (nLong)
		{
#ifdef CMDLIST
            INSERTCMD_LOADREG_E(cmd_ptr, REG(DE_DATAPORT), ( nLong/4) );
#endif
			for (i=0;i<(nLong/4);i++)
			{
				memcpy(&m_ulSrc, (patBuffer + i*4), 4);
#ifdef CMDLIST
            INSERTCMD_LOADDATA(cmd_ptr, m_ulSrc );
#else  //CMDLIST
            *(PULONG) m_pMMIO = m_ulSrc;
#endif //CMDLIST
			}
#ifdef CMDLIST
            INSERTCMD_PADQWORD(cmd_ptr, ( nLong/4) );
#endif
		}
		if (BytesRemain)
		{
			memcpy(&m_ulSrc, patBuffer + nLong, BytesRemain);
#ifdef CMDLIST
            INSERTCMD_LOADREG_D(cmd_ptr,  REG(DE_DATAPORT), m_ulSrc );
#else  //CMDLIST
            *(PULONG) m_pMMIO = m_ulSrc;
#endif //CMDLIST
		}
	}

#ifdef CMDLIST
    INSERTCMD_FINISH(cmd_ptr, 0);
    
    STOP_CI();
    WAIT_CI_STOP();
    
    INSERTCMD_NOP(last_finish_ptr);
    
    last_finish_ptr = cmd_ptr - CMD_STRIDE_DWORD;
    
    FLUSH_CMD();

    START_CI("CMDList TextOut\r\n");
#endif //CMDLIST

    return(S_OK);
}


SCODE SMI::DestBlt(GPEBltParms *pBltParms)
{
	if (pBltParms->rop4 == 0xAAAA)
		return(S_OK);

	RECTL rectl;
	ULONG Pattern;
	ulong DPR = 0x100000;

	rectl.left = pBltParms->prclDst->left;
	rectl.top = pBltParms->prclDst->top;
	rectl.right = pBltParms->prclDst->right;
	rectl.bottom = pBltParms->prclDst->bottom;
	
	// This function is to calculate rectangle coordinate
	// during rotation, otherwise it is a dummy function
	RotateRectl(&rectl);

	int dstX = rectl.left;
	int dstY = rectl.top;
	int dimX = rectl.right - dstX;
	int dimY = rectl.bottom - dstY;

	int dstWidth = ((SMISurf*) (pBltParms->pDst))->AlignedWidth();

#ifdef CMDLIST
    VALIDATE_SLOT(cmd_ptr, 16);
    
    INSERTCMD_STATUS(cmd_ptr,
        FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_ENGINE) |
        FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_FIFO) |
        FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_SETUP) |
        FIELD_GET_MASK(CMD_INTPR_STATUS, CSC_STATUS) |
        FIELD_GET_MASK(CMD_INTPR_STATUS, COMMAND_FIFO) |
        FIELD_GET_MASK(CMD_INTPR_STATUS, 2D_MEMORY_FIFO) ,
        FIELD_INIT(CMD_INTPR_STATUS, 2D_ENGINE, IDLE) |
        FIELD_INIT(CMD_INTPR_STATUS, 2D_FIFO, EMPTY) |
        FIELD_INIT(CMD_INTPR_STATUS, 2D_SETUP, IDLE) |
        FIELD_INIT(CMD_INTPR_STATUS, CSC_STATUS, IDLE) |
        FIELD_INIT(CMD_INTPR_STATUS, COMMAND_FIFO, EMPTY) |
        FIELD_INIT(CMD_INTPR_STATUS, 2D_MEMORY_FIFO, EMPTY)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,   
        REG(DE_PITCH),
        FIELD_INIT_VAL(DE_PITCH, DESTINATION, dstWidth) |
        FIELD_INIT_VAL(DE_PITCH, SOURCE, dstWidth)
        );
    INSERTCMD_LOADREG_D(cmd_ptr, 
        REG(DE_WINDOW_WIDTH),
        FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, dstWidth) |
        FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, dstWidth)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_WINDOW_DESTINATION_BASE),
        ((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory()
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_DESTINATION),
        FIELD_INIT_VAL(DE_DESTINATION, X, dstX) |
        FIELD_INIT_VAL(DE_DESTINATION, Y, dstY)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_DIMENSION),
        FIELD_INIT_VAL(DE_DIMENSION, X, dimX) |
        FIELD_INIT_VAL(DE_DIMENSION, Y_ET, dimY)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_CONTROL),
        FIELD_INIT(DE_CONTROL, STATUS, START) |
        FIELD_INIT(DE_CONTROL, UPDATE_DESTINATION_X, DISABLE) |
        FIELD_INIT(DE_CONTROL, QUICK_START, DISABLE) |
        FIELD_INIT(DE_CONTROL, DIRECTION, LEFT_TO_RIGHT) |
        FIELD_INIT(DE_CONTROL, COMMAND, BITBLT) |
        FIELD_INIT(DE_CONTROL, ROP_SELECT, ROP3) |
        FIELD_INIT(DE_CONTROL, TRANSPARANCY, DISABLE) |
        FIELD_INIT_VAL(DE_CONTROL, ROP, (pBltParms->rop4 & 0xFF))
        );
    INSERTCMD_FINISH(cmd_ptr, 0);
    
    STOP_CI();

    WAIT_CI_STOP();
    
    INSERTCMD_NOP(last_finish_ptr);
    
    last_finish_ptr = cmd_ptr - CMD_STRIDE_DWORD;
    
    FLUSH_CMD();

    START_CI("CMDList DestBlt\r\n");

#else //CMDLIST
    WaitForNotBusy();
	reg_DestXY = (dstX << 16) | dstY;
	reg_DimXY  = (dimX << 16) | dimY;
// Problem is on the Xscale 64bit PCI system. Data is 
// transfering in 64bit ( 2 (32bit) sets). The 1st set has byte enable & the 2nd set doesn't have.
// Which means 2 sets of DPR registers get written if the DPR register does not have byte enble
// status check. Our DPR34 and DPR38 registers does not have byte enble status check. 
// Therefore we need to save and restore DPR34 and DPR38 every time we write to DPR30 & DPR3C. 
// FW 7/26/05
	Pattern = PEEK_32(DPR+0x38);
	reg_RowPitch    = (dstWidth << 16) | dstWidth;
	reg_WindowWidth = (dstWidth << 16) | dstWidth;
	reg_PatternHigh = Pattern;
	POKE_32(DE_WINDOW_DESTINATION_BASE,
		FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, EXT, m_SMISettings.m_bUMA) |
		FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE, ADDRESS, 
			VgxSurfAddr(((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory())) |
		0);

	reg_ROPCommand = (pBltParms->rop4 & 0xFF)
				   | CMD_BITBLT
				   | START_DRAWING_ENGINE;
#endif //CMDLIST
	return(S_OK);
}

struct BLTRECT
{
	RECTL	rDest;
	RECTL   rSrc;
	RECTL   rOrigDest;
	RECTL   rOrigSrc;
};

SCODE SMI::SrcCopyHost(GPEBltParms *pBltParms)
{

//	RETAILMSG(1, (_T("SMI:: +SrcCopy\r\n")));
    BYTE abyRemain[8] = {0,0,0,0,0,0,0,0};
	int i,j;
	ULONG m_ulSrc;
	DWORD dwTransp = 0;
	COLOR color;
	ULONG Pattern;
	ulong DPR = 0x100000;

	int srcX = pBltParms->prclSrc->left;
	int srcY = pBltParms->prclSrc->top;
	int dstX = pBltParms->prclDst->left;
	int dstY = pBltParms->prclDst->top;
	int dimX = pBltParms->prclDst->right - dstX;
	int dimY = pBltParms->prclDst->bottom - dstY;
	int dstWidth = ((SMISurf*) (pBltParms->pDst))->AlignedWidth();

	PUCHAR pSrcBuffer = (PUCHAR) pBltParms->pSrc->Buffer();
	int srcStride = pBltParms->pSrc->Stride();
	int srcBpp = EGPEFormatToBpp[pBltParms->pSrc->Format()];
	pSrcBuffer += srcY * srcStride + srcX * srcBpp / 8;

	int BytesPerScan  = dimX * srcBpp / 8;
	int Bytes8PerScan = (BytesPerScan + 7) & ~7;
	int BytesRemain	  = BytesPerScan & 7;
	int nLong = BytesPerScan & ~7;

	if (pBltParms->bltFlags & BLT_TRANSPARENT)
	{

⌨️ 快捷键说明

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