mirror of
https://github.com/holub/mame
synced 2025-04-20 23:42:22 +03:00
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:
parent
e9a86fc9fe
commit
6ffc98289c
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
@ -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
1722
src/devices/video/voodoo_2.cpp
Normal file
1722
src/devices/video/voodoo_2.cpp
Normal file
File diff suppressed because it is too large
Load Diff
249
src/devices/video/voodoo_2.h
Normal file
249
src/devices/video/voodoo_2.h
Normal 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
|
1907
src/devices/video/voodoo_banshee.cpp
Normal file
1907
src/devices/video/voodoo_banshee.cpp
Normal file
File diff suppressed because it is too large
Load Diff
185
src/devices/video/voodoo_banshee.h
Normal file
185
src/devices/video/voodoo_banshee.h
Normal 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
|
@ -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);
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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 */
|
1436
src/devices/video/voodoo_regs.h
Normal file
1436
src/devices/video/voodoo_regs.h
Normal file
File diff suppressed because it is too large
Load Diff
2953
src/devices/video/voodoo_render.cpp
Normal file
2953
src/devices/video/voodoo_render.cpp
Normal file
File diff suppressed because it is too large
Load Diff
662
src/devices/video/voodoo_render.h
Normal file
662
src/devices/video/voodoo_render.h
Normal 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 ®s, 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 ®s, 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 ¶ms, 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
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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];
|
||||
|
@ -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"
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
#include "debugger.h"
|
||||
#include "romload.h"
|
||||
#include "screen.h"
|
||||
|
||||
#include <functional>
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
//============================================================
|
||||
|
Loading…
Reference in New Issue
Block a user