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.
 
 
 
 
 
 

634 lines
21 KiB

/******************************Module*Header***********************************\
*
* *******************
* * GDI SAMPLE CODE *
* *******************
*
* Module Name: hw.h
*
* All the hardware defines and typedefs.
*
* Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
* Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved.
*
\******************************************************************************/
#ifndef _HW_H_
#define _HW_H_
#include "p2def.h"
//
// Texture memory allocation macros and structures are in 3DPrivTx.h
//
//
// Definition of handle to a memory region
//
typedef LONG HMEMREGION;
typedef LONG HMEMCACHE;
typedef enum
{
RESIDENCY_NOTLOADED,
RESIDENCY_PERMANENT,
RESIDENCY_TRANSIENT,
RESIDENCY_HOST
} MEM_MGR_RESIDENCY;
//
// Extern declarations
//
extern DWORD LogicopReadDest[]; // Indicates which logic ops need dest
// read turned on
extern DWORD ConfigReadDest[];
extern UCHAR LBWidthBits[];
//
// Definition of counter data area for performance counters (PERFCTR)
//
extern PVOID pCounterBlock;
//
// Values for flags in HwDataRec
//
typedef enum
{
GLICAP_NT_CONFORMANT_LINES = 0x00000001, // draw NT conformant lines
GLICAP_HW_WRITE_MASK = 0x00000002, // hardware planemasking
};
typedef int PERMEDIA2_CAPS;
//
// SCISSOR stuff
//
#define SCREEN_SCISSOR_DEFAULT (0 << 1)
#define SCISSOR_MAX 2047 // Maximum scissor size in P2
//
// PCI device information. Used in an IOCTL return. Ensure this is the same
// as in the miniport drivers permedia.h
//
typedef struct _Hw_Device_Info
{
ULONG SubsystemId;
ULONG SubsystemVendorId;
ULONG VendorId;
ULONG DeviceId;
ULONG RevisionId;
ULONG DeltaRevId;
ULONG GammaRevId;
ULONG BoardId;
ULONG LocalbufferLength;
LONG LocalbufferWidth;
ULONG ActualDacId;
} Hw_Device_Info;
typedef struct tagP2CtxtRec *P2CtxtPtr;
typedef struct _hw_data
{
DWORD renderBits; // Saved render bits set by setup routines
DWORD FBWriteMode; // Software copy of FBWriteMode register
DWORD RasterizerMode; // Software copy of the rasterizer mode
DWORD FBPacking; // Software copy of FBModeSel
DWORD FBBlockColor; // Software copy of FBBlockColor (P1 only)
DWORD TextureAddressMode; // Software copy of TextureAddressMode
// (P2 only)
DWORD TextureReadMode; // Software copy of TextureReadMode
// (P2 only)
ULONG currentCSbuffer; // Color space buffer being displayed
PERMEDIA2_CAPS flags; // Various flags
P2CtxtPtr pGDICtxt; // id of the display driver's context for
// this board
LONG PixelOffset; // Last DFB pixel offset
ULONG PerfScaleShift;
PVOID ContextTable; // Array of extant contexts
P2CtxtPtr pCurrentCtxt; // id of this board's current context
union
{
UCHAR _clutBuffer[MAX_CLUT_SIZE];
VIDEO_CLUT gammaLUT; // Saved gamma LUT contents
};
//
// PCI configuration id information
//
Hw_Device_Info deviceInfo;
} HwDataRec, *HwDataPtr;
#define TRANSLATE_ADDR_ULONG(a) (a) //TODO: should be removed in pointer.c
//
// If we have a sparsely mapped framebuffer then we use the xx_REGISTER_ULONG()
// macros, otherwise we just access the framebuffer.
//
#define READ_SCREEN_ULONG(a)\
((ppdev->flCaps & CAPS_SPARSE_SPACE) ?\
(READ_REGISTER_ULONG(a)) : *((ULONG volatile *)(a)))
#define WRITE_SCREEN_ULONG(a,d)\
((ppdev->flCaps & CAPS_SPARSE_SPACE) ?\
(WRITE_REGISTER_ULONG(a,d)) : (*((ULONG volatile *)(a)) = (d)))
//
// Generic macros to access Permedia 2 FIFO and non-FIFO control registers.
// We do nothing sophisticated for the Alpha. We just MEMORY_BARRIER
// everything.
//
#define LD_PERMEDIA_REG(x,y) \
{ \
WRITE_REGISTER_ULONG(&(ppdev->pCtrlBase[x/sizeof(ULONG)]),y); \
MEMORY_BARRIER();\
}
#define READ_PERMEDIA_REG(x) \
READ_REGISTER_ULONG(&(ppdev->pCtrlBase[x/sizeof(ULONG)]))
#define READ_PERMEDIA_FIFO_REG(uiTag, d) \
((d) = READ_REGISTER_ULONG(&(ppdev->pCoreBase[uiTag*2])))
#define READ_FIFO_REG(uiTag)\
READ_REGISTER_ULONG(&ppdev->pCoreBase[uiTag*2])
//
// Local variables for all functions that access PERMEDIA 2. Generally we
// use PERMEDIA_DECL. Sometimes we have to split it up if ppdev isn't
// passed into the routine.
//
#define PERMEDIA_DECL_VARS \
HwDataPtr permediaInfo;
#define PERMEDIA_DECL_INIT \
permediaInfo = (HwDataPtr)(ppdev->permediaInfo);
#define PERMEDIA_DECL \
PERMEDIA_DECL_VARS; \
PERMEDIA_DECL_INIT
// TODO: move to debug???
#if DBG
VOID vCheckDefaultState(P2DMA * pP2dma);
#define P2_CHECK_STATE vCheckDefaultState(ppdev->pP2dma)
#else
#define P2_CHECK_STATE
#endif
//
// Pointer interrupts not enabled so just provide stub definitions
//
#define SYNCHRONOUS_WRITE_ULONG(var, value)
#define SYNCHRONOUS_WRITE_INDIRECT_ULONG(pvar, value)
#define GET_INTR_CMD_BLOCK_MUTEX
#define RELEASE_INTR_CMD_BLOCK_MUTEX
//
// FIFO functions
//
#define MAX_P2_FIFO_ENTRIES 256
#define P2_DEFAULT_FB_DEPTH P2_SET_FB_DEPTH(ppdev->cPelSize)
#define P2DEPTH8 0
#define P2DEPTH16 1
#define P2DEPTH32 2
//
// External interface to the context switching code. The caller can allocate and
// free a context or ask for a switch to a new context. vSwitchContext
// should not be called except through the given macro. The macro assumes
// that ppdev has been defined.
//
typedef enum
{
P2CtxtReadWrite,
P2CtxtWriteOnly,
P2CtxtUserFunc
} P2CtxtType;
P2CtxtPtr P2AllocateNewContext(PPDev ppdev,
DWORD *pReglist,
LONG lEntries,
P2CtxtType dwCtxtType=P2CtxtReadWrite
);
VOID P2FreeContext (PPDev, P2CtxtPtr);
VOID P2SwitchContext(PPDev, P2CtxtPtr);
//
// Macro used by display driver to validate its context
//
#define VALIDATE_GDI_CONTEXT \
P2_VALIDATE_CONTEXT(permediaInfo->pGDICtxt)
//
// Useful macros not defined in standard Permedia 2 header files. Generally, for
// speed we don't want to use the bitfield structures so we define the bit
// shifts to get at the various fields.
//
#define INTtoFIXED(i) ((i) << 16) // int to 16.16 fixed format
#define FIXEDtoINT(i) ((i) >> 16) // 16.16 fixed format to int
#define INTofFIXED(i) ((i) & 0xffff0000) // int part of 16.16
#define FRACTofFIXED(i) ((i) & 0xffff) // fractional part of 16.16
#define FIXtoFIXED(i) ((i) << 12) // 12.4 to 16.16
#define FIXtoINT(i) ((i) >> 4) // 28.4 to 28
#define __PERMEDIA_CONSTANT_FB_WRITE (1 << (4+1))
#define __COLOR_DDA_FLAT_SHADE (__PERMEDIA_ENABLE | \
(__PERMEDIA_FLAT_SHADE_MODE << 1))
#define __COLOR_DDA_GOURAUD_SHADE (__PERMEDIA_ENABLE | \
(__PERMEDIA_GOURAUD_SHADE_MODE << 1))
#define INVERT_BITMASK_BITS (1 << 1)
#define BYTESWAP_BITMASK (3 << 7)
#define FORCE_BACKGROUND_COLOR (1 << 6) // Permedia only
//
// Bits in the Render command
//
#define __RENDER_INCREASE_Y (1 << 22)
#define __RENDER_INCREASE_X (1 << 21)
#define __RENDER_VARIABLE_SPANS (1 << 18)
#define __RENDER_REUSE_BIT_MASK (1 << 17)
#define __RENDER_TEXTURE_ENABLE (1 << 13)
#define __RENDER_SYNC_ON_HOST_DATA (1 << 12)
#define __RENDER_SYNC_ON_BIT_MASK (1 << 11)
#define __RENDER_RECTANGLE_PRIMITIVE (__PERMEDIA_RECTANGLE_PRIMITIVE << 6)
#define __RENDER_TRAPEZOID_PRIMITIVE (__PERMEDIA_TRAPEZOID_PRIMITIVE << 6)
#define __RENDER_LINE_PRIMITIVE (__PERMEDIA_LINE_PRIMITIVE << 6)
#define __RENDER_POINT_PRIMITIVE (__PERMEDIA_POINT_PRIMITIVE << 6)
#define __RENDER_FAST_FILL_INC(n) (((n) >> 4) << 4) // n = 8, 16 or 32
#define __RENDER_FAST_FILL_ENABLE (1 << 3)
#define __RENDER_RESET_LINE_STIPPLE (1 << 2)
#define __RENDER_LINE_STIPPLE_ENABLE (1 << 1)
#define __RENDER_AREA_STIPPLE_ENABLE (1 << 0)
//
// Bits in the ScissorMode register
//
#define USER_SCISSOR_ENABLE (1 << 0)
#define SCREEN_SCISSOR_ENABLE (1 << 1)
#define SCISSOR_XOFFSET 0
#define SCISSOR_YOFFSET 16
//
// Bits in the FBReadMode register
//
#define __FB_READ_SOURCE (1 << 9)
#define __FB_READ_DESTINATION (1 << 10)
#define __FB_COLOR (1 << 15)
#define __FB_WINDOW_ORIGIN (1 << 16)
#define __FB_PACKED_DATA (1 << 19)
//
// Extra bits in PERMEDIA FBReadMode
//
#define __FB_RELATIVE_OFFSET 20
//
// P2 also provides a version of Relative Offset in the PackedDataLimits
// register
//
#define __PDL_RELATIVE_OFFSET 29
//
// Bits in the LBReadMode register
//
#define __LB_READ_SOURCE (1 << 9)
#define __LB_READ_DESTINATION (1 << 10)
#define __LB_STENCIL (1 << 16)
#define __LB_DEPTH (1 << 17)
#define __LB_WINDOW_ORIGIN (1 << 18)
#define __LB_READMODE_PATCH (1 << 19)
#define __LB_SCAN_INTERVAL_2 (1 << 20)
//
// Bits in the DepthMode register
//
#define __DEPTH_ENABLE 1
#define __DEPTH_WRITE_ENABLE (1<<1)
#define __DEPTH_REGISTER_SOURCE (2<<2)
#define __DEPTH_MSG_SOURCE (3<<2)
#define __DEPTH_ALWAYS (7<<4)
//
// Bits in the LBReadFormat/LBWriteFormat registers
//
#define __LB_FORMAT_DEPTH32 2
//
// Macros to load indexed tags more efficiently than using __HwDMATag struct
//
#define P2_TAG_MAJOR(x) ((x) & 0xff0)
#define P2_TAG_MINOR(x) ((x) & 0x00f)
#define P2_TAG_MAJOR_INDEXED(x) \
((__PERMEDIA_TAG_MODE_INDEXED << (5+4+1+4)) | P2_TAG_MAJOR(x))
#define P2_TAG_MINOR_INDEX(x) \
(1 << (P2_TAG_MINOR(x) + 16))
//
// Macro to take a permedia2 logical op and return the enabled LogcialOpMode bits
//
#define P2_ENABLED_LOGICALOP(op) (((op) << 1) | __PERMEDIA_ENABLE)
#define RECTORIGIN_YX(y,x) (((y) << 16) | ((x) & 0xFFFF))
//
// Area stipple shifts and bit defines
//
#define AREA_STIPPLE_XSEL(x) ((x) << 1)
#define AREA_STIPPLE_YSEL(y) ((y) << 4)
#define AREA_STIPPLE_XOFF(x) ((x) << 7)
#define AREA_STIPPLE_YOFF(y) ((y) << 12)
#define AREA_STIPPLE_INVERT_PAT (1 << 17)
#define AREA_STIPPLE_MIRROR_X (1 << 18)
#define AREA_STIPPLE_MIRROR_Y (1 << 19)
//
// We always use 8x8 monochrome brushes.
//
#define AREA_STIPPLE_8x8_ENABLE \
(__PERMEDIA_ENABLE | \
AREA_STIPPLE_XSEL(__PERMEDIA_AREA_STIPPLE_8_PIXEL_PATTERN) | \
AREA_STIPPLE_YSEL(__PERMEDIA_AREA_STIPPLE_8_PIXEL_PATTERN))
//
// RasteriserMode values
//
#define BIAS_NONE (__PERMEDIA_START_BIAS_ZERO << 4)
#define BIAS_HALF (__PERMEDIA_START_BIAS_HALF << 4)
#define BIAS_NEARLY_HALF (__PERMEDIA_START_BIAS_ALMOST_HALF << 4)
#define FRADJ_NONE (__PERMEDIA_FRACTION_ADJUST_NONE << 2)
#define FRADJ_ZERO (__PERMEDIA_FRACTION_ADJUST_TRUNC << 2)
#define FRADJ_HALF (__PERMEDIA_FRACTION_ADJUST_HALF << 2)
#define FRADJ_NEARLY_HALF (__PERMEDIA_FRACTION_ADJUST_ALMOST_HALF << 2)
//
// Some constants
//
#define ONE 0x00010000
#define MINUS_ONE 0xFFFF0000
#define PLUS_ONE ONE
#define NEARLY_ONE 0x0000FFFF
#define HALF 0x00008000
#define NEARLY_HALF 0x00007FFF
//
// Max length of GIQ conformant lines that Permedia2 can draw
// Permedia has only 15 bits of fraction so reduce the lengths.
//
#define MAX_LENGTH_CONFORMANT_NONINTEGER_LINES (16/2)
#define MAX_LENGTH_CONFORMANT_INTEGER_LINES (194/2)
//
// We need to byte swap monochrome bitmaps. On 486 we can do this with
// fast assembler.
//
#if defined(_X86_)
//
// This only works on a 486 so the driver won't run on a 386.
//
#define LSWAP_BYTES(dst, pSrc) \
{ \
__asm mov eax, pSrc \
__asm mov eax, [eax] \
__asm bswap eax \
__asm mov dst, eax \
}
#else
#define LSWAP_BYTES(dst, pSrc) \
{ \
ULONG _src = *(ULONG *)pSrc; \
dst = ((_src) >> 24) | \
((_src) << 24) | \
(((_src) >> 8) & 0x0000ff00) | \
(((_src) << 8) & 0x00ff0000); \
}
#endif
// macro to swap the Red and Blue component of a 32 bit dword
//
#define SWAP_BR(a) ((a & 0xff00ff00l) | \
((a&0xff0000l)>> 16) | \
((a & 0xff) << 16))
//
// min. and max. values for Permedia PP register
#define MAX_PARTIAL_PRODUCT_P2 10
#define MIN_PARTIAL_PRODUCT_P2 5
//
// Permedia2 DMA definitions
//
#include "mini.h"
// structure definitions passed in by the application for mapping and
// unmapping DMA buffers.
//
//
// Registry variable names
//
#define REG_USE_SOFTWARE_WRITEMASK L"UseSoftwareWriteMask"
//
// Function declarations
//
VOID vDoMonoBitsDownload(PPDev, BYTE*, LONG, LONG, LONG, LONG);
BOOL bInitializeHW(PPDev);
VOID vDisableHW(PPDev);
VOID vAssertModeHW(PPDev, BOOL);
VOID vP2ChangeFBDepth(PPDev, ULONG);
//
// Calculate the packed partial products
//
VOID vCalcPackedPP(LONG width, LONG * outPitch, ULONG * outPackedPP);
VOID vSetNewGammaValue(PPDev ppdev, ULONG ulgvFIX16_16);
BOOL bInstallGammaLUT(PPDev ppdev, PVIDEO_CLUT pScreenClut);
//
// The following structures and macros define the memory map for the Permedia2
// control registers. We don't use this memory map to access Permedia2 registers
// since on Alpha machines we want to precompute the addresses. So we do
// a TRANSLATE_ADDR_ULONG on all the addresses here and save them into a
// P2RegAddrRec. We use that to obtain the addresses for the different
// registers.
//
typedef struct
{
ULONG reg;
ULONG pad;
} RAMDAC_REG;
//
// Macros to add padding words to the structures. For the core registers we use
// the tag ids when specifying the pad. So we must multiply by 8 to get a byte
// pad. We need to add an id to make each pad field in the struct unique. The
// id is irrelevant as long as it's different from every other id used in the
// same struct. It's a pity pad##__LINE__ doesn't work.
//
//#define PAD(id, n) UCHAR pad##id[n]
//
// Interrupt status bits
//
typedef enum
{
DMA_INTERRUPT_AVAILABLE = 0x01, // can use DMA interrupts
VBLANK_INTERRUPT_AVAILABLE = 0x02, // can use VBLANK interrupts
} INTERRUPT_CONTROL;
extern DWORD LogicopReadDest[]; // Indicates which logic ops need dest read
// turned on
#define INTtoFIXED(i) ((i) << 16) // int to 16.16 fixed format
#define FIXEDtoINT(i) ((i) >> 16) // 16.16 fixed format to int
#define __PERMEDIA_CONSTANT_FB_WRITE \
(1 << (4+1))
#define __COLOR_DDA_FLAT_SHADE \
(__PERMEDIA_ENABLE | (__PERMEDIA_FLAT_SHADE_MODE << 1))
#define __COLOR_DDA_GOURAUD_SHADE \
(__PERMEDIA_ENABLE | (__PERMEDIA_GOURAUD_SHADE_MODE << 1))
#define INVERT_BITMASK_BITS (1 << 1)
//
// Bits in the Render command
//
#define __RENDER_VARIABLE_SPANS (1 << 18)
#define __RENDER_SYNC_ON_HOST_DATA (1 << 12)
#define __RENDER_SYNC_ON_BIT_MASK (1 << 11)
#define __RENDER_TRAPEZOID_PRIMITIVE (__PERMEDIA_TRAPEZOID_PRIMITIVE << 6)
#define __RENDER_LINE_PRIMITIVE (__PERMEDIA_LINE_PRIMITIVE << 6)
#define __RENDER_POINT_PRIMITIVE (__PERMEDIA_POINT_PRIMITIVE << 6)
#define __RENDER_FAST_FILL_INC(n) (((n) >> 4) << 4) // n = 8, 16 or 32
#define __RENDER_FAST_FILL_ENABLE (1 << 3)
#define __RENDER_RESET_LINE_STIPPLE (1 << 2)
#define __RENDER_LINE_STIPPLE_ENABLE (1 << 1)
#define __RENDER_AREA_STIPPLE_ENABLE (1 << 0)
#define __RENDER_TEXTURED_PRIMITIVE (1 << 13)
//
// Bits in the ScissorMode register
//
#define USER_SCISSOR_ENABLE (1 << 0)
#define SCREEN_SCISSOR_ENABLE (1 << 1)
#define SCISSOR_XOFFSET 0
#define SCISSOR_YOFFSET 16
//
// Bits in the FBReadMode register
//
#define __FB_READ_SOURCE (1 << 9)
#define __FB_READ_DESTINATION (1 << 10)
#define __FB_COLOR (1 << 15)
#define __FB_WINDOW_ORIGIN (1 << 16)
#define __FB_USE_PACKED (1 << 19)
//
// Bits in the LBReadMode register
//
#define __LB_READ_SOURCE (1 << 9)
#define __LB_READ_DESTINATION (1 << 10)
#define __LB_STENCIL (1 << 16)
#define __LB_DEPTH (1 << 17)
#define __LB_WINDOW_ORIGIN (1 << 18)
//
// Area stipple shifts and bit defines
//
#define AREA_STIPPLE_XSEL(x) ((x) << 1)
#define AREA_STIPPLE_YSEL(y) ((y) << 4)
#define AREA_STIPPLE_XOFF(x) ((x) << 7)
#define AREA_STIPPLE_YOFF(y) ((y) << 12)
#define AREA_STIPPLE_INVERT_PAT (1 << 17)
#define AREA_STIPPLE_MIRROR_X (1 << 18)
#define AREA_STIPPLE_MIRROR_Y (1 << 19)
// we always use 8x8 monochrome brushes.
#define AREA_STIPPLE_8x8_ENABLE \
(__PERMEDIA_ENABLE | \
AREA_STIPPLE_XSEL(__PERMEDIA_AREA_STIPPLE_8_PIXEL_PATTERN) | \
AREA_STIPPLE_YSEL(__PERMEDIA_AREA_STIPPLE_8_PIXEL_PATTERN))
#define DEFAULTWRITEMASK 0xffffffffl
// *******************************************************************
// Permedia Bit Field Macros
// FBReadMode
#define PM_FBREADMODE_PARTIAL(a) ((a) << 0)
#define PM_FBREADMODE_READSOURCE(a) ((a) << 9)
#define PM_FBREADMODE_READDEST(a) ((a) << 10)
#define PM_FBREADMODE_PATCHENABLE(a) ((a) << 18)
#define PM_FBREADMODE_PACKEDDATA(a) ((a) << 19)
#define PM_FBREADMODE_RELATIVEOFFSET(a) ((a) << 20)
#define PM_FBREADMODE_PATCHMODE(a) ((a) << 25)
// Texture read mode
#define PM_TEXREADMODE_ENABLE(a) ((a) << 0)
#define PM_TEXREADMODE_WIDTH(a) ((a) << 9)
#define PM_TEXREADMODE_HEIGHT(a) ((a) << 13)
#define PM_TEXREADMODE_FILTER(a) ((a) << 17)
// PackedDataLimits
#define PM_PACKEDDATALIMITS_OFFSET(a) ((a) << 29)
#define PM_PACKEDDATALIMITS_XSTART(a) ((a) << 16)
#define PM_PACKEDDATALIMITS_XEND(a) ((a) << 0)
// Window Register
#define PM_WINDOW_LBUPDATESOURCE(a) ((a) << 4)
#define PM_WINDOW_DISABLELBUPDATE(a) ((a) << 18)
// Colors
#define PM_BYTE_COLOR(a) ((a) << 15)
// Config register
#define PM_CHIPCONFIG_AGPCAPABLE (1 << 9)
static __inline int log2(int s)
{
int d = 1, iter = -1;
do {
d *= 2;
iter++;
} while (d <= s);
return iter;
}
VOID
P2DisableAllUnits(PPDev ppdev);
#if DBG && TRACKMEMALLOC
#define ENGALLOCMEM( opt, size, tag)\
MEMTRACKERALLOCATEMEM( EngAllocMem( opt, size, tag), size, __FILE__, __LINE__, FALSE)
#define ENGFREEMEM( obj)\
{ MEMTRACKERFREEMEM(obj); EngFreeMem( obj);}
#else
#define ENGALLOCMEM( opt, size, tag)\
EngAllocMem( opt, size, tag)
#define ENGFREEMEM( obj)\
EngFreeMem( obj)
#endif
#endif // _HW_H_