Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

247 lines
7.8 KiB

/******************************Module*Header*******************************\
* Module Name: mcdpoint.c
*
* Contains all of the point-rendering routines for the Cirrus Logic 546X MCD driver.
*
* (based on mcdpoint.c from NT4.0 DDK)
*
* Copyright (c) 1996 Microsoft Corporation
* Copyright (c) 1997 Cirrus Logic, Inc.
\**************************************************************************/
#include "precomp.h"
#include "mcdhw.h"
#include "mcdutil.h"
#include "mcdmath.h"
#define TRUNCCOORD(value, intValue)\
intValue = __MCD_VERTEX_FIXED_TO_INT(__MCD_VERTEX_FLOAT_TO_FIXED(value))
VOID FASTCALL __MCDRenderPoint(DEVRC *pRc, MCDVERTEX *a)
{
ULONG clipNum;
RECTL *pClip;
LONG lCoord;
PDEV *ppdev = pRc->ppdev;
unsigned int *pdwNext = ppdev->LL_State.pDL->pdwNext;
// output queue stuff...
DWORD *pSrc;
DWORD *pDest = ppdev->LL_State.pRegs + HOST_3D_DATA_PORT;
DWORD *pdwStart = ppdev->LL_State.pDL->pdwStartOutPtr;
DWORD dwFlags=0; // MCD_TEMP - dwflags initialized to 0
DWORD *dwOrig; /* Temp display list pointer */
DWORD dwOpcode; // Built opcode
LONG ax, ay;
if ((clipNum = pRc->pEnumClip->c) > 1) {
pClip = &pRc->pEnumClip->arcl[0];
SET_HW_CLIP_REGS(pRc,pdwNext)
pClip++;
}
// window coords are float values, and need to have
// viewportadjust (MCDVIEWPORT) values subtracted to get to real screen space
// color values are 0->1 floats and must be multiplied by scale values (MCDRCINFO)
// to get to nbits range (scale = 0xff for 8 bit, 0x7 for 3 bit, etc.)
// Z values are 0->1 floats(?) and must be multiplied by zscale(?) values (MCDRCINFO)
#if 0 // FUTURE - need to enable 3d control regs setup for texture
// Turn on alpha blending if it is required and is not already on
// Also turn it off if it is on and is not required
//
// Note: LL_ALPHA bit should be 1
//
if( (dwFlags ^ (LL_State.dwControl0>>15)) & 1 )
{
// Alpha enable is bit 15 in control0, so toggle it
//
LL_State.dwControl0 ^= 0x00008000; // bit 15
*pdwNext++ = write_register( CONTROL0_3D, 1 );
*pdwNext++ = LL_State.dwControl0;
}
#if 0 // MCD never uses alpha_mode 0
// Set up the da_main, da_ortho registers necessary for
// constant alpha blending
// ========
if( (dwFlags & LL_ALPHA) && (LL_State.Control0.Alpha_Mode == 0) )
{
// Check if a new value needs to be set
//
if( LL_State.rDA_MAIN != LL_State.AlphaConstSource ||
LL_State.rDA_ORTHO != LL_State.AlphaConstDest )
{
*(pdwNext+0) = write_register( DA_MAIN_3D, 2 );
*(pdwNext+1) = LL_State.rDA_MAIN = LL_State.AlphaConstSource;
*(pdwNext+2) = LL_State.rDA_ORTHO = LL_State.AlphaConstDest;
pdwNext += 3;
}
}
#endif
// NOTE!!! - caller (MCDPrimDrawPoints) will put this in outlist, which will be sent at end of this proc
// *pdwNext++ = write_register( Y_COUNT_3D, 1 );
// *pdwNext++ = 0;
#endif 0 // FUTURE - (end 3d control regs setup for texture)
// Store the first address for the opcode
//
dwOrig = pdwNext;
// Start with a plain point instruction (no modifiers)
// and assume same color. Count=2 for x,y
//
dwOpcode = POINT | SAME_COLOR | 2;
// Set flags as requested from the dwFlags field of a batch.
// These bits have 1-1 correspondence to their instruction
// counterparts.
//
// Flags : LL_DITHER - Use dither pattern
// LL_PATTERN - Draw pattern
// LL_STIPPLE - Use stipple mask
// LL_LIGHTING - Do lighting
// LL_Z_BUFFER - Use Z buffer
// FETCH_COLOR - Appended for alpha blending
// LL_GOURAUD - Use Gouraud shading
// LL_TEXTURE - Texture mapping
//
/*
dwOpcode |= dwFlags &
( LL_DITHER | LL_PATTERN | LL_STIPPLE
| LL_LIGHTING | LL_Z_BUFFER | FETCH_COLOR
| LL_GOURAUD | LL_TEXTURE );
*/
// no point stippling for OpenGL
dwOpcode |= pRc->privateEnables & __MCDENABLE_Z ;
dwOpcode |= pRc->privateEnables & __MCDENABLE_DITHER ;
//SNAPCOORD(a->windowCoord.x, ax);
TRUNCCOORD(a->windowCoord.x, ax);
lCoord = ax + pRc->xOffset; // adds window offset, removes a000 offset
*(pdwNext+1) = (DWORD) (lCoord << 16 );
//SNAPCOORD(a->windowCoord.y, ay);
TRUNCCOORD(a->windowCoord.y, ay);
lCoord = ay + pRc->yOffset; // adds window offset, removes a000 offset
*(pdwNext+2) = (DWORD) ((lCoord << 16) + 1);
pdwNext += 3;
if( !(dwFlags & LL_SAME_COLOR) )
{
register DWORD color;
// Clear same_color flag
//
dwOpcode ^= LL_SAME_COLOR;
*pdwNext = FTOL(a->colors[0].r * pRc->rScale);
*(pdwNext+1) = FTOL(a->colors[0].g * pRc->gScale);
*(pdwNext+2) = FTOL(a->colors[0].b * pRc->bScale);
dwOpcode += 3;
pdwNext += 3;
}
if( pRc->privateEnables & __MCDENABLE_Z)
{
*pdwNext++ = FTOL(a->windowCoord.z * pRc->zScale);
dwOpcode += 1;
}
#if 0
if( dwFlags & LL_TEXTURE )
{
...
...
...
}
#endif
if (pRc->privateEnables & (__MCDENABLE_BLEND|__MCDENABLE_FOG))
{
float v1alp;
if (pRc->privateEnables & __MCDENABLE_BLEND)
{
// recall that if both blending and fog active, all prims punted back to software
v1alp = a->colors[0].a * pRc->aScale;
}
else
{
v1alp = a->fog * (float)16777215.0; // convert from 0->1.0 val to 0->ff.ffff val
}
*pdwNext++ = FTOL(v1alp) & 0x00ffff00;// bits 31->24 and 7->0 reserved
dwOpcode += ( FETCH_COLOR | ALPHA + 1 );
}
// Store the final opcode
//
*dwOrig = dwOpcode;
while (--clipNum) {
int len = (dwOpcode & 0x3F) + 1; // num words for line primitive
SET_HW_CLIP_REGS(pRc,pdwNext)
pClip++;
// dump same pt regs again to draw while clipping against occlusion rectangle
pSrc = dwOrig;
while( len-- ) *pdwNext++ = *pSrc++;
}
// output queued data here....
#if 0 // FUTURE - enable queueing algorithm - just outputting everything for now
OUTPUT_COPROCMODE_QUEUE
#else // 0
{
pSrc = pdwStart;
while (pSrc != pdwNext)
{
/* Get the amount of data for this opcode */
int len = (*pSrc & 0x3F) + 1;
USB_TIMEOUT_FIX(ppdev)
while( len-- ) *pDest = *pSrc++;
}
}
#endif // 0
ppdev->LL_State.pDL->pdwNext = ppdev->LL_State.pDL->pdwStartOutPtr = pdwStart;
}
VOID FASTCALL __MCDRenderGenPoint(DEVRC *pRc, MCDVERTEX *pv)
{
// MGA and S3 MCD's have no code in this proc
MCDBG_PRINT("__MCDRenderGenPoint - EMPTY ROUTINE");
}