trunk/src/emu/video/voodoo.c
| r19713 | r19714 | |
| 199 | 199 | #define LOG_RASTERIZERS (0) |
| 200 | 200 | #define LOG_CMDFIFO (0) |
| 201 | 201 | #define LOG_CMDFIFO_VERBOSE (0) |
| 202 | | #define LOG_BANSHEE_2D (1) |
| 202 | #define LOG_BANSHEE_2D (0) |
| 203 | 203 | |
| 204 | 204 | #define MODIFY_PIXEL(VV) |
| 205 | 205 | |
| r19713 | r19714 | |
| 1947 | 1947 | target = *src++ / 4; |
| 1948 | 1948 | |
| 1949 | 1949 | /* handle LFB writes */ |
| 1950 | | if ((command >> 30) == 2) |
| 1950 | switch (command >> 30) |
| 1951 | 1951 | { |
| 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); |
| 1953 | 1955 | |
| 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 | } |
| 1957 | 2005 | } |
| 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); |
| 1961 | 2006 | |
| 1962 | | /* loop over words */ |
| 1963 | | for (i = 0; i < count; i++) |
| 1964 | | cycles += texture_w(v, target++, *src++); |
| 1965 | | } |
| 1966 | 2007 | break; |
| 1967 | 2008 | |
| 1968 | 2009 | default: |
| r19713 | r19714 | |
| 4283 | 4324 | |
| 4284 | 4325 | case 3: // Host-to-screen blit |
| 4285 | 4326 | { |
| 4286 | | UINT32 addr = v->banshee.blt_base; |
| 4327 | UINT32 addr = v->banshee.blt_dst_base; |
| 4287 | 4328 | |
| 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); |
| 4289 | 4330 | |
| 4290 | 4331 | #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); |
| 4292 | 4333 | #endif |
| 4293 | 4334 | |
| 4294 | | switch (v->banshee.blt_bpp) |
| 4335 | switch (v->banshee.blt_dst_bpp) |
| 4295 | 4336 | { |
| 4296 | 4337 | case 1: |
| 4297 | 4338 | v->fbi.ram[addr+0] = data & 0xff; |
| 4298 | 4339 | v->fbi.ram[addr+1] = (data >> 8) & 0xff; |
| 4299 | 4340 | v->fbi.ram[addr+2] = (data >> 16) & 0xff; |
| 4300 | 4341 | v->fbi.ram[addr+3] = (data >> 24) & 0xff; |
| 4301 | | v->banshee.blt_x += 4; |
| 4342 | v->banshee.blt_dst_x += 4; |
| 4302 | 4343 | break; |
| 4303 | 4344 | case 2: |
| 4304 | 4345 | v->fbi.ram[addr+1] = data & 0xff; |
| 4305 | 4346 | v->fbi.ram[addr+0] = (data >> 8) & 0xff; |
| 4306 | 4347 | v->fbi.ram[addr+3] = (data >> 16) & 0xff; |
| 4307 | 4348 | v->fbi.ram[addr+2] = (data >> 24) & 0xff; |
| 4308 | | v->banshee.blt_x += 2; |
| 4349 | v->banshee.blt_dst_x += 2; |
| 4309 | 4350 | break; |
| 4310 | 4351 | case 3: |
| 4311 | | v->banshee.blt_x += 1; |
| 4352 | v->banshee.blt_dst_x += 1; |
| 4312 | 4353 | break; |
| 4313 | 4354 | case 4: |
| 4314 | 4355 | v->fbi.ram[addr+3] = data & 0xff; |
| 4315 | 4356 | v->fbi.ram[addr+2] = (data >> 8) & 0xff; |
| 4316 | 4357 | v->fbi.ram[addr+1] = (data >> 16) & 0xff; |
| 4317 | 4358 | v->fbi.ram[addr+0] = (data >> 24) & 0xff; |
| 4318 | | v->banshee.blt_x += 1; |
| 4359 | v->banshee.blt_dst_x += 1; |
| 4319 | 4360 | break; |
| 4320 | 4361 | } |
| 4321 | 4362 | |
| 4322 | | if (v->banshee.blt_x >= v->banshee.blt_width) |
| 4363 | if (v->banshee.blt_dst_x >= v->banshee.blt_dst_width) |
| 4323 | 4364 | { |
| 4324 | | v->banshee.blt_x = 0; |
| 4325 | | v->banshee.blt_y++; |
| 4365 | v->banshee.blt_dst_x = 0; |
| 4366 | v->banshee.blt_dst_y++; |
| 4326 | 4367 | } |
| 4327 | 4368 | break; |
| 4328 | 4369 | } |
| r19713 | r19714 | |
| 4360 | 4401 | { |
| 4361 | 4402 | case banshee2D_command: |
| 4362 | 4403 | #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); |
| 4364 | 4405 | #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; |
| 4371 | 4406 | |
| 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 | |
| 4372 | 4432 | switch ((v->banshee.blt_regs[banshee2D_dstFormat] >> 16) & 0x7) |
| 4373 | 4433 | { |
| 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; |
| 4379 | 4439 | } |
| 4380 | 4440 | |
| 4381 | | v->banshee.blt_cmd = data & 0x3; |
| 4441 | v->banshee.blt_cmd = data & 0xf; |
| 4382 | 4442 | break; |
| 4383 | 4443 | |
| 4384 | 4444 | case banshee2D_colorBack: |