📄 line.cpp
字号:
/*++
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 + -