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

📄 blt.cpp

📁 Sm501 VGA芯片wince下驱动代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			  		(TEXT("-Stretch BLT flags NOT supported\r\n")));
				if ((pBltParms->rop4 == 0xCCCC))// && !(pBltParms->bltFlags & BLT_TRANSPARENT))
				{
					//pBltParms->pBlt = GPETYPE CSCSrcCopy;
				}
				break;
			}

			DEBUGMSG(GPE_ZONE_BLT_LO, (TEXT("+SRCCOPY\r\n")));

			if ((pBltParms->rop4 == 0xCCCC)) // && !(pBltParms->bltFlags & BLT_TRANSPARENT))
			{
				//pBltParms->pBlt = GPETYPE CSCSrcCopy;
			}

			if (rev() != 0xA0)
				pBltParms->pBlt = GPETYPE &SMI::SrcCopy;

			break;

		default:
			DEBUGMSG(GPE_ZONE_BLT_HI,
					(TEXT("-rop4=0x%04X not supported\r\n"),
					pBltParms->rop4));
			break;
	}

	if (pBltParms->pBlt != &SMI::WrapBlt) 
	{
		DispPerfType(DISPPERF_ACCEL_HARDWARE);
	}

	return(S_OK);	
}

SCODE SMI::BltComplete(GPEBltParms *pBltParms)
{
	DispPerfEnd(0);
	return(S_OK);
}

SCODE SMI::FillRect(GPEBltParms *pBltParms)
{
	RECTL rectl;

	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;
	ulong bpp = 0x00130003;
	ulong cmd = 0x8001;
	ulong DPR = 0x100000;

	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);

#ifdef CMDLIST
    VALIDATE_SLOT(cmd_ptr, 22);
    
    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_WINDOW_WIDTH),
        FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, 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)
        );
    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_MONO_PATTERN_LOW),
        FIELD_INIT_VAL(DE_MONO_PATTERN_LOW, PATTERN, 0xFFFFFFFF)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_MONO_PATTERN_HIGH),
        FIELD_INIT_VAL(DE_MONO_PATTERN_HIGH, PATTERN, 0xFFFFFFFF)
        );
    INSERTCMD_LOADREG_D(cmd_ptr,
        REG(DE_FOREGROUND),
        FIELD_INIT_VAL(DE_FOREGROUND, 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, 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 FillRect\r\n");
    
#else
    WaitForNotBusy();
	reg_DestXY = (dstX << 16) | dstY;
	reg_DimXY  = (dimX << 16) | dimY;
	reg_FgColor     = color;
	reg_RowPitch    = (dstWidth << 16) | dstWidth;
	reg_WindowWidth = (dstWidth << 16) | dstWidth;
	reg_PatternLow  = 0xFFFFFFFF;
	reg_PatternHigh = 0xFFFFFFFF;

	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
				   | MONO_PATTERN
				   | START_DRAWING_ENGINE;

#endif //CMDLIST
/*
  	switch(m_nScreenBpp/8)
    {
  		case 1: bpp = 0x00030003; break;
 		case 2: bpp = 0x00130003; break;
  		case 3: bpp = 0x00340003; break;
		case 4: bpp = 0x00230003; break;
	}

	WaitForFIFO(10);
  	WaitForNotBusy();
	POKE_32(DPR+0x04, (dstX << 16) | dstY);
 	POKE_32(DPR+0x08, (dimX << 16) | dimY);
	POKE_32(DPR+0x10, (dstWidth << 16) | dstWidth);
  	POKE_32(DPR+0x14, color);
  	POKE_32(DPR+0x1C, bpp);
  	POKE_32(DPR+0x34, 0xFFFFFFFF);
  	POKE_32(DPR+0x38, 0xFFFFFFFF);
  	POKE_32(DPR+0x3C, (dstWidth << 16) | dstWidth);
  	POKE_32(DPR+0x44, ((SMISurf*) (pBltParms->pDst))->OffsetInVideoMemory());
  	POKE_32(DPR+0x0c, (cmd << 16)| 0x800c);
*/
	return(S_OK);
}

SCODE SMI::PatFill(GPEBltParms *pBltParms)
{
	if (!(pBltParms->xPositive && pBltParms->yPositive))
		return WrapBlt(pBltParms);

	int patX = (pBltParms->pptlBrush)?((pBltParms->pptlBrush->x+0) & 7):0;
	int patY = (pBltParms->pptlBrush)?((pBltParms->pptlBrush->y+0) & 7):0;
	PUCHAR pvPattern = (PUCHAR)(pBltParms->pBrush->Buffer());
	UCHAR ajPattern[8 * 8 * 4];
	ULONG m_ulSrc;
	ULONG Pattern;
	ulong DPR = 0x100000;


	if ((patX || patY) ||
		(pBltParms->pBrush->Stride() != (int)m_nScreenBpp))
	{
		RotateBrush(pBltParms->pBrush, ajPattern, patX, patY);
		pvPattern = ajPattern;
	}

#ifdef CMDLIST
    VALIDATE_SLOT(cmd_ptr, (6+m_nScreenBpp*2+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_CONTROL),
        FIELD_INIT(DE_CONTROL, PATTERN, COLOR) 
        );
    INSERTCMD_LOADREG_E(cmd_ptr, REG(DE_DATAPORT), ( m_nScreenBpp * 2) );
#else //CMDLIST
    WaitForNotBusy();
	// Dummy Code to make the function work correctly.
	// Don't comment the following code reg_ROPCommand = COLOR_PATTERN;
	// John Huang 03/14/2002
	reg_ROPCommand = COLOR_PATTERN;
	// memcpy(m_pMMIO + 0x0000, pvPattern, m_nScreenBpp * 8);
#endif // CMDLIST
    for (UINT i = 0; i < m_nScreenBpp * 2; i++)
    {
        m_ulSrc = *(PULONG)pvPattern;
#ifdef CMDLIST
        INSERTCMD_LOADDATA(cmd_ptr, m_ulSrc );
#else  //CMDLIST
        *((PULONG) (m_pMMIO)+i) = m_ulSrc;
#endif //CMDLIST
        pvPattern += 4;
	}

	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();

#ifdef CMDLIST
    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_WINDOW_WIDTH),
        FIELD_INIT_VAL(DE_WINDOW_WIDTH, DESTINATION, 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)
        );
    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, PATTERN, COLOR) |
        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 PatFill\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
				   | COLOR_PATTERN
				   | START_DRAWING_ENGINE;
#endif // CMDLIST

	return(S_OK);
}

void SMI::RotateBrush(GPESurf *pBrush, UCHAR *pjPattern, int patX, int patY)
{
	DEBUGMSG(GPE_ZONE_ENTER, (TEXT("RotateBrush\r\n")));

	PUCHAR pjPatByte = (UCHAR *) pBrush->Buffer();

	WaitForNotBusy();
	switch (pBrush->Format())
	{
		case gpe8Bpp:
		{
			for (int y = 0; y < 8; y++)
			{
				PUCHAR pjBuffer = pjPattern + ((patY + y) & 7) * 8;
				for (int x = 0; x < 8; x++)
				{
					pjBuffer[(patX + x) & 7] = pjPatByte[x];
				}
				pjPatByte += pBrush->Stride();
			}
			break;
		}

		case gpe16Bpp:
		{
			for (int y = 0; y < 8; y++)
			{
				PUSHORT pjBuffer = (PUSHORT) pjPattern + ((patY + y) & 7) * 8;
				for (int x = 0; x < 8; x++)
				{
					pjBuffer[(patX + x) & 7] = ((PUSHORT) pjPatByte)[x];
				}
				pjPatByte += pBrush->Stride();
			}
			break;
		}

		case gpe32Bpp:
		{
			for (int y = 0; y < 8; y++)
			{
				PULONG pjBuffer = (PULONG) pjPattern + ((patY + y) & 7) * 8;
				for (int x = 0; x < 8; x++)
				{
					pjBuffer[(patX + x) & 7] = ((PULONG) pjPatByte)[x];
				}
				pjPatByte += pBrush->Stride();
			}
			break;
		}
	}
}

SCODE SMI::MaskedImage(GPEBltParms *pBltParms)
{

⌨️ 快捷键说明

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