video/voodoo.cpp: Major rewrite: (#8267)

* Changed to use modern poly.h instead of polylgcy.h.
* Moved helper classes into separate voodoo namespace.
* Derived device classes from video_device_interface.
* Split classes so that later versions derive from earlier versions.
* Created device maps to be directly included.
* Redesigned register mapping to use helper classes and delegates.
* Rewrote rasterizers to use C++ templates instead of macros.
* Added logic to compute equations for color/texture combine units.
* Added special generic identity-texel rasterizer cases.
* Removed pipeline stalls on texture and palette changes.
* Removed pipeline stalls on most all parameter changes.
* Generally re-thought and cleaned up logic throughout.
* Parameterized cycle stealing on status reads; updated all existing voodoo consumers to configure it as it was before.

-vidoe/poly.h: Various improvements:
* Exposed poly_array class for broader use.
* Changed poly_array to intelligently determine maximum size.
* Added logic to track multiple "last" instances in poly_array.
* Extended logic to support up to 16m work items.
* Removed MaxPolys parameter from poly_manager template.
* Added Flags parameter to poly_manager template.
* Added POLY_FLAG_NO_CLIPPING flag to remove clipping code when not needed.
* poly_manager now supports a MaxParams value of 0.
* Made paramcount a template parameter for render_* functions.
* Added reset_after_wait() method to be overridden by derived classes.
* Switched to using std:: helpers instead of internal methods.
* Removed useless dependency on screen_device.
* TRACK_POLY_WAITS now produces more complete statistics.

-video/polylgcy.cpp: Removed legacy implementation of polygon renderer.

-machine/gt64xxx.cpp: Prevent lockups by disallowing 0-duration timers.

-machine/pci.cpp: Added support for adding subdevice maps directly.

-emu/video/rgbsse.h: Improved min/max for SSE4.1+ and scale+clamp operations for all.

-emu/vidoe/rgbutil.h: Made palette expansion constexpr and added argbexpand function.

-osd/osdcore.cpp: Changed osd_ticks to use QueryPerformanceCounter on Windows since the mingw std::chrono::high_resolution_clock is anything but.
This commit is contained in:
Aaron Giles 2021-07-08 18:35:00 -07:00 committed by GitHub
parent e9a86fc9fe
commit 6ffc98289c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
72 changed files with 13973 additions and 13997 deletions

View File

@ -805,18 +805,6 @@ if (VIDEOS["PCF2100"]~=null) then
}
end
--------------------------------------------------
--
--@src/devices/video/polylgcy.h,VIDEOS["POLY"] = true
--------------------------------------------------
if (VIDEOS["POLY"]~=null) then
files {
MAME_DIR .. "src/devices/video/polylgcy.cpp",
MAME_DIR .. "src/devices/video/polylgcy.h",
}
end
--------------------------------------------------
--
--@src/devices/video/psx.h,VIDEOS["PSX"] = true
@ -1156,8 +1144,13 @@ if (VIDEOS["VOODOO"]~=null) then
files {
MAME_DIR .. "src/devices/video/voodoo.cpp",
MAME_DIR .. "src/devices/video/voodoo.h",
MAME_DIR .. "src/devices/video/vooddefs.ipp",
MAME_DIR .. "src/devices/video/voodoo_rast.ipp",
MAME_DIR .. "src/devices/video/voodoo_2.cpp",
MAME_DIR .. "src/devices/video/voodoo_2.h",
MAME_DIR .. "src/devices/video/voodoo_banshee.cpp",
MAME_DIR .. "src/devices/video/voodoo_banshee.h",
MAME_DIR .. "src/devices/video/voodoo_regs.h",
MAME_DIR .. "src/devices/video/voodoo_render.cpp",
MAME_DIR .. "src/devices/video/voodoo_render.h",
}
end

View File

@ -873,7 +873,13 @@ TIMER_CALLBACK_MEMBER(gt64xxx_device::timer_callback)
/* if we're a timer, adjust the timer to fire again */
if (m_reg[GREG_TIMER_CONTROL] & (2 << (2 * which)))
timer->timer->adjust(TIMER_PERIOD * timer->count, which);
{
// unsure what a 0-length timer should do, but it produces an infinite loop so guard against it
u32 effcount = timer->count;
if (effcount == 0)
effcount = (which != 0) ? 0xffffff : 0xffffffff;
timer->timer->adjust(TIMER_PERIOD * effcount, which);
}
else
timer->active = timer->count = 0;

View File

@ -98,7 +98,7 @@ void k033906_device::reg_w(int reg, uint32_t data)
case 0x10: // initEnable
{
m_voodoo->voodoo_set_init_enable(data);
m_voodoo->set_init_enable(data);
break;
}

View File

@ -45,7 +45,7 @@ private:
int m_reg_set; // 1 = access reg / 0 = access ram
required_device<voodoo_device> m_voodoo;
required_device<generic_voodoo_device> m_voodoo;
std::unique_ptr<u32[]> m_reg;
std::unique_ptr<u32[]> m_ram;

View File

@ -121,6 +121,10 @@ protected:
address_map_constructor delegate(map, name, static_cast<T *>(this));
add_map(size, flags, delegate);
}
template <typename T> void add_map(uint64_t size, int flags, T &device, void (T::*map)(address_map &map), const char *name) {
address_map_constructor delegate(map, name, &device);
add_map(size, flags, delegate, &device);
}
void add_rom(const uint8_t *data, uint32_t size);
void add_rom_from_region();

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,165 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Ville Linde, Aaron Giles
/***************************************************************************
polylgcy.h
Legacy polygon helper routines.
****************************************************************************
Pixel model:
(0.0,0.0) (1.0,0.0) (2.0,0.0) (3.0,0.0)
+---------------+---------------+---------------+
| | | |
| | | |
| (0.5,0.5) | (1.5,0.5) | (2.5,0.5) |
| * | * | * |
| | | |
| | | |
(0.0,1.0) (1.0,1.0) (2.0,1.0) (3.0,1.0)
+---------------+---------------+---------------+
| | | |
| | | |
| (0.5,1.5) | (1.5,1.5) | (2.5,1.5) |
| * | * | * |
| | | |
| | | |
| | | |
+---------------+---------------+---------------+
(0.0,2.0) (1.0,2.0) (2.0,2.0) (3.0,2.0)
***************************************************************************/
#ifndef MAME_VIDEO_POLYLGCY_H
#define MAME_VIDEO_POLYLGCY_H
#pragma once
/***************************************************************************
CONSTANTS
***************************************************************************/
static constexpr unsigned POLYLGCY_MAX_VERTEX_PARAMS = 6;
static constexpr unsigned POLYLGCY_MAX_POLYGON_VERTS = 32;
static constexpr uint8_t POLYLGCY_FLAG_INCLUDE_BOTTOM_EDGE = 0x01;
static constexpr uint8_t POLYLGCY_FLAG_INCLUDE_RIGHT_EDGE = 0x02;
static constexpr uint8_t POLYLGCY_FLAG_NO_WORK_QUEUE = 0x04;
static constexpr uint8_t POLYLGCY_FLAG_ALLOW_QUADS = 0x08;
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
/* opaque reference to the poly manager */
struct legacy_poly_manager;
class legacy_poly_manager_owner
{
public:
legacy_poly_manager_owner();
~legacy_poly_manager_owner();
operator legacy_poly_manager *() { return m_poly; }
legacy_poly_manager *m_poly;
};
/* input vertex data */
struct poly_vertex
{
float x; /* X coordinate */
float y; /* Y coordinate */
float p[POLYLGCY_MAX_VERTEX_PARAMS]; /* interpolated parameter values */
};
/* poly_param_extent describes information for a single parameter in an extent */
struct poly_param_extent
{
float start; /* parameter value at starting X,Y */
float dpdx; /* dp/dx relative to starting X */
};
/* poly_extent describes start/end points for a scanline, along with per-scanline parameters */
struct poly_extent
{
int16_t startx; /* starting X coordinate (inclusive) */
int16_t stopx; /* ending X coordinate (exclusive) */
poly_param_extent param[POLYLGCY_MAX_VERTEX_PARAMS]; /* starting and dx values for each parameter */
};
/* callback routine to process a batch of scanlines in a triangle */
typedef void (*poly_draw_scanline_func)(void *dest, int32_t scanline, const poly_extent *extent, const void *extradata, int threadid);
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
/* ----- initialization/teardown ----- */
/* allocate a new poly manager that can render triangles */
void poly_alloc(legacy_poly_manager_owner &owner, running_machine &machine, int max_polys, size_t extra_data_size, uint8_t flags);
/* free a poly manager */
void poly_free(legacy_poly_manager *poly);
/* ----- common functions ----- */
/* wait until all polygons in the queue have been rendered */
void poly_wait(legacy_poly_manager *poly, const char *debug_reason);
/* get a pointer to the extra data for the next polygon */
void *poly_get_extra_data(legacy_poly_manager *poly);
/* ----- core triangle rendering ----- */
/* render a single triangle given 3 vertexes */
uint32_t poly_render_triangle(legacy_poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3);
/* render a set of triangles in a fan */
uint32_t poly_render_triangle_fan(legacy_poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v);
/* perform a custom render of an object, given specific extents */
uint32_t poly_render_triangle_custom(legacy_poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int startscanline, int numscanlines, const poly_extent *extents);
/* ----- core quad rendering ----- */
/* render a single quad given 4 vertexes */
uint32_t poly_render_quad(legacy_poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3, const poly_vertex *v4);
/* render a set of quads in a fan */
uint32_t poly_render_quad_fan(legacy_poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v);
/* ----- core polygon rendering ----- */
/* render a single polygon up to 32 vertices */
uint32_t poly_render_polygon(legacy_poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v);
/* ----- clipping ----- */
/* zclip (assumes p[0] == z) a polygon */
int poly_zclip_if_less(int numverts, const poly_vertex *v, poly_vertex *outv, int paramcount, float clipval);
#endif // MAME_VIDEO_POLYLGCY_H

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,249 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************
voodoo_2.h
3dfx Voodoo Graphics SST-1/2 emulator.
***************************************************************************/
#ifndef MAME_VIDEO_VOODOO_2_H
#define MAME_VIDEO_VOODOO_2_H
#pragma once
#include "voodoo.h"
// forward declarations
class voodoo_2_device;
//**************************************************************************
// INTERNAL CLASSES
//**************************************************************************
namespace voodoo
{
// ======================> command_fifo
// command_fifo is a more intelligent FIFO that was introduced with the Voodoo-2
class command_fifo
{
public:
// construction
command_fifo(voodoo_2_device &device);
// initialization
void init(u8 *ram, u32 size) { m_ram = (u32 *)ram; m_mask = (size / 4) - 1; }
// state saving
void register_save(save_proxy &save);
// getters
bool enabled() const { return m_enable; }
u32 address_min() const { return m_address_min; }
u32 address_max() const { return m_address_max; }
u32 read_pointer() const { return m_read_index * 4; }
u32 depth() const { return m_depth; }
u32 holes() const { return m_holes; }
// setters
void set_enable(bool enabled) { m_enable = enabled; }
void set_count_holes(bool count) { m_count_holes = count; }
void set_base(u32 base) { m_ram_base = base; }
void set_end(u32 end) { m_ram_end = end; }
void set_size(u32 size) { m_ram_end = m_ram_base + size; }
void set_read_pointer(u32 ptr) { m_read_index = ptr / 4; }
void set_address_min(u32 addr) { m_address_min = addr; }
void set_address_max(u32 addr) { m_address_max = addr; }
void set_depth(u32 depth) { m_depth = depth; }
void set_holes(u32 holes) { m_holes = holes; }
// operations
u32 execute_if_ready();
// write to the FIFO if within the address range
bool write_if_in_range(offs_t addr, u32 data)
{
if (m_enable && addr >= m_ram_base && addr < m_ram_end)
{
write(addr, data);
return true;
}
return false;
}
// write directly to the FIFO, relative to the base
void write_direct(offs_t offset, u32 data)
{
write(m_ram_base + offset * 4, data);
}
private:
// internal helpers
void consume(u32 words) { m_read_index += words; m_depth -= words; }
u32 peek_next() { return m_ram[m_read_index & m_mask]; }
u32 read_next() { u32 result = peek_next(); consume(1); return result; }
float read_next_float() { float result = *(float *)&m_ram[m_read_index & m_mask]; consume(1); return result; }
// internal operations
u32 words_needed(u32 command);
void write(offs_t addr, u32 data);
// packet handlers
using packet_handler = u32 (command_fifo::*)(u32);
u32 packet_type_0(u32 command);
u32 packet_type_1(u32 command);
u32 packet_type_2(u32 command);
u32 packet_type_3(u32 command);
u32 packet_type_4(u32 command);
u32 packet_type_5(u32 command);
u32 packet_type_unknown(u32 command);
// internal state
voodoo_2_device &m_device; // reference to our device
u32 *m_ram; // base of RAM
u32 m_mask; // mask for RAM accesses
bool m_enable; // enabled?
bool m_count_holes; // count holes?
u32 m_ram_base; // base address in framebuffer RAM
u32 m_ram_end; // end address in framebuffer RAM
u32 m_read_index; // current read index into 32-bit RAM
u32 m_address_min; // minimum address
u32 m_address_max; // maximum address
u32 m_depth; // current depth
u32 m_holes; // number of holes
static packet_handler s_packet_handler[8];
};
// ======================> setup_vertex
// setup_vertex a set of coordinates managed by the triangle setup engine
// that was introduced with the Voodoo-2
struct setup_vertex
{
// state saving
void register_save(save_proxy &save)
{
save.save_item(NAME(x));
save.save_item(NAME(y));
save.save_item(NAME(z));
save.save_item(NAME(wb));
save.save_item(NAME(r));
save.save_item(NAME(g));
save.save_item(NAME(b));
save.save_item(NAME(a));
save.save_item(NAME(s0));
save.save_item(NAME(t0));
save.save_item(NAME(w0));
save.save_item(NAME(s1));
save.save_item(NAME(t1));
save.save_item(NAME(w1));
}
float x, y; // X, Y coordinates
float z, wb; // Z and broadcast W values
float r, g, b, a; // A, R, G, B values
float s0, t0, w0; // W, S, T for TMU 0
float s1, t1, w1; // W, S, T for TMU 1
};
}
//**************************************************************************
// VOODOO 2 DEVICE
//**************************************************************************
DECLARE_DEVICE_TYPE(VOODOO_2, voodoo_2_device)
// ======================> voodoo_2_device
// voodoo_2_device represents the 2nd generation of 3dfx Voodoo Graphics devices;
// these are pretty similar in architecture to the first generation, with the
// addition of command FIFOs and several other smaller features
class voodoo_2_device : public voodoo_1_device
{
friend class voodoo::command_fifo;
protected:
// internal construction
voodoo_2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, voodoo::voodoo_model model);
public:
// nominal clock value
static constexpr u32 NOMINAL_CLOCK = 90'000'000;
// construction
voodoo_2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
voodoo_2_device(mconfig, VOODOO_2, tag, owner, clock, voodoo::voodoo_model::VOODOO_2) { }
// address map and read/write helpers
virtual void core_map(address_map &map) override;
virtual u32 read(offs_t offset, u32 mem_mask = ~0) override;
virtual void write(offs_t offset, u32 data, u32 mem_mask = ~0) override;
protected:
// device-level overrides
virtual void device_start() override;
// system management
virtual void soft_reset() override;
virtual void register_save(voodoo::save_proxy &save, u32 total_allocation) override;
// mapped writes
void map_register_w(offs_t offset, u32 data, u32 mem_mask = ~0);
// read/write and FIFO helpers
virtual u32 execute_fifos() override;
// register read accessors
u32 reg_hvretrace_r(u32 chipmask, u32 regnum);
u32 reg_cmdfifoptr_r(u32 chipmask, u32 regnum);
u32 reg_cmdfifodepth_r(u32 chipmask, u32 regnum);
u32 reg_cmdfifoholes_r(u32 chipmask, u32 regnum);
// register write accessors
u32 reg_intrctrl_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_video2_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_sargb_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_userintr_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_cmdfifo_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_cmdfifoptr_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_cmdfifodepth_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_cmdfifoholes_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_fbiinit5_7_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_draw_tri_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_begin_tri_w(u32 chipmask, u32 regnum, u32 data);
// command FIFO-specific write handlers
virtual u32 cmdfifo_register_w(u32 offset, u32 data);
virtual u32 cmdfifo_2d_w(u32 offset, u32 data);
// VBLANK timing
virtual void vblank_start(void *ptr, s32 param) override;
virtual void vblank_stop(void *ptr, s32 param) override;
// video timing and updates
virtual void recompute_video_memory() override;
// rendering
s32 begin_triangle();
s32 draw_triangle();
s32 setup_and_draw_triangle();
// internal state
u8 m_sverts = 0; // number of vertices ready
voodoo::setup_vertex m_svert[3]; // 3 setup vertices
voodoo::command_fifo m_cmdfifo; // command FIFO
// register table
static voodoo::static_register_table_entry<voodoo_2_device> const s_register_table[256];
};
#endif // MAME_VIDEO_VOODOO_2_H

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,185 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************
voodoo_banshee.h
3dfx Voodoo Graphics SST-1/2 emulator.
***************************************************************************/
#ifndef MAME_VIDEO_VOODOO_BANSHEE_H
#define MAME_VIDEO_VOODOO_BANSHEE_H
#pragma once
#include "voodoo_2.h"
//**************************************************************************
// CONSTANTS
//**************************************************************************
namespace voodoo
{
// logging
static constexpr bool LOG_BANSHEE_2D = false;
}
//**************************************************************************
// VOODOO DEVICES
//**************************************************************************
DECLARE_DEVICE_TYPE(VOODOO_BANSHEE, voodoo_banshee_device)
// ======================> voodoo_banshee_device
class voodoo_banshee_device : public voodoo_2_device
{
protected:
// internal construction
voodoo_banshee_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, voodoo::voodoo_model model);
public:
// nominal clock values
static constexpr u32 NOMINAL_CLOCK = 90'000'000;
// construction
voodoo_banshee_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
voodoo_banshee_device(mconfig, VOODOO_BANSHEE, tag, owner, clock, voodoo::voodoo_model::VOODOO_BANSHEE) { }
// core address map and read/write helpers
virtual void core_map(address_map &map) override;
virtual u32 read(offs_t offset, u32 mem_mask = ~0) override;
virtual void write(offs_t offset, u32 data, u32 mem_mask = ~0) override;
// LFB address map and read/write helpers
virtual void lfb_map(address_map &map);
virtual u32 read_lfb(offs_t offset, u32 mem_mask = ~0);
virtual void write_lfb(offs_t offset, u32 data, u32 mem_mask = ~0);
// I/O address map and read/write helpers
virtual void io_map(address_map &map);
virtual u32 read_io(offs_t offset, u32 mem_mask = ~0) { return map_io_r(offset, mem_mask); }
virtual void write_io(offs_t offset, u32 data, u32 mem_mask = ~0) { map_io_w(offset, data, mem_mask); }
// video update
virtual int update(bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
protected:
// device-level overrides
virtual void device_start() override;
// system management
virtual void soft_reset() override;
virtual void register_save(voodoo::save_proxy &save, u32 total_allocation) override;
// buffer accessors
virtual u16 *lfb_buffer_indirect(int index) override;
virtual u16 *draw_buffer_indirect(int index) override;
// mapped reads
u32 map_io_r(offs_t offset, u32 mem_mask);
u32 map_cmd_agp_r(offs_t offset);
u32 map_2d_r(offs_t offset);
u32 map_register_r(offs_t offset);
// mapped writes
void map_io_w(offs_t offset, u32 data, u32 mem_mask);
void map_cmd_agp_w(offs_t offset, u32 data, u32 mem_mask);
void map_2d_w(offs_t offset, u32 data, u32 mem_mask);
void map_register_w(offs_t offset, u32 data, u32 mem_mask);
template<int Which> void map_texture_w(offs_t offset, u32 data, u32 mem_mask);
void map_yuv_w(offs_t offset, u32 data, u32 mem_mask);
void map_lfb_w(offs_t offset, u32 data, u32 mem_mask);
// internal reads and writes
u32 internal_io_r(offs_t offset, u32 mem_mask = ~0);
void internal_io_w(offs_t offset, u32 data, u32 mem_mask = ~0);
u32 internal_cmd_agp_r(offs_t offset);
void internal_cmd_agp_w(offs_t offset, u32 data, u32 mem_mask = ~0);
s32 internal_2d_w(offs_t offset, u32 data);
virtual void internal_texture_w(offs_t offset, u32 data) override;
void internal_lfb_direct_w(offs_t offset, u32 data, u32 mem_mask);
u8 internal_vga_r(offs_t offset);
void internal_vga_w(offs_t offset, u8 data);
// read/write and FIFO helpers
virtual u32 execute_fifos() override;
// register read accessors
u32 reg_status_r(u32 chipmask, u32 offset);
// register write accessors
u32 reg_colbufbase_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_colbufstride_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_auxbufbase_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_auxbufstride_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_swappending_w(u32 chipmask, u32 regnum, u32 data);
u32 reg_overbuffer_w(u32 chipmask, u32 regnum, u32 data);
// VBLANK timing
virtual void rotate_buffers() override;
// video timing and updates
void recompute_video();
// command FIFO-specific write handlers
virtual u32 cmdfifo_register_w(u32 offset, u32 data) override;
virtual u32 cmdfifo_2d_w(u32 offset, u32 data) override;
// rendering
void execute_blit(u32 data);
// internal state
u32 m_lfb_base; // configured LFB base
voodoo::command_fifo m_cmdfifo2; // second command FIFO
voodoo::banshee_io_regs m_io_regs; // I/O registers
voodoo::banshee_cmd_agp_regs m_cmd_agp_regs; // CMD/AGP registers
voodoo::banshee_vga_regs m_vga_regs; // VGA registers
voodoo::banshee_2d_regs m_2d_regs; // 2D registers
u32 m_blt_dst_base = 0;
u32 m_blt_dst_x = 0;
u32 m_blt_dst_y = 0;
u32 m_blt_dst_width = 0;
u32 m_blt_dst_height = 0;
u32 m_blt_dst_stride = 0;
u32 m_blt_dst_bpp = 0;
u32 m_blt_cmd = 0;
u32 m_blt_src_base = 0;
u32 m_blt_src_x = 0;
u32 m_blt_src_y = 0;
u32 m_blt_src_width = 0;
u32 m_blt_src_height = 0;
u32 m_blt_src_stride = 0;
u32 m_blt_src_bpp = 0;
static voodoo::static_register_table_entry<voodoo_banshee_device> const s_register_table[256];
};
// ======================> voodoo_3_device
DECLARE_DEVICE_TYPE(VOODOO_3, voodoo_3_device)
class voodoo_3_device : public voodoo_banshee_device
{
public:
// nominal clock values
static constexpr u32 NOMINAL_CLOCK = 132'000'000;
// construction
voodoo_3_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
// device-level overrides
virtual void device_start() override;
};
#endif // MAME_VIDEO_VOODOO_BANSHEE_H

View File

@ -8,28 +8,40 @@
void voodoo_1_pci_device::device_add_mconfig(machine_config &config)
{
VOODOO_1(config, m_voodoo, STD_VOODOO_1_CLOCK);
VOODOO_1(config, m_voodoo, voodoo_1_device::NOMINAL_CLOCK);
m_voodoo->set_fbmem(4);
m_voodoo->set_tmumem(1, 0);
m_voodoo->set_status_cycles(m_status_cycles);
m_voodoo->set_cpu(m_cpu);
m_voodoo->set_screen(m_screen);
}
void voodoo_2_pci_device::device_add_mconfig(machine_config &config)
{
VOODOO_2(config, m_voodoo, STD_VOODOO_2_CLOCK);
VOODOO_2(config, m_voodoo, voodoo_2_device::NOMINAL_CLOCK);
m_voodoo->set_fbmem(4);
m_voodoo->set_tmumem(1, 0);
m_voodoo->set_status_cycles(m_status_cycles);
m_voodoo->set_cpu(m_cpu);
m_voodoo->set_screen(m_screen);
}
void voodoo_banshee_pci_device::device_add_mconfig(machine_config &config)
{
VOODOO_BANSHEE(config, m_voodoo, STD_VOODOO_BANSHEE_CLOCK);
VOODOO_BANSHEE(config, m_voodoo, voodoo_banshee_device::NOMINAL_CLOCK);
m_voodoo->set_fbmem(16);
m_voodoo->set_status_cycles(m_status_cycles);
m_voodoo->set_cpu(m_cpu);
m_voodoo->set_screen(m_screen);
}
void voodoo_3_pci_device::device_add_mconfig(machine_config &config)
{
VOODOO_3(config, m_voodoo, STD_VOODOO_3_CLOCK);
VOODOO_3(config, m_voodoo, voodoo_3_device::NOMINAL_CLOCK);
m_voodoo->set_fbmem(16);
m_voodoo->set_status_cycles(m_status_cycles);
m_voodoo->set_cpu(m_cpu);
m_voodoo->set_screen(m_screen);
}
DEFINE_DEVICE_TYPE(VOODOO_1_PCI, voodoo_1_pci_device, "voodoo_1_pci", "Voodoo 1 PCI")
@ -43,74 +55,50 @@ void voodoo_pci_device::config_map(address_map &map)
map(0x40, 0x5f).rw(FUNC(voodoo_pci_device::pcictrl_r), FUNC(voodoo_pci_device::pcictrl_w));
}
// VOODOO_1 & VOODOO_2 map
void voodoo_pci_device::voodoo_reg_map(address_map &map)
{
map(0x0, 0x00ffffff).rw(m_voodoo, FUNC(voodoo_device::voodoo_r), FUNC(voodoo_device::voodoo_w));
}
// VOODOO_BANSHEE and VOODOO_3 maps
void voodoo_pci_device::banshee_reg_map(address_map &map)
{
map(0x0, 0x01ffffff).rw(m_voodoo, FUNC(voodoo_banshee_device::banshee_r), FUNC(voodoo_banshee_device::banshee_w));
}
void voodoo_pci_device::lfb_map(address_map &map)
{
map(0x0, 0x01ffffff).rw(m_voodoo, FUNC(voodoo_banshee_device::banshee_fb_r), FUNC(voodoo_banshee_device::banshee_fb_w));
}
void voodoo_pci_device::io_map(address_map &map)
{
map(0x000, 0x0ff).rw(m_voodoo, FUNC(voodoo_banshee_device::banshee_io_r), FUNC(voodoo_banshee_device::banshee_io_w));
}
voodoo_pci_device::voodoo_pci_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
voodoo_pci_device::voodoo_pci_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: pci_device(mconfig, type, tag, owner, clock),
m_voodoo(*this, "voodoo"), m_cpu(*this, finder_base::DUMMY_TAG), m_screen(*this, finder_base::DUMMY_TAG), m_fbmem(2), m_tmumem0(0), m_tmumem1(0)
m_generic_voodoo(*this, "voodoo"), m_cpu(*this, finder_base::DUMMY_TAG), m_screen(*this, finder_base::DUMMY_TAG), m_fbmem(2), m_tmumem0(0), m_tmumem1(0)
{
}
voodoo_1_pci_device::voodoo_1_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: voodoo_pci_device(mconfig, VOODOO_1_PCI, tag, owner, clock)
voodoo_1_pci_device::voodoo_1_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: voodoo_pci_device(mconfig, VOODOO_1_PCI, tag, owner, clock), m_voodoo(*this, "voodoo")
{
}
voodoo_2_pci_device::voodoo_2_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: voodoo_pci_device(mconfig, VOODOO_2_PCI, tag, owner, clock)
voodoo_2_pci_device::voodoo_2_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: voodoo_pci_device(mconfig, VOODOO_2_PCI, tag, owner, clock), m_voodoo(*this, "voodoo")
{
}
voodoo_banshee_pci_device::voodoo_banshee_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: voodoo_pci_device(mconfig, VOODOO_BANSHEE_PCI, tag, owner, clock)
voodoo_banshee_pci_device::voodoo_banshee_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: voodoo_pci_device(mconfig, VOODOO_BANSHEE_PCI, tag, owner, clock), m_voodoo(*this, "voodoo")
{
}
voodoo_3_pci_device::voodoo_3_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: voodoo_pci_device(mconfig, VOODOO_3_PCI, tag, owner, clock)
voodoo_3_pci_device::voodoo_3_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: voodoo_pci_device(mconfig, VOODOO_3_PCI, tag, owner, clock), m_voodoo(*this, "voodoo")
{
}
void voodoo_pci_device::device_start()
{
if (m_cpu)
m_voodoo->set_cpu(*m_cpu);
if (m_screen)
m_voodoo->set_screen(*m_screen);
m_voodoo->set_fbmem(m_fbmem);
m_voodoo->set_tmumem(m_tmumem0, m_tmumem1);
m_generic_voodoo->set_fbmem(m_fbmem);
m_generic_voodoo->set_tmumem(m_tmumem0, m_tmumem1);
m_generic_voodoo->set_status_cycles(m_status_cycles);
pci_device::device_start();
save_item(NAME(m_pcictrl_reg));
machine().save().register_postload(save_prepost_delegate(FUNC(voodoo_pci_device::postload), this));
}
//void set_ids(uint32_t main_id, uint8_t revision, uint32_t pclass, uint32_t subsystem_id);
//void set_ids(u32 main_id, u8 revision, u32 pclass, u32 subsystem_id);
void voodoo_1_pci_device::device_start()
{
set_ids(0x121a0001, 0x02, 0x030000, 0x000000);
voodoo_pci_device::device_start();
add_map(16 * 1024 * 1024, M_MEM | M_PREF, FUNC(voodoo_pci_device::voodoo_reg_map));
add_map(16 * 1024 * 1024, M_MEM | M_PREF, *m_voodoo, FUNC(voodoo_1_device::core_map));
bank_infos[0].adr = 0xff000000;
}
@ -120,7 +108,7 @@ void voodoo_2_pci_device::device_start()
voodoo_pci_device::device_start();
add_map(16 * 1024 * 1024, M_MEM | M_PREF, FUNC(voodoo_pci_device::voodoo_reg_map));
add_map(16 * 1024 * 1024, M_MEM | M_PREF, *m_voodoo, FUNC(voodoo_2_device::core_map));
bank_infos[0].adr = 0xff000000;
}
@ -130,9 +118,9 @@ void voodoo_banshee_pci_device::device_start()
voodoo_pci_device::device_start();
add_map(32 * 1024 * 1024, M_MEM, FUNC(voodoo_pci_device::banshee_reg_map));
add_map(32 * 1024 * 1024, M_MEM, FUNC(voodoo_pci_device::lfb_map));
add_map(256, M_IO, FUNC(voodoo_pci_device::io_map));
add_map(32 * 1024 * 1024, M_MEM, *m_voodoo, FUNC(voodoo_banshee_device::core_map));
add_map(32 * 1024 * 1024, M_MEM, *m_voodoo, FUNC(voodoo_banshee_device::lfb_map));
add_map(256, M_IO, *m_voodoo, FUNC(voodoo_banshee_device::io_map));
bank_infos[0].adr = 0xf8000000;
bank_infos[1].adr = 0xf8000008;
bank_infos[2].adr = 0xfffffff0;
@ -144,9 +132,12 @@ void voodoo_3_pci_device::device_start()
voodoo_pci_device::device_start();
add_map(32 * 1024 * 1024, M_MEM, FUNC(voodoo_pci_device::banshee_reg_map));
add_map(32 * 1024 * 1024, M_MEM, FUNC(voodoo_pci_device::lfb_map));
add_map(256, M_IO, FUNC(voodoo_pci_device::io_map));
// need to downcast to voodoo_banshee_device because the map functions are shared
// this will cleaner when the PCI interface is implemented as a mix-in
auto &banshee = static_cast<voodoo_banshee_device &>(*m_voodoo);
add_map(32 * 1024 * 1024, M_MEM, banshee, FUNC(voodoo_banshee_device::core_map));
add_map(32 * 1024 * 1024, M_MEM, banshee, FUNC(voodoo_banshee_device::lfb_map));
add_map(256, M_IO, banshee, FUNC(voodoo_banshee_device::io_map));
bank_infos[0].adr = 0xf8000000;
bank_infos[1].adr = 0xf8000008;
bank_infos[2].adr = 0xfffffff0;
@ -163,58 +154,61 @@ void voodoo_pci_device::device_reset()
pci_device::device_reset();
}
void voodoo_pci_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space)
void voodoo_pci_device::map_extra(u64 memory_window_start, u64 memory_window_end, u64 memory_offset, address_space *memory_space,
u64 io_window_start, u64 io_window_end, u64 io_offset, address_space *io_space)
{
logerror("%s: map_extra\n", this->tag());
}
void voodoo_banshee_pci_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space)
void voodoo_banshee_pci_device::map_extra(u64 memory_window_start, u64 memory_window_end, u64 memory_offset, address_space *memory_space,
u64 io_window_start, u64 io_window_end, u64 io_offset, address_space *io_space)
{
logerror("%s: map_extra\n", this->tag());
// Map VGA legacy access
// Should really be dependent on voodoo VGAINIT0 bit 8 and IO base + 0xc3 bit 0
uint64_t start = io_offset + 0x3b0;
uint64_t end = io_offset + 0x3df;
u64 start = io_offset + 0x3b0;
u64 end = io_offset + 0x3df;
io_space->install_readwrite_handler(start, end, read32s_delegate(*this, FUNC(voodoo_pci_device::vga_r)), write32s_delegate(*this, FUNC(voodoo_pci_device::vga_w)));
logerror("%s: map %s at %0*x-%0*x\n", this->tag(), "vga_r/w", 4, uint32_t(start), 4, uint32_t(end));
logerror("%s: map %s at %0*x-%0*x\n", this->tag(), "vga_r/w", 4, u32(start), 4, u32(end));
}
void voodoo_3_pci_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space)
void voodoo_3_pci_device::map_extra(u64 memory_window_start, u64 memory_window_end, u64 memory_offset, address_space *memory_space,
u64 io_window_start, u64 io_window_end, u64 io_offset, address_space *io_space)
{
logerror("%s: map_extra\n", this->tag());
// Map VGA legacy access
// Should really be dependent on voodoo VGAINIT0 bit 8 and IO base + 0xc3 bit 0
uint64_t start = io_offset + 0x3b0;
uint64_t end = io_offset + 0x3df;
u64 start = io_offset + 0x3b0;
u64 end = io_offset + 0x3df;
io_space->install_readwrite_handler(start, end, read32s_delegate(*this, FUNC(voodoo_pci_device::vga_r)), write32s_delegate(*this, FUNC(voodoo_pci_device::vga_w)));
logerror("%s: map %s at %0*x-%0*x\n", this->tag(), "vga_r/w", 4, uint32_t(start), 4, uint32_t(end));
logerror("%s: map %s at %0*x-%0*x\n", this->tag(), "vga_r/w", 4, u32(start), 4, u32(end));
}
uint32_t voodoo_pci_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
u32 voodoo_pci_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
return m_generic_voodoo->update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
}
// PCI bus control
uint32_t voodoo_pci_device::pcictrl_r(offs_t offset, uint32_t mem_mask)
u32 voodoo_pci_device::pcictrl_r(offs_t offset, u32 mem_mask)
{
uint32_t result = m_pcictrl_reg[offset];
u32 result = m_pcictrl_reg[offset];
// The address map starts at 0x40
switch (offset + 0x40 / 4) {
case 0x40/4:
{
// V1: initEnable: 11:0
// V2: initEnable: Fab ID=19:16, Graphics Rev=15:12
// Banshee/V3: fabID: ScratchPad=31:4 fabID=3:0
if (m_voodoo->vd_type== TYPE_VOODOO_2)
auto model = m_generic_voodoo->model();
if (model == voodoo::voodoo_model::VOODOO_2)
result = (result & ~0xff000) | 0x00044000; // Vegas driver needs this value
else if (m_voodoo->vd_type >= TYPE_VOODOO_BANSHEE)
else if (model >= voodoo::voodoo_model::VOODOO_BANSHEE)
result = (result & ~0xf) | 0x1;
break;
}
case 0x54/4:
// V2: SiProcess Register: Osc Force On, Osc Ring Sel, Osc Count Reset, 12 bit PCI Counter, 16 bit Oscillator Counter
// V3: AGP Capability Register: 8 bit 0, 4 bit AGP Major, 4 bit AGP Minor, 8 bit Next Ptr, 8 bit Capability ID
@ -227,14 +221,14 @@ uint32_t voodoo_pci_device::pcictrl_r(offs_t offset, uint32_t mem_mask)
logerror("%s:voodoo_pci_device pcictrl_r from offset %02X = %08X & %08X\n", machine().describe_context(), offset*4 + 0x40, result, mem_mask);
return result;
}
void voodoo_pci_device::pcictrl_w(offs_t offset, uint32_t data, uint32_t mem_mask)
void voodoo_pci_device::pcictrl_w(offs_t offset, u32 data, u32 mem_mask)
{
COMBINE_DATA(&m_pcictrl_reg[offset]);
// The address map starts at 0x40
switch (offset + 0x40 / 4) {
case 0x40/4:
// HW initEnable
m_voodoo->voodoo_set_init_enable(data);
m_generic_voodoo->set_init_enable(data);
logerror("%s:voodoo_pci_device pcictrl_w (initEnable) offset %02X = %08X & %08X\n", machine().describe_context(), offset * 4 + 0x40, data, mem_mask);
break;
default:
@ -244,32 +238,13 @@ void voodoo_pci_device::pcictrl_w(offs_t offset, uint32_t data, uint32_t mem_mas
}
// VGA legacy accesses
uint32_t voodoo_pci_device::vga_r(offs_t offset, uint32_t mem_mask)
u32 voodoo_pci_device::vga_r(offs_t offset, u32 mem_mask)
{
uint32_t result = 0;
if (ACCESSING_BITS_0_7)
result |= downcast<voodoo_banshee_device *>(m_voodoo.target())->banshee_vga_r(offset * 4 + 0 + 0xb0) << 0;
if (ACCESSING_BITS_8_15)
result |= downcast<voodoo_banshee_device *>(m_voodoo.target())->banshee_vga_r(offset * 4 + 1 + 0xb0) << 8;
if (ACCESSING_BITS_16_23)
result |= downcast<voodoo_banshee_device *>(m_voodoo.target())->banshee_vga_r(offset * 4 + 2 + 0xb0) << 16;
if (ACCESSING_BITS_24_31)
result |= downcast<voodoo_banshee_device *>(m_voodoo.target())->banshee_vga_r(offset * 4 + 3 + 0xb0) << 24;
if (0)
logerror("%s voodoo_pci_device vga_r from offset %02X = %08X & %08X\n", machine().describe_context(), offset * 4, result, mem_mask);
return result;
// map to I/O space at offset 0xb0
return m_generic_voodoo->read(0xb0/4 + offset, mem_mask);
}
void voodoo_pci_device::vga_w(offs_t offset, uint32_t data, uint32_t mem_mask)
void voodoo_pci_device::vga_w(offs_t offset, u32 data, u32 mem_mask)
{
if (ACCESSING_BITS_0_7)
downcast<voodoo_banshee_device *>(m_voodoo.target())->banshee_vga_w(offset * 4 + 0 + 0xb0, data >> 0);
if (ACCESSING_BITS_8_15)
downcast<voodoo_banshee_device *>(m_voodoo.target())->banshee_vga_w(offset * 4 + 1 + 0xb0, data >> 8);
if (ACCESSING_BITS_16_23)
downcast<voodoo_banshee_device *>(m_voodoo.target())->banshee_vga_w(offset * 4 + 2 + 0xb0, data >> 16);
if (ACCESSING_BITS_24_31)
downcast<voodoo_banshee_device *>(m_voodoo.target())->banshee_vga_w(offset * 4 + 3 + 0xb0, data >> 24);
if (0)
logerror("%s voodoo_pci_device vga_w to offset %04X = %08X & %08X\n", machine().describe_context(), offset * 4, data, mem_mask);
// map to I/O space at offset 0xb0
m_generic_voodoo->write(0xb0/4 + offset, data, mem_mask);
}

View File

@ -9,29 +9,26 @@
#include "machine/pci.h"
#include "voodoo.h"
#include "voodoo_banshee.h"
class voodoo_pci_device : public pci_device
{
public:
template <typename T> void set_cpu_tag(T &&tag) { m_cpu.set_tag(std::forward<T>(tag)); }
template <typename T> void set_screen_tag(T &&tag) { m_screen.set_tag(std::forward<T>(tag)); }
template <typename T> void set_cpu(T &&tag) { m_cpu.set_tag(std::forward<T>(tag)); }
template <typename T> void set_screen(T &&tag) { m_screen.set_tag(std::forward<T>(tag)); }
void set_fbmem(int fbmem) { m_fbmem = fbmem; }
void set_tmumem(int tmumem0, int tmumem1) { m_tmumem0 = tmumem0; m_tmumem1 = tmumem1; }
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void set_status_cycles(u32 cycles) { m_status_cycles = cycles; }
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t vga_r(offs_t offset, uint32_t mem_mask = ~0);
void vga_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
void voodoo_reg_map(address_map &map);
void banshee_reg_map(address_map &map);
void lfb_map(address_map &map);
void io_map(address_map &map);
u32 vga_r(offs_t offset, u32 mem_mask = ~0);
void vga_w(offs_t offset, u32 data, u32 mem_mask = ~0);
protected:
voodoo_pci_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
voodoo_pci_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override;
virtual void map_extra(u64 memory_window_start, u64 memory_window_end, u64 memory_offset, address_space *memory_space,
u64 io_window_start, u64 io_window_end, u64 io_offset, address_space *io_space) override;
virtual void config_map(address_map &map) override;
@ -40,93 +37,98 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
required_device<voodoo_device> m_voodoo;
required_device<generic_voodoo_device> m_generic_voodoo;
optional_device<cpu_device> m_cpu;
optional_device<screen_device> m_screen;
int m_fbmem, m_tmumem0, m_tmumem1;
u32 m_status_cycles;
uint32_t m_pcictrl_reg[0x20];
u32 m_pcictrl_reg[0x20];
uint32_t pcictrl_r(offs_t offset, uint32_t mem_mask = ~0);
void pcictrl_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
u32 pcictrl_r(offs_t offset, u32 mem_mask = ~0);
void pcictrl_w(offs_t offset, u32 data, u32 mem_mask = ~0);
};
class voodoo_1_pci_device : public voodoo_pci_device
{
public:
template <typename T, typename U>
voodoo_1_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, U &&screen_tag)
voodoo_1_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, T &&cpu_tag, U &&screen_tag)
: voodoo_1_pci_device(mconfig, tag, owner, clock)
{
set_cpu_tag(std::forward<T>(cpu_tag));
set_screen_tag(std::forward<U>(screen_tag));
set_cpu(std::forward<T>(cpu_tag));
set_screen(std::forward<U>(screen_tag));
}
voodoo_1_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
voodoo_1_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
virtual void device_start() override;
virtual void device_add_mconfig(machine_config &config) override;
required_device<voodoo_1_device> m_voodoo;
};
class voodoo_2_pci_device : public voodoo_pci_device
{
public:
template <typename T, typename U>
voodoo_2_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, U &&screen_tag)
voodoo_2_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, T &&cpu_tag, U &&screen_tag)
: voodoo_2_pci_device(mconfig, tag, owner, clock)
{
set_cpu_tag(std::forward<T>(cpu_tag));
set_screen_tag(std::forward<U>(screen_tag));
set_cpu(std::forward<T>(cpu_tag));
set_screen(std::forward<U>(screen_tag));
}
voodoo_2_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
voodoo_2_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
virtual void device_start() override;
virtual void device_add_mconfig(machine_config &config) override;
required_device<voodoo_2_device> m_voodoo;
};
class voodoo_banshee_pci_device : public voodoo_pci_device
{
public:
template <typename T, typename U>
voodoo_banshee_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, U &&screen_tag)
voodoo_banshee_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, T &&cpu_tag, U &&screen_tag)
: voodoo_banshee_pci_device(mconfig, tag, owner, clock)
{
set_cpu_tag(std::forward<T>(cpu_tag));
set_screen_tag(std::forward<U>(screen_tag));
set_cpu(std::forward<T>(cpu_tag));
set_screen(std::forward<U>(screen_tag));
}
voodoo_banshee_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
voodoo_banshee_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
virtual void device_start() override;
virtual void device_add_mconfig(machine_config &config) override;
virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override;
virtual void map_extra(u64 memory_window_start, u64 memory_window_end, u64 memory_offset, address_space *memory_space,
u64 io_window_start, u64 io_window_end, u64 io_offset, address_space *io_space) override;
required_device<voodoo_banshee_device> m_voodoo;
};
class voodoo_3_pci_device : public voodoo_pci_device
{
public:
template <typename T, typename U>
voodoo_3_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&cpu_tag, U &&screen_tag)
voodoo_3_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, T &&cpu_tag, U &&screen_tag)
: voodoo_3_pci_device(mconfig, tag, owner, clock)
{
set_cpu_tag(std::forward<T>(cpu_tag));
set_screen_tag(std::forward<U>(screen_tag));
set_cpu(std::forward<T>(cpu_tag));
set_screen(std::forward<U>(screen_tag));
}
voodoo_3_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
voodoo_3_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
virtual void device_start() override;
virtual void device_add_mconfig(machine_config &config) override;
virtual void map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space,
uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) override;
virtual void map_extra(u64 memory_window_start, u64 memory_window_end, u64 memory_offset, address_space *memory_space,
u64 io_window_start, u64 io_window_end, u64 io_offset, address_space *io_space) override;
required_device<voodoo_3_device> m_voodoo;
};
DECLARE_DEVICE_TYPE(VOODOO_1_PCI, voodoo_1_pci_device)

View File

@ -1,615 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************
GAME-SPECIFIC RASTERIZERS
***************************************************************************/
/* blitz ------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x00000035, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 284269 914846168 */
RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 485421 440309121 */
RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* 31606 230753709 */
RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 76742 211701679 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* 6188 152109056 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261ACF, 0xFFFFFFFF ) /* 1100 108134400 */
RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 6229525 106197740 */
RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B0799, 0x0C261A0F, 0xFFFFFFFF ) /* 905641 75886220 */
RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 205236 53317253 */
RASTERIZER_ENTRY( 0x01422439, 0x00000000, 0x00000000, 0x000B073B, 0x0C2610C9, 0xFFFFFFFF ) /* 817356 48881349 */
RASTERIZER_ENTRY( 0x00000035, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 37979 41687251 */
RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 26014 41183295 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 2512 37911104 */
RASTERIZER_ENTRY( 0x00006136, 0x00515119, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 28834 15527654 */
RASTERIZER_ENTRY( 0x00582435, 0x00515110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* 9878 4979429 */
RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* 199952 4622064 */
RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261AC9, 0xFFFFFFFF ) /* 8672 3676949 */
RASTERIZER_ENTRY( 0x00582C35, 0x00515010, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* 616 2743972 */
RASTERIZER_ENTRY( 0x01422C39, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 81380 2494832 */
//RASTERIZER_ENTRY( 0x00582435, 0x00515110, 0x00000000, 0x000B0739, 0x0C261AC9, 0xFFFFFFFF ) /* 7670 2235587 */
//RASTERIZER_ENTRY( 0x00592136, 0x00515110, 0x00000000, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* 210 1639140 */
//RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* 108 1154736 */
//RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* 2152 1150842 */
//RASTERIZER_ENTRY( 0x00592136, 0x00515110, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* 152 880560 */
//RASTERIZER_ENTRY( 0x00008035, 0x00515119, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* 90848 805730 */
//RASTERIZER_ENTRY( 0x00002C35, 0x00515119, 0x00000000, 0x000B07F9, 0x0C261AC9, 0xFFFFFFFF ) /* 2024 571406 */
//RASTERIZER_ENTRY( 0x00012136, 0x00515110, 0x00000000, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* 1792 494592 */
//RASTERIZER_ENTRY( 0x00000002, 0x00000000, 0x00000000, 0x00000300, 0xFFFFFFFF, 0xFFFFFFFF ) /* 256 161280 */
/* blitz99 ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x00000035, 0x00000009, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 6297478 149465839 */
RASTERIZER_ENTRY( 0x00000035, 0x00000009, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 210693 6285480 */
RASTERIZER_ENTRY( 0x01422C39, 0x00045110, 0x00000000, 0x000B073B, 0x0C2610C9, 0xFFFFFFFF ) /* * 20180 2718710 */
RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* * 360 2425416 */
RASTERIZER_ENTRY( 0x00002C35, 0x00000009, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 67059 1480978 */
RASTERIZER_ENTRY( 0x00008035, 0x00000009, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 24811 400666 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B073B, 0x0C2610C9, 0xFFFFFFFF ) /* * 10304 324468 */
RASTERIZER_ENTRY( 0x00002C35, 0x00515110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 1024 112665 */
/* blitz2k ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 3880 95344128 */
RASTERIZER_ENTRY( 0x00582C35, 0x00514110, 0x00000000, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 148 1785480 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000000, 0x000B073B, 0x0C2610CF, 0xFFFFFFFF ) /* * 9976 314244 */
/* carnevil ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x00030279, 0x0C261A0F, 0xFFFFFFFF ) /* * 492 84128082 */
RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 1988398 36166780 */
RASTERIZER_ENTRY( 0x00486116, 0x00045119, 0x00000000, 0x00030279, 0x0C26180F, 0xFFFFFFFF ) /* * 34424 28788847 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 514 26316800 */
RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000000, 0x000306F9, 0x0C261AC9, 0xFFFFFFFF ) /* * 7346 18805760 */
RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000302F9, 0x0C26180F, 0xFFFFFFFF ) /* * 130764 18678972 */
RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x000306F9, 0x0C2618C9, 0xFFFFFFFF ) /* * 7244 12179040 */
RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x000306F9, 0x0C26180F, 0xFFFFFFFF ) /* * 84520 12059721 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000306F9, 0x0C261AC9, 0xFFFFFFFF ) /* * 21926 11226112 */
RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030679, 0x0C2618C9, 0xFFFFFFFF ) /* * 92115 8926536 */
RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030279, 0x0C261A0F, 0xFFFFFFFF ) /* * 1730 7629334 */
RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000B0779, 0x0C26180F, 0xFFFFFFFF ) /* * 37408 5545956 */
RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x00030679, 0x0C26180F, 0xFFFFFFFF ) /* * 26528 4225026 */
RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000306F9, 0x0C26180F, 0xFFFFFFFF ) /* * 35764 3230884 */
RASTERIZER_ENTRY( 0x01422409, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 96020 1226438 */
RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030279, 0x0C2618C9, 0xFFFFFFFF ) /* * 1020 574649 */
RASTERIZER_ENTRY( 0x00482415, 0x00045119, 0x00000000, 0x00030679, 0x0C261A0F, 0xFFFFFFFF ) /* * 360 370008 */
RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000000, 0x000306F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 576 334404 */
/* calspeed ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26100F, 0xFFFFFFFF ) /* * 99120 1731923836 */
RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 9955804 1526119944 */
RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0739, 0x0C26180F, 0xFFFFFFFF ) /* * 1898207 1124776864 */
RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 3487467 1101663125 */
RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 1079277 609256033 */
RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000A0723, 0x0C261ACF, 0xFFFFFFFF ) /* * 11880 583925760 */
RASTERIZER_ENTRY( 0x00602819, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 63644 582469888 */
RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 22688 556797972 */
RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 1360254 417068457 */
RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 3427489 405421272 */
RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B0739, 0x0C26180F, 0xFFFFFFFF ) /* * 286809 238944049 */
RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000A0321, 0x0C26180F, 0xFFFFFFFF ) /* * 28160 231084818 */
RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07FB, 0x0C26100F, 0xFFFFFFFF ) /* * 183564 201014424 */
RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000001, 0x000B0339, 0x0C26100F, 0xFFFFFFFF ) /* * 15275 168207109 */
RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07F9, 0x0C26100F, 0xFFFFFFFF ) /* * 2856 134400000 */
RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0339, 0x0C26180F, 0xFFFFFFFF ) /* * 98551 110417974 */
RASTERIZER_ENTRY( 0x01022819, 0x00000009, 0x00000001, 0x000B07F9, 0x0C2610CF, 0xFFFFFFFF ) /* * 47040 107360728 */
RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000001, 0x000B0339, 0x0C26180F, 0xFFFFFFFF ) /* * 13128 86876789 */
RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 257515 76329054 */
RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 3934 64958208 */
//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 77400 63786236 */
//RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 12500 63151200 */
//RASTERIZER_ENTRY( 0x0102001A, 0x00045119, 0x00000001, 0x000A0321, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 8764 57629312 */
//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000A0321, 0x0C26180F, 0xFFFFFFFF ) /* * 3257 32708448 */
//RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000A07E3, 0x0C2610CF, 0xFFFFFFFF ) /* * 28364 31195605 */
//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 409001 30699647 */
//RASTERIZER_ENTRY( 0x00482C35, 0x00045119, 0x00000001, 0x000A0321, 0x0C26100F, 0xFFFFFFFF ) /* * 17669 11214172 */
//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B0339, 0x0C26180F, 0xFFFFFFFF ) /* * 5844 6064373 */
//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000B07FB, 0x0C26100F, 0xFFFFFFFF ) /* * 626 4651080 */
//RASTERIZER_ENTRY( 0x00482C35, 0x00045119, 0x00000001, 0x000A0321, 0x0C26180F, 0xFFFFFFFF ) /* * 5887 2945500 */
//RASTERIZER_ENTRY( 0x00480015, 0x00045119, 0x00000001, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 1090 2945093 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000001, 0x000B07F9, 0x0C26180F, 0xFFFFFFFF ) /* * 228 1723908 */
//RASTERIZER_ENTRY( 0x00002C15, 0x00045119, 0x00000001, 0x000A0321, 0x0C261A0F, 0xFFFFFFFF ) /* * 112 1433600 */
//RASTERIZER_ENTRY( 0x00002815, 0x00045119, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 3091 1165805 */
//RASTERIZER_ENTRY( 0x01022C19, 0x00000009, 0x00000001, 0x000B07FB, 0x0C26100F, 0xFFFFFFFF ) /* * 620 791202 */
/* hyprdriv ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 60860 498565120 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B07F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 28688 235012096 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B07F9, 0x0C261ACF, 0xFFFFFFFF ) /* * 11844 156499968 */
RASTERIZER_ENTRY( 0x00580035, 0x00045119, 0x00000001, 0x00030279, 0x0C261A0F, 0xFFFFFFFF ) /* * 175990 146518715 */
RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000001, 0x000B0739, 0x0C261ACF, 0xFFFFFFFF ) /* * 2336 114819072 */
RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 363325 100404294 */
RASTERIZER_ENTRY( 0x00582C35, 0x00045110, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 40918 96318738 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 54815 94990269 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A1F, 0xFFFFFFFF ) /* * 123032 91652828 */
RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A1F, 0xFFFFFFFF ) /* * 82767 86431997 */
RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 9874 78101834 */
RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 102146 72570879 */
RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 657804 67229658 */
RASTERIZER_ENTRY( 0x00580035, 0x00045110, 0x00000001, 0x000B03F9, 0x0C261A0F, 0xFFFFFFFF ) /* * 10428 63173865 */
RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 230145 57902926 */
RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 769654 53992486 */
RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 85365 51865697 */
RASTERIZER_ENTRY( 0x00582435, 0x00515110, 0x00000001, 0x000B0739, 0x0C261AC9, 0xFFFFFFFF ) /* * 454674 46165536 */
RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 101889 33337987 */
RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 255952 29810993 */
//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 106190 25430383 */
//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 595001 23268601 */
//RASTERIZER_ENTRY( 0x0142612A, 0x00000000, 0x00000001, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 946410 22589110 */
//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 330036 21323230 */
//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A1F, 0xFFFFFFFF ) /* * 40089 13470498 */
//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000000, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 90906 12850855 */
//RASTERIZER_ENTRY( 0x00582C35, 0x00515110, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 9492 12115280 */
//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 453515 12013961 */
//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A1F, 0xFFFFFFFF ) /* * 33829 8384312 */
//RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 83986 7841206 */
//RASTERIZER_ENTRY( 0x00580035, 0x00045110, 0x00000001, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 42515 7242660 */
//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 706 6158684 */
//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B0739, 0x0C26101F, 0xFFFFFFFF ) /* * 62051 5819485 */
//RASTERIZER_ENTRY( 0x0142612A, 0x00000000, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 135139 5063467 */
//RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 10359 5135837 */
//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 170159 4449246 */
//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 19037 4371219 */
//RASTERIZER_ENTRY( 0x01422429, 0x00000000, 0x00000001, 0x000B073B, 0x0C26101F, 0xFFFFFFFF ) /* * 8963 4352501 */
//RASTERIZER_ENTRY( 0x01422C39, 0x00045110, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 47712 4159994 */
//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000000, 0x000B073B, 0x0C261ACF, 0xFFFFFFFF ) /* * 47525 4151435 */
//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 34980 3794066 */
//RASTERIZER_ENTRY( 0x0142613A, 0x00045110, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 6540 2358068 */
//RASTERIZER_ENTRY( 0x0142611A, 0x00045110, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 703308 2096781 */
//RASTERIZER_ENTRY( 0x00580035, 0x00045110, 0x00000001, 0x000B0339, 0x0C261A1F, 0xFFFFFFFF ) /* * 3963 2079440 */
//RASTERIZER_ENTRY( 0x01422439, 0x00000000, 0x00000001, 0x000B073B, 0x0C261AC9, 0xFFFFFFFF ) /* * 22866 2008397 */
//RASTERIZER_ENTRY( 0x01420039, 0x00000000, 0x00000001, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 69705 1673671 */
//RASTERIZER_ENTRY( 0x01422C19, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 13366 1575120 */
//RASTERIZER_ENTRY( 0x0142613A, 0x00000000, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 50625 1408211 */
//RASTERIZER_ENTRY( 0x0142613A, 0x00045110, 0x00000001, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 1244348 1244346 */
//RASTERIZER_ENTRY( 0x00582425, 0x00000000, 0x00000001, 0x000B073B, 0x0C26100F, 0xFFFFFFFF ) /* * 13791 1222735 */
//RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 33064 943590 */
//RASTERIZER_ENTRY( 0x0142610A, 0x00045110, 0x00000001, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 2041 926507 */
//RASTERIZER_ENTRY( 0x00480019, 0x00045110, 0x00000001, 0x000B073B, 0x0C261A0F, 0xFFFFFFFF ) /* * 2722 453924 */
//RASTERIZER_ENTRY( 0x00580035, 0x00000000, 0x00000001, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 68232 306869 */
//RASTERIZER_ENTRY( 0x0142611A, 0x00045110, 0x00000001, 0x000B0379, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 7164 269002 */
/* mace -------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824100F, 0xFFFFFFFF ) /* * 7204150 1340201579 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0xFFFFFFFF ) /* * 15332 1181663232 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 104456 652582379 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824180F, 0xFFFFFFFF ) /* * 488613 368880164 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082418CF, 0xFFFFFFFF ) /* * 352924 312417405 */
RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 15024 291762384 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082410CF, 0xFFFFFFFF ) /* * 711824 279246170 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824100F, 0xFFFFFFFF ) /* * 735574 171881981 */
RASTERIZER_ENTRY( 0x00602401, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 943006 154374023 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082410CF, 0xFFFFFFFF ) /* * 103877 101077498 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824108F, 0xFFFFFFFF ) /* * 710125 87547221 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x08241ACF, 0xFFFFFFFF ) /* * 9834 79774966 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 17644 70187036 */
RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 11324 56633925 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 96743 40820171 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 166053 29100794 */
RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 166053 29100697 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0379, 0x0824188F, 0xFFFFFFFF ) /* * 6723 29076516 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824188F, 0xFFFFFFFF ) /* * 53297 23928976 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824180F, 0xFFFFFFFF ) /* * 10309 19001776 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 22105 17473157 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0824188F, 0xFFFFFFFF ) /* * 11304 17236698 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0xFFFFFFFF ) /* * 1664 17180883 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x08241A0F, 0xFFFFFFFF ) /* * 148606 12274278 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418CF, 0xFFFFFFFF ) /* * 80692 9248007 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000001, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 37819 8080994 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000001, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 37819 8080969 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 536 7930305 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 27601 7905364 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 27601 7905364 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 36314 7667917 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 36314 7667917 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 31109 6020110 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 31109 6020110 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045117, 0x00000000, 0x000B0339, 0x082418CF, 0xFFFFFFFF ) /* * 42689 5959231 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x082418CF, 0xFFFFFFFF ) /* * 42689 5959231 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824188F, 0xFFFFFFFF ) /* * 11965 5118044 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000001, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 11923 4662909 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x082410CF, 0xFFFFFFFF ) /* * 4422 4624260 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0824100F, 0xFFFFFFFF ) /* * 3853 3596375 */
//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0379, 0x082418DF, 0xFFFFFFFF ) /* * 400 3555759 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0379, 0x0824180F, 0xFFFFFFFF ) /* * 3755 3453084 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 4170 2425016 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824184F, 0xFFFFFFFF ) /* * 322 2220073 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x082418CF, 0xFFFFFFFF ) /* * 4008 1201335 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824108F, 0xFFFFFFFF ) /* * 13704 883585 */
/* sfrush -----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0824101F ) /* * 590139 246714190 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824101F, 0x0824101F ) /* * 397774 153418144 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x082410DF ) /* * 22732 146975666 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x0824101F ) /* * 306398 130393278 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824101F, 0x0824101F ) /* * 437743 117403881 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824181F, 0x0824101F ) /* * 66608 109289500 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x082410DF ) /* * 19101 92573085 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0824181F ) /* * 258287 78618228 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824181F, 0x0824101F ) /* * 61814 68788856 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x0824181F ) /* * 149792 61464124 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824181F, 0x0824181F ) /* * 109988 55083276 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0x00000000 ) /* * 478 46989312 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0x0824181F ) /* * 468 46006272 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x0824181F ) /* * 125204 39023396 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0x082410DB ) /* * 394 38731776 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 12890 36333568 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0379, 0x0824101F, 0x0824101F ) /* * 147995 31086325 */
RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B077B, 0x00000000, 0x082410DB ) /* * 3576 29294592 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824181F, 0x0824181F ) /* * 76059 29282981 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 12632 29173808 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x082418DF ) /* * 14040 24318118 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000001, 0x000B0379, 0x0824101F, 0x0824101F ) /* * 56586 17643207 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 9130 17277440 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 66302 17049921 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x0824101F ) /* * 64380 16463672 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0x0824181F ) /* * 152 14942208 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 8748 13810176 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082708DF, 0x0824101F ) /* * 216634 10628656 */
//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B077B, 0x00000000, 0x082410DB ) /* * 1282 10502144 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 74636 9758030 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x082410DB ) /* * 58652 9353671 */
//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x082410DB ) /* * 5242 8038747 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B077B, 0x082410DB, 0x082410DB ) /* * 11048 7538060 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0824101F, 0x0824181F ) /* * 121630 6906591 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x082418DF ) /* * 19553 6864245 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x082418DF ) /* * 1287 6648834 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082708DF, 0x0824101F ) /* * 197766 6617876 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x082700DF, 0x0824101F ) /* * 75470 6231739 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x08241ADF, 0x0824101F ) /* * 180 5898240 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 7692 5743360 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 20128 4980591 */
//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 1144 4685824 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082700DF, 0x0824101F ) /* * 72299 4466336 */
//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 3750 4018176 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x082410DF ) /* * 7533 3692141 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x0824101F ) /* * 9484 3610674 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824101F, 0x0824181F ) /* * 128660 3216280 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x082410DB ) /* * 22214 3172813 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x0824181F ) /* * 5094 3099098 */
//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824101F ) /* * 1954 2850924 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 1542 2434304 */
//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x00000000 ) /* * 478 1957888 */
//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0x0824181F ) /* * 468 1916928 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B077B, 0x082410DB, 0x0824101F ) /* * 11664 1729188 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x082410DB ) /* * 1282 1640960 */
//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B077B, 0x082410DB, 0x0824101F ) /* * 388 1589248 */
//RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x082410DB ) /* * 1282 1312768 */
//RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B077B, 0x082410DB, 0x0824181F ) /* * 3928 1046582 */
/* sfrushrk---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 hash */
RASTERIZER_ENTRY(0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082410DF, 0x0824101F) /* * 27 992960 15063136 */
RASTERIZER_ENTRY(0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082708DF, 0x0824101F) /* * 81 1014993 6262343 */
RASTERIZER_ENTRY(0x00482435, 0x00045119, 0x00000001, 0x000B0379, 0x0824101F, 0x0824101F) /* * 7 283517 3673219 */
RASTERIZER_ENTRY(0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824101F) /* * 15 272066 3479808 */
RASTERIZER_ENTRY(0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241ADF, 0x042210C0) /* * 73 10072 2751593 */
RASTERIZER_ENTRY(0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082700DF, 0x0824101F) /* * 59 399456 2293575 */
RASTERIZER_ENTRY(0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x082410DB) /* * 12 94616 1697401 */
RASTERIZER_ENTRY(0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824101F, 0x0824181F) /* * 83 197678 1694134 */
RASTERIZER_ENTRY(0x00000035, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824181F) /* * 38 47356 1655374 */
RASTERIZER_ENTRY(0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0x042210C0) /* * 94 7526 1449675 */
RASTERIZER_ENTRY(0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x00000000, 0x082418DF) /* * 89 58657 1178470 */
RASTERIZER_ENTRY(0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x082418DF, 0x0824181F) /* * 4 117539 1114862 */
RASTERIZER_ENTRY(0x00600C09, 0x00045119, 0x00000001, 0x000B0779, 0x0824101F, 0x042210C0) /* * 52 30451 905250 */
/* vaportrx ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x00482405, 0x00000000, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 2226138 592165102 */
RASTERIZER_ENTRY( 0x00482435, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 53533 281405105 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B07F9, 0x0C261ACF, 0xFFFFFFFF ) /* * 314131 219103141 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 216329 95014510 */
RASTERIZER_ENTRY( 0x00482405, 0x00000009, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 317128 92010096 */
RASTERIZER_ENTRY( 0x0142613A, 0x00045119, 0x00000000, 0x000B07F9, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 13728 88595930 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C261ACF, 0xFFFFFFFF ) /* * 649448 81449105 */
RASTERIZER_ENTRY( 0x00482435, 0x00000000, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 444231 60067944 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C26184F, 0xFFFFFFFF ) /* * 36057 58970468 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C26100F, 0xFFFFFFFF ) /* * 53147 48856709 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B07F9, 0x0C2610C9, 0xFFFFFFFF ) /* * 447654 47171792 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A0F, 0xFFFFFFFF ) /* * 207392 38933691 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* * 2015632 33364173 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C26100F, 0xFFFFFFFF ) /* * 196361 30395218 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C2610CF, 0xFFFFFFFF ) /* * 110898 28973006 */
RASTERIZER_ENTRY( 0x00482435, 0x00000009, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 135107 16301589 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A8F, 0xFFFFFFFF ) /* * 22375 15797748 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0339, 0x0C26184F, 0xFFFFFFFF ) /* * 141539 7513140 */
RASTERIZER_ENTRY( 0x0142613A, 0x00045119, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 621403 5369705 */
RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 30443 4070277 */
//RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 22121 3129894 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 9187 1864599 */
//RASTERIZER_ENTRY( 0x00482405, 0x00044110, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* * 10390 1694950 */
//RASTERIZER_ENTRY( 0x0142610A, 0x00000009, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 25366 1624563 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0739, 0x0C261A0F, 0xFFFFFFFF ) /* * 69033 1607970 */
//RASTERIZER_ENTRY( 0x0142610A, 0x00000000, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 36316 1084818 */
//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C2610CF, 0xFFFFFFFF ) /* * 1813 816763 */
//RASTERIZER_ENTRY( 0x0142613A, 0x00045119, 0x00000000, 0x000B0339, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 6602 767221 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 2547 646048 */
//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C261A8F, 0xFFFFFFFF ) /* * 2394 501590 */
//RASTERIZER_ENTRY( 0x0142613A, 0x00000009, 0x00000000, 0x000B0739, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 14078 440086 */
//RASTERIZER_ENTRY( 0x0142610A, 0x00045119, 0x00000000, 0x000B0339, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 9877 429160 */
//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0339, 0x0C261ACF, 0xFFFFFFFF ) /* * 3222 366052 */
//RASTERIZER_ENTRY( 0x00482435, 0x00000009, 0x00000000, 0x000B0739, 0x0C2610CF, 0xFFFFFFFF ) /* * 5942 285657 */
//RASTERIZER_ENTRY( 0x00482405, 0x00044119, 0x00000000, 0x000B0339, 0x0C2610CF, 0xFFFFFFFF ) /* * 2328 239688 */
//RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x000B0739, 0x0C26100F, 0xFFFFFFFF ) /* * 1129 208448 */
/* wg3dh ------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824181F, 0xFFFFFFFF ) /* * 127676 116109477 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824189F, 0xFFFFFFFF ) /* * 96310 112016758 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824109F, 0xFFFFFFFF ) /* * 1412831 108682642 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824101F, 0xFFFFFFFF ) /* * 1612798 45952714 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x08241AD9, 0xFFFFFFFF ) /* * 5960 6103040 */
RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000B0779, 0x082418DF, 0xFFFFFFFF ) /* * 56512 4856542 */
RASTERIZER_ENTRY( 0x00480035, 0x00045119, 0x00000000, 0x000B0779, 0x0824109F, 0xFFFFFFFF ) /* * 8480 2045940 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0379, 0x0824181F, 0xFFFFFFFF ) /* * 2779 1994317 */
RASTERIZER_ENTRY( 0x00000035, 0x00045119, 0x00000000, 0x000B0779, 0x0824105F, 0xFFFFFFFF ) /* * 154691 1922774 */
RASTERIZER_ENTRY( 0x00002435, 0x00045119, 0x00000000, 0x000B0779, 0x082410DF, 0xFFFFFFFF ) /* * 18114 776139 */
/* gauntleg ---> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24100F ) /* * 157050 668626339 */
RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C22400F, 0x0C241ACF ) /* * 1079126 580272490 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C241A4F, 0x0C24100F ) /* * 49686 232178144 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C24104F, 0x0C24100F ) /* * 1048560 206304396 */
RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C2240CF, 0x0C241ACF ) /* * 59176 182444375 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241A4F ) /* * 66342 179689728 */
RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 72264 109413344 */
RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 281243 75399210 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24104F ) /* * 126384 68412120 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C241A0F, 0x0C24100F ) /* * 26864 43754988 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241ACF ) /* * 30510 32759936 */
RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 44783 31884168 */
RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24180F ) /* * 34946 31359362 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241ACF ) /* * 8006 28367999 */
RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24180F ) /* * 15430 27908213 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241A0F ) /* * 29306 25166802 */
RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 27737 24517949 */
RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 6783 21292092 */
RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24180F ) /* * 9591 17815763 */
RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 343966 13864759 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 11842 12126208 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C241A8F, 0x0C24100F ) /* * 6648 9788508 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C2418CF ) /* * 8444 8646656 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 9677 8365606 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 844920 8289326 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24184F ) /* * 3108 8010176 */
//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x00000000, 0x0C24180F ) /* * 1435 6209238 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 5754 5617499 */
//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24180F ) /* * 1608 5557253 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 105127 5133321 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C241ACF ) /* * 3460 4689138 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 7025 4629550 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24180F ) /* * 7164 4407683 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24188F ) /* * 1922 3924179 */
//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C24180F ) /* * 4116 3733777 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0779, 0x00000000, 0x0C241A8F ) /* * 2626 3732809 */
//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x0C24180F, 0x0C24180F ) /* * 778 3202973 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C24184F, 0x0C24100F ) /* * 1525 2997446 */
//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x0C24180F, 0x0C241A0F ) /* * 645 2975266 */
//RASTERIZER_ENTRY( 0x00600039, 0x00044119, 0x00000000, 0x000B0379, 0x00000000, 0x0C241A0F ) /* * 5212 2491361 */
//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24180F ) /* * 825 1996513 */
//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C241A0F ) /* * 466 1967163 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0580000F, 0x0C24180F ) /* * 77400 1883434 */
//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 472 1698177 */
//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 2476 1678760 */
//RASTERIZER_ENTRY( 0x00600C09, 0x00045119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24180F ) /* * 4054 1541748 */
//RASTERIZER_ENTRY( 0x00600039, 0x00044119, 0x00000000, 0x000B0379, 0x0C241A0F, 0x0C24180F ) /* * 3132 1509438 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x00000000, 0x000B0779, 0x0580080F, 0x0C24180F ) /* * 8582 1324196 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00044119, 0x00000000, 0x000B0379, 0x00000000, 0x0C24100F ) /* * 1436 1239704 */
//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B03F9, 0x0C24180F, 0x0C24100F ) /* * 253 1220316 */
//RASTERIZER_ENTRY( 0x00600039, 0x00045119, 0x00000000, 0x000B0779, 0x0C22480F, 0x0C241ACF ) /* * 2433 1014668 */
/* gauntdl ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C241ACF ) /* * 30860 1128173568 */
RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22400F, 0x0C241ACF ) /* * 2631692 1117011118 */
RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22400F, 0x0C241ACF ) /* * 2429239 826969012 */
RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22480F, 0x0C241ACF ) /* * 454056 468285142 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C2418CF ) /* * 257586 355634672 */
RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0379, 0x00000009, 0x0C24180F ) /* * 10898 134362122 */
RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C241A0F ) /* * 32195 126327049 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x0C2410CF, 0x0C24100F ) /* * 855240 123899880 */
RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0379, 0x00000009, 0x0C24180F ) /* * 1718 120629204 */
RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22488F, 0x0C241ACF ) /* * 186839 120281357 */
RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0379, 0x0C22480F, 0x0C241ACF ) /* * 14102 115428820 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C2410CF ) /* * 88530 98271949 */
RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0379, 0x0C22480F, 0x0C241ACF ) /* * 12994 68053222 */
RASTERIZER_ENTRY( 0x00602439, 0x00044110, 0x00000000, 0x000B0379, 0x00000009, 0x0C24100F ) /* * 68273 67454880 */
RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24180F ) /* * 100026 62271618 */
RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22480F, 0x0C241ACF ) /* * 153285 44411342 */
RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24100F ) /* * 157545 40702131 */
RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 7800 31948800 */
RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22408F, 0x0C241ACF ) /* * 47623 20321183 */
RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C24188F ) /* * 21570 19324892 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x000000C1, 0x000B0779, 0x0C241ACF, 0x0C24100F ) /* * 3698 15147008 */
//RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22408F, 0x0C241ACF ) /* * 19765 12383722 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 662274 10563855 */
//RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 27909 10462997 */
//RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24180F ) /* * 78671 10286957 */
//RASTERIZER_ENTRY( 0x00602439, 0x00045110, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24188F ) /* * 52038 9928244 */
//RASTERIZER_ENTRY( 0x0060743A, 0x00045119, 0x000000C1, 0x000B0779, 0x0C224A0F, 0x0C241ACF ) /* * 27469 9239782 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24100F ) /* * 757116 8072783 */
//RASTERIZER_ENTRY( 0x0060743A, 0x00045110, 0x000000C1, 0x000B0779, 0x0C22488F, 0x0C241ACF ) /* * 18018 7035833 */
//RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C241A0F ) /* * 50339 5976564 */
//RASTERIZER_ENTRY( 0x00603430, 0x00040219, 0x00000000, 0x000B0379, 0x00000009, 0x0C2410CE ) /* * 29385 5466384 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 423347 5355017 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 162620 4709092 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24100F ) /* * 463705 4642480 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 280337 4425529 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24180F ) /* * 212646 3432265 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C24100F ) /* * 5788 2963456 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 460800 2609198 */
//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 251108 2392362 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 297219 2352862 */
//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0584180F, 0x0C2410CF ) /* * 9913 2097069 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 142722 2091569 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C241ACF ) /* * 8820 2053325 */
//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24188F ) /* * 10346 2033427 */
//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24188F, 0x0C241ACF ) /* * 2136 2017241 */
//RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C24100F ) /* * 1505 1928490 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 176734 1842440 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24180F ) /* * 262577 1799080 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24180F ) /* * 83179 1534171 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x00000009, 0x0C24188F ) /* * 3863 1527077 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C24180F ) /* * 8021 1472661 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C241A0F, 0x0C241ACF ) /* * 85416 1342195 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C24100F ) /* * 261360 1335048 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00000009, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C24100F ) /* * 74811 1320900 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24100F ) /* * 239331 1268661 */
//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C241ACF ) /* * 107769 1244175 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C241ACF ) /* * 3706 1216182 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x0C24188F ) /* * 49608 1206129 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00000009, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C241ACF ) /* * 42440 1204109 */
//RASTERIZER_ENTRY( 0x00482435, 0x00045110, 0x000000C1, 0x000B0779, 0x0C2410CF, 0x0C24100F ) /* * 29584 1168568 */
//RASTERIZER_ENTRY( 0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24180F, 0x0C241ACF ) /* * 17729 1152869 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045110, 0x000000C1, 0x000B0379, 0x0C24180F, 0x0C24100F ) /* * 4052 1108726 */
//RASTERIZER_ENTRY( 0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C2418CF, 0x0C24100F ) /* * 7082 1079348 */
//RASTERIZER_ENTRY( 0x00602439, 0x00044119, 0x00000000, 0x000B0379, 0x00000009, 0x0C24180F ) /* * 7761 1023855 */
/* gradius4 ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
//RASTERIZER_ENTRY( 0x02420002, 0x00000009, 0x00000000, 0x00030F7B, 0x08241AC7, 0xFFFFFFFF ) /* intro */
//RASTERIZER_ENTRY( 0x01420021, 0x00005119, 0x00000000, 0x00030F7B, 0x14261AC7, 0xFFFFFFFF ) /* intro */
//RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030F7B, 0x14261A87, 0xFFFFFFFF ) /* in-game */
RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030BFB, 0x14261AC7, 0xFFFFFFFF ) /* 35 1239092 118514052 */
RASTERIZER_ENTRY( 0x0000303A, 0x00004119, 0x00000000, 0x00030BFB, 0x142610C7, 0xFFFFFFFF ) /* * 72 400122 93801372 */
RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030F7B, 0x14261A87, 0xFFFFFFFF ) /* * 2 1715230 16465427 */
RASTERIZER_ENTRY( 0x02422E12, 0x00005119, 0x00000000, 0x00030F7B, 0x08241AC7, 0xFFFFFFFF ) /* 81 404825 14369443 */
RASTERIZER_ENTRY( 0x00582435, 0x00005119, 0x00000000, 0x00030F7B, 0x14261AC7, 0xFFFFFFFF ) /* * 69 505796 13187254 */
RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030F7B, 0x14261AC7, 0xFFFFFFFF ) /* 33 460278 12366856 */
RASTERIZER_ENTRY( 0x00000015, 0x00005119, 0x00000000, 0x00030F7B, 0x14261AC7, 0xFFFFFFFF ) /* 60 341915 7357317 */
RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030FFB, 0x08241AC7, 0xFFFFFFFF ) /* 70 444582 7071742 */
RASTERIZER_ENTRY( 0x00580021, 0x00005119, 0x00000000, 0x00030FFB, 0x14261AC7, 0xFFFFFFFF ) /* 51 242000 6018798 */
RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030B7B, 0x14261A07, 0xFFFFFFFF ) /* 28 26700 4497995 */
RASTERIZER_ENTRY( 0x02420002, 0x00000009, 0x00000000, 0x00030F7B, 0x14261AC7, 0xFFFFFFFF ) /* 5 3817984 3777348 */
RASTERIZER_ENTRY( 0x01424A11, 0x00000009, 0x00000000, 0x00030F7B, 0x14261AC7, 0xFFFFFFFF ) /* 31 1140930 3724657 */
RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030BFB, 0x14261A47, 0xFFFFFFFF ) /* 70 165464 3646194 */
RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030BFB, 0x14261A07, 0xFFFFFFFF ) /* 39 25812 3115146 */
RASTERIZER_ENTRY( 0x00000035, 0x00005119, 0x00000000, 0x00030F7B, 0x14261AC7, 0xFFFFFFFF ) /* * 6 72291 2961233 */
RASTERIZER_ENTRY( 0x00000015, 0x00005119, 0x00000000, 0x00030F7B, 0x14261A87, 0xFFFFFFFF ) /* 29 43584 2752299 */
RASTERIZER_ENTRY( 0x00000005, 0x00001419, 0x00000000, 0x00030B7B, 0x14261A07, 0xFFFFFFFF ) /* 20 15210 2402045 */
RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030B7B, 0x14261AC7, 0xFFFFFFFF ) /* 24 58447 1844641 */
RASTERIZER_ENTRY( 0x00000005, 0x00005119, 0x00000000, 0x00030F7B, 0x08241AC7, 0xFFFFFFFF ) /* 59 177334 1792616 */
RASTERIZER_ENTRY( 0x01420021, 0x00000119, 0x00000000, 0x00030F7B, 0x14261AC7, 0xFFFFFFFF ) /* 72 27090 1632226 */
/* nbapbp ------> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 */
//RASTERIZER_ENTRY( 0x00424219, 0x00000000, 0x00000001, 0x00030B7B, 0x08241AC7, 0xFFFFFFFF ) /* intro */
//RASTERIZER_ENTRY( 0x00002809, 0x00004110, 0x00000001, 0x00030FFB, 0x08241AC7, 0xFFFFFFFF ) /* in-game */
//RASTERIZER_ENTRY( 0x00424219, 0x00000000, 0x00000001, 0x00030F7B, 0x08241AC7, 0xFFFFFFFF ) /* in-game */
//RASTERIZER_ENTRY( 0x0200421A, 0x00001510, 0x00000001, 0x00030F7B, 0x08241AC7, 0xFFFFFFFF ) /* in-game */
/* gtfore06 ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 hash */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x0C261ACD, 0x0C261ACD ) /* 18 1064626 69362127 */
RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010F79, 0x0C224A0D, 0x0C261ACD ) /* 47 3272483 31242799 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x00000ACD, 0x0C261ACD ) /* 9 221917 12348555 */
RASTERIZER_ENTRY( 0x00002425, 0x00045110, 0x000000C1, 0x00010FF9, 0x00000ACD, 0x0C261ACD ) /* 26 57291 9357989 */
RASTERIZER_ENTRY( 0x00002429, 0x00000000, 0x000000C1, 0x00010FF9, 0x00000A09, 0x0C261A0F ) /* 12 97156 8530607 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x000000C4, 0x0C261ACD ) /* 55 110144 5265532 */
RASTERIZER_ENTRY( 0x00002425, 0x00045110, 0x000000C1, 0x00010FF9, 0x000000C4, 0x0C261ACD ) /* 61 16644 1079382 */
RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010FF9, 0x000000C4, 0x0C261ACD ) /* 5 8332 1065229 */
RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010F79, 0x0C224A0D, 0x0C261A0D ) /* 45 8148 505013 */
RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x00000000, 0x00010F79, 0x0C224A0D, 0x0C261A0D ) /* 84 45233 248267 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010F79, 0x0C261ACD, 0x0C2610C4 ) /* 90 10235 193036 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x0C261ACD, 0x0C261ACD ) /* * 29 3777 83777 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x0C261ACD, 0x042210C0 ) /* 2 24952 66761 */
RASTERIZER_ENTRY( 0x00002429, 0x00000000, 0x00000000, 0x00010FF9, 0x00000A09, 0x0C261A0F ) /* 24 661 50222 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x0C261ACD, 0x04221AC9 ) /* 92 12504 43720 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x0C261ACD, 0x0C2610C4 ) /* 79 2160 43650 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x000000C4, 0x04221AC9 ) /* 19 2796 30377 */
RASTERIZER_ENTRY( 0x00002425, 0x00045119, 0x000000C1, 0x00010FF9, 0x00000ACD, 0x0C261ACD ) /* 67 1962 14755 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x000000C4, 0x0C261ACD ) /* * 66 74 3951 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x00000000, 0x00010FF9, 0x00000ACD, 0x04221AC9 ) /* 70 374 3691 */
RASTERIZER_ENTRY( 0x00482405, 0x00045119, 0x000000C1, 0x00010FF9, 0x00000ACD, 0x0C261ACD ) /* * 20 350 7928 */
/* virtpool ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 hash */
RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A0F, 0x042210C0 ) /* * 78 2182388 74854175 */
RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B07F9, 0x0C261A0F, 0x042210C0 ) /* * 46 114830 6776826 */
RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A0F, 0x042210C0 ) /* * 58 1273673 4513463 */
RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B0739, 0x0C261A09, 0x042210C0 ) /* * 46 634995 2275612 */
RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B073B, 0x0C261A0F, 0x042210C0 ) /* * 46 26651 1883507 */
RASTERIZER_ENTRY( 0x00482405, 0x00045110, 0x00000000, 0x000B073B, 0x0C261A0F, 0x042210C0 ) /* * 26 220644 751241 */
//RASTERIZER_ENTRY( 0x00002421, 0x00445110, 0x00000000, 0x000B073B, 0x0C261A09, 0x042210C0 ) /* * 79 14846 3499120 */
//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B0739, 0x0C261A09, 0x042210C0 ) /* * 66 26665 1583363 */
//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B073B, 0x0C26100F, 0x042210C0 ) /* * 78 33096 957935 */
//RASTERIZER_ENTRY( 0x00002425, 0x00445110, 0x00000000, 0x000B07F9, 0x0C261A0F, 0x042210C0 ) /* * 38 12494 678029 */
//RASTERIZER_ENTRY( 0x00800000, 0x00000000, 0x00000000, 0x00000200, 0x00000000, 0x00000000 ) /* * 28 25348 316181 */
//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B0739, 0x0C26100F, 0x042210C0 ) /* * 13 11344 267903 */
//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B073B, 0x0C261A09, 0x042210C0 ) /* * 34 1548 112168 */
//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B07FB, 0x0C26100F, 0x042210C0 ) /* * 35 664 25222 */
//RASTERIZER_ENTRY( 0x00000002, 0x00000000, 0x00000000, 0x00000300, 0xFFFFFFFF, 0xFFFFFFFF ) /* * 33 512 18393 */
//RASTERIZER_ENTRY( 0x00002421, 0x00000000, 0x00000000, 0x000B07FB, 0x0C261A0F, 0x042210C0 ) /* * 14 216 16842 */
//RASTERIZER_ENTRY( 0x00000001, 0x00000000, 0x00000000, 0x00000300, 0x00000800, 0x00000800 ) /* * 87 2 72 */
//RASTERIZER_ENTRY( 0x00000001, 0x00000000, 0x00000000, 0x00000200, 0x08241A00, 0x08241A00 ) /* * 92 2 8 */
//RASTERIZER_ENTRY( 0x00000001, 0x00000000, 0x00000000, 0x00000200, 0x00000000, 0x08241A00 ) /* * 93 2 8 */
/* roadburn ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 hash */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24100F) /* * 88 6599666 64554420 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C241A0F, 0x0C2418CF) /* * 12 763617 35323533 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C2418CF) /* * 44 1930013 33746169 */
RASTERIZER_ENTRY(0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x000008CF, 0x0C2418CF) /* * 21 1439267 29935941 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0000000F, 0x0C24100F) /* * 32 6915356 28830506 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x000008CF, 0x0C24180F) /* * 39 4057572 17696631 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x000008CF, 0x0C24100F) /* * 50 4955570 14335742 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x000008CF, 0x0C2418CF) /* * 41 766085 9520801 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C2418CF, 0x0C2418CF) /* * 0 534929 7695839 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C2418CF, 0x0C24100F) /* * 9 1078501 7419628 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24180F) /* * 77 413387 7228312 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C2418CF, 0x0C24180F) /* * 95 353176 7192165 */
RASTERIZER_ENTRY(0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0000080F, 0x0C2418CF) /* * 52 315430 5154802 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0000080F, 0x0C24100F) /* * 54 1704858 5008909 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24100F) /* * 13 899639 4953916 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C2418CF, 0x0C24188F) /* * 64 277509 4254016 */
//RASTERIZER_ENTRY(0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0000088F, 0x0C2418CF) /* * 87 295785 4066338 */
//RASTERIZER_ENTRY(0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C2418CF, 0x0C241ACF) /* * 7 28140 4056321 */
//RASTERIZER_ENTRY(0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C241ACF, 0x0C2618CF) /* * 9 9494 3608108 */
//RASTERIZER_ENTRY(0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x0C2418CF, 0x0C2418CF) /* * 77 647531 3223654 */
//RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C2410CF, 0x0C24100F) /* * 84 142873 3131813 */
//RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C24180F) /* * 2 247541 2880853 */
//RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C24100F, 0x0C24188F) /* * 11 143650 2430648 */
//RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0000080F, 0x0C24180F) /* * 43 686600 2266187 */
//RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0000088F, 0x0C24180F) /* * 8 526279 1750008 */
//RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C24188F, 0x0C24100F) /* * 75 158668 1533323 */
//RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C24180F, 0x0C2418CF) /* * 66 105179 1324448 */
//RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x00000000, 0x000B0779, 0x0C241A0F, 0x0C24188F) /* * 76 19479 1150035 */
/* cartfury --> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 hash */
RASTERIZER_ENTRY(0x00000035, 0x00045119, 0x000000C1, 0x00030F39, 0x0C261A0F, 0x042210C0) /* 55 6897497 95045895 */
RASTERIZER_ENTRY(0x00420039, 0x00000000, 0x000000C1, 0x00030F39, 0x0C26100F, 0x042210C0) /* 92 9680462 62502113 */
RASTERIZER_ENTRY(0x0142A409, 0x00000000, 0x000000C1, 0x00030F3B, 0x0C261ACF, 0x042210C0) /* 51 3884086 40581793 */
RASTERIZER_ENTRY(0x00000035, 0x00045119, 0x00000000, 0x00030F39, 0x0C261A0F, 0x042210C0) /* * 94 2263184 30556572 */
RASTERIZER_ENTRY(0x00422439, 0x00000000, 0x000000C1, 0x00030F3B, 0x0C261A0F, 0x042210C0) /* 93 2520077 30036037 */
RASTERIZER_ENTRY(0x00582435, 0x00045110, 0x00000000, 0x00030BF9, 0x0C2610C9, 0x042210C0) /* 36 2053030 28006572 */
RASTERIZER_ENTRY(0x0142A409, 0x00000000, 0x00000000, 0x00030B39, 0x0C261A0F, 0x042210C0) /* 92 4894430 27815796 */
RASTERIZER_ENTRY(0x00580035, 0x00045119, 0x000000C1, 0x00030B39, 0x0C261A0F, 0x042210C0) /* 69 1813831 25845118 */
RASTERIZER_ENTRY(0x0142A409, 0x00000000, 0x00000000, 0x00030F3B, 0x0C261ACF, 0x042210C0) /* 47 1906963 20937897 */
RASTERIZER_ENTRY(0x00420039, 0x00000000, 0x00000000, 0x00030FF9, 0x0C261A0F, 0x042210C0) /* 40 152832 19687732 */
RASTERIZER_ENTRY(0x00420039, 0x00000000, 0x00000000, 0x00030F3B, 0x0C261A0F, 0x042210C0) /* 40 2896061 19553336 */
RASTERIZER_ENTRY(0x00420039, 0x00000000, 0x000000C1, 0x00030F39, 0x0C261A0F, 0x042210C0) /* 60 1626437 16446065 */
RASTERIZER_ENTRY(0x00000035, 0x00045110, 0x000000C1, 0x00030BF9, 0x0C261A0F, 0x042210C0) /* 82 156240 16358632 */
RASTERIZER_ENTRY(0x00420039, 0x00000000, 0x00000000, 0x00030F3B, 0x0C261ACF, 0x042210C0) /* 36 3538654 15204923 */
RASTERIZER_ENTRY(0x00420039, 0x00000000, 0x00000000, 0x00030F39, 0x0C26100F, 0x042210C0) /* * 7 1899232 14314750 */
RASTERIZER_ENTRY(0x0142A409, 0x00000000, 0x000000C1, 0x00030F3B, 0x0C261A0F, 0x042210C0) /* 82 1097851 13461074 */
//RASTERIZER_ENTRY(0x00422439, 0x00000000, 0x00000000, 0x00030F3B, 0x0C261A0F, 0x042210C0) /* 8 1024956 13120753 */
//RASTERIZER_ENTRY(0x00420039, 0x00000000, 0x00000000, 0x00030F39, 0x0C261A0F, 0x042210C0) /* 72 1641456 11253842 */
//RASTERIZER_ENTRY(0x0142A409, 0x00000000, 0x00000000, 0x00030F3B, 0x0C261A0F, 0x042210C0) /* 51 742740 10329945 */
//RASTERIZER_ENTRY(0x00420039, 0x00000000, 0x000000C1, 0x00030F3B, 0x0C261A0F, 0x042210C0) /* * 28 1167364 8450582 */
//RASTERIZER_ENTRY(0x0042613A, 0x00000000, 0x000000C1, 0x00030FF9, 0xFFFFFFFF, 0xFFFFFFFF) /* 6 29298 7216480 */
/* warfa ----> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 hash */
RASTERIZER_ENTRY(0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22400F, 0x0C241ACF) /* 5 6988136 185178764 */
RASTERIZER_ENTRY(0x00602419, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22400F, 0x0C241A0F) /* 92 2423839 61801379 */
RASTERIZER_ENTRY(0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x0C24100F, 0x00000000) /* 74 5178601 36194132 */
RASTERIZER_ENTRY(0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x00000000, 0x0C24180F) /* 57 1267243 26421492 */
RASTERIZER_ENTRY(0x00482435, 0x00045119, 0x00000000, 0x000B0779, 0x104008CF, 0x0C2618CF) /* 13 1461060 22971624 */
RASTERIZER_ENTRY(0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x10400ACF, 0x0C2618CF) /* 63 1089946 21852830 */
RASTERIZER_ENTRY(0x00602439, 0x00045119, 0x000000C1, 0x000B0779, 0x0C22480F, 0x0C241ACF) /* 27 252592 20660816 */
RASTERIZER_ENTRY(0x00482435, 0x00045119, 0x000000C1, 0x000B0779, 0x104000CF, 0x0C2618CF) /* 84 796384 20070179 */
RASTERIZER_ENTRY(0x00602C19, 0x00045119, 0x000000C1, 0x000B0779, 0x00000000, 0x0C24100F) /* 68 4256201 19630570 */
RASTERIZER_ENTRY(0x00602439, 0x00044119, 0x000000C1, 0x000B0779, 0x0582480F, 0x0C26180F) /* * 69 137540 18243142 */
RASTERIZER_ENTRY(0x00602C09, 0x00045119, 0x000000C1, 0x000B0779, 0x0482400F, 0x0C261ACF) /* * 16 377796 16889915 */
/* sf2049se --> fbzColorPath alphaMode fogMode, fbzMode, texMode0, texMode1 hash */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x000000C1, 0x000B0779, 0x0C26100F, 0x0000000F) /* * 44 6143319 107636749 */
RASTERIZER_ENTRY(0x00482405, 0x00045119, 0x000000C1, 0x000B0379, 0x0C26180F, 0x0000080F) /* * 89 5079264 72208948 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x000000C1, 0x000B0779, 0x0C26100F, 0x0000080F) /* * 33 2115327 46427046 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x000000C1, 0x000B0779, 0x0000000F, 0x0C26100F) /* * 46 1574119 21123488 */
RASTERIZER_ENTRY(0x00482405, 0x00045119, 0x000000C1, 0x000B0379, 0x0C2610CF, 0x0000080F) /* * 45 1681920 19266314 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x000000C1, 0x000B0779, 0x0A452A0F, 0x0E47200F) /* * 85 2624894 12845924 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x000000C1, 0x000B0779, 0x0C26180F, 0x0000000F) /* * 22 312805 8560298 */
RASTERIZER_ENTRY(0x00482435, 0x00045117, 0x000000C1, 0x000B0339, 0x0C26100F, 0x0000000F) /* * 69 567798 7255338 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x000000C1, 0x000B0779, 0x0C2618CF, 0x0000000F) /* * 88 201277 7213832 */
RASTERIZER_ENTRY(0x00602401, 0x00045119, 0x000000C1, 0x00030279, 0x0C2618CF, 0x0000080F) /* * 25 1137620 7146799 */
RASTERIZER_ENTRY(0x00482435, 0x00045119, 0x000000C1, 0x000B0339, 0x0C26100F, 0x0000000F) /* * 52 567798 7137832 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x000000C1, 0x000B0779, 0x0C261A0F, 0x0000080F) /* * 54 141585 6669637 */
RASTERIZER_ENTRY(0x00482405, 0x00045119, 0x000000C1, 0x000B0379, 0x0C2618CF, 0x0000080F) /* * 23 357022 6573647 */
RASTERIZER_ENTRY(0x00482405, 0x00045119, 0x000000C1, 0x000B0379, 0x0C26100F, 0x0000080F) /* * 14 462528 5358791 */
RASTERIZER_ENTRY(0x00602409, 0x00045119, 0x000000C1, 0x000B0779, 0x0C26188F, 0x0000000F) /* * 57 98945 5300544 */
RASTERIZER_ENTRY(0x00482405, 0x00045119, 0x00000000, 0x000B0379, 0x0C26180F, 0x0000080F) /* * 77 232584 4197249 */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,662 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************
voodoo_render.h
3dfx Voodoo Graphics SST-1/2 emulator.
***************************************************************************/
#ifndef MAME_VIDEO_VOODOO_RENDER_H
#define MAME_VIDEO_VOODOO_RENDER_H
#pragma once
#include "video/poly.h"
#include "video/rgbutil.h"
//
// To do:
// - split rasterizer into setup (clip/flip) and inner part
// - templatize texture pipeline helpers
// - determine color scale factors up front as start/delta values and use those
// - incorporate type/memory? into constant flags
// - use type for: fog delta mask, bilinear mask
// - multiple rasterizer_textures to save stalls
// - leverage poly clipping?
//
namespace voodoo
{
// forward declarations
struct rasterizer_info;
struct poly_data;
class dither_helper;
class stw_helper;
// base class for our renderer
using voodoo_poly_manager = poly_manager<float, poly_data, 0, POLY_FLAG_NO_CLIPPING>;
//**************************************************************************
// DITHER HELPER
//**************************************************************************
// ======================> dither_helper
// this class provides common code for querying and managing dithering
// effects, which are very particular to the Voodoo
class dither_helper
{
public:
// constructor to pre-cache based on mode and Y coordinate
dither_helper(int y, reg_fbz_mode const fbzmode, reg_fog_mode const fogmode = reg_fog_mode(0)) :
m_dither_lookup(nullptr),
m_dither_raw(nullptr),
m_dither_raw_4x4(&s_dither_matrix_4x4[(y & 3) * 4])
{
// still use a lookup for no dithering since it's rare and we
// can avoid yet another conditional on the hot path
if (!fbzmode.enable_dithering())
m_dither_lookup = &s_nodither_lookup[0];
else if (fbzmode.dither_type() == 0)
{
m_dither_lookup = &s_dither4_lookup[(y & 3) << 11];
m_dither_raw = &s_dither_matrix_4x4[(y & 3) * 4];
}
else
{
m_dither_lookup = &s_dither2_lookup[(y & 3) << 11];
m_dither_raw = &s_dither_matrix_2x2[(y & 3) * 4];
}
}
// apply dithering to a pixel in separate R/G/B format and assemble as 5-6-5
u16 pixel(s32 x, s32 r, s32 g, s32 b) const
{
u8 const *table = &m_dither_lookup[(x & 3) << 9];
return (table[r] << 11) | (table[g + 256] << 5) | table[b];
}
// apply dithering to a pixel in separate R/G/B format and assemble as 5-6-5
u16 pixel(s32 x, rgb_t color) const
{
u8 const *table = &m_dither_lookup[(x & 3) << 9];
return (table[color.r()] << 11) | (table[color.g() + 256] << 5) | table[color.b()];
}
// apply dithering to an rgbint_t pixel and assemble as 5-6-5
u16 pixel(s32 x, rgbaint_t const &color) const
{
u8 const *table = &m_dither_lookup[(x & 3) << 9];
return (table[color.get_r()] << 11) | (table[color.get_g() + 256] << 5) | table[color.get_b()];
}
// return the raw 4x4 dither pattern
u32 raw_4x4(s32 x) const
{
return m_dither_raw_4x4[x & 3];
}
// return the subtractive dither value for alpha blending
u32 subtract(s32 x) const
{
return (m_dither_raw != nullptr) ? (15 - (m_dither_raw[x & 3] >> 1)) : 0;
}
// allocate and initialize static tables
static void init_static();
private:
// hardware-verified equation for applying dither to the red/blue components
static constexpr u8 dither_rb(u8 value, u8 dither)
{
return ((value << 1) - (value >> 4) + (value >> 7) + dither) >> (1+3);
}
// hardware-verified equation for applying dither to the green componenets
static constexpr u8 dither_g(u8 value, u8 dither)
{
return ((value << 2) - (value >> 4) + (value >> 6) + dither) >> (2+2);
}
// internal state
u8 const *m_dither_lookup;
u8 const *m_dither_raw;
u8 const *m_dither_raw_4x4;
// static tables
static std::unique_ptr<u8[]> s_dither4_lookup;
static std::unique_ptr<u8[]> s_dither2_lookup;
static std::unique_ptr<u8[]> s_nodither_lookup;
static u8 const s_dither_matrix_4x4[4*4];
static u8 const s_dither_matrix_2x2[4*4];
};
// ======================> color_source
// color_source describes the alpha+RGB components of a color in an
// abstract way
class color_source
{
public:
// flags
static constexpr u8 FLAG_INVERTED = 0x80;
static constexpr u8 FLAG_ALPHA_EXPANDED = 0x40;
// constant values (0-3)
static constexpr u8 ZERO = 0;
static constexpr u8 ONE = 1;
static constexpr u8 COLOR0 = 2;
static constexpr u8 COLOR1 = 3;
// iterated values (4-7)
static constexpr u8 ITERATED_ARGB = 4;
static constexpr u8 CLAMPZ = 5;
static constexpr u8 CLAMPW = 6;
// dynamic values (8+)
static constexpr u8 TEXEL0 = 8;
static constexpr u8 TEXEL1 = 9;
static constexpr u8 DETAIL_FACTOR = 10;
static constexpr u8 LOD_FRACTION = 11;
static constexpr u8 COLOR0_OR_ITERATED_VIA_TEXEL_ALPHA = 12;
// constructor
constexpr color_source(u8 alpha = ZERO, u8 rgb = ZERO) : m_alpha(alpha), m_rgb(rgb) { }
// exact comparisons
bool operator==(color_source const &rhs) const { return m_rgb == rhs.m_rgb && m_alpha == rhs.m_alpha; }
bool operator!=(color_source const &rhs) const { return m_rgb != rhs.m_rgb || m_alpha != rhs.m_alpha; }
// return the full alpha/RGB value
u8 alpha() const { return m_alpha; }
u8 rgb() const { return m_rgb; }
// return the base (flag-free) alpha/RGB value
u8 alpha_base() const { return m_alpha & 15; }
u8 rgb_base() const { return m_rgb & 15; }
// return the alpha/RGB value flags
u8 alpha_flags() const { return m_alpha >> 6; }
u8 rgb_flags() const { return m_rgb >> 6; }
// helpers
bool is_rgb_zero() const { return m_rgb == ZERO; }
bool is_alpha_zero() const { return m_alpha == ZERO; }
bool is_zero() const { return is_rgb_zero() && is_alpha_zero(); }
bool is_rgb_one() const { return m_rgb == ONE; }
bool is_alpha_one() const { return m_alpha == ONE; }
bool is_one() const { return is_rgb_one() && is_alpha_one(); }
// uniform is true if RGB and alpha come from the same source
bool is_uniform() const { return (m_alpha == m_rgb); }
// uniform_alpha is true if RGB and alpha are replication of the same alpha value
bool is_uniform_alpha() const { return ((m_alpha | FLAG_ALPHA_EXPANDED) == m_rgb); }
// constant is true if both values are constant across a scanline
bool is_rgb_constant() const { return ((m_rgb & 0x0c) == 0x00); }
bool is_alpha_constant() const { return ((m_alpha & 0x0c) == 0x00); }
bool is_constant() const { return is_rgb_constant() && is_alpha_constant(); }
// partial_constant is true if at least one value is constant across a scanline
bool is_partial_constant() const { return is_rgb_constant() || is_alpha_constant(); }
// constant_or_iterated is true if values are constant or simply iterated across a scanline
bool is_rgb_constant_or_iterated() const { return ((m_rgb & 0x08) == 0x00); }
bool is_alpha_constant_or_iterated() const { return ((m_alpha & 0x08) == 0x00); }
bool is_constant_or_iterated() const { return is_rgb_constant_or_iterated() && is_alpha_constant_or_iterated(); }
// uses_any is true if either the RGB or alpha referenecs the given source
bool uses_any(color_source const &src) const { return rgb_base() == src.rgb_base() || alpha_base() == src.alpha_base(); }
// directly set the alpha/RGB component
void set_alpha(u8 alpha) { m_alpha = alpha; }
void set_rgb(u8 rgb) { m_rgb = rgb; }
// set the RGB as an expanded single component
void set_rgb_from_alpha(u8 rgb) { m_rgb = rgb | FLAG_ALPHA_EXPANDED; }
// mark the RGB/alpha component as inverted
void invert_rgb() { m_rgb ^= FLAG_INVERTED; }
void invert_alpha() { m_alpha ^= FLAG_INVERTED; }
// perform internal simplification
void simplify();
// return a string version of the component
std::string as_string() const;
// constants
static color_source const zero;
static color_source const one;
static color_source const iterated_argb;
static color_source const color0;
static color_source const color1;
static color_source const texel0;
static color_source const texel1;
private:
// internal state
u8 m_alpha, m_rgb;
};
// ======================> color_equation
// color_equation describes a set of 4 color sources, intended to be computed
// as clamp((color - sub) * multiply + add)
class color_equation
{
public:
// construction
constexpr color_equation() { }
// simple getters
color_source &color() { return m_color; }
color_source &subtract() { return m_subtract; }
color_source &multiply() { return m_multiply; }
color_source &add() { return m_add; }
// helpers
bool uses_any(color_source color) const { return m_color.uses_any(color) || m_subtract.uses_any(color) || m_multiply.uses_any(color) || m_add.uses_any(color); }
bool is_identity(color_source color) const { return (m_multiply.is_zero() && m_add == color); }
bool is_zero() const { return m_multiply.is_zero() && m_add.is_zero(); }
// operations
void simplify();
std::string as_string() const;
// computation
static color_equation from_fbzcp(reg_fbz_colorpath const fbzcp);
static color_equation from_texmode(reg_texture_mode const texmode, color_source texel_color, color_source input_color);
private:
// internal state
color_source m_color;
color_source m_subtract;
color_source m_multiply;
color_source m_add;
};
// ======================> rasterizer_params
// this class holds the representative parameters that characterize a
// specific rasterizer; these are used to index and discover one of
// the special hard-coded rasterizers in voodoo_render.cpp
class rasterizer_params
{
public:
// generic flags
static constexpr u32 GENERIC_TEX0 = 0x01;
static constexpr u32 GENERIC_TEX1 = 0x02;
static constexpr u32 GENERIC_TEX0_IDENTITY = 0x04;
static constexpr u32 GENERIC_TEX1_IDENTITY = 0x08;
// construction
constexpr rasterizer_params(u32 generic = 0, u32 fbzcp = 0, u32 alphamode = 0, u32 fogmode = 0, u32 fbzmode = 0, u32 texmode0 = 0, u32 texmode1 = 0) :
m_generic(generic),
m_fbzcp(fbzcp),
m_alphamode(alphamode),
m_fogmode(fogmode),
m_fbzmode(fbzmode),
m_texmode0(texmode0),
m_texmode1(texmode1) { }
// compare everything directly
bool operator==(rasterizer_params const &rhs) const;
// compute the parameters given a set of registers
void compute(voodoo_regs &regs, voodoo_regs *tmu0regs = nullptr, voodoo_regs *tmu1regs = nullptr);
void compute_equations();
// compute the hash of the settings
u32 hash() const;
// getters
u32 generic() const { return m_generic; }
reg_fbz_colorpath fbzcp() const { return reg_fbz_colorpath(m_fbzcp); }
reg_alpha_mode alphamode() const { return reg_alpha_mode(m_alphamode); }
reg_fog_mode fogmode() const { return reg_fog_mode(m_fogmode); }
reg_fbz_mode fbzmode() const { return reg_fbz_mode(m_fbzmode); }
reg_texture_mode texmode0() const { return reg_texture_mode(m_texmode0); }
reg_texture_mode texmode1() const { return reg_texture_mode(m_texmode1); }
color_equation const &colorpath_equation() const { return m_color_equation; }
color_equation const &tex0_equation() const { return m_tex0_equation; }
color_equation const &tex1_equation() const { return m_tex1_equation; }
private:
// internal helpers
static constexpr u32 rotate(u32 value, int count) { return (value << count) | (value >> (32 - count)); }
// internal state
u32 m_generic; // 4 bits
u32 m_fbzcp; // 30 bits
u32 m_alphamode; // 32 bits
u32 m_fogmode; // 8 bits
u32 m_fbzmode; // 22 bits
u32 m_texmode0; // 31 bits
u32 m_texmode1; // 31 bits
color_equation m_color_equation;
color_equation m_tex0_equation;
color_equation m_tex1_equation;
};
// ======================> rasterizer_texture
// this class holds TMU-specific decoded data regarding a texture; it is
// encapsulated here, with functions to derive it from register info and
// functions to process it as part of the rendering pipeline
class rasterizer_texture
{
public:
// recompute internal values based on parameters
void recompute(voodoo_regs const &regs, u8 *ram, u32 mask, rgb_t const *lookup, u32 addrmask, u8 addrshift);
// look up a texel at the given coordinate
rgb_t lookup_single_texel(u32 format, u32 texbase, s32 s, s32 t);
// fetch a texel given coordinates and LOD information
rgbaint_t fetch_texel(voodoo::reg_texture_mode const texmode, voodoo::dither_helper const &dither, s32 x, const voodoo::stw_helper &iterstw, s32 lodbase, s32 &lod, u8 bilinear_mask);
// texture-specific color combination unit
rgbaint_t combine_texture(voodoo::reg_texture_mode const texmode, rgbaint_t const &c_local, rgbaint_t const &c_other, s32 lod);
// return a write pointer based on the LOD, s/t coordinates, and format
u8 *write_ptr(u32 lod, u32 s, u32 t, u32 scale) const
{
u32 offs = t * ((m_wmask >> lod) + 1) + s;
return m_ram + ((m_lodoffset[lod] + ((scale * offs) & ~3)) & m_mask);
}
private:
// internal state
rgb_t const *m_lookup; // currently selected lookup
u8 *m_ram; // pointer to base of TMU RAM
u8 m_wmask; // mask for the current texture width
u8 m_hmask; // mask for the current texture height
u8 m_detailscale; // detail scale
s16 m_lodmin; // minimum LOD value
s16 m_lodmax; // maximum LOD value
s16 m_lodbias; // LOD bias
u16 m_lodmask; // mask of available LODs
u32 m_mask; // mask to apply to pointers
s32 m_detailmax; // detail clamp
s32 m_detailbias; // detail bias
u32 m_lodoffset[9]; // offset of texture base for each LOD
};
// ======================> rasterizer_palette
class rasterizer_palette
{
public:
// compute from an NCC table
void compute_ncc(u32 const *regs);
// copy from a table
void copy(rgb_t *texels) { memcpy(&m_texel, texels, sizeof(m_texel)); }
// simple getters
rgb_t const *texels() const { return &m_texel[0]; }
private:
// internal state
rgb_t m_texel[256];
};
// ======================> poly_data
// this struct contains the polygon-wide shared data used during rendering;
// it is captured here so that further changed can be made to the registers
// without affecting pending operations
struct poly_data
{
rasterizer_params raster; // normalized rasterizer parameters, for triangles
rasterizer_info *info; // pointer to rasterizer information
u16 *destbase; // destination to write
u16 *depthbase; // depth/aux buffer to write
rasterizer_texture *tex0; // texture 0 information
rasterizer_texture *tex1; // texture 1 information
u16 clipleft, clipright; // x clipping
u16 cliptop, clipbottom; // y clipping
s16 ax, ay; // vertex A x,y (12.4)
s32 startr, startg, startb, starta; // starting R,G,B,A (12.12)
s32 startz; // starting Z (20.12)
s64 startw; // starting W (16.32)
s32 drdx, dgdx, dbdx, dadx; // delta R,G,B,A per X
s32 dzdx; // delta Z per X
s64 dwdx; // delta W per X
s32 drdy, dgdy, dbdy, dady; // delta R,G,B,A per Y
s32 dzdy; // delta Z per Y
s64 dwdy; // delta W per Y
s64 starts0, startt0; // starting S,T (14.18)
s64 startw0; // starting W (2.30)
s64 ds0dx, dt0dx; // delta S,T per X
s64 dw0dx; // delta W per X
s64 ds0dy, dt0dy; // delta S,T per Y
s64 dw0dy; // delta W per Y
s64 starts1, startt1; // starting S,T (14.18)
s64 startw1; // starting W (2.30)
s64 ds1dx, dt1dx; // delta S,T per X
s64 dw1dx; // delta W per X
s64 ds1dy, dt1dy; // delta S,T per Y
s64 dw1dy; // delta W per Y
rgb_t color0, color1; // colors consumed by the rasterizer
rgb_t chromakey; // chromakey
rgb_t fogcolor; // fogcolor
u32 zacolor; // depth/alpha value consumed by the rasterizer
u32 stipple; // stipple pattern
u32 alpharef; // reference alpha value
u16 dither[16]; // dither matrix, for fastfill
};
// ======================> rasterizer_info
// this struct describes a specific rasterizer
struct rasterizer_info
{
rasterizer_info *next; // pointer to next entry with the same hash
voodoo_poly_manager::render_delegate callback; // callback pointer
u8 is_generic; // is this a generic rasterizer?
u8 display; // display index, used for sorted printing
u32 scanlines; // how many scanlines we've used this for
u32 polys; // how many polys we've used this for
u32 fullhash; // full 32-bit hash
rasterizer_params params; // full copy of the relevant parameters
};
// ======================> thread_stats_block
// this struct holds a thread-specific chunk of statistics that are combined
// on demand with other threads' data when requested
struct thread_stats_block
{
void reset()
{
pixels_in = pixels_out = chroma_fail = zfunc_fail = afunc_fail = clip_fail = stipple_count = 0;
}
s32 pixels_in = 0; // pixels in statistic
s32 pixels_out = 0; // pixels out statistic
s32 chroma_fail = 0; // chroma test fail statistic
s32 zfunc_fail = 0; // z function test fail statistic
s32 afunc_fail = 0; // alpha function test fail statistic
s32 clip_fail = 0; // clipping fail statistic
s32 stipple_count = 0; // stipple statistic
s32 filler[poly_array<int,1>::CACHE_LINE_SIZE/4 - 7]; // pad this structure to cache line size
};
// ======================> voodoo_renderer
class voodoo_renderer : public voodoo_poly_manager
{
static constexpr u32 RASTER_HASH_SIZE = 97; // size of the rasterizer hash table
public:
using rasterizer_mfp = void (voodoo_renderer::*)(int32_t, const extent_t &, const poly_data &, int);
// construction
voodoo_renderer(running_machine &machine, u16 tmu_config, const rgb_t *rgb565, voodoo_regs &fbi_regs, voodoo_regs *tmu0_regs, voodoo_regs *tmu1_regs);
// state saving
void register_save(save_proxy &save);
// simple getters
s32 yorigin() const { return m_yorigin; }
u32 rowpixels() const { return m_rowpixels; }
u16 tmu_config() const { return m_tmu_config; }
std::vector<thread_stats_block> &thread_stats() { return m_thread_stats; }
// simple setters
void set_tmu_config(u16 value) { m_tmu_config = value; }
void set_fogdelta_mask(u8 value) { m_fogdelta_mask = value; }
void set_bilinear_mask(u8 value) { m_bilinear_mask = value; }
// allocate a new poly_data and fill in the rasterizer_params
poly_data &alloc_poly();
// enqueue operations
u32 enqueue_fastfill(poly_data &poly);
u32 enqueue_triangle(poly_data &poly, vertex_t const *vert);
// core triangle rasterizer
template<u32 GenericFlags, u32 FbzCp, u32 FbzMode, u32 AlphaMode, u32 FogMode, u32 TexMode0, u32 TexMode1>
void rasterizer(s32 y, const voodoo::voodoo_renderer::extent_t &extent, const voodoo::poly_data &extra, int threadid);
// run the pixel pipeline for LFB writes
void pixel_pipeline(thread_stats_block &threadstats, voodoo::poly_data const &extra, voodoo::reg_lfb_mode const lfbmode, s32 x, s32 scry, rgb_t color, u16 sz);
// update the fog tables
void write_fog(u32 base, u32 data)
{
wait("Fog write");
m_fogdelta[base + 0] = (data >> 0) & 0xff;
m_fogblend[base + 0] = (data >> 8) & 0xff;
m_fogdelta[base + 1] = (data >> 16) & 0xff;
m_fogblend[base + 1] = (data >> 24) & 0xff;
}
// update the Y origin
void set_yorigin(s32 yorigin)
{
wait("Y origin write");
m_yorigin = yorigin;
}
// update the rowpixels
void set_rowpixels(u32 rowpixels)
{
wait("Rowpixels write");
m_rowpixels = rowpixels;
}
// manage texture instances
rasterizer_texture &alloc_texture(int tmu) { return m_textures.next(tmu); }
rasterizer_texture &last_texture(int tmu) { return m_textures.last(tmu); }
// manage ncc texel instnaces
rasterizer_palette &alloc_palette(int which) { return m_palettes.next(which); }
rasterizer_palette &last_palette(int which) { return m_palettes.last(which); }
// dump rasterizer statistics if enabled
void dump_rasterizer_stats();
protected:
// overrides
virtual void reset_after_wait() override;
private:
// pipeline stages, in order
bool stipple_test(thread_stats_block &threadstats, voodoo::reg_fbz_mode const fbzmode, s32 x, s32 y, u32 &stipple);
s32 compute_depthval(voodoo::poly_data const &extra, voodoo::reg_fbz_mode const fbzmode, voodoo::reg_fbz_colorpath const fbzcp, s32 wfloat, s32 iterz);
bool depth_test(thread_stats_block &stats, voodoo::poly_data const &extra, voodoo::reg_fbz_mode const fbzmode, s32 destDepth, s32 biasdepth);
bool combine_color(rgbaint_t &color, thread_stats_block &threadstats, const voodoo::poly_data &extradata, voodoo::reg_fbz_colorpath const fbzcp, voodoo::reg_fbz_mode const fbzmode, rgbaint_t texel, s32 iterz, s64 iterw, rgb_t chromakey);
bool alpha_mask_test(thread_stats_block &stats, u32 alpha);
bool alpha_test(thread_stats_block &stats, voodoo::reg_alpha_mode const alphamode, u32 alpha, u32 alpharef);
bool chroma_key_test(thread_stats_block &stats, rgbaint_t const &colorin, rgb_t chromakey);
void apply_fogging(rgbaint_t &color, voodoo::poly_data const &extra, voodoo::reg_fbz_mode const fbzmode, voodoo::reg_fog_mode const fogmode, voodoo::reg_fbz_colorpath const fbzcp, s32 x, voodoo::dither_helper const &dither, s32 wfloat, s32 iterz, s64 iterw, const rgbaint_t &iterargb);
void alpha_blend(rgbaint_t &color, voodoo::reg_fbz_mode const fbzmode, voodoo::reg_alpha_mode const alphamode, s32 x, voodoo::dither_helper const &dither, int dpix, u16 *depth, rgbaint_t const &prefog);
void write_pixel(thread_stats_block &threadstats, voodoo::reg_fbz_mode const fbzmode, voodoo::dither_helper const &dither, u16 *destbase, u16 *depthbase, s32 x, rgbaint_t const &color, s32 depthval);
// fastfill rasterizer
void rasterizer_fastfill(s32 scanline, const voodoo::voodoo_renderer::extent_t &extent, const voodoo::poly_data &extradata, int threadid);
// helpers
static rasterizer_mfp generic_rasterizer(u8 texmask);
voodoo::rasterizer_info *add_rasterizer(voodoo::rasterizer_params const &params, rasterizer_mfp rasterizer, bool is_generic);
// internal state
u8 m_bilinear_mask; // mask for bilinear resolution (0xf0 for V1, 0xff for V2)
u16 m_tmu_config; // TMU configuration
u32 m_rowpixels; // current pixels per row
s32 m_yorigin; // current Y origin
voodoo_regs &m_fbi_reg; // FBI registers
voodoo_regs *m_tmu0_reg; // TMU #0 registers
voodoo_regs *m_tmu1_reg; // TMU #1 register
rgb_t const *m_rgb565; // 5-6-5 to 8-8-8 lookup table
u8 m_fogblend[64]; // 64-entry fog table
u8 m_fogdelta[64]; // 64-entry fog table
u8 m_fogdelta_mask; // mask for for delta (0xff for V1, 0xfc for V2)
poly_array<voodoo::rasterizer_texture, 2> m_textures;
poly_array<voodoo::rasterizer_palette, 8> m_palettes;
voodoo::rasterizer_info *m_raster_hash[RASTER_HASH_SIZE]; // hash table of rasterizers
voodoo::rasterizer_info *m_generic_rasterizer[16];
std::list<voodoo::rasterizer_info> m_rasterizer_list;
std::vector<thread_stats_block> m_thread_stats;
};
//**************************************************************************
// MATH HELPERS
//**************************************************************************
//-------------------------------------------------
// fast_log2 - computes the log2 of a double-
// precision value as a 24.8 value
//-------------------------------------------------
inline s32 fast_log2(double value, int offset)
{
// negative values return 0
if (UNEXPECTED(value < 0))
return 0;
// convert the value to a raw integer
union { double d; u64 i; } temp;
temp.d = value;
// we only care about the 11-bit exponent and top 4 bits of mantissa
// (sign is already assured to be 0)
u32 ival = temp.i >> 48;
// exponent in the upper bits, plus an 8-bit log value from 4 bits of mantissa
s32 exp = (ival >> 4) - 1023 + 32 - offset;
// the maximum error using a 4 bit lookup from the mantissa is 0.0875, which is
// less than 1/2 lsb (0.125) for 2 bits of fraction
static u8 const s_log2_table[16] = { 0, 22, 44, 63, 82, 100, 118, 134, 150, 165, 179, 193, 207, 220, 232, 244 };
return (exp << 8) | s_log2_table[ival & 15];
}
}
#endif // MAME_VIDEO_VOODOO_RENDER_H

View File

@ -7,6 +7,7 @@
**************************************************************************/
#include "emu.h"
#include "zeus2.h"
#include "screen.h"
#include <algorithm>
@ -19,7 +20,7 @@
* Constructor
*************************************/
zeus2_renderer::zeus2_renderer(zeus2_device *state)
: poly_manager<float, zeus2_poly_extra_data, 4, 10000>(state->machine())
: poly_manager<float, zeus2_poly_extra_data, 4>(state->machine())
, m_state(state)
{
}
@ -1827,8 +1828,8 @@ void zeus2_renderer::zeus2_draw_quad(const uint32_t *databuffer, uint32_t texdat
}
//if (numverts == 3)
// render_triangle(m_state->zeus_cliprect, render_delegate(&zeus2_renderer::render_poly_8bit, this), 4, vert[0], vert[1], vert[2]);
render_polygon<4>(m_state->zeus_cliprect, render_delegate(&zeus2_renderer::render_poly_8bit, this), 4, vert);
// render_triangle<4>(m_state->zeus_cliprect, render_delegate(&zeus2_renderer::render_poly_8bit, this), vert[0], vert[1], vert[2]);
render_polygon<4, 4>(m_state->zeus_cliprect, render_delegate(&zeus2_renderer::render_poly_8bit, this), vert);
}

View File

@ -83,7 +83,7 @@ struct zeus2_poly_extra_data
*************************************/
class zeus2_device;
class zeus2_renderer : public poly_manager<float, zeus2_poly_extra_data, 4, 10000>
class zeus2_renderer : public poly_manager<float, zeus2_poly_extra_data, 4>
{
public:
zeus2_renderer(zeus2_device *state);

View File

@ -12,7 +12,7 @@
#include "emu.h"
#if (!defined(MAME_DEBUG) || defined(__OPTIMIZE__)) && (defined(__SSE2__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)))
#if (!defined(MAME_DEBUG) || defined(__OPTIMIZE__)) && (defined(__SSE2__) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)))
#include "rgbsse.h"

View File

@ -271,6 +271,9 @@ public:
inline void min(const s32 value)
{
__m128i val = _mm_set1_epi32(value);
#ifdef __SSE4_1__
m_value = _mm_min_epi32(m_value, val);
#else
__m128i is_greater_than = _mm_cmpgt_epi32(m_value, val);
__m128i val_to_set = _mm_and_si128(val, is_greater_than);
@ -278,11 +281,15 @@ public:
m_value = _mm_and_si128(m_value, keep_mask);
m_value = _mm_or_si128(val_to_set, m_value);
#endif
}
inline void max(const s32 value)
{
__m128i val = _mm_set1_epi32(value);
#ifdef __SSE4_1__
m_value = _mm_max_epi32(m_value, val);
#else
__m128i is_less_than = _mm_cmplt_epi32(m_value, val);
__m128i val_to_set = _mm_and_si128(val, is_less_than);
@ -290,6 +297,7 @@ public:
m_value = _mm_and_si128(m_value, keep_mask);
m_value = _mm_or_si128(val_to_set, m_value);
#endif
}
void blend(const rgbaint_t& other, u8 factor);
@ -324,48 +332,38 @@ public:
m_value = _mm_unpacklo_epi16(m_value, _mm_setzero_si128());
}
// This function needs absolute value of color and scale to be 11 bits or less
// This function needs absolute value of color and scale to be 15 bits or less
inline void scale_add_and_clamp(const rgbaint_t& scale, const rgbaint_t& other)
{
// Pack scale into mult a 16 bits
__m128i tmp1 = _mm_packs_epi32(scale.m_value, _mm_setzero_si128());
// Shift up by 4
tmp1 = _mm_slli_epi16(tmp1, 4);
// Pack color into mult b 16 bit inputs
m_value = _mm_packs_epi32(m_value, _mm_setzero_si128());
// Shift up by 4
m_value = _mm_slli_epi16(m_value, 4);
// Do the 16 bit multiply, bottom 64 bits will contain 16 bit truncated results
m_value = _mm_mulhi_epi16(m_value, tmp1);
// Unpack up to s32, putting the 16 bit value at the top so the sign bit is set by the 16 bit result
m_value = _mm_unpacklo_epi16(_mm_setzero_si128(), m_value);
// Arithmetic shift down the 16 bit value to the lower 16 bits
sra_imm(16);
#ifdef __SSE4_1__
m_value = _mm_mullo_epi32(m_value, scale.m_value);
#else
// Mask off the top 16 bits of each 32-bit value
m_value = _mm_and_si128(m_value, _mm_set1_epi32(0x0000ffff));
// Do 16x16 multiplies and sum into 32-bit pairs; the AND above ensures upper pair is always 0
m_value = _mm_madd_epi16(m_value, scale.m_value);
#endif
// Arithmetic shift down the result by 8 bits
sra_imm(8);
add(other);
clamp_to_uint8();
}
// This function needs absolute value of color and scale to be 11 bits or less
// This function needs absolute value of color and scale to be 15 bits or less
inline void scale2_add_and_clamp(const rgbaint_t& scale, const rgbaint_t& other, const rgbaint_t& scale2)
{
// Pack both scale values into mult a 16 bits
__m128i tmp1 = _mm_packs_epi32(scale.m_value, scale2.m_value);
// Shift up by 4
tmp1 = _mm_slli_epi16(tmp1, 4);
// Pack both color values into mult b 16 bit inputs
m_value = _mm_packs_epi32(m_value, other.m_value);
// Shift up by 4
m_value = _mm_slli_epi16(m_value, 4);
// Do the 16 bit multiply, top and bottom 64 bits will contain 16 bit truncated results
tmp1 = _mm_mulhi_epi16(m_value, tmp1);
// Unpack up to s32, putting the 16 bit value at the top so the sign bit is set by the 16 bit result
m_value = _mm_unpacklo_epi16(_mm_setzero_si128(), tmp1);
tmp1 = _mm_unpackhi_epi16(_mm_setzero_si128(), tmp1);
// Arithmetic shift down the 16 bit value to the lower 16 bits
sra_imm(16);
tmp1 = _mm_srai_epi32(tmp1, 16);
// Add the results
m_value = _mm_add_epi32(m_value, tmp1);
// Pack 32-bit values to 16-bit values in low half, and scales in top half
__m128i tmp1 = _mm_packs_epi32(m_value, scale.m_value);
// Same for other and scale2
__m128i tmp2 = _mm_packs_epi32(other.m_value, scale2.m_value);
// Interleave the low halves (m_value, other)
__m128i tmp3 = _mm_unpacklo_epi16(tmp1, tmp2);
// Interleave the top halves (scale, scale2)
__m128i tmp4 = _mm_unpackhi_epi16(tmp1, tmp2);
// Multiply values by scales and add adjacent pairs
m_value = _mm_madd_epi16(tmp3, tmp4);
// Final shift by 8
sra_imm(8);
clamp_to_uint8();
}

View File

@ -13,7 +13,7 @@
#define MAME_EMU_VIDEO_RGBUTIL_H
// use SSE on 64-bit implementations, where it can be assumed
#if (!defined(MAME_DEBUG) || defined(__OPTIMIZE__)) && (defined(__SSE2__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)))
#if (!defined(MAME_DEBUG) || defined(__OPTIMIZE__)) && (defined(__SSE2__) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)))
#define MAME_RGB_HIGH_PRECISION
#include "rgbsse.h"

View File

@ -229,7 +229,7 @@ private:
//-------------------------------------------------
template<int _NumBits>
inline uint8_t palexpand(uint8_t bits)
constexpr uint8_t palexpand(uint8_t bits)
{
if (_NumBits == 1) { return (bits & 1) ? 0xff : 0x00; }
if (_NumBits == 2) { bits &= 3; return (bits << 6) | (bits << 4) | (bits << 2) | bits; }
@ -246,13 +246,13 @@ inline uint8_t palexpand(uint8_t bits)
// palxbit - convert an x-bit value to 8 bits
//-------------------------------------------------
inline uint8_t pal1bit(uint8_t bits) { return palexpand<1>(bits); }
inline uint8_t pal2bit(uint8_t bits) { return palexpand<2>(bits); }
inline uint8_t pal3bit(uint8_t bits) { return palexpand<3>(bits); }
inline uint8_t pal4bit(uint8_t bits) { return palexpand<4>(bits); }
inline uint8_t pal5bit(uint8_t bits) { return palexpand<5>(bits); }
inline uint8_t pal6bit(uint8_t bits) { return palexpand<6>(bits); }
inline uint8_t pal7bit(uint8_t bits) { return palexpand<7>(bits); }
constexpr uint8_t pal1bit(uint8_t bits) { return palexpand<1>(bits); }
constexpr uint8_t pal2bit(uint8_t bits) { return palexpand<2>(bits); }
constexpr uint8_t pal3bit(uint8_t bits) { return palexpand<3>(bits); }
constexpr uint8_t pal4bit(uint8_t bits) { return palexpand<4>(bits); }
constexpr uint8_t pal5bit(uint8_t bits) { return palexpand<5>(bits); }
constexpr uint8_t pal6bit(uint8_t bits) { return palexpand<6>(bits); }
constexpr uint8_t pal7bit(uint8_t bits) { return palexpand<7>(bits); }
//-------------------------------------------------
@ -261,21 +261,27 @@ inline uint8_t pal7bit(uint8_t bits) { return palexpand<7>(bits); }
//-------------------------------------------------
template<int _RBits, int _GBits, int _BBits>
inline rgb_t rgbexpand(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift)
constexpr rgb_t rgbexpand(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift)
{
return rgb_t(palexpand<_RBits>(data >> rshift), palexpand<_GBits>(data >> gshift), palexpand<_BBits>(data >> bshift));
}
template<int _ABits, int _RBits, int _GBits, int _BBits>
constexpr rgb_t argbexpand(uint32_t data, uint8_t ashift, uint8_t rshift, uint8_t gshift, uint8_t bshift)
{
return rgb_t(palexpand<_ABits>(data >> ashift), palexpand<_RBits>(data >> rshift), palexpand<_GBits>(data >> gshift), palexpand<_BBits>(data >> bshift));
}
//-------------------------------------------------
// palxxx - create an x-x-x color by extracting
// bits from a uint32_t
//-------------------------------------------------
inline rgb_t pal332(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift) { return rgbexpand<3,3,2>(data, rshift, gshift, bshift); }
inline rgb_t pal444(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift) { return rgbexpand<4,4,4>(data, rshift, gshift, bshift); }
inline rgb_t pal555(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift) { return rgbexpand<5,5,5>(data, rshift, gshift, bshift); }
inline rgb_t pal565(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift) { return rgbexpand<5,6,5>(data, rshift, gshift, bshift); }
inline rgb_t pal888(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift) { return rgbexpand<8,8,8>(data, rshift, gshift, bshift); }
constexpr rgb_t pal332(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift) { return rgbexpand<3,3,2>(data, rshift, gshift, bshift); }
constexpr rgb_t pal444(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift) { return rgbexpand<4,4,4>(data, rshift, gshift, bshift); }
constexpr rgb_t pal555(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift) { return rgbexpand<5,5,5>(data, rshift, gshift, bshift); }
constexpr rgb_t pal565(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift) { return rgbexpand<5,6,5>(data, rshift, gshift, bshift); }
constexpr rgb_t pal888(uint32_t data, uint8_t rshift, uint8_t gshift, uint8_t bshift) { return rgbexpand<8,8,8>(data, rshift, gshift, bshift); }
#endif // MAME_UTIL_PALETTE_H

View File

@ -51,7 +51,7 @@ protected:
uint16_t *screen_ram;
};
class atarisy4_renderer : public poly_manager<float, atarisy4_polydata, 2, 8192>
class atarisy4_renderer : public poly_manager<float, atarisy4_polydata, 2, POLY_FLAG_NO_WORK_QUEUE>
{
public:
atarisy4_renderer(atarisy4_state &state, screen_device &screen);
@ -214,7 +214,7 @@ private:
*************************************/
atarisy4_state::atarisy4_renderer::atarisy4_renderer(atarisy4_state &state, screen_device &screen) :
poly_manager<float, atarisy4_polydata, 2, 8192>(screen, FLAG_NO_WORK_QUEUE),
poly_manager<float, atarisy4_polydata, 2, POLY_FLAG_NO_WORK_QUEUE>(screen.machine()),
m_state(state)
{
}
@ -359,7 +359,7 @@ void atarisy4_state::atarisy4_renderer::draw_polygon(uint16_t color)
v3.x = m_state.m_gpu.points[i].x;
v3.y = m_state.m_gpu.points[i].y;
render_triangle(clip, rd_scan, 1, v1, v2, v3);
render_triangle<1>(clip, rd_scan, v1, v2, v3);
v2 = v3;
}
}

View File

@ -328,6 +328,7 @@
#include "sound/rf5c400.h"
#include "sound/dmadac.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#define GFXFIFO_IN_VERBOSE 0
@ -355,11 +356,12 @@ struct cobra_polydata
uint32_t tex_address;
};
class cobra_renderer : public poly_manager<float, cobra_polydata, 8, 10000>
class cobra_renderer : public poly_manager<float, cobra_polydata, 8>
{
public:
cobra_renderer(screen_device &screen)
: poly_manager<float, cobra_polydata, 8, 10000>(screen)
: poly_manager<float, cobra_polydata, 8>(screen.machine())
, m_screen(screen)
{
m_texture_ram = std::make_unique<uint32_t[]>(0x100000);
@ -386,6 +388,7 @@ public:
}
}
screen_device &screen() const { return m_screen; }
void render_texture_scan(int32_t scanline, const extent_t &extent, const cobra_polydata &extradata, int threadid);
void render_color_scan(int32_t scanline, const extent_t &extent, const cobra_polydata &extradata, int threadid);
void draw_point(const rectangle &visarea, vertex_t &v, uint32_t color);
@ -403,6 +406,7 @@ public:
void display(bitmap_rgb32 *bitmap, const rectangle &cliprect);
inline rgb_t texture_fetch(uint32_t *texture, int u, int v, int width, int format);
private:
screen_device &m_screen;
std::unique_ptr<bitmap_rgb32> m_framebuffer;
std::unique_ptr<bitmap_rgb32> m_backbuffer;
std::unique_ptr<bitmap_rgb32> m_overlay;
@ -2124,7 +2128,7 @@ void cobra_renderer::gfx_exit()
void cobra_renderer::gfx_reset()
{
cobra_state *cobra = machine().driver_data<cobra_state>();
cobra_state *cobra = screen().machine().driver_data<cobra_state>();
cobra->m_gfx_re_status = RE_STATUS_IDLE;
}
@ -2226,7 +2230,7 @@ void cobra_renderer::gfx_write_reg(uint64_t data)
void cobra_renderer::gfx_fifo_exec()
{
cobra_state *cobra = machine().driver_data<cobra_state>();
cobra_state *cobra = screen().machine().driver_data<cobra_state>();
if (cobra->m_gfx_fifo_loopback != 0)
return;
@ -2533,7 +2537,7 @@ void cobra_renderer::gfx_fifo_exec()
render_delegate rd = render_delegate(&cobra_renderer::render_texture_scan, this);
for (int i=2; i < units; i++)
{
render_triangle(visarea, rd, 8, vert[i-2], vert[i-1], vert[i]);
render_triangle<8>(visarea, rd, vert[i-2], vert[i-1], vert[i]);
}
}
else
@ -2541,7 +2545,7 @@ void cobra_renderer::gfx_fifo_exec()
render_delegate rd = render_delegate(&cobra_renderer::render_color_scan, this);
for (int i=2; i < units; i++)
{
render_triangle(visarea, rd, 5, vert[i-2], vert[i-1], vert[i]);
render_triangle<5>(visarea, rd, vert[i-2], vert[i-1], vert[i]);
}
}
break;

View File

@ -154,7 +154,7 @@ void funkball_state::video_start()
uint32_t funkball_state::screen_update( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect )
{
return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
return m_voodoo->update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
}
uint32_t funkball_state::voodoo_0_pci_r(int function, int reg, uint32_t mem_mask)
@ -195,7 +195,7 @@ void funkball_state::voodoo_0_pci_w(int function, int reg, uint32_t data, uint32
break;
case 0x40:
m_voodoo_pci_regs.init_enable = data;
m_voodoo->voodoo_set_init_enable(data);
m_voodoo->set_init_enable(data);
break;
}
}
@ -330,7 +330,7 @@ void funkball_state::funkball_map(address_map &map)
// map(0x08000000, 0x0fffffff).noprw();
map(0x40008000, 0x400080ff).rw(FUNC(funkball_state::biu_ctrl_r), FUNC(funkball_state::biu_ctrl_w));
map(0x40010e00, 0x40010eff).ram().share("unk_ram");
map(0xff000000, 0xfffdffff).rw(m_voodoo, FUNC(voodoo_device::voodoo_r), FUNC(voodoo_device::voodoo_w));
map(0xff000000, 0xfffdffff).rw(m_voodoo, FUNC(generic_voodoo_device::read), FUNC(generic_voodoo_device::write));
map(0xfffe0000, 0xffffffff).rom().region("bios", 0); /* System BIOS */
}
@ -781,11 +781,12 @@ void funkball_state::funkball(machine_config &config)
ADDRESS_MAP_BANK(config, "flashbank").set_map(&funkball_state::flashbank_map).set_options(ENDIANNESS_LITTLE, 32, 32, 0x10000);
/* video hardware */
VOODOO_1(config, m_voodoo, STD_VOODOO_1_CLOCK);
VOODOO_1(config, m_voodoo, voodoo_1_device::NOMINAL_CLOCK);
m_voodoo->set_fbmem(2);
m_voodoo->set_tmumem(4, 0);
m_voodoo->set_screen_tag("screen");
m_voodoo->set_cpu_tag(m_maincpu);
m_voodoo->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo->set_screen("screen");
m_voodoo->set_cpu(m_maincpu);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);

View File

@ -308,7 +308,7 @@ private:
optional_device<k001005_device> m_k001005;
optional_device_array<k001006_device, 2> m_k001006;
optional_device_array<k001604_device, 2> m_k001604;
optional_device_array<voodoo_device, 2> m_voodoo;
optional_device_array<generic_voodoo_device, 2> m_voodoo;
required_shared_ptr<uint32_t> m_work_ram;
required_shared_ptr<uint32_t> m_generic_paletteram_32;
optional_shared_ptr_array<uint32_t, 2> m_sharc_dataram;
@ -559,7 +559,7 @@ void gticlub_state::hangplt_sharc0_map(address_map &map)
map(0x0400000, 0x041ffff).rw(m_konppc, FUNC(konppc_device::cgboard_0_shared_sharc_r), FUNC(konppc_device::cgboard_0_shared_sharc_w));
map(0x0500000, 0x05fffff).ram().share(m_sharc_dataram[0]).lr32(NAME([this](offs_t offset) { return m_sharc_dataram[0][offset] & 0xffff; }));
map(0x1400000, 0x14fffff).ram();
map(0x2400000, 0x27fffff).r(m_konppc, FUNC(konppc_device::nwk_voodoo_0_r)).w(m_voodoo[0], FUNC(voodoo_device::voodoo_w));
map(0x2400000, 0x27fffff).r(m_konppc, FUNC(konppc_device::nwk_voodoo_0_r)).w(m_voodoo[0], FUNC(generic_voodoo_device::write));
map(0x3400000, 0x34000ff).rw(m_konppc, FUNC(konppc_device::cgboard_0_comm_sharc_r), FUNC(konppc_device::cgboard_0_comm_sharc_w));
map(0x3401000, 0x34fffff).w(m_konppc, FUNC(konppc_device::nwk_fifo_0_w));
map(0x3500000, 0x3507fff).rw(m_konppc, FUNC(konppc_device::K033906_0_r), FUNC(konppc_device::K033906_0_w));
@ -571,7 +571,7 @@ void gticlub_state::hangplt_sharc1_map(address_map &map)
map(0x0400000, 0x041ffff).rw(m_konppc, FUNC(konppc_device::cgboard_1_shared_sharc_r), FUNC(konppc_device::cgboard_1_shared_sharc_w));
map(0x0500000, 0x05fffff).ram().share(m_sharc_dataram[1]).lr32(NAME([this](offs_t offset) { return m_sharc_dataram[1][offset] & 0xffff; }));
map(0x1400000, 0x14fffff).ram();
map(0x2400000, 0x27fffff).r(m_konppc, FUNC(konppc_device::nwk_voodoo_1_r)).w(m_voodoo[1], FUNC(voodoo_device::voodoo_w));
map(0x2400000, 0x27fffff).r(m_konppc, FUNC(konppc_device::nwk_voodoo_1_r)).w(m_voodoo[1], FUNC(generic_voodoo_device::write));
map(0x3400000, 0x34000ff).rw(m_konppc, FUNC(konppc_device::cgboard_1_comm_sharc_r), FUNC(konppc_device::cgboard_1_comm_sharc_w));
map(0x3401000, 0x34fffff).w(m_konppc, FUNC(konppc_device::nwk_fifo_1_w));
map(0x3500000, 0x3507fff).rw(m_konppc, FUNC(konppc_device::K033906_1_r), FUNC(konppc_device::K033906_1_w));
@ -832,7 +832,7 @@ uint32_t gticlub_state::screen_update_two_screens(screen_device &screen, bitmap_
bitmap.fill(m_palette->pen(0), cliprect);
// m_k001604[Which]->draw_back_layer(bitmap, cliprect);
m_voodoo[Which]->voodoo_update(bitmap, cliprect);
m_voodoo[Which]->update(bitmap, cliprect);
m_k001604[Which]->draw_front_layer(screen, bitmap, cliprect);
return 0;
@ -950,19 +950,21 @@ void gticlub_state::hangplt(machine_config &config)
K056230(config, m_k056230, "maincpu");
VOODOO_1(config, m_voodoo[0], STD_VOODOO_1_CLOCK);
VOODOO_1(config, m_voodoo[0], voodoo_1_device::NOMINAL_CLOCK);
m_voodoo[0]->set_fbmem(2);
m_voodoo[0]->set_tmumem(2,2);
m_voodoo[0]->set_screen_tag("lscreen");
m_voodoo[0]->set_cpu_tag(m_dsp[0]);
m_voodoo[0]->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo[0]->set_screen("lscreen");
m_voodoo[0]->set_cpu(m_dsp[0]);
m_voodoo[0]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_voodoo[0]->stall_callback().set(m_dsp[0], FUNC(adsp21062_device::write_stall));
VOODOO_1(config, m_voodoo[1], STD_VOODOO_1_CLOCK);
VOODOO_1(config, m_voodoo[1], voodoo_1_device::NOMINAL_CLOCK);
m_voodoo[1]->set_fbmem(2);
m_voodoo[1]->set_tmumem(2,2);
m_voodoo[1]->set_screen_tag("rscreen");
m_voodoo[1]->set_cpu_tag(m_dsp[1]);
m_voodoo[1]->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo[1]->set_screen("rscreen");
m_voodoo[1]->set_cpu(m_dsp[1]);
m_voodoo[1]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
m_voodoo[1]->stall_callback().set(m_dsp[1], FUNC(adsp21062_device::write_stall));

View File

@ -363,7 +363,7 @@ Jumpers set on GFX PCB to scope monitor:
#include "sound/k056800.h"
#include "sound/rf5c400.h"
#include "video/k037122.h"
#include "video/voodoo.h"
#include "video/voodoo_2.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@ -434,7 +434,7 @@ private:
required_device<adc12138_device> m_adc12138;
required_device<konppc_device> m_konppc;
optional_device<eeprom_serial_93cxx_device> m_lan_eeprom;
optional_device_array<voodoo_device, 2> m_voodoo;
optional_device_array<generic_voodoo_device, 2> m_voodoo;
required_ioport_array<3> m_in;
required_ioport m_dsw;
optional_ioport m_eepromout;
@ -492,7 +492,7 @@ private:
template <uint8_t Which>
uint32_t hornet_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
m_voodoo[Which]->voodoo_update(bitmap, cliprect);
m_voodoo[Which]->update(bitmap, cliprect);
m_k037122[Which]->tile_draw(screen, bitmap, cliprect);
@ -834,7 +834,7 @@ void hornet_state::sharc0_map(address_map &map)
map(0x0400000, 0x041ffff).rw(m_konppc, FUNC(konppc_device::cgboard_0_shared_sharc_r), FUNC(konppc_device::cgboard_0_shared_sharc_w));
map(0x0500000, 0x05fffff).ram().share(m_sharc_dataram[0]).lr32(NAME([this](offs_t offset) { return m_sharc_dataram[0][offset] & 0xffff; }));
map(0x1400000, 0x14fffff).ram();
map(0x2400000, 0x27fffff).rw(m_voodoo[0], FUNC(voodoo_device::voodoo_r), FUNC(voodoo_device::voodoo_w));
map(0x2400000, 0x27fffff).m(m_voodoo[0], FUNC(generic_voodoo_device::core_map));
map(0x3400000, 0x34000ff).rw(m_konppc, FUNC(konppc_device::cgboard_0_comm_sharc_r), FUNC(konppc_device::cgboard_0_comm_sharc_w));
map(0x3500000, 0x35000ff).rw(m_konppc, FUNC(konppc_device::K033906_0_r), FUNC(konppc_device::K033906_0_w));
map(0x3600000, 0x37fffff).bankr("master_cgboard_bank");
@ -845,7 +845,7 @@ void hornet_state::sharc1_map(address_map &map)
map(0x0400000, 0x041ffff).rw(m_konppc, FUNC(konppc_device::cgboard_1_shared_sharc_r), FUNC(konppc_device::cgboard_1_shared_sharc_w));
map(0x0500000, 0x05fffff).ram().share(m_sharc_dataram[1]).lr32(NAME([this](offs_t offset) { return m_sharc_dataram[1][offset] & 0xffff; }));
map(0x1400000, 0x14fffff).ram();
map(0x2400000, 0x27fffff).rw(m_voodoo[1], FUNC(voodoo_device::voodoo_r), FUNC(voodoo_device::voodoo_w));
map(0x2400000, 0x27fffff).m(m_voodoo[1], FUNC(generic_voodoo_device::core_map));
map(0x3400000, 0x34000ff).rw(m_konppc, FUNC(konppc_device::cgboard_1_comm_sharc_r), FUNC(konppc_device::cgboard_1_comm_sharc_w));
map(0x3500000, 0x35000ff).rw(m_konppc, FUNC(konppc_device::K033906_1_r), FUNC(konppc_device::K033906_1_w));
map(0x3600000, 0x37fffff).bankr("slave_cgboard_bank");
@ -1124,8 +1124,9 @@ void hornet_state::hornet(machine_config &config)
VOODOO_1(config, m_voodoo[0], XTAL(50'000'000));
m_voodoo[0]->set_fbmem(2);
m_voodoo[0]->set_tmumem(4,0);
m_voodoo[0]->set_screen_tag("screen");
m_voodoo[0]->set_cpu_tag(m_dsp[0]);
m_voodoo[0]->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo[0]->set_screen("screen");
m_voodoo[0]->set_cpu(m_dsp[0]);
m_voodoo[0]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_voodoo[0]->stall_callback().set(m_dsp[0], FUNC(adsp21062_device::write_stall));
@ -1199,13 +1200,14 @@ void hornet_state::sscope(machine_config &config)
m_k037122[1]->set_screen("rscreen");
m_k037122[1]->set_palette("palette");
m_voodoo[0]->set_screen_tag("lscreen");
m_voodoo[0]->set_screen("lscreen");
VOODOO_1(config, m_voodoo[1], XTAL(50'000'000));
m_voodoo[1]->set_fbmem(2);
m_voodoo[1]->set_tmumem(4, 0);
m_voodoo[1]->set_screen_tag("rscreen");
m_voodoo[1]->set_cpu_tag(m_dsp[1]);
m_voodoo[1]->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo[1]->set_screen("rscreen");
m_voodoo[1]->set_cpu(m_dsp[1]);
m_voodoo[1]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
m_voodoo[1]->stall_callback().set(m_dsp[1], FUNC(adsp21062_device::write_stall));
@ -1234,19 +1236,21 @@ void hornet_state::sscope_voodoo2(machine_config& config)
{
sscope(config);
VOODOO_2(config.replace(), m_voodoo[0], STD_VOODOO_2_CLOCK);
VOODOO_2(config.replace(), m_voodoo[0], voodoo_2_device::NOMINAL_CLOCK);
m_voodoo[0]->set_fbmem(2);
m_voodoo[0]->set_tmumem(4,0);
m_voodoo[0]->set_screen_tag("lscreen");
m_voodoo[0]->set_cpu_tag(m_dsp[0]);
m_voodoo[0]->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo[0]->set_screen("lscreen");
m_voodoo[0]->set_cpu(m_dsp[0]);
m_voodoo[0]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_voodoo[0]->stall_callback().set(m_dsp[0], FUNC(adsp21062_device::write_stall));
VOODOO_2(config.replace(), m_voodoo[1], STD_VOODOO_2_CLOCK);
VOODOO_2(config.replace(), m_voodoo[1], voodoo_2_device::NOMINAL_CLOCK);
m_voodoo[1]->set_fbmem(2);
m_voodoo[1]->set_tmumem(4,0);
m_voodoo[1]->set_screen_tag("rscreen");
m_voodoo[1]->set_cpu_tag(m_dsp[1]);
m_voodoo[1]->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo[1]->set_screen("rscreen");
m_voodoo[1]->set_cpu(m_dsp[1]);
m_voodoo[1]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
m_voodoo[1]->stall_callback().set(m_dsp[1], FUNC(adsp21062_device::write_stall));
}

View File

@ -198,7 +198,8 @@ void iteagle_state::iteagle(machine_config &config)
voodoo_3_pci_device &voodoo(VOODOO_3_PCI(config, PCI_ID_VIDEO, 0, m_maincpu, "screen"));
voodoo.set_fbmem(16);
subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(m_fpga, FUNC(iteagle_fpga_device::vblank_update));
voodoo.set_status_cycles(1000); // optimization to consume extra cycles when polling status
subdevice<generic_voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(m_fpga, FUNC(iteagle_fpga_device::vblank_update));
ITEAGLE_EEPROM(config, m_eeprom, 0);
@ -299,6 +300,7 @@ void iteagle_state::virtpool(machine_config &config)
voodoo_1_pci_device &voodoo(VOODOO_1_PCI(config.replace(), PCI_ID_VIDEO, 0, m_maincpu, "screen"));
voodoo.set_fbmem(4);
voodoo.set_tmumem(4, 4);
voodoo.set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_fpga->set_init_info(0x01000202, 0x080808);
m_eeprom->set_info(0x0202, 0x7);

View File

@ -194,7 +194,7 @@ private:
/* 3Dfx Voodoo */
required_device_array<voodoo_device, 2> m_voodoo;
required_device_array<generic_voodoo_device, 2> m_voodoo;
struct
{
@ -301,7 +301,7 @@ void magictg_state::video_start()
uint32_t magictg_state::screen_update_magictg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
return m_voodoo[0]->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
return m_voodoo[0]->update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
}
@ -358,7 +358,7 @@ void magictg_state::voodoo_0_pci_w(int function, int reg, uint32_t data, uint32_
break;
case 0x40:
m_voodoo_pci_regs[0].init_enable = data;
m_voodoo[0]->voodoo_set_init_enable(data);
m_voodoo[0]->set_init_enable(data);
break;
default:
@ -403,7 +403,7 @@ void magictg_state::voodoo_1_pci_w(int function, int reg, uint32_t data, uint32_
break;
case 0x40:
m_voodoo_pci_regs[1].init_enable = data;
voodoo_set_init_enable(state->m_voodoo[1], data);
set_init_enable(state->m_voodoo[1], data);
break;
default:
@ -852,9 +852,9 @@ void magictg_state::magictg_map(address_map &map)
{
map(0x00000000, 0x007fffff).ram(); // 8MB RAM
map(0x00800000, 0x0081003f).ram(); // ?
map(0x0a000000, 0x0affffff).rw("voodoo_0", FUNC(voodoo_device::voodoo_r), FUNC(voodoo_device::voodoo_w));
map(0x0a000000, 0x0affffff).rw("voodoo_0", FUNC(generic_voodoo_device::read), FUNC(generic_voodoo_device::write));
#if defined(USE_TWO_3DFX)
map(0x0b000000, 0x0bffffff).rw("voodoo_1", FUNC(voodoo_device::voodoo_r), FUNC(voodoo_device::voodoo_w));
map(0x0b000000, 0x0bffffff).rw("voodoo_1", FUNC(voodoo_device_base::read), FUNC(voodoo_device_base::write));
map(0x0c000000, 0x0c000fff).rw(FUNC(magictg_state::zr36120_r), FUNC(magictg_state::zr36120_w));
#else
map(0x0b000000, 0x0b000fff).rw(FUNC(magictg_state::zr36120_r), FUNC(magictg_state::zr36120_w));
@ -940,17 +940,19 @@ void magictg_state::magictg(machine_config &config)
#endif
pcibus.set_device(9, FUNC(magictg_state::zr36120_pci_r), FUNC(magictg_state::zr36120_pci_w)); // TODO: ZR36120 device
VOODOO_1(config, m_voodoo[0], STD_VOODOO_1_CLOCK);
VOODOO_1(config, m_voodoo[0], voodoo_1_device::NOMINAL_CLOCK);
m_voodoo[0]->set_fbmem(2);
m_voodoo[0]->set_tmumem(4,0);
m_voodoo[0]->set_screen_tag("screen");
m_voodoo[0]->set_cpu_tag(m_mips);
m_voodoo[0]->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo[0]->set_screen("screen");
m_voodoo[0]->set_cpu(m_mips);
VOODOO_1(config, m_voodoo[1], STD_VOODOO_1_CLOCK);
VOODOO_1(config, m_voodoo[1], voodoo_1_device::NOMINAL_CLOCK);
m_voodoo[1]->set_fbmem(2);
m_voodoo[1]->set_tmumem(4,0);
m_voodoo[1]->set_screen_tag("screen");
m_voodoo[1]->set_cpu_tag(m_mips);
m_voodoo[1]->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo[1]->set_screen("screen");
m_voodoo[1]->set_cpu(m_mips);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);

View File

@ -1266,6 +1266,7 @@ Notes:
#include "sound/c352.h"
#include "video/poly.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
@ -1327,7 +1328,7 @@ struct namcos23_render_data
class namcos23_state;
class namcos23_renderer : public poly_manager<float, namcos23_render_data, 4, POLY_MAX_ENTRIES>
class namcos23_renderer : public poly_manager<float, namcos23_render_data, 4>
{
public:
namcos23_renderer(namcos23_state &state);
@ -1652,7 +1653,7 @@ uint16_t namcos23_state::nthword(const uint32_t *pSource, int offs)
***************************************************************************/
namcos23_renderer::namcos23_renderer(namcos23_state &state)
: poly_manager<float, namcos23_render_data, 4, POLY_MAX_ENTRIES>(state.machine()),
: poly_manager<float, namcos23_render_data, 4>(state.machine()),
m_state(state)
{
}
@ -2222,7 +2223,7 @@ void namcos23_state::render_one_model(const namcos23_render_entry *re)
namcos23_poly_entry *p = render.polys + render.poly_count;
// Should be unnecessary now that frustum clipping happens, but this still culls polys behind the camera
p->vertex_count = render.polymgr->zclip_if_less(ne, pv, p->pv, 4, 0.00001f);
p->vertex_count = render.polymgr->zclip_if_less<4>(ne, pv, p->pv, 0.00001f);
// Project if you don't clip on the near plane
if(p->vertex_count >= 3) {
@ -2316,13 +2317,13 @@ void namcos23_renderer::render_flush(bitmap_rgb32& bitmap)
// We should probably split the polygons into triangles ourselves to insure everything is being rendered properly
if (p->vertex_count == 3)
render_triangle(scissor, render_delegate(&namcos23_renderer::render_scanline, this), 4, p->pv[0], p->pv[1], p->pv[2]);
render_triangle<4>(scissor, render_delegate(&namcos23_renderer::render_scanline, this), p->pv[0], p->pv[1], p->pv[2]);
else if (p->vertex_count == 4)
render_polygon<4>(scissor, render_delegate(&namcos23_renderer::render_scanline, this), 4, p->pv);
render_polygon<4, 4>(scissor, render_delegate(&namcos23_renderer::render_scanline, this), p->pv);
else if (p->vertex_count == 5)
render_polygon<5>(scissor, render_delegate(&namcos23_renderer::render_scanline, this), 4, p->pv);
render_polygon<5, 4>(scissor, render_delegate(&namcos23_renderer::render_scanline, this), p->pv);
else if (p->vertex_count == 6)
render_polygon<6>(scissor, render_delegate(&namcos23_renderer::render_scanline, this), 4, p->pv);
render_polygon<6, 4>(scissor, render_delegate(&namcos23_renderer::render_scanline, this), p->pv);
}
render.poly_count = 0;
}

View File

@ -334,7 +334,7 @@ private:
required_device_array<k001604_device, 2> m_k001604;
required_device<konppc_device> m_konppc;
required_device<adc12138_device> m_adc12138;
required_device_array<voodoo_device, 2> m_voodoo;
required_device_array<generic_voodoo_device, 2> m_voodoo;
required_ioport_array<3> m_in;
required_ioport m_dsw;
required_ioport_array<5> m_analog;
@ -377,7 +377,7 @@ uint32_t nwktr_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
int board = m_exrgb ? 1 : 0;
m_voodoo[board]->voodoo_update(bitmap, cliprect);
m_voodoo[board]->update(bitmap, cliprect);
m_k001604[0]->draw_front_layer(screen, bitmap, cliprect); // K001604 on slave board doesn't seem to output anything. Bug or intended?
return 0;
@ -688,16 +688,18 @@ void nwktr_state::nwktr(machine_config &config)
VOODOO_1(config, m_voodoo[0], XTAL(50'000'000));
m_voodoo[0]->set_fbmem(2);
m_voodoo[0]->set_tmumem(2,2);
m_voodoo[0]->set_screen_tag("screen");
m_voodoo[0]->set_cpu_tag(m_dsp[0]);
m_voodoo[0]->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo[0]->set_screen("screen");
m_voodoo[0]->set_cpu(m_dsp[0]);
m_voodoo[0]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_voodoo[0]->stall_callback().set(m_dsp[0], FUNC(adsp21062_device::write_stall));
VOODOO_1(config, m_voodoo[1], XTAL(50'000'000));
m_voodoo[1]->set_fbmem(2);
m_voodoo[1]->set_tmumem(2,2);
m_voodoo[1]->set_screen_tag("screen");
m_voodoo[1]->set_cpu_tag(m_dsp[1]);
m_voodoo[1]->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo[1]->set_screen("screen");
m_voodoo[1]->set_cpu(m_dsp[1]);
m_voodoo[1]->vblank_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ1);
m_voodoo[1]->stall_callback().set(m_dsp[1], FUNC(adsp21062_device::write_stall));

View File

@ -74,6 +74,7 @@
#include "emu.h"
#include "cpu/tms32082/tms32082.h"
#include "video/poly.h"
#include "screen.h"
struct rollext_polydata
{
@ -82,11 +83,11 @@ struct rollext_polydata
uint32_t pal;
};
class rollext_renderer : public poly_manager<float, rollext_polydata, 4, 10000>
class rollext_renderer : public poly_manager<float, rollext_polydata, 4>
{
public:
rollext_renderer(screen_device &screen)
: poly_manager<float, rollext_polydata, 4, 10000>(screen)
: poly_manager<float, rollext_polydata, 4>(screen.machine())
{
m_fb = std::make_unique<bitmap_rgb32>(1024, 1024);
}
@ -95,7 +96,7 @@ public:
void set_texture_ram(uint8_t* texture_ram);
void set_palette_ram(uint16_t* palette_ram);
void process_display_list(uint32_t* dispram);
void process_display_list(screen_device &screen, uint32_t* dispram);
void clear_fb();
void display(bitmap_rgb32 *bitmap, const rectangle &cliprect);
@ -149,9 +150,9 @@ void rollext_renderer::render_texture_scan(int32_t scanline, const extent_t &ext
}
}
void rollext_renderer::process_display_list(uint32_t* disp_ram)
void rollext_renderer::process_display_list(screen_device &screen, uint32_t* disp_ram)
{
const rectangle& visarea = screen().visible_area();
const rectangle& visarea = screen.visible_area();
render_delegate rd = render_delegate(&rollext_renderer::render_texture_scan, this);
@ -247,8 +248,8 @@ void rollext_renderer::process_display_list(uint32_t* disp_ram)
}
#endif
render_triangle(visarea, rd, 4, vert[0], vert[1], vert[2]);
render_triangle(visarea, rd, 4, vert[0], vert[2], vert[3]);
render_triangle<4>(visarea, rd, vert[0], vert[1], vert[2]);
render_triangle<4>(visarea, rd, vert[0], vert[2], vert[3]);
}
@ -490,7 +491,7 @@ void rollext_state::cmd_callback(address_space &space, uint32_t data)
}
space.write_dword(0x600ffffc, oldnum+consume_num);
m_renderer->process_display_list(m_disp_ram);
m_renderer->process_display_list(*m_screen, m_disp_ram);
space.write_dword(0x600ffffc, 0);

View File

@ -55,7 +55,7 @@
#include "machine/pckeybrd.h"
#include "machine/idectrl.h"
#include "video/pc_vga.h"
#include "video/voodoo.h"
#include "video/voodoo_2.h"
#include "machine/ds128x.h"
#include "bus/isa/sblaster.h"
@ -357,7 +357,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
m_voodoo->voodoo_set_init_enable(0x4000); //INITEN_SECONDARY_REV_ID
m_voodoo->set_init_enable(0x4000); //INITEN_SECONDARY_REV_ID
}
uint32_t savquest_state::pci_3dfx_r(int function, int reg, uint32_t mem_mask)
@ -376,7 +376,7 @@ osd_printf_warning("PCI write: %x %x\n", reg, data);
}
else if (reg == 0x40)
{
m_voodoo->voodoo_set_init_enable(data);
m_voodoo->set_init_enable(data);
}
else if (reg == 0x54)
{
@ -754,7 +754,7 @@ void savquest_state::savquest_map(address_map &map)
map(0x000e8000, 0x000ebfff).bankr("bios_e8000").w(FUNC(savquest_state::bios_e8000_ram_w));
map(0x000ec000, 0x000effff).bankr("bios_ec000").w(FUNC(savquest_state::bios_ec000_ram_w));
map(0x00100000, 0x07ffffff).ram(); // 128MB RAM
map(0xe0000000, 0xe0fbffff).rw(m_voodoo, FUNC(voodoo_device::voodoo_r), FUNC(voodoo_device::voodoo_w));
map(0xe0000000, 0xe0fbffff).rw(m_voodoo, FUNC(generic_voodoo_device::read), FUNC(generic_voodoo_device::write));
map(0xfffc0000, 0xffffffff).rom().region("bios", 0); /* System BIOS */
}
@ -852,11 +852,12 @@ void savquest_state::savquest(machine_config &config)
/* video hardware */
pcvideo_s3_vga(config);
VOODOO_2(config, m_voodoo, STD_VOODOO_2_CLOCK);
VOODOO_2(config, m_voodoo, voodoo_2_device::NOMINAL_CLOCK);
m_voodoo->set_fbmem(4);
m_voodoo->set_tmumem(4, 4); /* this is the 12Mb card */
m_voodoo->set_screen_tag("screen");
m_voodoo->set_cpu_tag(m_maincpu);
m_voodoo->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo->set_screen("screen");
m_voodoo->set_cpu(m_maincpu);
m_voodoo->vblank_callback().set(FUNC(savquest_state::vblank_assert));
}

View File

@ -1992,7 +1992,6 @@ INPUT_PORTS_END
*************************************/
void seattle_state::seattle_common(machine_config &config)
{
// basic machine hardware
R5000LE(config, m_maincpu, SYSTEM_CLOCK * 3);
m_maincpu->set_icache_size(16384);
@ -2017,9 +2016,10 @@ void seattle_state::seattle_common(machine_config &config)
VOODOO_1_PCI(config, m_voodoo, 0, m_maincpu, m_screen);
m_voodoo->set_fbmem(2);
m_voodoo->set_tmumem(4, 0);
m_voodoo->set_status_cycles(1000); // optimization to consume extra cycles when polling status
subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(seattle_state::vblank_assert));
subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->stall_callback().set(m_galileo, FUNC(gt64xxx_device::pci_stall));
subdevice<generic_voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(seattle_state::vblank_assert));
subdevice<generic_voodoo_device>(PCI_ID_VIDEO":voodoo")->stall_callback().set(m_galileo, FUNC(gt64xxx_device::pci_stall));
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
@ -2095,6 +2095,7 @@ void seattle_state::flagstaff(machine_config &config)
m_voodoo->set_fbmem(2);
m_voodoo->set_tmumem(4, 4);
m_voodoo->set_status_cycles(1000); // optimization to consume extra cycles when polling status
}
// Per game configurations

View File

@ -91,6 +91,7 @@
#include "video/tc0780fpa.h"
#include "machine/nvram.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
#define LOG_TLCS_TO_PPC_COMMANDS 1

View File

@ -178,6 +178,7 @@ Notes:
#include "cpu/tlcs900/tmp95c063.h"
#include "machine/nvram.h"
#include "video/poly.h"
#include "screen.h"
/*
Interesting mem areas
@ -638,11 +639,11 @@ private:
void tlcs900h_mem(address_map &map);
};
class taitotz_renderer : public poly_manager<float, taitotz_polydata, 6, 50000>
class taitotz_renderer : public poly_manager<float, taitotz_polydata, 6>
{
public:
taitotz_renderer(taitotz_state &state, int width, int height, uint32_t *scrram, uint32_t *texram)
: poly_manager<float, taitotz_polydata, 6, 50000>(state.machine()),
: poly_manager<float, taitotz_polydata, 6>(state.machine()),
m_state(state)
{
m_fb = std::make_unique<bitmap_rgb32>(width, height);
@ -1344,7 +1345,7 @@ void taitotz_renderer::render_tnl_object(uint32_t address, float scale, uint8_t
for (int i=2; i < num_verts; i++)
{
render_triangle(m_cliprect, render_delegate(&taitotz_renderer::draw_scanline, this), 6, v[0], v[i-1], v[i]);
render_triangle<6>(m_cliprect, render_delegate(&taitotz_renderer::draw_scanline, this), v[0], v[i-1], v[i]);
}
}
while (!end);
@ -1434,7 +1435,7 @@ void taitotz_renderer::push_direct_poly_fifo(uint32_t data)
for (int i=2; i < num_verts; i++)
{
render_triangle(m_cliprect, render_delegate(&taitotz_renderer::draw_scanline_noz, this), 3, v[0], v[i-1], v[i]);
render_triangle<3>(m_cliprect, render_delegate(&taitotz_renderer::draw_scanline_noz, this), v[0], v[i-1], v[i]);
}
m_direct_fifo_ptr = 0;

View File

@ -1924,7 +1924,8 @@ void vegas_state::vegascore(machine_config &config)
voodoo_2_pci_device &voodoo(VOODOO_2_PCI(config, PCI_ID_VIDEO, 0, m_maincpu, "screen"));
voodoo.set_fbmem(2);
voodoo.set_tmumem(4, 4);
subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(vegas_state::vblank_assert));
voodoo.set_status_cycles(1000); // optimization to consume extra cycles when polling status
subdevice<generic_voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(vegas_state::vblank_assert));
M48T37(config, m_timekeeper);
m_timekeeper->reset_cb().set(FUNC(vegas_state::watchdog_reset));
@ -1968,7 +1969,8 @@ void vegas_state::vegasban(machine_config &config)
vegas32m(config);
voodoo_banshee_pci_device &voodoo(VOODOO_BANSHEE_PCI(config.replace(), PCI_ID_VIDEO, 0, m_maincpu, "screen"));
voodoo.set_fbmem(16);
subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(vegas_state::vblank_assert));
voodoo.set_status_cycles(1000); // optimization to consume extra cycles when polling status
subdevice<generic_voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(vegas_state::vblank_assert));
}
@ -1982,7 +1984,8 @@ void vegas_state::vegasv3(machine_config &config)
voodoo_3_pci_device &voodoo(VOODOO_3_PCI(config.replace(), PCI_ID_VIDEO, 0, m_maincpu, "screen"));
voodoo.set_fbmem(16);
subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(vegas_state::vblank_assert));
voodoo.set_status_cycles(1000); // optimization to consume extra cycles when polling status
subdevice<generic_voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(vegas_state::vblank_assert));
}
@ -1999,7 +2002,8 @@ void vegas_state::denver(machine_config &config)
voodoo_3_pci_device &voodoo(VOODOO_3_PCI(config.replace(), PCI_ID_VIDEO, 0, m_maincpu, "screen"));
voodoo.set_fbmem(16);
subdevice<voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(vegas_state::vblank_assert));
voodoo.set_status_cycles(1000); // optimization to consume extra cycles when polling status
subdevice<generic_voodoo_device>(PCI_ID_VIDEO":voodoo")->vblank_callback().set(FUNC(vegas_state::vblank_assert));
// TL16C552 UART
NS16550(config, m_uart1, XTAL(1'843'200));

View File

@ -354,7 +354,7 @@ some other components. It will be documented at a later date.
#include "machine/lpci.h"
#include "machine/timekpr.h"
#include "machine/timer.h"
#include "video/voodoo.h"
#include "video/voodoo_banshee.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@ -582,50 +582,7 @@ private:
uint32_t viper_state::screen_update_viper(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
}
#ifdef UNUSED_FUNCTION
static inline uint64_t read64le_with_32smle_device_handler(read32sm_delegate handler, offs_t offset, uint64_t mem_mask)
{
uint64_t result = 0;
if (ACCESSING_BITS_0_31)
result |= (uint64_t)(handler)(offset * 2 + 0) << 0;
if (ACCESSING_BITS_32_63)
result |= (uint64_t)(handler)(offset * 2 + 1) << 32;
return result;
}
static inline uint64_t read64le_with_32sle_device_handler(read32s_delegate handler, offs_t offset, uint64_t mem_mask)
{
uint64_t result = 0;
if (ACCESSING_BITS_0_31)
result |= (uint64_t)(handler)(offset * 2 + 0, mem_mask >> 0) << 0;
if (ACCESSING_BITS_32_63)
result |= (uint64_t)(handler)(offset * 2 + 1, mem_mask >> 32) << 32;
return result;
}
static inline void write64le_with_32sle_device_handler(write32s_delegate handler, offs_t offset, uint64_t data, uint64_t mem_mask)
{
if (ACCESSING_BITS_0_31)
handler(offset * 2 + 0, data >> 0, mem_mask >> 0);
if (ACCESSING_BITS_32_63)
handler(offset * 2 + 1, data >> 32, mem_mask >> 32);
}
#endif
static inline uint64_t read64be_with_32smle_device_handler(read32sm_delegate handler, offs_t offset, uint64_t mem_mask)
{
mem_mask = swapendian_int64(mem_mask);
uint64_t result = 0;
if (ACCESSING_BITS_0_31)
result = (uint64_t)(handler)(offset * 2);
if (ACCESSING_BITS_32_63)
result |= (uint64_t)(handler)(offset * 2 + 1) << 32;
return swapendian_int64(result);
return m_voodoo->update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
}
static inline uint64_t read64be_with_32sle_device_handler(read32s_delegate handler, offs_t offset, uint64_t mem_mask)
@ -1744,35 +1701,35 @@ void viper_state::voodoo3_pci_w(int function, int reg, uint32_t data, uint32_t m
uint64_t viper_state::voodoo3_io_r(offs_t offset, uint64_t mem_mask)
{
return read64be_with_32sle_device_handler(read32s_delegate(*m_voodoo, FUNC(voodoo_3_device::banshee_io_r)), offset, mem_mask);
return read64be_with_32sle_device_handler(read32s_delegate(*m_voodoo, FUNC(voodoo_3_device::read_io)), offset, mem_mask);
}
void viper_state::voodoo3_io_w(offs_t offset, uint64_t data, uint64_t mem_mask)
{
// printf("voodoo3_io_w: %08X%08X, %08X at %08X\n", (uint32_t)(data >> 32), (uint32_t)(data), offset, m_maincpu->pc());
write64be_with_32sle_device_handler(write32s_delegate(*m_voodoo, FUNC(voodoo_3_device::banshee_io_w)), offset, data, mem_mask);
write64be_with_32sle_device_handler(write32s_delegate(*m_voodoo, FUNC(voodoo_3_device::write_io)), offset, data, mem_mask);
}
uint64_t viper_state::voodoo3_r(offs_t offset, uint64_t mem_mask)
{
return read64be_with_32sle_device_handler(read32s_delegate(*m_voodoo, FUNC(voodoo_3_device::banshee_r)), offset, mem_mask);
return read64be_with_32sle_device_handler(read32s_delegate(*m_voodoo, FUNC(voodoo_3_device::read)), offset, mem_mask);
}
void viper_state::voodoo3_w(offs_t offset, uint64_t data, uint64_t mem_mask)
{
// printf("voodoo3_w: %08X%08X, %08X at %08X\n", (uint32_t)(data >> 32), (uint32_t)(data), offset, m_maincpu->pc());
write64be_with_32sle_device_handler(write32s_delegate(*m_voodoo, FUNC(voodoo_3_device::banshee_w)), offset, data, mem_mask);
write64be_with_32sle_device_handler(write32s_delegate(*m_voodoo, FUNC(voodoo_3_device::write)), offset, data, mem_mask);
}
uint64_t viper_state::voodoo3_lfb_r(offs_t offset, uint64_t mem_mask)
{
return read64be_with_32smle_device_handler(read32sm_delegate(*m_voodoo, FUNC(voodoo_3_device::banshee_fb_r)), offset, mem_mask);
return read64be_with_32sle_device_handler(read32s_delegate(*m_voodoo, FUNC(voodoo_3_device::read_lfb)), offset, mem_mask);
}
void viper_state::voodoo3_lfb_w(offs_t offset, uint64_t data, uint64_t mem_mask)
{
// printf("voodoo3_lfb_w: %08X%08X, %08X at %08X\n", (uint32_t)(data >> 32), (uint32_t)(data), offset, m_maincpu->pc());
write64be_with_32sle_device_handler(write32s_delegate(*m_voodoo, FUNC(voodoo_3_device::banshee_fb_w)), offset, data, mem_mask);
write64be_with_32sle_device_handler(write32s_delegate(*m_voodoo, FUNC(voodoo_3_device::write_lfb)), offset, data, mem_mask);
}
@ -2457,10 +2414,11 @@ void viper_state::viper(machine_config &config)
ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, true);
VOODOO_3(config, m_voodoo, STD_VOODOO_3_CLOCK);
VOODOO_3(config, m_voodoo, voodoo_3_device::NOMINAL_CLOCK);
m_voodoo->set_fbmem(8);
m_voodoo->set_screen_tag("screen");
m_voodoo->set_cpu_tag("maincpu");
m_voodoo->set_screen("screen");
m_voodoo->set_cpu("maincpu");
m_voodoo->set_status_cycles(1000); // optimization to consume extra cycles when polling status
m_voodoo->vblank_callback().set(FUNC(viper_state::voodoo_vblank));
m_voodoo->pciint_callback().set(FUNC(viper_state::voodoo_pciint));

View File

@ -74,7 +74,7 @@ private:
float z0;
};
class gaelco3d_renderer : public poly_manager<float, gaelco3d_object_data, 1, 2000>
class gaelco3d_renderer : public poly_manager<float, gaelco3d_object_data, 1>
{
public:
gaelco3d_renderer(gaelco3d_state &state);

View File

@ -23,7 +23,7 @@ struct gs_poly_data
bitmap_ind16* texbase;
};
class galastrm_renderer : public poly_manager<float, gs_poly_data, 2, 10000>
class galastrm_renderer : public poly_manager<float, gs_poly_data, 2>
{
public:
galastrm_renderer(galastrm_state &state);

View File

@ -113,7 +113,7 @@ struct hng64_poly_data
class hng64_state;
class hng64_poly_renderer : public poly_manager<float, hng64_poly_data, 7, HNG64_MAX_POLYGONS>
class hng64_poly_renderer : public poly_manager<float, hng64_poly_data, 7>
{
public:
hng64_poly_renderer(hng64_state& state);

View File

@ -28,7 +28,7 @@ struct midvunit_object_data
class midvunit_state;
class midvunit_renderer : public poly_manager<float, midvunit_object_data, 2, 4000>
class midvunit_renderer : public poly_manager<float, midvunit_object_data, 2>
{
public:
midvunit_renderer(midvunit_state &state);

View File

@ -42,7 +42,7 @@ struct mz_poly_extra_data
class midzeus_state;
class midzeus_renderer : public poly_manager<float, mz_poly_extra_data, 4, 10000>
class midzeus_renderer : public poly_manager<float, mz_poly_extra_data, 4>
{
public:
midzeus_renderer(midzeus_state &state);

View File

@ -629,7 +629,7 @@ static inline u16 get_texel( u32 base_x, u32 base_y, int x, int y, u32 *sheet )
}
// 0x10000 = size of the tri_sorted_list array
class model2_renderer : public poly_manager<float, m2_poly_extra_data, 4, 0x10000>
class model2_renderer : public poly_manager<float, m2_poly_extra_data, 4>
{
public:
typedef void (model2_renderer::*scanline_render_func)(int32_t scanline, const extent_t& extent, const m2_poly_extra_data& object, int threadid);
@ -638,7 +638,7 @@ public:
using triangle = model2_state::triangle;
model2_renderer(model2_state& state)
: poly_manager<float, m2_poly_extra_data, 4, 0x10000>(state.machine())
: poly_manager<float, m2_poly_extra_data, 4>(state.machine())
, m_state(state)
, m_destmap(512, 512)
{

View File

@ -78,11 +78,11 @@ struct model3_polydata
class model3_state;
class model3_renderer : public poly_manager<float, model3_polydata, 6, 50000>
class model3_renderer : public poly_manager<float, model3_polydata, 6>
{
public:
model3_renderer(running_machine &machine, int width, int height)
: poly_manager<float, model3_polydata, 6, 50000>(machine)
: poly_manager<float, model3_polydata, 6>(machine)
{
m_fb = std::make_unique<bitmap_rgb32>(width, height);
m_zb = std::make_unique<bitmap_ind32>(width, height);

View File

@ -137,7 +137,7 @@ struct namcos22_object_data
class namcos22_state;
class namcos22_renderer : public poly_manager<float, namcos22_object_data, 4, 8000>
class namcos22_renderer : public poly_manager<float, namcos22_object_data, 4>
{
public:
namcos22_renderer(namcos22_state &state);

View File

@ -348,10 +348,10 @@ objects have methods used to do drawing
most methods set parameters, others actually draw
*/
class nv2a_rasterizer : public poly_manager<double, nvidia_object_data, 26, 8192>
class nv2a_rasterizer : public poly_manager<double, nvidia_object_data, 26>
{
public:
nv2a_rasterizer(running_machine &machine) : poly_manager<double, nvidia_object_data, 26, 8192>(machine)
nv2a_rasterizer(running_machine &machine) : poly_manager<double, nvidia_object_data, 26>(machine)
{
}
};

View File

@ -436,7 +436,7 @@ void konppc_device::nwk_fifo_0_w(offs_t offset, uint32_t data, uint32_t mem_mask
}
else
{
m_voodoo[0]->voodoo_w(offset ^ 0x80000, data, mem_mask);
m_voodoo[0]->write(offset ^ 0x80000, data, mem_mask);
}
}
@ -453,7 +453,7 @@ void konppc_device::nwk_fifo_1_w(offs_t offset, uint32_t data, uint32_t mem_mask
}
else
{
m_voodoo[1]->voodoo_w(offset ^ 0x80000, data, mem_mask);
m_voodoo[1]->write(offset ^ 0x80000, data, mem_mask);
}
}
@ -465,7 +465,7 @@ uint32_t konppc_device::nwk_voodoo_0_r(offs_t offset)
}
else
{
return m_voodoo[0]->voodoo_r(offset);
return m_voodoo[0]->read(offset);
}
}
@ -477,7 +477,7 @@ uint32_t konppc_device::nwk_voodoo_1_r(offs_t offset)
}
else
{
return m_voodoo[1]->voodoo_r(offset);
return m_voodoo[1]->read(offset);
}
}
@ -494,7 +494,7 @@ void konppc_device::nwk_voodoo_0_w(offs_t offset, uint32_t data, uint32_t mem_ma
}
else
{
m_voodoo[0]->voodoo_w(offset, data, mem_mask);
m_voodoo[0]->write(offset, data, mem_mask);
}
}
@ -511,6 +511,6 @@ void konppc_device::nwk_voodoo_1_w(offs_t offset, uint32_t data, uint32_t mem_ma
}
else
{
m_voodoo[1]->voodoo_w(offset, data, mem_mask);
m_voodoo[1]->write(offset, data, mem_mask);
}
}

View File

@ -73,7 +73,7 @@ private:
// device finders
optional_device_array<adsp21062_device, 2> m_dsp;
optional_device_array<k033906_device, 2> m_k033906;
optional_device_array<voodoo_device, 2> m_voodoo;
optional_device_array<generic_voodoo_device, 2> m_voodoo;
// internal state
uint32_t dsp_comm_ppc[MAX_CG_BOARDS][2];

View File

@ -4,6 +4,7 @@
#include "emu.h"
#include "debugger.h"
#include "screen.h"
#include "cpu/mips/mips3.h"
#include "cpu/mips/mips3com.h"
#include "includes/n64.h"

View File

@ -13,6 +13,7 @@
#include "debugger.h"
#include "romload.h"
#include "screen.h"
#include <functional>

View File

@ -26,7 +26,7 @@
gaelco3d_state::gaelco3d_renderer::gaelco3d_renderer(gaelco3d_state &state)
: poly_manager<float, gaelco3d_object_data, 1, 2000>(state.machine()),
: poly_manager<float, gaelco3d_object_data, 1>(state.machine()),
m_state(state),
m_screenbits(state.m_screen->width(), state.m_screen->height()),
m_zbuffer(state.m_screen->width(), state.m_screen->height()),
@ -185,15 +185,15 @@ void gaelco3d_state::gaelco3d_renderer::render_poly(screen_device &screen, uint3
/* special case: no Z buffering and no perspective correction */
if (color != 0x7f00 && z0 < 0 && ooz_dx == 0 && ooz_dy == 0)
render_triangle_fan(visarea, render_delegate(&gaelco3d_renderer::render_noz_noperspective, this), 0, vertnum, &vert[0]);
render_triangle_fan<0>(visarea, render_delegate(&gaelco3d_renderer::render_noz_noperspective, this), vertnum, &vert[0]);
/* general case: non-alpha blended */
else if (color != 0x7f00)
render_triangle_fan(visarea, render_delegate(&gaelco3d_renderer::render_normal, this), 0, vertnum, &vert[0]);
render_triangle_fan<0>(visarea, render_delegate(&gaelco3d_renderer::render_normal, this), vertnum, &vert[0]);
/* color 0x7f seems to be hard-coded as a 50% alpha blend */
else
render_triangle_fan(visarea, render_delegate(&gaelco3d_renderer::render_alphablend, this), 0, vertnum, &vert[0]);
render_triangle_fan<0>(visarea, render_delegate(&gaelco3d_renderer::render_alphablend, this), vertnum, &vert[0]);
m_polygons += vertnum - 2;
}

View File

@ -8,7 +8,7 @@
galastrm_renderer::galastrm_renderer(galastrm_state& state)
: poly_manager<float, gs_poly_data, 2, 10000>(state.machine())
: poly_manager<float, gs_poly_data, 2>(state.machine())
, m_state(state)
, m_screenbits(state.m_screen->width(), state.m_screen->height())
{
@ -406,7 +406,7 @@ void galastrm_renderer::tc0610_rotate_draw(bitmap_ind16 &srcbitmap, const rectan
gs_poly_data& extra = object_data_alloc();
extra.texbase = &srcbitmap;
render_polygon<4>(clip, render_delegate(&galastrm_renderer::tc0610_draw_scanline, this), 2, vert);
render_polygon<4, 2>(clip, render_delegate(&galastrm_renderer::tc0610_draw_scanline, this), vert);
wait();
}

View File

@ -7,7 +7,7 @@
// Polygon rasterizer interface
hng64_poly_renderer::hng64_poly_renderer(hng64_state& state)
: poly_manager<float, hng64_poly_data, 7, HNG64_MAX_POLYGONS>(state.machine())
: poly_manager<float, hng64_poly_data, 7>(state.machine())
, m_state(state)
, m_colorBuffer3d(state.m_screen->visible_area().width(), state.m_screen->visible_area().height())
{
@ -1441,7 +1441,7 @@ void hng64_poly_renderer::drawShaded(polygon *p)
pVert[2].p[2] = color.g();
pVert[2].p[3] = color.b();
render_triangle(visibleArea, render_delegate(&hng64_poly_renderer::render_flat_scanline, this), 4, pVert[0], pVert[1], pVert[2]);
render_triangle<4>(visibleArea, render_delegate(&hng64_poly_renderer::render_flat_scanline, this), pVert[0], pVert[1], pVert[2]);
}
}
else
@ -1497,7 +1497,7 @@ void hng64_poly_renderer::drawShaded(polygon *p)
pVert[2].p[5] = pvjp1.texCoords[0];
pVert[2].p[6] = pvjp1.texCoords[1];
render_triangle(visibleArea, render_delegate(&hng64_poly_renderer::render_texture_scanline, this), 7, pVert[0], pVert[1], pVert[2]);
render_triangle<7>(visibleArea, render_delegate(&hng64_poly_renderer::render_texture_scanline, this), pVert[0], pVert[1], pVert[2]);
}
}
}

View File

@ -2,6 +2,7 @@
// copyright-holders:David Haywood
#include "emu.h"
#include "k001005.h"
#include "screen.h"
/*****************************************************************************/
/* Konami K001005 Polygon Renderer (KS10071) */
@ -24,7 +25,7 @@
k001005_renderer::k001005_renderer(device_t &parent, screen_device &screen, device_t *k001006)
: poly_manager<float, k001005_polydata, 10, 50000>(screen)
: poly_manager<float, k001005_polydata, 10>(screen.machine())
{
m_k001006 = k001006;
@ -293,7 +294,7 @@ void k001005_renderer::render_polygons()
vertex3 = &v[2];
}
render_triangle(m_cliprect, rd_scan_tex, 6, *vertex1, *vertex2, *vertex3);
render_triangle<6>(m_cliprect, rd_scan_tex, *vertex1, *vertex2, *vertex3);
memcpy(&m_prev_v[1], vertex1, sizeof(vertex_t));
memcpy(&m_prev_v[2], vertex2, sizeof(vertex_t));
@ -330,8 +331,8 @@ void k001005_renderer::render_polygons()
vertex4 = &v[3];
}
render_triangle(m_cliprect, rd_scan_tex, 6, *vertex1, *vertex2, *vertex3);
render_triangle(m_cliprect, rd_scan_tex, 6, *vertex3, *vertex4, *vertex1);
render_triangle<6>(m_cliprect, rd_scan_tex, *vertex1, *vertex2, *vertex3);
render_triangle<6>(m_cliprect, rd_scan_tex, *vertex3, *vertex4, *vertex1);
memcpy(&m_prev_v[0], vertex1, sizeof(vertex_t));
memcpy(&m_prev_v[1], vertex2, sizeof(vertex_t));
@ -418,7 +419,7 @@ void k001005_renderer::render_polygons()
if (new_verts == 1)
{
render_triangle(m_cliprect, rd_scan_tex, 6, v[0], v[1], v[2]);
render_triangle<6>(m_cliprect, rd_scan_tex, v[0], v[1], v[2]);
memcpy(&m_prev_v[1], &v[0], sizeof(vertex_t));
memcpy(&m_prev_v[2], &v[1], sizeof(vertex_t));
@ -426,8 +427,8 @@ void k001005_renderer::render_polygons()
}
else if (new_verts == 2)
{
render_triangle(m_cliprect, rd_scan_tex, 6, v[0], v[1], v[2]);
render_triangle(m_cliprect, rd_scan_tex, 6, v[2], v[3], v[0]);
render_triangle<6>(m_cliprect, rd_scan_tex, v[0], v[1], v[2]);
render_triangle<6>(m_cliprect, rd_scan_tex, v[2], v[3], v[0]);
memcpy(&m_prev_v[0], &v[0], sizeof(vertex_t));
memcpy(&m_prev_v[1], &v[1], sizeof(vertex_t));
@ -515,7 +516,7 @@ void k001005_renderer::render_polygons()
vertex3 = &v[2];
}
render_triangle(m_cliprect, rd_scan, 3, *vertex1, *vertex2, *vertex3);
render_triangle<3>(m_cliprect, rd_scan, *vertex1, *vertex2, *vertex3);
memcpy(&m_prev_v[1], vertex1, sizeof(vertex_t));
memcpy(&m_prev_v[2], vertex2, sizeof(vertex_t));
@ -552,8 +553,8 @@ void k001005_renderer::render_polygons()
vertex4 = &v[3];
}
render_triangle(m_cliprect, rd_scan, 3, *vertex1, *vertex2, *vertex3);
render_triangle(m_cliprect, rd_scan, 3, *vertex3, *vertex4, *vertex1);
render_triangle<3>(m_cliprect, rd_scan, *vertex1, *vertex2, *vertex3);
render_triangle<3>(m_cliprect, rd_scan, *vertex3, *vertex4, *vertex1);
memcpy(&m_prev_v[0], vertex1, sizeof(vertex_t));
memcpy(&m_prev_v[1], vertex2, sizeof(vertex_t));
@ -622,7 +623,7 @@ void k001005_renderer::render_polygons()
if (new_verts == 1)
{
render_triangle(m_cliprect, rd_scan, 3, v[0], v[1], v[2]);
render_triangle<3>(m_cliprect, rd_scan, v[0], v[1], v[2]);
memcpy(&m_prev_v[1], &v[0], sizeof(vertex_t));
memcpy(&m_prev_v[2], &v[1], sizeof(vertex_t));
@ -630,8 +631,8 @@ void k001005_renderer::render_polygons()
}
else if (new_verts == 2)
{
render_triangle(m_cliprect, rd_scan, 3, v[0], v[1], v[2]);
render_triangle(m_cliprect, rd_scan, 3, v[2], v[3], v[0]);
render_triangle<3>(m_cliprect, rd_scan, v[0], v[1], v[2]);
render_triangle<3>(m_cliprect, rd_scan, v[2], v[3], v[0]);
memcpy(&m_prev_v[0], &v[0], sizeof(vertex_t));
memcpy(&m_prev_v[1], &v[1], sizeof(vertex_t));
@ -684,12 +685,12 @@ void k001005_renderer::render_polygons()
if (poly_type == 0)
{
render_triangle(m_cliprect, rd_scan_2d, 0, v[0], v[1], v[2]);
render_triangle<0>(m_cliprect, rd_scan_2d, v[0], v[1], v[2]);
}
else
{
render_triangle(m_cliprect, rd_scan_2d, 0, v[0], v[1], v[2]);
render_triangle(m_cliprect, rd_scan_2d, 0, v[2], v[3], v[0]);
render_triangle<0>(m_cliprect, rd_scan_2d, v[0], v[1], v[2]);
render_triangle<0>(m_cliprect, rd_scan_2d, v[2], v[3], v[0]);
}
}
else if (cmd == 0x8000008b)
@ -773,12 +774,12 @@ void k001005_renderer::render_polygons()
if (poly_type == 0)
{
render_triangle(m_cliprect, rd_scan_tex2d, 5, v[0], v[1], v[2]);
render_triangle<5>(m_cliprect, rd_scan_tex2d, v[0], v[1], v[2]);
}
else
{
render_triangle(m_cliprect, rd_scan_tex2d, 5, v[0], v[1], v[2]);
render_triangle(m_cliprect, rd_scan_tex2d, 5, v[2], v[3], v[0]);
render_triangle<5>(m_cliprect, rd_scan_tex2d, v[0], v[1], v[2]);
render_triangle<5>(m_cliprect, rd_scan_tex2d, v[2], v[3], v[0]);
}
}
else if (cmd == 0x80000106 || cmd == 0x80000121 || cmd == 0x80000126)
@ -826,12 +827,12 @@ void k001005_renderer::render_polygons()
if (poly_type == 0)
{
render_triangle(m_cliprect, rd_scan_gour_blend, 6, v[0], v[1], v[2]);
render_triangle<6>(m_cliprect, rd_scan_gour_blend, v[0], v[1], v[2]);
}
else
{
render_triangle(m_cliprect, rd_scan_gour_blend, 6, v[0], v[1], v[2]);
render_triangle(m_cliprect, rd_scan_gour_blend, 6, v[2], v[3], v[0]);
render_triangle<6>(m_cliprect, rd_scan_gour_blend, v[0], v[1], v[2]);
render_triangle<6>(m_cliprect, rd_scan_gour_blend, v[2], v[3], v[0]);
}
// TODO: can this poly type form strips?
@ -945,7 +946,7 @@ void k001005_renderer::render_polygons()
vertex3 = &v[2];
}
render_triangle(m_cliprect, rd_scan_tex_gouraud, 10, *vertex1, *vertex2, *vertex3);
render_triangle<10>(m_cliprect, rd_scan_tex_gouraud, *vertex1, *vertex2, *vertex3);
memcpy(&m_prev_v[1], vertex1, sizeof(vertex_t));
memcpy(&m_prev_v[2], vertex2, sizeof(vertex_t));
@ -982,8 +983,8 @@ void k001005_renderer::render_polygons()
vertex4 = &v[3];
}
render_triangle(m_cliprect, rd_scan_tex_gouraud, 10, *vertex1, *vertex2, *vertex3);
render_triangle(m_cliprect, rd_scan_tex_gouraud, 10, *vertex3, *vertex4, *vertex1);
render_triangle<10>(m_cliprect, rd_scan_tex_gouraud, *vertex1, *vertex2, *vertex3);
render_triangle<10>(m_cliprect, rd_scan_tex_gouraud, *vertex3, *vertex4, *vertex1);
memcpy(&m_prev_v[0], vertex1, sizeof(vertex_t));
memcpy(&m_prev_v[1], vertex2, sizeof(vertex_t));
@ -1313,7 +1314,7 @@ void k001005_renderer::draw_scanline_gouraud_blend(int32_t scanline, const exten
void k001005_renderer::draw_scanline_tex_gouraud(int32_t scanline, const extent_t& extent, const k001005_polydata& extradata, int threadid)
{
{
k001006_device* k001006 = downcast<k001006_device*>(m_k001006);
int tex_page = extradata.texture_page * 0x40000;

View File

@ -42,7 +42,7 @@ enum k001005_param
};
class k001005_renderer : public poly_manager<float, k001005_polydata, 10, 50000>
class k001005_renderer : public poly_manager<float, k001005_polydata, 10>
{
public:
k001005_renderer(device_t &parent, screen_device &screen, device_t *k001006);

View File

@ -26,7 +26,7 @@
midvunit_renderer::midvunit_renderer(midvunit_state &state)
: poly_manager<float, midvunit_object_data, 2, 4000>(state.machine()),
: poly_manager<float, midvunit_object_data, 2>(state.machine()),
m_state(state) { }
@ -365,7 +365,10 @@ void midvunit_renderer::process_dma_queue()
objectdata.dither = ((m_state.m_dma_data[0] & 0x2000) != 0);
/* render as a quad */
render_polygon<4>(m_state.m_screen->visible_area(), callback, textured ? 2 : 0, vert);
if (textured)
render_polygon<4, 2>(m_state.m_screen->visible_area(), callback, vert);
else
render_polygon<4, 0>(m_state.m_screen->visible_area(), callback, vert);
}

View File

@ -200,7 +200,7 @@ static inline uint8_t get_texel_alt_8bit(const void *base, int y, int x, int wid
*************************************/
midzeus_renderer::midzeus_renderer(midzeus_state &state)
: poly_manager<float, mz_poly_extra_data, 4, 10000>(state.machine()),
: poly_manager<float, mz_poly_extra_data, 4>(state.machine()),
m_state(state)
{}
@ -1131,7 +1131,7 @@ void midzeus_renderer::zeus_draw_quad(int long_fmt, const uint32_t *databuffer,
}
}
numverts = m_state.m_poly->zclip_if_less(4, &vert[0], &clipvert[0], 4, 512.0f);
numverts = m_state.m_poly->zclip_if_less<4>(4, &vert[0], &clipvert[0], 512.0f);
if (numverts < 3)
return;
@ -1197,15 +1197,14 @@ void midzeus_renderer::zeus_draw_quad(int long_fmt, const uint32_t *databuffer,
// Note: Before being upgraded to the new polygon rasterizing code, this function call was
// a poly_render_quad_fan. It appears as though the new code defaults to a fan if
// the template argument is 4, but keep an eye out for missing quads.
m_state.m_poly->render_polygon<4>(m_state.m_zeus_cliprect,
m_state.m_poly->render_polygon<4, 4>(m_state.m_zeus_cliprect,
render_delegate(&midzeus_renderer::render_poly, this),
4,
clipvert);
}
void midzeus_renderer::zeus_draw_debug_quad(const rectangle& rect, const vertex_t *vert)
{
m_state.m_poly->render_polygon<4>(rect, render_delegate(&midzeus_renderer::render_poly_solid_fixedz, this), 0, vert);
m_state.m_poly->render_polygon<4, 0>(rect, render_delegate(&midzeus_renderer::render_poly_solid_fixedz, this), vert);
}

View File

@ -811,28 +811,28 @@ void model2_renderer::model2_3d_render(triangle *tri, const rectangle &cliprect)
// I was unable to make it work when converting to the new polygon rasterizer interface.
switch (renderer)
{
case 0: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_0, this), 3, tri->v[0], tri->v[1], tri->v[2]); break;
case 1: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_1, this), 3, tri->v[0], tri->v[1], tri->v[2]); break;
case 2: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_2, this), 3, tri->v[0], tri->v[1], tri->v[2]); break;
case 3: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_3, this), 3, tri->v[0], tri->v[1], tri->v[2]); break;
case 4: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_4, this), 3, tri->v[0], tri->v[1], tri->v[2]); break;
case 5: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_5, this), 3, tri->v[0], tri->v[1], tri->v[2]); break;
case 6: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_6, this), 3, tri->v[0], tri->v[1], tri->v[2]); break;
case 7: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_7, this), 3, tri->v[0], tri->v[1], tri->v[2]); break;
case 0: render_triangle<3>(vp, render_delegate(&model2_renderer::model2_3d_render_0, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 1: render_triangle<3>(vp, render_delegate(&model2_renderer::model2_3d_render_1, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 2: render_triangle<3>(vp, render_delegate(&model2_renderer::model2_3d_render_2, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 3: render_triangle<3>(vp, render_delegate(&model2_renderer::model2_3d_render_3, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 4: render_triangle<3>(vp, render_delegate(&model2_renderer::model2_3d_render_4, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 5: render_triangle<3>(vp, render_delegate(&model2_renderer::model2_3d_render_5, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 6: render_triangle<3>(vp, render_delegate(&model2_renderer::model2_3d_render_6, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 7: render_triangle<3>(vp, render_delegate(&model2_renderer::model2_3d_render_7, this), tri->v[0], tri->v[1], tri->v[2]); break;
}
}
else
{
switch (renderer)
{
case 0: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_0, this), 0, tri->v[0], tri->v[1], tri->v[2]); break;
case 1: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_1, this), 0, tri->v[0], tri->v[1], tri->v[2]); break;
case 2: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_2, this), 0, tri->v[0], tri->v[1], tri->v[2]); break;
case 3: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_3, this), 0, tri->v[0], tri->v[1], tri->v[2]); break;
case 4: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_4, this), 0, tri->v[0], tri->v[1], tri->v[2]); break;
case 5: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_5, this), 0, tri->v[0], tri->v[1], tri->v[2]); break;
case 6: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_6, this), 0, tri->v[0], tri->v[1], tri->v[2]); break;
case 7: render_triangle(vp, render_delegate(&model2_renderer::model2_3d_render_7, this), 0, tri->v[0], tri->v[1], tri->v[2]); break;
case 0: render_triangle<0>(vp, render_delegate(&model2_renderer::model2_3d_render_0, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 1: render_triangle<0>(vp, render_delegate(&model2_renderer::model2_3d_render_1, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 2: render_triangle<0>(vp, render_delegate(&model2_renderer::model2_3d_render_2, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 3: render_triangle<0>(vp, render_delegate(&model2_renderer::model2_3d_render_3, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 4: render_triangle<0>(vp, render_delegate(&model2_renderer::model2_3d_render_4, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 5: render_triangle<0>(vp, render_delegate(&model2_renderer::model2_3d_render_5, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 6: render_triangle<0>(vp, render_delegate(&model2_renderer::model2_3d_render_6, this), tri->v[0], tri->v[1], tri->v[2]); break;
case 7: render_triangle<0>(vp, render_delegate(&model2_renderer::model2_3d_render_7, this), tri->v[0], tri->v[1], tri->v[2]); break;
}
}
}

View File

@ -2063,14 +2063,14 @@ void model3_renderer::draw_opaque_triangles(const m3_triangle* tris, int num_tri
if (tri->param & TRI_PARAM_ALPHA_TEST)
{
render_triangle(cliprect, render_delegate(&model3_renderer::draw_scanline_tex_contour, this), 5, v[0], v[1], v[2]);
render_triangle<5>(cliprect, render_delegate(&model3_renderer::draw_scanline_tex_contour, this), v[0], v[1], v[2]);
}
else
{
if (tri->param & TRI_PARAM_COLOR_MOD)
render_triangle(cliprect, render_delegate(&model3_renderer::draw_scanline_tex_colormod, this), 5, v[0], v[1], v[2]);
render_triangle<5>(cliprect, render_delegate(&model3_renderer::draw_scanline_tex_colormod, this), v[0], v[1], v[2]);
else
render_triangle(cliprect, render_delegate(&model3_renderer::draw_scanline_tex, this), 5, v[0], v[1], v[2]);
render_triangle<5>(cliprect, render_delegate(&model3_renderer::draw_scanline_tex, this), v[0], v[1], v[2]);
}
}
else
@ -2086,7 +2086,7 @@ void model3_renderer::draw_opaque_triangles(const m3_triangle* tris, int num_tri
model3_polydata &extra = object_data_alloc();
extra.color = tri->color;
render_triangle(cliprect, render_delegate(&model3_renderer::draw_scanline_solid, this), 2, v[0], v[1], v[2]);
render_triangle<2>(cliprect, render_delegate(&model3_renderer::draw_scanline_solid, this), v[0], v[1], v[2]);
}
}
}
@ -2125,7 +2125,7 @@ void model3_renderer::draw_alpha_triangles(const m3_triangle* tris, int num_tris
extra.transparency = tri->transparency;
extra.texture_param = tri->param;
render_triangle(cliprect, render_delegate(&model3_renderer::draw_scanline_tex_alpha, this), 5, v[0], v[1], v[2]);
render_triangle<5>(cliprect, render_delegate(&model3_renderer::draw_scanline_tex_alpha, this), v[0], v[1], v[2]);
}
else
{
@ -2141,7 +2141,7 @@ void model3_renderer::draw_alpha_triangles(const m3_triangle* tris, int num_tris
extra.color = tri->color;
extra.transparency = tri->transparency;
render_triangle(cliprect, render_delegate(&model3_renderer::draw_scanline_solid_trans, this), 2, v[0], v[1], v[2]);
render_triangle<2>(cliprect, render_delegate(&model3_renderer::draw_scanline_solid_trans, this), v[0], v[1], v[2]);
}
}
}

View File

@ -28,6 +28,7 @@ TODO:
#include "includes/n64.h"
#include "video/rdpblend.h"
#include "video/rdptpipe.h"
#include "screen.h"
#include <algorithm>
@ -3140,7 +3141,7 @@ void n64_rdp::process_command_list()
/*****************************************************************************/
n64_rdp::n64_rdp(n64_state &state, uint32_t* rdram, uint32_t* dmem) : poly_manager<uint32_t, rdp_poly_state, 8, 32000>(state.machine())
n64_rdp::n64_rdp(n64_state &state, uint32_t* rdram, uint32_t* dmem) : poly_manager<uint32_t, rdp_poly_state, 8>(state.machine())
{
ignore = false;
dolog = false;

View File

@ -131,7 +131,7 @@ typedef void (*rdp_command_t)(uint64_t w1);
class n64_state;
class n64_rdp : public poly_manager<uint32_t, rdp_poly_state, 8, 32000>
class n64_rdp : public poly_manager<uint32_t, rdp_poly_state, 8>
{
public:
n64_rdp(n64_state &state, uint32_t* rdram, uint32_t* dmem);

View File

@ -12,7 +12,7 @@
// poly constructor
namcos22_renderer::namcos22_renderer(namcos22_state &state)
: poly_manager<float, namcos22_object_data, 4, 8000>(state.machine()),
: poly_manager<float, namcos22_object_data, 4>(state.machine()),
m_state(state)
{
init();
@ -260,7 +260,7 @@ void namcos22_renderer::poly3d_drawquad(screen_device &screen, bitmap_rgb32 &bit
v[vertnum].p[3] = node->data.quad.v[vertnum].bri;
}
clipverts = zclip_if_less(4, v, clipv, 4, 10.0f);
clipverts = zclip_if_less<4>(4, v, clipv, 10.0f);
assert(clipverts <= std::size(clipv));
if (clipverts < 3)
return;
@ -390,7 +390,7 @@ void namcos22_renderer::poly3d_drawquad(screen_device &screen, bitmap_rgb32 &bit
}
}
render_triangle_fan(m_cliprect, render_delegate(&namcos22_renderer::renderscanline_uvi_full, this), 4, clipverts, clipv);
render_triangle_fan<4>(m_cliprect, render_delegate(&namcos22_renderer::renderscanline_uvi_full, this), clipverts, clipv);
}
@ -468,7 +468,7 @@ void namcos22_renderer::poly3d_drawsprite(
extra.fogcolor.set(0, m_state.m_fog_r, m_state.m_fog_g, m_state.m_fog_b);
}
render_triangle_fan(m_cliprect, render_delegate(&namcos22_renderer::renderscanline_sprite, this), 2, 4, vert);
render_triangle_fan<2>(m_cliprect, render_delegate(&namcos22_renderer::renderscanline_sprite, this), 4, vert);
}
}

View File

@ -5,13 +5,14 @@
#include "emu.h"
#include "tc0780fpa.h"
#include "screen.h"
#define POLY_FIFO_SIZE 32
tc0780fpa_renderer::tc0780fpa_renderer(device_t &parent, screen_device &screen, const uint8_t *texture_ram)
: poly_manager<float, tc0780fpa_polydata, 6, 10000>(screen)
: poly_manager<float, tc0780fpa_polydata, 6>(screen.machine())
{
int width = screen.width();
int height = screen.height();
@ -220,11 +221,11 @@ void tc0780fpa_renderer::render(uint16_t *polygon_fifo, int length)
vert[1].p[1] == vert[2].p[1])
{
// optimization: all colours the same -> render solid
render_triangle(m_cliprect, render_delegate(&tc0780fpa_renderer::render_solid_scan, this), 2, vert[0], vert[1], vert[2]);
render_triangle<2>(m_cliprect, render_delegate(&tc0780fpa_renderer::render_solid_scan, this), vert[0], vert[1], vert[2]);
}
else
{
render_triangle(m_cliprect, render_delegate(&tc0780fpa_renderer::render_shade_scan, this), 2, vert[0], vert[1], vert[2]);
render_triangle<2>(m_cliprect, render_delegate(&tc0780fpa_renderer::render_shade_scan, this), vert[0], vert[1], vert[2]);
}
}
break;
@ -275,7 +276,7 @@ void tc0780fpa_renderer::render(uint16_t *polygon_fifo, int length)
if (vert[0].p[0] < 0x8000 && vert[1].p[0] < 0x8000 && vert[2].p[0] < 0x8000)
{
render_triangle(m_cliprect, render_delegate(&tc0780fpa_renderer::render_texture_scan, this), 4, vert[0], vert[1], vert[2]);
render_triangle<4>(m_cliprect, render_delegate(&tc0780fpa_renderer::render_texture_scan, this), vert[0], vert[1], vert[2]);
}
break;
}
@ -316,11 +317,11 @@ void tc0780fpa_renderer::render(uint16_t *polygon_fifo, int length)
vert[2].p[1] == vert[3].p[1])
{
// optimization: all colours the same -> render solid
render_polygon<4>(m_cliprect, render_delegate(&tc0780fpa_renderer::render_solid_scan, this), 2, vert);
render_polygon<4, 2>(m_cliprect, render_delegate(&tc0780fpa_renderer::render_solid_scan, this), vert);
}
else
{
render_polygon<4>(m_cliprect, render_delegate(&tc0780fpa_renderer::render_shade_scan, this), 2, vert);
render_polygon<4, 2>(m_cliprect, render_delegate(&tc0780fpa_renderer::render_shade_scan, this), vert);
}
}
break;
@ -377,7 +378,7 @@ void tc0780fpa_renderer::render(uint16_t *polygon_fifo, int length)
if (vert[0].p[0] < 0x8000 && vert[1].p[0] < 0x8000 && vert[2].p[0] < 0x8000 && vert[3].p[0] < 0x8000)
{
render_polygon<4>(m_cliprect, render_delegate(&tc0780fpa_renderer::render_texture_scan, this), 4, vert);
render_polygon<4, 4>(m_cliprect, render_delegate(&tc0780fpa_renderer::render_texture_scan, this), vert);
}
break;
}

View File

@ -18,7 +18,7 @@ struct tc0780fpa_polydata
};
class tc0780fpa_renderer : public poly_manager<float, tc0780fpa_polydata, 6, 10000>
class tc0780fpa_renderer : public poly_manager<float, tc0780fpa_polydata, 6>
{
public:
tc0780fpa_renderer(device_t &parent, screen_device &screen, const uint8_t *texture_ram);

View File

@ -2792,7 +2792,7 @@ uint32_t nv2a_renderer::render_triangle_culling(const rectangle &cliprect, nv2av
NV2A_GL_CULL_FACE face = NV2A_GL_CULL_FACE::FRONT;
if (backface_culling_enabled == false)
return rasterizer.render_triangle(cliprect, render_spans_callback, (int)VERTEX_PARAMETER::ALL, _v1, _v2, _v3);
return rasterizer.render_triangle<int(VERTEX_PARAMETER::ALL)>(cliprect, render_spans_callback, _v1, _v2, _v3);
if (backface_culling_culled == NV2A_GL_CULL_FACE::FRONT_AND_BACK)
{
triangles_bfculled++;
@ -2818,10 +2818,10 @@ uint32_t nv2a_renderer::render_triangle_culling(const rectangle &cliprect, nv2av
}
if (face == NV2A_GL_CULL_FACE::FRONT)
if (backface_culling_culled == NV2A_GL_CULL_FACE::BACK)
return rasterizer.render_triangle(cliprect, render_spans_callback, (int)VERTEX_PARAMETER::ALL, _v1, _v2, _v3);
return rasterizer.render_triangle<int(VERTEX_PARAMETER::ALL)>(cliprect, render_spans_callback, _v1, _v2, _v3);
if (face == NV2A_GL_CULL_FACE::BACK)
if (backface_culling_culled == NV2A_GL_CULL_FACE::FRONT)
return rasterizer.render_triangle(cliprect, render_spans_callback, (int)VERTEX_PARAMETER::ALL, _v1, _v2, _v3);
return rasterizer.render_triangle<int(VERTEX_PARAMETER::ALL)>(cliprect, render_spans_callback, _v1, _v2, _v3);
triangles_bfculled++;
return 0;
}

View File

@ -139,7 +139,13 @@ void osd_vprintf_debug(util::format_argument_pack<std::ostream> const &args)
osd_ticks_t osd_ticks()
{
#ifdef WIN32
LARGE_INTEGER val;
QueryPerformanceCounter(&val);
return val.QuadPart;
#else
return std::chrono::high_resolution_clock::now().time_since_epoch().count();
#endif
}
@ -149,7 +155,13 @@ osd_ticks_t osd_ticks()
osd_ticks_t osd_ticks_per_second()
{
#ifdef WIN32
LARGE_INTEGER val;
QueryPerformanceFrequency(&val);
return val.QuadPart;
#else
return std::chrono::high_resolution_clock::period::den / std::chrono::high_resolution_clock::period::num;
#endif
}
//============================================================