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

📄 line.cpp

📁 Sm501 VGA芯片wince下驱动代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998  Microsoft Corporation
Copyright (c) 1999-2000  Silicon Motion, Inc.

Module Name:	line.cpp

Abstract:		draws lines

Functions:

Notes:

--*/

#include "precomp.h"
#include "dispperf.h"

#ifdef DUMP_2DREG
UCHAR DP_reg1[0x60];
UCHAR DP_reg2[0x60];
int cur_reg;
#endif //DUMP_2DREG

DWORD strokedir[] = {
			FIELD_INIT(DE_CONTROL, SHORT_STROKE_DIR, 45),
			FIELD_INIT(DE_CONTROL, SHORT_STROKE_DIR, 45),
			FIELD_INIT(DE_CONTROL, SHORT_STROKE_DIR, 135),
			FIELD_INIT(DE_CONTROL, SHORT_STROKE_DIR, 135),
			FIELD_INIT(DE_CONTROL, SHORT_STROKE_DIR, 225),
			FIELD_INIT(DE_CONTROL, SHORT_STROKE_DIR, 225),
			FIELD_INIT(DE_CONTROL, SHORT_STROKE_DIR, 315),
			FIELD_INIT(DE_CONTROL, SHORT_STROKE_DIR, 315)
};

SCODE SMI::WrapLine(GPELineParms *pLineParms)
{
	DispPerfType(DISPPERF_ACCEL_GPE);
	WaitForNotBusy();
	SCODE status = EmulatedLine(pLineParms);
	return(status);
}


void SMI::SetClip(RECTL *prclBounds, short flag)
{									/*flag -1:outside 0:off 1:inside*/
	ushort ctrl;
	RECTL r;

	if (flag==1)
		ctrl=0x2000;
	else if (flag==-1)
    	ctrl=0x6000;
  	else
    {
#ifdef CMDLIST
        VALIDATE_SLOT(cmd_ptr, 6);
        
        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_CLIP_TL), 0);

        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 CLIP NULL\r\n");
#else // CMDLIST
        WaitForNotBusy();
        reg_ScissorTL = 0x0;
#endif
		return;
	}
    
    r = *prclBounds;
    
#ifdef CMDLIST
    VALIDATE_SLOT(cmd_ptr, 6);
    
    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_CLIP_BR), 
        FIELD_INIT_VAL(DE_CLIP_BR, BOTTOM, r.bottom) |
        FIELD_INIT_VAL(DE_CLIP_BR, RIGHT, r.right));
    INSERTCMD_LOADREG_D(cmd_ptr, 
        REG(DE_CLIP_TL), 
        FIELD_INIT_VAL(DE_CLIP_TL, TOP, r.top) |
        FIELD_INIT_VAL(DE_CLIP_TL, LEFT, r.left) |
        ctrl);
#else // CMDLIST
	WaitForNotBusy();
// 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
 
	ULONG	Pattern;
	ULONG	DPR=0x100000;
	Pattern = PEEK_32(DPR+0x34);
	reg_ScissorBR=(r.bottom<<16)|r.right;
	reg_ScissorTL=(r.top<<16)|(ctrl|r.left);
	reg_PatternLow=Pattern;
#endif
}


SCODE SMI::HwLine(GPELineParms *pLineParms)
{
  
	int x1 = pLineParms->xStart;
	int y1 = pLineParms->yStart;
	int xe=0, ye=0, direction;
	int width = 1, height = 1;

	DWORD cmd;
    
	SetClip(pLineParms->prclClip,1);

	if (pLineParms->dN != 0)	// not vert or horz line 
	{
		//if (m_nScreenBpp == 24)
		//{
		//	return (WrapLine(pLineParms));
		//}

		static DWORD quadrant[] = {0x03000000, 0x07000000,
								   0x05000000, 0x01000000,
								   0x00000000, 0x04000000,
								   0x06000000, 0x02000000};


		direction = quadrant[pLineParms->iDir];
		if (!(direction & 0x02000000))
		{
			if (direction & 0x04000000)
			{
				xe=x1-(pLineParms->dN>>4);
			}
			else
			{
				xe=x1-(pLineParms->dM>>4);
			}
		}

		if (!(direction & 0x01000000))
		{
			if (direction & 0x04000000)
			{
				ye=y1-(pLineParms->dM>>4);
			}
			else
			{
				ye=y1-(pLineParms->dN>>4);
			}
		}

		if (xe<0 || ye<0)
			return	WrapLine(pLineParms);

		if (pLineParms->dM == pLineParms->dN)
		{
			// diagonal line
			cmd = strokedir[pLineParms->iDir] | 0x8006800CL;

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

#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) |
                FIELD_INIT_VAL(DE_WINDOW_WIDTH, SOURCE, dstWidth)
                );
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_WINDOW_DESTINATION_BASE),
                ((SMISurf*) (pLineParms->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, x1) |
                FIELD_INIT_VAL(DE_DESTINATION, Y, y1)
                );
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_DIMENSION),
                FIELD_INIT_VAL(DE_DIMENSION, X, 1) |
                FIELD_INIT_VAL(DE_DIMENSION, Y_ET, pLineParms->cPels)
                );
            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, pLineParms->solidColor)
                );
            INSERTCMD_LOADREG_D(cmd_ptr,
                REG(DE_CONTROL), cmd
                );
            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 Diagonal Line\r\n");
            
#else
            WaitForNotBusy();
			reg_DestXY = (x1 << 16) | y1;
			reg_DimXY  = (1L << 16) | pLineParms->cPels;
			reg_RowPitch    = (dstWidth << 16) | dstWidth;
			reg_FgColor     = pLineParms->solidColor;
			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*) (pLineParms->pDst))->OffsetInVideoMemory())) |
				0);

			reg_ROPCommand = cmd;
#endif      //CMDLIST
			return(S_OK);
		}
		else
		{
			int k1=0,k2=0,et=0,w=0;

			k1 = ((2 * pLineParms->dN) + 8) >> 4;
			et = (((2 * pLineParms->dN) - pLineParms->dM) + 8) >> 4;
			k2 = ((2 * (pLineParms->dN - pLineParms->dM)) + 8) >> 4;
			w = pLineParms->cPels+1;

			cmd = quadrant[pLineParms->iDir] | 0x8007800CL;

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

#ifdef CMDLIST
            VALIDATE_SLOT(cmd_ptr, 24);
            
            INSERTCMD_STATUS(cmd_ptr,

⌨️ 快捷键说明

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