diff --git a/src/devices/machine/k033906.cpp b/src/devices/machine/k033906.cpp index bd32fef29f1..d9953d2864f 100644 --- a/src/devices/machine/k033906.cpp +++ b/src/devices/machine/k033906.cpp @@ -33,7 +33,7 @@ k033906_device::k033906_device(const machine_config &mconfig, const char *tag, d void k033906_device::device_start() { - m_voodoo = machine().device(m_voodoo_tag); + m_voodoo = (voodoo_device*)machine().device(m_voodoo_tag); m_reg_set = 0; @@ -95,7 +95,7 @@ void k033906_device::reg_w(int reg, UINT32 data) case 0x10: // initEnable { - voodoo_set_init_enable(m_voodoo, data); + m_voodoo->voodoo_set_init_enable(data); break; } diff --git a/src/devices/machine/k033906.h b/src/devices/machine/k033906.h index aa2c685df99..438cc5796ab 100644 --- a/src/devices/machine/k033906.h +++ b/src/devices/machine/k033906.h @@ -12,7 +12,7 @@ #define __K033906_H__ #include "emu.h" - +#include "video/voodoo.h" /*************************************************************************** @@ -58,7 +58,7 @@ private: int m_reg_set; // 1 = access reg / 0 = access ram const char *m_voodoo_tag; - device_t *m_voodoo; + voodoo_device *m_voodoo; UINT32 m_reg[256]; UINT32 m_ram[32768]; diff --git a/src/devices/video/vooddefs.h b/src/devices/video/vooddefs.h index e394946d445..5bef9d4cc8e 100644 --- a/src/devices/video/vooddefs.h +++ b/src/devices/video/vooddefs.h @@ -9,1349 +9,6 @@ ***************************************************************************/ -/************************************* - * - * Misc. constants - * - *************************************/ - -/* enumeration describing reasons we might be stalled */ -enum -{ - NOT_STALLED = 0, - STALLED_UNTIL_FIFO_LWM, - STALLED_UNTIL_FIFO_EMPTY -}; - - - -// Use old table lookup versus straight double divide -#define USE_FAST_RECIP 0 - -/* maximum number of TMUs */ -#define MAX_TMU 2 - -/* accumulate operations less than this number of clocks */ -#define ACCUMULATE_THRESHOLD 0 - -/* number of clocks to set up a triangle (just a guess) */ -#define TRIANGLE_SETUP_CLOCKS 100 - -/* maximum number of rasterizers */ -#define MAX_RASTERIZERS 1024 - -/* size of the rasterizer hash table */ -#define RASTER_HASH_SIZE 97 - -/* flags for LFB writes */ -#define LFB_RGB_PRESENT 1 -#define LFB_ALPHA_PRESENT 2 -#define LFB_DEPTH_PRESENT 4 -#define LFB_DEPTH_PRESENT_MSW 8 - -/* flags for the register access array */ -#define REGISTER_READ 0x01 /* reads are allowed */ -#define REGISTER_WRITE 0x02 /* writes are allowed */ -#define REGISTER_PIPELINED 0x04 /* writes are pipelined */ -#define REGISTER_FIFO 0x08 /* writes go to FIFO */ -#define REGISTER_WRITETHRU 0x10 /* writes are valid even for CMDFIFO */ - -/* shorter combinations to make the table smaller */ -#define REG_R (REGISTER_READ) -#define REG_W (REGISTER_WRITE) -#define REG_WT (REGISTER_WRITE | REGISTER_WRITETHRU) -#define REG_RW (REGISTER_READ | REGISTER_WRITE) -#define REG_RWT (REGISTER_READ | REGISTER_WRITE | REGISTER_WRITETHRU) -#define REG_RP (REGISTER_READ | REGISTER_PIPELINED) -#define REG_WP (REGISTER_WRITE | REGISTER_PIPELINED) -#define REG_RWP (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED) -#define REG_RWPT (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_WRITETHRU) -#define REG_RF (REGISTER_READ | REGISTER_FIFO) -#define REG_WF (REGISTER_WRITE | REGISTER_FIFO) -#define REG_RWF (REGISTER_READ | REGISTER_WRITE | REGISTER_FIFO) -#define REG_RPF (REGISTER_READ | REGISTER_PIPELINED | REGISTER_FIFO) -#define REG_WPF (REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO) -#define REG_RWPF (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO) - -/* lookup bits is the log2 of the size of the reciprocal/log table */ -#define RECIPLOG_LOOKUP_BITS 9 - -/* input precision is how many fraction bits the input value has; this is a 64-bit number */ -#define RECIPLOG_INPUT_PREC 32 - -/* lookup precision is how many fraction bits each table entry contains */ -#define RECIPLOG_LOOKUP_PREC 22 - -/* output precision is how many fraction bits the result should have */ -#define RECIP_OUTPUT_PREC 15 -#define LOG_OUTPUT_PREC 8 - - - -/************************************* - * - * Register constants - * - *************************************/ - -/* Codes to the right: - R = readable - W = writeable - P = pipelined - F = goes to FIFO -*/ - -/* 0x000 */ -#define status (0x000/4) /* R P */ -#define intrCtrl (0x004/4) /* RW P -- Voodoo2/Banshee only */ -#define vertexAx (0x008/4) /* W PF */ -#define vertexAy (0x00c/4) /* W PF */ -#define vertexBx (0x010/4) /* W PF */ -#define vertexBy (0x014/4) /* W PF */ -#define vertexCx (0x018/4) /* W PF */ -#define vertexCy (0x01c/4) /* W PF */ -#define startR (0x020/4) /* W PF */ -#define startG (0x024/4) /* W PF */ -#define startB (0x028/4) /* W PF */ -#define startZ (0x02c/4) /* W PF */ -#define startA (0x030/4) /* W PF */ -#define startS (0x034/4) /* W PF */ -#define startT (0x038/4) /* W PF */ -#define startW (0x03c/4) /* W PF */ - -/* 0x040 */ -#define dRdX (0x040/4) /* W PF */ -#define dGdX (0x044/4) /* W PF */ -#define dBdX (0x048/4) /* W PF */ -#define dZdX (0x04c/4) /* W PF */ -#define dAdX (0x050/4) /* W PF */ -#define dSdX (0x054/4) /* W PF */ -#define dTdX (0x058/4) /* W PF */ -#define dWdX (0x05c/4) /* W PF */ -#define dRdY (0x060/4) /* W PF */ -#define dGdY (0x064/4) /* W PF */ -#define dBdY (0x068/4) /* W PF */ -#define dZdY (0x06c/4) /* W PF */ -#define dAdY (0x070/4) /* W PF */ -#define dSdY (0x074/4) /* W PF */ -#define dTdY (0x078/4) /* W PF */ -#define dWdY (0x07c/4) /* W PF */ - -/* 0x080 */ -#define triangleCMD (0x080/4) /* W PF */ -#define fvertexAx (0x088/4) /* W PF */ -#define fvertexAy (0x08c/4) /* W PF */ -#define fvertexBx (0x090/4) /* W PF */ -#define fvertexBy (0x094/4) /* W PF */ -#define fvertexCx (0x098/4) /* W PF */ -#define fvertexCy (0x09c/4) /* W PF */ -#define fstartR (0x0a0/4) /* W PF */ -#define fstartG (0x0a4/4) /* W PF */ -#define fstartB (0x0a8/4) /* W PF */ -#define fstartZ (0x0ac/4) /* W PF */ -#define fstartA (0x0b0/4) /* W PF */ -#define fstartS (0x0b4/4) /* W PF */ -#define fstartT (0x0b8/4) /* W PF */ -#define fstartW (0x0bc/4) /* W PF */ - -/* 0x0c0 */ -#define fdRdX (0x0c0/4) /* W PF */ -#define fdGdX (0x0c4/4) /* W PF */ -#define fdBdX (0x0c8/4) /* W PF */ -#define fdZdX (0x0cc/4) /* W PF */ -#define fdAdX (0x0d0/4) /* W PF */ -#define fdSdX (0x0d4/4) /* W PF */ -#define fdTdX (0x0d8/4) /* W PF */ -#define fdWdX (0x0dc/4) /* W PF */ -#define fdRdY (0x0e0/4) /* W PF */ -#define fdGdY (0x0e4/4) /* W PF */ -#define fdBdY (0x0e8/4) /* W PF */ -#define fdZdY (0x0ec/4) /* W PF */ -#define fdAdY (0x0f0/4) /* W PF */ -#define fdSdY (0x0f4/4) /* W PF */ -#define fdTdY (0x0f8/4) /* W PF */ -#define fdWdY (0x0fc/4) /* W PF */ - -/* 0x100 */ -#define ftriangleCMD (0x100/4) /* W PF */ -#define fbzColorPath (0x104/4) /* RW PF */ -#define fogMode (0x108/4) /* RW PF */ -#define alphaMode (0x10c/4) /* RW PF */ -#define fbzMode (0x110/4) /* RW F */ -#define lfbMode (0x114/4) /* RW F */ -#define clipLeftRight (0x118/4) /* RW F */ -#define clipLowYHighY (0x11c/4) /* RW F */ -#define nopCMD (0x120/4) /* W F */ -#define fastfillCMD (0x124/4) /* W F */ -#define swapbufferCMD (0x128/4) /* W F */ -#define fogColor (0x12c/4) /* W F */ -#define zaColor (0x130/4) /* W F */ -#define chromaKey (0x134/4) /* W F */ -#define chromaRange (0x138/4) /* W F -- Voodoo2/Banshee only */ -#define userIntrCMD (0x13c/4) /* W F -- Voodoo2/Banshee only */ - -/* 0x140 */ -#define stipple (0x140/4) /* RW F */ -#define color0 (0x144/4) /* RW F */ -#define color1 (0x148/4) /* RW F */ -#define fbiPixelsIn (0x14c/4) /* R */ -#define fbiChromaFail (0x150/4) /* R */ -#define fbiZfuncFail (0x154/4) /* R */ -#define fbiAfuncFail (0x158/4) /* R */ -#define fbiPixelsOut (0x15c/4) /* R */ -#define fogTable (0x160/4) /* W F */ - -/* 0x1c0 */ -#define cmdFifoBaseAddr (0x1e0/4) /* RW -- Voodoo2 only */ -#define cmdFifoBump (0x1e4/4) /* RW -- Voodoo2 only */ -#define cmdFifoRdPtr (0x1e8/4) /* RW -- Voodoo2 only */ -#define cmdFifoAMin (0x1ec/4) /* RW -- Voodoo2 only */ -#define colBufferAddr (0x1ec/4) /* RW -- Banshee only */ -#define cmdFifoAMax (0x1f0/4) /* RW -- Voodoo2 only */ -#define colBufferStride (0x1f0/4) /* RW -- Banshee only */ -#define cmdFifoDepth (0x1f4/4) /* RW -- Voodoo2 only */ -#define auxBufferAddr (0x1f4/4) /* RW -- Banshee only */ -#define cmdFifoHoles (0x1f8/4) /* RW -- Voodoo2 only */ -#define auxBufferStride (0x1f8/4) /* RW -- Banshee only */ - -/* 0x200 */ -#define fbiInit4 (0x200/4) /* RW -- Voodoo/Voodoo2 only */ -#define clipLeftRight1 (0x200/4) /* RW -- Banshee only */ -#define vRetrace (0x204/4) /* R -- Voodoo/Voodoo2 only */ -#define clipTopBottom1 (0x204/4) /* RW -- Banshee only */ -#define backPorch (0x208/4) /* RW -- Voodoo/Voodoo2 only */ -#define videoDimensions (0x20c/4) /* RW -- Voodoo/Voodoo2 only */ -#define fbiInit0 (0x210/4) /* RW -- Voodoo/Voodoo2 only */ -#define fbiInit1 (0x214/4) /* RW -- Voodoo/Voodoo2 only */ -#define fbiInit2 (0x218/4) /* RW -- Voodoo/Voodoo2 only */ -#define fbiInit3 (0x21c/4) /* RW -- Voodoo/Voodoo2 only */ -#define hSync (0x220/4) /* W -- Voodoo/Voodoo2 only */ -#define vSync (0x224/4) /* W -- Voodoo/Voodoo2 only */ -#define clutData (0x228/4) /* W F -- Voodoo/Voodoo2 only */ -#define dacData (0x22c/4) /* W -- Voodoo/Voodoo2 only */ -#define maxRgbDelta (0x230/4) /* W -- Voodoo/Voodoo2 only */ -#define hBorder (0x234/4) /* W -- Voodoo2 only */ -#define vBorder (0x238/4) /* W -- Voodoo2 only */ -#define borderColor (0x23c/4) /* W -- Voodoo2 only */ - -/* 0x240 */ -#define hvRetrace (0x240/4) /* R -- Voodoo2 only */ -#define fbiInit5 (0x244/4) /* RW -- Voodoo2 only */ -#define fbiInit6 (0x248/4) /* RW -- Voodoo2 only */ -#define fbiInit7 (0x24c/4) /* RW -- Voodoo2 only */ -#define swapPending (0x24c/4) /* W -- Banshee only */ -#define leftOverlayBuf (0x250/4) /* W -- Banshee only */ -#define rightOverlayBuf (0x254/4) /* W -- Banshee only */ -#define fbiSwapHistory (0x258/4) /* R -- Voodoo2/Banshee only */ -#define fbiTrianglesOut (0x25c/4) /* R -- Voodoo2/Banshee only */ -#define sSetupMode (0x260/4) /* W PF -- Voodoo2/Banshee only */ -#define sVx (0x264/4) /* W PF -- Voodoo2/Banshee only */ -#define sVy (0x268/4) /* W PF -- Voodoo2/Banshee only */ -#define sARGB (0x26c/4) /* W PF -- Voodoo2/Banshee only */ -#define sRed (0x270/4) /* W PF -- Voodoo2/Banshee only */ -#define sGreen (0x274/4) /* W PF -- Voodoo2/Banshee only */ -#define sBlue (0x278/4) /* W PF -- Voodoo2/Banshee only */ -#define sAlpha (0x27c/4) /* W PF -- Voodoo2/Banshee only */ - -/* 0x280 */ -#define sVz (0x280/4) /* W PF -- Voodoo2/Banshee only */ -#define sWb (0x284/4) /* W PF -- Voodoo2/Banshee only */ -#define sWtmu0 (0x288/4) /* W PF -- Voodoo2/Banshee only */ -#define sS_W0 (0x28c/4) /* W PF -- Voodoo2/Banshee only */ -#define sT_W0 (0x290/4) /* W PF -- Voodoo2/Banshee only */ -#define sWtmu1 (0x294/4) /* W PF -- Voodoo2/Banshee only */ -#define sS_Wtmu1 (0x298/4) /* W PF -- Voodoo2/Banshee only */ -#define sT_Wtmu1 (0x29c/4) /* W PF -- Voodoo2/Banshee only */ -#define sDrawTriCMD (0x2a0/4) /* W PF -- Voodoo2/Banshee only */ -#define sBeginTriCMD (0x2a4/4) /* W PF -- Voodoo2/Banshee only */ - -/* 0x2c0 */ -#define bltSrcBaseAddr (0x2c0/4) /* RW PF -- Voodoo2 only */ -#define bltDstBaseAddr (0x2c4/4) /* RW PF -- Voodoo2 only */ -#define bltXYStrides (0x2c8/4) /* RW PF -- Voodoo2 only */ -#define bltSrcChromaRange (0x2cc/4) /* RW PF -- Voodoo2 only */ -#define bltDstChromaRange (0x2d0/4) /* RW PF -- Voodoo2 only */ -#define bltClipX (0x2d4/4) /* RW PF -- Voodoo2 only */ -#define bltClipY (0x2d8/4) /* RW PF -- Voodoo2 only */ -#define bltSrcXY (0x2e0/4) /* RW PF -- Voodoo2 only */ -#define bltDstXY (0x2e4/4) /* RW PF -- Voodoo2 only */ -#define bltSize (0x2e8/4) /* RW PF -- Voodoo2 only */ -#define bltRop (0x2ec/4) /* RW PF -- Voodoo2 only */ -#define bltColor (0x2f0/4) /* RW PF -- Voodoo2 only */ -#define bltCommand (0x2f8/4) /* RW PF -- Voodoo2 only */ -#define bltData (0x2fc/4) /* W PF -- Voodoo2 only */ - -/* 0x300 */ -#define textureMode (0x300/4) /* W PF */ -#define tLOD (0x304/4) /* W PF */ -#define tDetail (0x308/4) /* W PF */ -#define texBaseAddr (0x30c/4) /* W PF */ -#define texBaseAddr_1 (0x310/4) /* W PF */ -#define texBaseAddr_2 (0x314/4) /* W PF */ -#define texBaseAddr_3_8 (0x318/4) /* W PF */ -#define trexInit0 (0x31c/4) /* W F -- Voodoo/Voodoo2 only */ -#define trexInit1 (0x320/4) /* W F */ -#define nccTable (0x324/4) /* W F */ - - - -// 2D registers -#define banshee2D_clip0Min (0x008/4) -#define banshee2D_clip0Max (0x00c/4) -#define banshee2D_dstBaseAddr (0x010/4) -#define banshee2D_dstFormat (0x014/4) -#define banshee2D_srcColorkeyMin (0x018/4) -#define banshee2D_srcColorkeyMax (0x01c/4) -#define banshee2D_dstColorkeyMin (0x020/4) -#define banshee2D_dstColorkeyMax (0x024/4) -#define banshee2D_bresError0 (0x028/4) -#define banshee2D_bresError1 (0x02c/4) -#define banshee2D_rop (0x030/4) -#define banshee2D_srcBaseAddr (0x034/4) -#define banshee2D_commandExtra (0x038/4) -#define banshee2D_lineStipple (0x03c/4) -#define banshee2D_lineStyle (0x040/4) -#define banshee2D_pattern0Alias (0x044/4) -#define banshee2D_pattern1Alias (0x048/4) -#define banshee2D_clip1Min (0x04c/4) -#define banshee2D_clip1Max (0x050/4) -#define banshee2D_srcFormat (0x054/4) -#define banshee2D_srcSize (0x058/4) -#define banshee2D_srcXY (0x05c/4) -#define banshee2D_colorBack (0x060/4) -#define banshee2D_colorFore (0x064/4) -#define banshee2D_dstSize (0x068/4) -#define banshee2D_dstXY (0x06c/4) -#define banshee2D_command (0x070/4) - - -/************************************* - * - * Alias map of the first 64 - * registers when remapped - * - *************************************/ - -static const UINT8 register_alias_map[0x40] = -{ - status, 0x004/4, vertexAx, vertexAy, - vertexBx, vertexBy, vertexCx, vertexCy, - startR, dRdX, dRdY, startG, - dGdX, dGdY, startB, dBdX, - dBdY, startZ, dZdX, dZdY, - startA, dAdX, dAdY, startS, - dSdX, dSdY, startT, dTdX, - dTdY, startW, dWdX, dWdY, - - triangleCMD,0x084/4, fvertexAx, fvertexAy, - fvertexBx, fvertexBy, fvertexCx, fvertexCy, - fstartR, fdRdX, fdRdY, fstartG, - fdGdX, fdGdY, fstartB, fdBdX, - fdBdY, fstartZ, fdZdX, fdZdY, - fstartA, fdAdX, fdAdY, fstartS, - fdSdX, fdSdY, fstartT, fdTdX, - fdTdY, fstartW, fdWdX, fdWdY -}; - - - -/************************************* - * - * Table of per-register access rights - * - *************************************/ - -static const UINT8 voodoo_register_access[0x100] = -{ - /* 0x000 */ - REG_RP, 0, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x040 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x080 */ - REG_WPF, 0, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x0c0 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x100 */ - REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWF, REG_RWF, REG_RWF, REG_RWF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, 0, 0, - - /* 0x140 */ - REG_RWF, REG_RWF, REG_RWF, REG_R, - REG_R, REG_R, REG_R, REG_R, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x180 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x1c0 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x200 */ - REG_RW, REG_R, REG_RW, REG_RW, - REG_RW, REG_RW, REG_RW, REG_RW, - REG_W, REG_W, REG_W, REG_W, - REG_W, 0, 0, 0, - - /* 0x240 */ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x280 */ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x2c0 */ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x300 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x340 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x380 */ - REG_WF -}; - - -static const UINT8 voodoo2_register_access[0x100] = -{ - /* 0x000 */ - REG_RP, REG_RWPT, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x040 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x080 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x0c0 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x100 */ - REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWF, REG_RWF, REG_RWF, REG_RWF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x140 */ - REG_RWF, REG_RWF, REG_RWF, REG_R, - REG_R, REG_R, REG_R, REG_R, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x180 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x1c0 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_RWT, REG_RWT, REG_RWT, REG_RWT, - REG_RWT, REG_RWT, REG_RWT, REG_RW, - - /* 0x200 */ - REG_RWT, REG_R, REG_RWT, REG_RWT, - REG_RWT, REG_RWT, REG_RWT, REG_RWT, - REG_WT, REG_WT, REG_WF, REG_WT, - REG_WT, REG_WT, REG_WT, REG_WT, - - /* 0x240 */ - REG_R, REG_RWT, REG_RWT, REG_RWT, - 0, 0, REG_R, REG_R, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x280 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, 0, 0, - 0, 0, 0, 0, - - /* 0x2c0 */ - REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWPF, REG_RWPF, REG_RWPF, REG_WPF, - - /* 0x300 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x340 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x380 */ - REG_WF -}; - - -static const UINT8 banshee_register_access[0x100] = -{ - /* 0x000 */ - REG_RP, REG_RWPT, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x040 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x080 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x0c0 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x100 */ - REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWF, REG_RWF, REG_RWF, REG_RWF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x140 */ - REG_RWF, REG_RWF, REG_RWF, REG_R, - REG_R, REG_R, REG_R, REG_R, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x180 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x1c0 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - 0, 0, 0, REG_RWF, - REG_RWF, REG_RWF, REG_RWF, 0, - - /* 0x200 */ - REG_RWF, REG_RWF, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x240 */ - 0, 0, 0, REG_WT, - REG_RWF, REG_RWF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_R, REG_R, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x280 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, 0, 0, - 0, 0, 0, 0, - - /* 0x2c0 */ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x300 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, 0, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x340 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x380 */ - REG_WF -}; - - - -/************************************* - * - * Register string table for debug - * - *************************************/ - -static const char *const voodoo_reg_name[] = -{ - /* 0x000 */ - "status", "{intrCtrl}", "vertexAx", "vertexAy", - "vertexBx", "vertexBy", "vertexCx", "vertexCy", - "startR", "startG", "startB", "startZ", - "startA", "startS", "startT", "startW", - /* 0x040 */ - "dRdX", "dGdX", "dBdX", "dZdX", - "dAdX", "dSdX", "dTdX", "dWdX", - "dRdY", "dGdY", "dBdY", "dZdY", - "dAdY", "dSdY", "dTdY", "dWdY", - /* 0x080 */ - "triangleCMD", "reserved084", "fvertexAx", "fvertexAy", - "fvertexBx", "fvertexBy", "fvertexCx", "fvertexCy", - "fstartR", "fstartG", "fstartB", "fstartZ", - "fstartA", "fstartS", "fstartT", "fstartW", - /* 0x0c0 */ - "fdRdX", "fdGdX", "fdBdX", "fdZdX", - "fdAdX", "fdSdX", "fdTdX", "fdWdX", - "fdRdY", "fdGdY", "fdBdY", "fdZdY", - "fdAdY", "fdSdY", "fdTdY", "fdWdY", - /* 0x100 */ - "ftriangleCMD", "fbzColorPath", "fogMode", "alphaMode", - "fbzMode", "lfbMode", "clipLeftRight","clipLowYHighY", - "nopCMD", "fastfillCMD", "swapbufferCMD","fogColor", - "zaColor", "chromaKey", "{chromaRange}","{userIntrCMD}", - /* 0x140 */ - "stipple", "color0", "color1", "fbiPixelsIn", - "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut", - "fogTable160", "fogTable164", "fogTable168", "fogTable16c", - "fogTable170", "fogTable174", "fogTable178", "fogTable17c", - /* 0x180 */ - "fogTable180", "fogTable184", "fogTable188", "fogTable18c", - "fogTable190", "fogTable194", "fogTable198", "fogTable19c", - "fogTable1a0", "fogTable1a4", "fogTable1a8", "fogTable1ac", - "fogTable1b0", "fogTable1b4", "fogTable1b8", "fogTable1bc", - /* 0x1c0 */ - "fogTable1c0", "fogTable1c4", "fogTable1c8", "fogTable1cc", - "fogTable1d0", "fogTable1d4", "fogTable1d8", "fogTable1dc", - "{cmdFifoBaseAddr}","{cmdFifoBump}","{cmdFifoRdPtr}","{cmdFifoAMin}", - "{cmdFifoAMax}","{cmdFifoDepth}","{cmdFifoHoles}","reserved1fc", - /* 0x200 */ - "fbiInit4", "vRetrace", "backPorch", "videoDimensions", - "fbiInit0", "fbiInit1", "fbiInit2", "fbiInit3", - "hSync", "vSync", "clutData", "dacData", - "maxRgbDelta", "{hBorder}", "{vBorder}", "{borderColor}", - /* 0x240 */ - "{hvRetrace}", "{fbiInit5}", "{fbiInit6}", "{fbiInit7}", - "reserved250", "reserved254", "{fbiSwapHistory}","{fbiTrianglesOut}", - "{sSetupMode}", "{sVx}", "{sVy}", "{sARGB}", - "{sRed}", "{sGreen}", "{sBlue}", "{sAlpha}", - /* 0x280 */ - "{sVz}", "{sWb}", "{sWtmu0}", "{sS/Wtmu0}", - "{sT/Wtmu0}", "{sWtmu1}", "{sS/Wtmu1}", "{sT/Wtmu1}", - "{sDrawTriCMD}","{sBeginTriCMD}","reserved2a8", "reserved2ac", - "reserved2b0", "reserved2b4", "reserved2b8", "reserved2bc", - /* 0x2c0 */ - "{bltSrcBaseAddr}","{bltDstBaseAddr}","{bltXYStrides}","{bltSrcChromaRange}", - "{bltDstChromaRange}","{bltClipX}","{bltClipY}","reserved2dc", - "{bltSrcXY}", "{bltDstXY}", "{bltSize}", "{bltRop}", - "{bltColor}", "reserved2f4", "{bltCommand}", "{bltData}", - /* 0x300 */ - "textureMode", "tLOD", "tDetail", "texBaseAddr", - "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","trexInit0", - "trexInit1", "nccTable0.0", "nccTable0.1", "nccTable0.2", - "nccTable0.3", "nccTable0.4", "nccTable0.5", "nccTable0.6", - /* 0x340 */ - "nccTable0.7", "nccTable0.8", "nccTable0.9", "nccTable0.A", - "nccTable0.B", "nccTable1.0", "nccTable1.1", "nccTable1.2", - "nccTable1.3", "nccTable1.4", "nccTable1.5", "nccTable1.6", - "nccTable1.7", "nccTable1.8", "nccTable1.9", "nccTable1.A", - /* 0x380 */ - "nccTable1.B" -}; - - -static const char *const banshee_reg_name[] = -{ - /* 0x000 */ - "status", "intrCtrl", "vertexAx", "vertexAy", - "vertexBx", "vertexBy", "vertexCx", "vertexCy", - "startR", "startG", "startB", "startZ", - "startA", "startS", "startT", "startW", - /* 0x040 */ - "dRdX", "dGdX", "dBdX", "dZdX", - "dAdX", "dSdX", "dTdX", "dWdX", - "dRdY", "dGdY", "dBdY", "dZdY", - "dAdY", "dSdY", "dTdY", "dWdY", - /* 0x080 */ - "triangleCMD", "reserved084", "fvertexAx", "fvertexAy", - "fvertexBx", "fvertexBy", "fvertexCx", "fvertexCy", - "fstartR", "fstartG", "fstartB", "fstartZ", - "fstartA", "fstartS", "fstartT", "fstartW", - /* 0x0c0 */ - "fdRdX", "fdGdX", "fdBdX", "fdZdX", - "fdAdX", "fdSdX", "fdTdX", "fdWdX", - "fdRdY", "fdGdY", "fdBdY", "fdZdY", - "fdAdY", "fdSdY", "fdTdY", "fdWdY", - /* 0x100 */ - "ftriangleCMD", "fbzColorPath", "fogMode", "alphaMode", - "fbzMode", "lfbMode", "clipLeftRight","clipLowYHighY", - "nopCMD", "fastfillCMD", "swapbufferCMD","fogColor", - "zaColor", "chromaKey", "chromaRange", "userIntrCMD", - /* 0x140 */ - "stipple", "color0", "color1", "fbiPixelsIn", - "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut", - "fogTable160", "fogTable164", "fogTable168", "fogTable16c", - "fogTable170", "fogTable174", "fogTable178", "fogTable17c", - /* 0x180 */ - "fogTable180", "fogTable184", "fogTable188", "fogTable18c", - "fogTable190", "fogTable194", "fogTable198", "fogTable19c", - "fogTable1a0", "fogTable1a4", "fogTable1a8", "fogTable1ac", - "fogTable1b0", "fogTable1b4", "fogTable1b8", "fogTable1bc", - /* 0x1c0 */ - "fogTable1c0", "fogTable1c4", "fogTable1c8", "fogTable1cc", - "fogTable1d0", "fogTable1d4", "fogTable1d8", "fogTable1dc", - "reserved1e0", "reserved1e4", "reserved1e8", "colBufferAddr", - "colBufferStride","auxBufferAddr","auxBufferStride","reserved1fc", - /* 0x200 */ - "clipLeftRight1","clipTopBottom1","reserved208","reserved20c", - "reserved210", "reserved214", "reserved218", "reserved21c", - "reserved220", "reserved224", "reserved228", "reserved22c", - "reserved230", "reserved234", "reserved238", "reserved23c", - /* 0x240 */ - "reserved240", "reserved244", "reserved248", "swapPending", - "leftOverlayBuf","rightOverlayBuf","fbiSwapHistory","fbiTrianglesOut", - "sSetupMode", "sVx", "sVy", "sARGB", - "sRed", "sGreen", "sBlue", "sAlpha", - /* 0x280 */ - "sVz", "sWb", "sWtmu0", "sS/Wtmu0", - "sT/Wtmu0", "sWtmu1", "sS/Wtmu1", "sT/Wtmu1", - "sDrawTriCMD", "sBeginTriCMD", "reserved2a8", "reserved2ac", - "reserved2b0", "reserved2b4", "reserved2b8", "reserved2bc", - /* 0x2c0 */ - "reserved2c0", "reserved2c4", "reserved2c8", "reserved2cc", - "reserved2d0", "reserved2d4", "reserved2d8", "reserved2dc", - "reserved2e0", "reserved2e4", "reserved2e8", "reserved2ec", - "reserved2f0", "reserved2f4", "reserved2f8", "reserved2fc", - /* 0x300 */ - "textureMode", "tLOD", "tDetail", "texBaseAddr", - "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","reserved31c", - "trexInit1", "nccTable0.0", "nccTable0.1", "nccTable0.2", - "nccTable0.3", "nccTable0.4", "nccTable0.5", "nccTable0.6", - /* 0x340 */ - "nccTable0.7", "nccTable0.8", "nccTable0.9", "nccTable0.A", - "nccTable0.B", "nccTable1.0", "nccTable1.1", "nccTable1.2", - "nccTable1.3", "nccTable1.4", "nccTable1.5", "nccTable1.6", - "nccTable1.7", "nccTable1.8", "nccTable1.9", "nccTable1.A", - /* 0x380 */ - "nccTable1.B" -}; - - - -/************************************* - * - * Voodoo Banshee I/O space registers - * - *************************************/ - -/* 0x000 */ -#define io_status (0x000/4) /* */ -#define io_pciInit0 (0x004/4) /* */ -#define io_sipMonitor (0x008/4) /* */ -#define io_lfbMemoryConfig (0x00c/4) /* */ -#define io_miscInit0 (0x010/4) /* */ -#define io_miscInit1 (0x014/4) /* */ -#define io_dramInit0 (0x018/4) /* */ -#define io_dramInit1 (0x01c/4) /* */ -#define io_agpInit (0x020/4) /* */ -#define io_tmuGbeInit (0x024/4) /* */ -#define io_vgaInit0 (0x028/4) /* */ -#define io_vgaInit1 (0x02c/4) /* */ -#define io_dramCommand (0x030/4) /* */ -#define io_dramData (0x034/4) /* */ - -/* 0x040 */ -#define io_pllCtrl0 (0x040/4) /* */ -#define io_pllCtrl1 (0x044/4) /* */ -#define io_pllCtrl2 (0x048/4) /* */ -#define io_dacMode (0x04c/4) /* */ -#define io_dacAddr (0x050/4) /* */ -#define io_dacData (0x054/4) /* */ -#define io_rgbMaxDelta (0x058/4) /* */ -#define io_vidProcCfg (0x05c/4) /* */ -#define io_hwCurPatAddr (0x060/4) /* */ -#define io_hwCurLoc (0x064/4) /* */ -#define io_hwCurC0 (0x068/4) /* */ -#define io_hwCurC1 (0x06c/4) /* */ -#define io_vidInFormat (0x070/4) /* */ -#define io_vidInStatus (0x074/4) /* */ -#define io_vidSerialParallelPort (0x078/4) /* */ -#define io_vidInXDecimDeltas (0x07c/4) /* */ - -/* 0x080 */ -#define io_vidInDecimInitErrs (0x080/4) /* */ -#define io_vidInYDecimDeltas (0x084/4) /* */ -#define io_vidPixelBufThold (0x088/4) /* */ -#define io_vidChromaMin (0x08c/4) /* */ -#define io_vidChromaMax (0x090/4) /* */ -#define io_vidCurrentLine (0x094/4) /* */ -#define io_vidScreenSize (0x098/4) /* */ -#define io_vidOverlayStartCoords (0x09c/4) /* */ -#define io_vidOverlayEndScreenCoord (0x0a0/4) /* */ -#define io_vidOverlayDudx (0x0a4/4) /* */ -#define io_vidOverlayDudxOffsetSrcWidth (0x0a8/4) /* */ -#define io_vidOverlayDvdy (0x0ac/4) /* */ -#define io_vgab0 (0x0b0/4) /* */ -#define io_vgab4 (0x0b4/4) /* */ -#define io_vgab8 (0x0b8/4) /* */ -#define io_vgabc (0x0bc/4) /* */ - -/* 0x0c0 */ -#define io_vgac0 (0x0c0/4) /* */ -#define io_vgac4 (0x0c4/4) /* */ -#define io_vgac8 (0x0c8/4) /* */ -#define io_vgacc (0x0cc/4) /* */ -#define io_vgad0 (0x0d0/4) /* */ -#define io_vgad4 (0x0d4/4) /* */ -#define io_vgad8 (0x0d8/4) /* */ -#define io_vgadc (0x0dc/4) /* */ -#define io_vidOverlayDvdyOffset (0x0e0/4) /* */ -#define io_vidDesktopStartAddr (0x0e4/4) /* */ -#define io_vidDesktopOverlayStride (0x0e8/4) /* */ -#define io_vidInAddr0 (0x0ec/4) /* */ -#define io_vidInAddr1 (0x0f0/4) /* */ -#define io_vidInAddr2 (0x0f4/4) /* */ -#define io_vidInStride (0x0f8/4) /* */ -#define io_vidCurrOverlayStartAddr (0x0fc/4) /* */ - - - -/************************************* - * - * Register string table for debug - * - *************************************/ - -static const char *const banshee_io_reg_name[] = -{ - /* 0x000 */ - "status", "pciInit0", "sipMonitor", "lfbMemoryConfig", - "miscInit0", "miscInit1", "dramInit0", "dramInit1", - "agpInit", "tmuGbeInit", "vgaInit0", "vgaInit1", - "dramCommand", "dramData", "reserved38", "reserved3c", - - /* 0x040 */ - "pllCtrl0", "pllCtrl1", "pllCtrl2", "dacMode", - "dacAddr", "dacData", "rgbMaxDelta", "vidProcCfg", - "hwCurPatAddr", "hwCurLoc", "hwCurC0", "hwCurC1", - "vidInFormat", "vidInStatus", "vidSerialParallelPort","vidInXDecimDeltas", - - /* 0x080 */ - "vidInDecimInitErrs","vidInYDecimDeltas","vidPixelBufThold","vidChromaMin", - "vidChromaMax", "vidCurrentLine","vidScreenSize","vidOverlayStartCoords", - "vidOverlayEndScreenCoord","vidOverlayDudx","vidOverlayDudxOffsetSrcWidth","vidOverlayDvdy", - "vga[b0]", "vga[b4]", "vga[b8]", "vga[bc]", - - /* 0x0c0 */ - "vga[c0]", "vga[c4]", "vga[c8]", "vga[cc]", - "vga[d0]", "vga[d4]", "vga[d8]", "vga[dc]", - "vidOverlayDvdyOffset","vidDesktopStartAddr","vidDesktopOverlayStride","vidInAddr0", - "vidInAddr1", "vidInAddr2", "vidInStride", "vidCurrOverlayStartAddr" -}; - - - -/************************************* - * - * Voodoo Banshee AGP space registers - * - *************************************/ - -/* 0x000 */ -#define agpReqSize (0x000/4) /* */ -#define agpHostAddressLow (0x004/4) /* */ -#define agpHostAddressHigh (0x008/4) /* */ -#define agpGraphicsAddress (0x00c/4) /* */ -#define agpGraphicsStride (0x010/4) /* */ -#define agpMoveCMD (0x014/4) /* */ -#define cmdBaseAddr0 (0x020/4) /* */ -#define cmdBaseSize0 (0x024/4) /* */ -#define cmdBump0 (0x028/4) /* */ -#define cmdRdPtrL0 (0x02c/4) /* */ -#define cmdRdPtrH0 (0x030/4) /* */ -#define cmdAMin0 (0x034/4) /* */ -#define cmdAMax0 (0x03c/4) /* */ - -/* 0x040 */ -#define cmdFifoDepth0 (0x044/4) /* */ -#define cmdHoleCnt0 (0x048/4) /* */ -#define cmdBaseAddr1 (0x050/4) /* */ -#define cmdBaseSize1 (0x054/4) /* */ -#define cmdBump1 (0x058/4) /* */ -#define cmdRdPtrL1 (0x05c/4) /* */ -#define cmdRdPtrH1 (0x060/4) /* */ -#define cmdAMin1 (0x064/4) /* */ -#define cmdAMax1 (0x06c/4) /* */ -#define cmdFifoDepth1 (0x074/4) /* */ -#define cmdHoleCnt1 (0x078/4) /* */ - -/* 0x080 */ -#define cmdFifoThresh (0x080/4) /* */ -#define cmdHoleInt (0x084/4) /* */ - -/* 0x100 */ -#define yuvBaseAddress (0x100/4) /* */ -#define yuvStride (0x104/4) /* */ -#define crc1 (0x120/4) /* */ -#define crc2 (0x130/4) /* */ - - - -/************************************* - * - * Register string table for debug - * - *************************************/ - -static const char *const banshee_agp_reg_name[] = -{ - /* 0x000 */ - "agpReqSize", "agpHostAddressLow","agpHostAddressHigh","agpGraphicsAddress", - "agpGraphicsStride","agpMoveCMD","reserved18", "reserved1c", - "cmdBaseAddr0", "cmdBaseSize0", "cmdBump0", "cmdRdPtrL0", - "cmdRdPtrH0", "cmdAMin0", "reserved38", "cmdAMax0", - - /* 0x040 */ - "reserved40", "cmdFifoDepth0","cmdHoleCnt0", "reserved4c", - "cmdBaseAddr1", "cmdBaseSize1", "cmdBump1", "cmdRdPtrL1", - "cmdRdPtrH1", "cmdAMin1", "reserved68", "cmdAMax1", - "reserved70", "cmdFifoDepth1","cmdHoleCnt1", "reserved7c", - - /* 0x080 */ - "cmdFifoThresh","cmdHoleInt", "reserved88", "reserved8c", - "reserved90", "reserved94", "reserved98", "reserved9c", - "reserveda0", "reserveda4", "reserveda8", "reservedac", - "reservedb0", "reservedb4", "reservedb8", "reservedbc", - - /* 0x0c0 */ - "reservedc0", "reservedc4", "reservedc8", "reservedcc", - "reservedd0", "reservedd4", "reservedd8", "reserveddc", - "reservede0", "reservede4", "reservede8", "reservedec", - "reservedf0", "reservedf4", "reservedf8", "reservedfc", - - /* 0x100 */ - "yuvBaseAddress","yuvStride", "reserved108", "reserved10c", - "reserved110", "reserved114", "reserved118", "reserved11c", - "crc1", "reserved124", "reserved128", "reserved12c", - "crc2", "reserved134", "reserved138", "reserved13c" -}; - - - -/************************************* - * - * Dithering tables - * - *************************************/ - -static const UINT8 dither_matrix_4x4[16] = -{ - 0, 8, 2, 10, - 12, 4, 14, 6, - 3, 11, 1, 9, - 15, 7, 13, 5 -}; - -static const UINT8 dither_matrix_2x2[16] = -{ - 2, 10, 2, 10, - 14, 6, 14, 6, - 2, 10, 2, 10, - 14, 6, 14, 6 -}; - - - -/************************************* - * - * Macros for extracting pixels - * - *************************************/ - -#define EXTRACT_565_TO_888(val, a, b, c) \ - (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07); \ - (b) = (((val) >> 3) & 0xfc) | (((val) >> 9) & 0x03); \ - (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07); -#define EXTRACT_x555_TO_888(val, a, b, c) \ - (a) = (((val) >> 7) & 0xf8) | (((val) >> 12) & 0x07); \ - (b) = (((val) >> 2) & 0xf8) | (((val) >> 7) & 0x07); \ - (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07); -#define EXTRACT_555x_TO_888(val, a, b, c) \ - (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07); \ - (b) = (((val) >> 3) & 0xf8) | (((val) >> 8) & 0x07); \ - (c) = (((val) << 2) & 0xf8) | (((val) >> 3) & 0x07); -#define EXTRACT_1555_TO_8888(val, a, b, c, d) \ - (a) = ((INT16)(val) >> 15) & 0xff; \ - EXTRACT_x555_TO_888(val, b, c, d) -#define EXTRACT_5551_TO_8888(val, a, b, c, d) \ - EXTRACT_555x_TO_888(val, a, b, c) \ - (d) = ((val) & 0x0001) ? 0xff : 0x00; -#define EXTRACT_x888_TO_888(val, a, b, c) \ - (a) = ((val) >> 16) & 0xff; \ - (b) = ((val) >> 8) & 0xff; \ - (c) = ((val) >> 0) & 0xff; -#define EXTRACT_888x_TO_888(val, a, b, c) \ - (a) = ((val) >> 24) & 0xff; \ - (b) = ((val) >> 16) & 0xff; \ - (c) = ((val) >> 8) & 0xff; -#define EXTRACT_8888_TO_8888(val, a, b, c, d) \ - (a) = ((val) >> 24) & 0xff; \ - (b) = ((val) >> 16) & 0xff; \ - (c) = ((val) >> 8) & 0xff; \ - (d) = ((val) >> 0) & 0xff; -#define EXTRACT_4444_TO_8888(val, a, b, c, d) \ - (a) = (((val) >> 8) & 0xf0) | (((val) >> 12) & 0x0f); \ - (b) = (((val) >> 4) & 0xf0) | (((val) >> 8) & 0x0f); \ - (c) = (((val) >> 0) & 0xf0) | (((val) >> 4) & 0x0f); \ - (d) = (((val) << 4) & 0xf0) | (((val) >> 0) & 0x0f); -#define EXTRACT_332_TO_888(val, a, b, c) \ - (a) = (((val) >> 0) & 0xe0) | (((val) >> 3) & 0x1c) | (((val) >> 6) & 0x03); \ - (b) = (((val) << 3) & 0xe0) | (((val) >> 0) & 0x1c) | (((val) >> 3) & 0x03); \ - (c) = (((val) << 6) & 0xc0) | (((val) << 4) & 0x30) | (((val) << 2) & 0x0c) | (((val) << 0) & 0x03); - - -/************************************* - * - * Misc. macros - * - *************************************/ - -/* macro for clamping a value between minimum and maximum values */ -#define CLAMP(val,min,max) do { if ((val) < (min)) { (val) = (min); } else if ((val) > (max)) { (val) = (max); } } while (0) - -/* macro to compute the base 2 log for LOD calculations */ -#define LOGB2(x) (log((double)(x)) / log(2.0)) - - - -/************************************* - * - * Macros for extracting bitfields - * - *************************************/ - -#define INITEN_ENABLE_HW_INIT(val) (((val) >> 0) & 1) -#define INITEN_ENABLE_PCI_FIFO(val) (((val) >> 1) & 1) -#define INITEN_REMAP_INIT_TO_DAC(val) (((val) >> 2) & 1) -#define INITEN_ENABLE_SNOOP0(val) (((val) >> 4) & 1) -#define INITEN_SNOOP0_MEMORY_MATCH(val) (((val) >> 5) & 1) -#define INITEN_SNOOP0_READWRITE_MATCH(val) (((val) >> 6) & 1) -#define INITEN_ENABLE_SNOOP1(val) (((val) >> 7) & 1) -#define INITEN_SNOOP1_MEMORY_MATCH(val) (((val) >> 8) & 1) -#define INITEN_SNOOP1_READWRITE_MATCH(val) (((val) >> 9) & 1) -#define INITEN_SLI_BUS_OWNER(val) (((val) >> 10) & 1) -#define INITEN_SLI_ODD_EVEN(val) (((val) >> 11) & 1) -#define INITEN_SECONDARY_REV_ID(val) (((val) >> 12) & 0xf) /* voodoo 2 only */ -#define INITEN_MFCTR_FAB_ID(val) (((val) >> 16) & 0xf) /* voodoo 2 only */ -#define INITEN_ENABLE_PCI_INTERRUPT(val) (((val) >> 20) & 1) /* voodoo 2 only */ -#define INITEN_PCI_INTERRUPT_TIMEOUT(val) (((val) >> 21) & 1) /* voodoo 2 only */ -#define INITEN_ENABLE_NAND_TREE_TEST(val) (((val) >> 22) & 1) /* voodoo 2 only */ -#define INITEN_ENABLE_SLI_ADDRESS_SNOOP(val) (((val) >> 23) & 1) /* voodoo 2 only */ -#define INITEN_SLI_SNOOP_ADDRESS(val) (((val) >> 24) & 0xff) /* voodoo 2 only */ - -#define FBZCP_CC_RGBSELECT(val) (((val) >> 0) & 3) -#define FBZCP_CC_ASELECT(val) (((val) >> 2) & 3) -#define FBZCP_CC_LOCALSELECT(val) (((val) >> 4) & 1) -#define FBZCP_CCA_LOCALSELECT(val) (((val) >> 5) & 3) -#define FBZCP_CC_LOCALSELECT_OVERRIDE(val) (((val) >> 7) & 1) -#define FBZCP_CC_ZERO_OTHER(val) (((val) >> 8) & 1) -#define FBZCP_CC_SUB_CLOCAL(val) (((val) >> 9) & 1) -#define FBZCP_CC_MSELECT(val) (((val) >> 10) & 7) -#define FBZCP_CC_REVERSE_BLEND(val) (((val) >> 13) & 1) -#define FBZCP_CC_ADD_ACLOCAL(val) (((val) >> 14) & 3) -#define FBZCP_CC_INVERT_OUTPUT(val) (((val) >> 16) & 1) -#define FBZCP_CCA_ZERO_OTHER(val) (((val) >> 17) & 1) -#define FBZCP_CCA_SUB_CLOCAL(val) (((val) >> 18) & 1) -#define FBZCP_CCA_MSELECT(val) (((val) >> 19) & 7) -#define FBZCP_CCA_REVERSE_BLEND(val) (((val) >> 22) & 1) -#define FBZCP_CCA_ADD_ACLOCAL(val) (((val) >> 23) & 3) -#define FBZCP_CCA_INVERT_OUTPUT(val) (((val) >> 25) & 1) -#define FBZCP_CCA_SUBPIXEL_ADJUST(val) (((val) >> 26) & 1) -#define FBZCP_TEXTURE_ENABLE(val) (((val) >> 27) & 1) -#define FBZCP_RGBZW_CLAMP(val) (((val) >> 28) & 1) /* voodoo 2 only */ -#define FBZCP_ANTI_ALIAS(val) (((val) >> 29) & 1) /* voodoo 2 only */ - -#define ALPHAMODE_ALPHATEST(val) (((val) >> 0) & 1) -#define ALPHAMODE_ALPHAFUNCTION(val) (((val) >> 1) & 7) -#define ALPHAMODE_ALPHABLEND(val) (((val) >> 4) & 1) -#define ALPHAMODE_ANTIALIAS(val) (((val) >> 5) & 1) -#define ALPHAMODE_SRCRGBBLEND(val) (((val) >> 8) & 15) -#define ALPHAMODE_DSTRGBBLEND(val) (((val) >> 12) & 15) -#define ALPHAMODE_SRCALPHABLEND(val) (((val) >> 16) & 15) -#define ALPHAMODE_DSTALPHABLEND(val) (((val) >> 20) & 15) -#define ALPHAMODE_ALPHAREF(val) (((val) >> 24) & 0xff) - -#define FOGMODE_ENABLE_FOG(val) (((val) >> 0) & 1) -#define FOGMODE_FOG_ADD(val) (((val) >> 1) & 1) -#define FOGMODE_FOG_MULT(val) (((val) >> 2) & 1) -#define FOGMODE_FOG_ZALPHA(val) (((val) >> 3) & 3) -#define FOGMODE_FOG_CONSTANT(val) (((val) >> 5) & 1) -#define FOGMODE_FOG_DITHER(val) (((val) >> 6) & 1) /* voodoo 2 only */ -#define FOGMODE_FOG_ZONES(val) (((val) >> 7) & 1) /* voodoo 2 only */ - -#define FBZMODE_ENABLE_CLIPPING(val) (((val) >> 0) & 1) -#define FBZMODE_ENABLE_CHROMAKEY(val) (((val) >> 1) & 1) -#define FBZMODE_ENABLE_STIPPLE(val) (((val) >> 2) & 1) -#define FBZMODE_WBUFFER_SELECT(val) (((val) >> 3) & 1) -#define FBZMODE_ENABLE_DEPTHBUF(val) (((val) >> 4) & 1) -#define FBZMODE_DEPTH_FUNCTION(val) (((val) >> 5) & 7) -#define FBZMODE_ENABLE_DITHERING(val) (((val) >> 8) & 1) -#define FBZMODE_RGB_BUFFER_MASK(val) (((val) >> 9) & 1) -#define FBZMODE_AUX_BUFFER_MASK(val) (((val) >> 10) & 1) -#define FBZMODE_DITHER_TYPE(val) (((val) >> 11) & 1) -#define FBZMODE_STIPPLE_PATTERN(val) (((val) >> 12) & 1) -#define FBZMODE_ENABLE_ALPHA_MASK(val) (((val) >> 13) & 1) -#define FBZMODE_DRAW_BUFFER(val) (((val) >> 14) & 3) -#define FBZMODE_ENABLE_DEPTH_BIAS(val) (((val) >> 16) & 1) -#define FBZMODE_Y_ORIGIN(val) (((val) >> 17) & 1) -#define FBZMODE_ENABLE_ALPHA_PLANES(val) (((val) >> 18) & 1) -#define FBZMODE_ALPHA_DITHER_SUBTRACT(val) (((val) >> 19) & 1) -#define FBZMODE_DEPTH_SOURCE_COMPARE(val) (((val) >> 20) & 1) -#define FBZMODE_DEPTH_FLOAT_SELECT(val) (((val) >> 21) & 1) /* voodoo 2 only */ - -#define LFBMODE_WRITE_FORMAT(val) (((val) >> 0) & 0xf) -#define LFBMODE_WRITE_BUFFER_SELECT(val) (((val) >> 4) & 3) -#define LFBMODE_READ_BUFFER_SELECT(val) (((val) >> 6) & 3) -#define LFBMODE_ENABLE_PIXEL_PIPELINE(val) (((val) >> 8) & 1) -#define LFBMODE_RGBA_LANES(val) (((val) >> 9) & 3) -#define LFBMODE_WORD_SWAP_WRITES(val) (((val) >> 11) & 1) -#define LFBMODE_BYTE_SWIZZLE_WRITES(val) (((val) >> 12) & 1) -#define LFBMODE_Y_ORIGIN(val) (((val) >> 13) & 1) -#define LFBMODE_WRITE_W_SELECT(val) (((val) >> 14) & 1) -#define LFBMODE_WORD_SWAP_READS(val) (((val) >> 15) & 1) -#define LFBMODE_BYTE_SWIZZLE_READS(val) (((val) >> 16) & 1) - -#define CHROMARANGE_BLUE_EXCLUSIVE(val) (((val) >> 24) & 1) -#define CHROMARANGE_GREEN_EXCLUSIVE(val) (((val) >> 25) & 1) -#define CHROMARANGE_RED_EXCLUSIVE(val) (((val) >> 26) & 1) -#define CHROMARANGE_UNION_MODE(val) (((val) >> 27) & 1) -#define CHROMARANGE_ENABLE(val) (((val) >> 28) & 1) - -#define FBIINIT0_VGA_PASSTHRU(val) (((val) >> 0) & 1) -#define FBIINIT0_GRAPHICS_RESET(val) (((val) >> 1) & 1) -#define FBIINIT0_FIFO_RESET(val) (((val) >> 2) & 1) -#define FBIINIT0_SWIZZLE_REG_WRITES(val) (((val) >> 3) & 1) -#define FBIINIT0_STALL_PCIE_FOR_HWM(val) (((val) >> 4) & 1) -#define FBIINIT0_PCI_FIFO_LWM(val) (((val) >> 6) & 0x1f) -#define FBIINIT0_LFB_TO_MEMORY_FIFO(val) (((val) >> 11) & 1) -#define FBIINIT0_TEXMEM_TO_MEMORY_FIFO(val) (((val) >> 12) & 1) -#define FBIINIT0_ENABLE_MEMORY_FIFO(val) (((val) >> 13) & 1) -#define FBIINIT0_MEMORY_FIFO_HWM(val) (((val) >> 14) & 0x7ff) -#define FBIINIT0_MEMORY_FIFO_BURST(val) (((val) >> 25) & 0x3f) - -#define FBIINIT1_PCI_DEV_FUNCTION(val) (((val) >> 0) & 1) -#define FBIINIT1_PCI_WRITE_WAIT_STATES(val) (((val) >> 1) & 1) -#define FBIINIT1_MULTI_SST1(val) (((val) >> 2) & 1) /* not on voodoo 2 */ -#define FBIINIT1_ENABLE_LFB(val) (((val) >> 3) & 1) -#define FBIINIT1_X_VIDEO_TILES(val) (((val) >> 4) & 0xf) -#define FBIINIT1_VIDEO_TIMING_RESET(val) (((val) >> 8) & 1) -#define FBIINIT1_SOFTWARE_OVERRIDE(val) (((val) >> 9) & 1) -#define FBIINIT1_SOFTWARE_HSYNC(val) (((val) >> 10) & 1) -#define FBIINIT1_SOFTWARE_VSYNC(val) (((val) >> 11) & 1) -#define FBIINIT1_SOFTWARE_BLANK(val) (((val) >> 12) & 1) -#define FBIINIT1_DRIVE_VIDEO_TIMING(val) (((val) >> 13) & 1) -#define FBIINIT1_DRIVE_VIDEO_BLANK(val) (((val) >> 14) & 1) -#define FBIINIT1_DRIVE_VIDEO_SYNC(val) (((val) >> 15) & 1) -#define FBIINIT1_DRIVE_VIDEO_DCLK(val) (((val) >> 16) & 1) -#define FBIINIT1_VIDEO_TIMING_VCLK(val) (((val) >> 17) & 1) -#define FBIINIT1_VIDEO_CLK_2X_DELAY(val) (((val) >> 18) & 3) -#define FBIINIT1_VIDEO_TIMING_SOURCE(val) (((val) >> 20) & 3) -#define FBIINIT1_ENABLE_24BPP_OUTPUT(val) (((val) >> 22) & 1) -#define FBIINIT1_ENABLE_SLI(val) (((val) >> 23) & 1) -#define FBIINIT1_X_VIDEO_TILES_BIT5(val) (((val) >> 24) & 1) /* voodoo 2 only */ -#define FBIINIT1_ENABLE_EDGE_FILTER(val) (((val) >> 25) & 1) -#define FBIINIT1_INVERT_VID_CLK_2X(val) (((val) >> 26) & 1) -#define FBIINIT1_VID_CLK_2X_SEL_DELAY(val) (((val) >> 27) & 3) -#define FBIINIT1_VID_CLK_DELAY(val) (((val) >> 29) & 3) -#define FBIINIT1_DISABLE_FAST_READAHEAD(val) (((val) >> 31) & 1) - -#define FBIINIT2_DISABLE_DITHER_SUB(val) (((val) >> 0) & 1) -#define FBIINIT2_DRAM_BANKING(val) (((val) >> 1) & 1) -#define FBIINIT2_ENABLE_TRIPLE_BUF(val) (((val) >> 4) & 1) -#define FBIINIT2_ENABLE_FAST_RAS_READ(val) (((val) >> 5) & 1) -#define FBIINIT2_ENABLE_GEN_DRAM_OE(val) (((val) >> 6) & 1) -#define FBIINIT2_ENABLE_FAST_READWRITE(val) (((val) >> 7) & 1) -#define FBIINIT2_ENABLE_PASSTHRU_DITHER(val) (((val) >> 8) & 1) -#define FBIINIT2_SWAP_BUFFER_ALGORITHM(val) (((val) >> 9) & 3) -#define FBIINIT2_VIDEO_BUFFER_OFFSET(val) (((val) >> 11) & 0x1ff) -#define FBIINIT2_ENABLE_DRAM_BANKING(val) (((val) >> 20) & 1) -#define FBIINIT2_ENABLE_DRAM_READ_FIFO(val) (((val) >> 21) & 1) -#define FBIINIT2_ENABLE_DRAM_REFRESH(val) (((val) >> 22) & 1) -#define FBIINIT2_REFRESH_LOAD_VALUE(val) (((val) >> 23) & 0x1ff) - -#define FBIINIT3_TRI_REGISTER_REMAP(val) (((val) >> 0) & 1) -#define FBIINIT3_VIDEO_FIFO_THRESH(val) (((val) >> 1) & 0x1f) -#define FBIINIT3_DISABLE_TMUS(val) (((val) >> 6) & 1) -#define FBIINIT3_FBI_MEMORY_TYPE(val) (((val) >> 8) & 7) -#define FBIINIT3_VGA_PASS_RESET_VAL(val) (((val) >> 11) & 1) -#define FBIINIT3_HARDCODE_PCI_BASE(val) (((val) >> 12) & 1) -#define FBIINIT3_FBI2TREX_DELAY(val) (((val) >> 13) & 0xf) -#define FBIINIT3_TREX2FBI_DELAY(val) (((val) >> 17) & 0x1f) -#define FBIINIT3_YORIGIN_SUBTRACT(val) (((val) >> 22) & 0x3ff) - -#define FBIINIT4_PCI_READ_WAITS(val) (((val) >> 0) & 1) -#define FBIINIT4_ENABLE_LFB_READAHEAD(val) (((val) >> 1) & 1) -#define FBIINIT4_MEMORY_FIFO_LWM(val) (((val) >> 2) & 0x3f) -#define FBIINIT4_MEMORY_FIFO_START_ROW(val) (((val) >> 8) & 0x3ff) -#define FBIINIT4_MEMORY_FIFO_STOP_ROW(val) (((val) >> 18) & 0x3ff) -#define FBIINIT4_VIDEO_CLOCKING_DELAY(val) (((val) >> 29) & 7) /* voodoo 2 only */ - -#define FBIINIT5_DISABLE_PCI_STOP(val) (((val) >> 0) & 1) /* voodoo 2 only */ -#define FBIINIT5_PCI_SLAVE_SPEED(val) (((val) >> 1) & 1) /* voodoo 2 only */ -#define FBIINIT5_DAC_DATA_OUTPUT_WIDTH(val) (((val) >> 2) & 1) /* voodoo 2 only */ -#define FBIINIT5_DAC_DATA_17_OUTPUT(val) (((val) >> 3) & 1) /* voodoo 2 only */ -#define FBIINIT5_DAC_DATA_18_OUTPUT(val) (((val) >> 4) & 1) /* voodoo 2 only */ -#define FBIINIT5_GENERIC_STRAPPING(val) (((val) >> 5) & 0xf) /* voodoo 2 only */ -#define FBIINIT5_BUFFER_ALLOCATION(val) (((val) >> 9) & 3) /* voodoo 2 only */ -#define FBIINIT5_DRIVE_VID_CLK_SLAVE(val) (((val) >> 11) & 1) /* voodoo 2 only */ -#define FBIINIT5_DRIVE_DAC_DATA_16(val) (((val) >> 12) & 1) /* voodoo 2 only */ -#define FBIINIT5_VCLK_INPUT_SELECT(val) (((val) >> 13) & 1) /* voodoo 2 only */ -#define FBIINIT5_MULTI_CVG_DETECT(val) (((val) >> 14) & 1) /* voodoo 2 only */ -#define FBIINIT5_SYNC_RETRACE_READS(val) (((val) >> 15) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_RHBORDER_COLOR(val) (((val) >> 16) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_LHBORDER_COLOR(val) (((val) >> 17) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_BVBORDER_COLOR(val) (((val) >> 18) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_TVBORDER_COLOR(val) (((val) >> 19) & 1) /* voodoo 2 only */ -#define FBIINIT5_DOUBLE_HORIZ(val) (((val) >> 20) & 1) /* voodoo 2 only */ -#define FBIINIT5_DOUBLE_VERT(val) (((val) >> 21) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_16BIT_GAMMA(val) (((val) >> 22) & 1) /* voodoo 2 only */ -#define FBIINIT5_INVERT_DAC_HSYNC(val) (((val) >> 23) & 1) /* voodoo 2 only */ -#define FBIINIT5_INVERT_DAC_VSYNC(val) (((val) >> 24) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_24BIT_DACDATA(val) (((val) >> 25) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_INTERLACING(val) (((val) >> 26) & 1) /* voodoo 2 only */ -#define FBIINIT5_DAC_DATA_18_CONTROL(val) (((val) >> 27) & 1) /* voodoo 2 only */ -#define FBIINIT5_RASTERIZER_UNIT_MODE(val) (((val) >> 30) & 3) /* voodoo 2 only */ - -#define FBIINIT6_WINDOW_ACTIVE_COUNTER(val) (((val) >> 0) & 7) /* voodoo 2 only */ -#define FBIINIT6_WINDOW_DRAG_COUNTER(val) (((val) >> 3) & 0x1f) /* voodoo 2 only */ -#define FBIINIT6_SLI_SYNC_MASTER(val) (((val) >> 8) & 1) /* voodoo 2 only */ -#define FBIINIT6_DAC_DATA_22_OUTPUT(val) (((val) >> 9) & 3) /* voodoo 2 only */ -#define FBIINIT6_DAC_DATA_23_OUTPUT(val) (((val) >> 11) & 3) /* voodoo 2 only */ -#define FBIINIT6_SLI_SYNCIN_OUTPUT(val) (((val) >> 13) & 3) /* voodoo 2 only */ -#define FBIINIT6_SLI_SYNCOUT_OUTPUT(val) (((val) >> 15) & 3) /* voodoo 2 only */ -#define FBIINIT6_DAC_RD_OUTPUT(val) (((val) >> 17) & 3) /* voodoo 2 only */ -#define FBIINIT6_DAC_WR_OUTPUT(val) (((val) >> 19) & 3) /* voodoo 2 only */ -#define FBIINIT6_PCI_FIFO_LWM_RDY(val) (((val) >> 21) & 0x7f) /* voodoo 2 only */ -#define FBIINIT6_VGA_PASS_N_OUTPUT(val) (((val) >> 28) & 3) /* voodoo 2 only */ -#define FBIINIT6_X_VIDEO_TILES_BIT0(val) (((val) >> 30) & 1) /* voodoo 2 only */ - -#define FBIINIT7_GENERIC_STRAPPING(val) (((val) >> 0) & 0xff) /* voodoo 2 only */ -#define FBIINIT7_CMDFIFO_ENABLE(val) (((val) >> 8) & 1) /* voodoo 2 only */ -#define FBIINIT7_CMDFIFO_MEMORY_STORE(val) (((val) >> 9) & 1) /* voodoo 2 only */ -#define FBIINIT7_DISABLE_CMDFIFO_HOLES(val) (((val) >> 10) & 1) /* voodoo 2 only */ -#define FBIINIT7_CMDFIFO_READ_THRESH(val) (((val) >> 11) & 0x1f) /* voodoo 2 only */ -#define FBIINIT7_SYNC_CMDFIFO_WRITES(val) (((val) >> 16) & 1) /* voodoo 2 only */ -#define FBIINIT7_SYNC_CMDFIFO_READS(val) (((val) >> 17) & 1) /* voodoo 2 only */ -#define FBIINIT7_RESET_PCI_PACKER(val) (((val) >> 18) & 1) /* voodoo 2 only */ -#define FBIINIT7_ENABLE_CHROMA_STUFF(val) (((val) >> 19) & 1) /* voodoo 2 only */ -#define FBIINIT7_CMDFIFO_PCI_TIMEOUT(val) (((val) >> 20) & 0x7f) /* voodoo 2 only */ -#define FBIINIT7_ENABLE_TEXTURE_BURST(val) (((val) >> 27) & 1) /* voodoo 2 only */ - -#define TEXMODE_ENABLE_PERSPECTIVE(val) (((val) >> 0) & 1) -#define TEXMODE_MINIFICATION_FILTER(val) (((val) >> 1) & 1) -#define TEXMODE_MAGNIFICATION_FILTER(val) (((val) >> 2) & 1) -#define TEXMODE_CLAMP_NEG_W(val) (((val) >> 3) & 1) -#define TEXMODE_ENABLE_LOD_DITHER(val) (((val) >> 4) & 1) -#define TEXMODE_NCC_TABLE_SELECT(val) (((val) >> 5) & 1) -#define TEXMODE_CLAMP_S(val) (((val) >> 6) & 1) -#define TEXMODE_CLAMP_T(val) (((val) >> 7) & 1) -#define TEXMODE_FORMAT(val) (((val) >> 8) & 0xf) -#define TEXMODE_TC_ZERO_OTHER(val) (((val) >> 12) & 1) -#define TEXMODE_TC_SUB_CLOCAL(val) (((val) >> 13) & 1) -#define TEXMODE_TC_MSELECT(val) (((val) >> 14) & 7) -#define TEXMODE_TC_REVERSE_BLEND(val) (((val) >> 17) & 1) -#define TEXMODE_TC_ADD_ACLOCAL(val) (((val) >> 18) & 3) -#define TEXMODE_TC_INVERT_OUTPUT(val) (((val) >> 20) & 1) -#define TEXMODE_TCA_ZERO_OTHER(val) (((val) >> 21) & 1) -#define TEXMODE_TCA_SUB_CLOCAL(val) (((val) >> 22) & 1) -#define TEXMODE_TCA_MSELECT(val) (((val) >> 23) & 7) -#define TEXMODE_TCA_REVERSE_BLEND(val) (((val) >> 26) & 1) -#define TEXMODE_TCA_ADD_ACLOCAL(val) (((val) >> 27) & 3) -#define TEXMODE_TCA_INVERT_OUTPUT(val) (((val) >> 29) & 1) -#define TEXMODE_TRILINEAR(val) (((val) >> 30) & 1) -#define TEXMODE_SEQ_8_DOWNLD(val) (((val) >> 31) & 1) - -#define TEXLOD_LODMIN(val) (((val) >> 0) & 0x3f) -#define TEXLOD_LODMAX(val) (((val) >> 6) & 0x3f) -#define TEXLOD_LODBIAS(val) (((val) >> 12) & 0x3f) -#define TEXLOD_LOD_ODD(val) (((val) >> 18) & 1) -#define TEXLOD_LOD_TSPLIT(val) (((val) >> 19) & 1) -#define TEXLOD_LOD_S_IS_WIDER(val) (((val) >> 20) & 1) -#define TEXLOD_LOD_ASPECT(val) (((val) >> 21) & 3) -#define TEXLOD_LOD_ZEROFRAC(val) (((val) >> 23) & 1) -#define TEXLOD_TMULTIBASEADDR(val) (((val) >> 24) & 1) -#define TEXLOD_TDATA_SWIZZLE(val) (((val) >> 25) & 1) -#define TEXLOD_TDATA_SWAP(val) (((val) >> 26) & 1) -#define TEXLOD_TDIRECT_WRITE(val) (((val) >> 27) & 1) /* Voodoo 2 only */ - -#define TEXDETAIL_DETAIL_MAX(val) (((val) >> 0) & 0xff) -#define TEXDETAIL_DETAIL_BIAS(val) (((val) >> 8) & 0x3f) -#define TEXDETAIL_DETAIL_SCALE(val) (((val) >> 14) & 7) -#define TEXDETAIL_RGB_MIN_FILTER(val) (((val) >> 17) & 1) /* Voodoo 2 only */ -#define TEXDETAIL_RGB_MAG_FILTER(val) (((val) >> 18) & 1) /* Voodoo 2 only */ -#define TEXDETAIL_ALPHA_MIN_FILTER(val) (((val) >> 19) & 1) /* Voodoo 2 only */ -#define TEXDETAIL_ALPHA_MAG_FILTER(val) (((val) >> 20) & 1) /* Voodoo 2 only */ -#define TEXDETAIL_SEPARATE_RGBA_FILTER(val) (((val) >> 21) & 1) /* Voodoo 2 only */ - -#define TREXINIT_SEND_TMU_CONFIG(val) (((val) >> 18) & 1) /************************************* @@ -1364,377 +21,6 @@ struct voodoo_state; struct poly_extra_data; -struct rgba -{ -#ifdef LSB_FIRST - UINT8 b, g, r, a; -#else - UINT8 a, r, g, b; -#endif -}; - - -union voodoo_reg -{ - INT32 i; - UINT32 u; - float f; - rgba rgb; -}; - - -typedef voodoo_reg rgb_union; - - -struct voodoo_stats -{ - UINT8 lastkey; /* last key state */ - UINT8 display; /* display stats? */ - INT32 swaps; /* total swaps */ - INT32 stalls; /* total stalls */ - INT32 total_triangles; /* total triangles */ - INT32 total_pixels_in; /* total pixels in */ - INT32 total_pixels_out; /* total pixels out */ - INT32 total_chroma_fail; /* total chroma fail */ - INT32 total_zfunc_fail; /* total z func fail */ - INT32 total_afunc_fail; /* total a func fail */ - INT32 total_clipped; /* total clipped */ - INT32 total_stippled; /* total stippled */ - INT32 lfb_writes; /* LFB writes */ - INT32 lfb_reads; /* LFB reads */ - INT32 reg_writes; /* register writes */ - INT32 reg_reads; /* register reads */ - INT32 tex_writes; /* texture writes */ - INT32 texture_mode[16]; /* 16 different texture modes */ - UINT8 render_override; /* render override */ - char buffer[1024]; /* string */ -}; - - -/* note that this structure is an even 64 bytes long */ -struct stats_block -{ - INT32 pixels_in; /* pixels in statistic */ - INT32 pixels_out; /* pixels out statistic */ - INT32 chroma_fail; /* chroma test fail statistic */ - INT32 zfunc_fail; /* z function test fail statistic */ - INT32 afunc_fail; /* alpha function test fail statistic */ - INT32 clip_fail; /* clipping fail statistic */ - INT32 stipple_count; /* stipple statistic */ - INT32 filler[64/4 - 7]; /* pad this structure to 64 bytes */ -}; - - -struct fifo_state -{ - UINT32 * base; /* base of the FIFO */ - INT32 size; /* size of the FIFO */ - INT32 in; /* input pointer */ - INT32 out; /* output pointer */ -}; - - -struct cmdfifo_info -{ - UINT8 enable; /* enabled? */ - UINT8 count_holes; /* count holes? */ - UINT32 base; /* base address in framebuffer RAM */ - UINT32 end; /* end address in framebuffer RAM */ - UINT32 rdptr; /* current read pointer */ - UINT32 amin; /* minimum address */ - UINT32 amax; /* maximum address */ - UINT32 depth; /* current depth */ - UINT32 holes; /* number of holes */ -}; - - -struct pci_state -{ - fifo_state fifo; /* PCI FIFO */ - UINT32 init_enable; /* initEnable value */ - UINT8 stall_state; /* state of the system if we're stalled */ - UINT8 op_pending; /* true if an operation is pending */ - attotime op_end_time; /* time when the pending operation ends */ - emu_timer * continue_timer; /* timer to use to continue processing */ - UINT32 fifo_mem[64*2]; /* memory backing the PCI FIFO */ -}; - - -struct ncc_table -{ - UINT8 dirty; /* is the texel lookup dirty? */ - voodoo_reg * reg; /* pointer to our registers */ - INT32 ir[4], ig[4], ib[4]; /* I values for R,G,B */ - INT32 qr[4], qg[4], qb[4]; /* Q values for R,G,B */ - INT32 y[16]; /* Y values */ - rgb_t * palette; /* pointer to associated RGB palette */ - rgb_t * palettea; /* pointer to associated ARGB palette */ - rgb_t texel[256]; /* texel lookup */ -}; - - -struct tmu_state -{ - UINT8 * ram; /* pointer to our RAM */ - UINT32 mask; /* mask to apply to pointers */ - voodoo_reg * reg; /* pointer to our register base */ - UINT32 regdirty; /* true if the LOD/mode/base registers have changed */ - - UINT32 texaddr_mask; /* mask for texture address */ - UINT8 texaddr_shift; /* shift for texture address */ - - INT64 starts, startt; /* starting S,T (14.18) */ - INT64 startw; /* starting W (2.30) */ - INT64 dsdx, dtdx; /* delta S,T per X */ - INT64 dwdx; /* delta W per X */ - INT64 dsdy, dtdy; /* delta S,T per Y */ - INT64 dwdy; /* delta W per Y */ - - INT32 lodmin, lodmax; /* min, max LOD values */ - INT32 lodbias; /* LOD bias */ - UINT32 lodmask; /* mask of available LODs */ - UINT32 lodoffset[9]; /* offset of texture base for each LOD */ - INT32 detailmax; /* detail clamp */ - INT32 detailbias; /* detail bias */ - UINT8 detailscale; /* detail scale */ - - UINT32 wmask; /* mask for the current texture width */ - UINT32 hmask; /* mask for the current texture height */ - - UINT32 bilinear_mask; /* mask for bilinear resolution (0xf0 for V1, 0xff for V2) */ - - ncc_table ncc[2]; /* two NCC tables */ - - rgb_t * lookup; /* currently selected lookup */ - rgb_t * texel[16]; /* texel lookups for each format */ - - rgb_t palette[256]; /* palette lookup table */ - rgb_t palettea[256]; /* palette+alpha lookup table */ -}; - - -struct tmu_shared_state -{ - rgb_t rgb332[256]; /* RGB 3-3-2 lookup table */ - rgb_t alpha8[256]; /* alpha 8-bit lookup table */ - rgb_t int8[256]; /* intensity 8-bit lookup table */ - rgb_t ai44[256]; /* alpha, intensity 4-4 lookup table */ - - rgb_t rgb565[65536]; /* RGB 5-6-5 lookup table */ - rgb_t argb1555[65536]; /* ARGB 1-5-5-5 lookup table */ - rgb_t argb4444[65536]; /* ARGB 4-4-4-4 lookup table */ -}; - - -struct setup_vertex -{ - float x, y; /* X, Y coordinates */ - float a, r, g, b; /* A, R, G, B values */ - float z, wb; /* Z and broadcast W values */ - float w0, s0, t0; /* W, S, T for TMU 0 */ - float w1, s1, t1; /* W, S, T for TMU 1 */ -}; - - -struct fbi_state -{ - UINT8 * ram; /* pointer to frame buffer RAM */ - UINT32 mask; /* mask to apply to pointers */ - UINT32 rgboffs[3]; /* word offset to 3 RGB buffers */ - UINT32 auxoffs; /* word offset to 1 aux buffer */ - - UINT8 frontbuf; /* front buffer index */ - UINT8 backbuf; /* back buffer index */ - UINT8 swaps_pending; /* number of pending swaps */ - UINT8 video_changed; /* did the frontbuffer video change? */ - - UINT32 yorigin; /* Y origin subtract value */ - UINT32 lfb_base; /* base of LFB in memory */ - UINT8 lfb_stride; /* stride of LFB accesses in bits */ - - UINT32 width; /* width of current frame buffer */ - UINT32 height; /* height of current frame buffer */ - UINT32 xoffs; /* horizontal offset (back porch) */ - UINT32 yoffs; /* vertical offset (back porch) */ - UINT32 vsyncscan; /* vertical sync scanline */ - UINT32 rowpixels; /* pixels per row */ - UINT32 tile_width; /* width of video tiles */ - UINT32 tile_height; /* height of video tiles */ - UINT32 x_tiles; /* number of tiles in the X direction */ - - emu_timer * vblank_timer; /* VBLANK timer */ - UINT8 vblank; /* VBLANK state */ - UINT8 vblank_count; /* number of VBLANKs since last swap */ - UINT8 vblank_swap_pending; /* a swap is pending, waiting for a vblank */ - UINT8 vblank_swap; /* swap when we hit this count */ - UINT8 vblank_dont_swap; /* don't actually swap when we hit this point */ - - /* triangle setup info */ - UINT8 cheating_allowed; /* allow cheating? */ - INT32 sign; /* triangle sign */ - INT16 ax, ay; /* vertex A x,y (12.4) */ - INT16 bx, by; /* vertex B x,y (12.4) */ - INT16 cx, cy; /* vertex C x,y (12.4) */ - INT32 startr, startg, startb, starta; /* starting R,G,B,A (12.12) */ - INT32 startz; /* starting Z (20.12) */ - INT64 startw; /* starting W (16.32) */ - INT32 drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */ - INT32 dzdx; /* delta Z per X */ - INT64 dwdx; /* delta W per X */ - INT32 drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */ - INT32 dzdy; /* delta Z per Y */ - INT64 dwdy; /* delta W per Y */ - - stats_block lfb_stats; /* LFB-access statistics */ - - UINT8 sverts; /* number of vertices ready */ - setup_vertex svert[3]; /* 3 setup vertices */ - - fifo_state fifo; /* framebuffer memory fifo */ - cmdfifo_info cmdfifo[2]; /* command FIFOs */ - - UINT8 fogblend[64]; /* 64-entry fog table */ - UINT8 fogdelta[64]; /* 64-entry fog table */ - UINT8 fogdelta_mask; /* mask for for delta (0xff for V1, 0xfc for V2) */ - - rgb_t pen[65536]; /* mapping from pixels to pens */ - rgb_t clut[512]; /* clut gamma data */ - UINT8 clut_dirty; /* do we need to recompute? */ -}; - - -struct dac_state -{ - UINT8 reg[8]; /* 8 registers */ - UINT8 read_result; /* pending read result */ -}; - - -struct raster_info -{ - raster_info * next; /* pointer to next entry with the same hash */ - poly_draw_scanline_func callback; /* callback pointer */ - UINT8 is_generic; /* TRUE if this is one of the generic rasterizers */ - UINT8 display; /* display index */ - UINT32 hits; /* how many hits (pixels) we've used this for */ - UINT32 polys; /* how many polys we've used this for */ - UINT32 eff_color_path; /* effective fbzColorPath value */ - UINT32 eff_alpha_mode; /* effective alphaMode value */ - UINT32 eff_fog_mode; /* effective fogMode value */ - UINT32 eff_fbz_mode; /* effective fbzMode value */ - UINT32 eff_tex_mode_0; /* effective textureMode value for TMU #0 */ - UINT32 eff_tex_mode_1; /* effective textureMode value for TMU #1 */ - UINT32 hash; -}; - - -struct poly_extra_data -{ - voodoo_state * state; /* pointer back to the voodoo state */ - raster_info * info; /* pointer to rasterizer information */ - - INT16 ax, ay; /* vertex A x,y (12.4) */ - INT32 startr, startg, startb, starta; /* starting R,G,B,A (12.12) */ - INT32 startz; /* starting Z (20.12) */ - INT64 startw; /* starting W (16.32) */ - INT32 drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */ - INT32 dzdx; /* delta Z per X */ - INT64 dwdx; /* delta W per X */ - INT32 drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */ - INT32 dzdy; /* delta Z per Y */ - INT64 dwdy; /* delta W per Y */ - - INT64 starts0, startt0; /* starting S,T (14.18) */ - INT64 startw0; /* starting W (2.30) */ - INT64 ds0dx, dt0dx; /* delta S,T per X */ - INT64 dw0dx; /* delta W per X */ - INT64 ds0dy, dt0dy; /* delta S,T per Y */ - INT64 dw0dy; /* delta W per Y */ - INT32 lodbase0; /* used during rasterization */ - - INT64 starts1, startt1; /* starting S,T (14.18) */ - INT64 startw1; /* starting W (2.30) */ - INT64 ds1dx, dt1dx; /* delta S,T per X */ - INT64 dw1dx; /* delta W per X */ - INT64 ds1dy, dt1dy; /* delta S,T per Y */ - INT64 dw1dy; /* delta W per Y */ - INT32 lodbase1; /* used during rasterization */ - - UINT16 dither[16]; /* dither matrix, for fastfill */ -}; - - -struct banshee_info -{ - UINT32 io[0x40]; /* I/O registers */ - UINT32 agp[0x80]; /* AGP registers */ - UINT8 vga[0x20]; /* VGA registers */ - UINT8 crtc[0x27]; /* VGA CRTC registers */ - UINT8 seq[0x05]; /* VGA sequencer registers */ - UINT8 gc[0x05]; /* VGA graphics controller registers */ - UINT8 att[0x15]; /* VGA attribute registers */ - UINT8 attff; /* VGA attribute flip-flop */ - - UINT32 blt_regs[0x20]; /* 2D Blitter registers */ - UINT32 blt_dst_base; - UINT32 blt_dst_x; - UINT32 blt_dst_y; - UINT32 blt_dst_width; - UINT32 blt_dst_height; - UINT32 blt_dst_stride; - UINT32 blt_dst_bpp; - UINT32 blt_cmd; - UINT32 blt_src_base; - UINT32 blt_src_x; - UINT32 blt_src_y; - UINT32 blt_src_width; - UINT32 blt_src_height; - UINT32 blt_src_stride; - UINT32 blt_src_bpp; -}; - - -struct voodoo_state -{ - UINT8 index; /* index of board */ - voodoo_device *device; /* pointer to our containing device */ - screen_device *screen; /* the screen we are acting on */ - device_t *cpu; /* the CPU we interact with */ - UINT8 type; /* type of system */ - UINT8 chipmask; /* mask for which chips are available */ - UINT32 freq; /* operating frequency */ - attoseconds_t attoseconds_per_cycle; /* attoseconds per cycle */ - UINT32 extra_cycles; /* extra cycles not yet accounted for */ - int trigger; /* trigger used for stalling */ - - voodoo_reg reg[0x400]; /* raw registers */ - const UINT8 * regaccess; /* register access array */ - const char *const * regnames; /* register names array */ - UINT8 alt_regmap; /* enable alternate register map? */ - - pci_state pci; /* PCI state */ - dac_state dac; /* DAC state */ - - fbi_state fbi; /* FBI states */ - tmu_state tmu[MAX_TMU]; /* TMU states */ - tmu_shared_state tmushare; /* TMU shared state */ - banshee_info banshee; /* Banshee state */ - - legacy_poly_manager * poly; /* polygon manager */ - stats_block * thread_stats; /* per-thread statistics */ - - voodoo_stats stats; /* internal statistics */ - - offs_t last_status_pc; /* PC of last status description (for logging) */ - UINT32 last_status_value; /* value of last status read (for logging) */ - - int next_rasterizer; /* next rasterizer index */ - raster_info rasterizer[MAX_RASTERIZERS]; /* array of rasterizers */ - raster_info * raster_hash[RASTER_HASH_SIZE]; /* hash table of rasterizers */ - - bool send_config; - UINT32 tmu_config; -}; @@ -2345,16 +631,16 @@ do } \ while (0) -static inline bool ATTR_FORCE_INLINE chromaKeyTest(voodoo_state *v, stats_block *stats, UINT32 fbzModeReg, rgbaint_t rgbaIntColor) +static inline bool ATTR_FORCE_INLINE chromaKeyTest(voodoo_device *vd, stats_block *stats, UINT32 fbzModeReg, rgbaint_t rgbaIntColor) { if (FBZMODE_ENABLE_CHROMAKEY(fbzModeReg)) { rgb_union color; color.u = (rgbaIntColor.get_a()<<24) | (rgbaIntColor.get_r()<<16) | (rgbaIntColor.get_g()<<8) | rgbaIntColor.get_b(); /* non-range version */ - if (!CHROMARANGE_ENABLE(v->reg[chromaRange].u)) + if (!CHROMARANGE_ENABLE(vd->reg[chromaRange].u)) { - if (((color.u ^ v->reg[chromaKey].u) & 0xffffff) == 0) + if (((color.u ^ vd->reg[chromaKey].u) & 0xffffff) == 0) { stats->chroma_fail++; return false; @@ -2368,30 +654,30 @@ static inline bool ATTR_FORCE_INLINE chromaKeyTest(voodoo_state *v, stats_block int results; /* check blue */ - low = v->reg[chromaKey].rgb.b; - high = v->reg[chromaRange].rgb.b; + low = vd->reg[chromaKey].rgb.b; + high = vd->reg[chromaRange].rgb.b; test = color.rgb.b; results = (test >= low && test <= high); - results ^= CHROMARANGE_BLUE_EXCLUSIVE(v->reg[chromaRange].u); + results ^= CHROMARANGE_BLUE_EXCLUSIVE(vd->reg[chromaRange].u); results <<= 1; /* check green */ - low = v->reg[chromaKey].rgb.g; - high = v->reg[chromaRange].rgb.g; + low = vd->reg[chromaKey].rgb.g; + high = vd->reg[chromaRange].rgb.g; test = color.rgb.g; results |= (test >= low && test <= high); - results ^= CHROMARANGE_GREEN_EXCLUSIVE(v->reg[chromaRange].u); + results ^= CHROMARANGE_GREEN_EXCLUSIVE(vd->reg[chromaRange].u); results <<= 1; /* check red */ - low = v->reg[chromaKey].rgb.r; - high = v->reg[chromaRange].rgb.r; + low = vd->reg[chromaKey].rgb.r; + high = vd->reg[chromaRange].rgb.r; test = color.rgb.r; results |= (test >= low && test <= high); - results ^= CHROMARANGE_RED_EXCLUSIVE(v->reg[chromaRange].u); + results ^= CHROMARANGE_RED_EXCLUSIVE(vd->reg[chromaRange].u); /* final result */ - if (CHROMARANGE_UNION_MODE(v->reg[chromaRange].u)) + if (CHROMARANGE_UNION_MODE(vd->reg[chromaRange].u)) { if (results != 0) { @@ -2520,11 +806,11 @@ do } \ while (0) -static inline bool ATTR_FORCE_INLINE alphaTest(voodoo_state *v, stats_block *stats, UINT32 alphaModeReg, UINT8 alpha) +static inline bool ATTR_FORCE_INLINE alphaTest(voodoo_device *vd, stats_block *stats, UINT32 alphaModeReg, UINT8 alpha) { if (ALPHAMODE_ALPHATEST(alphaModeReg)) { - UINT8 alpharef = v->reg[alphaMode].rgb.a; + UINT8 alpharef = vd->reg[alphaMode].rgb.a; switch (ALPHAMODE_ALPHAFUNCTION(alphaModeReg)) { case 0: /* alphaOP = never */ @@ -3067,7 +1353,7 @@ do } \ while (0) -static inline void ATTR_FORCE_INLINE applyFogging(voodoo_state *v, UINT32 fogModeReg, UINT32 fbzCpReg, INT32 x, const UINT8 *dither4, INT32 fogDepth, +static inline void ATTR_FORCE_INLINE applyFogging(voodoo_device *vd, UINT32 fogModeReg, UINT32 fbzCpReg, INT32 x, const UINT8 *dither4, INT32 fogDepth, rgbaint_t &color, INT32 iterz, INT64 iterw, UINT8 itera) { if (FOGMODE_ENABLE_FOG(fogModeReg)) @@ -3075,7 +1361,7 @@ static inline void ATTR_FORCE_INLINE applyFogging(voodoo_state *v, UINT32 fogMod UINT32 color_alpha = color.get_a(); /* constant fog bypasses everything else */ - rgbaint_t fogColorLocal(v->reg[fogColor].u); + rgbaint_t fogColorLocal(vd->reg[fogColor].u); if (FOGMODE_FOG_CONSTANT(fogModeReg)) { @@ -3119,11 +1405,11 @@ static inline void ATTR_FORCE_INLINE applyFogging(voodoo_state *v, UINT32 fogMod { case 0: /* fog table */ { - INT32 delta = v->fbi.fogdelta[fogDepth >> 10]; + INT32 delta = vd->fbi.fogdelta[fogDepth >> 10]; INT32 deltaval; /* perform the multiply against lower 8 bits of wfloat */ - deltaval = (delta & v->fbi.fogdelta_mask) * + deltaval = (delta & vd->fbi.fogdelta_mask) * ((fogDepth >> 2) & 0xff); /* fog zones allow for negating this value */ @@ -3137,7 +1423,7 @@ static inline void ATTR_FORCE_INLINE applyFogging(voodoo_state *v, UINT32 fogMod deltaval >>= 4; /* add to the blending factor */ - fogblend = v->fbi.fogblend[fogDepth >> 10] + deltaval; + fogblend = vd->fbi.fogblend[fogDepth >> 10] + deltaval; break; } @@ -3542,7 +1828,7 @@ while (0) * *************************************/ -#define PIXEL_PIPELINE_BEGIN(VV, STATS, XX, YY, FBZCOLORPATH, FBZMODE, ITERZ, ITERW) \ +#define PIXEL_PIPELINE_BEGIN(vd, STATS, XX, YY, FBZCOLORPATH, FBZMODE, ITERZ, ITERW) \ do \ { \ INT32 depthval, wfloat, fogdepth, biasdepth; \ @@ -3559,10 +1845,10 @@ do /* rotate mode */ \ if (FBZMODE_STIPPLE_PATTERN(FBZMODE) == 0) \ { \ - (VV)->reg[stipple].u = ((VV)->reg[stipple].u << 1) | ((VV)->reg[stipple].u >> 31);\ - if (((VV)->reg[stipple].u & 0x80000000) == 0) \ + vd->reg[stipple].u = (vd->reg[stipple].u << 1) | (vd->reg[stipple].u >> 31);\ + if ((vd->reg[stipple].u & 0x80000000) == 0) \ { \ - (VV)->stats.total_stippled++; \ + vd->stats.total_stippled++; \ goto skipdrawdepth; \ } \ } \ @@ -3571,9 +1857,9 @@ do else \ { \ int stipple_index = (((YY) & 3) << 3) | (~(XX) & 7); \ - if ((((VV)->reg[stipple].u >> stipple_index) & 1) == 0) \ + if (((vd->reg[stipple].u >> stipple_index) & 1) == 0) \ { \ - (VV)->stats.total_stippled++; \ + vd->stats.total_stippled++; \ goto skipdrawdepth; \ } \ } \ @@ -3597,7 +1883,7 @@ do /* add the bias for fog selection*/ \ if (FBZMODE_ENABLE_DEPTH_BIAS(FBZMODE)) \ { \ - fogdepth += (INT16)(VV)->reg[zaColor].u; \ + fogdepth += (INT16)vd->reg[zaColor].u; \ CLAMP(fogdepth, 0, 0xffff); \ } \ \ @@ -3628,12 +1914,12 @@ do biasdepth = depthval; \ if (FBZMODE_ENABLE_DEPTH_BIAS(FBZMODE)) \ { \ - biasdepth += (INT16)(VV)->reg[zaColor].u; \ + biasdepth += (INT16)vd->reg[zaColor].u; \ CLAMP(biasdepth, 0, 0xffff); \ } -#define DEPTH_TEST(VV, STATS, XX, FBZMODE) \ +#define DEPTH_TEST(vd, STATS, XX, FBZMODE) \ do \ { \ /* handle depth buffer testing */ \ @@ -3646,7 +1932,7 @@ do if (FBZMODE_DEPTH_SOURCE_COMPARE(FBZMODE) == 0) \ depthsource = biasdepth; \ else \ - depthsource = (UINT16)(VV)->reg[zaColor].u; \ + depthsource = (UINT16)vd->reg[zaColor].u; \ \ /* test against the depth buffer */ \ switch (FBZMODE_DEPTH_FUNCTION(FBZMODE)) \ @@ -3786,11 +2072,11 @@ static inline bool ATTR_FORCE_INLINE depthTest(UINT16 zaColorReg, stats_block *s return true; } -#define PIXEL_PIPELINE_END(VV, STATS, DITHER, DITHER4, DITHER_LOOKUP, XX, dest, depth, FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE, ITERZ, ITERW, ITERAXXX) \ +#define PIXEL_PIPELINE_END(vd, STATS, DITHER, DITHER4, DITHER_LOOKUP, XX, dest, depth, FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE, ITERZ, ITERW, ITERAXXX) \ \ /* perform fogging */ \ preFog.set(color); \ - applyFogging(VV, FOGMODE, FBZCOLORPATH, XX, DITHER4, fogdepth, color, ITERZ, ITERW, ITERAXXX.get_a()); \ + applyFogging(vd, FOGMODE, FBZCOLORPATH, XX, DITHER4, fogdepth, color, ITERZ, ITERW, ITERAXXX.get_a()); \ /* perform alpha blending */ \ alphaBlend(FBZMODE, ALPHAMODE, XX, DITHER, dest[XX], depth, preFog, color); \ a = color.get_a(); r = color.get_r(); g = color.get_g(); b = color.get_b(); \ @@ -4121,7 +2407,7 @@ do } \ while (0) -static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block *STATS, UINT32 FBZCOLORPATH, UINT32 FBZMODE, UINT32 ALPHAMODE, +static inline bool ATTR_FORCE_INLINE combineColor(voodoo_device *vd, stats_block *STATS, UINT32 FBZCOLORPATH, UINT32 FBZMODE, UINT32 ALPHAMODE, rgbaint_t TEXELARGB, INT32 ITERZ, INT64 ITERW, rgbaint_t &srcColor) { rgbaint_t c_other; @@ -4139,7 +2425,7 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block break; case 2: /* color1 RGB */ - c_other.set((VV)->reg[color1].u); + c_other.set(vd->reg[color1].u); break; default: /* reserved - voodoo3 framebufferRGB */ @@ -4148,9 +2434,9 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block } /* handle chroma key */ - if (!chromaKeyTest(VV, STATS, FBZMODE, c_other)) + if (!chromaKeyTest(vd, STATS, FBZMODE, c_other)) return false; - //APPLY_CHROMAKEY(VV, STATS, FBZMODE, c_other); + //APPLY_CHROMAKEY(vd->m_vds, STATS, FBZMODE, c_other); /* compute a_other */ switch (FBZCP_CC_ASELECT(FBZCOLORPATH)) @@ -4164,7 +2450,7 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block break; case 2: /* color1 alpha */ - c_other.set_a((VV)->reg[color1].rgb.a); + c_other.set_a(vd->reg[color1].rgb.a); break; default: /* reserved */ @@ -4175,7 +2461,7 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block /* handle alpha mask */ if (!alphaMaskTest(STATS, FBZMODE, c_other.get_a())) return false; - //APPLY_ALPHAMASK(VV, STATS, FBZMODE, c_other.rgb.a); + //APPLY_ALPHAMASK(vd->m_vds, STATS, FBZMODE, c_other.rgb.a); /* compute c_local */ @@ -4184,14 +2470,14 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block if (FBZCP_CC_LOCALSELECT(FBZCOLORPATH) == 0) /* iterated RGB */ c_local.set(srcColor); else /* color0 RGB */ - c_local.set((VV)->reg[color0].u); + c_local.set(vd->reg[color0].u); } else { if (!(TEXELARGB.get_a() & 0x80)) /* iterated RGB */ c_local.set(srcColor); else /* color0 RGB */ - c_local.set((VV)->reg[color0].u); + c_local.set(vd->reg[color0].u); } /* compute a_local */ @@ -4203,7 +2489,7 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block break; case 1: /* color0 alpha */ - c_local.set_a((VV)->reg[color0].rgb.a); + c_local.set_a(vd->reg[color0].rgb.a); break; case 2: /* clamped iterated Z[27:20] */ @@ -4355,9 +2641,9 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block /* handle alpha test */ - if (!alphaTest(VV, STATS, ALPHAMODE, srcColor.get_a())) + if (!alphaTest(vd, STATS, ALPHAMODE, srcColor.get_a())) return false; - //APPLY_ALPHATEST(VV, STATS, ALPHAMODE, color.rgb.a); + //APPLY_ALPHATEST(vd->m_vds, STATS, ALPHAMODE, color.rgb.a); return true; } @@ -4372,11 +2658,11 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block #define RASTERIZER(name, TMUS, FBZCOLORPATH, FBZMODE, ALPHAMODE, FOGMODE, TEXMODE0, TEXMODE1) \ \ -static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) \ +void voodoo_device::raster_##name(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) \ { \ const poly_extra_data *extra = (const poly_extra_data *)extradata; \ - voodoo_state *v = extra->state; \ - stats_block *stats = &v->thread_stats[threadid]; \ + voodoo_device *vd = extra->device; \ + stats_block *stats = &vd->thread_stats[threadid]; \ DECLARE_DITHER_POINTERS; \ INT32 startx = extent->startx; \ INT32 stopx = extent->stopx; \ @@ -4394,7 +2680,7 @@ static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, co /* determine the screen Y */ \ scry = y; \ if (FBZMODE_Y_ORIGIN(FBZMODE)) \ - scry = (v->fbi.yorigin - y) & 0x3ff; \ + scry = (vd->fbi.yorigin - y) & 0x3ff; \ \ /* compute dithering */ \ COMPUTE_DITHER_POINTERS(FBZMODE, y); \ @@ -4405,8 +2691,8 @@ static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, co INT32 tempclip; \ \ /* Y clipping buys us the whole scanline */ \ - if (scry < ((v->reg[clipLowYHighY].u >> 16) & 0x3ff) || \ - scry >= (v->reg[clipLowYHighY].u & 0x3ff)) \ + if (scry < ((vd->reg[clipLowYHighY].u >> 16) & 0x3ff) || \ + scry >= (vd->reg[clipLowYHighY].u & 0x3ff)) \ { \ stats->pixels_in += stopx - startx; \ stats->clip_fail += stopx - startx; \ @@ -4414,25 +2700,25 @@ static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, co } \ \ /* X clipping */ \ - tempclip = (v->reg[clipLeftRight].u >> 16) & 0x3ff; \ + tempclip = (vd->reg[clipLeftRight].u >> 16) & 0x3ff; \ if (startx < tempclip) \ { \ stats->pixels_in += tempclip - startx; \ - v->stats.total_clipped += tempclip - startx; \ + vd->stats.total_clipped += tempclip - startx; \ startx = tempclip; \ } \ - tempclip = v->reg[clipLeftRight].u & 0x3ff; \ + tempclip = vd->reg[clipLeftRight].u & 0x3ff; \ if (stopx >= tempclip) \ { \ stats->pixels_in += stopx - tempclip; \ - v->stats.total_clipped += stopx - tempclip; \ + vd->stats.total_clipped += stopx - tempclip; \ stopx = tempclip - 1; \ } \ } \ \ /* get pointers to the target buffer and depth buffer */ \ - dest = (UINT16 *)destbase + scry * v->fbi.rowpixels; \ - depth = (v->fbi.auxoffs != ~0) ? ((UINT16 *)(v->fbi.ram + v->fbi.auxoffs) + scry * v->fbi.rowpixels) : NULL; \ + dest = (UINT16 *)destbase + scry * vd->fbi.rowpixels; \ + depth = (vd->fbi.auxoffs != ~0) ? ((UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs) + scry * vd->fbi.rowpixels) : NULL; \ \ /* compute the starting parameters */ \ dx = startx - (extra->ax >> 4); \ @@ -4465,46 +2751,46 @@ static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, co rgbaint_t color, preFog; \ \ /* pixel pipeline part 1 handles depth setup and stippling */ \ - PIXEL_PIPELINE_BEGIN(v, stats, x, y, FBZCOLORPATH, FBZMODE, iterz, iterw); \ + PIXEL_PIPELINE_BEGIN(vd, stats, x, y, FBZCOLORPATH, FBZMODE, iterz, iterw); \ /* depth testing */ \ - if (!depthTest((UINT16) v->reg[zaColor].u, stats, depth[x], FBZMODE, biasdepth)) \ + if (!depthTest((UINT16) vd->reg[zaColor].u, stats, depth[x], FBZMODE, biasdepth)) \ goto skipdrawdepth; \ \ /* run the texture pipeline on TMU1 to produce a value in texel */ \ /* note that they set LOD min to 8 to "disable" a TMU */ \ - if (TMUS >= 2 && v->tmu[1].lodmin < (8 << 8)) { \ + if (TMUS >= 2 && vd->tmu[1].lodmin < (8 << 8)) { \ INT32 tmp; \ const rgbaint_t texelZero(0); \ - texel = genTexture(&v->tmu[1], x, dither4, TEXMODE1, v->tmu[1].lookup, extra->lodbase1, \ + texel = genTexture(&vd->tmu[1], x, dither4, TEXMODE1, vd->tmu[1].lookup, extra->lodbase1, \ iters1, itert1, iterw1, tmp); \ - texel = combineTexture(&v->tmu[1], TEXMODE1, texel, texelZero, tmp); \ + texel = combineTexture(&vd->tmu[1], TEXMODE1, texel, texelZero, tmp); \ } \ /* run the texture pipeline on TMU0 to produce a final */ \ /* result in texel */ \ /* note that they set LOD min to 8 to "disable" a TMU */ \ - if (TMUS >= 1 && v->tmu[0].lodmin < (8 << 8)) \ + if (TMUS >= 1 && vd->tmu[0].lodmin < (8 << 8)) \ { \ - if (!v->send_config) \ + if (!vd->send_config) \ { \ INT32 lod0; \ rgbaint_t texelT0; \ - texelT0 = genTexture(&v->tmu[0], x, dither4, TEXMODE0, v->tmu[0].lookup, extra->lodbase0, \ + texelT0 = genTexture(&vd->tmu[0], x, dither4, TEXMODE0, vd->tmu[0].lookup, extra->lodbase0, \ iters0, itert0, iterw0, lod0); \ - texel = combineTexture(&v->tmu[0], TEXMODE0, texelT0, texel, lod0); \ + texel = combineTexture(&vd->tmu[0], TEXMODE0, texelT0, texel, lod0); \ } \ else \ { \ - texel.set(v->tmu_config); \ + texel.set(vd->tmu_config); \ } \ } \ \ /* colorpath pipeline selects source colors and does blending */ \ color = clampARGB(iterargb, FBZCOLORPATH); \ - if (!combineColor(v, stats, FBZCOLORPATH, FBZMODE, ALPHAMODE, texel, iterz, iterw, color)) \ + if (!combineColor(vd, stats, FBZCOLORPATH, FBZMODE, ALPHAMODE, texel, iterz, iterw, color)) \ goto skipdrawdepth; \ \ /* pixel pipeline part 2 handles fog, alpha, and final output */ \ - PIXEL_PIPELINE_END(v, stats, dither, dither4, dither_lookup, x, dest, depth, \ + PIXEL_PIPELINE_END(vd, stats, dither, dither4, dither_lookup, x, dest, depth, \ FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE, \ iterz, iterw, iterargb); \ \ diff --git a/src/devices/video/voodoo.cpp b/src/devices/video/voodoo.cpp index 4304b5ebf32..7fe0b94a007 100644 --- a/src/devices/video/voodoo.cpp +++ b/src/devices/video/voodoo.cpp @@ -143,7 +143,7 @@ bits(7:4) and bit(24)), X, and Y: #include "emu.h" -#include "video/polylgcy.h" + #include "video/rgbutil.h" #include "voodoo.h" #include "vooddefs.h" @@ -194,50 +194,6 @@ UINT32 voodoo_reciplog[(2 << RECIPLOG_LOOKUP_BITS) + 2]; -/************************************* - * - * Prototypes - * - *************************************/ - -static void init_fbi(voodoo_state *v, fbi_state *f, void *memory, int fbmem); -static void init_tmu_shared(tmu_shared_state *s); -static void init_tmu(voodoo_state *v, tmu_state *t, voodoo_reg *reg, void *memory, int tmem); -static void soft_reset(voodoo_state *v); -static void recompute_video_memory(voodoo_state *v); -static void check_stalled_cpu(voodoo_state *v, attotime current_time); -static void flush_fifos(voodoo_state *v, attotime current_time); -static TIMER_CALLBACK( stall_cpu_callback ); -static void stall_cpu(voodoo_state *v, int state, attotime current_time); -static TIMER_CALLBACK( vblank_callback ); -static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data); -static INT32 lfb_direct_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask); -static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask); -static INT32 texture_w(voodoo_state *v, offs_t offset, UINT32 data); -static INT32 banshee_2d_w(voodoo_state *v, offs_t offset, UINT32 data); - -/* command handlers */ -static INT32 fastfill(voodoo_state *v); -static INT32 swapbuffer(voodoo_state *v, UINT32 data); -static INT32 triangle(voodoo_state *v); -static INT32 begin_triangle(voodoo_state *v); -static INT32 draw_triangle(voodoo_state *v); - -/* triangle helpers */ -static INT32 setup_and_draw_triangle(voodoo_state *v); -static INT32 triangle_create_work_item(voodoo_state *v, UINT16 *drawbuf, int texcount); - -/* rasterizer management */ -static raster_info *add_rasterizer(voodoo_state *v, const raster_info *cinfo); -static raster_info *find_rasterizer(voodoo_state *v, int texcount); -static void dump_rasterizer_stats(voodoo_state *v); - -/* generic rasterizers */ -static void raster_fastfill(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); -static void raster_generic_0tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); -static void raster_generic_1tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); -static void raster_generic_2tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); - /************************************* @@ -262,7 +218,7 @@ static void raster_generic_2tmu(void *dest, INT32 scanline, const poly_extent *e *************************************/ #define RASTERIZER_ENTRY(fbzcp, alpha, fog, fbz, tex0, tex1) \ - { NULL, raster_##fbzcp##_##alpha##_##fog##_##fbz##_##tex0##_##tex1, FALSE, 0, 0, 0, fbzcp, alpha, fog, fbz, tex0, tex1 }, + { NULL, voodoo_device::raster_##fbzcp##_##alpha##_##fog##_##fbz##_##tex0##_##tex1, FALSE, 0, 0, 0, fbzcp, alpha, fog, fbz, tex0, tex1 }, static const raster_info predef_raster_table[] = { @@ -278,100 +234,84 @@ static const raster_info predef_raster_table[] = INLINE FUNCTIONS ***************************************************************************/ -/*------------------------------------------------- - get_safe_token - makes sure that the passed - in device is, in fact, a voodoo device --------------------------------------------------*/ - -static inline voodoo_state *get_safe_token(device_t *device) -{ - assert(device != nullptr); - assert((device->type() == VOODOO_1) || (device->type() == VOODOO_2) || (device->type() == VOODOO_BANSHEE) || (device->type() == VOODOO_3)); - - return (voodoo_state *)downcast(device)->token(); -} - - - /************************************* * * Video update * *************************************/ -int voodoo_update(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect) +int voodoo_device::voodoo_update(bitmap_rgb32 &bitmap, const rectangle &cliprect) { - voodoo_state *v = get_safe_token(device); - int changed = v->fbi.video_changed; - int drawbuf = v->fbi.frontbuf; + int changed = fbi.video_changed; + int drawbuf = fbi.frontbuf; int statskey; int x, y; /* reset the video changed flag */ - v->fbi.video_changed = FALSE; + fbi.video_changed = FALSE; /* if we are blank, just fill with black */ - if (v->type <= TYPE_VOODOO_2 && FBIINIT1_SOFTWARE_BLANK(v->reg[fbiInit1].u)) + if (vd_type <= TYPE_VOODOO_2 && FBIINIT1_SOFTWARE_BLANK(reg[fbiInit1].u)) { bitmap.fill(0, cliprect); return changed; } /* if the CLUT is dirty, recompute the pens array */ - if (v->fbi.clut_dirty) + if (fbi.clut_dirty) { UINT8 rtable[32], gtable[64], btable[32]; /* Voodoo/Voodoo-2 have an internal 33-entry CLUT */ - if (v->type <= TYPE_VOODOO_2) + if (vd_type <= TYPE_VOODOO_2) { /* kludge: some of the Midway games write 0 to the last entry when they obviously mean FF */ - if ((v->fbi.clut[32] & 0xffffff) == 0 && (v->fbi.clut[31] & 0xffffff) != 0) - v->fbi.clut[32] = 0x20ffffff; + if ((fbi.clut[32] & 0xffffff) == 0 && (fbi.clut[31] & 0xffffff) != 0) + fbi.clut[32] = 0x20ffffff; /* compute the R/G/B pens first */ for (x = 0; x < 32; x++) { /* treat X as a 5-bit value, scale up to 8 bits, and linear interpolate for red/blue */ y = (x << 3) | (x >> 2); - rtable[x] = (v->fbi.clut[y >> 3].r() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].r() * (y & 7)) >> 3; - btable[x] = (v->fbi.clut[y >> 3].b() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].b() * (y & 7)) >> 3; + rtable[x] = (fbi.clut[y >> 3].r() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].r() * (y & 7)) >> 3; + btable[x] = (fbi.clut[y >> 3].b() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].b() * (y & 7)) >> 3; /* treat X as a 6-bit value with LSB=0, scale up to 8 bits, and linear interpolate */ y = (x * 2) + 0; y = (y << 2) | (y >> 4); - gtable[x*2+0] = (v->fbi.clut[y >> 3].g() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3; + gtable[x*2+0] = (fbi.clut[y >> 3].g() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3; /* treat X as a 6-bit value with LSB=1, scale up to 8 bits, and linear interpolate */ y = (x * 2) + 1; y = (y << 2) | (y >> 4); - gtable[x*2+1] = (v->fbi.clut[y >> 3].g() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3; + gtable[x*2+1] = (fbi.clut[y >> 3].g() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3; } } /* Banshee and later have a 512-entry CLUT that can be bypassed */ else { - int which = (v->banshee.io[io_vidProcCfg] >> 13) & 1; - int bypass = (v->banshee.io[io_vidProcCfg] >> 11) & 1; + int which = (banshee.io[io_vidProcCfg] >> 13) & 1; + int bypass = (banshee.io[io_vidProcCfg] >> 11) & 1; /* compute R/G/B pens first */ for (x = 0; x < 32; x++) { /* treat X as a 5-bit value, scale up to 8 bits */ y = (x << 3) | (x >> 2); - rtable[x] = bypass ? y : v->fbi.clut[which * 256 + y].r(); - btable[x] = bypass ? y : v->fbi.clut[which * 256 + y].b(); + rtable[x] = bypass ? y : fbi.clut[which * 256 + y].r(); + btable[x] = bypass ? y : fbi.clut[which * 256 + y].b(); /* treat X as a 6-bit value with LSB=0, scale up to 8 bits */ y = (x * 2) + 0; y = (y << 2) | (y >> 4); - gtable[x*2+0] = bypass ? y : v->fbi.clut[which * 256 + y].g(); + gtable[x*2+0] = bypass ? y : fbi.clut[which * 256 + y].g(); /* treat X as a 6-bit value with LSB=1, scale up to 8 bits, and linear interpolate */ y = (x * 2) + 1; y = (y << 2) | (y >> 4); - gtable[x*2+1] = bypass ? y : v->fbi.clut[which * 256 + y].g(); + gtable[x*2+1] = bypass ? y : fbi.clut[which * 256 + y].g(); } } @@ -381,45 +321,45 @@ int voodoo_update(device_t *device, bitmap_rgb32 &bitmap, const rectangle &clipr int r = rtable[(x >> 11) & 0x1f]; int g = gtable[(x >> 5) & 0x3f]; int b = btable[x & 0x1f]; - v->fbi.pen[x] = rgb_t(r, g, b); + fbi.pen[x] = rgb_t(r, g, b); } /* no longer dirty */ - v->fbi.clut_dirty = FALSE; + fbi.clut_dirty = FALSE; changed = TRUE; } /* debugging! */ - if (device->machine().input().code_pressed(KEYCODE_L)) - drawbuf = v->fbi.backbuf; + if (machine().input().code_pressed(KEYCODE_L)) + drawbuf = fbi.backbuf; /* copy from the current front buffer */ for (y = cliprect.min_y; y <= cliprect.max_y; y++) - if (y >= v->fbi.yoffs) + if (y >= fbi.yoffs) { - UINT16 *src = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[drawbuf]) + (y - v->fbi.yoffs) * v->fbi.rowpixels - v->fbi.xoffs; + UINT16 *src = (UINT16 *)(fbi.ram + fbi.rgboffs[drawbuf]) + (y - fbi.yoffs) * fbi.rowpixels - fbi.xoffs; UINT32 *dst = &bitmap.pix32(y); for (x = cliprect.min_x; x <= cliprect.max_x; x++) - dst[x] = v->fbi.pen[src[x]]; + dst[x] = fbi.pen[src[x]]; } /* update stats display */ - statskey = (device->machine().input().code_pressed(KEYCODE_BACKSLASH) != 0); - if (statskey && statskey != v->stats.lastkey) - v->stats.display = !v->stats.display; - v->stats.lastkey = statskey; + statskey = (machine().input().code_pressed(KEYCODE_BACKSLASH) != 0); + if (statskey && statskey != stats.lastkey) + stats.display = !stats.display; + stats.lastkey = statskey; /* display stats */ - if (v->stats.display) - device->popmessage(v->stats.buffer, 0, 0); + if (stats.display) + popmessage(stats.buffer, 0, 0); /* update render override */ - v->stats.render_override = device->machine().input().code_pressed(KEYCODE_ENTER); - if (DEBUG_DEPTH && v->stats.render_override) + stats.render_override = machine().input().code_pressed(KEYCODE_ENTER); + if (DEBUG_DEPTH && stats.render_override) { for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *src = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs) + (y - v->fbi.yoffs) * v->fbi.rowpixels - v->fbi.xoffs; + UINT16 *src = (UINT16 *)(fbi.ram + fbi.auxoffs) + (y - fbi.yoffs) * fbi.rowpixels - fbi.xoffs; UINT32 *dst = &bitmap.pix32(y); for (x = cliprect.min_x; x <= cliprect.max_x; x++) dst[x] = ((src[x] << 8) & 0xff0000) | ((src[x] >> 0) & 0xff00) | ((src[x] >> 8) & 0xff); @@ -436,26 +376,27 @@ int voodoo_update(device_t *device, bitmap_rgb32 &bitmap, const rectangle &clipr * *************************************/ -int voodoo_get_type(device_t *device) + +int voodoo_device::voodoo_get_type() { - voodoo_state *v = get_safe_token(device); - return v->type; + voodoo_device *vd = this; + return vd->vd_type; } -int voodoo_is_stalled(device_t *device) +int voodoo_device::voodoo_is_stalled() { - voodoo_state *v = get_safe_token(device); - return (v->pci.stall_state != NOT_STALLED); + voodoo_device *vd = this; + return (vd->pci.stall_state != NOT_STALLED); } -void voodoo_set_init_enable(device_t *device, UINT32 newval) +void voodoo_device::voodoo_set_init_enable(UINT32 newval) { - voodoo_state *v = get_safe_token(device); - v->pci.init_enable = newval; + voodoo_device *vd = this; + vd->pci.init_enable = newval; if (LOG_REGISTERS) - device->logerror("VOODOO.%d.REG:initEnable write = %08X\n", v->index, newval); + logerror("VOODOO.%d.REG:initEnable write = %08X\n", vd->index, newval); } @@ -466,7 +407,7 @@ void voodoo_set_init_enable(device_t *device, UINT32 newval) * *************************************/ -static void init_fbi(voodoo_state *v, fbi_state *f, void *memory, int fbmem) +void voodoo_device::init_fbi(voodoo_device* vd,fbi_state *f, void *memory, int fbmem) { int pen; @@ -484,20 +425,20 @@ static void init_fbi(voodoo_state *v, fbi_state *f, void *memory, int fbmem) /* init the pens */ f->clut_dirty = TRUE; - if (v->type <= TYPE_VOODOO_2) + if (vd->vd_type <= TYPE_VOODOO_2) { for (pen = 0; pen < 32; pen++) - v->fbi.clut[pen] = rgb_t(pen, pal5bit(pen), pal5bit(pen), pal5bit(pen)); - v->fbi.clut[32] = rgb_t(32,0xff,0xff,0xff); + vd->fbi.clut[pen] = rgb_t(pen, pal5bit(pen), pal5bit(pen), pal5bit(pen)); + vd->fbi.clut[32] = rgb_t(32,0xff,0xff,0xff); } else { for (pen = 0; pen < 512; pen++) - v->fbi.clut[pen] = rgb_t(pen,pen,pen); + vd->fbi.clut[pen] = rgb_t(pen,pen,pen); } /* allocate a VBLANK timer */ - f->vblank_timer = v->device->machine().scheduler().timer_alloc(FUNC(vblank_callback), v); + f->vblank_timer = vd->device->machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(voodoo_device::vblank_callback),vd), vd); f->vblank = FALSE; /* initialize the memory FIFO */ @@ -505,11 +446,11 @@ static void init_fbi(voodoo_state *v, fbi_state *f, void *memory, int fbmem) f->fifo.size = f->fifo.in = f->fifo.out = 0; /* set the fog delta mask */ - f->fogdelta_mask = (v->type < TYPE_VOODOO_2) ? 0xff : 0xfc; + f->fogdelta_mask = (vd->vd_type < TYPE_VOODOO_2) ? 0xff : 0xfc; } -static void init_tmu_shared(tmu_shared_state *s) +void voodoo_device::init_tmu_shared(tmu_shared_state *s) { int val; @@ -554,14 +495,14 @@ static void init_tmu_shared(tmu_shared_state *s) } -static void init_tmu(voodoo_state *v, tmu_state *t, voodoo_reg *reg, void *memory, int tmem) +void voodoo_device::init_tmu(voodoo_device* vd, tmu_state *t, voodoo_reg *reg, void *memory, int tmem) { /* allocate texture RAM */ t->ram = (UINT8 *)memory; t->mask = tmem - 1; t->reg = reg; t->regdirty = TRUE; - t->bilinear_mask = (v->type >= TYPE_VOODOO_2) ? 0xff : 0xf0; + t->bilinear_mask = (vd->vd_type >= TYPE_VOODOO_2) ? 0xff : 0xf0; /* mark the NCC tables dirty and configure their registers */ t->ncc[0].dirty = t->ncc[1].dirty = TRUE; @@ -569,31 +510,31 @@ static void init_tmu(voodoo_state *v, tmu_state *t, voodoo_reg *reg, void *memor t->ncc[1].reg = &t->reg[nccTable+12]; /* create pointers to all the tables */ - t->texel[0] = v->tmushare.rgb332; + t->texel[0] = vd->tmushare.rgb332; t->texel[1] = t->ncc[0].texel; - t->texel[2] = v->tmushare.alpha8; - t->texel[3] = v->tmushare.int8; - t->texel[4] = v->tmushare.ai44; + t->texel[2] = vd->tmushare.alpha8; + t->texel[3] = vd->tmushare.int8; + t->texel[4] = vd->tmushare.ai44; t->texel[5] = t->palette; - t->texel[6] = (v->type >= TYPE_VOODOO_2) ? t->palettea : nullptr; + t->texel[6] = (vd->vd_type >= TYPE_VOODOO_2) ? t->palettea : nullptr; t->texel[7] = nullptr; - t->texel[8] = v->tmushare.rgb332; + t->texel[8] = vd->tmushare.rgb332; t->texel[9] = t->ncc[0].texel; - t->texel[10] = v->tmushare.rgb565; - t->texel[11] = v->tmushare.argb1555; - t->texel[12] = v->tmushare.argb4444; - t->texel[13] = v->tmushare.int8; + t->texel[10] = vd->tmushare.rgb565; + t->texel[11] = vd->tmushare.argb1555; + t->texel[12] = vd->tmushare.argb4444; + t->texel[13] = vd->tmushare.int8; t->texel[14] = t->palette; t->texel[15] = nullptr; t->lookup = t->texel[0]; /* attach the palette to NCC table 0 */ t->ncc[0].palette = t->palette; - if (v->type >= TYPE_VOODOO_2) + if (vd->vd_type >= TYPE_VOODOO_2) t->ncc[0].palettea = t->palettea; /* set up texture address calculations */ - if (v->type <= TYPE_VOODOO_2) + if (vd->vd_type <= TYPE_VOODOO_2) { t->texaddr_mask = 0x0fffff; t->texaddr_shift = 3; @@ -606,181 +547,180 @@ static void init_tmu(voodoo_state *v, tmu_state *t, voodoo_reg *reg, void *memor } -static void voodoo_postload(voodoo_state *v) +void voodoo_device::voodoo_postload(voodoo_device *vd) { int index, subindex; - v->fbi.clut_dirty = TRUE; - for (index = 0; index < ARRAY_LENGTH(v->tmu); index++) + vd->fbi.clut_dirty = TRUE; + for (index = 0; index < ARRAY_LENGTH(vd->tmu); index++) { - v->tmu[index].regdirty = TRUE; - for (subindex = 0; subindex < ARRAY_LENGTH(v->tmu[index].ncc); subindex++) - v->tmu[index].ncc[subindex].dirty = TRUE; + vd->tmu[index].regdirty = TRUE; + for (subindex = 0; subindex < ARRAY_LENGTH(vd->tmu[index].ncc); subindex++) + vd->tmu[index].ncc[subindex].dirty = TRUE; } /* recompute video memory to get the FBI FIFO base recomputed */ - if (v->type <= TYPE_VOODOO_2) - recompute_video_memory(v); + if (vd->vd_type <= TYPE_VOODOO_2) + recompute_video_memory(vd); } -static void init_save_state(device_t *device) +static void init_save_state(voodoo_device *vd) { - voodoo_state *v = get_safe_token(device); int index, subindex; - device->machine().save().register_postload(save_prepost_delegate(FUNC(voodoo_postload), v)); + vd->machine().save().register_postload(save_prepost_delegate(FUNC(voodoo_device::voodoo_postload), vd)); /* register states: core */ - device->save_item(NAME(v->extra_cycles)); - device->save_pointer(NAME(&v->reg[0].u), ARRAY_LENGTH(v->reg)); - device->save_item(NAME(v->alt_regmap)); + vd->save_item(NAME(vd->extra_cycles)); + vd->save_pointer(NAME(&vd->reg[0].u), ARRAY_LENGTH(vd->reg)); + vd->save_item(NAME(vd->alt_regmap)); /* register states: pci */ - device->save_item(NAME(v->pci.fifo.in)); - device->save_item(NAME(v->pci.fifo.out)); - device->save_item(NAME(v->pci.init_enable)); - device->save_item(NAME(v->pci.stall_state)); - device->save_item(NAME(v->pci.op_pending)); - device->save_item(NAME(v->pci.op_end_time)); - device->save_item(NAME(v->pci.fifo_mem)); + vd->save_item(NAME(vd->pci.fifo.in)); + vd->save_item(NAME(vd->pci.fifo.out)); + vd->save_item(NAME(vd->pci.init_enable)); + vd->save_item(NAME(vd->pci.stall_state)); + vd->save_item(NAME(vd->pci.op_pending)); + vd->save_item(NAME(vd->pci.op_end_time)); + vd->save_item(NAME(vd->pci.fifo_mem)); /* register states: dac */ - device->save_item(NAME(v->dac.reg)); - device->save_item(NAME(v->dac.read_result)); + vd->save_item(NAME(vd->dac.reg)); + vd->save_item(NAME(vd->dac.read_result)); /* register states: fbi */ - device->save_pointer(NAME(v->fbi.ram), v->fbi.mask + 1); - device->save_item(NAME(v->fbi.rgboffs)); - device->save_item(NAME(v->fbi.auxoffs)); - device->save_item(NAME(v->fbi.frontbuf)); - device->save_item(NAME(v->fbi.backbuf)); - device->save_item(NAME(v->fbi.swaps_pending)); - device->save_item(NAME(v->fbi.video_changed)); - device->save_item(NAME(v->fbi.yorigin)); - device->save_item(NAME(v->fbi.lfb_base)); - device->save_item(NAME(v->fbi.lfb_stride)); - device->save_item(NAME(v->fbi.width)); - device->save_item(NAME(v->fbi.height)); - device->save_item(NAME(v->fbi.xoffs)); - device->save_item(NAME(v->fbi.yoffs)); - device->save_item(NAME(v->fbi.vsyncscan)); - device->save_item(NAME(v->fbi.rowpixels)); - device->save_item(NAME(v->fbi.vblank)); - device->save_item(NAME(v->fbi.vblank_count)); - device->save_item(NAME(v->fbi.vblank_swap_pending)); - device->save_item(NAME(v->fbi.vblank_swap)); - device->save_item(NAME(v->fbi.vblank_dont_swap)); - device->save_item(NAME(v->fbi.cheating_allowed)); - device->save_item(NAME(v->fbi.sign)); - device->save_item(NAME(v->fbi.ax)); - device->save_item(NAME(v->fbi.ay)); - device->save_item(NAME(v->fbi.bx)); - device->save_item(NAME(v->fbi.by)); - device->save_item(NAME(v->fbi.cx)); - device->save_item(NAME(v->fbi.cy)); - device->save_item(NAME(v->fbi.startr)); - device->save_item(NAME(v->fbi.startg)); - device->save_item(NAME(v->fbi.startb)); - device->save_item(NAME(v->fbi.starta)); - device->save_item(NAME(v->fbi.startz)); - device->save_item(NAME(v->fbi.startw)); - device->save_item(NAME(v->fbi.drdx)); - device->save_item(NAME(v->fbi.dgdx)); - device->save_item(NAME(v->fbi.dbdx)); - device->save_item(NAME(v->fbi.dadx)); - device->save_item(NAME(v->fbi.dzdx)); - device->save_item(NAME(v->fbi.dwdx)); - device->save_item(NAME(v->fbi.drdy)); - device->save_item(NAME(v->fbi.dgdy)); - device->save_item(NAME(v->fbi.dbdy)); - device->save_item(NAME(v->fbi.dady)); - device->save_item(NAME(v->fbi.dzdy)); - device->save_item(NAME(v->fbi.dwdy)); - device->save_item(NAME(v->fbi.lfb_stats.pixels_in)); - device->save_item(NAME(v->fbi.lfb_stats.pixels_out)); - device->save_item(NAME(v->fbi.lfb_stats.chroma_fail)); - device->save_item(NAME(v->fbi.lfb_stats.zfunc_fail)); - device->save_item(NAME(v->fbi.lfb_stats.afunc_fail)); - device->save_item(NAME(v->fbi.lfb_stats.clip_fail)); - device->save_item(NAME(v->fbi.lfb_stats.stipple_count)); - device->save_item(NAME(v->fbi.sverts)); - for (index = 0; index < ARRAY_LENGTH(v->fbi.svert); index++) + vd->save_pointer(NAME(vd->fbi.ram), vd->fbi.mask + 1); + vd->save_item(NAME(vd->fbi.rgboffs)); + vd->save_item(NAME(vd->fbi.auxoffs)); + vd->save_item(NAME(vd->fbi.frontbuf)); + vd->save_item(NAME(vd->fbi.backbuf)); + vd->save_item(NAME(vd->fbi.swaps_pending)); + vd->save_item(NAME(vd->fbi.video_changed)); + vd->save_item(NAME(vd->fbi.yorigin)); + vd->save_item(NAME(vd->fbi.lfb_base)); + vd->save_item(NAME(vd->fbi.lfb_stride)); + vd->save_item(NAME(vd->fbi.width)); + vd->save_item(NAME(vd->fbi.height)); + vd->save_item(NAME(vd->fbi.xoffs)); + vd->save_item(NAME(vd->fbi.yoffs)); + vd->save_item(NAME(vd->fbi.vsyncscan)); + vd->save_item(NAME(vd->fbi.rowpixels)); + vd->save_item(NAME(vd->fbi.vblank)); + vd->save_item(NAME(vd->fbi.vblank_count)); + vd->save_item(NAME(vd->fbi.vblank_swap_pending)); + vd->save_item(NAME(vd->fbi.vblank_swap)); + vd->save_item(NAME(vd->fbi.vblank_dont_swap)); + vd->save_item(NAME(vd->fbi.cheating_allowed)); + vd->save_item(NAME(vd->fbi.sign)); + vd->save_item(NAME(vd->fbi.ax)); + vd->save_item(NAME(vd->fbi.ay)); + vd->save_item(NAME(vd->fbi.bx)); + vd->save_item(NAME(vd->fbi.by)); + vd->save_item(NAME(vd->fbi.cx)); + vd->save_item(NAME(vd->fbi.cy)); + vd->save_item(NAME(vd->fbi.startr)); + vd->save_item(NAME(vd->fbi.startg)); + vd->save_item(NAME(vd->fbi.startb)); + vd->save_item(NAME(vd->fbi.starta)); + vd->save_item(NAME(vd->fbi.startz)); + vd->save_item(NAME(vd->fbi.startw)); + vd->save_item(NAME(vd->fbi.drdx)); + vd->save_item(NAME(vd->fbi.dgdx)); + vd->save_item(NAME(vd->fbi.dbdx)); + vd->save_item(NAME(vd->fbi.dadx)); + vd->save_item(NAME(vd->fbi.dzdx)); + vd->save_item(NAME(vd->fbi.dwdx)); + vd->save_item(NAME(vd->fbi.drdy)); + vd->save_item(NAME(vd->fbi.dgdy)); + vd->save_item(NAME(vd->fbi.dbdy)); + vd->save_item(NAME(vd->fbi.dady)); + vd->save_item(NAME(vd->fbi.dzdy)); + vd->save_item(NAME(vd->fbi.dwdy)); + vd->save_item(NAME(vd->fbi.lfb_stats.pixels_in)); + vd->save_item(NAME(vd->fbi.lfb_stats.pixels_out)); + vd->save_item(NAME(vd->fbi.lfb_stats.chroma_fail)); + vd->save_item(NAME(vd->fbi.lfb_stats.zfunc_fail)); + vd->save_item(NAME(vd->fbi.lfb_stats.afunc_fail)); + vd->save_item(NAME(vd->fbi.lfb_stats.clip_fail)); + vd->save_item(NAME(vd->fbi.lfb_stats.stipple_count)); + vd->save_item(NAME(vd->fbi.sverts)); + for (index = 0; index < ARRAY_LENGTH(vd->fbi.svert); index++) { - device->save_item(NAME(v->fbi.svert[index].x), index); - device->save_item(NAME(v->fbi.svert[index].y), index); - device->save_item(NAME(v->fbi.svert[index].a), index); - device->save_item(NAME(v->fbi.svert[index].r), index); - device->save_item(NAME(v->fbi.svert[index].g), index); - device->save_item(NAME(v->fbi.svert[index].b), index); - device->save_item(NAME(v->fbi.svert[index].z), index); - device->save_item(NAME(v->fbi.svert[index].wb), index); - device->save_item(NAME(v->fbi.svert[index].w0), index); - device->save_item(NAME(v->fbi.svert[index].s0), index); - device->save_item(NAME(v->fbi.svert[index].t0), index); - device->save_item(NAME(v->fbi.svert[index].w1), index); - device->save_item(NAME(v->fbi.svert[index].s1), index); - device->save_item(NAME(v->fbi.svert[index].t1), index); + vd->save_item(NAME(vd->fbi.svert[index].x), index); + vd->save_item(NAME(vd->fbi.svert[index].y), index); + vd->save_item(NAME(vd->fbi.svert[index].a), index); + vd->save_item(NAME(vd->fbi.svert[index].r), index); + vd->save_item(NAME(vd->fbi.svert[index].g), index); + vd->save_item(NAME(vd->fbi.svert[index].b), index); + vd->save_item(NAME(vd->fbi.svert[index].z), index); + vd->save_item(NAME(vd->fbi.svert[index].wb), index); + vd->save_item(NAME(vd->fbi.svert[index].w0), index); + vd->save_item(NAME(vd->fbi.svert[index].s0), index); + vd->save_item(NAME(vd->fbi.svert[index].t0), index); + vd->save_item(NAME(vd->fbi.svert[index].w1), index); + vd->save_item(NAME(vd->fbi.svert[index].s1), index); + vd->save_item(NAME(vd->fbi.svert[index].t1), index); } - device->save_item(NAME(v->fbi.fifo.size)); - device->save_item(NAME(v->fbi.fifo.in)); - device->save_item(NAME(v->fbi.fifo.out)); - for (index = 0; index < ARRAY_LENGTH(v->fbi.cmdfifo); index++) + vd->save_item(NAME(vd->fbi.fifo.size)); + vd->save_item(NAME(vd->fbi.fifo.in)); + vd->save_item(NAME(vd->fbi.fifo.out)); + for (index = 0; index < ARRAY_LENGTH(vd->fbi.cmdfifo); index++) { - device->save_item(NAME(v->fbi.cmdfifo[index].enable), index); - device->save_item(NAME(v->fbi.cmdfifo[index].count_holes), index); - device->save_item(NAME(v->fbi.cmdfifo[index].base), index); - device->save_item(NAME(v->fbi.cmdfifo[index].end), index); - device->save_item(NAME(v->fbi.cmdfifo[index].rdptr), index); - device->save_item(NAME(v->fbi.cmdfifo[index].amin), index); - device->save_item(NAME(v->fbi.cmdfifo[index].amax), index); - device->save_item(NAME(v->fbi.cmdfifo[index].depth), index); - device->save_item(NAME(v->fbi.cmdfifo[index].holes), index); + vd->save_item(NAME(vd->fbi.cmdfifo[index].enable), index); + vd->save_item(NAME(vd->fbi.cmdfifo[index].count_holes), index); + vd->save_item(NAME(vd->fbi.cmdfifo[index].base), index); + vd->save_item(NAME(vd->fbi.cmdfifo[index].end), index); + vd->save_item(NAME(vd->fbi.cmdfifo[index].rdptr), index); + vd->save_item(NAME(vd->fbi.cmdfifo[index].amin), index); + vd->save_item(NAME(vd->fbi.cmdfifo[index].amax), index); + vd->save_item(NAME(vd->fbi.cmdfifo[index].depth), index); + vd->save_item(NAME(vd->fbi.cmdfifo[index].holes), index); } - device->save_item(NAME(v->fbi.fogblend)); - device->save_item(NAME(v->fbi.fogdelta)); - device->save_item(NAME(v->fbi.clut)); + vd->save_item(NAME(vd->fbi.fogblend)); + vd->save_item(NAME(vd->fbi.fogdelta)); + vd->save_item(NAME(vd->fbi.clut)); /* register states: tmu */ - for (index = 0; index < ARRAY_LENGTH(v->tmu); index++) + for (index = 0; index < ARRAY_LENGTH(vd->tmu); index++) { - tmu_state *tmu = &v->tmu[index]; + tmu_state *tmu = &vd->tmu[index]; if (tmu->ram == nullptr) continue; - if (tmu->ram != v->fbi.ram) - device->save_pointer(NAME(tmu->ram), tmu->mask + 1, index); - device->save_item(NAME(tmu->starts), index); - device->save_item(NAME(tmu->startt), index); - device->save_item(NAME(tmu->startw), index); - device->save_item(NAME(tmu->dsdx), index); - device->save_item(NAME(tmu->dtdx), index); - device->save_item(NAME(tmu->dwdx), index); - device->save_item(NAME(tmu->dsdy), index); - device->save_item(NAME(tmu->dtdy), index); - device->save_item(NAME(tmu->dwdy), index); + if (tmu->ram != vd->fbi.ram) + vd->save_pointer(NAME(tmu->ram), tmu->mask + 1, index); + vd->save_item(NAME(tmu->starts), index); + vd->save_item(NAME(tmu->startt), index); + vd->save_item(NAME(tmu->startw), index); + vd->save_item(NAME(tmu->dsdx), index); + vd->save_item(NAME(tmu->dtdx), index); + vd->save_item(NAME(tmu->dwdx), index); + vd->save_item(NAME(tmu->dsdy), index); + vd->save_item(NAME(tmu->dtdy), index); + vd->save_item(NAME(tmu->dwdy), index); for (subindex = 0; subindex < ARRAY_LENGTH(tmu->ncc); subindex++) { - device->save_item(NAME(tmu->ncc[subindex].ir), index * ARRAY_LENGTH(tmu->ncc) + subindex); - device->save_item(NAME(tmu->ncc[subindex].ig), index * ARRAY_LENGTH(tmu->ncc) + subindex); - device->save_item(NAME(tmu->ncc[subindex].ib), index * ARRAY_LENGTH(tmu->ncc) + subindex); - device->save_item(NAME(tmu->ncc[subindex].qr), index * ARRAY_LENGTH(tmu->ncc) + subindex); - device->save_item(NAME(tmu->ncc[subindex].qg), index * ARRAY_LENGTH(tmu->ncc) + subindex); - device->save_item(NAME(tmu->ncc[subindex].qb), index * ARRAY_LENGTH(tmu->ncc) + subindex); - device->save_item(NAME(tmu->ncc[subindex].y), index * ARRAY_LENGTH(tmu->ncc) + subindex); + vd->save_item(NAME(tmu->ncc[subindex].ir), index * ARRAY_LENGTH(tmu->ncc) + subindex); + vd->save_item(NAME(tmu->ncc[subindex].ig), index * ARRAY_LENGTH(tmu->ncc) + subindex); + vd->save_item(NAME(tmu->ncc[subindex].ib), index * ARRAY_LENGTH(tmu->ncc) + subindex); + vd->save_item(NAME(tmu->ncc[subindex].qr), index * ARRAY_LENGTH(tmu->ncc) + subindex); + vd->save_item(NAME(tmu->ncc[subindex].qg), index * ARRAY_LENGTH(tmu->ncc) + subindex); + vd->save_item(NAME(tmu->ncc[subindex].qb), index * ARRAY_LENGTH(tmu->ncc) + subindex); + vd->save_item(NAME(tmu->ncc[subindex].y), index * ARRAY_LENGTH(tmu->ncc) + subindex); } } /* register states: banshee */ - if (v->type >= TYPE_VOODOO_BANSHEE) + if (vd->vd_type >= TYPE_VOODOO_BANSHEE) { - device->save_item(NAME(v->banshee.io)); - device->save_item(NAME(v->banshee.agp)); - device->save_item(NAME(v->banshee.vga)); - device->save_item(NAME(v->banshee.crtc)); - device->save_item(NAME(v->banshee.seq)); - device->save_item(NAME(v->banshee.gc)); - device->save_item(NAME(v->banshee.att)); - device->save_item(NAME(v->banshee.attff)); + vd->save_item(NAME(vd->banshee.io)); + vd->save_item(NAME(vd->banshee.agp)); + vd->save_item(NAME(vd->banshee.vga)); + vd->save_item(NAME(vd->banshee.crtc)); + vd->save_item(NAME(vd->banshee.seq)); + vd->save_item(NAME(vd->banshee.gc)); + vd->save_item(NAME(vd->banshee.att)); + vd->save_item(NAME(vd->banshee.attff)); } } @@ -792,27 +732,27 @@ static void init_save_state(device_t *device) * *************************************/ -static void accumulate_statistics(voodoo_state *v, const stats_block *stats) +static void accumulate_statistics(voodoo_device *vd, const stats_block *stats) { /* apply internal voodoo statistics */ - v->reg[fbiPixelsIn].u += stats->pixels_in; - v->reg[fbiPixelsOut].u += stats->pixels_out; - v->reg[fbiChromaFail].u += stats->chroma_fail; - v->reg[fbiZfuncFail].u += stats->zfunc_fail; - v->reg[fbiAfuncFail].u += stats->afunc_fail; + vd->reg[fbiPixelsIn].u += stats->pixels_in; + vd->reg[fbiPixelsOut].u += stats->pixels_out; + vd->reg[fbiChromaFail].u += stats->chroma_fail; + vd->reg[fbiZfuncFail].u += stats->zfunc_fail; + vd->reg[fbiAfuncFail].u += stats->afunc_fail; /* apply emulation statistics */ - v->stats.total_pixels_in += stats->pixels_in; - v->stats.total_pixels_out += stats->pixels_out; - v->stats.total_chroma_fail += stats->chroma_fail; - v->stats.total_zfunc_fail += stats->zfunc_fail; - v->stats.total_afunc_fail += stats->afunc_fail; - v->stats.total_clipped += stats->clip_fail; - v->stats.total_stippled += stats->stipple_count; + vd->stats.total_pixels_in += stats->pixels_in; + vd->stats.total_pixels_out += stats->pixels_out; + vd->stats.total_chroma_fail += stats->chroma_fail; + vd->stats.total_zfunc_fail += stats->zfunc_fail; + vd->stats.total_afunc_fail += stats->afunc_fail; + vd->stats.total_clipped += stats->clip_fail; + vd->stats.total_stippled += stats->stipple_count; } -static void update_statistics(voodoo_state *v, int accumulate) +static void update_statistics(voodoo_device *vd, int accumulate) { int threadnum; @@ -820,14 +760,14 @@ static void update_statistics(voodoo_state *v, int accumulate) for (threadnum = 0; threadnum < WORK_MAX_THREADS; threadnum++) { if (accumulate) - accumulate_statistics(v, &v->thread_stats[threadnum]); - memset(&v->thread_stats[threadnum], 0, sizeof(v->thread_stats[threadnum])); + accumulate_statistics(vd, &vd->thread_stats[threadnum]); + memset(&vd->thread_stats[threadnum], 0, sizeof(vd->thread_stats[threadnum])); } /* accumulate/reset statistics from the LFB */ if (accumulate) - accumulate_statistics(v, &v->fbi.lfb_stats); - memset(&v->fbi.lfb_stats, 0, sizeof(v->fbi.lfb_stats)); + accumulate_statistics(vd, &vd->fbi.lfb_stats); + memset(&vd->fbi.lfb_stats, 0, sizeof(vd->fbi.lfb_stats)); } @@ -838,210 +778,208 @@ static void update_statistics(voodoo_state *v, int accumulate) * *************************************/ -static void swap_buffers(voodoo_state *v) +void voodoo_device::swap_buffers(voodoo_device *vd) { int count; - if (LOG_VBLANK_SWAP) v->device->logerror("--- swap_buffers @ %d\n", v->screen->vpos()); + if (LOG_VBLANK_SWAP) vd->device->logerror("--- swap_buffers @ %d\n", vd->screen->vpos()); /* force a partial update */ - v->screen->update_partial(v->screen->vpos()); - v->fbi.video_changed = TRUE; + vd->screen->update_partial(vd->screen->vpos()); + vd->fbi.video_changed = TRUE; /* keep a history of swap intervals */ - count = v->fbi.vblank_count; + count = vd->fbi.vblank_count; if (count > 15) count = 15; - v->reg[fbiSwapHistory].u = (v->reg[fbiSwapHistory].u << 4) | count; + vd->reg[fbiSwapHistory].u = (vd->reg[fbiSwapHistory].u << 4) | count; /* rotate the buffers */ - if (v->type <= TYPE_VOODOO_2) + if (vd->vd_type <= TYPE_VOODOO_2) { - if (v->type < TYPE_VOODOO_2 || !v->fbi.vblank_dont_swap) + if (vd->vd_type < TYPE_VOODOO_2 || !vd->fbi.vblank_dont_swap) { - if (v->fbi.rgboffs[2] == ~0) + if (vd->fbi.rgboffs[2] == ~0) { - v->fbi.frontbuf = 1 - v->fbi.frontbuf; - v->fbi.backbuf = 1 - v->fbi.frontbuf; + vd->fbi.frontbuf = 1 - vd->fbi.frontbuf; + vd->fbi.backbuf = 1 - vd->fbi.frontbuf; } else { - v->fbi.frontbuf = (v->fbi.frontbuf + 1) % 3; - v->fbi.backbuf = (v->fbi.frontbuf + 1) % 3; + vd->fbi.frontbuf = (vd->fbi.frontbuf + 1) % 3; + vd->fbi.backbuf = (vd->fbi.frontbuf + 1) % 3; } } } else - v->fbi.rgboffs[0] = v->reg[leftOverlayBuf].u & v->fbi.mask & ~0x0f; + vd->fbi.rgboffs[0] = vd->reg[leftOverlayBuf].u & vd->fbi.mask & ~0x0f; /* decrement the pending count and reset our state */ - if (v->fbi.swaps_pending) - v->fbi.swaps_pending--; - v->fbi.vblank_count = 0; - v->fbi.vblank_swap_pending = FALSE; + if (vd->fbi.swaps_pending) + vd->fbi.swaps_pending--; + vd->fbi.vblank_count = 0; + vd->fbi.vblank_swap_pending = FALSE; /* reset the last_op_time to now and start processing the next command */ - if (v->pci.op_pending) + if (vd->pci.op_pending) { - v->pci.op_end_time = v->device->machine().time(); - flush_fifos(v, v->pci.op_end_time); + vd->pci.op_end_time = vd->device->machine().time(); + flush_fifos(vd, vd->pci.op_end_time); } /* we may be able to unstall now */ - if (v->pci.stall_state != NOT_STALLED) - check_stalled_cpu(v, v->device->machine().time()); + if (vd->pci.stall_state != NOT_STALLED) + check_stalled_cpu(vd, vd->device->machine().time()); /* periodically log rasterizer info */ - v->stats.swaps++; - if (LOG_RASTERIZERS && v->stats.swaps % 1000 == 0) - dump_rasterizer_stats(v); + vd->stats.swaps++; + if (LOG_RASTERIZERS && vd->stats.swaps % 1000 == 0) + dump_rasterizer_stats(vd); /* update the statistics (debug) */ - if (v->stats.display) + if (vd->stats.display) { - const rectangle &visible_area = v->screen->visible_area(); + const rectangle &visible_area = vd->screen->visible_area(); int screen_area = visible_area.width() * visible_area.height(); - char *statsptr = v->stats.buffer; + char *statsptr = vd->stats.buffer; int pixelcount; int i; - update_statistics(v, TRUE); - pixelcount = v->stats.total_pixels_out; + update_statistics(vd, TRUE); + pixelcount = vd->stats.total_pixels_out; - statsptr += sprintf(statsptr, "Swap:%6d\n", v->stats.swaps); - statsptr += sprintf(statsptr, "Hist:%08X\n", v->reg[fbiSwapHistory].u); - statsptr += sprintf(statsptr, "Stal:%6d\n", v->stats.stalls); + statsptr += sprintf(statsptr, "Swap:%6d\n", vd->stats.swaps); + statsptr += sprintf(statsptr, "Hist:%08X\n", vd->reg[fbiSwapHistory].u); + statsptr += sprintf(statsptr, "Stal:%6d\n", vd->stats.stalls); statsptr += sprintf(statsptr, "Rend:%6d%%\n", pixelcount * 100 / screen_area); - statsptr += sprintf(statsptr, "Poly:%6d\n", v->stats.total_triangles); - statsptr += sprintf(statsptr, "PxIn:%6d\n", v->stats.total_pixels_in); - statsptr += sprintf(statsptr, "POut:%6d\n", v->stats.total_pixels_out); - statsptr += sprintf(statsptr, "Clip:%6d\n", v->stats.total_clipped); - statsptr += sprintf(statsptr, "Stip:%6d\n", v->stats.total_stippled); - statsptr += sprintf(statsptr, "Chro:%6d\n", v->stats.total_chroma_fail); - statsptr += sprintf(statsptr, "ZFun:%6d\n", v->stats.total_zfunc_fail); - statsptr += sprintf(statsptr, "AFun:%6d\n", v->stats.total_afunc_fail); - statsptr += sprintf(statsptr, "RegW:%6d\n", v->stats.reg_writes); - statsptr += sprintf(statsptr, "RegR:%6d\n", v->stats.reg_reads); - statsptr += sprintf(statsptr, "LFBW:%6d\n", v->stats.lfb_writes); - statsptr += sprintf(statsptr, "LFBR:%6d\n", v->stats.lfb_reads); - statsptr += sprintf(statsptr, "TexW:%6d\n", v->stats.tex_writes); + statsptr += sprintf(statsptr, "Poly:%6d\n", vd->stats.total_triangles); + statsptr += sprintf(statsptr, "PxIn:%6d\n", vd->stats.total_pixels_in); + statsptr += sprintf(statsptr, "POut:%6d\n", vd->stats.total_pixels_out); + statsptr += sprintf(statsptr, "Clip:%6d\n", vd->stats.total_clipped); + statsptr += sprintf(statsptr, "Stip:%6d\n", vd->stats.total_stippled); + statsptr += sprintf(statsptr, "Chro:%6d\n", vd->stats.total_chroma_fail); + statsptr += sprintf(statsptr, "ZFun:%6d\n", vd->stats.total_zfunc_fail); + statsptr += sprintf(statsptr, "AFun:%6d\n", vd->stats.total_afunc_fail); + statsptr += sprintf(statsptr, "RegW:%6d\n", vd->stats.reg_writes); + statsptr += sprintf(statsptr, "RegR:%6d\n", vd->stats.reg_reads); + statsptr += sprintf(statsptr, "LFBW:%6d\n", vd->stats.lfb_writes); + statsptr += sprintf(statsptr, "LFBR:%6d\n", vd->stats.lfb_reads); + statsptr += sprintf(statsptr, "TexW:%6d\n", vd->stats.tex_writes); statsptr += sprintf(statsptr, "TexM:"); for (i = 0; i < 16; i++) - if (v->stats.texture_mode[i]) + if (vd->stats.texture_mode[i]) *statsptr++ = "0123456789ABCDEF"[i]; *statsptr = 0; } /* update statistics */ - v->stats.stalls = 0; - v->stats.total_triangles = 0; - v->stats.total_pixels_in = 0; - v->stats.total_pixels_out = 0; - v->stats.total_chroma_fail = 0; - v->stats.total_zfunc_fail = 0; - v->stats.total_afunc_fail = 0; - v->stats.total_clipped = 0; - v->stats.total_stippled = 0; - v->stats.reg_writes = 0; - v->stats.reg_reads = 0; - v->stats.lfb_writes = 0; - v->stats.lfb_reads = 0; - v->stats.tex_writes = 0; - memset(v->stats.texture_mode, 0, sizeof(v->stats.texture_mode)); + vd->stats.stalls = 0; + vd->stats.total_triangles = 0; + vd->stats.total_pixels_in = 0; + vd->stats.total_pixels_out = 0; + vd->stats.total_chroma_fail = 0; + vd->stats.total_zfunc_fail = 0; + vd->stats.total_afunc_fail = 0; + vd->stats.total_clipped = 0; + vd->stats.total_stippled = 0; + vd->stats.reg_writes = 0; + vd->stats.reg_reads = 0; + vd->stats.lfb_writes = 0; + vd->stats.lfb_reads = 0; + vd->stats.tex_writes = 0; + memset(vd->stats.texture_mode, 0, sizeof(vd->stats.texture_mode)); } -static void adjust_vblank_timer(voodoo_state *v) +static void adjust_vblank_timer(voodoo_device *vd) { - attotime vblank_period = v->screen->time_until_pos(v->fbi.vsyncscan); + attotime vblank_period = vd->screen->time_until_pos(vd->fbi.vsyncscan); /* if zero, adjust to next frame, otherwise we may get stuck in an infinite loop */ if (vblank_period == attotime::zero) - vblank_period = v->screen->frame_period(); - v->fbi.vblank_timer->adjust(vblank_period); + vblank_period = vd->screen->frame_period(); + vd->fbi.vblank_timer->adjust(vblank_period); } -static TIMER_CALLBACK( vblank_off_callback ) +TIMER_CALLBACK_MEMBER( voodoo_device::vblank_off_callback ) { - voodoo_state *v = (voodoo_state *)ptr; - - if (LOG_VBLANK_SWAP) v->device->logerror("--- vblank end\n"); + if (LOG_VBLANK_SWAP) device->logerror("--- vblank end\n"); /* set internal state and call the client */ - v->fbi.vblank = FALSE; + fbi.vblank = FALSE; // TODO: Vblank IRQ enable is VOODOO3 only? - if (v->type >= TYPE_VOODOO_3) + if (vd_type >= TYPE_VOODOO_3) { - if (v->reg[intrCtrl].u & 0x8) // call IRQ handler if VSYNC interrupt (falling) is enabled + if (reg[intrCtrl].u & 0x8) // call IRQ handler if VSYNC interrupt (falling) is enabled { - v->reg[intrCtrl].u |= 0x200; // VSYNC int (falling) active + reg[intrCtrl].u |= 0x200; // VSYNC int (falling) active - if (!v->device->m_vblank.isnull()) - v->device->m_vblank(FALSE); + if (!device->m_vblank.isnull()) + device->m_vblank(FALSE); } } else { - if (!v->device->m_vblank.isnull()) - v->device->m_vblank(FALSE); + if (!device->m_vblank.isnull()) + device->m_vblank(FALSE); } /* go to the end of the next frame */ - adjust_vblank_timer(v); + adjust_vblank_timer(this); } -static TIMER_CALLBACK( vblank_callback ) +TIMER_CALLBACK_MEMBER( voodoo_device::vblank_callback ) { - voodoo_state *v = (voodoo_state *)ptr; - - if (LOG_VBLANK_SWAP) v->device->logerror("--- vblank start\n"); + if (LOG_VBLANK_SWAP) device->logerror("--- vblank start\n"); /* flush the pipes */ - if (v->pci.op_pending) + if (pci.op_pending) { - if (LOG_VBLANK_SWAP) v->device->logerror("---- vblank flush begin\n"); - flush_fifos(v, machine.time()); - if (LOG_VBLANK_SWAP) v->device->logerror("---- vblank flush end\n"); + if (LOG_VBLANK_SWAP) device->logerror("---- vblank flush begin\n"); + flush_fifos(this, machine().time()); + if (LOG_VBLANK_SWAP) device->logerror("---- vblank flush end\n"); } /* increment the count */ - v->fbi.vblank_count++; - if (v->fbi.vblank_count > 250) - v->fbi.vblank_count = 250; - if (LOG_VBLANK_SWAP) v->device->logerror("---- vblank count = %d", v->fbi.vblank_count); - if (v->fbi.vblank_swap_pending) - if (LOG_VBLANK_SWAP) v->device->logerror(" (target=%d)", v->fbi.vblank_swap); - if (LOG_VBLANK_SWAP) v->device->logerror("\n"); + fbi.vblank_count++; + if (fbi.vblank_count > 250) + fbi.vblank_count = 250; + if (LOG_VBLANK_SWAP) device->logerror("---- vblank count = %d", fbi.vblank_count); + if (fbi.vblank_swap_pending) + if (LOG_VBLANK_SWAP) device->logerror(" (target=%d)", fbi.vblank_swap); + if (LOG_VBLANK_SWAP) device->logerror("\n"); /* if we're past the swap count, do the swap */ - if (v->fbi.vblank_swap_pending && v->fbi.vblank_count >= v->fbi.vblank_swap) - swap_buffers(v); + if (fbi.vblank_swap_pending && fbi.vblank_count >= fbi.vblank_swap) + swap_buffers(this); /* set a timer for the next off state */ - machine.scheduler().timer_set(v->screen->time_until_pos(0), FUNC(vblank_off_callback), 0, v); + machine().scheduler().timer_set(screen->time_until_pos(0), timer_expired_delegate(FUNC(voodoo_device::vblank_off_callback),this), 0, this); + + /* set internal state and call the client */ - v->fbi.vblank = TRUE; + fbi.vblank = TRUE; // TODO: Vblank IRQ enable is VOODOO3 only? - if (v->type >= TYPE_VOODOO_3) + if (vd_type >= TYPE_VOODOO_3) { - if (v->reg[intrCtrl].u & 0x4) // call IRQ handler if VSYNC interrupt (rising) is enabled + if (reg[intrCtrl].u & 0x4) // call IRQ handler if VSYNC interrupt (rising) is enabled { - v->reg[intrCtrl].u |= 0x100; // VSYNC int (rising) active + reg[intrCtrl].u |= 0x100; // VSYNC int (rising) active - if (!v->device->m_vblank.isnull()) - v->device->m_vblank(TRUE); + if (!device->m_vblank.isnull()) + device->m_vblank(TRUE); } } else { - if (!v->device->m_vblank.isnull()) - v->device->m_vblank(TRUE); + if (!device->m_vblank.isnull()) + device->m_vblank(TRUE); } } @@ -1053,23 +991,23 @@ static TIMER_CALLBACK( vblank_callback ) * *************************************/ -static void reset_counters(voodoo_state *v) +static void reset_counters(voodoo_device *vd) { - update_statistics(v, FALSE); - v->reg[fbiPixelsIn].u = 0; - v->reg[fbiChromaFail].u = 0; - v->reg[fbiZfuncFail].u = 0; - v->reg[fbiAfuncFail].u = 0; - v->reg[fbiPixelsOut].u = 0; + update_statistics(vd, FALSE); + vd->reg[fbiPixelsIn].u = 0; + vd->reg[fbiChromaFail].u = 0; + vd->reg[fbiZfuncFail].u = 0; + vd->reg[fbiAfuncFail].u = 0; + vd->reg[fbiPixelsOut].u = 0; } -static void soft_reset(voodoo_state *v) +void voodoo_device::soft_reset(voodoo_device *vd) { - reset_counters(v); - v->reg[fbiTrianglesOut].u = 0; - fifo_reset(&v->fbi.fifo); - fifo_reset(&v->pci.fifo); + reset_counters(vd); + vd->reg[fbiTrianglesOut].u = 0; + fifo_reset(&vd->fbi.fifo); + fifo_reset(&vd->pci.fifo); } @@ -1080,103 +1018,103 @@ static void soft_reset(voodoo_state *v) * *************************************/ -static void recompute_video_memory(voodoo_state *v) +void voodoo_device::recompute_video_memory(voodoo_device *vd) { - UINT32 buffer_pages = FBIINIT2_VIDEO_BUFFER_OFFSET(v->reg[fbiInit2].u); - UINT32 fifo_start_page = FBIINIT4_MEMORY_FIFO_START_ROW(v->reg[fbiInit4].u); - UINT32 fifo_last_page = FBIINIT4_MEMORY_FIFO_STOP_ROW(v->reg[fbiInit4].u); + UINT32 buffer_pages = FBIINIT2_VIDEO_BUFFER_OFFSET(vd->reg[fbiInit2].u); + UINT32 fifo_start_page = FBIINIT4_MEMORY_FIFO_START_ROW(vd->reg[fbiInit4].u); + UINT32 fifo_last_page = FBIINIT4_MEMORY_FIFO_STOP_ROW(vd->reg[fbiInit4].u); UINT32 memory_config; int buf; /* memory config is determined differently between V1 and V2 */ - memory_config = FBIINIT2_ENABLE_TRIPLE_BUF(v->reg[fbiInit2].u); - if (v->type == TYPE_VOODOO_2 && memory_config == 0) - memory_config = FBIINIT5_BUFFER_ALLOCATION(v->reg[fbiInit5].u); + memory_config = FBIINIT2_ENABLE_TRIPLE_BUF(vd->reg[fbiInit2].u); + if (vd->vd_type == TYPE_VOODOO_2 && memory_config == 0) + memory_config = FBIINIT5_BUFFER_ALLOCATION(vd->reg[fbiInit5].u); /* tiles are 64x16/32; x_tiles specifies how many half-tiles */ - v->fbi.tile_width = (v->type == TYPE_VOODOO_1) ? 64 : 32; - v->fbi.tile_height = (v->type == TYPE_VOODOO_1) ? 16 : 32; - v->fbi.x_tiles = FBIINIT1_X_VIDEO_TILES(v->reg[fbiInit1].u); - if (v->type == TYPE_VOODOO_2) + vd->fbi.tile_width = (vd->vd_type == TYPE_VOODOO_1) ? 64 : 32; + vd->fbi.tile_height = (vd->vd_type == TYPE_VOODOO_1) ? 16 : 32; + vd->fbi.x_tiles = FBIINIT1_X_VIDEO_TILES(vd->reg[fbiInit1].u); + if (vd->vd_type == TYPE_VOODOO_2) { - v->fbi.x_tiles = (v->fbi.x_tiles << 1) | - (FBIINIT1_X_VIDEO_TILES_BIT5(v->reg[fbiInit1].u) << 5) | - (FBIINIT6_X_VIDEO_TILES_BIT0(v->reg[fbiInit6].u)); + vd->fbi.x_tiles = (vd->fbi.x_tiles << 1) | + (FBIINIT1_X_VIDEO_TILES_BIT5(vd->reg[fbiInit1].u) << 5) | + (FBIINIT6_X_VIDEO_TILES_BIT0(vd->reg[fbiInit6].u)); } - v->fbi.rowpixels = v->fbi.tile_width * v->fbi.x_tiles; + vd->fbi.rowpixels = vd->fbi.tile_width * vd->fbi.x_tiles; -// logerror("VOODOO.%d.VIDMEM: buffer_pages=%X fifo=%X-%X tiles=%X rowpix=%d\n", v->index, buffer_pages, fifo_start_page, fifo_last_page, v->fbi.x_tiles, v->fbi.rowpixels); +// logerror("VOODOO.%d.VIDMEM: buffer_pages=%X fifo=%X-%X tiles=%X rowpix=%d\n", vd->index, buffer_pages, fifo_start_page, fifo_last_page, vd->fbi.x_tiles, vd->fbi.rowpixels); /* first RGB buffer always starts at 0 */ - v->fbi.rgboffs[0] = 0; + vd->fbi.rgboffs[0] = 0; /* second RGB buffer starts immediately afterwards */ - v->fbi.rgboffs[1] = buffer_pages * 0x1000; + vd->fbi.rgboffs[1] = buffer_pages * 0x1000; /* remaining buffers are based on the config */ switch (memory_config) { case 3: /* reserved */ - v->device->logerror("VOODOO.%d.ERROR:Unexpected memory configuration in recompute_video_memory!\n", v->index); + vd->device->logerror("VOODOO.%d.ERROR:Unexpected memory configuration in recompute_video_memory!\n", vd->index); case 0: /* 2 color buffers, 1 aux buffer */ - v->fbi.rgboffs[2] = ~0; - v->fbi.auxoffs = 2 * buffer_pages * 0x1000; + vd->fbi.rgboffs[2] = ~0; + vd->fbi.auxoffs = 2 * buffer_pages * 0x1000; break; case 1: /* 3 color buffers, 0 aux buffers */ - v->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000; - v->fbi.auxoffs = ~0; + vd->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000; + vd->fbi.auxoffs = ~0; break; case 2: /* 3 color buffers, 1 aux buffers */ - v->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000; - v->fbi.auxoffs = 3 * buffer_pages * 0x1000; + vd->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000; + vd->fbi.auxoffs = 3 * buffer_pages * 0x1000; break; } /* clamp the RGB buffers to video memory */ for (buf = 0; buf < 3; buf++) - if (v->fbi.rgboffs[buf] != ~0 && v->fbi.rgboffs[buf] > v->fbi.mask) - v->fbi.rgboffs[buf] = v->fbi.mask; + if (vd->fbi.rgboffs[buf] != ~0 && vd->fbi.rgboffs[buf] > vd->fbi.mask) + vd->fbi.rgboffs[buf] = vd->fbi.mask; /* clamp the aux buffer to video memory */ - if (v->fbi.auxoffs != ~0 && v->fbi.auxoffs > v->fbi.mask) - v->fbi.auxoffs = v->fbi.mask; + if (vd->fbi.auxoffs != ~0 && vd->fbi.auxoffs > vd->fbi.mask) + vd->fbi.auxoffs = vd->fbi.mask; /* osd_printf_debug("rgb[0] = %08X rgb[1] = %08X rgb[2] = %08X aux = %08X\n", - v->fbi.rgboffs[0], v->fbi.rgboffs[1], v->fbi.rgboffs[2], v->fbi.auxoffs);*/ + vd->fbi.rgboffs[0], vd->fbi.rgboffs[1], vd->fbi.rgboffs[2], vd->fbi.auxoffs);*/ /* compute the memory FIFO location and size */ - if (fifo_last_page > v->fbi.mask / 0x1000) - fifo_last_page = v->fbi.mask / 0x1000; + if (fifo_last_page > vd->fbi.mask / 0x1000) + fifo_last_page = vd->fbi.mask / 0x1000; /* is it valid and enabled? */ - if (fifo_start_page <= fifo_last_page && FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u)) + if (fifo_start_page <= fifo_last_page && FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u)) { - v->fbi.fifo.base = (UINT32 *)(v->fbi.ram + fifo_start_page * 0x1000); - v->fbi.fifo.size = (fifo_last_page + 1 - fifo_start_page) * 0x1000 / 4; - if (v->fbi.fifo.size > 65536*2) - v->fbi.fifo.size = 65536*2; + vd->fbi.fifo.base = (UINT32 *)(vd->fbi.ram + fifo_start_page * 0x1000); + vd->fbi.fifo.size = (fifo_last_page + 1 - fifo_start_page) * 0x1000 / 4; + if (vd->fbi.fifo.size > 65536*2) + vd->fbi.fifo.size = 65536*2; } /* if not, disable the FIFO */ else { - v->fbi.fifo.base = nullptr; - v->fbi.fifo.size = 0; + vd->fbi.fifo.base = nullptr; + vd->fbi.fifo.size = 0; } /* reset the FIFO */ - fifo_reset(&v->fbi.fifo); + fifo_reset(&vd->fbi.fifo); /* reset our front/back buffers if they are out of range */ - if (v->fbi.rgboffs[2] == ~0) + if (vd->fbi.rgboffs[2] == ~0) { - if (v->fbi.frontbuf == 2) - v->fbi.frontbuf = 0; - if (v->fbi.backbuf == 2) - v->fbi.backbuf = 0; + if (vd->fbi.frontbuf == 2) + vd->fbi.frontbuf = 0; + if (vd->fbi.backbuf == 2) + vd->fbi.backbuf = 0; } } @@ -1476,9 +1414,9 @@ static inline INT32 prepare_tmu(tmu_state *t) * *************************************/ -static int cmdfifo_compute_expected_depth(voodoo_state *v, cmdfifo_info *f) +static int cmdfifo_compute_expected_depth(voodoo_device *vd, cmdfifo_info *f) { - UINT32 *fifobase = (UINT32 *)v->fbi.ram; + UINT32 *fifobase = (UINT32 *)vd->fbi.ram; UINT32 readptr = f->rdptr; UINT32 command = fifobase[readptr / 4]; int i, count = 0; @@ -1616,9 +1554,9 @@ static int cmdfifo_compute_expected_depth(voodoo_state *v, cmdfifo_info *f) * *************************************/ -static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) +UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) { - UINT32 *fifobase = (UINT32 *)v->fbi.ram; + UINT32 *fifobase = (UINT32 *)vd->fbi.ram; UINT32 readptr = f->rdptr; UINT32 *src = &fifobase[readptr / 4]; UINT32 command = *src++; @@ -1649,26 +1587,26 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) switch ((command >> 3) & 7) { case 0: /* NOP */ - if (LOG_CMDFIFO) v->device->logerror(" NOP\n"); + if (LOG_CMDFIFO) vd->device->logerror(" NOP\n"); break; case 1: /* JSR */ - if (LOG_CMDFIFO) v->device->logerror(" JSR $%06X\n", target); + if (LOG_CMDFIFO) vd->device->logerror(" JSR $%06X\n", target); osd_printf_debug("JSR in CMDFIFO!\n"); src = &fifobase[target / 4]; break; case 2: /* RET */ - if (LOG_CMDFIFO) v->device->logerror(" RET $%06X\n", target); + if (LOG_CMDFIFO) vd->device->logerror(" RET $%06X\n", target); fatalerror("RET in CMDFIFO!\n"); case 3: /* JMP LOCAL FRAME BUFFER */ - if (LOG_CMDFIFO) v->device->logerror(" JMP LOCAL FRAMEBUF $%06X\n", target); + if (LOG_CMDFIFO) vd->device->logerror(" JMP LOCAL FRAMEBUF $%06X\n", target); src = &fifobase[target / 4]; break; case 4: /* JMP AGP */ - if (LOG_CMDFIFO) v->device->logerror(" JMP AGP $%06X\n", target); + if (LOG_CMDFIFO) vd->device->logerror(" JMP AGP $%06X\n", target); fatalerror("JMP AGP in CMDFIFO!\n"); src = &fifobase[target / 4]; break; @@ -1696,16 +1634,16 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) inc = (command >> 15) & 1; target = (command >> 3) & 0xfff; - if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 1: count=%d inc=%d reg=%04X\n", count, inc, target); + if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 1: count=%d inc=%d reg=%04X\n", count, inc, target); - if (v->type >= TYPE_VOODOO_BANSHEE && (target & 0x800)) + if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (target & 0x800)) { // Banshee/Voodoo3 2D register writes /* loop over all registers and write them one at a time */ for (i = 0; i < count; i++, target += inc) { - cycles += banshee_2d_w(v, target & 0xff, *src); + cycles += banshee_2d_w(vd, target & 0xff, *src); //logerror(" 2d reg: %03x = %08X\n", target & 0x7ff, *src); src++; } @@ -1714,7 +1652,7 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) { /* loop over all registers and write them one at a time */ for (i = 0; i < count; i++, target += inc) - cycles += register_w(v, target, *src++); + cycles += register_w(vd, target, *src++); } break; @@ -1727,12 +1665,12 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) 1 31:0 = Data word */ case 2: - if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 2: mask=%X\n", (command >> 3) & 0x1ffffff); + if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 2: mask=%X\n", (command >> 3) & 0x1ffffff); /* loop over all registers and write them one at a time */ for (i = 3; i <= 31; i++) if (command & (1 << i)) - cycles += register_w(v, banshee2D_clip0Min + (i - 3), *src++); + cycles += register_w(vd, banshee2D_clip0Min + (i - 3), *src++); break; /* @@ -1764,10 +1702,10 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) count = (command >> 6) & 15; code = (command >> 3) & 7; - if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 3: count=%d code=%d mask=%03X smode=%02X pc=%d\n", count, code, (command >> 10) & 0xfff, (command >> 22) & 0x3f, (command >> 28) & 1); + if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 3: count=%d code=%d mask=%03X smode=%02X pc=%d\n", count, code, (command >> 10) & 0xfff, (command >> 22) & 0x3f, (command >> 28) & 1); /* copy relevant bits into the setup mode register */ - v->reg[sSetupMode].u = ((command >> 10) & 0xff) | ((command >> 6) & 0xf0000); + vd->reg[sSetupMode].u = ((command >> 10) & 0xff) | ((command >> 6) & 0xf0000); /* loop over triangles */ for (i = 0; i < count; i++) @@ -1834,8 +1772,8 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) /* for a series of individual triangles, initialize all the verts */ if ((code == 1 && i == 0) || (code == 0 && i % 3 == 0)) { - v->fbi.sverts = 1; - v->fbi.svert[0] = v->fbi.svert[1] = v->fbi.svert[2] = svert; + vd->fbi.sverts = 1; + vd->fbi.svert[0] = vd->fbi.svert[1] = vd->fbi.svert[2] = svert; } /* otherwise, add this to the list */ @@ -1843,15 +1781,15 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) { /* for strip mode, shuffle vertex 1 down to 0 */ if (!(command & (1 << 22))) - v->fbi.svert[0] = v->fbi.svert[1]; + vd->fbi.svert[0] = vd->fbi.svert[1]; /* copy 2 down to 1 and add our new one regardless */ - v->fbi.svert[1] = v->fbi.svert[2]; - v->fbi.svert[2] = svert; + vd->fbi.svert[1] = vd->fbi.svert[2]; + vd->fbi.svert[2] = svert; /* if we have enough, draw */ - if (++v->fbi.sverts >= 3) - cycles += setup_and_draw_triangle(v); + if (++vd->fbi.sverts >= 3) + cycles += setup_and_draw_triangle(vd); } } @@ -1874,9 +1812,9 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) /* extract parameters */ target = (command >> 3) & 0xfff; - if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 4: mask=%X reg=%04X pad=%d\n", (command >> 15) & 0x3fff, target, command >> 29); + if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 4: mask=%X reg=%04X pad=%d\n", (command >> 15) & 0x3fff, target, command >> 29); - if (v->type >= TYPE_VOODOO_BANSHEE && (target & 0x800)) + if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (target & 0x800)) { // Banshee/Voodoo3 2D register writes @@ -1886,7 +1824,7 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) { if (command & (1 << i)) { - cycles += banshee_2d_w(v, target + (i - 15), *src); + cycles += banshee_2d_w(vd, target + (i - 15), *src); //logerror(" 2d reg: %03x = %08X\n", target & 0x7ff, *src); src++; } @@ -1897,7 +1835,7 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) /* loop over all registers and write them one at a time */ for (i = 15; i <= 28; i++) if (command & (1 << i)) - cycles += register_w(v, target + (i - 15), *src++); + cycles += register_w(vd, target + (i - 15), *src++); } /* account for the extra dummy words */ @@ -1928,17 +1866,17 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) { case 0: // Linear FB { - if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 5: FB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); + if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 5: FB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); UINT32 addr = target * 4; for (i=0; i < count; i++) { UINT32 data = *src++; - v->fbi.ram[BYTE_XOR_LE(addr + 0)] = (UINT8)(data); - v->fbi.ram[BYTE_XOR_LE(addr + 1)] = (UINT8)(data >> 8); - v->fbi.ram[BYTE_XOR_LE(addr + 2)] = (UINT8)(data >> 16); - v->fbi.ram[BYTE_XOR_LE(addr + 3)] = (UINT8)(data >> 24); + vd->fbi.ram[BYTE_XOR_LE(addr + 0)] = (UINT8)(data); + vd->fbi.ram[BYTE_XOR_LE(addr + 1)] = (UINT8)(data >> 8); + vd->fbi.ram[BYTE_XOR_LE(addr + 2)] = (UINT8)(data >> 16); + vd->fbi.ram[BYTE_XOR_LE(addr + 3)] = (UINT8)(data >> 24); addr += 4; } @@ -1946,11 +1884,11 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) } case 2: // 3D LFB { - if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 5: 3D LFB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); + if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 5: 3D LFB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); /* loop over words */ for (i = 0; i < count; i++) - cycles += lfb_w(v, target++, *src++, 0xffffffff); + cycles += lfb_w(vd, target++, *src++, 0xffffffff); break; } @@ -1971,11 +1909,11 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) case 3: // Texture Port { - if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 5: textureRAM count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); + if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 5: textureRAM count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); /* loop over words */ for (i = 0; i < count; i++) - cycles += texture_w(v, target++, *src++); + cycles += texture_w(vd, target++, *src++); break; } @@ -2001,7 +1939,7 @@ static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) * *************************************/ -static INT32 cmdfifo_execute_if_ready(voodoo_state *v, cmdfifo_info *f) +INT32 voodoo_device::cmdfifo_execute_if_ready(voodoo_device* vd, cmdfifo_info *f) { int needed_depth; int cycles; @@ -2011,12 +1949,12 @@ static INT32 cmdfifo_execute_if_ready(voodoo_state *v, cmdfifo_info *f) return -1; /* see if we have enough for the current command */ - needed_depth = cmdfifo_compute_expected_depth(v, f); + needed_depth = cmdfifo_compute_expected_depth(vd, f); if (f->depth < needed_depth) return -1; /* execute */ - cycles = cmdfifo_execute(v, f); + cycles = cmdfifo_execute(vd, f); f->depth -= needed_depth; return cycles; } @@ -2029,12 +1967,12 @@ static INT32 cmdfifo_execute_if_ready(voodoo_state *v, cmdfifo_info *f) * *************************************/ -static void cmdfifo_w(voodoo_state *v, cmdfifo_info *f, offs_t offset, UINT32 data) +void voodoo_device::cmdfifo_w(voodoo_device *vd, cmdfifo_info *f, offs_t offset, UINT32 data) { UINT32 addr = f->base + offset * 4; - UINT32 *fifobase = (UINT32 *)v->fbi.ram; + UINT32 *fifobase = (UINT32 *)vd->fbi.ram; - if (LOG_CMDFIFO_VERBOSE) v->device->logerror("CMDFIFO_w(%04X) = %08X\n", offset, data); + if (LOG_CMDFIFO_VERBOSE) vd->device->logerror("CMDFIFO_w(%04X) = %08X\n", offset, data); /* write the data */ if (addr < f->end) @@ -2054,7 +1992,7 @@ static void cmdfifo_w(voodoo_state *v, cmdfifo_info *f, offs_t offset, UINT32 da else if (addr < f->amin) { if (f->holes != 0) - v->device->logerror("Unexpected CMDFIFO: AMin=%08X AMax=%08X Holes=%d WroteTo:%08X\n", + vd->device->logerror("Unexpected CMDFIFO: AMin=%08X AMax=%08X Holes=%d WroteTo:%08X\n", f->amin, f->amax, f->holes, addr); //f->amin = f->amax = addr; f->holes += (addr - f->base) / 4; @@ -2084,17 +2022,17 @@ static void cmdfifo_w(voodoo_state *v, cmdfifo_info *f, offs_t offset, UINT32 da } /* execute if we can */ - if (!v->pci.op_pending) + if (!vd->pci.op_pending) { - INT32 cycles = cmdfifo_execute_if_ready(v, f); + INT32 cycles = cmdfifo_execute_if_ready(vd, f); if (cycles > 0) { - v->pci.op_pending = TRUE; - v->pci.op_end_time = v->device->machine().time() + attotime(0, (attoseconds_t)cycles * v->attoseconds_per_cycle); + vd->pci.op_pending = TRUE; + vd->pci.op_end_time = vd->device->machine().time() + attotime(0, (attoseconds_t)cycles * vd->attoseconds_per_cycle); - if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", v->index, - v->device->machine().time().seconds(), (UINT32)(v->device->machine().time().attoseconds() >> 32), (UINT32)v->device->machine().time().attoseconds(), - v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds()); + if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", vd->index, + vd->device->machine().time().seconds(), (UINT32)(vd->device->machine().time().attoseconds() >> 32), (UINT32)vd->device->machine().time().attoseconds(), + vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds()); } } } @@ -2108,83 +2046,83 @@ static void cmdfifo_w(voodoo_state *v, cmdfifo_info *f, offs_t offset, UINT32 da * *************************************/ -static TIMER_CALLBACK( stall_cpu_callback ) +TIMER_CALLBACK_MEMBER( voodoo_device::stall_cpu_callback ) { - check_stalled_cpu((voodoo_state *)ptr, machine.time()); + check_stalled_cpu(this, machine().time()); } -static void check_stalled_cpu(voodoo_state *v, attotime current_time) +void voodoo_device::check_stalled_cpu(voodoo_device* vd, attotime current_time) { int resume = FALSE; /* flush anything we can */ - if (v->pci.op_pending) - flush_fifos(v, current_time); + if (vd->pci.op_pending) + flush_fifos(vd, current_time); /* if we're just stalled until the LWM is passed, see if we're ok now */ - if (v->pci.stall_state == STALLED_UNTIL_FIFO_LWM) + if (vd->pci.stall_state == STALLED_UNTIL_FIFO_LWM) { /* if there's room in the memory FIFO now, we can proceed */ - if (FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u)) + if (FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u)) { - if (fifo_items(&v->fbi.fifo) < 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(v->reg[fbiInit0].u)) + if (fifo_items(&vd->fbi.fifo) < 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(vd->reg[fbiInit0].u)) resume = TRUE; } - else if (fifo_space(&v->pci.fifo) > 2 * FBIINIT0_PCI_FIFO_LWM(v->reg[fbiInit0].u)) + else if (fifo_space(&vd->pci.fifo) > 2 * FBIINIT0_PCI_FIFO_LWM(vd->reg[fbiInit0].u)) resume = TRUE; } /* if we're stalled until the FIFOs are empty, check now */ - else if (v->pci.stall_state == STALLED_UNTIL_FIFO_EMPTY) + else if (vd->pci.stall_state == STALLED_UNTIL_FIFO_EMPTY) { - if (FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u)) + if (FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u)) { - if (fifo_empty(&v->fbi.fifo) && fifo_empty(&v->pci.fifo)) + if (fifo_empty(&vd->fbi.fifo) && fifo_empty(&vd->pci.fifo)) resume = TRUE; } - else if (fifo_empty(&v->pci.fifo)) + else if (fifo_empty(&vd->pci.fifo)) resume = TRUE; } /* resume if necessary */ - if (resume || !v->pci.op_pending) + if (resume || !vd->pci.op_pending) { - if (LOG_FIFO) v->device->logerror("VOODOO.%d.FIFO:Stall condition cleared; resuming\n", v->index); - v->pci.stall_state = NOT_STALLED; + if (LOG_FIFO) vd->device->logerror("VOODOO.%d.FIFO:Stall condition cleared; resuming\n", vd->index); + vd->pci.stall_state = NOT_STALLED; /* either call the callback, or trigger the trigger */ - if (!v->device->m_stall.isnull()) - v->device->m_stall(FALSE); + if (!vd->device->m_stall.isnull()) + vd->device->m_stall(FALSE); else - v->device->machine().scheduler().trigger(v->trigger); + vd->device->machine().scheduler().trigger(vd->trigger); } /* if not, set a timer for the next one */ else { - v->pci.continue_timer->adjust(v->pci.op_end_time - current_time); + vd->pci.continue_timer->adjust(vd->pci.op_end_time - current_time); } } -static void stall_cpu(voodoo_state *v, int state, attotime current_time) +void voodoo_device::stall_cpu(voodoo_device *vd, int state, attotime current_time) { /* sanity check */ - if (!v->pci.op_pending) fatalerror("FIFOs not empty, no op pending!\n"); + if (!vd->pci.op_pending) fatalerror("FIFOs not empty, no op pending!\n"); /* set the state and update statistics */ - v->pci.stall_state = state; - v->stats.stalls++; + vd->pci.stall_state = state; + vd->stats.stalls++; /* either call the callback, or spin the CPU */ - if (!v->device->m_stall.isnull()) - v->device->m_stall(TRUE); + if (!vd->device->m_stall.isnull()) + vd->device->m_stall(TRUE); else - v->cpu->execute().spin_until_trigger(v->trigger); + vd->cpu->execute().spin_until_trigger(vd->trigger); /* set a timer to clear the stall */ - v->pci.continue_timer->adjust(v->pci.op_end_time - current_time); + vd->pci.continue_timer->adjust(vd->pci.op_end_time - current_time); } @@ -2195,7 +2133,7 @@ static void stall_cpu(voodoo_state *v, int state, attotime current_time) * *************************************/ -static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) +INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) { UINT32 origdata = data; INT32 cycles = 0; @@ -2204,24 +2142,24 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) UINT8 chips; /* statistics */ - v->stats.reg_writes++; + vd->stats.reg_writes++; /* determine which chips we are addressing */ chips = (offset >> 8) & 0xf; if (chips == 0) chips = 0xf; - chips &= v->chipmask; + chips &= vd->chipmask; /* the first 64 registers can be aliased differently */ - if ((offset & 0x800c0) == 0x80000 && v->alt_regmap) + if ((offset & 0x800c0) == 0x80000 && vd->alt_regmap) regnum = register_alias_map[offset & 0x3f]; else regnum = offset & 0xff; /* first make sure this register is readable */ - if (!(v->regaccess[regnum] & REGISTER_WRITE)) + if (!(vd->regaccess[regnum] & REGISTER_WRITE)) { - v->device->logerror("VOODOO.%d.ERROR:Invalid attempt to write %s\n", v->index, v->regnames[regnum]); + vd->device->logerror("VOODOO.%d.ERROR:Invalid attempt to write %s\n", vd->index, vd->regnames[regnum]); return 0; } @@ -2232,227 +2170,227 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) case fvertexAx: data = float_to_int32(data, 4); case vertexAx: - if (chips & 1) v->fbi.ax = (INT16)data; + if (chips & 1) vd->fbi.ax = (INT16)data; break; case fvertexAy: data = float_to_int32(data, 4); case vertexAy: - if (chips & 1) v->fbi.ay = (INT16)data; + if (chips & 1) vd->fbi.ay = (INT16)data; break; case fvertexBx: data = float_to_int32(data, 4); case vertexBx: - if (chips & 1) v->fbi.bx = (INT16)data; + if (chips & 1) vd->fbi.bx = (INT16)data; break; case fvertexBy: data = float_to_int32(data, 4); case vertexBy: - if (chips & 1) v->fbi.by = (INT16)data; + if (chips & 1) vd->fbi.by = (INT16)data; break; case fvertexCx: data = float_to_int32(data, 4); case vertexCx: - if (chips & 1) v->fbi.cx = (INT16)data; + if (chips & 1) vd->fbi.cx = (INT16)data; break; case fvertexCy: data = float_to_int32(data, 4); case vertexCy: - if (chips & 1) v->fbi.cy = (INT16)data; + if (chips & 1) vd->fbi.cy = (INT16)data; break; /* RGB data is 12.12 formatted fixed point */ case fstartR: data = float_to_int32(data, 12); case startR: - if (chips & 1) v->fbi.startr = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.startr = (INT32)(data << 8) >> 8; break; case fstartG: data = float_to_int32(data, 12); case startG: - if (chips & 1) v->fbi.startg = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.startg = (INT32)(data << 8) >> 8; break; case fstartB: data = float_to_int32(data, 12); case startB: - if (chips & 1) v->fbi.startb = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.startb = (INT32)(data << 8) >> 8; break; case fstartA: data = float_to_int32(data, 12); case startA: - if (chips & 1) v->fbi.starta = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.starta = (INT32)(data << 8) >> 8; break; case fdRdX: data = float_to_int32(data, 12); case dRdX: - if (chips & 1) v->fbi.drdx = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.drdx = (INT32)(data << 8) >> 8; break; case fdGdX: data = float_to_int32(data, 12); case dGdX: - if (chips & 1) v->fbi.dgdx = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.dgdx = (INT32)(data << 8) >> 8; break; case fdBdX: data = float_to_int32(data, 12); case dBdX: - if (chips & 1) v->fbi.dbdx = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.dbdx = (INT32)(data << 8) >> 8; break; case fdAdX: data = float_to_int32(data, 12); case dAdX: - if (chips & 1) v->fbi.dadx = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.dadx = (INT32)(data << 8) >> 8; break; case fdRdY: data = float_to_int32(data, 12); case dRdY: - if (chips & 1) v->fbi.drdy = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.drdy = (INT32)(data << 8) >> 8; break; case fdGdY: data = float_to_int32(data, 12); case dGdY: - if (chips & 1) v->fbi.dgdy = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.dgdy = (INT32)(data << 8) >> 8; break; case fdBdY: data = float_to_int32(data, 12); case dBdY: - if (chips & 1) v->fbi.dbdy = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.dbdy = (INT32)(data << 8) >> 8; break; case fdAdY: data = float_to_int32(data, 12); case dAdY: - if (chips & 1) v->fbi.dady = (INT32)(data << 8) >> 8; + if (chips & 1) vd->fbi.dady = (INT32)(data << 8) >> 8; break; /* Z data is 20.12 formatted fixed point */ case fstartZ: data = float_to_int32(data, 12); case startZ: - if (chips & 1) v->fbi.startz = (INT32)data; + if (chips & 1) vd->fbi.startz = (INT32)data; break; case fdZdX: data = float_to_int32(data, 12); case dZdX: - if (chips & 1) v->fbi.dzdx = (INT32)data; + if (chips & 1) vd->fbi.dzdx = (INT32)data; break; case fdZdY: data = float_to_int32(data, 12); case dZdY: - if (chips & 1) v->fbi.dzdy = (INT32)data; + if (chips & 1) vd->fbi.dzdy = (INT32)data; break; /* S,T data is 14.18 formatted fixed point, converted to 16.32 internally */ case fstartS: data64 = float_to_int64(data, 32); - if (chips & 2) v->tmu[0].starts = data64; - if (chips & 4) v->tmu[1].starts = data64; + if (chips & 2) vd->tmu[0].starts = data64; + if (chips & 4) vd->tmu[1].starts = data64; break; case startS: - if (chips & 2) v->tmu[0].starts = (INT64)(INT32)data << 14; - if (chips & 4) v->tmu[1].starts = (INT64)(INT32)data << 14; + if (chips & 2) vd->tmu[0].starts = (INT64)(INT32)data << 14; + if (chips & 4) vd->tmu[1].starts = (INT64)(INT32)data << 14; break; case fstartT: data64 = float_to_int64(data, 32); - if (chips & 2) v->tmu[0].startt = data64; - if (chips & 4) v->tmu[1].startt = data64; + if (chips & 2) vd->tmu[0].startt = data64; + if (chips & 4) vd->tmu[1].startt = data64; break; case startT: - if (chips & 2) v->tmu[0].startt = (INT64)(INT32)data << 14; - if (chips & 4) v->tmu[1].startt = (INT64)(INT32)data << 14; + if (chips & 2) vd->tmu[0].startt = (INT64)(INT32)data << 14; + if (chips & 4) vd->tmu[1].startt = (INT64)(INT32)data << 14; break; case fdSdX: data64 = float_to_int64(data, 32); - if (chips & 2) v->tmu[0].dsdx = data64; - if (chips & 4) v->tmu[1].dsdx = data64; + if (chips & 2) vd->tmu[0].dsdx = data64; + if (chips & 4) vd->tmu[1].dsdx = data64; break; case dSdX: - if (chips & 2) v->tmu[0].dsdx = (INT64)(INT32)data << 14; - if (chips & 4) v->tmu[1].dsdx = (INT64)(INT32)data << 14; + if (chips & 2) vd->tmu[0].dsdx = (INT64)(INT32)data << 14; + if (chips & 4) vd->tmu[1].dsdx = (INT64)(INT32)data << 14; break; case fdTdX: data64 = float_to_int64(data, 32); - if (chips & 2) v->tmu[0].dtdx = data64; - if (chips & 4) v->tmu[1].dtdx = data64; + if (chips & 2) vd->tmu[0].dtdx = data64; + if (chips & 4) vd->tmu[1].dtdx = data64; break; case dTdX: - if (chips & 2) v->tmu[0].dtdx = (INT64)(INT32)data << 14; - if (chips & 4) v->tmu[1].dtdx = (INT64)(INT32)data << 14; + if (chips & 2) vd->tmu[0].dtdx = (INT64)(INT32)data << 14; + if (chips & 4) vd->tmu[1].dtdx = (INT64)(INT32)data << 14; break; case fdSdY: data64 = float_to_int64(data, 32); - if (chips & 2) v->tmu[0].dsdy = data64; - if (chips & 4) v->tmu[1].dsdy = data64; + if (chips & 2) vd->tmu[0].dsdy = data64; + if (chips & 4) vd->tmu[1].dsdy = data64; break; case dSdY: - if (chips & 2) v->tmu[0].dsdy = (INT64)(INT32)data << 14; - if (chips & 4) v->tmu[1].dsdy = (INT64)(INT32)data << 14; + if (chips & 2) vd->tmu[0].dsdy = (INT64)(INT32)data << 14; + if (chips & 4) vd->tmu[1].dsdy = (INT64)(INT32)data << 14; break; case fdTdY: data64 = float_to_int64(data, 32); - if (chips & 2) v->tmu[0].dtdy = data64; - if (chips & 4) v->tmu[1].dtdy = data64; + if (chips & 2) vd->tmu[0].dtdy = data64; + if (chips & 4) vd->tmu[1].dtdy = data64; break; case dTdY: - if (chips & 2) v->tmu[0].dtdy = (INT64)(INT32)data << 14; - if (chips & 4) v->tmu[1].dtdy = (INT64)(INT32)data << 14; + if (chips & 2) vd->tmu[0].dtdy = (INT64)(INT32)data << 14; + if (chips & 4) vd->tmu[1].dtdy = (INT64)(INT32)data << 14; break; /* W data is 2.30 formatted fixed point, converted to 16.32 internally */ case fstartW: data64 = float_to_int64(data, 32); - if (chips & 1) v->fbi.startw = data64; - if (chips & 2) v->tmu[0].startw = data64; - if (chips & 4) v->tmu[1].startw = data64; + if (chips & 1) vd->fbi.startw = data64; + if (chips & 2) vd->tmu[0].startw = data64; + if (chips & 4) vd->tmu[1].startw = data64; break; case startW: - if (chips & 1) v->fbi.startw = (INT64)(INT32)data << 2; - if (chips & 2) v->tmu[0].startw = (INT64)(INT32)data << 2; - if (chips & 4) v->tmu[1].startw = (INT64)(INT32)data << 2; + if (chips & 1) vd->fbi.startw = (INT64)(INT32)data << 2; + if (chips & 2) vd->tmu[0].startw = (INT64)(INT32)data << 2; + if (chips & 4) vd->tmu[1].startw = (INT64)(INT32)data << 2; break; case fdWdX: data64 = float_to_int64(data, 32); - if (chips & 1) v->fbi.dwdx = data64; - if (chips & 2) v->tmu[0].dwdx = data64; - if (chips & 4) v->tmu[1].dwdx = data64; + if (chips & 1) vd->fbi.dwdx = data64; + if (chips & 2) vd->tmu[0].dwdx = data64; + if (chips & 4) vd->tmu[1].dwdx = data64; break; case dWdX: - if (chips & 1) v->fbi.dwdx = (INT64)(INT32)data << 2; - if (chips & 2) v->tmu[0].dwdx = (INT64)(INT32)data << 2; - if (chips & 4) v->tmu[1].dwdx = (INT64)(INT32)data << 2; + if (chips & 1) vd->fbi.dwdx = (INT64)(INT32)data << 2; + if (chips & 2) vd->tmu[0].dwdx = (INT64)(INT32)data << 2; + if (chips & 4) vd->tmu[1].dwdx = (INT64)(INT32)data << 2; break; case fdWdY: data64 = float_to_int64(data, 32); - if (chips & 1) v->fbi.dwdy = data64; - if (chips & 2) v->tmu[0].dwdy = data64; - if (chips & 4) v->tmu[1].dwdy = data64; + if (chips & 1) vd->fbi.dwdy = data64; + if (chips & 2) vd->tmu[0].dwdy = data64; + if (chips & 4) vd->tmu[1].dwdy = data64; break; case dWdY: - if (chips & 1) v->fbi.dwdy = (INT64)(INT32)data << 2; - if (chips & 2) v->tmu[0].dwdy = (INT64)(INT32)data << 2; - if (chips & 4) v->tmu[1].dwdy = (INT64)(INT32)data << 2; + if (chips & 1) vd->fbi.dwdy = (INT64)(INT32)data << 2; + if (chips & 2) vd->tmu[0].dwdy = (INT64)(INT32)data << 2; + if (chips & 4) vd->tmu[1].dwdy = (INT64)(INT32)data << 2; break; /* setup bits */ @@ -2460,114 +2398,114 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) if (chips & 1) { rgb_t rgbdata(data); - v->reg[sAlpha].f = rgbdata.a(); - v->reg[sRed].f = rgbdata.r(); - v->reg[sGreen].f = rgbdata.g(); - v->reg[sBlue].f = rgbdata.b(); + vd->reg[sAlpha].f = rgbdata.a(); + vd->reg[sRed].f = rgbdata.r(); + vd->reg[sGreen].f = rgbdata.g(); + vd->reg[sBlue].f = rgbdata.b(); } break; /* mask off invalid bits for different cards */ case fbzColorPath: - poly_wait(v->poly, v->regnames[regnum]); - if (v->type < TYPE_VOODOO_2) + poly_wait(vd->poly, vd->regnames[regnum]); + if (vd->vd_type < TYPE_VOODOO_2) data &= 0x0fffffff; - if (chips & 1) v->reg[fbzColorPath].u = data; + if (chips & 1) vd->reg[fbzColorPath].u = data; break; case fbzMode: - poly_wait(v->poly, v->regnames[regnum]); - if (v->type < TYPE_VOODOO_2) + poly_wait(vd->poly, vd->regnames[regnum]); + if (vd->vd_type < TYPE_VOODOO_2) data &= 0x001fffff; - if (chips & 1) v->reg[fbzMode].u = data; + if (chips & 1) vd->reg[fbzMode].u = data; break; case fogMode: - poly_wait(v->poly, v->regnames[regnum]); - if (v->type < TYPE_VOODOO_2) + poly_wait(vd->poly, vd->regnames[regnum]); + if (vd->vd_type < TYPE_VOODOO_2) data &= 0x0000003f; - if (chips & 1) v->reg[fogMode].u = data; + if (chips & 1) vd->reg[fogMode].u = data; break; /* triangle drawing */ case triangleCMD: - v->fbi.cheating_allowed = (v->fbi.ax != 0 || v->fbi.ay != 0 || v->fbi.bx > 50 || v->fbi.by != 0 || v->fbi.cx != 0 || v->fbi.cy > 50); - v->fbi.sign = data; - cycles = triangle(v); + vd->fbi.cheating_allowed = (vd->fbi.ax != 0 || vd->fbi.ay != 0 || vd->fbi.bx > 50 || vd->fbi.by != 0 || vd->fbi.cx != 0 || vd->fbi.cy > 50); + vd->fbi.sign = data; + cycles = triangle(vd); break; case ftriangleCMD: - v->fbi.cheating_allowed = TRUE; - v->fbi.sign = data; - cycles = triangle(v); + vd->fbi.cheating_allowed = TRUE; + vd->fbi.sign = data; + cycles = triangle(vd); break; case sBeginTriCMD: - cycles = begin_triangle(v); + cycles = begin_triangle(vd); break; case sDrawTriCMD: - cycles = draw_triangle(v); + cycles = draw_triangle(vd); break; /* other commands */ case nopCMD: - poly_wait(v->poly, v->regnames[regnum]); + poly_wait(vd->poly, vd->regnames[regnum]); if (data & 1) - reset_counters(v); + reset_counters(vd); if (data & 2) - v->reg[fbiTrianglesOut].u = 0; + vd->reg[fbiTrianglesOut].u = 0; break; case fastfillCMD: - cycles = fastfill(v); + cycles = fastfill(vd); break; case swapbufferCMD: - poly_wait(v->poly, v->regnames[regnum]); - cycles = swapbuffer(v, data); + poly_wait(vd->poly, vd->regnames[regnum]); + cycles = swapbuffer(vd, data); break; case userIntrCMD: - poly_wait(v->poly, v->regnames[regnum]); + poly_wait(vd->poly, vd->regnames[regnum]); //fatalerror("userIntrCMD\n"); - v->reg[intrCtrl].u |= 0x1800; - v->reg[intrCtrl].u &= ~0x80000000; + vd->reg[intrCtrl].u |= 0x1800; + vd->reg[intrCtrl].u &= ~0x80000000; // TODO: rename vblank_client for less confusion? - if (!v->device->m_vblank.isnull()) - v->device->m_vblank(TRUE); + if (!vd->device->m_vblank.isnull()) + vd->device->m_vblank(TRUE); break; /* gamma table access -- Voodoo/Voodoo2 only */ case clutData: - if (v->type <= TYPE_VOODOO_2 && (chips & 1)) + if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1)) { - poly_wait(v->poly, v->regnames[regnum]); - if (!FBIINIT1_VIDEO_TIMING_RESET(v->reg[fbiInit1].u)) + poly_wait(vd->poly, vd->regnames[regnum]); + if (!FBIINIT1_VIDEO_TIMING_RESET(vd->reg[fbiInit1].u)) { int index = data >> 24; if (index <= 32) { - v->fbi.clut[index] = data; - v->fbi.clut_dirty = TRUE; + vd->fbi.clut[index] = data; + vd->fbi.clut_dirty = TRUE; } } else - v->device->logerror("clutData ignored because video timing reset = 1\n"); + vd->device->logerror("clutData ignored because video timing reset = 1\n"); } break; /* external DAC access -- Voodoo/Voodoo2 only */ case dacData: - if (v->type <= TYPE_VOODOO_2 && (chips & 1)) + if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1)) { - poly_wait(v->poly, v->regnames[regnum]); + poly_wait(vd->poly, vd->regnames[regnum]); if (!(data & 0x800)) - dacdata_w(&v->dac, (data >> 8) & 7, data & 0xff); + dacdata_w(&vd->dac, (data >> 8) & 7, data & 0xff); else - dacdata_r(&v->dac, (data >> 8) & 7); + dacdata_r(&vd->dac, (data >> 8) & 7); } break; @@ -2576,35 +2514,35 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) case vSync: case backPorch: case videoDimensions: - if (v->type <= TYPE_VOODOO_2 && (chips & 1)) + if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1)) { - poly_wait(v->poly, v->regnames[regnum]); - v->reg[regnum].u = data; - if (v->reg[hSync].u != 0 && v->reg[vSync].u != 0 && v->reg[videoDimensions].u != 0) + poly_wait(vd->poly, vd->regnames[regnum]); + vd->reg[regnum].u = data; + if (vd->reg[hSync].u != 0 && vd->reg[vSync].u != 0 && vd->reg[videoDimensions].u != 0) { int hvis, vvis, htotal, vtotal, hbp, vbp; - attoseconds_t refresh = v->screen->frame_period().attoseconds(); + attoseconds_t refresh = vd->screen->frame_period().attoseconds(); attoseconds_t stdperiod, medperiod, vgaperiod; attoseconds_t stddiff, meddiff, vgadiff; rectangle visarea; - if (v->type == TYPE_VOODOO_2) + if (vd->vd_type == TYPE_VOODOO_2) { - htotal = ((v->reg[hSync].u >> 16) & 0x7ff) + 1 + (v->reg[hSync].u & 0x1ff) + 1; - vtotal = ((v->reg[vSync].u >> 16) & 0x1fff) + (v->reg[vSync].u & 0x1fff); - hvis = v->reg[videoDimensions].u & 0x7ff; - vvis = (v->reg[videoDimensions].u >> 16) & 0x7ff; - hbp = (v->reg[backPorch].u & 0x1ff) + 2; - vbp = (v->reg[backPorch].u >> 16) & 0x1ff; + htotal = ((vd->reg[hSync].u >> 16) & 0x7ff) + 1 + (vd->reg[hSync].u & 0x1ff) + 1; + vtotal = ((vd->reg[vSync].u >> 16) & 0x1fff) + (vd->reg[vSync].u & 0x1fff); + hvis = vd->reg[videoDimensions].u & 0x7ff; + vvis = (vd->reg[videoDimensions].u >> 16) & 0x7ff; + hbp = (vd->reg[backPorch].u & 0x1ff) + 2; + vbp = (vd->reg[backPorch].u >> 16) & 0x1ff; } else { - htotal = ((v->reg[hSync].u >> 16) & 0x3ff) + 1 + (v->reg[hSync].u & 0xff) + 1; - vtotal = ((v->reg[vSync].u >> 16) & 0xfff) + (v->reg[vSync].u & 0xfff); - hvis = v->reg[videoDimensions].u & 0x3ff; - vvis = (v->reg[videoDimensions].u >> 16) & 0x3ff; - hbp = (v->reg[backPorch].u & 0xff) + 2; - vbp = (v->reg[backPorch].u >> 16) & 0xff; + htotal = ((vd->reg[hSync].u >> 16) & 0x3ff) + 1 + (vd->reg[hSync].u & 0xff) + 1; + vtotal = ((vd->reg[vSync].u >> 16) & 0xfff) + (vd->reg[vSync].u & 0xfff); + hvis = vd->reg[videoDimensions].u & 0x3ff; + vvis = (vd->reg[videoDimensions].u >> 16) & 0x3ff; + hbp = (vd->reg[backPorch].u & 0xff) + 2; + vbp = (vd->reg[backPorch].u >> 16) & 0xff; } /* create a new visarea */ @@ -2628,61 +2566,61 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) if (vgadiff < 0) vgadiff = -vgadiff; osd_printf_debug("hSync=%08X vSync=%08X backPorch=%08X videoDimensions=%08X\n", - v->reg[hSync].u, v->reg[vSync].u, v->reg[backPorch].u, v->reg[videoDimensions].u); + vd->reg[hSync].u, vd->reg[vSync].u, vd->reg[backPorch].u, vd->reg[videoDimensions].u); osd_printf_debug("Horiz: %d-%d (%d total) Vert: %d-%d (%d total) -- ", visarea.min_x, visarea.max_x, htotal, visarea.min_y, visarea.max_y, vtotal); /* configure the screen based on which one matches the closest */ if (stddiff < meddiff && stddiff < vgadiff) { - v->screen->configure(htotal, vtotal, visarea, stdperiod); + vd->screen->configure(htotal, vtotal, visarea, stdperiod); osd_printf_debug("Standard resolution, %f Hz\n", ATTOSECONDS_TO_HZ(stdperiod)); } else if (meddiff < vgadiff) { - v->screen->configure(htotal, vtotal, visarea, medperiod); + vd->screen->configure(htotal, vtotal, visarea, medperiod); osd_printf_debug("Medium resolution, %f Hz\n", ATTOSECONDS_TO_HZ(medperiod)); } else { - v->screen->configure(htotal, vtotal, visarea, vgaperiod); + vd->screen->configure(htotal, vtotal, visarea, vgaperiod); osd_printf_debug("VGA resolution, %f Hz\n", ATTOSECONDS_TO_HZ(vgaperiod)); } /* configure the new framebuffer info */ - v->fbi.width = hvis; - v->fbi.height = vvis; - v->fbi.xoffs = hbp; - v->fbi.yoffs = vbp; - v->fbi.vsyncscan = (v->reg[vSync].u >> 16) & 0xfff; + vd->fbi.width = hvis; + vd->fbi.height = vvis; + vd->fbi.xoffs = hbp; + vd->fbi.yoffs = vbp; + vd->fbi.vsyncscan = (vd->reg[vSync].u >> 16) & 0xfff; /* recompute the time of VBLANK */ - adjust_vblank_timer(v); + adjust_vblank_timer(vd); /* if changing dimensions, update video memory layout */ if (regnum == videoDimensions) - recompute_video_memory(v); + recompute_video_memory(vd); } } break; /* fbiInit0 can only be written if initEnable says we can -- Voodoo/Voodoo2 only */ case fbiInit0: - poly_wait(v->poly, v->regnames[regnum]); - if (v->type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable)) + poly_wait(vd->poly, vd->regnames[regnum]); + if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable)) { - v->reg[fbiInit0].u = data; + vd->reg[fbiInit0].u = data; if (FBIINIT0_GRAPHICS_RESET(data)) - soft_reset(v); + soft_reset(vd); if (FBIINIT0_FIFO_RESET(data)) - fifo_reset(&v->pci.fifo); - recompute_video_memory(v); + fifo_reset(&vd->pci.fifo); + recompute_video_memory(vd); } break; /* fbiInit5-7 are Voodoo 2-only; ignore them on anything else */ case fbiInit5: case fbiInit6: - if (v->type < TYPE_VOODOO_2) + if (vd->vd_type < TYPE_VOODOO_2) break; /* else fall through... */ @@ -2691,94 +2629,94 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) case fbiInit1: case fbiInit2: case fbiInit4: - poly_wait(v->poly, v->regnames[regnum]); - if (v->type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable)) + poly_wait(vd->poly, vd->regnames[regnum]); + if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable)) { - v->reg[regnum].u = data; - recompute_video_memory(v); - v->fbi.video_changed = TRUE; + vd->reg[regnum].u = data; + recompute_video_memory(vd); + vd->fbi.video_changed = TRUE; } break; case fbiInit3: - poly_wait(v->poly, v->regnames[regnum]); - if (v->type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable)) + poly_wait(vd->poly, vd->regnames[regnum]); + if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable)) { - v->reg[regnum].u = data; - v->alt_regmap = FBIINIT3_TRI_REGISTER_REMAP(data); - v->fbi.yorigin = FBIINIT3_YORIGIN_SUBTRACT(v->reg[fbiInit3].u); - recompute_video_memory(v); + vd->reg[regnum].u = data; + vd->alt_regmap = FBIINIT3_TRI_REGISTER_REMAP(data); + vd->fbi.yorigin = FBIINIT3_YORIGIN_SUBTRACT(vd->reg[fbiInit3].u); + recompute_video_memory(vd); } break; case fbiInit7: /* case swapPending: -- Banshee */ - if (v->type == TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable)) + if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable)) { - poly_wait(v->poly, v->regnames[regnum]); - v->reg[regnum].u = data; - v->fbi.cmdfifo[0].enable = FBIINIT7_CMDFIFO_ENABLE(data); - v->fbi.cmdfifo[0].count_holes = !FBIINIT7_DISABLE_CMDFIFO_HOLES(data); + poly_wait(vd->poly, vd->regnames[regnum]); + vd->reg[regnum].u = data; + vd->fbi.cmdfifo[0].enable = FBIINIT7_CMDFIFO_ENABLE(data); + vd->fbi.cmdfifo[0].count_holes = !FBIINIT7_DISABLE_CMDFIFO_HOLES(data); } - else if (v->type >= TYPE_VOODOO_BANSHEE) - v->fbi.swaps_pending++; + else if (vd->vd_type >= TYPE_VOODOO_BANSHEE) + vd->fbi.swaps_pending++; break; /* cmdFifo -- Voodoo2 only */ case cmdFifoBaseAddr: - if (v->type == TYPE_VOODOO_2 && (chips & 1)) + if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) { - poly_wait(v->poly, v->regnames[regnum]); - v->reg[regnum].u = data; - v->fbi.cmdfifo[0].base = (data & 0x3ff) << 12; - v->fbi.cmdfifo[0].end = (((data >> 16) & 0x3ff) + 1) << 12; + poly_wait(vd->poly, vd->regnames[regnum]); + vd->reg[regnum].u = data; + vd->fbi.cmdfifo[0].base = (data & 0x3ff) << 12; + vd->fbi.cmdfifo[0].end = (((data >> 16) & 0x3ff) + 1) << 12; } break; case cmdFifoBump: - if (v->type == TYPE_VOODOO_2 && (chips & 1)) + if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) fatalerror("cmdFifoBump\n"); break; case cmdFifoRdPtr: - if (v->type == TYPE_VOODOO_2 && (chips & 1)) - v->fbi.cmdfifo[0].rdptr = data; + if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) + vd->fbi.cmdfifo[0].rdptr = data; break; case cmdFifoAMin: /* case colBufferAddr: -- Banshee */ - if (v->type == TYPE_VOODOO_2 && (chips & 1)) - v->fbi.cmdfifo[0].amin = data; - else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1)) - v->fbi.rgboffs[1] = data & v->fbi.mask & ~0x0f; + if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) + vd->fbi.cmdfifo[0].amin = data; + else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1)) + vd->fbi.rgboffs[1] = data & vd->fbi.mask & ~0x0f; break; case cmdFifoAMax: /* case colBufferStride: -- Banshee */ - if (v->type == TYPE_VOODOO_2 && (chips & 1)) - v->fbi.cmdfifo[0].amax = data; - else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1)) + if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) + vd->fbi.cmdfifo[0].amax = data; + else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1)) { if (data & 0x8000) - v->fbi.rowpixels = (data & 0x7f) << 6; + vd->fbi.rowpixels = (data & 0x7f) << 6; else - v->fbi.rowpixels = (data & 0x3fff) >> 1; + vd->fbi.rowpixels = (data & 0x3fff) >> 1; } break; case cmdFifoDepth: /* case auxBufferAddr: -- Banshee */ - if (v->type == TYPE_VOODOO_2 && (chips & 1)) - v->fbi.cmdfifo[0].depth = data; - else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1)) - v->fbi.auxoffs = data & v->fbi.mask & ~0x0f; + if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) + vd->fbi.cmdfifo[0].depth = data; + else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1)) + vd->fbi.auxoffs = data & vd->fbi.mask & ~0x0f; break; case cmdFifoHoles: /* case auxBufferStride: -- Banshee */ - if (v->type == TYPE_VOODOO_2 && (chips & 1)) - v->fbi.cmdfifo[0].holes = data; - else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1)) + if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) + vd->fbi.cmdfifo[0].holes = data; + else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1)) { int rowpixels; @@ -2786,7 +2724,7 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) rowpixels = (data & 0x7f) << 6; else rowpixels = (data & 0x3fff) >> 1; - if (v->fbi.rowpixels != rowpixels) + if (vd->fbi.rowpixels != rowpixels) fatalerror("aux buffer stride differs from color buffer stride\n"); } break; @@ -2804,9 +2742,9 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) case nccTable+9: case nccTable+10: case nccTable+11: - poly_wait(v->poly, v->regnames[regnum]); - if (chips & 2) ncc_table_write(&v->tmu[0].ncc[0], regnum - nccTable, data); - if (chips & 4) ncc_table_write(&v->tmu[1].ncc[0], regnum - nccTable, data); + poly_wait(vd->poly, vd->regnames[regnum]); + if (chips & 2) ncc_table_write(&vd->tmu[0].ncc[0], regnum - nccTable, data); + if (chips & 4) ncc_table_write(&vd->tmu[1].ncc[0], regnum - nccTable, data); break; case nccTable+12: @@ -2821,9 +2759,9 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) case nccTable+21: case nccTable+22: case nccTable+23: - poly_wait(v->poly, v->regnames[regnum]); - if (chips & 2) ncc_table_write(&v->tmu[0].ncc[1], regnum - (nccTable+12), data); - if (chips & 4) ncc_table_write(&v->tmu[1].ncc[1], regnum - (nccTable+12), data); + poly_wait(vd->poly, vd->regnames[regnum]); + if (chips & 2) ncc_table_write(&vd->tmu[0].ncc[1], regnum - (nccTable+12), data); + if (chips & 4) ncc_table_write(&vd->tmu[1].ncc[1], regnum - (nccTable+12), data); break; /* fogTable entries are processed and expanded immediately */ @@ -2859,14 +2797,14 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) case fogTable+29: case fogTable+30: case fogTable+31: - poly_wait(v->poly, v->regnames[regnum]); + poly_wait(vd->poly, vd->regnames[regnum]); if (chips & 1) { int base = 2 * (regnum - fogTable); - v->fbi.fogdelta[base + 0] = (data >> 0) & 0xff; - v->fbi.fogblend[base + 0] = (data >> 8) & 0xff; - v->fbi.fogdelta[base + 1] = (data >> 16) & 0xff; - v->fbi.fogblend[base + 1] = (data >> 24) & 0xff; + vd->fbi.fogdelta[base + 0] = (data >> 0) & 0xff; + vd->fbi.fogblend[base + 0] = (data >> 8) & 0xff; + vd->fbi.fogdelta[base + 1] = (data >> 16) & 0xff; + vd->fbi.fogblend[base + 1] = (data >> 24) & 0xff; } break; @@ -2878,22 +2816,22 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) case texBaseAddr_1: case texBaseAddr_2: case texBaseAddr_3_8: - poly_wait(v->poly, v->regnames[regnum]); + poly_wait(vd->poly, vd->regnames[regnum]); if (chips & 2) { - v->tmu[0].reg[regnum].u = data; - v->tmu[0].regdirty = TRUE; + vd->tmu[0].reg[regnum].u = data; + vd->tmu[0].regdirty = TRUE; } if (chips & 4) { - v->tmu[1].reg[regnum].u = data; - v->tmu[1].regdirty = TRUE; + vd->tmu[1].reg[regnum].u = data; + vd->tmu[1].regdirty = TRUE; } break; case trexInit1: /* send tmu config data to the frame buffer */ - v->send_config = (TREXINIT_SEND_TMU_CONFIG(data) > 0); + vd->send_config = (TREXINIT_SEND_TMU_CONFIG(data) > 0); goto default_case; /* these registers are referenced in the renderer; we must wait for pending work before changing */ @@ -2907,25 +2845,25 @@ static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) case color0: case clipLowYHighY: case clipLeftRight: - poly_wait(v->poly, v->regnames[regnum]); + poly_wait(vd->poly, vd->regnames[regnum]); /* fall through to default implementation */ /* by default, just feed the data to the chips */ default: default_case: - if (chips & 1) v->reg[0x000 + regnum].u = data; - if (chips & 2) v->reg[0x100 + regnum].u = data; - if (chips & 4) v->reg[0x200 + regnum].u = data; - if (chips & 8) v->reg[0x300 + regnum].u = data; + if (chips & 1) vd->reg[0x000 + regnum].u = data; + if (chips & 2) vd->reg[0x100 + regnum].u = data; + if (chips & 4) vd->reg[0x200 + regnum].u = data; + if (chips & 8) vd->reg[0x300 + regnum].u = data; break; } if (LOG_REGISTERS) { if (regnum < fvertexAx || regnum > fdWdY) - v->device->logerror("VOODOO.%d.REG:%s(%d) write = %08X\n", v->index, (regnum < 0x384/4) ? v->regnames[regnum] : "oob", chips, origdata); + vd->device->logerror("VOODOO.%d.REG:%s(%d) write = %08X\n", vd->index, (regnum < 0x384/4) ? vd->regnames[regnum] : "oob", chips, origdata); else - v->device->logerror("VOODOO.%d.REG:%s(%d) write = %f\n", v->index, (regnum < 0x384/4) ? v->regnames[regnum] : "oob", chips, (double) u2f(origdata)); + vd->device->logerror("VOODOO.%d.REG:%s(%d) write = %f\n", vd->index, (regnum < 0x384/4) ? vd->regnames[regnum] : "oob", chips, (double) u2f(origdata)); } return cycles; @@ -2938,25 +2876,25 @@ default_case: * Voodoo LFB writes * *************************************/ -static INT32 lfb_direct_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) -{ +INT32 voodoo_device::lfb_direct_w(voodoo_device *vd, offs_t offset, UINT32 data, UINT32 mem_mask) +{ UINT16 *dest; UINT32 destmax; int x, y; UINT32 bufoffs; /* statistics */ - v->stats.lfb_writes++; + vd->stats.lfb_writes++; /* byte swizzling */ - if (LFBMODE_BYTE_SWIZZLE_WRITES(v->reg[lfbMode].u)) + if (LFBMODE_BYTE_SWIZZLE_WRITES(vd->reg[lfbMode].u)) { data = FLIPENDIAN_INT32(data); mem_mask = FLIPENDIAN_INT32(mem_mask); } /* word swapping */ - if (LFBMODE_WORD_SWAP_WRITES(v->reg[lfbMode].u)) + if (LFBMODE_WORD_SWAP_WRITES(vd->reg[lfbMode].u)) { data = (data << 16) | (data >> 16); mem_mask = (mem_mask << 16) | (mem_mask >> 16); @@ -2966,25 +2904,26 @@ static INT32 lfb_direct_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 me // For direct lfb access just write the data /* compute X,Y */ offset <<= 1; - x = offset & ((1 << v->fbi.lfb_stride) - 1); - y = (offset >> v->fbi.lfb_stride); - dest = (UINT16 *)(v->fbi.ram + v->fbi.lfb_base*4); - destmax = (v->fbi.mask + 1 - v->fbi.lfb_base*4) / 2; - bufoffs = y * v->fbi.rowpixels + x; + x = offset & ((1 << vd->fbi.lfb_stride) - 1); + y = (offset >> vd->fbi.lfb_stride); + dest = (UINT16 *)(vd->fbi.ram + vd->fbi.lfb_base*4); + destmax = (vd->fbi.mask + 1 - vd->fbi.lfb_base*4) / 2; + bufoffs = y * vd->fbi.rowpixels + x; if (bufoffs >= destmax) { - v->device->logerror("lfb_direct_w: Buffer offset out of bounds x=%i y=%i offset=%08X bufoffs=%08X data=%08X\n", x, y, offset, (UINT32) bufoffs, data); + vd->device->logerror("lfb_direct_w: Buffer offset out of bounds x=%i y=%i offset=%08X bufoffs=%08X data=%08X\n", x, y, offset, (UINT32) bufoffs, data); return 0; } if (ACCESSING_BITS_0_15) dest[bufoffs + 0] = data&0xffff; if (ACCESSING_BITS_16_31) dest[bufoffs + 1] = data>>16; - if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:write direct (%d,%d) = %08X & %08X\n", v->index, x, y, data, mem_mask); + if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:write direct (%d,%d) = %08X & %08X\n", vd->index, x, y, data, mem_mask); return 0; } -static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) +INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 mem_mask) { + UINT16 *dest, *depth; UINT32 destmax, depthmax; int sr[2], sg[2], sb[2], sa[2], sw[2]; @@ -2992,28 +2931,28 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) int pix, destbuf; /* statistics */ - v->stats.lfb_writes++; + vd->stats.lfb_writes++; /* byte swizzling */ - if (LFBMODE_BYTE_SWIZZLE_WRITES(v->reg[lfbMode].u)) + if (LFBMODE_BYTE_SWIZZLE_WRITES(vd->reg[lfbMode].u)) { data = FLIPENDIAN_INT32(data); mem_mask = FLIPENDIAN_INT32(mem_mask); } /* word swapping */ - if (LFBMODE_WORD_SWAP_WRITES(v->reg[lfbMode].u)) + if (LFBMODE_WORD_SWAP_WRITES(vd->reg[lfbMode].u)) { data = (data << 16) | (data >> 16); mem_mask = (mem_mask << 16) | (mem_mask >> 16); } /* extract default depth and alpha values */ - sw[0] = sw[1] = v->reg[zaColor].u & 0xffff; - sa[0] = sa[1] = v->reg[zaColor].u >> 24; + sw[0] = sw[1] = vd->reg[zaColor].u & 0xffff; + sa[0] = sa[1] = vd->reg[zaColor].u >> 24; /* first extract A,R,G,B from the data */ - switch (LFBMODE_WRITE_FORMAT(v->reg[lfbMode].u) + 16 * LFBMODE_RGBA_LANES(v->reg[lfbMode].u)) + switch (LFBMODE_WRITE_FORMAT(vd->reg[lfbMode].u) + 16 * LFBMODE_RGBA_LANES(vd->reg[lfbMode].u)) { case 16*0 + 0: /* ARGB, 16-bit RGB 5-6-5 */ case 16*2 + 0: /* RGBA, 16-bit RGB 5-6-5 */ @@ -3180,13 +3119,13 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) break; default: /* reserved */ - v->device->logerror("lfb_w: Unknown format\n"); + vd->device->logerror("lfb_w: Unknown format\n"); return 0; } /* compute X,Y */ - x = offset & ((1 << v->fbi.lfb_stride) - 1); - y = (offset >> v->fbi.lfb_stride) & 0x3ff; + x = offset & ((1 << vd->fbi.lfb_stride) - 1); + y = (offset >> vd->fbi.lfb_stride) & 0x3ff; /* adjust the mask based on which half of the data is written */ if (!ACCESSING_BITS_0_15) @@ -3195,47 +3134,47 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) mask &= ~(0xf0 + LFB_DEPTH_PRESENT_MSW); /* select the target buffer */ - destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_WRITE_BUFFER_SELECT(v->reg[lfbMode].u); + destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_WRITE_BUFFER_SELECT(vd->reg[lfbMode].u); switch (destbuf) { case 0: /* front buffer */ - dest = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]); - destmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.frontbuf]) / 2; - v->fbi.video_changed = TRUE; + dest = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]); + destmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.frontbuf]) / 2; + vd->fbi.video_changed = TRUE; break; case 1: /* back buffer */ - dest = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]); - destmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.backbuf]) / 2; + dest = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]); + destmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.backbuf]) / 2; break; default: /* reserved */ return 0; } - depth = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs); - depthmax = (v->fbi.mask + 1 - v->fbi.auxoffs) / 2; + depth = (UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs); + depthmax = (vd->fbi.mask + 1 - vd->fbi.auxoffs) / 2; /* simple case: no pipeline */ - if (!LFBMODE_ENABLE_PIXEL_PIPELINE(v->reg[lfbMode].u)) + if (!LFBMODE_ENABLE_PIXEL_PIPELINE(vd->reg[lfbMode].u)) { DECLARE_DITHER_POINTERS_NO_DITHER_VAR; UINT32 bufoffs; - if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:write raw mode %X (%d,%d) = %08X & %08X\n", v->index, LFBMODE_WRITE_FORMAT(v->reg[lfbMode].u), x, y, data, mem_mask); + if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:write raw mode %X (%d,%d) = %08X & %08X\n", vd->index, LFBMODE_WRITE_FORMAT(vd->reg[lfbMode].u), x, y, data, mem_mask); /* determine the screen Y */ scry = y; - if (LFBMODE_Y_ORIGIN(v->reg[lfbMode].u)) - scry = (v->fbi.yorigin - y) & 0x3ff; + if (LFBMODE_Y_ORIGIN(vd->reg[lfbMode].u)) + scry = (vd->fbi.yorigin - y) & 0x3ff; /* advance pointers to the proper row */ - bufoffs = scry * v->fbi.rowpixels + x; + bufoffs = scry * vd->fbi.rowpixels + x; /* compute dithering */ - COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(v->reg[fbzMode].u, y); + COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(vd->reg[fbzMode].u, y); /* wait for any outstanding work to finish */ - poly_wait(v->poly, "LFB Write"); + poly_wait(vd->poly, "LFB Write"); /* loop over up to two pixels */ for (pix = 0; mask; pix++) @@ -3247,7 +3186,7 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) if ((mask & LFB_RGB_PRESENT) && bufoffs < destmax) { /* apply dithering and write to the screen */ - APPLY_DITHER(v->reg[fbzMode].u, x, dither_lookup, sr[pix], sg[pix], sb[pix]); + APPLY_DITHER(vd->reg[fbzMode].u, x, dither_lookup, sr[pix], sg[pix], sb[pix]); dest[bufoffs] = (sr[pix] << 11) | (sg[pix] << 5) | sb[pix]; } @@ -3255,16 +3194,16 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) if (depth && bufoffs < depthmax) { /* write to the alpha buffer */ - if ((mask & LFB_ALPHA_PRESENT) && FBZMODE_ENABLE_ALPHA_PLANES(v->reg[fbzMode].u)) + if ((mask & LFB_ALPHA_PRESENT) && FBZMODE_ENABLE_ALPHA_PLANES(vd->reg[fbzMode].u)) depth[bufoffs] = sa[pix]; /* write to the depth buffer */ - if ((mask & (LFB_DEPTH_PRESENT | LFB_DEPTH_PRESENT_MSW)) && !FBZMODE_ENABLE_ALPHA_PLANES(v->reg[fbzMode].u)) + if ((mask & (LFB_DEPTH_PRESENT | LFB_DEPTH_PRESENT_MSW)) && !FBZMODE_ENABLE_ALPHA_PLANES(vd->reg[fbzMode].u)) depth[bufoffs] = sw[pix]; } /* track pixel writes to the frame buffer regardless of mask */ - v->reg[fbiPixelsOut].u++; + vd->reg[fbiPixelsOut].u++; } /* advance our pointers */ @@ -3279,20 +3218,20 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) { DECLARE_DITHER_POINTERS; - if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:write pipelined mode %X (%d,%d) = %08X & %08X\n", v->index, LFBMODE_WRITE_FORMAT(v->reg[lfbMode].u), x, y, data, mem_mask); + if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:write pipelined mode %X (%d,%d) = %08X & %08X\n", vd->index, LFBMODE_WRITE_FORMAT(vd->reg[lfbMode].u), x, y, data, mem_mask); /* determine the screen Y */ scry = y; - if (FBZMODE_Y_ORIGIN(v->reg[fbzMode].u)) - scry = (v->fbi.yorigin - y) & 0x3ff; + if (FBZMODE_Y_ORIGIN(vd->reg[fbzMode].u)) + scry = (vd->fbi.yorigin - y) & 0x3ff; /* advance pointers to the proper row */ - dest += scry * v->fbi.rowpixels; + dest += scry * vd->fbi.rowpixels; if (depth) - depth += scry * v->fbi.rowpixels; + depth += scry * vd->fbi.rowpixels; /* compute dithering */ - COMPUTE_DITHER_POINTERS(v->reg[fbzMode].u, y); + COMPUTE_DITHER_POINTERS(vd->reg[fbzMode].u, y); /* loop over up to two pixels */ for (pix = 0; mask; pix++) @@ -3300,10 +3239,10 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) /* make sure we care about this pixel */ if (mask & 0x0f) { - stats_block *stats = &v->fbi.lfb_stats; + stats_block *stats = &vd->fbi.lfb_stats; INT64 iterw; - if (LFBMODE_WRITE_W_SELECT(v->reg[lfbMode].u)) { - iterw = (UINT32) v->reg[zaColor].u << 16; + if (LFBMODE_WRITE_W_SELECT(vd->reg[lfbMode].u)) { + iterw = (UINT32) vd->reg[zaColor].u << 16; } else { // The most significant fractional bits of 16.32 W are set to z iterw = (UINT32) sw[pix] << 16; @@ -3311,12 +3250,12 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) INT32 iterz = sw[pix] << 12; /* apply clipping */ - if (FBZMODE_ENABLE_CLIPPING(v->reg[fbzMode].u)) + if (FBZMODE_ENABLE_CLIPPING(vd->reg[fbzMode].u)) { - if (x < ((v->reg[clipLeftRight].u >> 16) & 0x3ff) || - x >= (v->reg[clipLeftRight].u & 0x3ff) || - scry < ((v->reg[clipLowYHighY].u >> 16) & 0x3ff) || - scry >= (v->reg[clipLowYHighY].u & 0x3ff)) + if (x < ((vd->reg[clipLeftRight].u >> 16) & 0x3ff) || + x >= (vd->reg[clipLeftRight].u & 0x3ff) || + scry < ((vd->reg[clipLowYHighY].u >> 16) & 0x3ff) || + scry >= (vd->reg[clipLowYHighY].u & 0x3ff)) { stats->pixels_in++; stats->clip_fail++; @@ -3329,7 +3268,7 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) /* pixel pipeline part 1 handles depth testing and stippling */ - //PIXEL_PIPELINE_BEGIN(v, stats, x, y, v->reg[fbzColorPath].u, v->reg[fbzMode].u, iterz, iterw); + //PIXEL_PIPELINE_BEGIN(v, stats, x, y, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, iterz, iterw); // Start PIXEL_PIPE_BEGIN copy //#define PIXEL_PIPELINE_BEGIN(VV, STATS, XX, YY, FBZCOLORPATH, FBZMODE, ITERZ, ITERW) INT32 fogdepth, biasdepth; @@ -3341,15 +3280,15 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) /* note that for perf reasons, we assume the caller has done clipping */ /* handle stippling */ - if (FBZMODE_ENABLE_STIPPLE(v->reg[fbzMode].u)) + if (FBZMODE_ENABLE_STIPPLE(vd->reg[fbzMode].u)) { /* rotate mode */ - if (FBZMODE_STIPPLE_PATTERN(v->reg[fbzMode].u) == 0) + if (FBZMODE_STIPPLE_PATTERN(vd->reg[fbzMode].u) == 0) { - v->reg[stipple].u = (v->reg[stipple].u << 1) | (v->reg[stipple].u >> 31); - if ((v->reg[stipple].u & 0x80000000) == 0) + vd->reg[stipple].u = (vd->reg[stipple].u << 1) | (vd->reg[stipple].u >> 31); + if ((vd->reg[stipple].u & 0x80000000) == 0) { - v->stats.total_stippled++; + vd->stats.total_stippled++; goto skipdrawdepth; } } @@ -3358,9 +3297,9 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) else { int stipple_index = ((y & 3) << 3) | (~x & 7); - if (((v->reg[stipple].u >> stipple_index) & 1) == 0) + if (((vd->reg[stipple].u >> stipple_index) & 1) == 0) { - v->stats.total_stippled++; + vd->stats.total_stippled++; goto nextpixel; } } @@ -3372,29 +3311,29 @@ static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) /* Perform depth testing */ - if (!depthTest((UINT16) v->reg[zaColor].u, stats, depth[x], v->reg[fbzMode].u, biasdepth)) + if (!depthTest((UINT16) vd->reg[zaColor].u, stats, depth[x], vd->reg[fbzMode].u, biasdepth)) goto nextpixel; /* use the RGBA we stashed above */ color.set(sa[pix], sr[pix], sg[pix], sb[pix]); /* handle chroma key */ - if (!chromaKeyTest(v, stats, v->reg[fbzMode].u, color)) + if (!chromaKeyTest(vd, stats, vd->reg[fbzMode].u, color)) goto nextpixel; /* handle alpha mask */ - if (!alphaMaskTest(stats, v->reg[fbzMode].u, color.get_a())) + if (!alphaMaskTest(stats, vd->reg[fbzMode].u, color.get_a())) goto nextpixel; /* handle alpha test */ - if (!alphaTest(v, stats, v->reg[alphaMode].u, color.get_a())) + if (!alphaTest(vd, stats, vd->reg[alphaMode].u, color.get_a())) goto nextpixel; /* wait for any outstanding work to finish */ - poly_wait(v->poly, "LFB Write"); + poly_wait(vd->poly, "LFB Write"); /* pixel pipeline part 2 handles color combine, fog, alpha, and final output */ - PIXEL_PIPELINE_END(v, stats, dither, dither4, dither_lookup, x, dest, depth, - v->reg[fbzMode].u, v->reg[fbzColorPath].u, v->reg[alphaMode].u, v->reg[fogMode].u, + PIXEL_PIPELINE_END(vd, stats, dither, dither4, dither_lookup, x, dest, depth, + vd->reg[fbzMode].u, vd->reg[fbzColorPath].u, vd->reg[alphaMode].u, vd->reg[fogMode].u, iterz, iterw, iterargb) {}; nextpixel: /* advance our pointers */ @@ -3414,24 +3353,24 @@ nextpixel: * *************************************/ -static INT32 texture_w(voodoo_state *v, offs_t offset, UINT32 data) +INT32 voodoo_device::texture_w(voodoo_device *vd, offs_t offset, UINT32 data) { int tmunum = (offset >> 19) & 0x03; tmu_state *t; /* statistics */ - v->stats.tex_writes++; + vd->stats.tex_writes++; /* point to the right TMU */ - if (!(v->chipmask & (2 << tmunum))) + if (!(vd->chipmask & (2 << tmunum))) return 0; - t = &v->tmu[tmunum]; + t = &vd->tmu[tmunum]; if (TEXLOD_TDIRECT_WRITE(t->reg[tLOD].u)) fatalerror("Texture direct write!\n"); /* wait for any outstanding work to finish */ - poly_wait(v->poly, "Texture write"); + poly_wait(vd->poly, "Texture write"); /* update texture info if dirty */ if (t->regdirty) @@ -3451,13 +3390,13 @@ static INT32 texture_w(voodoo_state *v, offs_t offset, UINT32 data) UINT8 *dest; /* extract info */ - if (v->type <= TYPE_VOODOO_2) + if (vd->vd_type <= TYPE_VOODOO_2) { lod = (offset >> 15) & 0x0f; tt = (offset >> 7) & 0xff; /* old code has a bit about how this is broken in gauntleg unless we always look at TMU0 */ - if (TEXMODE_SEQ_8_DOWNLD(v->tmu[0].reg/*t->reg*/[textureMode].u)) + if (TEXMODE_SEQ_8_DOWNLD(vd->tmu[0].reg/*t->reg*/[textureMode].u)) ts = (offset << 2) & 0xfc; else ts = (offset << 1) & 0xfc; @@ -3470,13 +3409,13 @@ static INT32 texture_w(voodoo_state *v, offs_t offset, UINT32 data) tbaseaddr = t->lodoffset[lod]; tbaseaddr += tt * ((t->wmask >> lod) + 1) + ts; - if (LOG_TEXTURE_RAM) v->device->logerror("Texture 8-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data); + if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 8-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data); } else { tbaseaddr = t->lodoffset[0] + offset*4; - if (LOG_TEXTURE_RAM) v->device->logerror("Texture 8-bit w: offset=%X data=%08X\n", offset*4, data); + if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 8-bit w: offset=%X data=%08X\n", offset*4, data); } /* write the four bytes in little-endian order */ @@ -3496,7 +3435,7 @@ static INT32 texture_w(voodoo_state *v, offs_t offset, UINT32 data) UINT16 *dest; /* extract info */ - if (v->type <= TYPE_VOODOO_2) + if (vd->vd_type <= TYPE_VOODOO_2) { lod = (offset >> 15) & 0x0f; tt = (offset >> 7) & 0xff; @@ -3510,13 +3449,13 @@ static INT32 texture_w(voodoo_state *v, offs_t offset, UINT32 data) tbaseaddr = t->lodoffset[lod]; tbaseaddr += 2 * (tt * ((t->wmask >> lod) + 1) + ts); - if (LOG_TEXTURE_RAM) v->device->logerror("Texture 16-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data); + if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 16-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data); } else { tbaseaddr = t->lodoffset[0] + offset*4; - if (LOG_TEXTURE_RAM) v->device->logerror("Texture 16-bit w: offset=%X data=%08X\n", offset*4, data); + if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 16-bit w: offset=%X data=%08X\n", offset*4, data); } /* write the two words in little-endian order */ @@ -3538,7 +3477,7 @@ static INT32 texture_w(voodoo_state *v, offs_t offset, UINT32 data) * *************************************/ -static void flush_fifos(voodoo_state *v, attotime current_time) +void voodoo_device::flush_fifos(voodoo_device *vd, attotime current_time) { static UINT8 in_flush; @@ -3547,14 +3486,14 @@ static void flush_fifos(voodoo_state *v, attotime current_time) return; in_flush = TRUE; - if (!v->pci.op_pending) fatalerror("flush_fifos called with no pending operation\n"); + if (!vd->pci.op_pending) fatalerror("flush_fifos called with no pending operation\n"); - if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos start -- pending=%d.%08X%08X cur=%d.%08X%08X\n", v->index, - v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds(), + if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos start -- pending=%d.%08X%08X cur=%d.%08X%08X\n", vd->index, + vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds(), current_time.seconds(), (UINT32)(current_time.attoseconds() >> 32), (UINT32)current_time.attoseconds()); /* loop while we still have cycles to burn */ - while (v->pci.op_end_time <= current_time) + while (vd->pci.op_end_time <= current_time) { INT32 extra_cycles = 0; INT32 cycles; @@ -3567,27 +3506,27 @@ static void flush_fifos(voodoo_state *v, attotime current_time) UINT32 data; /* we might be in CMDFIFO mode */ - if (v->fbi.cmdfifo[0].enable) + if (vd->fbi.cmdfifo[0].enable) { /* if we don't have anything to execute, we're done for now */ - cycles = cmdfifo_execute_if_ready(v, &v->fbi.cmdfifo[0]); + cycles = cmdfifo_execute_if_ready(vd, &vd->fbi.cmdfifo[0]); if (cycles == -1) { - v->pci.op_pending = FALSE; + vd->pci.op_pending = FALSE; in_flush = FALSE; - if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", v->index); + if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", vd->index); return; } } - else if (v->fbi.cmdfifo[1].enable) + else if (vd->fbi.cmdfifo[1].enable) { /* if we don't have anything to execute, we're done for now */ - cycles = cmdfifo_execute_if_ready(v, &v->fbi.cmdfifo[1]); + cycles = cmdfifo_execute_if_ready(vd, &vd->fbi.cmdfifo[1]); if (cycles == -1) { - v->pci.op_pending = FALSE; + vd->pci.op_pending = FALSE; in_flush = FALSE; - if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", v->index); + if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", vd->index); return; } } @@ -3596,15 +3535,15 @@ static void flush_fifos(voodoo_state *v, attotime current_time) else { /* choose which FIFO to read from */ - if (!fifo_empty(&v->fbi.fifo)) - fifo = &v->fbi.fifo; - else if (!fifo_empty(&v->pci.fifo)) - fifo = &v->pci.fifo; + if (!fifo_empty(&vd->fbi.fifo)) + fifo = &vd->fbi.fifo; + else if (!fifo_empty(&vd->pci.fifo)) + fifo = &vd->pci.fifo; else { - v->pci.op_pending = FALSE; + vd->pci.op_pending = FALSE; in_flush = FALSE; - if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- FIFOs empty\n", v->index); + if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- FIFOs empty\n", vd->index); return; } @@ -3614,9 +3553,9 @@ static void flush_fifos(voodoo_state *v, attotime current_time) /* target the appropriate location */ if ((address & (0xc00000/4)) == 0) - cycles = register_w(v, address, data); + cycles = register_w(vd, address, data); else if (address & (0x800000/4)) - cycles = texture_w(v, address, data); + cycles = texture_w(vd, address, data); else { UINT32 mem_mask = 0xffffffff; @@ -3628,7 +3567,7 @@ static void flush_fifos(voodoo_state *v, attotime current_time) mem_mask &= 0xffff0000; address &= 0xffffff; - cycles = lfb_w(v, address, data, mem_mask); + cycles = lfb_w(vd, address, data, mem_mask); } } @@ -3645,15 +3584,15 @@ static void flush_fifos(voodoo_state *v, attotime current_time) cycles += extra_cycles; /* account for those cycles */ - v->pci.op_end_time += attotime(0, (attoseconds_t)cycles * v->attoseconds_per_cycle); + vd->pci.op_end_time += attotime(0, (attoseconds_t)cycles * vd->attoseconds_per_cycle); - if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:update -- pending=%d.%08X%08X cur=%d.%08X%08X\n", v->index, - v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds(), + if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:update -- pending=%d.%08X%08X cur=%d.%08X%08X\n", vd->index, + vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds(), current_time.seconds(), (UINT32)(current_time.attoseconds() >> 32), (UINT32)current_time.attoseconds()); } - if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- pending command complete at %d.%08X%08X\n", v->index, - v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds()); + if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- pending command complete at %d.%08X%08X\n", vd->index, + vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds()); in_flush = FALSE; } @@ -3669,18 +3608,17 @@ static void flush_fifos(voodoo_state *v, attotime current_time) WRITE32_MEMBER( voodoo_device::voodoo_w ) { - voodoo_state *v = get_safe_token(this); int stall = FALSE; g_profiler.start(PROFILER_USER1); /* should not be getting accesses while stalled */ - if (v->pci.stall_state != NOT_STALLED) + if (pci.stall_state != NOT_STALLED) logerror("voodoo_w while stalled!\n"); /* if we have something pending, flush the FIFOs up to the current time */ - if (v->pci.op_pending) - flush_fifos(v, machine().time()); + if (pci.op_pending) + flush_fifos(this, machine().time()); /* special handling for registers */ if ((offset & 0xc00000/4) == 0) @@ -3688,10 +3626,10 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) UINT8 access; /* some special stuff for Voodoo 2 */ - if (v->type >= TYPE_VOODOO_2) + if (vd_type >= TYPE_VOODOO_2) { /* we might be in CMDFIFO mode */ - if (FBIINIT7_CMDFIFO_ENABLE(v->reg[fbiInit7].u)) + if (FBIINIT7_CMDFIFO_ENABLE(reg[fbiInit7].u)) { /* if bit 21 is set, we're writing to the FIFO */ if (offset & 0x200000/4) @@ -3699,20 +3637,20 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) /* check for byte swizzling (bit 18) */ if (offset & 0x40000/4) data = FLIPENDIAN_INT32(data); - cmdfifo_w(v, &v->fbi.cmdfifo[0], offset & 0xffff, data); + cmdfifo_w(this, &fbi.cmdfifo[0], offset & 0xffff, data); g_profiler.stop(); return; } /* we're a register access; but only certain ones are allowed */ - access = v->regaccess[offset & 0xff]; + access = regaccess[offset & 0xff]; if (!(access & REGISTER_WRITETHRU)) { /* track swap buffers regardless */ if ((offset & 0xff) == swapbufferCMD) - v->fbi.swaps_pending++; + fbi.swaps_pending++; - logerror("Ignoring write to %s in CMDFIFO mode\n", v->regnames[offset & 0xff]); + logerror("Ignoring write to %s in CMDFIFO mode\n", regnames[offset & 0xff]); g_profiler.stop(); return; } @@ -3725,7 +3663,7 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) /* check the access behavior; note that the table works even if the */ /* alternate mapping is used */ - access = v->regaccess[offset & 0xff]; + access = regaccess[offset & 0xff]; /* ignore if writes aren't allowed */ if (!(access & REGISTER_WRITE)) @@ -3740,31 +3678,31 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) /* track swap buffers */ if ((offset & 0xff) == swapbufferCMD) - v->fbi.swaps_pending++; + fbi.swaps_pending++; } /* if we don't have anything pending, or if FIFOs are disabled, just execute */ - if (!v->pci.op_pending || !INITEN_ENABLE_PCI_FIFO(v->pci.init_enable)) + if (!pci.op_pending || !INITEN_ENABLE_PCI_FIFO(pci.init_enable)) { int cycles; /* target the appropriate location */ if ((offset & (0xc00000/4)) == 0) - cycles = register_w(v, offset, data); + cycles = register_w(this, offset, data); else if (offset & (0x800000/4)) - cycles = texture_w(v, offset, data); + cycles = texture_w(this, offset, data); else - cycles = lfb_w(v, offset, data, mem_mask); + cycles = lfb_w(this, offset, data, mem_mask); /* if we ended up with cycles, mark the operation pending */ if (cycles) { - v->pci.op_pending = TRUE; - v->pci.op_end_time = machine().time() + attotime(0, (attoseconds_t)cycles * v->attoseconds_per_cycle); + pci.op_pending = TRUE; + pci.op_end_time = machine().time() + attotime(0, (attoseconds_t)cycles * attoseconds_per_cycle); - if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", v->index, + if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", index, machine().time().seconds(), (UINT32)(machine().time().attoseconds() >> 32), (UINT32)machine().time().attoseconds(), - v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds()); + pci.op_end_time.seconds(), (UINT32)(pci.op_end_time.attoseconds() >> 32), (UINT32)pci.op_end_time.attoseconds()); } g_profiler.stop(); return; @@ -3780,56 +3718,56 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) } /* if there's room in the PCI FIFO, add there */ - if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w adding to PCI FIFO @ %08X=%08X\n", v->index, offset, data); - if (!fifo_full(&v->pci.fifo)) + if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w adding to PCI FIFO @ %08X=%08X\n", this, offset, data); + if (!fifo_full(&pci.fifo)) { - fifo_add(&v->pci.fifo, offset); - fifo_add(&v->pci.fifo, data); + fifo_add(&pci.fifo, offset); + fifo_add(&pci.fifo, data); } else fatalerror("PCI FIFO full\n"); /* handle flushing to the memory FIFO */ - if (FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u) && - fifo_space(&v->pci.fifo) <= 2 * FBIINIT4_MEMORY_FIFO_LWM(v->reg[fbiInit4].u)) + if (FBIINIT0_ENABLE_MEMORY_FIFO(reg[fbiInit0].u) && + fifo_space(&pci.fifo) <= 2 * FBIINIT4_MEMORY_FIFO_LWM(reg[fbiInit4].u)) { UINT8 valid[4]; /* determine which types of data can go to the memory FIFO */ valid[0] = TRUE; - valid[1] = FBIINIT0_LFB_TO_MEMORY_FIFO(v->reg[fbiInit0].u); - valid[2] = valid[3] = FBIINIT0_TEXMEM_TO_MEMORY_FIFO(v->reg[fbiInit0].u); + valid[1] = FBIINIT0_LFB_TO_MEMORY_FIFO(reg[fbiInit0].u); + valid[2] = valid[3] = FBIINIT0_TEXMEM_TO_MEMORY_FIFO(reg[fbiInit0].u); /* flush everything we can */ - if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w moving PCI FIFO to memory FIFO\n", v->index); - while (!fifo_empty(&v->pci.fifo) && valid[(fifo_peek(&v->pci.fifo) >> 22) & 3]) + if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w moving PCI FIFO to memory FIFO\n", index); + while (!fifo_empty(&pci.fifo) && valid[(fifo_peek(&pci.fifo) >> 22) & 3]) { - fifo_add(&v->fbi.fifo, fifo_remove(&v->pci.fifo)); - fifo_add(&v->fbi.fifo, fifo_remove(&v->pci.fifo)); + fifo_add(&fbi.fifo, fifo_remove(&pci.fifo)); + fifo_add(&fbi.fifo, fifo_remove(&pci.fifo)); } /* if we're above the HWM as a result, stall */ - if (FBIINIT0_STALL_PCIE_FOR_HWM(v->reg[fbiInit0].u) && - fifo_items(&v->fbi.fifo) >= 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(v->reg[fbiInit0].u)) + if (FBIINIT0_STALL_PCIE_FOR_HWM(reg[fbiInit0].u) && + fifo_items(&fbi.fifo) >= 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(reg[fbiInit0].u)) { - if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit memory FIFO HWM -- stalling\n", v->index); - stall_cpu(v, STALLED_UNTIL_FIFO_LWM, machine().time()); + if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit memory FIFO HWM -- stalling\n", index); + stall_cpu(this, STALLED_UNTIL_FIFO_LWM, machine().time()); } } /* if we're at the LWM for the PCI FIFO, stall */ - if (FBIINIT0_STALL_PCIE_FOR_HWM(v->reg[fbiInit0].u) && - fifo_space(&v->pci.fifo) <= 2 * FBIINIT0_PCI_FIFO_LWM(v->reg[fbiInit0].u)) + if (FBIINIT0_STALL_PCIE_FOR_HWM(reg[fbiInit0].u) && + fifo_space(&pci.fifo) <= 2 * FBIINIT0_PCI_FIFO_LWM(reg[fbiInit0].u)) { - if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit PCI FIFO free LWM -- stalling\n", v->index); - stall_cpu(v, STALLED_UNTIL_FIFO_LWM, machine().time()); + if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit PCI FIFO free LWM -- stalling\n", index); + stall_cpu(this, STALLED_UNTIL_FIFO_LWM, machine().time()); } /* if we weren't ready, and this is a non-FIFO access, stall until the FIFOs are clear */ if (stall) { - if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w wrote non-FIFO register -- stalling until clear\n", v->index); - stall_cpu(v, STALLED_UNTIL_FIFO_EMPTY, machine().time()); + if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w wrote non-FIFO register -- stalling until clear\n", index); + stall_cpu(this, STALLED_UNTIL_FIFO_EMPTY, machine().time()); } g_profiler.stop(); @@ -3843,70 +3781,71 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) * *************************************/ -static UINT32 register_r(voodoo_state *v, offs_t offset) +static UINT32 register_r(voodoo_device *vd, offs_t offset) { + int regnum = offset & 0xff; UINT32 result; /* statistics */ - v->stats.reg_reads++; + vd->stats.reg_reads++; /* first make sure this register is readable */ - if (!(v->regaccess[regnum] & REGISTER_READ)) + if (!(vd->regaccess[regnum] & REGISTER_READ)) { - v->device->logerror("VOODOO.%d.ERROR:Invalid attempt to read %s\n", v->index, regnum < 225 ? v->regnames[regnum] : "unknown register"); + vd->device->logerror("VOODOO.%d.ERROR:Invalid attempt to read %s\n", vd->index, regnum < 225 ? vd->regnames[regnum] : "unknown register"); return 0xffffffff; } /* default result is the FBI register value */ - result = v->reg[regnum].u; + result = vd->reg[regnum].u; /* some registers are dynamic; compute them */ switch (regnum) { - case status: + case vdstatus: /* start with a blank slate */ result = 0; /* bits 5:0 are the PCI FIFO free space */ - if (fifo_empty(&v->pci.fifo)) + if (fifo_empty(&vd->pci.fifo)) result |= 0x3f << 0; else { - int temp = fifo_space(&v->pci.fifo)/2; + int temp = fifo_space(&vd->pci.fifo)/2; if (temp > 0x3f) temp = 0x3f; result |= temp << 0; } /* bit 6 is the vertical retrace */ - result |= v->fbi.vblank << 6; + result |= vd->fbi.vblank << 6; /* bit 7 is FBI graphics engine busy */ - if (v->pci.op_pending) + if (vd->pci.op_pending) result |= 1 << 7; /* bit 8 is TREX busy */ - if (v->pci.op_pending) + if (vd->pci.op_pending) result |= 1 << 8; /* bit 9 is overall busy */ - if (v->pci.op_pending) + if (vd->pci.op_pending) result |= 1 << 9; /* Banshee is different starting here */ - if (v->type < TYPE_VOODOO_BANSHEE) + if (vd->vd_type < TYPE_VOODOO_BANSHEE) { /* bits 11:10 specifies which buffer is visible */ - result |= v->fbi.frontbuf << 10; + result |= vd->fbi.frontbuf << 10; /* bits 27:12 indicate memory FIFO freespace */ - if (!FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u) || fifo_empty(&v->fbi.fifo)) + if (!FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u) || fifo_empty(&vd->fbi.fifo)) result |= 0xffff << 12; else { - int temp = fifo_space(&v->fbi.fifo)/2; + int temp = fifo_space(&vd->fbi.fifo)/2; if (temp > 0xffff) temp = 0xffff; result |= temp << 12; @@ -3917,38 +3856,38 @@ static UINT32 register_r(voodoo_state *v, offs_t offset) /* bit 10 is 2D busy */ /* bit 11 is cmd FIFO 0 busy */ - if (v->fbi.cmdfifo[0].enable && v->fbi.cmdfifo[0].depth > 0) + if (vd->fbi.cmdfifo[0].enable && vd->fbi.cmdfifo[0].depth > 0) result |= 1 << 11; /* bit 12 is cmd FIFO 1 busy */ - if (v->fbi.cmdfifo[1].enable && v->fbi.cmdfifo[1].depth > 0) + if (vd->fbi.cmdfifo[1].enable && vd->fbi.cmdfifo[1].depth > 0) result |= 1 << 12; } /* bits 30:28 are the number of pending swaps */ - if (v->fbi.swaps_pending > 7) + if (vd->fbi.swaps_pending > 7) result |= 7 << 28; else - result |= v->fbi.swaps_pending << 28; + result |= vd->fbi.swaps_pending << 28; /* bit 31 is not used */ /* eat some cycles since people like polling here */ - if (EAT_CYCLES) v->cpu->execute().eat_cycles(1000); + if (EAT_CYCLES) vd->cpu->execute().eat_cycles(1000); break; /* bit 2 of the initEnable register maps this to dacRead */ case fbiInit2: - if (INITEN_REMAP_INIT_TO_DAC(v->pci.init_enable)) - result = v->dac.read_result; + if (INITEN_REMAP_INIT_TO_DAC(vd->pci.init_enable)) + result = vd->dac.read_result; break; /* return the current scanline for now */ case vRetrace: /* eat some cycles since people like polling here */ - if (EAT_CYCLES) v->cpu->execute().eat_cycles(10); - result = v->screen->vpos(); + if (EAT_CYCLES) vd->cpu->execute().eat_cycles(10); + result = vd->screen->vpos(); break; /* reserved area in the TMU read by the Vegas startup sequence */ @@ -3959,26 +3898,26 @@ static UINT32 register_r(voodoo_state *v, offs_t offset) /* cmdFifo -- Voodoo2 only */ case cmdFifoRdPtr: - result = v->fbi.cmdfifo[0].rdptr; + result = vd->fbi.cmdfifo[0].rdptr; /* eat some cycles since people like polling here */ - if (EAT_CYCLES) v->cpu->execute().eat_cycles(1000); + if (EAT_CYCLES) vd->cpu->execute().eat_cycles(1000); break; case cmdFifoAMin: - result = v->fbi.cmdfifo[0].amin; + result = vd->fbi.cmdfifo[0].amin; break; case cmdFifoAMax: - result = v->fbi.cmdfifo[0].amax; + result = vd->fbi.cmdfifo[0].amax; break; case cmdFifoDepth: - result = v->fbi.cmdfifo[0].depth; + result = vd->fbi.cmdfifo[0].depth; break; case cmdFifoHoles: - result = v->fbi.cmdfifo[0].holes; + result = vd->fbi.cmdfifo[0].holes; break; /* all counters are 24-bit only */ @@ -3987,9 +3926,9 @@ static UINT32 register_r(voodoo_state *v, offs_t offset) case fbiZfuncFail: case fbiAfuncFail: case fbiPixelsOut: - update_statistics(v, TRUE); + update_statistics(vd, TRUE); case fbiTrianglesOut: - result = v->reg[regnum].u & 0xffffff; + result = vd->reg[regnum].u & 0xffffff; break; } @@ -3998,19 +3937,19 @@ static UINT32 register_r(voodoo_state *v, offs_t offset) int logit = TRUE; /* don't log multiple identical status reads from the same address */ - if (regnum == status) + if (regnum == vdstatus) { - offs_t pc = v->cpu->safe_pc(); - if (pc == v->last_status_pc && result == v->last_status_value) + offs_t pc = vd->cpu->safe_pc(); + if (pc == vd->last_status_pc && result == vd->last_status_value) logit = FALSE; - v->last_status_pc = pc; - v->last_status_value = result; + vd->last_status_pc = pc; + vd->last_status_value = result; } if (regnum == cmdFifoRdPtr) logit = FALSE; if (logit) - v->device->logerror("VOODOO.%d.REG:%s read = %08X\n", v->index, v->regnames[regnum], result); + vd->device->logerror("VOODOO.%d.REG:%s read = %08X\n", vd->index, vd->regnames[regnum], result); } return result; @@ -4024,7 +3963,7 @@ static UINT32 register_r(voodoo_state *v, offs_t offset) * *************************************/ -static UINT32 lfb_r(voodoo_state *v, offs_t offset, bool lfb_3d) +static UINT32 lfb_r(voodoo_device *vd, offs_t offset, bool lfb_3d) { UINT16 *buffer; UINT32 bufmax; @@ -4033,34 +3972,34 @@ static UINT32 lfb_r(voodoo_state *v, offs_t offset, bool lfb_3d) int x, y, scry, destbuf; /* statistics */ - v->stats.lfb_reads++; + vd->stats.lfb_reads++; /* compute X,Y */ offset <<= 1; - x = offset & ((1 << v->fbi.lfb_stride) - 1); - y = (offset >> v->fbi.lfb_stride); + x = offset & ((1 << vd->fbi.lfb_stride) - 1); + y = (offset >> vd->fbi.lfb_stride); /* select the target buffer */ if (lfb_3d) { y &= 0x3ff; - destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_READ_BUFFER_SELECT(v->reg[lfbMode].u); + destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_READ_BUFFER_SELECT(vd->reg[lfbMode].u); switch (destbuf) { case 0: /* front buffer */ - buffer = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]); - bufmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.frontbuf]) / 2; + buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]); + bufmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.frontbuf]) / 2; break; case 1: /* back buffer */ - buffer = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]); - bufmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.backbuf]) / 2; + buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]); + bufmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.backbuf]) / 2; break; case 2: /* aux buffer */ - if (v->fbi.auxoffs == ~0) + if (vd->fbi.auxoffs == ~0) return 0xffffffff; - buffer = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs); - bufmax = (v->fbi.mask + 1 - v->fbi.auxoffs) / 2; + buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs); + bufmax = (vd->fbi.mask + 1 - vd->fbi.auxoffs) / 2; break; default: /* reserved */ @@ -4069,37 +4008,37 @@ static UINT32 lfb_r(voodoo_state *v, offs_t offset, bool lfb_3d) /* determine the screen Y */ scry = y; - if (LFBMODE_Y_ORIGIN(v->reg[lfbMode].u)) - scry = (v->fbi.yorigin - y) & 0x3ff; + if (LFBMODE_Y_ORIGIN(vd->reg[lfbMode].u)) + scry = (vd->fbi.yorigin - y) & 0x3ff; } else { // Direct lfb access - buffer = (UINT16 *)(v->fbi.ram + v->fbi.lfb_base*4); - bufmax = (v->fbi.mask + 1 - v->fbi.lfb_base*4) / 2; + buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.lfb_base*4); + bufmax = (vd->fbi.mask + 1 - vd->fbi.lfb_base*4) / 2; scry = y; } /* advance pointers to the proper row */ - bufoffs = scry * v->fbi.rowpixels + x; + bufoffs = scry * vd->fbi.rowpixels + x; if (bufoffs >= bufmax) { - v->device->logerror("LFB_R: Buffer offset out of bounds x=%i y=%i lfb_3d=%i offset=%08X bufoffs=%08X\n", x, y, lfb_3d, offset, (UINT32) bufoffs); + vd->device->logerror("LFB_R: Buffer offset out of bounds x=%i y=%i lfb_3d=%i offset=%08X bufoffs=%08X\n", x, y, lfb_3d, offset, (UINT32) bufoffs); return 0xffffffff; } /* wait for any outstanding work to finish */ - poly_wait(v->poly, "LFB read"); + poly_wait(vd->poly, "LFB read"); /* compute the data */ data = buffer[bufoffs + 0] | (buffer[bufoffs + 1] << 16); /* word swapping */ - if (LFBMODE_WORD_SWAP_READS(v->reg[lfbMode].u)) + if (LFBMODE_WORD_SWAP_READS(vd->reg[lfbMode].u)) data = (data << 16) | (data >> 16); /* byte swizzling */ - if (LFBMODE_BYTE_SWIZZLE_READS(v->reg[lfbMode].u)) + if (LFBMODE_BYTE_SWIZZLE_READS(vd->reg[lfbMode].u)) data = FLIPENDIAN_INT32(data); - if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:read (%d,%d) = %08X\n", v->index, x, y, data); + if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:read (%d,%d) = %08X\n", vd->index, x, y, data); return data; } @@ -4114,17 +4053,16 @@ static UINT32 lfb_r(voodoo_state *v, offs_t offset, bool lfb_3d) READ32_MEMBER( voodoo_device::voodoo_r ) { - voodoo_state *v = get_safe_token(this); /* if we have something pending, flush the FIFOs up to the current time */ - if (v->pci.op_pending) - flush_fifos(v, machine().time()); + if (pci.op_pending) + flush_fifos(this, machine().time()); /* target the appropriate location */ if (!(offset & (0xc00000/4))) - return register_r(v, offset); + return register_r(this, offset); else if (!(offset & (0x800000/4))) - return lfb_r(v, offset, true); + return lfb_r(this, offset, true); return 0xffffffff; } @@ -4140,7 +4078,6 @@ READ32_MEMBER( voodoo_device::voodoo_r ) READ32_MEMBER( voodoo_banshee_device::banshee_agp_r ) { - voodoo_state *v = get_safe_token(this); UINT32 result; offset &= 0x1ff/4; @@ -4149,64 +4086,63 @@ READ32_MEMBER( voodoo_banshee_device::banshee_agp_r ) switch (offset) { case cmdRdPtrL0: - result = v->fbi.cmdfifo[0].rdptr; + result = fbi.cmdfifo[0].rdptr; break; case cmdAMin0: - result = v->fbi.cmdfifo[0].amin; + result = fbi.cmdfifo[0].amin; break; case cmdAMax0: - result = v->fbi.cmdfifo[0].amax; + result = fbi.cmdfifo[0].amax; break; case cmdFifoDepth0: - result = v->fbi.cmdfifo[0].depth; + result = fbi.cmdfifo[0].depth; break; case cmdHoleCnt0: - result = v->fbi.cmdfifo[0].holes; + result = fbi.cmdfifo[0].holes; break; case cmdRdPtrL1: - result = v->fbi.cmdfifo[1].rdptr; + result = fbi.cmdfifo[1].rdptr; break; case cmdAMin1: - result = v->fbi.cmdfifo[1].amin; + result = fbi.cmdfifo[1].amin; break; case cmdAMax1: - result = v->fbi.cmdfifo[1].amax; + result = fbi.cmdfifo[1].amax; break; case cmdFifoDepth1: - result = v->fbi.cmdfifo[1].depth; + result = fbi.cmdfifo[1].depth; break; case cmdHoleCnt1: - result = v->fbi.cmdfifo[1].holes; + result = fbi.cmdfifo[1].holes; break; default: - result = v->banshee.agp[offset]; + result = banshee.agp[offset]; break; } if (LOG_REGISTERS) - logerror("%s:banshee_r(AGP:%s)\n", v->device->machine().describe_context(), banshee_agp_reg_name[offset]); + logerror("%s:banshee_r(AGP:%s)\n", device->machine().describe_context(), banshee_agp_reg_name[offset]); return result; } READ32_MEMBER( voodoo_banshee_device::banshee_r ) { - voodoo_state *v = get_safe_token(this); UINT32 result = 0xffffffff; /* if we have something pending, flush the FIFOs up to the current time */ - if (v->pci.op_pending) - flush_fifos(v, machine().time()); + if (pci.op_pending) + flush_fifos(this, machine().time()); if (offset < 0x80000/4) result = banshee_io_r(space, offset, mem_mask); @@ -4215,7 +4151,7 @@ READ32_MEMBER( voodoo_banshee_device::banshee_r ) else if (offset < 0x200000/4) logerror("%s:banshee_r(2D:%X)\n", machine().describe_context(), (offset*4) & 0xfffff); else if (offset < 0x600000/4) - result = register_r(v, offset & 0x1fffff/4); + result = register_r(this, offset & 0x1fffff/4); else if (offset < 0x800000/4) logerror("%s:banshee_r(TEX0:%X)\n", machine().describe_context(), (offset*4) & 0x1fffff); else if (offset < 0xa00000/4) @@ -4226,7 +4162,7 @@ READ32_MEMBER( voodoo_banshee_device::banshee_r ) logerror("%s:banshee_r(YUV:%X)\n", machine().describe_context(), (offset*4) & 0x3fffff); else if (offset < 0x2000000/4) { - result = lfb_r(v, offset & 0xffffff/4, true); + result = lfb_r(this, offset & 0xffffff/4, true); } else { logerror("%s:banshee_r(%X) Access out of bounds\n", machine().describe_context(), offset*4); } @@ -4236,27 +4172,26 @@ READ32_MEMBER( voodoo_banshee_device::banshee_r ) READ32_MEMBER( voodoo_banshee_device::banshee_fb_r ) { - voodoo_state *v = get_safe_token(this); UINT32 result = 0xffffffff; /* if we have something pending, flush the FIFOs up to the current time */ - if (v->pci.op_pending) - flush_fifos(v, machine().time()); + if (pci.op_pending) + flush_fifos(this, machine().time()); - if (offset < v->fbi.lfb_base) + if (offset < fbi.lfb_base) { #if LOG_LFB logerror("%s:banshee_fb_r(%X)\n", machine().describe_context(), offset*4); #endif - if (offset*4 <= v->fbi.mask) - result = ((UINT32 *)v->fbi.ram)[offset]; + if (offset*4 <= fbi.mask) + result = ((UINT32 *)fbi.ram)[offset]; else logerror("%s:banshee_fb_r(%X) Access out of bounds\n", machine().describe_context(), offset*4); } else { if (LOG_LFB) - logerror("%s:banshee_fb_r(%X) to lfb_r: %08X lfb_base=%08X\n", machine().describe_context(), offset*4, offset - v->fbi.lfb_base, v->fbi.lfb_base); - result = lfb_r(v, offset - v->fbi.lfb_base, false); + logerror("%s:banshee_fb_r(%X) to lfb_r: %08X lfb_base=%08X\n", machine().describe_context(), offset*4, offset - fbi.lfb_base, fbi.lfb_base); + result = lfb_r(this, offset - fbi.lfb_base, false); } return result; } @@ -4264,7 +4199,6 @@ READ32_MEMBER( voodoo_banshee_device::banshee_fb_r ) READ8_MEMBER( voodoo_banshee_device::banshee_vga_r ) { - voodoo_state *v = get_safe_token(this); UINT8 result = 0xff; offset &= 0x1f; @@ -4274,10 +4208,10 @@ READ8_MEMBER( voodoo_banshee_device::banshee_vga_r ) { /* attribute access */ case 0x3c0: - if (v->banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(v->banshee.att)) - result = v->banshee.att[v->banshee.vga[0x3c1 & 0x1f]]; + if (banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(banshee.att)) + result = banshee.att[banshee.vga[0x3c1 & 0x1f]]; if (LOG_REGISTERS) - logerror("%s:banshee_att_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3c1 & 0x1f]); + logerror("%s:banshee_att_r(%X)\n", machine().describe_context(), banshee.vga[0x3c1 & 0x1f]); break; /* Input status 0 */ @@ -4295,41 +4229,41 @@ READ8_MEMBER( voodoo_banshee_device::banshee_vga_r ) /* Sequencer access */ case 0x3c5: - if (v->banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(v->banshee.seq)) - result = v->banshee.seq[v->banshee.vga[0x3c4 & 0x1f]]; + if (banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(banshee.seq)) + result = banshee.seq[banshee.vga[0x3c4 & 0x1f]]; if (LOG_REGISTERS) - logerror("%s:banshee_seq_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3c4 & 0x1f]); + logerror("%s:banshee_seq_r(%X)\n", machine().describe_context(), banshee.vga[0x3c4 & 0x1f]); break; /* Feature control */ case 0x3ca: - result = v->banshee.vga[0x3da & 0x1f]; - v->banshee.attff = 0; + result = banshee.vga[0x3da & 0x1f]; + banshee.attff = 0; if (LOG_REGISTERS) logerror("%s:banshee_vga_r(%X)\n", machine().describe_context(), 0x300+offset); break; /* Miscellaneous output */ case 0x3cc: - result = v->banshee.vga[0x3c2 & 0x1f]; + result = banshee.vga[0x3c2 & 0x1f]; if (LOG_REGISTERS) logerror("%s:banshee_vga_r(%X)\n", machine().describe_context(), 0x300+offset); break; /* Graphics controller access */ case 0x3cf: - if (v->banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(v->banshee.gc)) - result = v->banshee.gc[v->banshee.vga[0x3ce & 0x1f]]; + if (banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(banshee.gc)) + result = banshee.gc[banshee.vga[0x3ce & 0x1f]]; if (LOG_REGISTERS) - logerror("%s:banshee_gc_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3ce & 0x1f]); + logerror("%s:banshee_gc_r(%X)\n", machine().describe_context(), banshee.vga[0x3ce & 0x1f]); break; /* CRTC access */ case 0x3d5: - if (v->banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(v->banshee.crtc)) - result = v->banshee.crtc[v->banshee.vga[0x3d4 & 0x1f]]; + if (banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(banshee.crtc)) + result = banshee.crtc[banshee.vga[0x3d4 & 0x1f]]; if (LOG_REGISTERS) - logerror("%s:banshee_crtc_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3d4 & 0x1f]); + logerror("%s:banshee_crtc_r(%X)\n", machine().describe_context(), banshee.vga[0x3d4 & 0x1f]); break; /* Input status 1 */ @@ -4349,7 +4283,7 @@ READ8_MEMBER( voodoo_banshee_device::banshee_vga_r ) break; default: - result = v->banshee.vga[offset]; + result = banshee.vga[offset]; if (LOG_REGISTERS) logerror("%s:banshee_vga_r(%X)\n", machine().describe_context(), 0x300+offset); break; @@ -4360,7 +4294,6 @@ READ8_MEMBER( voodoo_banshee_device::banshee_vga_r ) READ32_MEMBER( voodoo_banshee_device::banshee_io_r ) { - voodoo_state *v = get_safe_token(this); UINT32 result; offset &= 0xff/4; @@ -4369,13 +4302,13 @@ READ32_MEMBER( voodoo_banshee_device::banshee_io_r ) switch (offset) { case io_status: - result = register_r(v, 0); + result = register_r(this, 0); break; case io_dacData: - result = v->fbi.clut[v->banshee.io[io_dacAddr] & 0x1ff] = v->banshee.io[offset]; + result = fbi.clut[banshee.io[io_dacAddr] & 0x1ff] = banshee.io[offset]; if (LOG_REGISTERS) - logerror("%s:banshee_dac_r(%X)\n", machine().describe_context(), v->banshee.io[io_dacAddr] & 0x1ff); + logerror("%s:banshee_dac_r(%X)\n", machine().describe_context(), banshee.io[io_dacAddr] & 0x1ff); break; case io_vgab0: case io_vgab4: case io_vgab8: case io_vgabc: @@ -4393,7 +4326,7 @@ READ32_MEMBER( voodoo_banshee_device::banshee_io_r ) break; default: - result = v->banshee.io[offset]; + result = banshee.io[offset]; if (LOG_REGISTERS) logerror("%s:banshee_io_r(%s)\n", machine().describe_context(), banshee_io_reg_name[offset]); break; @@ -4409,9 +4342,9 @@ READ32_MEMBER( voodoo_banshee_device::banshee_rom_r ) return 0xffffffff; } -static void blit_2d(voodoo_state *v, UINT32 data) +static void blit_2d(voodoo_device *vd, UINT32 data) { - switch (v->banshee.blt_cmd) + switch (vd->banshee.blt_cmd) { case 0: // NOP - wait for idle { @@ -4434,46 +4367,46 @@ static void blit_2d(voodoo_state *v, UINT32 data) case 3: // Host-to-screen blit { - UINT32 addr = v->banshee.blt_dst_base; + UINT32 addr = vd->banshee.blt_dst_base; - addr += (v->banshee.blt_dst_y * v->banshee.blt_dst_stride) + (v->banshee.blt_dst_x * v->banshee.blt_dst_bpp); + addr += (vd->banshee.blt_dst_y * vd->banshee.blt_dst_stride) + (vd->banshee.blt_dst_x * vd->banshee.blt_dst_bpp); #if LOG_BANSHEE_2D - logerror(" blit_2d:host_to_screen: %08x -> %08x, %d, %d\n", data, addr, v->banshee.blt_dst_x, v->banshee.blt_dst_y); + logerror(" blit_2d:host_to_screen: %08x -> %08x, %d, %d\n", data, addr, vd->banshee.blt_dst_x, vd->banshee.blt_dst_y); #endif - switch (v->banshee.blt_dst_bpp) + switch (vd->banshee.blt_dst_bpp) { case 1: - v->fbi.ram[addr+0] = data & 0xff; - v->fbi.ram[addr+1] = (data >> 8) & 0xff; - v->fbi.ram[addr+2] = (data >> 16) & 0xff; - v->fbi.ram[addr+3] = (data >> 24) & 0xff; - v->banshee.blt_dst_x += 4; + vd->fbi.ram[addr+0] = data & 0xff; + vd->fbi.ram[addr+1] = (data >> 8) & 0xff; + vd->fbi.ram[addr+2] = (data >> 16) & 0xff; + vd->fbi.ram[addr+3] = (data >> 24) & 0xff; + vd->banshee.blt_dst_x += 4; break; case 2: - v->fbi.ram[addr+1] = data & 0xff; - v->fbi.ram[addr+0] = (data >> 8) & 0xff; - v->fbi.ram[addr+3] = (data >> 16) & 0xff; - v->fbi.ram[addr+2] = (data >> 24) & 0xff; - v->banshee.blt_dst_x += 2; + vd->fbi.ram[addr+1] = data & 0xff; + vd->fbi.ram[addr+0] = (data >> 8) & 0xff; + vd->fbi.ram[addr+3] = (data >> 16) & 0xff; + vd->fbi.ram[addr+2] = (data >> 24) & 0xff; + vd->banshee.blt_dst_x += 2; break; case 3: - v->banshee.blt_dst_x += 1; + vd->banshee.blt_dst_x += 1; break; case 4: - v->fbi.ram[addr+3] = data & 0xff; - v->fbi.ram[addr+2] = (data >> 8) & 0xff; - v->fbi.ram[addr+1] = (data >> 16) & 0xff; - v->fbi.ram[addr+0] = (data >> 24) & 0xff; - v->banshee.blt_dst_x += 1; + vd->fbi.ram[addr+3] = data & 0xff; + vd->fbi.ram[addr+2] = (data >> 8) & 0xff; + vd->fbi.ram[addr+1] = (data >> 16) & 0xff; + vd->fbi.ram[addr+0] = (data >> 24) & 0xff; + vd->banshee.blt_dst_x += 1; break; } - if (v->banshee.blt_dst_x >= v->banshee.blt_dst_width) + if (vd->banshee.blt_dst_x >= vd->banshee.blt_dst_width) { - v->banshee.blt_dst_x = 0; - v->banshee.blt_dst_y++; + vd->banshee.blt_dst_x = 0; + vd->banshee.blt_dst_y++; } break; } @@ -4500,12 +4433,12 @@ static void blit_2d(voodoo_state *v, UINT32 data) default: { - fatalerror("blit_2d: unknown command %d\n", v->banshee.blt_cmd); + fatalerror("blit_2d: unknown command %d\n", vd->banshee.blt_cmd); } } } -static INT32 banshee_2d_w(voodoo_state *v, offs_t offset, UINT32 data) +INT32 voodoo_device::banshee_2d_w(voodoo_device *vd, offs_t offset, UINT32 data) { switch (offset) { @@ -4514,152 +4447,152 @@ static INT32 banshee_2d_w(voodoo_state *v, offs_t offset, UINT32 data) logerror(" 2D:command: cmd %d, ROP0 %02X\n", data & 0xf, data >> 24); #endif - v->banshee.blt_src_x = v->banshee.blt_regs[banshee2D_srcXY] & 0xfff; - v->banshee.blt_src_y = (v->banshee.blt_regs[banshee2D_srcXY] >> 16) & 0xfff; - v->banshee.blt_src_base = v->banshee.blt_regs[banshee2D_srcBaseAddr] & 0xffffff; - v->banshee.blt_src_stride = v->banshee.blt_regs[banshee2D_srcFormat] & 0x3fff; - v->banshee.blt_src_width = v->banshee.blt_regs[banshee2D_srcSize] & 0xfff; - v->banshee.blt_src_height = (v->banshee.blt_regs[banshee2D_srcSize] >> 16) & 0xfff; + vd->banshee.blt_src_x = vd->banshee.blt_regs[banshee2D_srcXY] & 0xfff; + vd->banshee.blt_src_y = (vd->banshee.blt_regs[banshee2D_srcXY] >> 16) & 0xfff; + vd->banshee.blt_src_base = vd->banshee.blt_regs[banshee2D_srcBaseAddr] & 0xffffff; + vd->banshee.blt_src_stride = vd->banshee.blt_regs[banshee2D_srcFormat] & 0x3fff; + vd->banshee.blt_src_width = vd->banshee.blt_regs[banshee2D_srcSize] & 0xfff; + vd->banshee.blt_src_height = (vd->banshee.blt_regs[banshee2D_srcSize] >> 16) & 0xfff; - switch ((v->banshee.blt_regs[banshee2D_srcFormat] >> 16) & 0xf) + switch ((vd->banshee.blt_regs[banshee2D_srcFormat] >> 16) & 0xf) { - case 1: v->banshee.blt_src_bpp = 1; break; - case 3: v->banshee.blt_src_bpp = 2; break; - case 4: v->banshee.blt_src_bpp = 3; break; - case 5: v->banshee.blt_src_bpp = 4; break; - case 8: v->banshee.blt_src_bpp = 2; break; - case 9: v->banshee.blt_src_bpp = 2; break; - default: v->banshee.blt_src_bpp = 1; break; + case 1: vd->banshee.blt_src_bpp = 1; break; + case 3: vd->banshee.blt_src_bpp = 2; break; + case 4: vd->banshee.blt_src_bpp = 3; break; + case 5: vd->banshee.blt_src_bpp = 4; break; + case 8: vd->banshee.blt_src_bpp = 2; break; + case 9: vd->banshee.blt_src_bpp = 2; break; + default: vd->banshee.blt_src_bpp = 1; break; } - v->banshee.blt_dst_x = v->banshee.blt_regs[banshee2D_dstXY] & 0xfff; - v->banshee.blt_dst_y = (v->banshee.blt_regs[banshee2D_dstXY] >> 16) & 0xfff; - v->banshee.blt_dst_base = v->banshee.blt_regs[banshee2D_dstBaseAddr] & 0xffffff; - v->banshee.blt_dst_stride = v->banshee.blt_regs[banshee2D_dstFormat] & 0x3fff; - v->banshee.blt_dst_width = v->banshee.blt_regs[banshee2D_dstSize] & 0xfff; - v->banshee.blt_dst_height = (v->banshee.blt_regs[banshee2D_dstSize] >> 16) & 0xfff; + vd->banshee.blt_dst_x = vd->banshee.blt_regs[banshee2D_dstXY] & 0xfff; + vd->banshee.blt_dst_y = (vd->banshee.blt_regs[banshee2D_dstXY] >> 16) & 0xfff; + vd->banshee.blt_dst_base = vd->banshee.blt_regs[banshee2D_dstBaseAddr] & 0xffffff; + vd->banshee.blt_dst_stride = vd->banshee.blt_regs[banshee2D_dstFormat] & 0x3fff; + vd->banshee.blt_dst_width = vd->banshee.blt_regs[banshee2D_dstSize] & 0xfff; + vd->banshee.blt_dst_height = (vd->banshee.blt_regs[banshee2D_dstSize] >> 16) & 0xfff; - switch ((v->banshee.blt_regs[banshee2D_dstFormat] >> 16) & 0x7) + switch ((vd->banshee.blt_regs[banshee2D_dstFormat] >> 16) & 0x7) { - case 1: v->banshee.blt_dst_bpp = 1; break; - case 3: v->banshee.blt_dst_bpp = 2; break; - case 4: v->banshee.blt_dst_bpp = 3; break; - case 5: v->banshee.blt_dst_bpp = 4; break; - default: v->banshee.blt_dst_bpp = 1; break; + case 1: vd->banshee.blt_dst_bpp = 1; break; + case 3: vd->banshee.blt_dst_bpp = 2; break; + case 4: vd->banshee.blt_dst_bpp = 3; break; + case 5: vd->banshee.blt_dst_bpp = 4; break; + default: vd->banshee.blt_dst_bpp = 1; break; } - v->banshee.blt_cmd = data & 0xf; + vd->banshee.blt_cmd = data & 0xf; break; case banshee2D_colorBack: #if LOG_BANSHEE_2D logerror(" 2D:colorBack: %08X\n", data); #endif - v->banshee.blt_regs[banshee2D_colorBack] = data; + vd->banshee.blt_regs[banshee2D_colorBack] = data; break; case banshee2D_colorFore: #if LOG_BANSHEE_2D logerror(" 2D:colorFore: %08X\n", data); #endif - v->banshee.blt_regs[banshee2D_colorFore] = data; + vd->banshee.blt_regs[banshee2D_colorFore] = data; break; case banshee2D_srcBaseAddr: #if LOG_BANSHEE_2D logerror(" 2D:srcBaseAddr: %08X, %s\n", data & 0xffffff, data & 0x80000000 ? "tiled" : "non-tiled"); #endif - v->banshee.blt_regs[banshee2D_srcBaseAddr] = data; + vd->banshee.blt_regs[banshee2D_srcBaseAddr] = data; break; case banshee2D_dstBaseAddr: #if LOG_BANSHEE_2D logerror(" 2D:dstBaseAddr: %08X, %s\n", data & 0xffffff, data & 0x80000000 ? "tiled" : "non-tiled"); #endif - v->banshee.blt_regs[banshee2D_dstBaseAddr] = data; + vd->banshee.blt_regs[banshee2D_dstBaseAddr] = data; break; case banshee2D_srcSize: #if LOG_BANSHEE_2D logerror(" 2D:srcSize: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - v->banshee.blt_regs[banshee2D_srcSize] = data; + vd->banshee.blt_regs[banshee2D_srcSize] = data; break; case banshee2D_dstSize: #if LOG_BANSHEE_2D logerror(" 2D:dstSize: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - v->banshee.blt_regs[banshee2D_dstSize] = data; + vd->banshee.blt_regs[banshee2D_dstSize] = data; break; case banshee2D_srcXY: #if LOG_BANSHEE_2D logerror(" 2D:srcXY: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - v->banshee.blt_regs[banshee2D_srcXY] = data; + vd->banshee.blt_regs[banshee2D_srcXY] = data; break; case banshee2D_dstXY: #if LOG_BANSHEE_2D logerror(" 2D:dstXY: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - v->banshee.blt_regs[banshee2D_dstXY] = data; + vd->banshee.blt_regs[banshee2D_dstXY] = data; break; case banshee2D_srcFormat: #if LOG_BANSHEE_2D logerror(" 2D:srcFormat: str %d, fmt %d, packing %d\n", data & 0x3fff, (data >> 16) & 0xf, (data >> 22) & 0x3); #endif - v->banshee.blt_regs[banshee2D_srcFormat] = data; + vd->banshee.blt_regs[banshee2D_srcFormat] = data; break; case banshee2D_dstFormat: #if LOG_BANSHEE_2D logerror(" 2D:dstFormat: str %d, fmt %d\n", data & 0x3fff, (data >> 16) & 0xf); #endif - v->banshee.blt_regs[banshee2D_dstFormat] = data; + vd->banshee.blt_regs[banshee2D_dstFormat] = data; break; case banshee2D_clip0Min: #if LOG_BANSHEE_2D logerror(" 2D:clip0Min: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - v->banshee.blt_regs[banshee2D_clip0Min] = data; + vd->banshee.blt_regs[banshee2D_clip0Min] = data; break; case banshee2D_clip0Max: #if LOG_BANSHEE_2D logerror(" 2D:clip0Max: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - v->banshee.blt_regs[banshee2D_clip0Max] = data; + vd->banshee.blt_regs[banshee2D_clip0Max] = data; break; case banshee2D_clip1Min: #if LOG_BANSHEE_2D logerror(" 2D:clip1Min: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - v->banshee.blt_regs[banshee2D_clip1Min] = data; + vd->banshee.blt_regs[banshee2D_clip1Min] = data; break; case banshee2D_clip1Max: #if LOG_BANSHEE_2D logerror(" 2D:clip1Max: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - v->banshee.blt_regs[banshee2D_clip1Max] = data; + vd->banshee.blt_regs[banshee2D_clip1Max] = data; break; case banshee2D_rop: #if LOG_BANSHEE_2D logerror(" 2D:rop: %d, %d, %d\n", data & 0xff, (data >> 8) & 0xff, (data >> 16) & 0xff); #endif - v->banshee.blt_regs[banshee2D_rop] = data; + vd->banshee.blt_regs[banshee2D_rop] = data; break; default: if (offset >= 0x20 && offset < 0x40) { - blit_2d(v, data); + blit_2d(vd, data); } else if (offset >= 0x40 && offset < 0x80) { @@ -4677,86 +4610,85 @@ static INT32 banshee_2d_w(voodoo_state *v, offs_t offset, UINT32 data) WRITE32_MEMBER( voodoo_banshee_device::banshee_agp_w ) { - voodoo_state *v = get_safe_token(this); offset &= 0x1ff/4; /* switch off the offset */ switch (offset) { case cmdBaseAddr0: - COMBINE_DATA(&v->banshee.agp[offset]); - v->fbi.cmdfifo[0].base = (data & 0xffffff) << 12; - v->fbi.cmdfifo[0].end = v->fbi.cmdfifo[0].base + (((v->banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12); + COMBINE_DATA(&banshee.agp[offset]); + fbi.cmdfifo[0].base = (data & 0xffffff) << 12; + fbi.cmdfifo[0].end = fbi.cmdfifo[0].base + (((banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12); break; case cmdBaseSize0: - COMBINE_DATA(&v->banshee.agp[offset]); - v->fbi.cmdfifo[0].end = v->fbi.cmdfifo[0].base + (((v->banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12); - v->fbi.cmdfifo[0].enable = (data >> 8) & 1; - v->fbi.cmdfifo[0].count_holes = (~data >> 10) & 1; + COMBINE_DATA(&banshee.agp[offset]); + fbi.cmdfifo[0].end = fbi.cmdfifo[0].base + (((banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12); + fbi.cmdfifo[0].enable = (data >> 8) & 1; + fbi.cmdfifo[0].count_holes = (~data >> 10) & 1; break; case cmdBump0: fatalerror("cmdBump0\n"); case cmdRdPtrL0: - v->fbi.cmdfifo[0].rdptr = data; + fbi.cmdfifo[0].rdptr = data; break; case cmdAMin0: - v->fbi.cmdfifo[0].amin = data; + fbi.cmdfifo[0].amin = data; break; case cmdAMax0: - v->fbi.cmdfifo[0].amax = data; + fbi.cmdfifo[0].amax = data; break; case cmdFifoDepth0: - v->fbi.cmdfifo[0].depth = data; + fbi.cmdfifo[0].depth = data; break; case cmdHoleCnt0: - v->fbi.cmdfifo[0].holes = data; + fbi.cmdfifo[0].holes = data; break; case cmdBaseAddr1: - COMBINE_DATA(&v->banshee.agp[offset]); - v->fbi.cmdfifo[1].base = (data & 0xffffff) << 12; - v->fbi.cmdfifo[1].end = v->fbi.cmdfifo[1].base + (((v->banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12); + COMBINE_DATA(&banshee.agp[offset]); + fbi.cmdfifo[1].base = (data & 0xffffff) << 12; + fbi.cmdfifo[1].end = fbi.cmdfifo[1].base + (((banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12); break; case cmdBaseSize1: - COMBINE_DATA(&v->banshee.agp[offset]); - v->fbi.cmdfifo[1].end = v->fbi.cmdfifo[1].base + (((v->banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12); - v->fbi.cmdfifo[1].enable = (data >> 8) & 1; - v->fbi.cmdfifo[1].count_holes = (~data >> 10) & 1; + COMBINE_DATA(&banshee.agp[offset]); + fbi.cmdfifo[1].end = fbi.cmdfifo[1].base + (((banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12); + fbi.cmdfifo[1].enable = (data >> 8) & 1; + fbi.cmdfifo[1].count_holes = (~data >> 10) & 1; break; case cmdBump1: fatalerror("cmdBump1\n"); case cmdRdPtrL1: - v->fbi.cmdfifo[1].rdptr = data; + fbi.cmdfifo[1].rdptr = data; break; case cmdAMin1: - v->fbi.cmdfifo[1].amin = data; + fbi.cmdfifo[1].amin = data; break; case cmdAMax1: - v->fbi.cmdfifo[1].amax = data; + fbi.cmdfifo[1].amax = data; break; case cmdFifoDepth1: - v->fbi.cmdfifo[1].depth = data; + fbi.cmdfifo[1].depth = data; break; case cmdHoleCnt1: - v->fbi.cmdfifo[1].holes = data; + fbi.cmdfifo[1].holes = data; break; default: - COMBINE_DATA(&v->banshee.agp[offset]); + COMBINE_DATA(&banshee.agp[offset]); break; } @@ -4767,11 +4699,10 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_agp_w ) WRITE32_MEMBER( voodoo_banshee_device::banshee_w ) { - voodoo_state *v = get_safe_token(this); /* if we have something pending, flush the FIFOs up to the current time */ - if (v->pci.op_pending) - flush_fifos(v, machine().time()); + if (pci.op_pending) + flush_fifos(this, machine().time()); if (offset < 0x80000/4) banshee_io_w(space, offset, data, mem_mask); @@ -4780,7 +4711,7 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_w ) else if (offset < 0x200000/4) logerror("%s:banshee_w(2D:%X) = %08X & %08X\n", machine().describe_context(), (offset*4) & 0xfffff, data, mem_mask); else if (offset < 0x600000/4) - register_w(v, offset & 0x1fffff/4, data); + register_w(this, offset & 0x1fffff/4, data); else if (offset < 0x800000/4) logerror("%s:banshee_w(TEX0:%X) = %08X & %08X\n", machine().describe_context(), (offset*4) & 0x1fffff, data, mem_mask); else if (offset < 0xa00000/4) @@ -4791,7 +4722,7 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_w ) logerror("%s:banshee_w(YUV:%X) = %08X & %08X\n", machine().describe_context(), (offset*4) & 0x3fffff, data, mem_mask); else if (offset < 0x2000000/4) { - lfb_w(v, offset & 0xffffff/4, data, mem_mask); + lfb_w(this, offset & 0xffffff/4, data, mem_mask); } else { logerror("%s:banshee_w Address out of range %08X = %08X & %08X\n", machine().describe_context(), (offset*4), data, mem_mask); } @@ -4800,23 +4731,22 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_w ) WRITE32_MEMBER( voodoo_banshee_device::banshee_fb_w ) { - voodoo_state *v = get_safe_token(this); UINT32 addr = offset*4; /* if we have something pending, flush the FIFOs up to the current time */ - if (v->pci.op_pending) - flush_fifos(v, machine().time()); + if (pci.op_pending) + flush_fifos(this, machine().time()); - if (offset < v->fbi.lfb_base) + if (offset < fbi.lfb_base) { - if (v->fbi.cmdfifo[0].enable && addr >= v->fbi.cmdfifo[0].base && addr < v->fbi.cmdfifo[0].end) - cmdfifo_w(v, &v->fbi.cmdfifo[0], (addr - v->fbi.cmdfifo[0].base) / 4, data); - else if (v->fbi.cmdfifo[1].enable && addr >= v->fbi.cmdfifo[1].base && addr < v->fbi.cmdfifo[1].end) - cmdfifo_w(v, &v->fbi.cmdfifo[1], (addr - v->fbi.cmdfifo[1].base) / 4, data); + if (fbi.cmdfifo[0].enable && addr >= fbi.cmdfifo[0].base && addr < fbi.cmdfifo[0].end) + cmdfifo_w(this, &fbi.cmdfifo[0], (addr - fbi.cmdfifo[0].base) / 4, data); + else if (fbi.cmdfifo[1].enable && addr >= fbi.cmdfifo[1].base && addr < fbi.cmdfifo[1].end) + cmdfifo_w(this, &fbi.cmdfifo[1], (addr - fbi.cmdfifo[1].base) / 4, data); else { - if (offset*4 <= v->fbi.mask) - COMBINE_DATA(&((UINT32 *)v->fbi.ram)[offset]); + if (offset*4 <= fbi.mask) + COMBINE_DATA(&((UINT32 *)fbi.ram)[offset]); else logerror("%s:banshee_fb_w Out of bounds (%X) = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); #if LOG_LFB @@ -4825,13 +4755,12 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_fb_w ) } } else - lfb_direct_w(v, offset - v->fbi.lfb_base, data, mem_mask); + lfb_direct_w(this, offset - fbi.lfb_base, data, mem_mask); } WRITE8_MEMBER( voodoo_banshee_device::banshee_vga_w ) { - voodoo_state *v = get_safe_token(this); offset &= 0x1f; /* switch off the offset */ @@ -4840,48 +4769,48 @@ WRITE8_MEMBER( voodoo_banshee_device::banshee_vga_w ) /* attribute access */ case 0x3c0: case 0x3c1: - if (v->banshee.attff == 0) + if (banshee.attff == 0) { - v->banshee.vga[0x3c1 & 0x1f] = data; + banshee.vga[0x3c1 & 0x1f] = data; if (LOG_REGISTERS) logerror("%s:banshee_vga_w(%X) = %02X\n", machine().describe_context(), 0x3c0+offset, data); } else { - if (v->banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(v->banshee.att)) - v->banshee.att[v->banshee.vga[0x3c1 & 0x1f]] = data; + if (banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(banshee.att)) + banshee.att[banshee.vga[0x3c1 & 0x1f]] = data; if (LOG_REGISTERS) - logerror("%s:banshee_att_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3c1 & 0x1f], data); + logerror("%s:banshee_att_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3c1 & 0x1f], data); } - v->banshee.attff ^= 1; + banshee.attff ^= 1; break; /* Sequencer access */ case 0x3c5: - if (v->banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(v->banshee.seq)) - v->banshee.seq[v->banshee.vga[0x3c4 & 0x1f]] = data; + if (banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(banshee.seq)) + banshee.seq[banshee.vga[0x3c4 & 0x1f]] = data; if (LOG_REGISTERS) - logerror("%s:banshee_seq_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3c4 & 0x1f], data); + logerror("%s:banshee_seq_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3c4 & 0x1f], data); break; /* Graphics controller access */ case 0x3cf: - if (v->banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(v->banshee.gc)) - v->banshee.gc[v->banshee.vga[0x3ce & 0x1f]] = data; + if (banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(banshee.gc)) + banshee.gc[banshee.vga[0x3ce & 0x1f]] = data; if (LOG_REGISTERS) - logerror("%s:banshee_gc_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3ce & 0x1f], data); + logerror("%s:banshee_gc_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3ce & 0x1f], data); break; /* CRTC access */ case 0x3d5: - if (v->banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(v->banshee.crtc)) - v->banshee.crtc[v->banshee.vga[0x3d4 & 0x1f]] = data; + if (banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(banshee.crtc)) + banshee.crtc[banshee.vga[0x3d4 & 0x1f]] = data; if (LOG_REGISTERS) - logerror("%s:banshee_crtc_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3d4 & 0x1f], data); + logerror("%s:banshee_crtc_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3d4 & 0x1f], data); break; default: - v->banshee.vga[offset] = data; + banshee.vga[offset] = data; if (LOG_REGISTERS) logerror("%s:banshee_vga_w(%X) = %02X\n", machine().describe_context(), 0x3c0+offset, data); break; @@ -4891,73 +4820,72 @@ WRITE8_MEMBER( voodoo_banshee_device::banshee_vga_w ) WRITE32_MEMBER( voodoo_banshee_device::banshee_io_w ) { - voodoo_state *v = get_safe_token(this); UINT32 old; offset &= 0xff/4; - old = v->banshee.io[offset]; + old = banshee.io[offset]; /* switch off the offset */ switch (offset) { case io_vidProcCfg: - COMBINE_DATA(&v->banshee.io[offset]); - if ((v->banshee.io[offset] ^ old) & 0x2800) - v->fbi.clut_dirty = TRUE; + COMBINE_DATA(&banshee.io[offset]); + if ((banshee.io[offset] ^ old) & 0x2800) + fbi.clut_dirty = TRUE; if (LOG_REGISTERS) logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask); break; case io_dacData: - COMBINE_DATA(&v->banshee.io[offset]); - if (v->banshee.io[offset] != v->fbi.clut[v->banshee.io[io_dacAddr] & 0x1ff]) + COMBINE_DATA(&banshee.io[offset]); + if (banshee.io[offset] != fbi.clut[banshee.io[io_dacAddr] & 0x1ff]) { - v->fbi.clut[v->banshee.io[io_dacAddr] & 0x1ff] = v->banshee.io[offset]; - v->fbi.clut_dirty = TRUE; + fbi.clut[banshee.io[io_dacAddr] & 0x1ff] = banshee.io[offset]; + fbi.clut_dirty = TRUE; } if (LOG_REGISTERS) - logerror("%s:banshee_dac_w(%X) = %08X & %08X\n", machine().describe_context(), v->banshee.io[io_dacAddr] & 0x1ff, data, mem_mask); + logerror("%s:banshee_dac_w(%X) = %08X & %08X\n", machine().describe_context(), banshee.io[io_dacAddr] & 0x1ff, data, mem_mask); break; case io_miscInit0: - COMBINE_DATA(&v->banshee.io[offset]); - v->fbi.yorigin = (data >> 18) & 0xfff; + COMBINE_DATA(&banshee.io[offset]); + fbi.yorigin = (data >> 18) & 0xfff; if (LOG_REGISTERS) logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask); break; case io_vidScreenSize: if (data & 0xfff) - v->fbi.width = data & 0xfff; + fbi.width = data & 0xfff; if (data & 0xfff000) - v->fbi.height = (data >> 12) & 0xfff; + fbi.height = (data >> 12) & 0xfff; /* fall through */ case io_vidOverlayDudx: case io_vidOverlayDvdy: { /* warning: this is a hack for now! We should really compute the screen size */ /* from the CRTC registers */ - COMBINE_DATA(&v->banshee.io[offset]); + COMBINE_DATA(&banshee.io[offset]); - int width = v->fbi.width; - int height = v->fbi.height; + int width = fbi.width; + int height = fbi.height; - if (v->banshee.io[io_vidOverlayDudx] != 0) - width = (v->fbi.width * v->banshee.io[io_vidOverlayDudx]) / 1048576; - if (v->banshee.io[io_vidOverlayDvdy] != 0) - height = (v->fbi.height * v->banshee.io[io_vidOverlayDvdy]) / 1048576; + if (banshee.io[io_vidOverlayDudx] != 0) + width = (fbi.width * banshee.io[io_vidOverlayDudx]) / 1048576; + if (banshee.io[io_vidOverlayDvdy] != 0) + height = (fbi.height * banshee.io[io_vidOverlayDvdy]) / 1048576; - v->screen->set_visible_area(0, width - 1, 0, height - 1); + screen->set_visible_area(0, width - 1, 0, height - 1); - adjust_vblank_timer(v); + adjust_vblank_timer(this); if (LOG_REGISTERS) logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask); break; } case io_lfbMemoryConfig: - v->fbi.lfb_base = (data & 0x1fff) << (12-2); - v->fbi.lfb_stride = ((data >> 13) & 7) + 9; + fbi.lfb_base = (data & 0x1fff) << (12-2); + fbi.lfb_stride = ((data >> 13) & 7) + 9; if (LOG_REGISTERS) logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask); break; @@ -4976,7 +4904,7 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_io_w ) break; default: - COMBINE_DATA(&v->banshee.io[offset]); + COMBINE_DATA(&banshee.io[offset]); if (LOG_REGISTERS) logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask); break; @@ -4995,7 +4923,6 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_io_w ) void voodoo_device::common_start_voodoo(UINT8 type) { - voodoo_state *v = get_safe_token(this); const raster_info *info; void *fbmem, *tmumem[2]; UINT32 tmumem0, tmumem1; @@ -5007,17 +4934,17 @@ void voodoo_device::common_start_voodoo(UINT8 type) assert(m_fbmem > 0); /* store a pointer back to the device */ - v->device = this; - v->type = type; + device = this; + vd_type = type; /* copy config data */ - v->freq = clock(); - v->device->m_vblank.resolve(); - v->device->m_stall.resolve(); + freq = clock(); + device->m_vblank.resolve(); + device->m_stall.resolve(); /* create a multiprocessor work queue */ - v->poly = poly_alloc(machine(), 64, sizeof(poly_extra_data), 0); - v->thread_stats = auto_alloc_array(machine(), stats_block, WORK_MAX_THREADS); + poly = poly_alloc(machine(), 64, sizeof(poly_extra_data), 0); + thread_stats = auto_alloc_array(machine(), stats_block, WORK_MAX_THREADS); /* create a table of precomputed 1/n and log2(n) values */ /* n ranges from 1.0000 to 2.0000 */ @@ -5048,38 +4975,38 @@ void voodoo_device::common_start_voodoo(UINT8 type) } } - v->tmu_config = 0x11; // revision 1 + tmu_config = 0x11; // revision 1 /* configure type-specific values */ - switch (v->type) + switch (vd_type) { case TYPE_VOODOO_1: - v->regaccess = voodoo_register_access; - v->regnames = voodoo_reg_name; - v->alt_regmap = 0; - v->fbi.lfb_stride = 10; + regaccess = voodoo_register_access; + regnames = voodoo_reg_name; + alt_regmap = 0; + fbi.lfb_stride = 10; break; case TYPE_VOODOO_2: - v->regaccess = voodoo2_register_access; - v->regnames = voodoo_reg_name; - v->alt_regmap = 0; - v->fbi.lfb_stride = 10; - v->tmu_config |= 0x800; + regaccess = voodoo2_register_access; + regnames = voodoo_reg_name; + alt_regmap = 0; + fbi.lfb_stride = 10; + tmu_config |= 0x800; break; case TYPE_VOODOO_BANSHEE: - v->regaccess = banshee_register_access; - v->regnames = banshee_reg_name; - v->alt_regmap = 1; - v->fbi.lfb_stride = 11; + regaccess = banshee_register_access; + regnames = banshee_reg_name; + alt_regmap = 1; + fbi.lfb_stride = 11; break; case TYPE_VOODOO_3: - v->regaccess = banshee_register_access; - v->regnames = banshee_reg_name; - v->alt_regmap = 1; - v->fbi.lfb_stride = 11; + regaccess = banshee_register_access; + regnames = banshee_reg_name; + alt_regmap = 1; + fbi.lfb_stride = 11; break; default: @@ -5088,41 +5015,41 @@ void voodoo_device::common_start_voodoo(UINT8 type) /* set the type, and initialize the chip mask */ device_iterator iter(machine().root_device()); - v->index = 0; + index = 0; for (device_t *scan = iter.first(); scan != nullptr; scan = iter.next()) if (scan->type() == this->type()) { if (scan == this) break; - v->index++; + index++; } - v->screen = downcast(machine().device(m_screen)); - assert_always(v->screen != nullptr, "Unable to find screen attached to voodoo"); - v->cpu = machine().device(m_cputag); - assert_always(v->cpu != nullptr, "Unable to find CPU attached to voodoo"); + screen = downcast(machine().device(m_screen)); + assert_always(screen != nullptr, "Unable to find screen attached to voodoo"); + cpu = machine().device(m_cputag); + assert_always(cpu != nullptr, "Unable to find CPU attached to voodoo"); if (m_tmumem1 != 0) - v->tmu_config |= 0xc0; // two TMUs + tmu_config |= 0xc0; // two TMUs - v->chipmask = 0x01; - v->attoseconds_per_cycle = ATTOSECONDS_PER_SECOND / v->freq; - v->trigger = 51324 + v->index; + chipmask = 0x01; + attoseconds_per_cycle = ATTOSECONDS_PER_SECOND / freq; + trigger = 51324 + index; /* build the rasterizer table */ for (info = predef_raster_table; info->callback; info++) - add_rasterizer(v, info); + add_rasterizer(this, info); /* set up the PCI FIFO */ - v->pci.fifo.base = v->pci.fifo_mem; - v->pci.fifo.size = 64*2; - v->pci.fifo.in = v->pci.fifo.out = 0; - v->pci.stall_state = NOT_STALLED; - v->pci.continue_timer = machine().scheduler().timer_alloc(FUNC(stall_cpu_callback), v); - + pci.fifo.base = pci.fifo_mem; + pci.fifo.size = 64*2; + pci.fifo.in = pci.fifo.out = 0; + pci.stall_state = NOT_STALLED; + pci.continue_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(voodoo_device::stall_cpu_callback),this), nullptr); + /* allocate memory */ tmumem0 = m_tmumem0; tmumem1 = m_tmumem1; - if (v->type <= TYPE_VOODOO_2) + if (vd_type <= TYPE_VOODOO_2) { /* separate FB/TMU memory */ fbmem = auto_alloc_array(machine(), UINT8, m_fbmem << 20); @@ -5134,47 +5061,47 @@ void voodoo_device::common_start_voodoo(UINT8 type) /* shared memory */ tmumem[0] = tmumem[1] = fbmem = auto_alloc_array(machine(), UINT8, m_fbmem << 20); tmumem0 = m_fbmem; - if (v->type == TYPE_VOODOO_3) + if (vd_type == TYPE_VOODOO_3) tmumem1 = m_fbmem; } /* set up frame buffer */ - init_fbi(v, &v->fbi, fbmem, m_fbmem << 20); + init_fbi(this, &fbi, fbmem, m_fbmem << 20); /* build shared TMU tables */ - init_tmu_shared(&v->tmushare); + init_tmu_shared(&tmushare); /* set up the TMUs */ - init_tmu(v, &v->tmu[0], &v->reg[0x100], tmumem[0], tmumem0 << 20); - v->chipmask |= 0x02; + init_tmu(this, &tmu[0], ®[0x100], tmumem[0], tmumem0 << 20); + chipmask |= 0x02; if (tmumem1 != 0) { - init_tmu(v, &v->tmu[1], &v->reg[0x200], tmumem[1], tmumem1 << 20); - v->chipmask |= 0x04; - v->tmu_config |= 0x40; + init_tmu(this, &tmu[1], ®[0x200], tmumem[1], tmumem1 << 20); + chipmask |= 0x04; + tmu_config |= 0x40; } /* initialize some registers */ - memset(v->reg, 0, sizeof(v->reg)); - v->pci.init_enable = 0; - v->reg[fbiInit0].u = (1 << 4) | (0x10 << 6); - v->reg[fbiInit1].u = (1 << 1) | (1 << 8) | (1 << 12) | (2 << 20); - v->reg[fbiInit2].u = (1 << 6) | (0x100 << 23); - v->reg[fbiInit3].u = (2 << 13) | (0xf << 17); - v->reg[fbiInit4].u = (1 << 0); + memset(reg, 0, sizeof(reg)); + pci.init_enable = 0; + reg[fbiInit0].u = (1 << 4) | (0x10 << 6); + reg[fbiInit1].u = (1 << 1) | (1 << 8) | (1 << 12) | (2 << 20); + reg[fbiInit2].u = (1 << 6) | (0x100 << 23); + reg[fbiInit3].u = (2 << 13) | (0xf << 17); + reg[fbiInit4].u = (1 << 0); /* initialize banshee registers */ - memset(v->banshee.io, 0, sizeof(v->banshee.io)); - v->banshee.io[io_pciInit0] = 0x01800040; - v->banshee.io[io_sipMonitor] = 0x40000000; - v->banshee.io[io_lfbMemoryConfig] = 0x000a2200; - v->banshee.io[io_dramInit0] = 0x00579d29; - v->banshee.io[io_dramInit0] |= 0x08000000; // Konami Viper expects 16MBit SGRAMs - v->banshee.io[io_dramInit1] = 0x00f02200; - v->banshee.io[io_tmuGbeInit] = 0x00000bfb; + memset(banshee.io, 0, sizeof(banshee.io)); + banshee.io[io_pciInit0] = 0x01800040; + banshee.io[io_sipMonitor] = 0x40000000; + banshee.io[io_lfbMemoryConfig] = 0x000a2200; + banshee.io[io_dramInit0] = 0x00579d29; + banshee.io[io_dramInit0] |= 0x08000000; // Konami Viper expects 16MBit SGRAMs + banshee.io[io_dramInit1] = 0x00f02200; + banshee.io[io_tmuGbeInit] = 0x00000bfb; /* do a soft reset to reset everything else */ - soft_reset(v); + soft_reset(this); /* register for save states */ init_save_state(this); @@ -5191,12 +5118,12 @@ void voodoo_device::common_start_voodoo(UINT8 type) command -------------------------------------------------*/ -static INT32 fastfill(voodoo_state *v) +INT32 voodoo_device::fastfill(voodoo_device *vd) { - int sx = (v->reg[clipLeftRight].u >> 16) & 0x3ff; - int ex = (v->reg[clipLeftRight].u >> 0) & 0x3ff; - int sy = (v->reg[clipLowYHighY].u >> 16) & 0x3ff; - int ey = (v->reg[clipLowYHighY].u >> 0) & 0x3ff; + int sx = (vd->reg[clipLeftRight].u >> 16) & 0x3ff; + int ex = (vd->reg[clipLeftRight].u >> 0) & 0x3ff; + int sy = (vd->reg[clipLowYHighY].u >> 16) & 0x3ff; + int ey = (vd->reg[clipLowYHighY].u >> 0) & 0x3ff; poly_extent extents[64]; UINT16 dithermatrix[16]; UINT16 *drawbuf = nullptr; @@ -5204,22 +5131,22 @@ static INT32 fastfill(voodoo_state *v) int extnum, x, y; /* if we're not clearing either, take no time */ - if (!FBZMODE_RGB_BUFFER_MASK(v->reg[fbzMode].u) && !FBZMODE_AUX_BUFFER_MASK(v->reg[fbzMode].u)) + if (!FBZMODE_RGB_BUFFER_MASK(vd->reg[fbzMode].u) && !FBZMODE_AUX_BUFFER_MASK(vd->reg[fbzMode].u)) return 0; /* are we clearing the RGB buffer? */ - if (FBZMODE_RGB_BUFFER_MASK(v->reg[fbzMode].u)) + if (FBZMODE_RGB_BUFFER_MASK(vd->reg[fbzMode].u)) { /* determine the draw buffer */ - int destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(v->reg[fbzMode].u); + int destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(vd->reg[fbzMode].u); switch (destbuf) { case 0: /* front buffer */ - drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]); + drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]); break; case 1: /* back buffer */ - drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]); + drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]); break; default: /* reserved */ @@ -5230,14 +5157,14 @@ static INT32 fastfill(voodoo_state *v) for (y = 0; y < 4; y++) { DECLARE_DITHER_POINTERS_NO_DITHER_VAR; - COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(v->reg[fbzMode].u, y); + COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(vd->reg[fbzMode].u, y); for (x = 0; x < 4; x++) { - int r = v->reg[color1].rgb.r; - int g = v->reg[color1].rgb.g; - int b = v->reg[color1].rgb.b; + int r = vd->reg[color1].rgb.r; + int g = vd->reg[color1].rgb.g; + int b = vd->reg[color1].rgb.b; - APPLY_DITHER(v->reg[fbzMode].u, x, dither_lookup, r, g, b); + APPLY_DITHER(vd->reg[fbzMode].u, x, dither_lookup, r, g, b); dithermatrix[y*4 + x] = (r << 11) | (g << 5) | b; } } @@ -5252,13 +5179,13 @@ static INT32 fastfill(voodoo_state *v) /* iterate over blocks of extents */ for (y = sy; y < ey; y += ARRAY_LENGTH(extents)) { - poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(v->poly); + poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(vd->poly); int count = MIN(ey - y, ARRAY_LENGTH(extents)); - extra->state = v; + extra->device= vd; memcpy(extra->dither, dithermatrix, sizeof(extra->dither)); - pixels += poly_render_triangle_custom(v->poly, drawbuf, global_cliprect, raster_fastfill, y, count, extents); + pixels += poly_render_triangle_custom(vd->poly, drawbuf, global_cliprect, raster_fastfill, y, count, extents); } /* 2 pixels per clock */ @@ -5271,23 +5198,23 @@ static INT32 fastfill(voodoo_state *v) command -------------------------------------------------*/ -static INT32 swapbuffer(voodoo_state *v, UINT32 data) +INT32 voodoo_device::swapbuffer(voodoo_device* vd, UINT32 data) { /* set the don't swap value for Voodoo 2 */ - v->fbi.vblank_swap_pending = TRUE; - v->fbi.vblank_swap = (data >> 1) & 0xff; - v->fbi.vblank_dont_swap = (data >> 9) & 1; + vd->fbi.vblank_swap_pending = TRUE; + vd->fbi.vblank_swap = (data >> 1) & 0xff; + vd->fbi.vblank_dont_swap = (data >> 9) & 1; /* if we're not syncing to the retrace, process the command immediately */ if (!(data & 1)) { - swap_buffers(v); + swap_buffers(vd); return 0; } /* determine how many cycles to wait; we deliberately overshoot here because */ /* the final count gets updated on the VBLANK */ - return (v->fbi.vblank_swap + 1) * v->freq / 30; + return (vd->fbi.vblank_swap + 1) * vd->freq / 30; } @@ -5296,7 +5223,7 @@ static INT32 swapbuffer(voodoo_state *v, UINT32 data) command -------------------------------------------------*/ -static INT32 triangle(voodoo_state *v) +INT32 voodoo_device::triangle(voodoo_device *vd) { int texcount; UINT16 *drawbuf; @@ -5307,58 +5234,58 @@ static INT32 triangle(voodoo_state *v) /* determine the number of TMUs involved */ texcount = 0; - if (!FBIINIT3_DISABLE_TMUS(v->reg[fbiInit3].u) && FBZCP_TEXTURE_ENABLE(v->reg[fbzColorPath].u)) + if (!FBIINIT3_DISABLE_TMUS(vd->reg[fbiInit3].u) && FBZCP_TEXTURE_ENABLE(vd->reg[fbzColorPath].u)) { texcount = 1; - if (v->chipmask & 0x04) + if (vd->chipmask & 0x04) texcount = 2; } /* perform subpixel adjustments */ - if (FBZCP_CCA_SUBPIXEL_ADJUST(v->reg[fbzColorPath].u)) + if (FBZCP_CCA_SUBPIXEL_ADJUST(vd->reg[fbzColorPath].u)) { - INT32 dx = 8 - (v->fbi.ax & 15); - INT32 dy = 8 - (v->fbi.ay & 15); + INT32 dx = 8 - (vd->fbi.ax & 15); + INT32 dy = 8 - (vd->fbi.ay & 15); /* adjust iterated R,G,B,A and W/Z */ - v->fbi.startr += (dy * v->fbi.drdy + dx * v->fbi.drdx) >> 4; - v->fbi.startg += (dy * v->fbi.dgdy + dx * v->fbi.dgdx) >> 4; - v->fbi.startb += (dy * v->fbi.dbdy + dx * v->fbi.dbdx) >> 4; - v->fbi.starta += (dy * v->fbi.dady + dx * v->fbi.dadx) >> 4; - v->fbi.startw += (dy * v->fbi.dwdy + dx * v->fbi.dwdx) >> 4; - v->fbi.startz += mul_32x32_shift(dy, v->fbi.dzdy, 4) + mul_32x32_shift(dx, v->fbi.dzdx, 4); + vd->fbi.startr += (dy * vd->fbi.drdy + dx * vd->fbi.drdx) >> 4; + vd->fbi.startg += (dy * vd->fbi.dgdy + dx * vd->fbi.dgdx) >> 4; + vd->fbi.startb += (dy * vd->fbi.dbdy + dx * vd->fbi.dbdx) >> 4; + vd->fbi.starta += (dy * vd->fbi.dady + dx * vd->fbi.dadx) >> 4; + vd->fbi.startw += (dy * vd->fbi.dwdy + dx * vd->fbi.dwdx) >> 4; + vd->fbi.startz += mul_32x32_shift(dy, vd->fbi.dzdy, 4) + mul_32x32_shift(dx, vd->fbi.dzdx, 4); /* adjust iterated W/S/T for TMU 0 */ if (texcount >= 1) { - v->tmu[0].startw += (dy * v->tmu[0].dwdy + dx * v->tmu[0].dwdx) >> 4; - v->tmu[0].starts += (dy * v->tmu[0].dsdy + dx * v->tmu[0].dsdx) >> 4; - v->tmu[0].startt += (dy * v->tmu[0].dtdy + dx * v->tmu[0].dtdx) >> 4; + vd->tmu[0].startw += (dy * vd->tmu[0].dwdy + dx * vd->tmu[0].dwdx) >> 4; + vd->tmu[0].starts += (dy * vd->tmu[0].dsdy + dx * vd->tmu[0].dsdx) >> 4; + vd->tmu[0].startt += (dy * vd->tmu[0].dtdy + dx * vd->tmu[0].dtdx) >> 4; /* adjust iterated W/S/T for TMU 1 */ if (texcount >= 2) { - v->tmu[1].startw += (dy * v->tmu[1].dwdy + dx * v->tmu[1].dwdx) >> 4; - v->tmu[1].starts += (dy * v->tmu[1].dsdy + dx * v->tmu[1].dsdx) >> 4; - v->tmu[1].startt += (dy * v->tmu[1].dtdy + dx * v->tmu[1].dtdx) >> 4; + vd->tmu[1].startw += (dy * vd->tmu[1].dwdy + dx * vd->tmu[1].dwdx) >> 4; + vd->tmu[1].starts += (dy * vd->tmu[1].dsdy + dx * vd->tmu[1].dsdx) >> 4; + vd->tmu[1].startt += (dy * vd->tmu[1].dtdy + dx * vd->tmu[1].dtdx) >> 4; } } } /* wait for any outstanding work to finish */ -// poly_wait(v->poly, "triangle"); +// poly_wait(vd->poly, "triangle"); /* determine the draw buffer */ - destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(v->reg[fbzMode].u); + destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(vd->reg[fbzMode].u); switch (destbuf) { case 0: /* front buffer */ - drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]); - v->fbi.video_changed = TRUE; + drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]); + vd->fbi.video_changed = TRUE; break; case 1: /* back buffer */ - drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]); + drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]); break; default: /* reserved */ @@ -5366,18 +5293,18 @@ static INT32 triangle(voodoo_state *v) } /* find a rasterizer that matches our current state */ - pixels = triangle_create_work_item(v, drawbuf, texcount); + pixels = triangle_create_work_item(vd, drawbuf, texcount); /* update stats */ - v->reg[fbiTrianglesOut].u++; + vd->reg[fbiTrianglesOut].u++; /* update stats */ - v->stats.total_triangles++; + vd->stats.total_triangles++; g_profiler.stop(); /* 1 pixel per clock, plus some setup time */ - if (LOG_REGISTERS) v->device->logerror("cycles = %d\n", TRIANGLE_SETUP_CLOCKS + pixels); + if (LOG_REGISTERS) vd->device->logerror("cycles = %d\n", TRIANGLE_SETUP_CLOCKS + pixels); return TRIANGLE_SETUP_CLOCKS + pixels; } @@ -5387,28 +5314,28 @@ static INT32 triangle(voodoo_state *v) command -------------------------------------------------*/ -static INT32 begin_triangle(voodoo_state *v) +INT32 voodoo_device::begin_triangle(voodoo_device *vd) { - setup_vertex *sv = &v->fbi.svert[2]; + setup_vertex *sv = &vd->fbi.svert[2]; /* extract all the data from registers */ - sv->x = v->reg[sVx].f; - sv->y = v->reg[sVy].f; - sv->wb = v->reg[sWb].f; - sv->w0 = v->reg[sWtmu0].f; - sv->s0 = v->reg[sS_W0].f; - sv->t0 = v->reg[sT_W0].f; - sv->w1 = v->reg[sWtmu1].f; - sv->s1 = v->reg[sS_Wtmu1].f; - sv->t1 = v->reg[sT_Wtmu1].f; - sv->a = v->reg[sAlpha].f; - sv->r = v->reg[sRed].f; - sv->g = v->reg[sGreen].f; - sv->b = v->reg[sBlue].f; + sv->x = vd->reg[sVx].f; + sv->y = vd->reg[sVy].f; + sv->wb = vd->reg[sWb].f; + sv->w0 = vd->reg[sWtmu0].f; + sv->s0 = vd->reg[sS_W0].f; + sv->t0 = vd->reg[sT_W0].f; + sv->w1 = vd->reg[sWtmu1].f; + sv->s1 = vd->reg[sS_Wtmu1].f; + sv->t1 = vd->reg[sT_Wtmu1].f; + sv->a = vd->reg[sAlpha].f; + sv->r = vd->reg[sRed].f; + sv->g = vd->reg[sGreen].f; + sv->b = vd->reg[sBlue].f; /* spread it across all three verts and reset the count */ - v->fbi.svert[0] = v->fbi.svert[1] = v->fbi.svert[2]; - v->fbi.sverts = 1; + vd->fbi.svert[0] = vd->fbi.svert[1] = vd->fbi.svert[2]; + vd->fbi.sverts = 1; return 0; } @@ -5419,36 +5346,36 @@ static INT32 begin_triangle(voodoo_state *v) command -------------------------------------------------*/ -static INT32 draw_triangle(voodoo_state *v) +INT32 voodoo_device::draw_triangle(voodoo_device *vd) { - setup_vertex *sv = &v->fbi.svert[2]; + setup_vertex *sv = &vd->fbi.svert[2]; int cycles = 0; /* for strip mode, shuffle vertex 1 down to 0 */ - if (!(v->reg[sSetupMode].u & (1 << 16))) - v->fbi.svert[0] = v->fbi.svert[1]; + if (!(vd->reg[sSetupMode].u & (1 << 16))) + vd->fbi.svert[0] = vd->fbi.svert[1]; /* copy 2 down to 1 regardless */ - v->fbi.svert[1] = v->fbi.svert[2]; + vd->fbi.svert[1] = vd->fbi.svert[2]; /* extract all the data from registers */ - sv->x = v->reg[sVx].f; - sv->y = v->reg[sVy].f; - sv->wb = v->reg[sWb].f; - sv->w0 = v->reg[sWtmu0].f; - sv->s0 = v->reg[sS_W0].f; - sv->t0 = v->reg[sT_W0].f; - sv->w1 = v->reg[sWtmu1].f; - sv->s1 = v->reg[sS_Wtmu1].f; - sv->t1 = v->reg[sT_Wtmu1].f; - sv->a = v->reg[sAlpha].f; - sv->r = v->reg[sRed].f; - sv->g = v->reg[sGreen].f; - sv->b = v->reg[sBlue].f; + sv->x = vd->reg[sVx].f; + sv->y = vd->reg[sVy].f; + sv->wb = vd->reg[sWb].f; + sv->w0 = vd->reg[sWtmu0].f; + sv->s0 = vd->reg[sS_W0].f; + sv->t0 = vd->reg[sT_W0].f; + sv->w1 = vd->reg[sWtmu1].f; + sv->s1 = vd->reg[sS_Wtmu1].f; + sv->t1 = vd->reg[sT_Wtmu1].f; + sv->a = vd->reg[sAlpha].f; + sv->r = vd->reg[sRed].f; + sv->g = vd->reg[sGreen].f; + sv->b = vd->reg[sBlue].f; /* if we have enough verts, go ahead and draw */ - if (++v->fbi.sverts >= 3) - cycles = setup_and_draw_triangle(v); + if (++vd->fbi.sverts >= 3) + cycles = setup_and_draw_triangle(vd); return cycles; } @@ -5464,32 +5391,32 @@ static INT32 draw_triangle(voodoo_state *v) parameters and render the triangle -------------------------------------------------*/ -static INT32 setup_and_draw_triangle(voodoo_state *v) +INT32 voodoo_device::setup_and_draw_triangle(voodoo_device *vd) { float dx1, dy1, dx2, dy2; float divisor, tdiv; /* grab the X/Ys at least */ - v->fbi.ax = (INT16)(v->fbi.svert[0].x * 16.0f); - v->fbi.ay = (INT16)(v->fbi.svert[0].y * 16.0f); - v->fbi.bx = (INT16)(v->fbi.svert[1].x * 16.0f); - v->fbi.by = (INT16)(v->fbi.svert[1].y * 16.0f); - v->fbi.cx = (INT16)(v->fbi.svert[2].x * 16.0f); - v->fbi.cy = (INT16)(v->fbi.svert[2].y * 16.0f); + vd->fbi.ax = (INT16)(vd->fbi.svert[0].x * 16.0f); + vd->fbi.ay = (INT16)(vd->fbi.svert[0].y * 16.0f); + vd->fbi.bx = (INT16)(vd->fbi.svert[1].x * 16.0f); + vd->fbi.by = (INT16)(vd->fbi.svert[1].y * 16.0f); + vd->fbi.cx = (INT16)(vd->fbi.svert[2].x * 16.0f); + vd->fbi.cy = (INT16)(vd->fbi.svert[2].y * 16.0f); /* compute the divisor */ - divisor = 1.0f / ((v->fbi.svert[0].x - v->fbi.svert[1].x) * (v->fbi.svert[0].y - v->fbi.svert[2].y) - - (v->fbi.svert[0].x - v->fbi.svert[2].x) * (v->fbi.svert[0].y - v->fbi.svert[1].y)); + divisor = 1.0f / ((vd->fbi.svert[0].x - vd->fbi.svert[1].x) * (vd->fbi.svert[0].y - vd->fbi.svert[2].y) - + (vd->fbi.svert[0].x - vd->fbi.svert[2].x) * (vd->fbi.svert[0].y - vd->fbi.svert[1].y)); /* backface culling */ - if (v->reg[sSetupMode].u & 0x20000) + if (vd->reg[sSetupMode].u & 0x20000) { - int culling_sign = (v->reg[sSetupMode].u >> 18) & 1; + int culling_sign = (vd->reg[sSetupMode].u >> 18) & 1; int divisor_sign = (divisor < 0); /* if doing strips and ping pong is enabled, apply the ping pong */ - if ((v->reg[sSetupMode].u & 0x90000) == 0x00000) - culling_sign ^= (v->fbi.sverts - 3) & 1; + if ((vd->reg[sSetupMode].u & 0x90000) == 0x00000) + culling_sign ^= (vd->fbi.sverts - 3) & 1; /* if our sign matches the culling sign, we're done for */ if (divisor_sign == culling_sign) @@ -5497,92 +5424,92 @@ static INT32 setup_and_draw_triangle(voodoo_state *v) } /* compute the dx/dy values */ - dx1 = v->fbi.svert[0].y - v->fbi.svert[2].y; - dx2 = v->fbi.svert[0].y - v->fbi.svert[1].y; - dy1 = v->fbi.svert[0].x - v->fbi.svert[1].x; - dy2 = v->fbi.svert[0].x - v->fbi.svert[2].x; + dx1 = vd->fbi.svert[0].y - vd->fbi.svert[2].y; + dx2 = vd->fbi.svert[0].y - vd->fbi.svert[1].y; + dy1 = vd->fbi.svert[0].x - vd->fbi.svert[1].x; + dy2 = vd->fbi.svert[0].x - vd->fbi.svert[2].x; /* set up R,G,B */ tdiv = divisor * 4096.0f; - if (v->reg[sSetupMode].u & (1 << 0)) + if (vd->reg[sSetupMode].u & (1 << 0)) { - v->fbi.startr = (INT32)(v->fbi.svert[0].r * 4096.0f); - v->fbi.drdx = (INT32)(((v->fbi.svert[0].r - v->fbi.svert[1].r) * dx1 - (v->fbi.svert[0].r - v->fbi.svert[2].r) * dx2) * tdiv); - v->fbi.drdy = (INT32)(((v->fbi.svert[0].r - v->fbi.svert[2].r) * dy1 - (v->fbi.svert[0].r - v->fbi.svert[1].r) * dy2) * tdiv); - v->fbi.startg = (INT32)(v->fbi.svert[0].g * 4096.0f); - v->fbi.dgdx = (INT32)(((v->fbi.svert[0].g - v->fbi.svert[1].g) * dx1 - (v->fbi.svert[0].g - v->fbi.svert[2].g) * dx2) * tdiv); - v->fbi.dgdy = (INT32)(((v->fbi.svert[0].g - v->fbi.svert[2].g) * dy1 - (v->fbi.svert[0].g - v->fbi.svert[1].g) * dy2) * tdiv); - v->fbi.startb = (INT32)(v->fbi.svert[0].b * 4096.0f); - v->fbi.dbdx = (INT32)(((v->fbi.svert[0].b - v->fbi.svert[1].b) * dx1 - (v->fbi.svert[0].b - v->fbi.svert[2].b) * dx2) * tdiv); - v->fbi.dbdy = (INT32)(((v->fbi.svert[0].b - v->fbi.svert[2].b) * dy1 - (v->fbi.svert[0].b - v->fbi.svert[1].b) * dy2) * tdiv); + vd->fbi.startr = (INT32)(vd->fbi.svert[0].r * 4096.0f); + vd->fbi.drdx = (INT32)(((vd->fbi.svert[0].r - vd->fbi.svert[1].r) * dx1 - (vd->fbi.svert[0].r - vd->fbi.svert[2].r) * dx2) * tdiv); + vd->fbi.drdy = (INT32)(((vd->fbi.svert[0].r - vd->fbi.svert[2].r) * dy1 - (vd->fbi.svert[0].r - vd->fbi.svert[1].r) * dy2) * tdiv); + vd->fbi.startg = (INT32)(vd->fbi.svert[0].g * 4096.0f); + vd->fbi.dgdx = (INT32)(((vd->fbi.svert[0].g - vd->fbi.svert[1].g) * dx1 - (vd->fbi.svert[0].g - vd->fbi.svert[2].g) * dx2) * tdiv); + vd->fbi.dgdy = (INT32)(((vd->fbi.svert[0].g - vd->fbi.svert[2].g) * dy1 - (vd->fbi.svert[0].g - vd->fbi.svert[1].g) * dy2) * tdiv); + vd->fbi.startb = (INT32)(vd->fbi.svert[0].b * 4096.0f); + vd->fbi.dbdx = (INT32)(((vd->fbi.svert[0].b - vd->fbi.svert[1].b) * dx1 - (vd->fbi.svert[0].b - vd->fbi.svert[2].b) * dx2) * tdiv); + vd->fbi.dbdy = (INT32)(((vd->fbi.svert[0].b - vd->fbi.svert[2].b) * dy1 - (vd->fbi.svert[0].b - vd->fbi.svert[1].b) * dy2) * tdiv); } /* set up alpha */ - if (v->reg[sSetupMode].u & (1 << 1)) + if (vd->reg[sSetupMode].u & (1 << 1)) { - v->fbi.starta = (INT32)(v->fbi.svert[0].a * 4096.0f); - v->fbi.dadx = (INT32)(((v->fbi.svert[0].a - v->fbi.svert[1].a) * dx1 - (v->fbi.svert[0].a - v->fbi.svert[2].a) * dx2) * tdiv); - v->fbi.dady = (INT32)(((v->fbi.svert[0].a - v->fbi.svert[2].a) * dy1 - (v->fbi.svert[0].a - v->fbi.svert[1].a) * dy2) * tdiv); + vd->fbi.starta = (INT32)(vd->fbi.svert[0].a * 4096.0f); + vd->fbi.dadx = (INT32)(((vd->fbi.svert[0].a - vd->fbi.svert[1].a) * dx1 - (vd->fbi.svert[0].a - vd->fbi.svert[2].a) * dx2) * tdiv); + vd->fbi.dady = (INT32)(((vd->fbi.svert[0].a - vd->fbi.svert[2].a) * dy1 - (vd->fbi.svert[0].a - vd->fbi.svert[1].a) * dy2) * tdiv); } /* set up Z */ - if (v->reg[sSetupMode].u & (1 << 2)) + if (vd->reg[sSetupMode].u & (1 << 2)) { - v->fbi.startz = (INT32)(v->fbi.svert[0].z * 4096.0f); - v->fbi.dzdx = (INT32)(((v->fbi.svert[0].z - v->fbi.svert[1].z) * dx1 - (v->fbi.svert[0].z - v->fbi.svert[2].z) * dx2) * tdiv); - v->fbi.dzdy = (INT32)(((v->fbi.svert[0].z - v->fbi.svert[2].z) * dy1 - (v->fbi.svert[0].z - v->fbi.svert[1].z) * dy2) * tdiv); + vd->fbi.startz = (INT32)(vd->fbi.svert[0].z * 4096.0f); + vd->fbi.dzdx = (INT32)(((vd->fbi.svert[0].z - vd->fbi.svert[1].z) * dx1 - (vd->fbi.svert[0].z - vd->fbi.svert[2].z) * dx2) * tdiv); + vd->fbi.dzdy = (INT32)(((vd->fbi.svert[0].z - vd->fbi.svert[2].z) * dy1 - (vd->fbi.svert[0].z - vd->fbi.svert[1].z) * dy2) * tdiv); } /* set up Wb */ tdiv = divisor * 65536.0f * 65536.0f; - if (v->reg[sSetupMode].u & (1 << 3)) + if (vd->reg[sSetupMode].u & (1 << 3)) { - v->fbi.startw = v->tmu[0].startw = v->tmu[1].startw = (INT64)(v->fbi.svert[0].wb * 65536.0f * 65536.0f); - v->fbi.dwdx = v->tmu[0].dwdx = v->tmu[1].dwdx = ((v->fbi.svert[0].wb - v->fbi.svert[1].wb) * dx1 - (v->fbi.svert[0].wb - v->fbi.svert[2].wb) * dx2) * tdiv; - v->fbi.dwdy = v->tmu[0].dwdy = v->tmu[1].dwdy = ((v->fbi.svert[0].wb - v->fbi.svert[2].wb) * dy1 - (v->fbi.svert[0].wb - v->fbi.svert[1].wb) * dy2) * tdiv; + vd->fbi.startw = vd->tmu[0].startw = vd->tmu[1].startw = (INT64)(vd->fbi.svert[0].wb * 65536.0f * 65536.0f); + vd->fbi.dwdx = vd->tmu[0].dwdx = vd->tmu[1].dwdx = ((vd->fbi.svert[0].wb - vd->fbi.svert[1].wb) * dx1 - (vd->fbi.svert[0].wb - vd->fbi.svert[2].wb) * dx2) * tdiv; + vd->fbi.dwdy = vd->tmu[0].dwdy = vd->tmu[1].dwdy = ((vd->fbi.svert[0].wb - vd->fbi.svert[2].wb) * dy1 - (vd->fbi.svert[0].wb - vd->fbi.svert[1].wb) * dy2) * tdiv; } /* set up W0 */ - if (v->reg[sSetupMode].u & (1 << 4)) + if (vd->reg[sSetupMode].u & (1 << 4)) { - v->tmu[0].startw = v->tmu[1].startw = (INT64)(v->fbi.svert[0].w0 * 65536.0f * 65536.0f); - v->tmu[0].dwdx = v->tmu[1].dwdx = ((v->fbi.svert[0].w0 - v->fbi.svert[1].w0) * dx1 - (v->fbi.svert[0].w0 - v->fbi.svert[2].w0) * dx2) * tdiv; - v->tmu[0].dwdy = v->tmu[1].dwdy = ((v->fbi.svert[0].w0 - v->fbi.svert[2].w0) * dy1 - (v->fbi.svert[0].w0 - v->fbi.svert[1].w0) * dy2) * tdiv; + vd->tmu[0].startw = vd->tmu[1].startw = (INT64)(vd->fbi.svert[0].w0 * 65536.0f * 65536.0f); + vd->tmu[0].dwdx = vd->tmu[1].dwdx = ((vd->fbi.svert[0].w0 - vd->fbi.svert[1].w0) * dx1 - (vd->fbi.svert[0].w0 - vd->fbi.svert[2].w0) * dx2) * tdiv; + vd->tmu[0].dwdy = vd->tmu[1].dwdy = ((vd->fbi.svert[0].w0 - vd->fbi.svert[2].w0) * dy1 - (vd->fbi.svert[0].w0 - vd->fbi.svert[1].w0) * dy2) * tdiv; } /* set up S0,T0 */ - if (v->reg[sSetupMode].u & (1 << 5)) + if (vd->reg[sSetupMode].u & (1 << 5)) { - v->tmu[0].starts = v->tmu[1].starts = (INT64)(v->fbi.svert[0].s0 * 65536.0f * 65536.0f); - v->tmu[0].dsdx = v->tmu[1].dsdx = ((v->fbi.svert[0].s0 - v->fbi.svert[1].s0) * dx1 - (v->fbi.svert[0].s0 - v->fbi.svert[2].s0) * dx2) * tdiv; - v->tmu[0].dsdy = v->tmu[1].dsdy = ((v->fbi.svert[0].s0 - v->fbi.svert[2].s0) * dy1 - (v->fbi.svert[0].s0 - v->fbi.svert[1].s0) * dy2) * tdiv; - v->tmu[0].startt = v->tmu[1].startt = (INT64)(v->fbi.svert[0].t0 * 65536.0f * 65536.0f); - v->tmu[0].dtdx = v->tmu[1].dtdx = ((v->fbi.svert[0].t0 - v->fbi.svert[1].t0) * dx1 - (v->fbi.svert[0].t0 - v->fbi.svert[2].t0) * dx2) * tdiv; - v->tmu[0].dtdy = v->tmu[1].dtdy = ((v->fbi.svert[0].t0 - v->fbi.svert[2].t0) * dy1 - (v->fbi.svert[0].t0 - v->fbi.svert[1].t0) * dy2) * tdiv; + vd->tmu[0].starts = vd->tmu[1].starts = (INT64)(vd->fbi.svert[0].s0 * 65536.0f * 65536.0f); + vd->tmu[0].dsdx = vd->tmu[1].dsdx = ((vd->fbi.svert[0].s0 - vd->fbi.svert[1].s0) * dx1 - (vd->fbi.svert[0].s0 - vd->fbi.svert[2].s0) * dx2) * tdiv; + vd->tmu[0].dsdy = vd->tmu[1].dsdy = ((vd->fbi.svert[0].s0 - vd->fbi.svert[2].s0) * dy1 - (vd->fbi.svert[0].s0 - vd->fbi.svert[1].s0) * dy2) * tdiv; + vd->tmu[0].startt = vd->tmu[1].startt = (INT64)(vd->fbi.svert[0].t0 * 65536.0f * 65536.0f); + vd->tmu[0].dtdx = vd->tmu[1].dtdx = ((vd->fbi.svert[0].t0 - vd->fbi.svert[1].t0) * dx1 - (vd->fbi.svert[0].t0 - vd->fbi.svert[2].t0) * dx2) * tdiv; + vd->tmu[0].dtdy = vd->tmu[1].dtdy = ((vd->fbi.svert[0].t0 - vd->fbi.svert[2].t0) * dy1 - (vd->fbi.svert[0].t0 - vd->fbi.svert[1].t0) * dy2) * tdiv; } /* set up W1 */ - if (v->reg[sSetupMode].u & (1 << 6)) + if (vd->reg[sSetupMode].u & (1 << 6)) { - v->tmu[1].startw = (INT64)(v->fbi.svert[0].w1 * 65536.0f * 65536.0f); - v->tmu[1].dwdx = ((v->fbi.svert[0].w1 - v->fbi.svert[1].w1) * dx1 - (v->fbi.svert[0].w1 - v->fbi.svert[2].w1) * dx2) * tdiv; - v->tmu[1].dwdy = ((v->fbi.svert[0].w1 - v->fbi.svert[2].w1) * dy1 - (v->fbi.svert[0].w1 - v->fbi.svert[1].w1) * dy2) * tdiv; + vd->tmu[1].startw = (INT64)(vd->fbi.svert[0].w1 * 65536.0f * 65536.0f); + vd->tmu[1].dwdx = ((vd->fbi.svert[0].w1 - vd->fbi.svert[1].w1) * dx1 - (vd->fbi.svert[0].w1 - vd->fbi.svert[2].w1) * dx2) * tdiv; + vd->tmu[1].dwdy = ((vd->fbi.svert[0].w1 - vd->fbi.svert[2].w1) * dy1 - (vd->fbi.svert[0].w1 - vd->fbi.svert[1].w1) * dy2) * tdiv; } /* set up S1,T1 */ - if (v->reg[sSetupMode].u & (1 << 7)) + if (vd->reg[sSetupMode].u & (1 << 7)) { - v->tmu[1].starts = (INT64)(v->fbi.svert[0].s1 * 65536.0f * 65536.0f); - v->tmu[1].dsdx = ((v->fbi.svert[0].s1 - v->fbi.svert[1].s1) * dx1 - (v->fbi.svert[0].s1 - v->fbi.svert[2].s1) * dx2) * tdiv; - v->tmu[1].dsdy = ((v->fbi.svert[0].s1 - v->fbi.svert[2].s1) * dy1 - (v->fbi.svert[0].s1 - v->fbi.svert[1].s1) * dy2) * tdiv; - v->tmu[1].startt = (INT64)(v->fbi.svert[0].t1 * 65536.0f * 65536.0f); - v->tmu[1].dtdx = ((v->fbi.svert[0].t1 - v->fbi.svert[1].t1) * dx1 - (v->fbi.svert[0].t1 - v->fbi.svert[2].t1) * dx2) * tdiv; - v->tmu[1].dtdy = ((v->fbi.svert[0].t1 - v->fbi.svert[2].t1) * dy1 - (v->fbi.svert[0].t1 - v->fbi.svert[1].t1) * dy2) * tdiv; + vd->tmu[1].starts = (INT64)(vd->fbi.svert[0].s1 * 65536.0f * 65536.0f); + vd->tmu[1].dsdx = ((vd->fbi.svert[0].s1 - vd->fbi.svert[1].s1) * dx1 - (vd->fbi.svert[0].s1 - vd->fbi.svert[2].s1) * dx2) * tdiv; + vd->tmu[1].dsdy = ((vd->fbi.svert[0].s1 - vd->fbi.svert[2].s1) * dy1 - (vd->fbi.svert[0].s1 - vd->fbi.svert[1].s1) * dy2) * tdiv; + vd->tmu[1].startt = (INT64)(vd->fbi.svert[0].t1 * 65536.0f * 65536.0f); + vd->tmu[1].dtdx = ((vd->fbi.svert[0].t1 - vd->fbi.svert[1].t1) * dx1 - (vd->fbi.svert[0].t1 - vd->fbi.svert[2].t1) * dx2) * tdiv; + vd->tmu[1].dtdy = ((vd->fbi.svert[0].t1 - vd->fbi.svert[2].t1) * dy1 - (vd->fbi.svert[0].t1 - vd->fbi.svert[1].t1) * dy2) * tdiv; } /* draw the triangle */ - v->fbi.cheating_allowed = 1; - return triangle(v); + vd->fbi.cheating_allowed = 1; + return triangle(vd); } @@ -5591,81 +5518,82 @@ static INT32 setup_and_draw_triangle(voodoo_state *v) setup and create the work item -------------------------------------------------*/ -static INT32 triangle_create_work_item(voodoo_state *v, UINT16 *drawbuf, int texcount) +INT32 voodoo_device::triangle_create_work_item(voodoo_device* vd, UINT16 *drawbuf, int texcount) { - poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(v->poly); - raster_info *info = find_rasterizer(v, texcount); + poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(vd->poly); + + raster_info *info = find_rasterizer(vd, texcount); poly_vertex vert[3]; /* fill in the vertex data */ - vert[0].x = (float)v->fbi.ax * (1.0f / 16.0f); - vert[0].y = (float)v->fbi.ay * (1.0f / 16.0f); - vert[1].x = (float)v->fbi.bx * (1.0f / 16.0f); - vert[1].y = (float)v->fbi.by * (1.0f / 16.0f); - vert[2].x = (float)v->fbi.cx * (1.0f / 16.0f); - vert[2].y = (float)v->fbi.cy * (1.0f / 16.0f); + vert[0].x = (float)vd->fbi.ax * (1.0f / 16.0f); + vert[0].y = (float)vd->fbi.ay * (1.0f / 16.0f); + vert[1].x = (float)vd->fbi.bx * (1.0f / 16.0f); + vert[1].y = (float)vd->fbi.by * (1.0f / 16.0f); + vert[2].x = (float)vd->fbi.cx * (1.0f / 16.0f); + vert[2].y = (float)vd->fbi.cy * (1.0f / 16.0f); /* fill in the extra data */ - extra->state = v; + extra->device = vd; extra->info = info; /* fill in triangle parameters */ - extra->ax = v->fbi.ax; - extra->ay = v->fbi.ay; - extra->startr = v->fbi.startr; - extra->startg = v->fbi.startg; - extra->startb = v->fbi.startb; - extra->starta = v->fbi.starta; - extra->startz = v->fbi.startz; - extra->startw = v->fbi.startw; - extra->drdx = v->fbi.drdx; - extra->dgdx = v->fbi.dgdx; - extra->dbdx = v->fbi.dbdx; - extra->dadx = v->fbi.dadx; - extra->dzdx = v->fbi.dzdx; - extra->dwdx = v->fbi.dwdx; - extra->drdy = v->fbi.drdy; - extra->dgdy = v->fbi.dgdy; - extra->dbdy = v->fbi.dbdy; - extra->dady = v->fbi.dady; - extra->dzdy = v->fbi.dzdy; - extra->dwdy = v->fbi.dwdy; + extra->ax = vd->fbi.ax; + extra->ay = vd->fbi.ay; + extra->startr = vd->fbi.startr; + extra->startg = vd->fbi.startg; + extra->startb = vd->fbi.startb; + extra->starta = vd->fbi.starta; + extra->startz = vd->fbi.startz; + extra->startw = vd->fbi.startw; + extra->drdx = vd->fbi.drdx; + extra->dgdx = vd->fbi.dgdx; + extra->dbdx = vd->fbi.dbdx; + extra->dadx = vd->fbi.dadx; + extra->dzdx = vd->fbi.dzdx; + extra->dwdx = vd->fbi.dwdx; + extra->drdy = vd->fbi.drdy; + extra->dgdy = vd->fbi.dgdy; + extra->dbdy = vd->fbi.dbdy; + extra->dady = vd->fbi.dady; + extra->dzdy = vd->fbi.dzdy; + extra->dwdy = vd->fbi.dwdy; /* fill in texture 0 parameters */ if (texcount > 0) { - extra->starts0 = v->tmu[0].starts; - extra->startt0 = v->tmu[0].startt; - extra->startw0 = v->tmu[0].startw; - extra->ds0dx = v->tmu[0].dsdx; - extra->dt0dx = v->tmu[0].dtdx; - extra->dw0dx = v->tmu[0].dwdx; - extra->ds0dy = v->tmu[0].dsdy; - extra->dt0dy = v->tmu[0].dtdy; - extra->dw0dy = v->tmu[0].dwdy; - extra->lodbase0 = prepare_tmu(&v->tmu[0]); - v->stats.texture_mode[TEXMODE_FORMAT(v->tmu[0].reg[textureMode].u)]++; + extra->starts0 = vd->tmu[0].starts; + extra->startt0 = vd->tmu[0].startt; + extra->startw0 = vd->tmu[0].startw; + extra->ds0dx = vd->tmu[0].dsdx; + extra->dt0dx = vd->tmu[0].dtdx; + extra->dw0dx = vd->tmu[0].dwdx; + extra->ds0dy = vd->tmu[0].dsdy; + extra->dt0dy = vd->tmu[0].dtdy; + extra->dw0dy = vd->tmu[0].dwdy; + extra->lodbase0 = prepare_tmu(&vd->tmu[0]); + vd->stats.texture_mode[TEXMODE_FORMAT(vd->tmu[0].reg[textureMode].u)]++; /* fill in texture 1 parameters */ if (texcount > 1) { - extra->starts1 = v->tmu[1].starts; - extra->startt1 = v->tmu[1].startt; - extra->startw1 = v->tmu[1].startw; - extra->ds1dx = v->tmu[1].dsdx; - extra->dt1dx = v->tmu[1].dtdx; - extra->dw1dx = v->tmu[1].dwdx; - extra->ds1dy = v->tmu[1].dsdy; - extra->dt1dy = v->tmu[1].dtdy; - extra->dw1dy = v->tmu[1].dwdy; - extra->lodbase1 = prepare_tmu(&v->tmu[1]); - v->stats.texture_mode[TEXMODE_FORMAT(v->tmu[1].reg[textureMode].u)]++; + extra->starts1 = vd->tmu[1].starts; + extra->startt1 = vd->tmu[1].startt; + extra->startw1 = vd->tmu[1].startw; + extra->ds1dx = vd->tmu[1].dsdx; + extra->dt1dx = vd->tmu[1].dtdx; + extra->dw1dx = vd->tmu[1].dwdx; + extra->ds1dy = vd->tmu[1].dsdy; + extra->dt1dy = vd->tmu[1].dtdy; + extra->dw1dy = vd->tmu[1].dwdy; + extra->lodbase1 = prepare_tmu(&vd->tmu[1]); + vd->stats.texture_mode[TEXMODE_FORMAT(vd->tmu[1].reg[textureMode].u)]++; } } /* farm the rasterization out to other threads */ info->polys++; - return poly_render_triangle(v->poly, drawbuf, global_cliprect, info->callback, 0, &vert[0], &vert[1], &vert[2]); + return poly_render_triangle(vd->poly, drawbuf, global_cliprect, info->callback, 0, &vert[0], &vert[1], &vert[2]); } @@ -5679,12 +5607,12 @@ static INT32 triangle_create_work_item(voodoo_state *v, UINT16 *drawbuf, int tex hash table -------------------------------------------------*/ -static raster_info *add_rasterizer(voodoo_state *v, const raster_info *cinfo) +raster_info *voodoo_device::add_rasterizer(voodoo_device *vd, const raster_info *cinfo) { - raster_info *info = &v->rasterizer[v->next_rasterizer++]; + raster_info *info = &vd->rasterizer[vd->next_rasterizer++]; int hash = compute_raster_hash(cinfo); - assert_always(v->next_rasterizer <= MAX_RASTERIZERS, "Out of space for new rasterizers!"); + assert_always(vd->next_rasterizer <= MAX_RASTERIZERS, "Out of space for new rasterizers!"); /* make a copy of the info */ *info = *cinfo; @@ -5695,8 +5623,8 @@ static raster_info *add_rasterizer(voodoo_state *v, const raster_info *cinfo) info->hash = hash; /* hook us into the hash table */ - info->next = v->raster_hash[hash]; - v->raster_hash[hash] = info; + info->next = vd->raster_hash[hash]; + vd->raster_hash[hash] = info; if (LOG_RASTERIZERS) printf("Adding rasterizer @ %p : cp=%08X am=%08X %08X fbzM=%08X tm0=%08X tm1=%08X (hash=%d)\n", @@ -5714,25 +5642,25 @@ static raster_info *add_rasterizer(voodoo_state *v, const raster_info *cinfo) it, creating a new one if necessary -------------------------------------------------*/ -static raster_info *find_rasterizer(voodoo_state *v, int texcount) +raster_info *voodoo_device::find_rasterizer(voodoo_device *vd, int texcount) { raster_info *info, *prev = nullptr; raster_info curinfo; int hash; /* build an info struct with all the parameters */ - curinfo.eff_color_path = normalize_color_path(v->reg[fbzColorPath].u); - curinfo.eff_alpha_mode = normalize_alpha_mode(v->reg[alphaMode].u); - curinfo.eff_fog_mode = normalize_fog_mode(v->reg[fogMode].u); - curinfo.eff_fbz_mode = normalize_fbz_mode(v->reg[fbzMode].u); - curinfo.eff_tex_mode_0 = (texcount >= 1) ? normalize_tex_mode(v->tmu[0].reg[textureMode].u) : 0xffffffff; - curinfo.eff_tex_mode_1 = (texcount >= 2) ? normalize_tex_mode(v->tmu[1].reg[textureMode].u) : 0xffffffff; + curinfo.eff_color_path = normalize_color_path(vd->reg[fbzColorPath].u); + curinfo.eff_alpha_mode = normalize_alpha_mode(vd->reg[alphaMode].u); + curinfo.eff_fog_mode = normalize_fog_mode(vd->reg[fogMode].u); + curinfo.eff_fbz_mode = normalize_fbz_mode(vd->reg[fbzMode].u); + curinfo.eff_tex_mode_0 = (texcount >= 1) ? normalize_tex_mode(vd->tmu[0].reg[textureMode].u) : 0xffffffff; + curinfo.eff_tex_mode_1 = (texcount >= 2) ? normalize_tex_mode(vd->tmu[1].reg[textureMode].u) : 0xffffffff; /* compute the hash */ hash = compute_raster_hash(&curinfo); /* find the appropriate hash entry */ - for (info = v->raster_hash[hash]; info; prev = info, info = info->next) + for (info = vd->raster_hash[hash]; info; prev = info, info = info->next) if (info->eff_color_path == curinfo.eff_color_path && info->eff_alpha_mode == curinfo.eff_alpha_mode && info->eff_fog_mode == curinfo.eff_fog_mode && @@ -5744,8 +5672,8 @@ static raster_info *find_rasterizer(voodoo_state *v, int texcount) if (prev) { prev->next = info->next; - info->next = v->raster_hash[hash]; - v->raster_hash[hash] = info; + info->next = vd->raster_hash[hash]; + vd->raster_hash[hash] = info; } /* return the result */ @@ -5761,7 +5689,7 @@ static raster_info *find_rasterizer(voodoo_state *v, int texcount) curinfo.next = nullptr; curinfo.hash = hash; - return add_rasterizer(v, &curinfo); + return add_rasterizer(vd, &curinfo); } @@ -5770,7 +5698,7 @@ static raster_info *find_rasterizer(voodoo_state *v, int texcount) the current rasterizer usage patterns -------------------------------------------------*/ -static void dump_rasterizer_stats(voodoo_state *v) +void voodoo_device::dump_rasterizer_stats(voodoo_device *vd) { static UINT8 display_index; raster_info *cur, *best; @@ -5786,7 +5714,7 @@ static void dump_rasterizer_stats(voodoo_state *v) /* find the highest entry */ for (hash = 0; hash < RASTER_HASH_SIZE; hash++) - for (cur = v->raster_hash[hash]; cur; cur = cur->next) + for (cur = vd->raster_hash[hash]; cur; cur = cur->next) if (cur->display != display_index && (best == nullptr || cur->hits > best->hits)) best = cur; @@ -5822,12 +5750,10 @@ voodoo_device::voodoo_device(const machine_config &mconfig, device_type type, co m_vblank(*this), m_stall(*this) { - m_token = global_alloc_clear(); } voodoo_device::~voodoo_device() { - global_free(m_token); } //------------------------------------------------- @@ -5846,8 +5772,7 @@ void voodoo_device::device_config_complete() void voodoo_device::device_reset() { - voodoo_state *v = get_safe_token(this); - soft_reset(v); + soft_reset(this); } //------------------------------------------------- @@ -5856,11 +5781,9 @@ void voodoo_device::device_reset() void voodoo_device::device_stop() { - voodoo_state *v = get_safe_token(this); - /* release the work queue, ensuring all work is finished */ - if (v->poly != nullptr) - poly_free(v->poly); + if (poly != nullptr) + poly_free(poly); } @@ -5947,26 +5870,26 @@ void voodoo_3_device::device_start() implementation of the 'fastfill' command -------------------------------------------------*/ -static void raster_fastfill(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) +void voodoo_device::raster_fastfill(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) { const poly_extra_data *extra = (const poly_extra_data *)extradata; - voodoo_state *v = extra->state; - stats_block *stats = &v->thread_stats[threadid]; + voodoo_device* vd = extra->device; + stats_block *stats = &vd->thread_stats[threadid]; INT32 startx = extent->startx; INT32 stopx = extent->stopx; int scry, x; /* determine the screen Y */ scry = y; - if (FBZMODE_Y_ORIGIN(v->reg[fbzMode].u)) - scry = (v->fbi.yorigin - y) & 0x3ff; + if (FBZMODE_Y_ORIGIN(vd->reg[fbzMode].u)) + scry = (vd->fbi.yorigin - y) & 0x3ff; /* fill this RGB row */ - if (FBZMODE_RGB_BUFFER_MASK(v->reg[fbzMode].u)) + if (FBZMODE_RGB_BUFFER_MASK(vd->reg[fbzMode].u)) { const UINT16 *ditherow = &extra->dither[(y & 3) * 4]; UINT64 expanded = *(UINT64 *)ditherow; - UINT16 *dest = (UINT16 *)destbase + scry * v->fbi.rowpixels; + UINT16 *dest = (UINT16 *)destbase + scry * vd->fbi.rowpixels; for (x = startx; x < stopx && (x & 3) != 0; x++) dest[x] = ditherow[x & 3]; @@ -5978,11 +5901,11 @@ static void raster_fastfill(void *destbase, INT32 y, const poly_extent *extent, } /* fill this dest buffer row */ - if (FBZMODE_AUX_BUFFER_MASK(v->reg[fbzMode].u) && v->fbi.auxoffs != ~0) + if (FBZMODE_AUX_BUFFER_MASK(vd->reg[fbzMode].u) && vd->fbi.auxoffs != ~0) { - UINT16 color = v->reg[zaColor].u; + UINT16 color = vd->reg[zaColor].u; UINT64 expanded = ((UINT64)color << 48) | ((UINT64)color << 32) | (color << 16) | color; - UINT16 *dest = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs) + scry * v->fbi.rowpixels; + UINT16 *dest = (UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs) + scry * vd->fbi.rowpixels; for (x = startx; x < stopx && (x & 3) != 0; x++) dest[x] = color; @@ -5998,21 +5921,21 @@ static void raster_fastfill(void *destbase, INT32 y, const poly_extent *extent, generic_0tmu - generic rasterizer for 0 TMUs -------------------------------------------------*/ -RASTERIZER(generic_0tmu, 0, v->reg[fbzColorPath].u, v->reg[fbzMode].u, v->reg[alphaMode].u, - v->reg[fogMode].u, 0, 0) +RASTERIZER(generic_0tmu, 0, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, vd->reg[alphaMode].u, + vd->reg[fogMode].u, 0, 0) /*------------------------------------------------- generic_1tmu - generic rasterizer for 1 TMU -------------------------------------------------*/ -RASTERIZER(generic_1tmu, 1, v->reg[fbzColorPath].u, v->reg[fbzMode].u, v->reg[alphaMode].u, - v->reg[fogMode].u, v->tmu[0].reg[textureMode].u, 0) +RASTERIZER(generic_1tmu, 1, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, vd->reg[alphaMode].u, + vd->reg[fogMode].u, vd->tmu[0].reg[textureMode].u, 0) /*------------------------------------------------- generic_2tmu - generic rasterizer for 2 TMUs -------------------------------------------------*/ -RASTERIZER(generic_2tmu, 2, v->reg[fbzColorPath].u, v->reg[fbzMode].u, v->reg[alphaMode].u, - v->reg[fogMode].u, v->tmu[0].reg[textureMode].u, v->tmu[1].reg[textureMode].u) +RASTERIZER(generic_2tmu, 2, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, vd->reg[alphaMode].u, + vd->reg[fogMode].u, vd->tmu[0].reg[textureMode].u, vd->tmu[1].reg[textureMode].u) diff --git a/src/devices/video/voodoo.h b/src/devices/video/voodoo.h index 3d92f17f86a..1dc1a4a59ec 100644 --- a/src/devices/video/voodoo.h +++ b/src/devices/video/voodoo.h @@ -11,9 +11,1694 @@ #ifndef __VOODOO_H__ #define __VOODOO_H__ +#include "video/polylgcy.h" + #pragma once +/************************************* + * + * Misc. constants + * + *************************************/ + +/* enumeration describing reasons we might be stalled */ +enum +{ + NOT_STALLED = 0, + STALLED_UNTIL_FIFO_LWM, + STALLED_UNTIL_FIFO_EMPTY +}; + + + +// Use old table lookup versus straight double divide +#define USE_FAST_RECIP 0 + +/* maximum number of TMUs */ +#define MAX_TMU 2 + +/* accumulate operations less than this number of clocks */ +#define ACCUMULATE_THRESHOLD 0 + +/* number of clocks to set up a triangle (just a guess) */ +#define TRIANGLE_SETUP_CLOCKS 100 + +/* maximum number of rasterizers */ +#define MAX_RASTERIZERS 1024 + +/* size of the rasterizer hash table */ +#define RASTER_HASH_SIZE 97 + +/* flags for LFB writes */ +#define LFB_RGB_PRESENT 1 +#define LFB_ALPHA_PRESENT 2 +#define LFB_DEPTH_PRESENT 4 +#define LFB_DEPTH_PRESENT_MSW 8 + +/* flags for the register access array */ +#define REGISTER_READ 0x01 /* reads are allowed */ +#define REGISTER_WRITE 0x02 /* writes are allowed */ +#define REGISTER_PIPELINED 0x04 /* writes are pipelined */ +#define REGISTER_FIFO 0x08 /* writes go to FIFO */ +#define REGISTER_WRITETHRU 0x10 /* writes are valid even for CMDFIFO */ + +/* shorter combinations to make the table smaller */ +#define REG_R (REGISTER_READ) +#define REG_W (REGISTER_WRITE) +#define REG_WT (REGISTER_WRITE | REGISTER_WRITETHRU) +#define REG_RW (REGISTER_READ | REGISTER_WRITE) +#define REG_RWT (REGISTER_READ | REGISTER_WRITE | REGISTER_WRITETHRU) +#define REG_RP (REGISTER_READ | REGISTER_PIPELINED) +#define REG_WP (REGISTER_WRITE | REGISTER_PIPELINED) +#define REG_RWP (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED) +#define REG_RWPT (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_WRITETHRU) +#define REG_RF (REGISTER_READ | REGISTER_FIFO) +#define REG_WF (REGISTER_WRITE | REGISTER_FIFO) +#define REG_RWF (REGISTER_READ | REGISTER_WRITE | REGISTER_FIFO) +#define REG_RPF (REGISTER_READ | REGISTER_PIPELINED | REGISTER_FIFO) +#define REG_WPF (REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO) +#define REG_RWPF (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO) + +/* lookup bits is the log2 of the size of the reciprocal/log table */ +#define RECIPLOG_LOOKUP_BITS 9 + +/* input precision is how many fraction bits the input value has; this is a 64-bit number */ +#define RECIPLOG_INPUT_PREC 32 + +/* lookup precision is how many fraction bits each table entry contains */ +#define RECIPLOG_LOOKUP_PREC 22 + +/* output precision is how many fraction bits the result should have */ +#define RECIP_OUTPUT_PREC 15 +#define LOG_OUTPUT_PREC 8 + + + +/************************************* + * + * Register constants + * + *************************************/ + +/* Codes to the right: + R = readable + W = writeable + P = pipelined + F = goes to FIFO +*/ + +/* 0x000 */ +#define vdstatus (0x000/4) /* R P */ +#define intrCtrl (0x004/4) /* RW P -- Voodoo2/Banshee only */ +#define vertexAx (0x008/4) /* W PF */ +#define vertexAy (0x00c/4) /* W PF */ +#define vertexBx (0x010/4) /* W PF */ +#define vertexBy (0x014/4) /* W PF */ +#define vertexCx (0x018/4) /* W PF */ +#define vertexCy (0x01c/4) /* W PF */ +#define startR (0x020/4) /* W PF */ +#define startG (0x024/4) /* W PF */ +#define startB (0x028/4) /* W PF */ +#define startZ (0x02c/4) /* W PF */ +#define startA (0x030/4) /* W PF */ +#define startS (0x034/4) /* W PF */ +#define startT (0x038/4) /* W PF */ +#define startW (0x03c/4) /* W PF */ + +/* 0x040 */ +#define dRdX (0x040/4) /* W PF */ +#define dGdX (0x044/4) /* W PF */ +#define dBdX (0x048/4) /* W PF */ +#define dZdX (0x04c/4) /* W PF */ +#define dAdX (0x050/4) /* W PF */ +#define dSdX (0x054/4) /* W PF */ +#define dTdX (0x058/4) /* W PF */ +#define dWdX (0x05c/4) /* W PF */ +#define dRdY (0x060/4) /* W PF */ +#define dGdY (0x064/4) /* W PF */ +#define dBdY (0x068/4) /* W PF */ +#define dZdY (0x06c/4) /* W PF */ +#define dAdY (0x070/4) /* W PF */ +#define dSdY (0x074/4) /* W PF */ +#define dTdY (0x078/4) /* W PF */ +#define dWdY (0x07c/4) /* W PF */ + +/* 0x080 */ +#define triangleCMD (0x080/4) /* W PF */ +#define fvertexAx (0x088/4) /* W PF */ +#define fvertexAy (0x08c/4) /* W PF */ +#define fvertexBx (0x090/4) /* W PF */ +#define fvertexBy (0x094/4) /* W PF */ +#define fvertexCx (0x098/4) /* W PF */ +#define fvertexCy (0x09c/4) /* W PF */ +#define fstartR (0x0a0/4) /* W PF */ +#define fstartG (0x0a4/4) /* W PF */ +#define fstartB (0x0a8/4) /* W PF */ +#define fstartZ (0x0ac/4) /* W PF */ +#define fstartA (0x0b0/4) /* W PF */ +#define fstartS (0x0b4/4) /* W PF */ +#define fstartT (0x0b8/4) /* W PF */ +#define fstartW (0x0bc/4) /* W PF */ + +/* 0x0c0 */ +#define fdRdX (0x0c0/4) /* W PF */ +#define fdGdX (0x0c4/4) /* W PF */ +#define fdBdX (0x0c8/4) /* W PF */ +#define fdZdX (0x0cc/4) /* W PF */ +#define fdAdX (0x0d0/4) /* W PF */ +#define fdSdX (0x0d4/4) /* W PF */ +#define fdTdX (0x0d8/4) /* W PF */ +#define fdWdX (0x0dc/4) /* W PF */ +#define fdRdY (0x0e0/4) /* W PF */ +#define fdGdY (0x0e4/4) /* W PF */ +#define fdBdY (0x0e8/4) /* W PF */ +#define fdZdY (0x0ec/4) /* W PF */ +#define fdAdY (0x0f0/4) /* W PF */ +#define fdSdY (0x0f4/4) /* W PF */ +#define fdTdY (0x0f8/4) /* W PF */ +#define fdWdY (0x0fc/4) /* W PF */ + +/* 0x100 */ +#define ftriangleCMD (0x100/4) /* W PF */ +#define fbzColorPath (0x104/4) /* RW PF */ +#define fogMode (0x108/4) /* RW PF */ +#define alphaMode (0x10c/4) /* RW PF */ +#define fbzMode (0x110/4) /* RW F */ +#define lfbMode (0x114/4) /* RW F */ +#define clipLeftRight (0x118/4) /* RW F */ +#define clipLowYHighY (0x11c/4) /* RW F */ +#define nopCMD (0x120/4) /* W F */ +#define fastfillCMD (0x124/4) /* W F */ +#define swapbufferCMD (0x128/4) /* W F */ +#define fogColor (0x12c/4) /* W F */ +#define zaColor (0x130/4) /* W F */ +#define chromaKey (0x134/4) /* W F */ +#define chromaRange (0x138/4) /* W F -- Voodoo2/Banshee only */ +#define userIntrCMD (0x13c/4) /* W F -- Voodoo2/Banshee only */ + +/* 0x140 */ +#define stipple (0x140/4) /* RW F */ +#define color0 (0x144/4) /* RW F */ +#define color1 (0x148/4) /* RW F */ +#define fbiPixelsIn (0x14c/4) /* R */ +#define fbiChromaFail (0x150/4) /* R */ +#define fbiZfuncFail (0x154/4) /* R */ +#define fbiAfuncFail (0x158/4) /* R */ +#define fbiPixelsOut (0x15c/4) /* R */ +#define fogTable (0x160/4) /* W F */ + +/* 0x1c0 */ +#define cmdFifoBaseAddr (0x1e0/4) /* RW -- Voodoo2 only */ +#define cmdFifoBump (0x1e4/4) /* RW -- Voodoo2 only */ +#define cmdFifoRdPtr (0x1e8/4) /* RW -- Voodoo2 only */ +#define cmdFifoAMin (0x1ec/4) /* RW -- Voodoo2 only */ +#define colBufferAddr (0x1ec/4) /* RW -- Banshee only */ +#define cmdFifoAMax (0x1f0/4) /* RW -- Voodoo2 only */ +#define colBufferStride (0x1f0/4) /* RW -- Banshee only */ +#define cmdFifoDepth (0x1f4/4) /* RW -- Voodoo2 only */ +#define auxBufferAddr (0x1f4/4) /* RW -- Banshee only */ +#define cmdFifoHoles (0x1f8/4) /* RW -- Voodoo2 only */ +#define auxBufferStride (0x1f8/4) /* RW -- Banshee only */ + +/* 0x200 */ +#define fbiInit4 (0x200/4) /* RW -- Voodoo/Voodoo2 only */ +#define clipLeftRight1 (0x200/4) /* RW -- Banshee only */ +#define vRetrace (0x204/4) /* R -- Voodoo/Voodoo2 only */ +#define clipTopBottom1 (0x204/4) /* RW -- Banshee only */ +#define backPorch (0x208/4) /* RW -- Voodoo/Voodoo2 only */ +#define videoDimensions (0x20c/4) /* RW -- Voodoo/Voodoo2 only */ +#define fbiInit0 (0x210/4) /* RW -- Voodoo/Voodoo2 only */ +#define fbiInit1 (0x214/4) /* RW -- Voodoo/Voodoo2 only */ +#define fbiInit2 (0x218/4) /* RW -- Voodoo/Voodoo2 only */ +#define fbiInit3 (0x21c/4) /* RW -- Voodoo/Voodoo2 only */ +#define hSync (0x220/4) /* W -- Voodoo/Voodoo2 only */ +#define vSync (0x224/4) /* W -- Voodoo/Voodoo2 only */ +#define clutData (0x228/4) /* W F -- Voodoo/Voodoo2 only */ +#define dacData (0x22c/4) /* W -- Voodoo/Voodoo2 only */ +#define maxRgbDelta (0x230/4) /* W -- Voodoo/Voodoo2 only */ +#define hBorder (0x234/4) /* W -- Voodoo2 only */ +#define vBorder (0x238/4) /* W -- Voodoo2 only */ +#define borderColor (0x23c/4) /* W -- Voodoo2 only */ + +/* 0x240 */ +#define hvRetrace (0x240/4) /* R -- Voodoo2 only */ +#define fbiInit5 (0x244/4) /* RW -- Voodoo2 only */ +#define fbiInit6 (0x248/4) /* RW -- Voodoo2 only */ +#define fbiInit7 (0x24c/4) /* RW -- Voodoo2 only */ +#define swapPending (0x24c/4) /* W -- Banshee only */ +#define leftOverlayBuf (0x250/4) /* W -- Banshee only */ +#define rightOverlayBuf (0x254/4) /* W -- Banshee only */ +#define fbiSwapHistory (0x258/4) /* R -- Voodoo2/Banshee only */ +#define fbiTrianglesOut (0x25c/4) /* R -- Voodoo2/Banshee only */ +#define sSetupMode (0x260/4) /* W PF -- Voodoo2/Banshee only */ +#define sVx (0x264/4) /* W PF -- Voodoo2/Banshee only */ +#define sVy (0x268/4) /* W PF -- Voodoo2/Banshee only */ +#define sARGB (0x26c/4) /* W PF -- Voodoo2/Banshee only */ +#define sRed (0x270/4) /* W PF -- Voodoo2/Banshee only */ +#define sGreen (0x274/4) /* W PF -- Voodoo2/Banshee only */ +#define sBlue (0x278/4) /* W PF -- Voodoo2/Banshee only */ +#define sAlpha (0x27c/4) /* W PF -- Voodoo2/Banshee only */ + +/* 0x280 */ +#define sVz (0x280/4) /* W PF -- Voodoo2/Banshee only */ +#define sWb (0x284/4) /* W PF -- Voodoo2/Banshee only */ +#define sWtmu0 (0x288/4) /* W PF -- Voodoo2/Banshee only */ +#define sS_W0 (0x28c/4) /* W PF -- Voodoo2/Banshee only */ +#define sT_W0 (0x290/4) /* W PF -- Voodoo2/Banshee only */ +#define sWtmu1 (0x294/4) /* W PF -- Voodoo2/Banshee only */ +#define sS_Wtmu1 (0x298/4) /* W PF -- Voodoo2/Banshee only */ +#define sT_Wtmu1 (0x29c/4) /* W PF -- Voodoo2/Banshee only */ +#define sDrawTriCMD (0x2a0/4) /* W PF -- Voodoo2/Banshee only */ +#define sBeginTriCMD (0x2a4/4) /* W PF -- Voodoo2/Banshee only */ + +/* 0x2c0 */ +#define bltSrcBaseAddr (0x2c0/4) /* RW PF -- Voodoo2 only */ +#define bltDstBaseAddr (0x2c4/4) /* RW PF -- Voodoo2 only */ +#define bltXYStrides (0x2c8/4) /* RW PF -- Voodoo2 only */ +#define bltSrcChromaRange (0x2cc/4) /* RW PF -- Voodoo2 only */ +#define bltDstChromaRange (0x2d0/4) /* RW PF -- Voodoo2 only */ +#define bltClipX (0x2d4/4) /* RW PF -- Voodoo2 only */ +#define bltClipY (0x2d8/4) /* RW PF -- Voodoo2 only */ +#define bltSrcXY (0x2e0/4) /* RW PF -- Voodoo2 only */ +#define bltDstXY (0x2e4/4) /* RW PF -- Voodoo2 only */ +#define bltSize (0x2e8/4) /* RW PF -- Voodoo2 only */ +#define bltRop (0x2ec/4) /* RW PF -- Voodoo2 only */ +#define bltColor (0x2f0/4) /* RW PF -- Voodoo2 only */ +#define bltCommand (0x2f8/4) /* RW PF -- Voodoo2 only */ +#define bltData (0x2fc/4) /* W PF -- Voodoo2 only */ + +/* 0x300 */ +#define textureMode (0x300/4) /* W PF */ +#define tLOD (0x304/4) /* W PF */ +#define tDetail (0x308/4) /* W PF */ +#define texBaseAddr (0x30c/4) /* W PF */ +#define texBaseAddr_1 (0x310/4) /* W PF */ +#define texBaseAddr_2 (0x314/4) /* W PF */ +#define texBaseAddr_3_8 (0x318/4) /* W PF */ +#define trexInit0 (0x31c/4) /* W F -- Voodoo/Voodoo2 only */ +#define trexInit1 (0x320/4) /* W F */ +#define nccTable (0x324/4) /* W F */ + + + +// 2D registers +#define banshee2D_clip0Min (0x008/4) +#define banshee2D_clip0Max (0x00c/4) +#define banshee2D_dstBaseAddr (0x010/4) +#define banshee2D_dstFormat (0x014/4) +#define banshee2D_srcColorkeyMin (0x018/4) +#define banshee2D_srcColorkeyMax (0x01c/4) +#define banshee2D_dstColorkeyMin (0x020/4) +#define banshee2D_dstColorkeyMax (0x024/4) +#define banshee2D_bresError0 (0x028/4) +#define banshee2D_bresError1 (0x02c/4) +#define banshee2D_rop (0x030/4) +#define banshee2D_srcBaseAddr (0x034/4) +#define banshee2D_commandExtra (0x038/4) +#define banshee2D_lineStipple (0x03c/4) +#define banshee2D_lineStyle (0x040/4) +#define banshee2D_pattern0Alias (0x044/4) +#define banshee2D_pattern1Alias (0x048/4) +#define banshee2D_clip1Min (0x04c/4) +#define banshee2D_clip1Max (0x050/4) +#define banshee2D_srcFormat (0x054/4) +#define banshee2D_srcSize (0x058/4) +#define banshee2D_srcXY (0x05c/4) +#define banshee2D_colorBack (0x060/4) +#define banshee2D_colorFore (0x064/4) +#define banshee2D_dstSize (0x068/4) +#define banshee2D_dstXY (0x06c/4) +#define banshee2D_command (0x070/4) + + +/************************************* + * + * Alias map of the first 64 + * registers when remapped + * + *************************************/ + +static const UINT8 register_alias_map[0x40] = +{ + vdstatus, 0x004/4, vertexAx, vertexAy, + vertexBx, vertexBy, vertexCx, vertexCy, + startR, dRdX, dRdY, startG, + dGdX, dGdY, startB, dBdX, + dBdY, startZ, dZdX, dZdY, + startA, dAdX, dAdY, startS, + dSdX, dSdY, startT, dTdX, + dTdY, startW, dWdX, dWdY, + + triangleCMD,0x084/4, fvertexAx, fvertexAy, + fvertexBx, fvertexBy, fvertexCx, fvertexCy, + fstartR, fdRdX, fdRdY, fstartG, + fdGdX, fdGdY, fstartB, fdBdX, + fdBdY, fstartZ, fdZdX, fdZdY, + fstartA, fdAdX, fdAdY, fstartS, + fdSdX, fdSdY, fstartT, fdTdX, + fdTdY, fstartW, fdWdX, fdWdY +}; + + + +/************************************* + * + * Table of per-register access rights + * + *************************************/ + +static const UINT8 voodoo_register_access[0x100] = +{ + /* 0x000 */ + REG_RP, 0, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x040 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x080 */ + REG_WPF, 0, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x0c0 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x100 */ + REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWF, REG_RWF, REG_RWF, REG_RWF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, 0, 0, + + /* 0x140 */ + REG_RWF, REG_RWF, REG_RWF, REG_R, + REG_R, REG_R, REG_R, REG_R, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x180 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x1c0 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x200 */ + REG_RW, REG_R, REG_RW, REG_RW, + REG_RW, REG_RW, REG_RW, REG_RW, + REG_W, REG_W, REG_W, REG_W, + REG_W, 0, 0, 0, + + /* 0x240 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x280 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x2c0 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x300 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x340 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x380 */ + REG_WF +}; + + +static const UINT8 voodoo2_register_access[0x100] = +{ + /* 0x000 */ + REG_RP, REG_RWPT, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x040 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x080 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x0c0 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x100 */ + REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWF, REG_RWF, REG_RWF, REG_RWF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x140 */ + REG_RWF, REG_RWF, REG_RWF, REG_R, + REG_R, REG_R, REG_R, REG_R, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x180 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x1c0 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_RWT, REG_RWT, REG_RWT, REG_RWT, + REG_RWT, REG_RWT, REG_RWT, REG_RW, + + /* 0x200 */ + REG_RWT, REG_R, REG_RWT, REG_RWT, + REG_RWT, REG_RWT, REG_RWT, REG_RWT, + REG_WT, REG_WT, REG_WF, REG_WT, + REG_WT, REG_WT, REG_WT, REG_WT, + + /* 0x240 */ + REG_R, REG_RWT, REG_RWT, REG_RWT, + 0, 0, REG_R, REG_R, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x280 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, 0, 0, + 0, 0, 0, 0, + + /* 0x2c0 */ + REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWPF, REG_RWPF, REG_RWPF, REG_WPF, + + /* 0x300 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x340 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x380 */ + REG_WF +}; + + +static const UINT8 banshee_register_access[0x100] = +{ + /* 0x000 */ + REG_RP, REG_RWPT, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x040 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x080 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x0c0 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x100 */ + REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWF, REG_RWF, REG_RWF, REG_RWF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x140 */ + REG_RWF, REG_RWF, REG_RWF, REG_R, + REG_R, REG_R, REG_R, REG_R, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x180 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x1c0 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + 0, 0, 0, REG_RWF, + REG_RWF, REG_RWF, REG_RWF, 0, + + /* 0x200 */ + REG_RWF, REG_RWF, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x240 */ + 0, 0, 0, REG_WT, + REG_RWF, REG_RWF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_R, REG_R, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x280 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, 0, 0, + 0, 0, 0, 0, + + /* 0x2c0 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x300 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, 0, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x340 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x380 */ + REG_WF +}; + + + +/************************************* + * + * Register string table for debug + * + *************************************/ + +static const char *const voodoo_reg_name[] = +{ + /* 0x000 */ + "status", "{intrCtrl}", "vertexAx", "vertexAy", + "vertexBx", "vertexBy", "vertexCx", "vertexCy", + "startR", "startG", "startB", "startZ", + "startA", "startS", "startT", "startW", + /* 0x040 */ + "dRdX", "dGdX", "dBdX", "dZdX", + "dAdX", "dSdX", "dTdX", "dWdX", + "dRdY", "dGdY", "dBdY", "dZdY", + "dAdY", "dSdY", "dTdY", "dWdY", + /* 0x080 */ + "triangleCMD", "reserved084", "fvertexAx", "fvertexAy", + "fvertexBx", "fvertexBy", "fvertexCx", "fvertexCy", + "fstartR", "fstartG", "fstartB", "fstartZ", + "fstartA", "fstartS", "fstartT", "fstartW", + /* 0x0c0 */ + "fdRdX", "fdGdX", "fdBdX", "fdZdX", + "fdAdX", "fdSdX", "fdTdX", "fdWdX", + "fdRdY", "fdGdY", "fdBdY", "fdZdY", + "fdAdY", "fdSdY", "fdTdY", "fdWdY", + /* 0x100 */ + "ftriangleCMD", "fbzColorPath", "fogMode", "alphaMode", + "fbzMode", "lfbMode", "clipLeftRight","clipLowYHighY", + "nopCMD", "fastfillCMD", "swapbufferCMD","fogColor", + "zaColor", "chromaKey", "{chromaRange}","{userIntrCMD}", + /* 0x140 */ + "stipple", "color0", "color1", "fbiPixelsIn", + "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut", + "fogTable160", "fogTable164", "fogTable168", "fogTable16c", + "fogTable170", "fogTable174", "fogTable178", "fogTable17c", + /* 0x180 */ + "fogTable180", "fogTable184", "fogTable188", "fogTable18c", + "fogTable190", "fogTable194", "fogTable198", "fogTable19c", + "fogTable1a0", "fogTable1a4", "fogTable1a8", "fogTable1ac", + "fogTable1b0", "fogTable1b4", "fogTable1b8", "fogTable1bc", + /* 0x1c0 */ + "fogTable1c0", "fogTable1c4", "fogTable1c8", "fogTable1cc", + "fogTable1d0", "fogTable1d4", "fogTable1d8", "fogTable1dc", + "{cmdFifoBaseAddr}","{cmdFifoBump}","{cmdFifoRdPtr}","{cmdFifoAMin}", + "{cmdFifoAMax}","{cmdFifoDepth}","{cmdFifoHoles}","reserved1fc", + /* 0x200 */ + "fbiInit4", "vRetrace", "backPorch", "videoDimensions", + "fbiInit0", "fbiInit1", "fbiInit2", "fbiInit3", + "hSync", "vSync", "clutData", "dacData", + "maxRgbDelta", "{hBorder}", "{vBorder}", "{borderColor}", + /* 0x240 */ + "{hvRetrace}", "{fbiInit5}", "{fbiInit6}", "{fbiInit7}", + "reserved250", "reserved254", "{fbiSwapHistory}","{fbiTrianglesOut}", + "{sSetupMode}", "{sVx}", "{sVy}", "{sARGB}", + "{sRed}", "{sGreen}", "{sBlue}", "{sAlpha}", + /* 0x280 */ + "{sVz}", "{sWb}", "{sWtmu0}", "{sS/Wtmu0}", + "{sT/Wtmu0}", "{sWtmu1}", "{sS/Wtmu1}", "{sT/Wtmu1}", + "{sDrawTriCMD}","{sBeginTriCMD}","reserved2a8", "reserved2ac", + "reserved2b0", "reserved2b4", "reserved2b8", "reserved2bc", + /* 0x2c0 */ + "{bltSrcBaseAddr}","{bltDstBaseAddr}","{bltXYStrides}","{bltSrcChromaRange}", + "{bltDstChromaRange}","{bltClipX}","{bltClipY}","reserved2dc", + "{bltSrcXY}", "{bltDstXY}", "{bltSize}", "{bltRop}", + "{bltColor}", "reserved2f4", "{bltCommand}", "{bltData}", + /* 0x300 */ + "textureMode", "tLOD", "tDetail", "texBaseAddr", + "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","trexInit0", + "trexInit1", "nccTable0.0", "nccTable0.1", "nccTable0.2", + "nccTable0.3", "nccTable0.4", "nccTable0.5", "nccTable0.6", + /* 0x340 */ + "nccTable0.7", "nccTable0.8", "nccTable0.9", "nccTable0.A", + "nccTable0.B", "nccTable1.0", "nccTable1.1", "nccTable1.2", + "nccTable1.3", "nccTable1.4", "nccTable1.5", "nccTable1.6", + "nccTable1.7", "nccTable1.8", "nccTable1.9", "nccTable1.A", + /* 0x380 */ + "nccTable1.B" +}; + + +static const char *const banshee_reg_name[] = +{ + /* 0x000 */ + "status", "intrCtrl", "vertexAx", "vertexAy", + "vertexBx", "vertexBy", "vertexCx", "vertexCy", + "startR", "startG", "startB", "startZ", + "startA", "startS", "startT", "startW", + /* 0x040 */ + "dRdX", "dGdX", "dBdX", "dZdX", + "dAdX", "dSdX", "dTdX", "dWdX", + "dRdY", "dGdY", "dBdY", "dZdY", + "dAdY", "dSdY", "dTdY", "dWdY", + /* 0x080 */ + "triangleCMD", "reserved084", "fvertexAx", "fvertexAy", + "fvertexBx", "fvertexBy", "fvertexCx", "fvertexCy", + "fstartR", "fstartG", "fstartB", "fstartZ", + "fstartA", "fstartS", "fstartT", "fstartW", + /* 0x0c0 */ + "fdRdX", "fdGdX", "fdBdX", "fdZdX", + "fdAdX", "fdSdX", "fdTdX", "fdWdX", + "fdRdY", "fdGdY", "fdBdY", "fdZdY", + "fdAdY", "fdSdY", "fdTdY", "fdWdY", + /* 0x100 */ + "ftriangleCMD", "fbzColorPath", "fogMode", "alphaMode", + "fbzMode", "lfbMode", "clipLeftRight","clipLowYHighY", + "nopCMD", "fastfillCMD", "swapbufferCMD","fogColor", + "zaColor", "chromaKey", "chromaRange", "userIntrCMD", + /* 0x140 */ + "stipple", "color0", "color1", "fbiPixelsIn", + "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut", + "fogTable160", "fogTable164", "fogTable168", "fogTable16c", + "fogTable170", "fogTable174", "fogTable178", "fogTable17c", + /* 0x180 */ + "fogTable180", "fogTable184", "fogTable188", "fogTable18c", + "fogTable190", "fogTable194", "fogTable198", "fogTable19c", + "fogTable1a0", "fogTable1a4", "fogTable1a8", "fogTable1ac", + "fogTable1b0", "fogTable1b4", "fogTable1b8", "fogTable1bc", + /* 0x1c0 */ + "fogTable1c0", "fogTable1c4", "fogTable1c8", "fogTable1cc", + "fogTable1d0", "fogTable1d4", "fogTable1d8", "fogTable1dc", + "reserved1e0", "reserved1e4", "reserved1e8", "colBufferAddr", + "colBufferStride","auxBufferAddr","auxBufferStride","reserved1fc", + /* 0x200 */ + "clipLeftRight1","clipTopBottom1","reserved208","reserved20c", + "reserved210", "reserved214", "reserved218", "reserved21c", + "reserved220", "reserved224", "reserved228", "reserved22c", + "reserved230", "reserved234", "reserved238", "reserved23c", + /* 0x240 */ + "reserved240", "reserved244", "reserved248", "swapPending", + "leftOverlayBuf","rightOverlayBuf","fbiSwapHistory","fbiTrianglesOut", + "sSetupMode", "sVx", "sVy", "sARGB", + "sRed", "sGreen", "sBlue", "sAlpha", + /* 0x280 */ + "sVz", "sWb", "sWtmu0", "sS/Wtmu0", + "sT/Wtmu0", "sWtmu1", "sS/Wtmu1", "sT/Wtmu1", + "sDrawTriCMD", "sBeginTriCMD", "reserved2a8", "reserved2ac", + "reserved2b0", "reserved2b4", "reserved2b8", "reserved2bc", + /* 0x2c0 */ + "reserved2c0", "reserved2c4", "reserved2c8", "reserved2cc", + "reserved2d0", "reserved2d4", "reserved2d8", "reserved2dc", + "reserved2e0", "reserved2e4", "reserved2e8", "reserved2ec", + "reserved2f0", "reserved2f4", "reserved2f8", "reserved2fc", + /* 0x300 */ + "textureMode", "tLOD", "tDetail", "texBaseAddr", + "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","reserved31c", + "trexInit1", "nccTable0.0", "nccTable0.1", "nccTable0.2", + "nccTable0.3", "nccTable0.4", "nccTable0.5", "nccTable0.6", + /* 0x340 */ + "nccTable0.7", "nccTable0.8", "nccTable0.9", "nccTable0.A", + "nccTable0.B", "nccTable1.0", "nccTable1.1", "nccTable1.2", + "nccTable1.3", "nccTable1.4", "nccTable1.5", "nccTable1.6", + "nccTable1.7", "nccTable1.8", "nccTable1.9", "nccTable1.A", + /* 0x380 */ + "nccTable1.B" +}; + + + +/************************************* + * + * Voodoo Banshee I/O space registers + * + *************************************/ + +/* 0x000 */ +#define io_status (0x000/4) /* */ +#define io_pciInit0 (0x004/4) /* */ +#define io_sipMonitor (0x008/4) /* */ +#define io_lfbMemoryConfig (0x00c/4) /* */ +#define io_miscInit0 (0x010/4) /* */ +#define io_miscInit1 (0x014/4) /* */ +#define io_dramInit0 (0x018/4) /* */ +#define io_dramInit1 (0x01c/4) /* */ +#define io_agpInit (0x020/4) /* */ +#define io_tmuGbeInit (0x024/4) /* */ +#define io_vgaInit0 (0x028/4) /* */ +#define io_vgaInit1 (0x02c/4) /* */ +#define io_dramCommand (0x030/4) /* */ +#define io_dramData (0x034/4) /* */ + +/* 0x040 */ +#define io_pllCtrl0 (0x040/4) /* */ +#define io_pllCtrl1 (0x044/4) /* */ +#define io_pllCtrl2 (0x048/4) /* */ +#define io_dacMode (0x04c/4) /* */ +#define io_dacAddr (0x050/4) /* */ +#define io_dacData (0x054/4) /* */ +#define io_rgbMaxDelta (0x058/4) /* */ +#define io_vidProcCfg (0x05c/4) /* */ +#define io_hwCurPatAddr (0x060/4) /* */ +#define io_hwCurLoc (0x064/4) /* */ +#define io_hwCurC0 (0x068/4) /* */ +#define io_hwCurC1 (0x06c/4) /* */ +#define io_vidInFormat (0x070/4) /* */ +#define io_vidInStatus (0x074/4) /* */ +#define io_vidSerialParallelPort (0x078/4) /* */ +#define io_vidInXDecimDeltas (0x07c/4) /* */ + +/* 0x080 */ +#define io_vidInDecimInitErrs (0x080/4) /* */ +#define io_vidInYDecimDeltas (0x084/4) /* */ +#define io_vidPixelBufThold (0x088/4) /* */ +#define io_vidChromaMin (0x08c/4) /* */ +#define io_vidChromaMax (0x090/4) /* */ +#define io_vidCurrentLine (0x094/4) /* */ +#define io_vidScreenSize (0x098/4) /* */ +#define io_vidOverlayStartCoords (0x09c/4) /* */ +#define io_vidOverlayEndScreenCoord (0x0a0/4) /* */ +#define io_vidOverlayDudx (0x0a4/4) /* */ +#define io_vidOverlayDudxOffsetSrcWidth (0x0a8/4) /* */ +#define io_vidOverlayDvdy (0x0ac/4) /* */ +#define io_vgab0 (0x0b0/4) /* */ +#define io_vgab4 (0x0b4/4) /* */ +#define io_vgab8 (0x0b8/4) /* */ +#define io_vgabc (0x0bc/4) /* */ + +/* 0x0c0 */ +#define io_vgac0 (0x0c0/4) /* */ +#define io_vgac4 (0x0c4/4) /* */ +#define io_vgac8 (0x0c8/4) /* */ +#define io_vgacc (0x0cc/4) /* */ +#define io_vgad0 (0x0d0/4) /* */ +#define io_vgad4 (0x0d4/4) /* */ +#define io_vgad8 (0x0d8/4) /* */ +#define io_vgadc (0x0dc/4) /* */ +#define io_vidOverlayDvdyOffset (0x0e0/4) /* */ +#define io_vidDesktopStartAddr (0x0e4/4) /* */ +#define io_vidDesktopOverlayStride (0x0e8/4) /* */ +#define io_vidInAddr0 (0x0ec/4) /* */ +#define io_vidInAddr1 (0x0f0/4) /* */ +#define io_vidInAddr2 (0x0f4/4) /* */ +#define io_vidInStride (0x0f8/4) /* */ +#define io_vidCurrOverlayStartAddr (0x0fc/4) /* */ + + + +/************************************* + * + * Register string table for debug + * + *************************************/ + +static const char *const banshee_io_reg_name[] = +{ + /* 0x000 */ + "status", "pciInit0", "sipMonitor", "lfbMemoryConfig", + "miscInit0", "miscInit1", "dramInit0", "dramInit1", + "agpInit", "tmuGbeInit", "vgaInit0", "vgaInit1", + "dramCommand", "dramData", "reserved38", "reserved3c", + + /* 0x040 */ + "pllCtrl0", "pllCtrl1", "pllCtrl2", "dacMode", + "dacAddr", "dacData", "rgbMaxDelta", "vidProcCfg", + "hwCurPatAddr", "hwCurLoc", "hwCurC0", "hwCurC1", + "vidInFormat", "vidInStatus", "vidSerialParallelPort","vidInXDecimDeltas", + + /* 0x080 */ + "vidInDecimInitErrs","vidInYDecimDeltas","vidPixelBufThold","vidChromaMin", + "vidChromaMax", "vidCurrentLine","vidScreenSize","vidOverlayStartCoords", + "vidOverlayEndScreenCoord","vidOverlayDudx","vidOverlayDudxOffsetSrcWidth","vidOverlayDvdy", + "vga[b0]", "vga[b4]", "vga[b8]", "vga[bc]", + + /* 0x0c0 */ + "vga[c0]", "vga[c4]", "vga[c8]", "vga[cc]", + "vga[d0]", "vga[d4]", "vga[d8]", "vga[dc]", + "vidOverlayDvdyOffset","vidDesktopStartAddr","vidDesktopOverlayStride","vidInAddr0", + "vidInAddr1", "vidInAddr2", "vidInStride", "vidCurrOverlayStartAddr" +}; + + + +/************************************* + * + * Voodoo Banshee AGP space registers + * + *************************************/ + +/* 0x000 */ +#define agpReqSize (0x000/4) /* */ +#define agpHostAddressLow (0x004/4) /* */ +#define agpHostAddressHigh (0x008/4) /* */ +#define agpGraphicsAddress (0x00c/4) /* */ +#define agpGraphicsStride (0x010/4) /* */ +#define agpMoveCMD (0x014/4) /* */ +#define cmdBaseAddr0 (0x020/4) /* */ +#define cmdBaseSize0 (0x024/4) /* */ +#define cmdBump0 (0x028/4) /* */ +#define cmdRdPtrL0 (0x02c/4) /* */ +#define cmdRdPtrH0 (0x030/4) /* */ +#define cmdAMin0 (0x034/4) /* */ +#define cmdAMax0 (0x03c/4) /* */ + +/* 0x040 */ +#define cmdFifoDepth0 (0x044/4) /* */ +#define cmdHoleCnt0 (0x048/4) /* */ +#define cmdBaseAddr1 (0x050/4) /* */ +#define cmdBaseSize1 (0x054/4) /* */ +#define cmdBump1 (0x058/4) /* */ +#define cmdRdPtrL1 (0x05c/4) /* */ +#define cmdRdPtrH1 (0x060/4) /* */ +#define cmdAMin1 (0x064/4) /* */ +#define cmdAMax1 (0x06c/4) /* */ +#define cmdFifoDepth1 (0x074/4) /* */ +#define cmdHoleCnt1 (0x078/4) /* */ + +/* 0x080 */ +#define cmdFifoThresh (0x080/4) /* */ +#define cmdHoleInt (0x084/4) /* */ + +/* 0x100 */ +#define yuvBaseAddress (0x100/4) /* */ +#define yuvStride (0x104/4) /* */ +#define crc1 (0x120/4) /* */ +#define crc2 (0x130/4) /* */ + + + +/************************************* + * + * Register string table for debug + * + *************************************/ + +static const char *const banshee_agp_reg_name[] = +{ + /* 0x000 */ + "agpReqSize", "agpHostAddressLow","agpHostAddressHigh","agpGraphicsAddress", + "agpGraphicsStride","agpMoveCMD","reserved18", "reserved1c", + "cmdBaseAddr0", "cmdBaseSize0", "cmdBump0", "cmdRdPtrL0", + "cmdRdPtrH0", "cmdAMin0", "reserved38", "cmdAMax0", + + /* 0x040 */ + "reserved40", "cmdFifoDepth0","cmdHoleCnt0", "reserved4c", + "cmdBaseAddr1", "cmdBaseSize1", "cmdBump1", "cmdRdPtrL1", + "cmdRdPtrH1", "cmdAMin1", "reserved68", "cmdAMax1", + "reserved70", "cmdFifoDepth1","cmdHoleCnt1", "reserved7c", + + /* 0x080 */ + "cmdFifoThresh","cmdHoleInt", "reserved88", "reserved8c", + "reserved90", "reserved94", "reserved98", "reserved9c", + "reserveda0", "reserveda4", "reserveda8", "reservedac", + "reservedb0", "reservedb4", "reservedb8", "reservedbc", + + /* 0x0c0 */ + "reservedc0", "reservedc4", "reservedc8", "reservedcc", + "reservedd0", "reservedd4", "reservedd8", "reserveddc", + "reservede0", "reservede4", "reservede8", "reservedec", + "reservedf0", "reservedf4", "reservedf8", "reservedfc", + + /* 0x100 */ + "yuvBaseAddress","yuvStride", "reserved108", "reserved10c", + "reserved110", "reserved114", "reserved118", "reserved11c", + "crc1", "reserved124", "reserved128", "reserved12c", + "crc2", "reserved134", "reserved138", "reserved13c" +}; + + + +/************************************* + * + * Dithering tables + * + *************************************/ + +static const UINT8 dither_matrix_4x4[16] = +{ + 0, 8, 2, 10, + 12, 4, 14, 6, + 3, 11, 1, 9, + 15, 7, 13, 5 +}; + +static const UINT8 dither_matrix_2x2[16] = +{ + 2, 10, 2, 10, + 14, 6, 14, 6, + 2, 10, 2, 10, + 14, 6, 14, 6 +}; + + + +/************************************* + * + * Macros for extracting pixels + * + *************************************/ + +#define EXTRACT_565_TO_888(val, a, b, c) \ + (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07); \ + (b) = (((val) >> 3) & 0xfc) | (((val) >> 9) & 0x03); \ + (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07); +#define EXTRACT_x555_TO_888(val, a, b, c) \ + (a) = (((val) >> 7) & 0xf8) | (((val) >> 12) & 0x07); \ + (b) = (((val) >> 2) & 0xf8) | (((val) >> 7) & 0x07); \ + (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07); +#define EXTRACT_555x_TO_888(val, a, b, c) \ + (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07); \ + (b) = (((val) >> 3) & 0xf8) | (((val) >> 8) & 0x07); \ + (c) = (((val) << 2) & 0xf8) | (((val) >> 3) & 0x07); +#define EXTRACT_1555_TO_8888(val, a, b, c, d) \ + (a) = ((INT16)(val) >> 15) & 0xff; \ + EXTRACT_x555_TO_888(val, b, c, d) +#define EXTRACT_5551_TO_8888(val, a, b, c, d) \ + EXTRACT_555x_TO_888(val, a, b, c) \ + (d) = ((val) & 0x0001) ? 0xff : 0x00; +#define EXTRACT_x888_TO_888(val, a, b, c) \ + (a) = ((val) >> 16) & 0xff; \ + (b) = ((val) >> 8) & 0xff; \ + (c) = ((val) >> 0) & 0xff; +#define EXTRACT_888x_TO_888(val, a, b, c) \ + (a) = ((val) >> 24) & 0xff; \ + (b) = ((val) >> 16) & 0xff; \ + (c) = ((val) >> 8) & 0xff; +#define EXTRACT_8888_TO_8888(val, a, b, c, d) \ + (a) = ((val) >> 24) & 0xff; \ + (b) = ((val) >> 16) & 0xff; \ + (c) = ((val) >> 8) & 0xff; \ + (d) = ((val) >> 0) & 0xff; +#define EXTRACT_4444_TO_8888(val, a, b, c, d) \ + (a) = (((val) >> 8) & 0xf0) | (((val) >> 12) & 0x0f); \ + (b) = (((val) >> 4) & 0xf0) | (((val) >> 8) & 0x0f); \ + (c) = (((val) >> 0) & 0xf0) | (((val) >> 4) & 0x0f); \ + (d) = (((val) << 4) & 0xf0) | (((val) >> 0) & 0x0f); +#define EXTRACT_332_TO_888(val, a, b, c) \ + (a) = (((val) >> 0) & 0xe0) | (((val) >> 3) & 0x1c) | (((val) >> 6) & 0x03); \ + (b) = (((val) << 3) & 0xe0) | (((val) >> 0) & 0x1c) | (((val) >> 3) & 0x03); \ + (c) = (((val) << 6) & 0xc0) | (((val) << 4) & 0x30) | (((val) << 2) & 0x0c) | (((val) << 0) & 0x03); + + +/************************************* + * + * Misc. macros + * + *************************************/ + +/* macro for clamping a value between minimum and maximum values */ +#define CLAMP(val,min,max) do { if ((val) < (min)) { (val) = (min); } else if ((val) > (max)) { (val) = (max); } } while (0) + +/* macro to compute the base 2 log for LOD calculations */ +#define LOGB2(x) (log((double)(x)) / log(2.0)) + + + +/************************************* + * + * Macros for extracting bitfields + * + *************************************/ + +#define INITEN_ENABLE_HW_INIT(val) (((val) >> 0) & 1) +#define INITEN_ENABLE_PCI_FIFO(val) (((val) >> 1) & 1) +#define INITEN_REMAP_INIT_TO_DAC(val) (((val) >> 2) & 1) +#define INITEN_ENABLE_SNOOP0(val) (((val) >> 4) & 1) +#define INITEN_SNOOP0_MEMORY_MATCH(val) (((val) >> 5) & 1) +#define INITEN_SNOOP0_READWRITE_MATCH(val) (((val) >> 6) & 1) +#define INITEN_ENABLE_SNOOP1(val) (((val) >> 7) & 1) +#define INITEN_SNOOP1_MEMORY_MATCH(val) (((val) >> 8) & 1) +#define INITEN_SNOOP1_READWRITE_MATCH(val) (((val) >> 9) & 1) +#define INITEN_SLI_BUS_OWNER(val) (((val) >> 10) & 1) +#define INITEN_SLI_ODD_EVEN(val) (((val) >> 11) & 1) +#define INITEN_SECONDARY_REV_ID(val) (((val) >> 12) & 0xf) /* voodoo 2 only */ +#define INITEN_MFCTR_FAB_ID(val) (((val) >> 16) & 0xf) /* voodoo 2 only */ +#define INITEN_ENABLE_PCI_INTERRUPT(val) (((val) >> 20) & 1) /* voodoo 2 only */ +#define INITEN_PCI_INTERRUPT_TIMEOUT(val) (((val) >> 21) & 1) /* voodoo 2 only */ +#define INITEN_ENABLE_NAND_TREE_TEST(val) (((val) >> 22) & 1) /* voodoo 2 only */ +#define INITEN_ENABLE_SLI_ADDRESS_SNOOP(val) (((val) >> 23) & 1) /* voodoo 2 only */ +#define INITEN_SLI_SNOOP_ADDRESS(val) (((val) >> 24) & 0xff) /* voodoo 2 only */ + +#define FBZCP_CC_RGBSELECT(val) (((val) >> 0) & 3) +#define FBZCP_CC_ASELECT(val) (((val) >> 2) & 3) +#define FBZCP_CC_LOCALSELECT(val) (((val) >> 4) & 1) +#define FBZCP_CCA_LOCALSELECT(val) (((val) >> 5) & 3) +#define FBZCP_CC_LOCALSELECT_OVERRIDE(val) (((val) >> 7) & 1) +#define FBZCP_CC_ZERO_OTHER(val) (((val) >> 8) & 1) +#define FBZCP_CC_SUB_CLOCAL(val) (((val) >> 9) & 1) +#define FBZCP_CC_MSELECT(val) (((val) >> 10) & 7) +#define FBZCP_CC_REVERSE_BLEND(val) (((val) >> 13) & 1) +#define FBZCP_CC_ADD_ACLOCAL(val) (((val) >> 14) & 3) +#define FBZCP_CC_INVERT_OUTPUT(val) (((val) >> 16) & 1) +#define FBZCP_CCA_ZERO_OTHER(val) (((val) >> 17) & 1) +#define FBZCP_CCA_SUB_CLOCAL(val) (((val) >> 18) & 1) +#define FBZCP_CCA_MSELECT(val) (((val) >> 19) & 7) +#define FBZCP_CCA_REVERSE_BLEND(val) (((val) >> 22) & 1) +#define FBZCP_CCA_ADD_ACLOCAL(val) (((val) >> 23) & 3) +#define FBZCP_CCA_INVERT_OUTPUT(val) (((val) >> 25) & 1) +#define FBZCP_CCA_SUBPIXEL_ADJUST(val) (((val) >> 26) & 1) +#define FBZCP_TEXTURE_ENABLE(val) (((val) >> 27) & 1) +#define FBZCP_RGBZW_CLAMP(val) (((val) >> 28) & 1) /* voodoo 2 only */ +#define FBZCP_ANTI_ALIAS(val) (((val) >> 29) & 1) /* voodoo 2 only */ + +#define ALPHAMODE_ALPHATEST(val) (((val) >> 0) & 1) +#define ALPHAMODE_ALPHAFUNCTION(val) (((val) >> 1) & 7) +#define ALPHAMODE_ALPHABLEND(val) (((val) >> 4) & 1) +#define ALPHAMODE_ANTIALIAS(val) (((val) >> 5) & 1) +#define ALPHAMODE_SRCRGBBLEND(val) (((val) >> 8) & 15) +#define ALPHAMODE_DSTRGBBLEND(val) (((val) >> 12) & 15) +#define ALPHAMODE_SRCALPHABLEND(val) (((val) >> 16) & 15) +#define ALPHAMODE_DSTALPHABLEND(val) (((val) >> 20) & 15) +#define ALPHAMODE_ALPHAREF(val) (((val) >> 24) & 0xff) + +#define FOGMODE_ENABLE_FOG(val) (((val) >> 0) & 1) +#define FOGMODE_FOG_ADD(val) (((val) >> 1) & 1) +#define FOGMODE_FOG_MULT(val) (((val) >> 2) & 1) +#define FOGMODE_FOG_ZALPHA(val) (((val) >> 3) & 3) +#define FOGMODE_FOG_CONSTANT(val) (((val) >> 5) & 1) +#define FOGMODE_FOG_DITHER(val) (((val) >> 6) & 1) /* voodoo 2 only */ +#define FOGMODE_FOG_ZONES(val) (((val) >> 7) & 1) /* voodoo 2 only */ + +#define FBZMODE_ENABLE_CLIPPING(val) (((val) >> 0) & 1) +#define FBZMODE_ENABLE_CHROMAKEY(val) (((val) >> 1) & 1) +#define FBZMODE_ENABLE_STIPPLE(val) (((val) >> 2) & 1) +#define FBZMODE_WBUFFER_SELECT(val) (((val) >> 3) & 1) +#define FBZMODE_ENABLE_DEPTHBUF(val) (((val) >> 4) & 1) +#define FBZMODE_DEPTH_FUNCTION(val) (((val) >> 5) & 7) +#define FBZMODE_ENABLE_DITHERING(val) (((val) >> 8) & 1) +#define FBZMODE_RGB_BUFFER_MASK(val) (((val) >> 9) & 1) +#define FBZMODE_AUX_BUFFER_MASK(val) (((val) >> 10) & 1) +#define FBZMODE_DITHER_TYPE(val) (((val) >> 11) & 1) +#define FBZMODE_STIPPLE_PATTERN(val) (((val) >> 12) & 1) +#define FBZMODE_ENABLE_ALPHA_MASK(val) (((val) >> 13) & 1) +#define FBZMODE_DRAW_BUFFER(val) (((val) >> 14) & 3) +#define FBZMODE_ENABLE_DEPTH_BIAS(val) (((val) >> 16) & 1) +#define FBZMODE_Y_ORIGIN(val) (((val) >> 17) & 1) +#define FBZMODE_ENABLE_ALPHA_PLANES(val) (((val) >> 18) & 1) +#define FBZMODE_ALPHA_DITHER_SUBTRACT(val) (((val) >> 19) & 1) +#define FBZMODE_DEPTH_SOURCE_COMPARE(val) (((val) >> 20) & 1) +#define FBZMODE_DEPTH_FLOAT_SELECT(val) (((val) >> 21) & 1) /* voodoo 2 only */ + +#define LFBMODE_WRITE_FORMAT(val) (((val) >> 0) & 0xf) +#define LFBMODE_WRITE_BUFFER_SELECT(val) (((val) >> 4) & 3) +#define LFBMODE_READ_BUFFER_SELECT(val) (((val) >> 6) & 3) +#define LFBMODE_ENABLE_PIXEL_PIPELINE(val) (((val) >> 8) & 1) +#define LFBMODE_RGBA_LANES(val) (((val) >> 9) & 3) +#define LFBMODE_WORD_SWAP_WRITES(val) (((val) >> 11) & 1) +#define LFBMODE_BYTE_SWIZZLE_WRITES(val) (((val) >> 12) & 1) +#define LFBMODE_Y_ORIGIN(val) (((val) >> 13) & 1) +#define LFBMODE_WRITE_W_SELECT(val) (((val) >> 14) & 1) +#define LFBMODE_WORD_SWAP_READS(val) (((val) >> 15) & 1) +#define LFBMODE_BYTE_SWIZZLE_READS(val) (((val) >> 16) & 1) + +#define CHROMARANGE_BLUE_EXCLUSIVE(val) (((val) >> 24) & 1) +#define CHROMARANGE_GREEN_EXCLUSIVE(val) (((val) >> 25) & 1) +#define CHROMARANGE_RED_EXCLUSIVE(val) (((val) >> 26) & 1) +#define CHROMARANGE_UNION_MODE(val) (((val) >> 27) & 1) +#define CHROMARANGE_ENABLE(val) (((val) >> 28) & 1) + +#define FBIINIT0_VGA_PASSTHRU(val) (((val) >> 0) & 1) +#define FBIINIT0_GRAPHICS_RESET(val) (((val) >> 1) & 1) +#define FBIINIT0_FIFO_RESET(val) (((val) >> 2) & 1) +#define FBIINIT0_SWIZZLE_REG_WRITES(val) (((val) >> 3) & 1) +#define FBIINIT0_STALL_PCIE_FOR_HWM(val) (((val) >> 4) & 1) +#define FBIINIT0_PCI_FIFO_LWM(val) (((val) >> 6) & 0x1f) +#define FBIINIT0_LFB_TO_MEMORY_FIFO(val) (((val) >> 11) & 1) +#define FBIINIT0_TEXMEM_TO_MEMORY_FIFO(val) (((val) >> 12) & 1) +#define FBIINIT0_ENABLE_MEMORY_FIFO(val) (((val) >> 13) & 1) +#define FBIINIT0_MEMORY_FIFO_HWM(val) (((val) >> 14) & 0x7ff) +#define FBIINIT0_MEMORY_FIFO_BURST(val) (((val) >> 25) & 0x3f) + +#define FBIINIT1_PCI_DEV_FUNCTION(val) (((val) >> 0) & 1) +#define FBIINIT1_PCI_WRITE_WAIT_STATES(val) (((val) >> 1) & 1) +#define FBIINIT1_MULTI_SST1(val) (((val) >> 2) & 1) /* not on voodoo 2 */ +#define FBIINIT1_ENABLE_LFB(val) (((val) >> 3) & 1) +#define FBIINIT1_X_VIDEO_TILES(val) (((val) >> 4) & 0xf) +#define FBIINIT1_VIDEO_TIMING_RESET(val) (((val) >> 8) & 1) +#define FBIINIT1_SOFTWARE_OVERRIDE(val) (((val) >> 9) & 1) +#define FBIINIT1_SOFTWARE_HSYNC(val) (((val) >> 10) & 1) +#define FBIINIT1_SOFTWARE_VSYNC(val) (((val) >> 11) & 1) +#define FBIINIT1_SOFTWARE_BLANK(val) (((val) >> 12) & 1) +#define FBIINIT1_DRIVE_VIDEO_TIMING(val) (((val) >> 13) & 1) +#define FBIINIT1_DRIVE_VIDEO_BLANK(val) (((val) >> 14) & 1) +#define FBIINIT1_DRIVE_VIDEO_SYNC(val) (((val) >> 15) & 1) +#define FBIINIT1_DRIVE_VIDEO_DCLK(val) (((val) >> 16) & 1) +#define FBIINIT1_VIDEO_TIMING_VCLK(val) (((val) >> 17) & 1) +#define FBIINIT1_VIDEO_CLK_2X_DELAY(val) (((val) >> 18) & 3) +#define FBIINIT1_VIDEO_TIMING_SOURCE(val) (((val) >> 20) & 3) +#define FBIINIT1_ENABLE_24BPP_OUTPUT(val) (((val) >> 22) & 1) +#define FBIINIT1_ENABLE_SLI(val) (((val) >> 23) & 1) +#define FBIINIT1_X_VIDEO_TILES_BIT5(val) (((val) >> 24) & 1) /* voodoo 2 only */ +#define FBIINIT1_ENABLE_EDGE_FILTER(val) (((val) >> 25) & 1) +#define FBIINIT1_INVERT_VID_CLK_2X(val) (((val) >> 26) & 1) +#define FBIINIT1_VID_CLK_2X_SEL_DELAY(val) (((val) >> 27) & 3) +#define FBIINIT1_VID_CLK_DELAY(val) (((val) >> 29) & 3) +#define FBIINIT1_DISABLE_FAST_READAHEAD(val) (((val) >> 31) & 1) + +#define FBIINIT2_DISABLE_DITHER_SUB(val) (((val) >> 0) & 1) +#define FBIINIT2_DRAM_BANKING(val) (((val) >> 1) & 1) +#define FBIINIT2_ENABLE_TRIPLE_BUF(val) (((val) >> 4) & 1) +#define FBIINIT2_ENABLE_FAST_RAS_READ(val) (((val) >> 5) & 1) +#define FBIINIT2_ENABLE_GEN_DRAM_OE(val) (((val) >> 6) & 1) +#define FBIINIT2_ENABLE_FAST_READWRITE(val) (((val) >> 7) & 1) +#define FBIINIT2_ENABLE_PASSTHRU_DITHER(val) (((val) >> 8) & 1) +#define FBIINIT2_SWAP_BUFFER_ALGORITHM(val) (((val) >> 9) & 3) +#define FBIINIT2_VIDEO_BUFFER_OFFSET(val) (((val) >> 11) & 0x1ff) +#define FBIINIT2_ENABLE_DRAM_BANKING(val) (((val) >> 20) & 1) +#define FBIINIT2_ENABLE_DRAM_READ_FIFO(val) (((val) >> 21) & 1) +#define FBIINIT2_ENABLE_DRAM_REFRESH(val) (((val) >> 22) & 1) +#define FBIINIT2_REFRESH_LOAD_VALUE(val) (((val) >> 23) & 0x1ff) + +#define FBIINIT3_TRI_REGISTER_REMAP(val) (((val) >> 0) & 1) +#define FBIINIT3_VIDEO_FIFO_THRESH(val) (((val) >> 1) & 0x1f) +#define FBIINIT3_DISABLE_TMUS(val) (((val) >> 6) & 1) +#define FBIINIT3_FBI_MEMORY_TYPE(val) (((val) >> 8) & 7) +#define FBIINIT3_VGA_PASS_RESET_VAL(val) (((val) >> 11) & 1) +#define FBIINIT3_HARDCODE_PCI_BASE(val) (((val) >> 12) & 1) +#define FBIINIT3_FBI2TREX_DELAY(val) (((val) >> 13) & 0xf) +#define FBIINIT3_TREX2FBI_DELAY(val) (((val) >> 17) & 0x1f) +#define FBIINIT3_YORIGIN_SUBTRACT(val) (((val) >> 22) & 0x3ff) + +#define FBIINIT4_PCI_READ_WAITS(val) (((val) >> 0) & 1) +#define FBIINIT4_ENABLE_LFB_READAHEAD(val) (((val) >> 1) & 1) +#define FBIINIT4_MEMORY_FIFO_LWM(val) (((val) >> 2) & 0x3f) +#define FBIINIT4_MEMORY_FIFO_START_ROW(val) (((val) >> 8) & 0x3ff) +#define FBIINIT4_MEMORY_FIFO_STOP_ROW(val) (((val) >> 18) & 0x3ff) +#define FBIINIT4_VIDEO_CLOCKING_DELAY(val) (((val) >> 29) & 7) /* voodoo 2 only */ + +#define FBIINIT5_DISABLE_PCI_STOP(val) (((val) >> 0) & 1) /* voodoo 2 only */ +#define FBIINIT5_PCI_SLAVE_SPEED(val) (((val) >> 1) & 1) /* voodoo 2 only */ +#define FBIINIT5_DAC_DATA_OUTPUT_WIDTH(val) (((val) >> 2) & 1) /* voodoo 2 only */ +#define FBIINIT5_DAC_DATA_17_OUTPUT(val) (((val) >> 3) & 1) /* voodoo 2 only */ +#define FBIINIT5_DAC_DATA_18_OUTPUT(val) (((val) >> 4) & 1) /* voodoo 2 only */ +#define FBIINIT5_GENERIC_STRAPPING(val) (((val) >> 5) & 0xf) /* voodoo 2 only */ +#define FBIINIT5_BUFFER_ALLOCATION(val) (((val) >> 9) & 3) /* voodoo 2 only */ +#define FBIINIT5_DRIVE_VID_CLK_SLAVE(val) (((val) >> 11) & 1) /* voodoo 2 only */ +#define FBIINIT5_DRIVE_DAC_DATA_16(val) (((val) >> 12) & 1) /* voodoo 2 only */ +#define FBIINIT5_VCLK_INPUT_SELECT(val) (((val) >> 13) & 1) /* voodoo 2 only */ +#define FBIINIT5_MULTI_CVG_DETECT(val) (((val) >> 14) & 1) /* voodoo 2 only */ +#define FBIINIT5_SYNC_RETRACE_READS(val) (((val) >> 15) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_RHBORDER_COLOR(val) (((val) >> 16) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_LHBORDER_COLOR(val) (((val) >> 17) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_BVBORDER_COLOR(val) (((val) >> 18) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_TVBORDER_COLOR(val) (((val) >> 19) & 1) /* voodoo 2 only */ +#define FBIINIT5_DOUBLE_HORIZ(val) (((val) >> 20) & 1) /* voodoo 2 only */ +#define FBIINIT5_DOUBLE_VERT(val) (((val) >> 21) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_16BIT_GAMMA(val) (((val) >> 22) & 1) /* voodoo 2 only */ +#define FBIINIT5_INVERT_DAC_HSYNC(val) (((val) >> 23) & 1) /* voodoo 2 only */ +#define FBIINIT5_INVERT_DAC_VSYNC(val) (((val) >> 24) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_24BIT_DACDATA(val) (((val) >> 25) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_INTERLACING(val) (((val) >> 26) & 1) /* voodoo 2 only */ +#define FBIINIT5_DAC_DATA_18_CONTROL(val) (((val) >> 27) & 1) /* voodoo 2 only */ +#define FBIINIT5_RASTERIZER_UNIT_MODE(val) (((val) >> 30) & 3) /* voodoo 2 only */ + +#define FBIINIT6_WINDOW_ACTIVE_COUNTER(val) (((val) >> 0) & 7) /* voodoo 2 only */ +#define FBIINIT6_WINDOW_DRAG_COUNTER(val) (((val) >> 3) & 0x1f) /* voodoo 2 only */ +#define FBIINIT6_SLI_SYNC_MASTER(val) (((val) >> 8) & 1) /* voodoo 2 only */ +#define FBIINIT6_DAC_DATA_22_OUTPUT(val) (((val) >> 9) & 3) /* voodoo 2 only */ +#define FBIINIT6_DAC_DATA_23_OUTPUT(val) (((val) >> 11) & 3) /* voodoo 2 only */ +#define FBIINIT6_SLI_SYNCIN_OUTPUT(val) (((val) >> 13) & 3) /* voodoo 2 only */ +#define FBIINIT6_SLI_SYNCOUT_OUTPUT(val) (((val) >> 15) & 3) /* voodoo 2 only */ +#define FBIINIT6_DAC_RD_OUTPUT(val) (((val) >> 17) & 3) /* voodoo 2 only */ +#define FBIINIT6_DAC_WR_OUTPUT(val) (((val) >> 19) & 3) /* voodoo 2 only */ +#define FBIINIT6_PCI_FIFO_LWM_RDY(val) (((val) >> 21) & 0x7f) /* voodoo 2 only */ +#define FBIINIT6_VGA_PASS_N_OUTPUT(val) (((val) >> 28) & 3) /* voodoo 2 only */ +#define FBIINIT6_X_VIDEO_TILES_BIT0(val) (((val) >> 30) & 1) /* voodoo 2 only */ + +#define FBIINIT7_GENERIC_STRAPPING(val) (((val) >> 0) & 0xff) /* voodoo 2 only */ +#define FBIINIT7_CMDFIFO_ENABLE(val) (((val) >> 8) & 1) /* voodoo 2 only */ +#define FBIINIT7_CMDFIFO_MEMORY_STORE(val) (((val) >> 9) & 1) /* voodoo 2 only */ +#define FBIINIT7_DISABLE_CMDFIFO_HOLES(val) (((val) >> 10) & 1) /* voodoo 2 only */ +#define FBIINIT7_CMDFIFO_READ_THRESH(val) (((val) >> 11) & 0x1f) /* voodoo 2 only */ +#define FBIINIT7_SYNC_CMDFIFO_WRITES(val) (((val) >> 16) & 1) /* voodoo 2 only */ +#define FBIINIT7_SYNC_CMDFIFO_READS(val) (((val) >> 17) & 1) /* voodoo 2 only */ +#define FBIINIT7_RESET_PCI_PACKER(val) (((val) >> 18) & 1) /* voodoo 2 only */ +#define FBIINIT7_ENABLE_CHROMA_STUFF(val) (((val) >> 19) & 1) /* voodoo 2 only */ +#define FBIINIT7_CMDFIFO_PCI_TIMEOUT(val) (((val) >> 20) & 0x7f) /* voodoo 2 only */ +#define FBIINIT7_ENABLE_TEXTURE_BURST(val) (((val) >> 27) & 1) /* voodoo 2 only */ + +#define TEXMODE_ENABLE_PERSPECTIVE(val) (((val) >> 0) & 1) +#define TEXMODE_MINIFICATION_FILTER(val) (((val) >> 1) & 1) +#define TEXMODE_MAGNIFICATION_FILTER(val) (((val) >> 2) & 1) +#define TEXMODE_CLAMP_NEG_W(val) (((val) >> 3) & 1) +#define TEXMODE_ENABLE_LOD_DITHER(val) (((val) >> 4) & 1) +#define TEXMODE_NCC_TABLE_SELECT(val) (((val) >> 5) & 1) +#define TEXMODE_CLAMP_S(val) (((val) >> 6) & 1) +#define TEXMODE_CLAMP_T(val) (((val) >> 7) & 1) +#define TEXMODE_FORMAT(val) (((val) >> 8) & 0xf) +#define TEXMODE_TC_ZERO_OTHER(val) (((val) >> 12) & 1) +#define TEXMODE_TC_SUB_CLOCAL(val) (((val) >> 13) & 1) +#define TEXMODE_TC_MSELECT(val) (((val) >> 14) & 7) +#define TEXMODE_TC_REVERSE_BLEND(val) (((val) >> 17) & 1) +#define TEXMODE_TC_ADD_ACLOCAL(val) (((val) >> 18) & 3) +#define TEXMODE_TC_INVERT_OUTPUT(val) (((val) >> 20) & 1) +#define TEXMODE_TCA_ZERO_OTHER(val) (((val) >> 21) & 1) +#define TEXMODE_TCA_SUB_CLOCAL(val) (((val) >> 22) & 1) +#define TEXMODE_TCA_MSELECT(val) (((val) >> 23) & 7) +#define TEXMODE_TCA_REVERSE_BLEND(val) (((val) >> 26) & 1) +#define TEXMODE_TCA_ADD_ACLOCAL(val) (((val) >> 27) & 3) +#define TEXMODE_TCA_INVERT_OUTPUT(val) (((val) >> 29) & 1) +#define TEXMODE_TRILINEAR(val) (((val) >> 30) & 1) +#define TEXMODE_SEQ_8_DOWNLD(val) (((val) >> 31) & 1) + +#define TEXLOD_LODMIN(val) (((val) >> 0) & 0x3f) +#define TEXLOD_LODMAX(val) (((val) >> 6) & 0x3f) +#define TEXLOD_LODBIAS(val) (((val) >> 12) & 0x3f) +#define TEXLOD_LOD_ODD(val) (((val) >> 18) & 1) +#define TEXLOD_LOD_TSPLIT(val) (((val) >> 19) & 1) +#define TEXLOD_LOD_S_IS_WIDER(val) (((val) >> 20) & 1) +#define TEXLOD_LOD_ASPECT(val) (((val) >> 21) & 3) +#define TEXLOD_LOD_ZEROFRAC(val) (((val) >> 23) & 1) +#define TEXLOD_TMULTIBASEADDR(val) (((val) >> 24) & 1) +#define TEXLOD_TDATA_SWIZZLE(val) (((val) >> 25) & 1) +#define TEXLOD_TDATA_SWAP(val) (((val) >> 26) & 1) +#define TEXLOD_TDIRECT_WRITE(val) (((val) >> 27) & 1) /* Voodoo 2 only */ + +#define TEXDETAIL_DETAIL_MAX(val) (((val) >> 0) & 0xff) +#define TEXDETAIL_DETAIL_BIAS(val) (((val) >> 8) & 0x3f) +#define TEXDETAIL_DETAIL_SCALE(val) (((val) >> 14) & 7) +#define TEXDETAIL_RGB_MIN_FILTER(val) (((val) >> 17) & 1) /* Voodoo 2 only */ +#define TEXDETAIL_RGB_MAG_FILTER(val) (((val) >> 18) & 1) /* Voodoo 2 only */ +#define TEXDETAIL_ALPHA_MIN_FILTER(val) (((val) >> 19) & 1) /* Voodoo 2 only */ +#define TEXDETAIL_ALPHA_MAG_FILTER(val) (((val) >> 20) & 1) /* Voodoo 2 only */ +#define TEXDETAIL_SEPARATE_RGBA_FILTER(val) (((val) >> 21) & 1) /* Voodoo 2 only */ + +#define TREXINIT_SEND_TMU_CONFIG(val) (((val) >> 18) & 1) + + + +struct voodoo_state; +struct poly_extra_data; +class voodoo_device; + +struct rgba +{ +#ifdef LSB_FIRST + UINT8 b, g, r, a; +#else + UINT8 a, r, g, b; +#endif +}; + + +union voodoo_reg +{ + INT32 i; + UINT32 u; + float f; + rgba rgb; +}; + + + +struct voodoo_stats +{ + UINT8 lastkey; /* last key state */ + UINT8 display; /* display stats? */ + INT32 swaps; /* total swaps */ + INT32 stalls; /* total stalls */ + INT32 total_triangles; /* total triangles */ + INT32 total_pixels_in; /* total pixels in */ + INT32 total_pixels_out; /* total pixels out */ + INT32 total_chroma_fail; /* total chroma fail */ + INT32 total_zfunc_fail; /* total z func fail */ + INT32 total_afunc_fail; /* total a func fail */ + INT32 total_clipped; /* total clipped */ + INT32 total_stippled; /* total stippled */ + INT32 lfb_writes; /* LFB writes */ + INT32 lfb_reads; /* LFB reads */ + INT32 reg_writes; /* register writes */ + INT32 reg_reads; /* register reads */ + INT32 tex_writes; /* texture writes */ + INT32 texture_mode[16]; /* 16 different texture modes */ + UINT8 render_override; /* render override */ + char buffer[1024]; /* string */ +}; + + +/* note that this structure is an even 64 bytes long */ +struct stats_block +{ + INT32 pixels_in; /* pixels in statistic */ + INT32 pixels_out; /* pixels out statistic */ + INT32 chroma_fail; /* chroma test fail statistic */ + INT32 zfunc_fail; /* z function test fail statistic */ + INT32 afunc_fail; /* alpha function test fail statistic */ + INT32 clip_fail; /* clipping fail statistic */ + INT32 stipple_count; /* stipple statistic */ + INT32 filler[64/4 - 7]; /* pad this structure to 64 bytes */ +}; + + +struct fifo_state +{ + UINT32 * base; /* base of the FIFO */ + INT32 size; /* size of the FIFO */ + INT32 in; /* input pointer */ + INT32 out; /* output pointer */ +}; + + +struct cmdfifo_info +{ + UINT8 enable; /* enabled? */ + UINT8 count_holes; /* count holes? */ + UINT32 base; /* base address in framebuffer RAM */ + UINT32 end; /* end address in framebuffer RAM */ + UINT32 rdptr; /* current read pointer */ + UINT32 amin; /* minimum address */ + UINT32 amax; /* maximum address */ + UINT32 depth; /* current depth */ + UINT32 holes; /* number of holes */ +}; + + +struct pci_state +{ + fifo_state fifo; /* PCI FIFO */ + UINT32 init_enable; /* initEnable value */ + UINT8 stall_state; /* state of the system if we're stalled */ + UINT8 op_pending; /* true if an operation is pending */ + attotime op_end_time; /* time when the pending operation ends */ + emu_timer * continue_timer; /* timer to use to continue processing */ + UINT32 fifo_mem[64*2]; /* memory backing the PCI FIFO */ +}; + + +struct ncc_table +{ + UINT8 dirty; /* is the texel lookup dirty? */ + voodoo_reg * reg; /* pointer to our registers */ + INT32 ir[4], ig[4], ib[4]; /* I values for R,G,B */ + INT32 qr[4], qg[4], qb[4]; /* Q values for R,G,B */ + INT32 y[16]; /* Y values */ + rgb_t * palette; /* pointer to associated RGB palette */ + rgb_t * palettea; /* pointer to associated ARGB palette */ + rgb_t texel[256]; /* texel lookup */ +}; + + +struct tmu_state +{ + UINT8 * ram; /* pointer to our RAM */ + UINT32 mask; /* mask to apply to pointers */ + voodoo_reg * reg; /* pointer to our register base */ + UINT32 regdirty; /* true if the LOD/mode/base registers have changed */ + + UINT32 texaddr_mask; /* mask for texture address */ + UINT8 texaddr_shift; /* shift for texture address */ + + INT64 starts, startt; /* starting S,T (14.18) */ + INT64 startw; /* starting W (2.30) */ + INT64 dsdx, dtdx; /* delta S,T per X */ + INT64 dwdx; /* delta W per X */ + INT64 dsdy, dtdy; /* delta S,T per Y */ + INT64 dwdy; /* delta W per Y */ + + INT32 lodmin, lodmax; /* min, max LOD values */ + INT32 lodbias; /* LOD bias */ + UINT32 lodmask; /* mask of available LODs */ + UINT32 lodoffset[9]; /* offset of texture base for each LOD */ + INT32 detailmax; /* detail clamp */ + INT32 detailbias; /* detail bias */ + UINT8 detailscale; /* detail scale */ + + UINT32 wmask; /* mask for the current texture width */ + UINT32 hmask; /* mask for the current texture height */ + + UINT32 bilinear_mask; /* mask for bilinear resolution (0xf0 for V1, 0xff for V2) */ + + ncc_table ncc[2]; /* two NCC tables */ + + rgb_t * lookup; /* currently selected lookup */ + rgb_t * texel[16]; /* texel lookups for each format */ + + rgb_t palette[256]; /* palette lookup table */ + rgb_t palettea[256]; /* palette+alpha lookup table */ +}; + + +struct tmu_shared_state +{ + rgb_t rgb332[256]; /* RGB 3-3-2 lookup table */ + rgb_t alpha8[256]; /* alpha 8-bit lookup table */ + rgb_t int8[256]; /* intensity 8-bit lookup table */ + rgb_t ai44[256]; /* alpha, intensity 4-4 lookup table */ + + rgb_t rgb565[65536]; /* RGB 5-6-5 lookup table */ + rgb_t argb1555[65536]; /* ARGB 1-5-5-5 lookup table */ + rgb_t argb4444[65536]; /* ARGB 4-4-4-4 lookup table */ +}; + + +struct setup_vertex +{ + float x, y; /* X, Y coordinates */ + float a, r, g, b; /* A, R, G, B values */ + float z, wb; /* Z and broadcast W values */ + float w0, s0, t0; /* W, S, T for TMU 0 */ + float w1, s1, t1; /* W, S, T for TMU 1 */ +}; + + +struct fbi_state +{ + UINT8 * ram; /* pointer to frame buffer RAM */ + UINT32 mask; /* mask to apply to pointers */ + UINT32 rgboffs[3]; /* word offset to 3 RGB buffers */ + UINT32 auxoffs; /* word offset to 1 aux buffer */ + + UINT8 frontbuf; /* front buffer index */ + UINT8 backbuf; /* back buffer index */ + UINT8 swaps_pending; /* number of pending swaps */ + UINT8 video_changed; /* did the frontbuffer video change? */ + + UINT32 yorigin; /* Y origin subtract value */ + UINT32 lfb_base; /* base of LFB in memory */ + UINT8 lfb_stride; /* stride of LFB accesses in bits */ + + UINT32 width; /* width of current frame buffer */ + UINT32 height; /* height of current frame buffer */ + UINT32 xoffs; /* horizontal offset (back porch) */ + UINT32 yoffs; /* vertical offset (back porch) */ + UINT32 vsyncscan; /* vertical sync scanline */ + UINT32 rowpixels; /* pixels per row */ + UINT32 tile_width; /* width of video tiles */ + UINT32 tile_height; /* height of video tiles */ + UINT32 x_tiles; /* number of tiles in the X direction */ + + emu_timer * vblank_timer; /* VBLANK timer */ + UINT8 vblank; /* VBLANK state */ + UINT8 vblank_count; /* number of VBLANKs since last swap */ + UINT8 vblank_swap_pending; /* a swap is pending, waiting for a vblank */ + UINT8 vblank_swap; /* swap when we hit this count */ + UINT8 vblank_dont_swap; /* don't actually swap when we hit this point */ + + /* triangle setup info */ + UINT8 cheating_allowed; /* allow cheating? */ + INT32 sign; /* triangle sign */ + INT16 ax, ay; /* vertex A x,y (12.4) */ + INT16 bx, by; /* vertex B x,y (12.4) */ + INT16 cx, cy; /* vertex C x,y (12.4) */ + INT32 startr, startg, startb, starta; /* starting R,G,B,A (12.12) */ + INT32 startz; /* starting Z (20.12) */ + INT64 startw; /* starting W (16.32) */ + INT32 drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */ + INT32 dzdx; /* delta Z per X */ + INT64 dwdx; /* delta W per X */ + INT32 drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */ + INT32 dzdy; /* delta Z per Y */ + INT64 dwdy; /* delta W per Y */ + + stats_block lfb_stats; /* LFB-access statistics */ + + UINT8 sverts; /* number of vertices ready */ + setup_vertex svert[3]; /* 3 setup vertices */ + + fifo_state fifo; /* framebuffer memory fifo */ + cmdfifo_info cmdfifo[2]; /* command FIFOs */ + + UINT8 fogblend[64]; /* 64-entry fog table */ + UINT8 fogdelta[64]; /* 64-entry fog table */ + UINT8 fogdelta_mask; /* mask for for delta (0xff for V1, 0xfc for V2) */ + + rgb_t pen[65536]; /* mapping from pixels to pens */ + rgb_t clut[512]; /* clut gamma data */ + UINT8 clut_dirty; /* do we need to recompute? */ +}; + + +struct dac_state +{ + UINT8 reg[8]; /* 8 registers */ + UINT8 read_result; /* pending read result */ +}; + + +struct raster_info +{ + raster_info * next; /* pointer to next entry with the same hash */ + poly_draw_scanline_func callback; /* callback pointer */ + UINT8 is_generic; /* TRUE if this is one of the generic rasterizers */ + UINT8 display; /* display index */ + UINT32 hits; /* how many hits (pixels) we've used this for */ + UINT32 polys; /* how many polys we've used this for */ + UINT32 eff_color_path; /* effective fbzColorPath value */ + UINT32 eff_alpha_mode; /* effective alphaMode value */ + UINT32 eff_fog_mode; /* effective fogMode value */ + UINT32 eff_fbz_mode; /* effective fbzMode value */ + UINT32 eff_tex_mode_0; /* effective textureMode value for TMU #0 */ + UINT32 eff_tex_mode_1; /* effective textureMode value for TMU #1 */ + UINT32 hash; +}; + + +struct poly_extra_data +{ + voodoo_device * device; + raster_info * info; /* pointer to rasterizer information */ + + INT16 ax, ay; /* vertex A x,y (12.4) */ + INT32 startr, startg, startb, starta; /* starting R,G,B,A (12.12) */ + INT32 startz; /* starting Z (20.12) */ + INT64 startw; /* starting W (16.32) */ + INT32 drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */ + INT32 dzdx; /* delta Z per X */ + INT64 dwdx; /* delta W per X */ + INT32 drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */ + INT32 dzdy; /* delta Z per Y */ + INT64 dwdy; /* delta W per Y */ + + INT64 starts0, startt0; /* starting S,T (14.18) */ + INT64 startw0; /* starting W (2.30) */ + INT64 ds0dx, dt0dx; /* delta S,T per X */ + INT64 dw0dx; /* delta W per X */ + INT64 ds0dy, dt0dy; /* delta S,T per Y */ + INT64 dw0dy; /* delta W per Y */ + INT32 lodbase0; /* used during rasterization */ + + INT64 starts1, startt1; /* starting S,T (14.18) */ + INT64 startw1; /* starting W (2.30) */ + INT64 ds1dx, dt1dx; /* delta S,T per X */ + INT64 dw1dx; /* delta W per X */ + INT64 ds1dy, dt1dy; /* delta S,T per Y */ + INT64 dw1dy; /* delta W per Y */ + INT32 lodbase1; /* used during rasterization */ + + UINT16 dither[16]; /* dither matrix, for fastfill */ +}; + + +struct banshee_info +{ + UINT32 io[0x40]; /* I/O registers */ + UINT32 agp[0x80]; /* AGP registers */ + UINT8 vga[0x20]; /* VGA registers */ + UINT8 crtc[0x27]; /* VGA CRTC registers */ + UINT8 seq[0x05]; /* VGA sequencer registers */ + UINT8 gc[0x05]; /* VGA graphics controller registers */ + UINT8 att[0x15]; /* VGA attribute registers */ + UINT8 attff; /* VGA attribute flip-flop */ + + UINT32 blt_regs[0x20]; /* 2D Blitter registers */ + UINT32 blt_dst_base; + UINT32 blt_dst_x; + UINT32 blt_dst_y; + UINT32 blt_dst_width; + UINT32 blt_dst_height; + UINT32 blt_dst_stride; + UINT32 blt_dst_bpp; + UINT32 blt_cmd; + UINT32 blt_src_base; + UINT32 blt_src_x; + UINT32 blt_src_y; + UINT32 blt_src_width; + UINT32 blt_src_height; + UINT32 blt_src_stride; + UINT32 blt_src_bpp; +}; + + +typedef voodoo_reg rgb_union; + + + + /*************************************************************************** CONSTANTS @@ -61,10 +1746,7 @@ enum FUNCTION PROTOTYPES ***************************************************************************/ -int voodoo_update(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect); -int voodoo_get_type(device_t *device); -int voodoo_is_stalled(device_t *device); -void voodoo_set_init_enable(device_t *device, UINT32 newval); +struct stats_block; /* ----- device interface ----- */ @@ -86,7 +1768,6 @@ public: DECLARE_WRITE32_MEMBER( voodoo_w ); // access to legacy token - struct voodoo_state *token() const { assert(m_token != nullptr); return m_token; } void common_start_voodoo(UINT8 type); UINT8 m_fbmem; @@ -96,15 +1777,112 @@ public: const char * m_cputag; devcb_write_line m_vblank; devcb_write_line m_stall; + + TIMER_CALLBACK_MEMBER( vblank_off_callback ); + TIMER_CALLBACK_MEMBER( stall_cpu_callback ); + TIMER_CALLBACK_MEMBER( vblank_callback ); + + static void voodoo_postload(voodoo_device *vd); + + int voodoo_update(bitmap_rgb32 &bitmap, const rectangle &cliprect); + int voodoo_get_type(); + int voodoo_is_stalled(); + void voodoo_set_init_enable(UINT32 newval); + + // not all of these need to be static, review. + + static void check_stalled_cpu(voodoo_device* vd, attotime current_time); + static void flush_fifos( voodoo_device* vd, attotime current_time); + static void init_fbi(voodoo_device *vd, fbi_state *f, void *memory, int fbmem); + static INT32 register_w(voodoo_device *vd, offs_t offset, UINT32 data); + static INT32 swapbuffer(voodoo_device *vd, UINT32 data); + static void init_tmu(voodoo_device *vd, tmu_state *t, voodoo_reg *reg, void *memory, int tmem); + static INT32 lfb_w(voodoo_device *vd, offs_t offset, UINT32 data, UINT32 mem_mask); + static INT32 texture_w(voodoo_device *vd, offs_t offset, UINT32 data); + static INT32 lfb_direct_w(voodoo_device *vd, offs_t offset, UINT32 data, UINT32 mem_mask); + static INT32 banshee_2d_w(voodoo_device *vd, offs_t offset, UINT32 data); + static void stall_cpu(voodoo_device *vd, int state, attotime current_time); + static void soft_reset(voodoo_device *vd); + static void recompute_video_memory(voodoo_device *vd); + static INT32 fastfill(voodoo_device *vd); + static INT32 triangle(voodoo_device *vd); + static INT32 begin_triangle(voodoo_device *vd); + static INT32 draw_triangle(voodoo_device *vd); + static INT32 setup_and_draw_triangle(voodoo_device *vd); + static INT32 triangle_create_work_item(voodoo_device* vd,UINT16 *drawbuf, int texcount); + static raster_info *add_rasterizer(voodoo_device *vd, const raster_info *cinfo); + static raster_info *find_rasterizer(voodoo_device *vd, int texcount); + static void dump_rasterizer_stats(voodoo_device *vd); + static void init_tmu_shared(tmu_shared_state *s); + + static void swap_buffers(voodoo_device *vd); + static UINT32 cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f); + static INT32 cmdfifo_execute_if_ready(voodoo_device* vd, cmdfifo_info *f); + static void cmdfifo_w(voodoo_device *vd, cmdfifo_info *f, offs_t offset, UINT32 data); + + static void raster_fastfill(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); + static void raster_generic_0tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); + static void raster_generic_1tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); + static void raster_generic_2tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); + +#define RASTERIZER_HEADER(name) \ + static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid); \ + +#define RASTERIZER_ENTRY(fbzcp, alpha, fog, fbz, tex0, tex1) \ + RASTERIZER_HEADER(fbzcp##_##alpha##_##fog##_##fbz##_##tex0##_##tex1) \ + +#include "voodoo_rast.inc" + +#undef RASTERIZER_ENTRY + + protected: // device-level overrides virtual void device_config_complete() override; virtual void device_stop() override; virtual void device_reset() override; -private: - // internal state - struct voodoo_state *m_token; +public: + // voodoo_state + UINT8 index; /* index of board */ + voodoo_device *device; /* pointer to our containing device */ + screen_device *screen; /* the screen we are acting on */ + device_t *cpu; /* the CPU we interact with */ + UINT8 vd_type; /* type of system */ + UINT8 chipmask; /* mask for which chips are available */ + UINT32 freq; /* operating frequency */ + attoseconds_t attoseconds_per_cycle; /* attoseconds per cycle */ + UINT32 extra_cycles; /* extra cycles not yet accounted for */ + int trigger; /* trigger used for stalling */ + + voodoo_reg reg[0x400]; /* raw registers */ + const UINT8 * regaccess; /* register access array */ + const char *const * regnames; /* register names array */ + UINT8 alt_regmap; /* enable alternate register map? */ + + pci_state pci; /* PCI state */ + dac_state dac; /* DAC state */ + + fbi_state fbi; /* FBI states */ + tmu_state tmu[MAX_TMU]; /* TMU states */ + tmu_shared_state tmushare; /* TMU shared state */ + banshee_info banshee; /* Banshee state */ + + legacy_poly_manager * poly; /* polygon manager */ + stats_block * thread_stats; /* per-thread statistics */ + + voodoo_stats stats; /* internal statistics */ + + offs_t last_status_pc; /* PC of last status description (for logging) */ + UINT32 last_status_value; /* value of last status read (for logging) */ + + int next_rasterizer; /* next rasterizer index */ + raster_info rasterizer[MAX_RASTERIZERS]; /* array of rasterizers */ + raster_info * raster_hash[RASTER_HASH_SIZE]; /* hash table of rasterizers */ + + bool send_config; + UINT32 tmu_config; + }; class voodoo_1_device : public voodoo_device diff --git a/src/devices/video/voodoo_pci.cpp b/src/devices/video/voodoo_pci.cpp index 7570a007efb..9d34442f08b 100644 --- a/src/devices/video/voodoo_pci.cpp +++ b/src/devices/video/voodoo_pci.cpp @@ -153,7 +153,7 @@ void voodoo_pci_device::map_extra(UINT64 memory_window_start, UINT64 memory_wind UINT32 voodoo_pci_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; + return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; } // PCI bus control @@ -170,7 +170,7 @@ WRITE32_MEMBER (voodoo_pci_device::pcictrl_w) switch (offset) { case 0x0/4: // The address map starts at 0x40 // HW initEnable - voodoo_set_init_enable(m_voodoo, data); + m_voodoo->voodoo_set_init_enable(data); logerror("%06X:voodoo_pci_device pcictrl_w to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); break; default: diff --git a/src/mame/drivers/funkball.cpp b/src/mame/drivers/funkball.cpp index caa650705fe..6eaf7c496ef 100644 --- a/src/mame/drivers/funkball.cpp +++ b/src/mame/drivers/funkball.cpp @@ -142,7 +142,7 @@ void funkball_state::video_start() UINT32 funkball_state::screen_update( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect ) { - return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; + return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; } static UINT32 voodoo_0_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) @@ -186,7 +186,7 @@ static void voodoo_0_pci_w(device_t *busdevice, device_t *device, int function, break; case 0x40: state->m_voodoo_pci_regs.init_enable = data; - voodoo_set_init_enable(state->m_voodoo, data); + state->m_voodoo->voodoo_set_init_enable(data); break; } } diff --git a/src/mame/drivers/gticlub.cpp b/src/mame/drivers/gticlub.cpp index b751e7fc029..e9cbb5e37a5 100644 --- a/src/mame/drivers/gticlub.cpp +++ b/src/mame/drivers/gticlub.cpp @@ -910,21 +910,21 @@ UINT32 gticlub_state::screen_update_hangplt(screen_device &screen, bitmap_rgb32 if (strcmp(screen.tag(), ":lscreen") == 0) { - device_t *voodoo = machine().device("voodoo0"); + voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo0"); // m_k001604_1->draw_back_layer(bitmap, cliprect); - voodoo_update(voodoo, bitmap, cliprect); + voodoo->voodoo_update(bitmap, cliprect); m_k001604_1->draw_front_layer(screen, bitmap, cliprect); } else if (strcmp(screen.tag(), ":rscreen") == 0) { - device_t *voodoo = machine().device("voodoo1"); + voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo1"); // m_k001604_2->draw_back_layer(bitmap, cliprect); - voodoo_update(voodoo, bitmap, cliprect); + voodoo->voodoo_update(bitmap, cliprect); m_k001604_2->draw_front_layer(screen, bitmap, cliprect); } diff --git a/src/mame/drivers/hornet.cpp b/src/mame/drivers/hornet.cpp index 49200920f36..b1df15c8419 100644 --- a/src/mame/drivers/hornet.cpp +++ b/src/mame/drivers/hornet.cpp @@ -478,9 +478,9 @@ WRITE_LINE_MEMBER(hornet_state::voodoo_vblank_1) UINT32 hornet_state::screen_update_hornet(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - device_t *voodoo = machine().device("voodoo0"); + voodoo_device* voodoo = (voodoo_device*)machine().device("voodoo0"); - voodoo_update(voodoo, bitmap, cliprect); + voodoo->voodoo_update(bitmap, cliprect); m_k037122_1->tile_draw(screen, bitmap, cliprect); @@ -493,16 +493,16 @@ UINT32 hornet_state::screen_update_hornet_2board(screen_device &screen, bitmap_r { if (strcmp(screen.tag(), ":lscreen") == 0) { - device_t *voodoo = machine().device("voodoo0"); - voodoo_update(voodoo, bitmap, cliprect); + voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo0"); + voodoo->voodoo_update(bitmap, cliprect); /* TODO: tilemaps per screen */ m_k037122_1->tile_draw(screen, bitmap, cliprect); } else if (strcmp(screen.tag(), ":rscreen") == 0) { - device_t *voodoo = machine().device("voodoo1"); - voodoo_update(voodoo, bitmap, cliprect); + voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo1"); + voodoo->voodoo_update(bitmap, cliprect); /* TODO: tilemaps per screen */ m_k037122_2->tile_draw(screen, bitmap, cliprect); diff --git a/src/mame/drivers/magictg.cpp b/src/mame/drivers/magictg.cpp index 0235da41a9a..901c8070390 100644 --- a/src/mame/drivers/magictg.cpp +++ b/src/mame/drivers/magictg.cpp @@ -180,7 +180,7 @@ public: /* 3Dfx Voodoo */ - device_t* m_voodoo[2]; + voodoo_device* m_voodoo[2]; struct { @@ -241,8 +241,8 @@ public: void magictg_state::machine_start() { - m_voodoo[0] = machine().device("voodoo_0"); - m_voodoo[1] = machine().device("voodoo_1"); + m_voodoo[0] = (voodoo_device*)machine().device("voodoo_0"); + m_voodoo[1] = (voodoo_device*)machine().device("voodoo_1"); } @@ -278,7 +278,7 @@ void magictg_state::video_start() UINT32 magictg_state::screen_update_magictg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - return voodoo_update(m_voodoo[0], bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; + return m_voodoo[0]->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; } @@ -338,7 +338,7 @@ static void voodoo_0_pci_w(device_t *busdevice, device_t *device, int function, break; case 0x40: state->m_voodoo_pci_regs[0].init_enable = data; - voodoo_set_init_enable(state->m_voodoo[0], data); + state->m_voodoo[0]->voodoo_set_init_enable(data); break; default: @@ -601,8 +601,8 @@ WRITE32_MEMBER( magictg_state::f0_w ) UINT32 dst_addr = m_dma_ch[ch].dst_addr; //device_t *voodoo = dst_addr > 0xa000000 voodoo0 : voodoo1; - assert(DWORD_ALIGNED(src_addr)); - assert(DWORD_ALIGNED(dst_addr)); + assert((src_addr & 3) == 0); + assert((dst_addr & 3) == 0); while (m_dma_ch[ch].count > 3) { diff --git a/src/mame/drivers/nwk-tr.cpp b/src/mame/drivers/nwk-tr.cpp index 3d4719b95f1..9ec6ba6f9c4 100644 --- a/src/mame/drivers/nwk-tr.cpp +++ b/src/mame/drivers/nwk-tr.cpp @@ -346,11 +346,11 @@ WRITE_LINE_MEMBER(nwktr_state::voodoo_vblank_0) UINT32 nwktr_state::screen_update_nwktr(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - device_t *voodoo = machine().device("voodoo0"); + voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo0"); bitmap.fill(m_palette->pen(0), cliprect); - voodoo_update(voodoo, bitmap, cliprect); + voodoo->voodoo_update(bitmap, cliprect); const rectangle &visarea = screen.visible_area(); const rectangle tilemap_rect(visarea.min_x, visarea.max_x, visarea.min_y+16, visarea.max_y); diff --git a/src/mame/drivers/savquest.cpp b/src/mame/drivers/savquest.cpp index 784278096fa..77cb34fcc37 100644 --- a/src/mame/drivers/savquest.cpp +++ b/src/mame/drivers/savquest.cpp @@ -336,7 +336,7 @@ void savquest_state::vid_3dfx_init() m_pci_3dfx_regs[0x08 / 4] = 2; // revision ID m_pci_3dfx_regs[0x10 / 4] = 0xff000000; m_pci_3dfx_regs[0x40 / 4] = 0x4000; //INITEN_SECONDARY_REV_ID - voodoo_set_init_enable(m_voodoo, 0x4000); //INITEN_SECONDARY_REV_ID + m_voodoo->voodoo_set_init_enable(0x4000); //INITEN_SECONDARY_REV_ID } static UINT32 pci_3dfx_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) @@ -358,7 +358,7 @@ osd_printf_warning("PCI write: %x %x\n", reg, data); } else if (reg == 0x40) { - voodoo_set_init_enable(state->m_voodoo, data); + state->m_voodoo->voodoo_set_init_enable(data); } else if (reg == 0x54) { diff --git a/src/mame/drivers/seattle.cpp b/src/mame/drivers/seattle.cpp index 57295aec2ac..79b56322995 100644 --- a/src/mame/drivers/seattle.cpp +++ b/src/mame/drivers/seattle.cpp @@ -540,7 +540,7 @@ public: UINT32 seattle_state::screen_update_seattle(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; + return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; } @@ -876,7 +876,7 @@ void seattle_state::pci_3dfx_w(address_space &space, UINT8 reg, UINT8 type, UINT break; case 0x10: /* initEnable register */ - voodoo_set_init_enable(m_voodoo, data); + m_voodoo->voodoo_set_init_enable(data); break; } if (LOG_PCI) diff --git a/src/mame/drivers/vegas.cpp b/src/mame/drivers/vegas.cpp index c71cff65f1a..c65e6885d9a 100644 --- a/src/mame/drivers/vegas.cpp +++ b/src/mame/drivers/vegas.cpp @@ -493,7 +493,7 @@ public: UINT8 m_sio_led_state; UINT8 m_pending_analog_read; UINT8 m_cmos_unlocked; - device_t *m_voodoo; + voodoo_device *m_voodoo; UINT8 m_dcs_idma_cs; int m_count; int m_dynamic_count; @@ -567,7 +567,7 @@ public: UINT32 vegas_state::screen_update_vegas(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; + return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; } @@ -579,7 +579,7 @@ UINT32 vegas_state::screen_update_vegas(screen_device &screen, bitmap_rgb32 &bit void vegas_state::machine_start() { - m_voodoo = machine().device("voodoo"); + m_voodoo = (voodoo_device*)machine().device("voodoo"); /* allocate timers for the NILE */ m_timer[0] = machine().scheduler().timer_alloc(FUNC_NULL); @@ -797,7 +797,7 @@ WRITE32_MEMBER( vegas_state::pci_ide_w ) READ32_MEMBER( vegas_state::pci_3dfx_r ) { - int voodoo_type = voodoo_get_type(m_voodoo); + int voodoo_type = m_voodoo->voodoo_get_type(); UINT32 result = m_pci_3dfx_regs[offset]; switch (offset) @@ -830,7 +830,7 @@ READ32_MEMBER( vegas_state::pci_3dfx_r ) WRITE32_MEMBER( vegas_state::pci_3dfx_w ) { - int voodoo_type = voodoo_get_type(m_voodoo); + int voodoo_type = m_voodoo->voodoo_get_type(); m_pci_3dfx_regs[offset] = data; @@ -869,7 +869,7 @@ WRITE32_MEMBER( vegas_state::pci_3dfx_w ) break; case 0x10: /* initEnable register */ - voodoo_set_init_enable(m_voodoo, data); + m_voodoo->voodoo_set_init_enable(data); break; } @@ -1555,7 +1555,7 @@ inline void vegas_state::_add_dynamic_address(offs_t start, offs_t end, read32_d void vegas_state::remap_dynamic_addresses() { dynamic_address *dynamic = m_dynamic; - int voodoo_type = voodoo_get_type(m_voodoo); + int voodoo_type = m_voodoo->voodoo_get_type(); offs_t base; int addr; diff --git a/src/mame/drivers/viper.cpp b/src/mame/drivers/viper.cpp index c10c28e55d0..8f4bd3cfbd1 100644 --- a/src/mame/drivers/viper.cpp +++ b/src/mame/drivers/viper.cpp @@ -435,8 +435,8 @@ public: UINT32 viper_state::screen_update_viper(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - device_t *device = machine().device("voodoo"); - return voodoo_update(device, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; + voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo"); + return voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; } UINT32 m_mpc8240_regs[256/4];