/******************************Module*Header**********************************\
*
*                           *******************
*                           * D3D SAMPLE CODE *
*                           *******************
*
* Module Name: d3ddelta.h
*
*  Content: 3DLabs Delta unit related defines. Used only by D3D.
*
* Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved.
* Copyright (c) 1995-1999 Microsoft Corporation.  All rights reserved.
\*****************************************************************************/
#ifdef __D3DDELTA
#pragma message ("FILE : "__FILE__" : Multiple inclusion")
#endif

#define __D3DDELTA

//-----------------------------------------------------------------------------
//   Conversion macros from ARGB values into Delta Gambit registers format
//-----------------------------------------------------------------------------
#define RGB_GET_GAMBIT_ALPHA(ci)  (((ci) & 0xff000000) >> 2)
#define RGB_GET_GAMBIT_RED(ci)	  (((ci) & 0xff0000) << 6)
#define RGB_GET_GAMBIT_GREEN(ci)  (((ci) & 0xff00) << 14)
#define RGB_GET_GAMBIT_BLUE(ci)	  (((ci) & 0xff) << 22)

#define RGB_GET_GAMBIT_FOG(ci)	  (((ci) & 0xff000000) >> 10)

#define AS_ULONG(val)   *((volatile DWORD *) &(val))


//-----------------------------------------------------------------------------
//     Macros defining the different Vertex types.tags for the Delta unit
//-----------------------------------------------------------------------------

#define VTX_FOG     (0x1 << 25)     
#define VTX_RGB     (0x7 << 21)
#define VTX_R       (0x1 << 21)
#define VTX_RGBA    (0xF << 21)
#define VTX_COLOR   (0x1 << 30)
#define VTX_STQ     (0x7 << 16)
#define VTX_KSKD    (0x3 << 19)
#define VTX_KS      (0x1 << 19)
#define VTX_XYZ     (0x7 << 26)
#define VTX_XY      (0x3 << 26)
#define VTX_GRP     (0x2 << 14)

#define GAMBIT_RGB_VTX                (VTX_GRP | VTX_RGB | VTX_XYZ)   
#define GAMBIT_RGB_F_VTX              (VTX_GRP | VTX_RGB | VTX_XYZ | VTX_FOG) 
#define GAMBIT_RGB_TEX_VTX            (VTX_GRP | VTX_RGB | VTX_XYZ | VTX_STQ)
#define GAMBIT_RGB_F_TEX_VTX          (VTX_GRP | VTX_RGB | VTX_XYZ |         \
                                                 VTX_STQ | VTX_FOG)
#define GAMBIT_RGBA_VTX               (VTX_GRP | VTX_RGBA | VTX_XYZ)  
#define GAMBIT_RGBA_F_VTX             (VTX_GRP | VTX_RGBA | VTX_XYZ | VTX_FOG)
#define GAMBIT_RGBA_TEX_VTX           (VTX_GRP | VTX_RGBA | VTX_XYZ | VTX_STQ)
#define GAMBIT_RGBA_F_TEX_VTX         (VTX_GRP | VTX_RGBA | VTX_XYZ |        \
                                                 VTX_STQ | VTX_FOG)
#define GAMBIT_FLAT_VTX               (VTX_GRP | VTX_XYZ)
#define GAMBIT_XYZ_VTX                (VTX_GRP | VTX_XYZ)
#define GAMBIT_XYZ_COLOR_VTX          (VTX_GRP | VTX_XYZ | VTX_COLOR)
#define GAMBIT_XYZ_STQ_VTX            (VTX_GRP | VTX_XYZ | VTX_STQ)
#define GAMBIT_XYZ_STQ_FOG_VTX        (VTX_GRP | VTX_XYZ | VTX_STQ | VTX_FOG)
#define GAMBIT_XYZ_STQ_KSKD_VTX       (VTX_GRP | VTX_XYZ | VTX_STQ | VTX_KSKD)
#define GAMBIT_XYZ_STQ_KS_VTX         (VTX_GRP | VTX_XYZ | VTX_STQ | VTX_KS)
#define GAMBIT_XYZ_STQ_KS_COL_VTX     (VTX_GRP | VTX_XYZ | VTX_STQ |         \
                                                 VTX_KS | VTX_COLOR)
#define GAMBIT_XYZ_STQ_KS_COL_FOG_VTX (VTX_GRP | VTX_XYZ | VTX_STQ |         \
                                                 VTX_KS | VTX_COLOR | VTX_FOG)
#define GAMBIT_XY_VTX                 (VTX_GRP | VTX_XY)
#define GAMBIT_XY_STQ_VTX             (VTX_GRP | VTX_XY | VTX_STQ)
#define GAMBIT_XY_STQ_FOG_VTX         (VTX_GRP | VTX_XY | VTX_STQ | VTX_FOG)
#define GAMBIT_XY_STQ_KSKD_VTX        (VTX_GRP | VTX_XY | VTX_STQ | VTX_KSKD)
#define GAMBIT_COLS_VTX               (VTX_GRP | VTX_RGB)
#define GAMBIT_PACKED_COLS_VTX        (VTX_GRP | VTX_COLOR)
#define GAMBIT_COLS_ALPHA_VTX         (VTX_GRP | VTX_RGBA)
#define GAMBIT_COLS_KSKD_VTX          (VTX_GRP | VTX_RGB | VTX_KSKD)
#define GAMBIT_FLAT_F_VTX             (VTX_GRP | VTX_XYZ | VTX_FOG)
#define GAMBIT_FLAT_TEX_VTX           (VTX_GRP | VTX_XYZ | VTX_STQ)
#define GAMBIT_FLAT_F_TEX_VTX         (VTX_GRP | VTX_XYZ | VTX_STQ | VTX_FOG)
#define GAMBIT_CI_VTX                 (VTX_GRP | VTX_R | VTX_XYZ) 
#define GAMBIT_CI_F_VTX               (VTX_GRP | VTX_R | VTX_XYZ | VTX_FOG)

//-----------------------------------------------------------------------------
//                     Vertex Data downloading macros
//-----------------------------------------------------------------------------
// 4 Entries
#define SEND_VERTEX_XYZ(Num, x_value, y_value, z_value)     \
{                                                           \
    LD_INPUT_FIFO_DATA( (GAMBIT_XYZ_VTX | Num));          \
    LD_INPUT_FIFO_DATA( AS_ULONG(x_value) );                \
    LD_INPUT_FIFO_DATA( AS_ULONG(y_value) );                \
    LD_INPUT_FIFO_DATA( AS_ULONG(z_value) );                \
}

// 7 Entries
#define SEND_VERTEX_STQ_XYZ(Num, s_value, t_value, q_value,  \
                                 x_value, y_value, z_value)  \
{                                                            \
    LD_INPUT_FIFO_DATA( (GAMBIT_XYZ_STQ_VTX | Num));       \
    LD_INPUT_FIFO_DATA(AS_ULONG(s_value));                   \
    LD_INPUT_FIFO_DATA(AS_ULONG(t_value));                   \
    LD_INPUT_FIFO_DATA(AS_ULONG(q_value));                   \
    LD_INPUT_FIFO_DATA(AS_ULONG(x_value));                   \
    LD_INPUT_FIFO_DATA(AS_ULONG(y_value));                   \
    LD_INPUT_FIFO_DATA(AS_ULONG(z_value));                   \
}

// 8 Entries
#define SEND_VERTEX_STQ_KS_XYZ(Num, s_value, t_value, q_value,             \
                                    Ks_value, x_value, y_value, z_value)   \
{                                                                          \
    LD_INPUT_FIFO_DATA(  (GAMBIT_XYZ_STQ_KS_VTX | Num));                 \
    LD_INPUT_FIFO_DATA( AS_ULONG(s_value));                                \
    LD_INPUT_FIFO_DATA( AS_ULONG(t_value));                                \
    LD_INPUT_FIFO_DATA( AS_ULONG(q_value));                                \
    LD_INPUT_FIFO_DATA( AS_ULONG(Ks_value));                               \
    LD_INPUT_FIFO_DATA( AS_ULONG(x_value));                                \
    LD_INPUT_FIFO_DATA( AS_ULONG(y_value));                                \
    LD_INPUT_FIFO_DATA( AS_ULONG(z_value));                                \
}

// 2 Entries
#define SEND_VERTEX_FOG(vNo, fog_value)        \
{                                              \
    LD_INPUT_FIFO_DATA( vNo);                 \
    LD_INPUT_FIFO_DATA(fog_value);             \
}

// 4 Entries
#define SEND_VERTEX_RGB_MONO(vNo, Color)                \
{                                                       \
    LD_INPUT_FIFO_DATA( (GAMBIT_COLS_VTX | vNo));     \
    LD_INPUT_FIFO_DATA(RGB_GET_GAMBIT_BLUE(Color));     \
    LD_INPUT_FIFO_DATA(RGB_GET_GAMBIT_BLUE(Color));     \
    LD_INPUT_FIFO_DATA(RGB_GET_GAMBIT_BLUE(Color));     \
}

// 4 Entries
#define SEND_VERTEX_RGB(vNo, Color)                     \
{                                                       \
    LD_INPUT_FIFO_DATA( (GAMBIT_COLS_VTX | vNo));     \
    LD_INPUT_FIFO_DATA(RGB_GET_GAMBIT_RED(Color));      \
    LD_INPUT_FIFO_DATA(RGB_GET_GAMBIT_GREEN(Color));    \
    LD_INPUT_FIFO_DATA(RGB_GET_GAMBIT_BLUE(Color));     \
}

// 2 Entries
#define SEND_VERTEX_RGBA_P2(vNo, Color)                     \
{                                                           \
    LD_INPUT_FIFO_DATA( (GAMBIT_PACKED_COLS_VTX | vNo));  \
    LD_INPUT_FIFO_DATA(Color);                              \
}

// 2 Entries
#define SEND_VERTEX_RGB_MONO_P2(vNo, Color)                                 \
{                                                                           \
    DWORD dwBlueVal = RGB_GET_GAMBIT_BLUE(Color);                           \
    LD_INPUT_FIFO_DATA( (GAMBIT_PACKED_COLS_VTX | vNo));                  \
    LD_INPUT_FIFO_DATA( dwBlueVal | (dwBlueVal << 8) | (dwBlueVal << 16));  \
}

// 5 Entries
#define SEND_VERTEX_RGBA(vNo, Color)                        \
{                                                           \
    LD_INPUT_FIFO_DATA( (GAMBIT_COLS_ALPHA_VTX | vNo));   \
    LD_INPUT_FIFO_DATA(RGB_GET_GAMBIT_RED(Color));          \
    LD_INPUT_FIFO_DATA(RGB_GET_GAMBIT_GREEN(Color));        \
    LD_INPUT_FIFO_DATA(RGB_GET_GAMBIT_BLUE(Color));         \
    LD_INPUT_FIFO_DATA(RGB_GET_GAMBIT_ALPHA(Color));        \
}

//-----------------------------------------------------------------------------
//                        HW Alpha stippling macros
//-----------------------------------------------------------------------------

extern DWORD FlatStipplePatterns[128];

#define SET_STIPPLED_ALPHA(AlphaValue)                                      \
{                                                                           \
    DWORD* pStipple;                                                        \
    DWORD NewAlpha = AlphaValue;                                            \
    if (NewAlpha != pContext->LastAlpha)                                    \
    {                                                                       \
        pContext->LastAlpha = NewAlpha;                                     \
        pStipple = FlatStipplePatterns + (NewAlpha << 3);                   \
        LD_INPUT_FIFO_DATA((0x00ff8000 | __Permedia2TagAreaStipplePattern0));  \
        LD_INPUT_FIFO_DATA( pStipple[0]);                                   \
        LD_INPUT_FIFO_DATA( pStipple[1]);                                   \
        LD_INPUT_FIFO_DATA( pStipple[2]);                                   \
        LD_INPUT_FIFO_DATA( pStipple[3]);                                   \
        LD_INPUT_FIFO_DATA( pStipple[4]);                                   \
        LD_INPUT_FIFO_DATA( pStipple[5]);                                   \
        LD_INPUT_FIFO_DATA( pStipple[6]);                                   \
        LD_INPUT_FIFO_DATA( pStipple[7]);                                   \
                                                                            \
    }                                                                       \
    RENDER_AREA_STIPPLE_ENABLE(ulRenderCmd);                                \
}

//-----------------------------------------------------------------------------
//                        Rendering command setup macros
//-----------------------------------------------------------------------------

#define RENDER_AREA_STIPPLE_ENABLE(a) a |= __RENDER_AREA_STIPPLE_ENABLE;
#define RENDER_AREA_STIPPLE_DISABLE(a) a &= ~__RENDER_AREA_STIPPLE_ENABLE;

#define RENDER_TEXTURE_ENABLE(a) a |= __RENDER_TEXTURE_ENABLE;
#define RENDER_TEXTURE_DISABLE(a) a &= ~__RENDER_TEXTURE_ENABLE;

#define RENDER_FOG_ENABLE(a) a |= (1 << 14);
#define RENDER_FOG_DISABLE(a) a &= ~(1 << 14);

#define RENDER_SUB_PIXEL_CORRECTION_ENABLE(a) a |= (1 << 16);
#define RENDER_SUB_PIXEL_CORRECTION_DISABLE(a) a &= ~(1 << 16);


#define RENDER_LINE(a) a &= ~(0xC0);
#define RENDER_TRAPEZOID(a) {a &= ~(0xC0); a |= (0x40);}
#define RENDER_POINT(a) {a &= ~(0xC0);a |= (0x80);}

#define RENDER_NEGATIVE_CULL(a) a |= (1 << 20);
#define RENDER_POSITIVE_CULL(a) a &= ~(1 << 20);



