Previous 199869 Revisions Next

r19714 Friday 21st December, 2012 at 02:34:39 UTC by Ville Linde
voodoo: Added Voodoo3-specific targets for cmdfifo packet type 5. (nw)
[src/emu/video]vooddefs.h voodoo.c

trunk/src/emu/video/vooddefs.h
r19713r19714
17101710   UINT8            attff;               /* VGA attribute flip-flop */
17111711
17121712   UINT32            blt_regs[0x20];         /* 2D Blitter registers */
1713   UINT32            blt_base;
1714   UINT32            blt_x;
1715   UINT32            blt_y;
1716   UINT32            blt_width;
1717   UINT32            blt_height;
1718   UINT32            blt_stride;
1719   UINT32            blt_bpp;
1713   UINT32            blt_dst_base;
1714   UINT32            blt_dst_x;
1715   UINT32            blt_dst_y;
1716   UINT32            blt_dst_width;
1717   UINT32            blt_dst_height;
1718   UINT32            blt_dst_stride;
1719   UINT32            blt_dst_bpp;
17201720   UINT32            blt_cmd;
1721   UINT32            blt_src_base;
1722   UINT32            blt_src_x;
1723   UINT32            blt_src_y;
1724   UINT32            blt_src_width;
1725   UINT32            blt_src_height;
1726   UINT32            blt_src_stride;
1727   UINT32            blt_src_bpp;
17211728};
17221729
17231730
trunk/src/emu/video/voodoo.c
r19713r19714
199199#define LOG_RASTERIZERS      (0)
200200#define LOG_CMDFIFO         (0)
201201#define LOG_CMDFIFO_VERBOSE   (0)
202#define LOG_BANSHEE_2D      (1)
202#define LOG_BANSHEE_2D      (0)
203203
204204#define MODIFY_PIXEL(VV)
205205
r19713r19714
19471947         target = *src++ / 4;
19481948
19491949         /* handle LFB writes */
1950         if ((command >> 30) == 2)
1950         switch (command >> 30)
19511951         {
1952            if (LOG_CMDFIFO) logerror("  PACKET TYPE 5: LFB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
1952            case 0:      // Linear FB
1953            {
1954               if (LOG_CMDFIFO) logerror("  PACKET TYPE 5: FB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
19531955
1954            /* loop over words */
1955            for (i = 0; i < count; i++)
1956               cycles += lfb_w(v, target++, *src++, 0xffffffff, FALSE);
1956               UINT32 addr = target * 4;
1957               for (i=0; i < count; i++)
1958               {
1959                  UINT32 data = *src++;
1960
1961                  v->fbi.ram[BYTE_XOR_LE(addr + 0)] = (UINT8)(data);
1962                  v->fbi.ram[BYTE_XOR_LE(addr + 1)] = (UINT8)(data >> 8);
1963                  v->fbi.ram[BYTE_XOR_LE(addr + 2)] = (UINT8)(data >> 16);
1964                  v->fbi.ram[BYTE_XOR_LE(addr + 3)] = (UINT8)(data >> 24);
1965
1966                  addr += 4;
1967               }
1968               break;
1969            }
1970            case 2:      // 3D LFB
1971            {
1972               if (LOG_CMDFIFO) logerror("  PACKET TYPE 5: 3D LFB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
1973
1974               /* loop over words */
1975               for (i = 0; i < count; i++)
1976                  cycles += lfb_w(v, target++, *src++, 0xffffffff, FALSE);
1977
1978               break;
1979            }
1980
1981            case 1:      // Planar YUV
1982            {
1983               // TODO
1984
1985               /* just update the pointers for now */
1986               for (i = 0; i < count; i++)
1987               {
1988                  target++;
1989                  src++;
1990               }
1991
1992               break;
1993            }
1994
1995            case 3:      // Texture Port
1996            {
1997               if (LOG_CMDFIFO) logerror("  PACKET TYPE 5: textureRAM count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
1998
1999               /* loop over words */
2000               for (i = 0; i < count; i++)
2001                  cycles += texture_w(v, target++, *src++);
2002
2003               break;
2004            }
19572005         }
1958         else if ((command >> 30) == 3)
1959         {
1960            if (LOG_CMDFIFO) logerror("  PACKET TYPE 5: textureRAM count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
19612006
1962            /* loop over words */
1963            for (i = 0; i < count; i++)
1964               cycles += texture_w(v, target++, *src++);
1965         }
19662007         break;
19672008
19682009      default:
r19713r19714
42834324
42844325      case 3:         // Host-to-screen blit
42854326      {
4286         UINT32 addr = v->banshee.blt_base;
4327         UINT32 addr = v->banshee.blt_dst_base;
42874328
4288         addr += (v->banshee.blt_y * v->banshee.blt_stride) + (v->banshee.blt_x * v->banshee.blt_bpp);
4329         addr += (v->banshee.blt_dst_y * v->banshee.blt_dst_stride) + (v->banshee.blt_dst_x * v->banshee.blt_dst_bpp);
42894330
42904331#if LOG_BANSHEE_2D
4291         logerror("   blit_2d:host_to_screen: %08x -> %08x, %d, %d\n", data, addr, v->banshee.blt_x, v->banshee.blt_y);
4332         logerror("   blit_2d:host_to_screen: %08x -> %08x, %d, %d\n", data, addr, v->banshee.blt_dst_x, v->banshee.blt_dst_y);
42924333#endif
42934334
4294         switch (v->banshee.blt_bpp)
4335         switch (v->banshee.blt_dst_bpp)
42954336         {
42964337            case 1:
42974338               v->fbi.ram[addr+0] = data & 0xff;
42984339               v->fbi.ram[addr+1] = (data >> 8) & 0xff;
42994340               v->fbi.ram[addr+2] = (data >> 16) & 0xff;
43004341               v->fbi.ram[addr+3] = (data >> 24) & 0xff;
4301               v->banshee.blt_x += 4;
4342               v->banshee.blt_dst_x += 4;
43024343               break;
43034344            case 2:
43044345               v->fbi.ram[addr+1] = data & 0xff;
43054346               v->fbi.ram[addr+0] = (data >> 8) & 0xff;
43064347               v->fbi.ram[addr+3] = (data >> 16) & 0xff;
43074348               v->fbi.ram[addr+2] = (data >> 24) & 0xff;
4308               v->banshee.blt_x += 2;
4349               v->banshee.blt_dst_x += 2;
43094350               break;
43104351            case 3:
4311               v->banshee.blt_x += 1;
4352               v->banshee.blt_dst_x += 1;
43124353               break;
43134354            case 4:
43144355               v->fbi.ram[addr+3] = data & 0xff;
43154356               v->fbi.ram[addr+2] = (data >> 8) & 0xff;
43164357               v->fbi.ram[addr+1] = (data >> 16) & 0xff;
43174358               v->fbi.ram[addr+0] = (data >> 24) & 0xff;
4318               v->banshee.blt_x += 1;
4359               v->banshee.blt_dst_x += 1;
43194360               break;
43204361         }
43214362
4322         if (v->banshee.blt_x >= v->banshee.blt_width)
4363         if (v->banshee.blt_dst_x >= v->banshee.blt_dst_width)
43234364         {
4324            v->banshee.blt_x = 0;
4325            v->banshee.blt_y++;
4365            v->banshee.blt_dst_x = 0;
4366            v->banshee.blt_dst_y++;
43264367         }
43274368         break;
43284369      }
r19713r19714
43604401   {
43614402      case banshee2D_command:
43624403#if LOG_BANSHEE_2D
4363         logerror("   2D:command: cmd %d, ROP0 %02X\n", data & 0x3, data >> 24);
4404         logerror("   2D:command: cmd %d, ROP0 %02X\n", data & 0xf, data >> 24);
43644405#endif
4365         v->banshee.blt_x      = v->banshee.blt_regs[banshee2D_srcXY] & 0xfff;
4366         v->banshee.blt_y      = (v->banshee.blt_regs[banshee2D_srcXY] >> 16) & 0xfff;
4367         v->banshee.blt_base      = v->banshee.blt_regs[banshee2D_dstBaseAddr] & 0xffffff;
4368         v->banshee.blt_stride   = v->banshee.blt_regs[banshee2D_dstFormat] & 0x3fff;
4369         v->banshee.blt_width   = v->banshee.blt_regs[banshee2D_dstSize] & 0xfff;
4370         v->banshee.blt_height   = (v->banshee.blt_regs[banshee2D_dstSize] >> 16) & 0xfff;
43714406
4407         v->banshee.blt_src_x      = v->banshee.blt_regs[banshee2D_srcXY] & 0xfff;
4408         v->banshee.blt_src_y      = (v->banshee.blt_regs[banshee2D_srcXY] >> 16) & 0xfff;
4409         v->banshee.blt_src_base      = v->banshee.blt_regs[banshee2D_srcBaseAddr] & 0xffffff;
4410         v->banshee.blt_src_stride   = v->banshee.blt_regs[banshee2D_srcFormat] & 0x3fff;
4411         v->banshee.blt_src_width   = v->banshee.blt_regs[banshee2D_srcSize] & 0xfff;
4412         v->banshee.blt_src_height   = (v->banshee.blt_regs[banshee2D_srcSize] >> 16) & 0xfff;
4413
4414         switch ((v->banshee.blt_regs[banshee2D_srcFormat] >> 16) & 0xf)
4415         {
4416            case 1: v->banshee.blt_src_bpp = 1; break;
4417            case 3: v->banshee.blt_src_bpp = 2; break;
4418            case 4: v->banshee.blt_src_bpp = 3; break;
4419            case 5: v->banshee.blt_src_bpp = 4; break;
4420            case 8: v->banshee.blt_src_bpp = 2; break;
4421            case 9: v->banshee.blt_src_bpp = 2; break;
4422            default: v->banshee.blt_src_bpp = 1; break;
4423         }
4424
4425         v->banshee.blt_dst_x      = v->banshee.blt_regs[banshee2D_dstXY] & 0xfff;
4426         v->banshee.blt_dst_y      = (v->banshee.blt_regs[banshee2D_dstXY] >> 16) & 0xfff;
4427         v->banshee.blt_dst_base      = v->banshee.blt_regs[banshee2D_dstBaseAddr] & 0xffffff;
4428         v->banshee.blt_dst_stride   = v->banshee.blt_regs[banshee2D_dstFormat] & 0x3fff;
4429         v->banshee.blt_dst_width   = v->banshee.blt_regs[banshee2D_dstSize] & 0xfff;
4430         v->banshee.blt_dst_height   = (v->banshee.blt_regs[banshee2D_dstSize] >> 16) & 0xfff;
4431
43724432         switch ((v->banshee.blt_regs[banshee2D_dstFormat] >> 16) & 0x7)
43734433         {
4374            case 1: v->banshee.blt_bpp = 1; break;
4375            case 3: v->banshee.blt_bpp = 2; break;
4376            case 4: v->banshee.blt_bpp = 3; break;
4377            case 5: v->banshee.blt_bpp = 4; break;
4378            default: v->banshee.blt_bpp = 1; break;
4434            case 1: v->banshee.blt_dst_bpp = 1; break;
4435            case 3: v->banshee.blt_dst_bpp = 2; break;
4436            case 4: v->banshee.blt_dst_bpp = 3; break;
4437            case 5: v->banshee.blt_dst_bpp = 4; break;
4438            default: v->banshee.blt_dst_bpp = 1; break;
43794439         }
43804440
4381         v->banshee.blt_cmd = data & 0x3;
4441         v->banshee.blt_cmd = data & 0xf;
43824442         break;
43834443
43844444      case banshee2D_colorBack:

Previous 199869 Revisions Next


© 1997-2024 The MAME Team