brender-1997/ati/Ati3dcif.h
2022-05-03 14:31:40 -07:00

762 lines
29 KiB
C

// Filename: ati3dcif.h
// $Revision: 2.28 $
//
// Description: ATI 'C'interface (CIF) header to GT 3D hardware acceleration
//
// Trade secret of ATI Technologies, Inc.
// Copyright 1995, ATI Technologies, Inc., (unpublished)
//
// All rights reserved. This notice is intended as a precaution against
// inadvertent publication and does not imply publication or any waiver
// of confidentiality. The year included in the foregoing notice is the
// year of creation of the work.
//
//
#ifndef ATI_ATI3DCIF_H
#define ATI_ATI3DCIF_H
// Current Restrictions
// 1. Only support EV_VTCF floating point vertex type
// 2. Only one context may be exist at a time
// 3. RenderSwitch does not have meaning ( consequence of 2. )
// 4. C3D_ETFILT_MIPTRI_MAG2BY2 is not supported yet.
// 5. Coordinates should be pre-clipped by software to:
// -2048.0f +2047.0f in X
// -4096.0f +4095.0f in Y
#ifdef __cplusplus
extern "C" {
#endif
#if ! defined (BUILD_AS_DLL)
#define DLLEXPORT
#endif
#ifdef DOS_BUILD
#include "afxdos.h"
#include "i3debug.h"
#endif
#ifndef DOS_BUILD
#pragma pack(push) // push packing state
#pragma pack(8) // CIF requires structure data is naturally aligned
#endif
// Fundemental types
//
typedef unsigned int C3D_BOOL; // 0 indicates FALSE, >0 indicates TRUE
typedef unsigned int C3D_INT32; // 32 bit integer data
typedef unsigned int C3D_UINT32; // unsigned 32 bit integer data
typedef unsigned short C3D_UINT16; // unsigned 16 bit integer data
typedef unsigned char C3D_UINT8; // unsigned 8 bit integer data
typedef float C3D_FLOAT32; // 32 bit floating point data
typedef unsigned int* C3D_PBOOL; // points at C3D_BOOL;
typedef unsigned int* C3D_PINT32; // points at C3D_INT32;
typedef unsigned int* C3D_PUINT32; // points at C3D_UINT32;
typedef unsigned short* C3D_PUINT16; // points at C3D_UINT16;
typedef unsigned char* C3D_PUINT8; // points at C3D_UINT8;
typedef float* C3D_PFLOAT32; // points at C3D_FLOAT32;
typedef void * C3D_PVOID; // points at generic data
//ensure that enums are 32 bits in size. Allows optimization of non C3D enums.
#ifdef DOS_BUILD
#define C3D_FORCE_SIZE 0x7F
#else
#define C3D_FORCE_SIZE 0x7FFFFFFF
#endif
// Error codes
//
typedef enum {
C3D_EC_OK = 0, // Success
C3D_EC_GENFAIL = 1, // Generic Failure
C3D_EC_MEMALLOCFAIL = 2, // Memory allocation failure
C3D_EC_BADPARAM = 3, // Invalid parameter passed to function
C3D_EC_UNUSED0 = 4, // Reserved
C3D_EC_BADSTATE = 5, // Object entered invalid state
C3D_EC_NOTIMPYET = 6, // Functionality Not Implemented Yet
C3D_EC_UNUSED1 = 7, // Reserved
C3D_EC_CHIPCAPABILITY = 8, //Feature is not on this chip version (see C3D_CAPS)
C3D_EC_NUM = 9,
C3D_EC_FORCE_U32 = C3D_FORCE_SIZE
} C3D_EC, * C3D_PEC;
// Rect: specs a rectangular region in 2 space
//
typedef struct {
C3D_INT32 top;
C3D_INT32 left;
C3D_INT32 bottom;
C3D_INT32 right;
} C3D_RECT , * C3D_PRECT;
// Color
//
typedef union {
struct {
unsigned r: 8; // 8 red bits
unsigned g: 8; // 8 green bits
unsigned b: 8; // 8 blue bits
unsigned a: 8; // 8 alpha bits
};
C3D_UINT32 u32All;
} C3D_COLOR , * C3D_PCOLOR;
// Palette Color
//
//values for the flag palette entry. Set the flag
// C3D_LOAD_PALETTE_ENTRY to use thse palette entry,
//C3D_NO_LOAD_PALETTE_ENTRY to skip the entry.
//This allows "virtual palettes" of other than 16/256 size.
#define C3D_LOAD_PALETTE_ENTRY 0x40
#define C3D_NO_LOAD_PALETTE_ENTRY 0x00
typedef union {
struct {
unsigned r: 8; // 8 red bits
unsigned g: 8; // 8 green bits
unsigned b: 8; // 8 blue bits
unsigned flags: 8; //flag bits - see above defines
};
C3D_UINT32 u32All;
} C3D_PALETTENTRY , * C3D_PPALETTENTRY;
// Module Capability Flags: These module capability flags should allow a client
// to function properly with any release of the 3D CIF library. C3D_CAPS_BASE
// indicates the availability of all functionality supported in the first
// release of 3DCIF build 17. Each flag indicates the existance of module
// features added after the first release. NB that u32CIFCaps field of the
// C3D_3DCIFINFO struct did not exist. Before using the u32CIFCaps field make
// sure the library is more recent than build 17
//
#define C3D_CAPS1_BASE 0x00000000 // base line functionality
#define C3D_CAPS1_FOG 0x00000001 // fog support
#define C3D_CAPS1_POINT 0x00000002 // point primitive
#define C3D_CAPS1_RECT 0x00000004 // screen aligned rect primitive
#define C3D_CAPS1_Z_BUFFER 0x00000008 // depth buffer support
#define C3D_CAPS1_CI4_TMAP 0x00000010 // 4 bit color index texture support
#define C3D_CAPS1_CI8_TMAP 0x00000020 // 8 bit color index texture support
#define C3D_CAPS1_LOAD_OBJECT 0x00000040 // bus-master data loading
#define C3D_CAPS1_DITHER_EN 0x00000080 // dithering can be turned on/off
#define C3D_CAPS1_ENH_PERSP 0x00000100 // enhanced perspective levels avail
#define C3D_CAPS1_SCISSOR 0x00000200 // set clip without setting origin
#define C3D_CAPS1_PROFILE_IF 0x01000000 // is the profile interface avail
// Module info structure
//
typedef struct {
C3D_UINT32 u32Size; // Sz of struct must be init'ed by client
C3D_UINT32 u32FrameBuffBase; // Host pointer to frame buffer base
C3D_UINT32 u32OffScreenHeap; // Host pointer to offscreen heap
C3D_UINT32 u32OffScreenSize; // Size of offscreen heap
C3D_UINT32 u32TotalRAM; // Total amount of RAM on the card
C3D_UINT32 u32ASICID; // ASIC Id. code
C3D_UINT32 u32ASICRevision; // ASIC revision
C3D_UINT32 u32CIFCaps1; // ATI3DCIF module capabilities (see flags)
C3D_UINT32 u32CIFCaps2; // ATI3DCIF module capabilities (see flags)
C3D_UINT32 u32CIFCaps3; // ATI3DCIF module capabilities (see flags)
C3D_UINT32 u32CIFCaps4; // ATI3DCIF module capabilities (see flags)
C3D_UINT32 u32CIFCaps5; // ATI3DCIF module capabilities (see flags)
} C3D_3DCIFINFO, * PC3D_3DCIFINFO;
//
// Vertex enumeration type : used to select vertex data format to be referenced
// when rendering primitives
//
// Nomenclature: V for Vertex (Always X,Y,Z)
// C for Color (Always R,G,B,A)
// T for Texture(Always S,T,W)
//
typedef enum {
C3D_EV_VF = 0,
C3D_EV_VCF = 1,
C3D_EV_VTF = 2,
C3D_EV_VTCF = 3,
C3D_EV_NUM = 4,
C3D_EV_FORCE_U32 = C3D_FORCE_SIZE
} C3D_EVERTEX, * C3D_PEVERTEX;
//
// Vertex data types
//
typedef struct {
C3D_FLOAT32 x, y, z; // FLOATING point type
} C3D_VF, * C3D_PVF; // identified by C3D_EV_VF
typedef struct {
C3D_FLOAT32 x, y, z; // FLOATING point type
C3D_FLOAT32 r, g, b, a; // identified by C3D_EV_VCF
} C3D_VCF, * C3D_PVCF;
typedef struct {
C3D_FLOAT32 x, y, z; // FLOATING point type
C3D_FLOAT32 s, t, w; // identified by C3D_EV_VTF
} C3D_VTF, * C3D_PVTF;
typedef struct {
C3D_FLOAT32 x, y, z; // FLOATING point type
C3D_FLOAT32 s, t, w; // identified by C3D_EV_VTCF
C3D_FLOAT32 r, g, b, a;
} C3D_VTCF, * C3D_PVTCF;
// Primitive Sets: A primitive set is a sequence of vertex data used
// to represent a stream of geometric primitives: Quads,Tris or Lines.
// A Primitive Set can take two basic forms: Strips or Lists.
// A Primitive List is a doubly indirect array of pointers to actual vertex data.
// A Primitive Strip is a pointer to contiguous array of vertex data
// where adjacent primitives share vertex data.
//
// (e.g. a triangle strip with four vertices represents 2 triangles
//
// Primitive Set Pointers
typedef void * C3D_VSTRIP;
typedef void ** C3D_VLIST;
// Primitive Type: Specifies the geometric interpretation of a vertex set
// during rasterization. eg: if C3D_EPRIM_TRI is set in a rendering context
// then subsequent calls to ATI3DCIF_RenderPrimList will interpret the specified
// vertices as triangles and will consume 3 vertices for each triangle drawn.
//
typedef enum {
C3D_EPRIM_LINE = 0,
C3D_EPRIM_TRI = 1,
C3D_EPRIM_QUAD = 2,
C3D_EPRIM_RECT = 3,
C3D_EPRIM_POINT = 4,
C3D_EPRIM_NUM = 5, // invalid enumeration val
C3D_EPRIM_FORCE_U32 = C3D_FORCE_SIZE
} C3D_EPRIM, * C3D_PEPRIM;
// Shading
//
typedef enum {
C3D_ESH_NONE = 0,
C3D_ESH_SOLID = 1, // shade using the clrSolid from the RC
C3D_ESH_FLAT = 2, // shade using the last vertex to flat shade.
C3D_ESH_SMOOTH = 3, // shade using linearly interpolating vert clr
C3D_ESH_NUM = 4, // invalid enumeration val
C3D_ESH_FORCE_U32 = C3D_FORCE_SIZE
} C3D_ESHADE, * C3D_PESHADE;
// Alpha Blending
//
// clr_dst = clr_src * f(eAlphaSrcFactor) + clr_dst * f(eAlphaDstFactor)
// alpha blending source factor select
typedef enum {
C3D_EASRC_ZERO = 0,// Blend factor is (0, 0, 0)
C3D_EASRC_ONE = 1,// Blend factor is (1, 1, 1)
C3D_EASRC_DSTCLR = 2,// Blend factor is (Rd, Gd, Bd)
C3D_EASRC_INVDSTCLR = 3,// Blend factor is (1-Rd, 1-Gd, 1-Bd)
C3D_EASRC_SRCALPHA = 4,// Blend factor is (As, As, As)
C3D_EASRC_INVSRCALPHA = 5,// Blend factor is (1-As, 1-As, 1-As)
C3D_EASRC_NUM = 6, // invalid enumeration val
C3D_EASRC_FORCE_U32 = C3D_FORCE_SIZE
} C3D_EASRC, *C3D_PEASRC;
// alpha blending destination factor select
//
typedef enum {
C3D_EADST_ZERO = 0, // Blend factor is (0, 0, 0)
C3D_EADST_ONE = 1, // Blend factor is (1, 1, 1)
C3D_EADST_SRCCLR = 2, // Blend factor is (Rs, Gs, Bs)
C3D_EADST_INVSRCCLR = 3, // Blend factor is (1-Rs, 1-Gs, 1-Bs)
C3D_EADST_SRCALPHA = 4, // Blend factor is (As, As, As)
C3D_EADST_INVSRCALPHA = 5, // Blend factor is (1-As, 1-As, 1-As)
C3D_EADST_NUM = 6, // invalid enumeration val
C3D_EADST_FORCE_U32 = C3D_FORCE_SIZE
} C3D_EADST, *C3D_PEADST;
// Texture mapping
//
typedef void * C3D_HTX; // handle to a texture in the framebuffer
typedef C3D_HTX * C3D_PHTX; // pointer to handle to texture
typedef void * C3D_HTXPAL; // handle to a texture palette
typedef C3D_HTXPAL *C3D_PHTXPAL; // pointer to handle to a texture palette
typedef enum {
C3D_ECI_TMAP_TRUE_COLOR = 0, // no palette
C3D_ECI_TMAP_4BIT_HI = 1, // 16 entry palette
C3D_ECI_TMAP_4BIT_LOW = 2, // 16 entry palette
C3D_ECI_TMAP_8BIT = 3, // 256 entry palette
C3D_ECI_TMAP_NUM = 4, // invalid enumeration
C3D_ECI_TMAP_FORCE_U32 = C3D_FORCE_SIZE
} C3D_ECI_TMAP_TYPE;
// Texel lighting
typedef enum {
C3D_ETL_NONE = 0, // TEXout = Tclr
C3D_ETL_MODULATE = 1, // TEXout = Tclr*CInt
C3D_ETL_ALPHA_DECAL = 2, // TEXout = (Tclr*Talp)+(CInt*(1-Talp))
C3D_ETL_NUM = 3, // invalid enumeration
C3D_ETL_FORCE_U32 = C3D_FORCE_SIZE
} C3D_ETLIGHT, * C3D_PETLIGHT;
// specifies the level of perspective correction done by the hardware. This
// setting trades off image quality for better frame rates
typedef enum {
C3D_ETPC_NONE = 0, // no correction, best frame rate
C3D_ETPC_ONE = 1, //
C3D_ETPC_TWO = 2, //
C3D_ETPC_THREE = 3, // recommended correction
C3D_ETPC_FOUR = 4, //
C3D_ETPC_FIVE = 5, //
C3D_ETPC_SIX = 6, //
C3D_ETPC_SEVEN = 7, //
C3D_ETPC_EIGHT = 8, //
C3D_ETPC_NINE = 9, // full correction, worst frame rate
C3D_ETPC_NUM = 10, // invalid enumeration
C3D_ETPC_FORCE_U32 = C3D_FORCE_SIZE
} C3D_ETPERSPCOR, * C3D_PETPERSPCOR;
// texture filtering modes
// ( NB: that GT supports 2x2 MIN only if 2x2 MAG is turned on )
// ( NB: modes identified by MIP are only valid with mip mapped textures )
typedef enum {
C3D_ETFILT_MINPNT_MAGPNT = 0,// pick nearest texel (pnt) min/mag
C3D_ETFILT_MINPNT_MAG2BY2 = 1,// pnt min/bi-linear mag
C3D_ETFILT_MIN2BY2_MAG2BY2 = 2,// 2x2 blend min/bi-linear mag
C3D_ETFILT_MIPLIN_MAGPNT = 3,// 1x1 blend min(between maps)/pnt mag
C3D_ETFILT_MIPLIN_MAG2BY2 = 4,// 1x1 blend min(between maps)/bi-linear mag
C3D_ETFILT_MIPTRI_MAG2BY2 = 5,// (2x2)x(2x2)(between maps)/bi-linear mag
C3D_ETFILT_NUM = 6, //
C3D_ETFILT_FORCE_U32 = C3D_FORCE_SIZE
} C3D_ETEXFILTER, *C3D_PETEXFILTER;
// texel op modes: determines how which operations are applied to texels as
// they are read from the texture. By design theses are orthogonal to
// filtering modes.
//
typedef enum {
C3D_ETEXOP_NONE = 0, //
C3D_ETEXOP_CHROMAKEY = 1, // select texels not equal to the chroma key
C3D_ETEXOP_ALPHA = 2, // pass texel alpha to the alpha blender
C3D_ETEXOP_ALPHA_MASK = 3, // lw bit 0: tex not drawn otw: alpha int
C3D_ETEXOP_NUM = 4, //
C3D_ETEXOP_FORCE_U32 = C3D_FORCE_SIZE
} C3D_ETEXOP, * C3D_PETEXOP;
// specifies the pixel format
typedef enum { // (sz)
C3D_EPF_RGB1555 = 3, // 1b Alpha, 5b Red, 5b Green, 5b Blue (16)
C3D_EPF_RGB565 = 4, // 0b Alpha, 5b Red, 6b Green, 5b Blue (16)
C3D_EPF_RGB8888 = 6, // 8b Alpha, 8b Red, 8b Green, 8b Blue (32)
C3D_EPF_RGB332 = 7, // 0b Alpha, 3b Red, 3b Green, 2b Blue (08)
C3D_EPF_Y8 = 8, // 8b Y (08)
C3D_EPF_YUV422 = 11, // YUV 422 Packed (YUYV) MS FOURCC_UYVY(16)
C3D_EPF_FORCE_U32 = C3D_FORCE_SIZE
} C3D_EPIXFMT, * C3D_PEPIXFMT;
// specifies the texel format
typedef enum { // (sz)
C3D_ETF_CI4 = 1, // 4BPP Pseudocolor (not supported for SCALING)
C3D_ETF_CI8 = 2, // 8BPP Pseudocolor
C3D_ETF_RGB1555 = 3, // 1b Alpha, 5b Red, 5b Green, 5b Blue (16)
C3D_ETF_RGB565 = 4, // 0b Alpha, 5b Red, 6b Green, 5b Blue (16)
C3D_ETF_RGB8888 = 6, // 8b Alpha, 8b Red, 8b Green, 8b Blue (32)
C3D_ETF_RGB332 = 7, // 0b Alpha, 3b Red, 3b Green, 2b Blue (08)
C3D_ETF_Y8 = 8, // 8b Y (08)
C3D_ETF_YUV422 = 11, // YUV 422 Packed (YUYV) MS FOURCC_UYVY(16)
C3D_ETF_RGB4444 = 15, // 4b Alpha, 4b Red, 4b Green, 4b Blue (16)
C3D_ETF_FORCE_U32 = C3D_FORCE_SIZE
} C3D_ETEXFMT, * C3D_PETEXFMT;
// the TMAP structure specifies how the hardware should interpret a texture
// stored in the frambuffer.
//
// apv32Offsets is an array of host pointers to the individual maps which
// compose a texture. Where if (bMipMap==TRUE) apv32Offsets contains one or
// more elements the first (index 0) points at the base map and subsequent
// elements point at the sequentially smaller maps. For the case of
// bMipMap == FALSE the array contains one valid element(the first)
// and the rest are ignored. When bMipMap == TRUE the array contains 2n+1
// pointers to mip levels, where
// n = max( log_base_2( width_of_base_map ), log_base_2( height_of_base_map ) )
//
// eg: for a mip map with a 256x128 eg: for a mip map with a 512x512
// base map the elements of apvLevels[] base map the elements of apvLevels[]
// points at the following mip levels point at the following mip levels
// Total of NINE mip levels Total of TEN mip levels
// apvLevels[0] = 256x128; apvLevels[0] = 512x512;
// apvLevels[1] = 128x64; apvLevels[1] = 256x256;
// apvLevels[2] = 64x32; apvLevels[2] = 128x128;
// apvLevels[3] = 32x16; apvLevels[3] = 64x64;
// apvLevels[4] = 16x8; apvLevels[4] = 32x32;
// apvLevels[5] = 8x4; apvLevels[5] = 16x16;
// apvLevels[6] = 4x2; apvLevels[6] = 8x8;
// apvLevels[7] = 2x1; apvLevels[7] = 4x4;
// apvLevels[8] = 1x1; apvLevels[8] = 2x2;
// apvLevels[9] = 1x1;
#define cu32MAX_TMAP_LEV 11
typedef struct {
C3D_UINT32 u32Size; // size of structure
C3D_BOOL bMipMap; // is texture a mip map
C3D_PVOID apvLevels[cu32MAX_TMAP_LEV];// array of pointer to map level
C3D_UINT32 u32MaxMapXSizeLg2; // log 2 X size of largest map
C3D_UINT32 u32MaxMapYSizeLg2; // log 2 Y size of largest map
C3D_ETEXFMT eTexFormat; // texel format
C3D_COLOR clrTexChromaKey; // specify texel transp. clr
C3D_HTXPAL htxpalTexPalette; // pointer to texture palette
} C3D_TMAP, * C3D_PTMAP;
// Z Testing mode:
//
typedef enum {
C3D_EZMODE_OFF = 0, // ignore z
C3D_EZMODE_TESTON = 1, // test z, but do not update the z buffer
C3D_EZMODE_TESTON_WRITEZ= 2, // test z and update the z buffer
C3D_EZMODE_MAX = 3,
C3D_EZMODE_FORCE_U32 = C3D_FORCE_SIZE
} C3D_EZMODE, * C3D_PEZMODE;
// Z Comparison Function:
//
typedef enum {
C3D_EZCMP_NEVER = 0, // Z compare never passes
C3D_EZCMP_LESS = 1,
C3D_EZCMP_LEQUAL = 2,
C3D_EZCMP_EQUAL = 3,
C3D_EZCMP_GEQUAL = 4,
C3D_EZCMP_GREATER = 5,
C3D_EZCMP_NOTEQUAL = 6,
C3D_EZCMP_ALWAYS = 7, // Z compare always passes
C3D_EZCMP_MAX = 8,
C3D_EZCMP_FORCE_U32 = C3D_FORCE_SIZE
} C3D_EZCMP, * C3D_PEZCMP;
//
// Rendering Context
typedef void* C3D_HRC;
typedef void* C3D_PRSDATA;
// Rendering context field enumerations
// // DATA TYPE DEFAULT VALUE
typedef enum {
C3D_ERS_FG_CLR = 0, // C3D_COLOR {0,0,0,0}
C3D_ERS_VERTEX_TYPE = 1, // C3D_EVERTEX C3D_EV_VTCF
C3D_ERS_PRIM_TYPE = 2, // C3D_EPRIM C3D_EPRIM_TRI
C3D_ERS_SOLID_CLR = 3, // C3D_COLOR {0,0,0,0}
C3D_ERS_SHADE_MODE = 4, // C3D_ESHADE C3D_ESH_SMOOTH
C3D_ERS_TMAP_EN = 5, // C3D_BOOL FALSE
C3D_ERS_TMAP_SELECT = 6, // C3D_HTX NULL
C3D_ERS_TMAP_LIGHT = 7, // C3D_ETLIGHT C3D_ETL_NONE
C3D_ERS_TMAP_PERSP_COR = 8, // C3D_ETPERSPCOR C3D_ETPC_THREE
C3D_ERS_TMAP_FILTER = 9, // C3D_ETEXFILTER C3D_ETFILT_MINPNT_MAG2BY2
C3D_ERS_TMAP_TEXOP = 10, // C3D_ETEXOP C3D_ETEXOP_NONE
C3D_ERS_ALPHA_SRC = 11, // C3D_EASRC C3D_EASRC_ONE
C3D_ERS_ALPHA_DST = 12, // C3D_EADST C3D_EADST_ZERO
C3D_ERS_SURF_DRAW_PTR = 13, // C3D_PVOID Desktop Surface
C3D_ERS_SURF_DRAW_PITCH = 14, // C3D_UINT32 Desktop Surface
C3D_ERS_SURF_DRAW_PF = 15, // C3D_EPIXFMT Desktop Surface
C3D_ERS_SURF_VPORT = 16, // C3D_RECT Desktop Surface
C3D_ERS_FOG_EN = 17, // C3D_BOOL FALSE
C3D_ERS_DITHER_EN = 18, // C3D_BOOL TRUE
C3D_ERS_Z_CMP_FNC = 19, // C3D_EZCMP C3D_EZCMP_ALWAYS
C3D_ERS_Z_MODE = 20, // C3D_EZMODE C3D_EZMODE_OFF
C3D_ERS_SURF_Z_PTR = 21, // C3D_PVOID NULL
C3D_ERS_SURF_Z_PITCH = 22, // C3D_UINT32 Desktop Surface
C3D_ERS_SURF_SCISSOR = 23, // C3D_RECT Desktop clipping
C3D_ERS_NUM = 24, // invalid enumeration
C3D_ERS_FORCE_U32 = C3D_FORCE_SIZE
} C3D_ERSID, * C3D_PERSID;
//
// Inlines
//
#define SET_CIF_COLOR(exp, red, grn, blu, alp) \
(exp).r = (C3D_UINT8)(red); \
(exp).g = (C3D_UINT8)(grn); \
(exp).b = (C3D_UINT8)(blu); \
(exp).a = (C3D_UINT8)(alp);
//
// CIF3D Module Functions
//
#if defined (BUILD_AS_DLL)
//export both the function as is and a function pointer
//This allows a GetProcAddress() to work without name mangling
#define PROTOTYPE(function_name, return_type, parameters) \
return_type DLLEXPORT WINAPI function_name parameters; \
typedef return_type (WINAPI *function_name##_t) parameters; \
extern DLLEXPORT function_name##_t function_name##_lib
#else
#define PROTOTYPE(function_name, return_type, parameters) \
typedef return_type (WINAPI *function_name##_t) parameters; \
return_type DLLEXPORT WINAPI function_name parameters;
#endif
#if defined (DOS_BUILD) || defined (NT_BUILD)
// only needed for DOS but does nobody any harm
PROTOTYPE (ATI3DCIF_DosInit, C3D_EC, ( PVOID pPHXINFO ));
#else
// initializes the ATI3DCIF driver module
//
PROTOTYPE (ATI3DCIF_Init, C3D_EC, (void));
#endif
// terminates the ATI3DCIF driver module
//
PROTOTYPE (ATI3DCIF_Term, C3D_EC, (void));
// returns information about the 3DCIF module
//
PROTOTYPE (ATI3DCIF_GetInfo, C3D_EC, (PC3D_3DCIFINFO p3DCIFInfo));
//
// Texture Management Functions
//
// registers a texture with the CIF module.
//
// ptmapToReg is a client specified info on texture to be reg'ed
// phtmap is the returned handle to the registered texture
PROTOTYPE (ATI3DCIF_TextureReg, C3D_EC, (C3D_PTMAP ptmapToReg,C3D_PHTX phtmap));
// Unregisters a texture with the CIF module.
//
PROTOTYPE (ATI3DCIF_TextureUnreg, C3D_EC, (C3D_HTX htxToUnreg));
// Create a texture palette
//
// epalette ==> kind of palette
// pclrPalette ==> 16 or 256 entries (colors and flags)
// phtpalCreated ==> place to return handle to created palette
PROTOTYPE (ATI3DCIF_TexturePaletteCreate, C3D_EC, (C3D_ECI_TMAP_TYPE epalette,C3D_PPALETTENTRY pclrPalette, C3D_PHTXPAL phtpalCreated));
// Destroy a texture palette
//
PROTOTYPE (ATI3DCIF_TexturePaletteDestroy, C3D_EC, (C3D_HTXPAL htxpalToDestroy));
// Animate a texture palette. Low overhead function to update palette entries
//
PROTOTYPE (ATI3DCIF_TexturePaletteAnimate, C3D_EC, (C3D_HTXPAL htxpalToAnimate,C3D_UINT32 u32StartIndex,C3D_UINT32 u32NumEntries,C3D_PPALETTENTRY pclrPalette));
// Loads an object into the framebuffer using the bus-master DMA hardware.
// Available only if C3D_CAPS_LOAD_OBJECT bit is set in the u32CIFCaps field
// of the C3D_3DCIFINFO struct.
//
// pvObjSrc ==> pointer to object in system mem
// pvObjDst ==> pointer to dst in framebuffer
// u32Size ==> size of object to load in bytes
PROTOTYPE (ATI3DCIF_LoadObject, C3D_EC, (C3D_PVOID pvObjSrc,C3D_PVOID pvObjDst,C3D_UINT32 u32Size ));
//
// Context Functions
//
// Creates a ATI3DCIF rendering context initialized to the default state
// specified above
PROTOTYPE (ATI3DCIF_ContextCreate, C3D_HRC, (void));
// Destroys a ATI3DCIF rendering context.
//
PROTOTYPE (ATI3DCIF_ContextDestroy, C3D_EC, (C3D_HRC hRC));
// Set State in a ATI3DCIF rendering context
//
// hRC ==> handle to a created rendering context
// eRStateID ==> id of state to set
// pRStateData ==> data to set
#ifdef GAME_DEBUG
PROTOTYPE (ATI3DCIF_DoContextSetState, C3D_EC, (C3D_HRC hRC, C3D_ERSID eRStateID, C3D_PRSDATA pRStateData));
#else
PROTOTYPE (ATI3DCIF_ContextSetState, C3D_EC, (C3D_HRC hRC, C3D_ERSID eRStateID, C3D_PRSDATA pRStateData));
#endif
//
// Rendering Functions
//
// Prepares hardware to draw using the context referred to by the specified
// handle. RenderBegin must be called prior to any other Render* functions.
// RenderBegin will(may?) fail if the Primary Surface has been locked through
// DirectDraw.(?) Typically called prior to rendering each frame
//
PROTOTYPE (ATI3DCIF_RenderBegin, C3D_EC, (C3D_HRC hRC));
// Ends 3D hardware drawing operations. Frees up the graphics hardware for 2D
// operations.
// Typically called after rendering each frame
//
PROTOTYPE (ATI3DCIF_RenderEnd, C3D_EC, (void));
// Switches to a new rendering context. ATI3DCIF_RenderSwitch(hrc) is a
// lighter weight, functional equivalent to the the combination of
// ATI3DCIF_RenderEnd() followed by ATI3DCIF_RenderBegin(hrc)
// Only valid while in the 3D rendering state.
//
PROTOTYPE (ATI3DCIF_RenderSwitch, C3D_EC, (C3D_HRC hRC));
// RenderPrimStrip in the rendering context specified with the render begin call
// Only valid while in the 3D rendering state.
//
#ifdef GAME_DEBUG
PROTOTYPE (ATI3DCIF_DoRenderPrimStrip, C3D_EC, (C3D_VSTRIP vStrip, C3D_UINT32 u32NumVert));
#else
PROTOTYPE (ATI3DCIF_RenderPrimStrip, C3D_EC, (C3D_VSTRIP vStrip, C3D_UINT32 u32NumVert));
#endif
// RenderPrimList in the rendering context specified with the render begin call
// Only valid while in the 3D rendering state.
//
#ifdef GAME_DEBUG
PROTOTYPE (ATI3DCIF_DoRenderPrimList, C3D_EC, (C3D_VLIST vList, C3D_UINT32 u32NumVert));
#else
PROTOTYPE (ATI3DCIF_RenderPrimList, C3D_EC, (C3D_VLIST vList, C3D_UINT32 u32NumVert));
#endif
#ifndef DOS_BUILD
#pragma pack(pop) // restore packing state
#endif
#ifdef __cplusplus
}
#endif
#ifdef RCS_H_KEYS
static char *rcsid_h_ati3dcif_ati = "$Revision: 2.28 $" __FILE__;
#endif
#endif // ATI_ATI3DCIF_H
//
// $Author: xwu $
// $Revision: 2.28 $
// $Date: 05 Dec 1996 14:18:30 $
// $Modtime: 05 Dec 1996 14:05:56 $
// $Log: //finch/dvl/common/_vcs/ati3dcif.h_v $
//
// Rev 2.28 05 Dec 1996 14:18:30 xwu
// Add in GAME_DEBUG for GAME_DEBUG build
//
// Rev 2.27 Aug 28 1996 17:08:36 cjiang
// Restore the development tree since the changes made between
// Aug. 15 and Aug 23 are lost on the server but exist on
// my machine.
//
// Rev 2.26 Aug 21 1996 15:50:48 mmintz
// Chenged header to export functions
//
// Rev 2.25 Aug 15 1996 11:31:22 philr
// Changed PROTOTYPE definitions under mmintz direction.
//
// Rev 2.24 Aug 01 1996 16:59:40 mmintz
//
// Rev 2.23 Jul 26 1996 14:05:30 mmintz
// new static library
//
// Rev 2.22 Jul 23 1996 15:33:06 mmintz
//
// Rev 2.21 Jul 16 1996 11:42:04 mmintz
// changed enum force value
//
// Rev 2.20 Jul 16 1996 09:34:28 mmintz
// OPEN GL changes and added Memory control register
//
// Rev 2.19 Jun 27 1996 10:15:06 mmintz
// interface for scissors and stipple
//
// Rev 2.18 Jun 21 1996 16:39:44 mmintz
// ci4 work
//
// Rev 2.17 Jun 05 1996 13:26:52 mmintz
// added new error - chip capability to indicate that the chip cannot
// perform some functino (like Z buffering) even though the
// driver is aware of the feature.
//
// Rev 2.16 Jun 03 1996 08:39:10 mmintz
// z buffer
//
// Rev 2.15 May 15 1996 18:09:00 tomp
// Added new interface for palettized textures, Z buffer and Dither Control
//
// Rev 2.14 May 01 1996 16:37:12 philr
// changed UINT32 to C3D_UINT32
//
// Rev 2.13 Apr 26 1996 02:16:00 tomp
// fixed typo in C3D_ERSID enumeration
//
// Rev 2.12 Apr 26 1996 02:02:56 tomp
// Added 4 new states to enable fogging
// C3D_ERS_FG_CLR
// C3D_ERS_FOG_EN
// C3D_ERS_Z_CMP_FNC
// C3D_ERS_Z_MODE
// Modified ATI3DCIF.H interface header to support the followin
// new features when they are available in hardware:
// -Palettized Textures
// -Z Testing
// -Object Loading
// Added better documentation for TMap structure; examples on how to set
// up for mip maps.
//
// Rev 2.11 Mar 19 1996 21:21:26 philr
// Attempted to remove null chars at end which disturb Watcom
//
// Rev 2.10 Mar 04 1996 02:06:12 tomp
// Merged DOS ATI3DCIF code
//
// Rev 2.9 Mar 03 1996 15:55:28 tomp
// Added push and pop pragma to preserve the structure packing state
//
// Rev 2.8 Mar 02 1996 22:31:04 tomp
// Added structure packing pragma
//
// Rev 2.7 Feb 29 1996 11:46:58 tomp
// Added Texel Op modes to the 3D CIF. "Texel Op" is the name I'm using refer
// to the group of operations (other than filtering) the GT can apply to
// texels as they are read from a texture, such as:
// 1. Texel Chroma Key
// 2. Texel Alpha Mask
// 3. Texel Alpha Blending
// Added support for all filtering modes, but tri-linear
// Fixed a couple bugs found in the d6 release of 3D CIF
//
// Rev 2.6 Feb 15 1996 00:23:22 tomp
// D6 release
//
// Optimized
// Alpha Blender is turned off for the nop combinations of SRC and DST funct
// Alpha interpolators are not setup when neither the SRC nor the DST funct
// depend on source alpha
//
// Fixed
// texture chorma keying bug
//
// Added new Pixel and Texel Formats
//
// Rev 2.5 Jan 29 1996 18:00:38 tomp
// Added to list of restrictions based on testing done prior to beta II release
//
// Rev 2.4 Jan 08 1996 23:57:42 tomp
// Converted to the beta 3DCIF interface
//
// Rev 2.3 Dec 29 1995 16:19:38 tomp
// Cleaned up and added more comments
//
// Rev 2.2 Dec 22 1995 03:49:56 tomp
// Updated interface. Removed dependencies on external types and on Direct
// Draw. Replaced implicit Lock/explicit Unlock with Begin/End Render calls
// Added support for filtering mode selection.
//
// Rev 2.1 Dec 20 1995 17:47:54 tomp
// Inital Revision