Merge pull request #3979 from snickerbockers/dc_namco_museum

powervr2.cpp: implement opaque polygons [snickerbockers]
This commit is contained in:
MooglyGuy 2018-09-09 12:55:24 +02:00 committed by GitHub
commit 19c30c67ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 135 additions and 64 deletions

View File

@ -1446,7 +1446,7 @@ WRITE32_MEMBER( powervr2_device::ta_list_init_w )
tafifo_pos=0;
tafifo_mask=7;
tafifo_vertexwords=8;
tafifo_listtype= -1;
tafifo_listtype= DISPLAY_LIST_NONE;
#if DEBUG_PVRTA
logerror("%s: list init ol=(%08x, %08x) isp=(%08x, %08x), alloc=%08x obp=%08x\n",
tag(), ta_ol_base, ta_ol_limit, ta_isp_base, ta_isp_limit, ta_alloc_ctrl, ta_next_opb_init);
@ -1492,7 +1492,9 @@ WRITE32_MEMBER( powervr2_device::ta_list_init_w )
grab[grabsel].busy=0;
grab[grabsel].valid=1;
grab[grabsel].verts_size=0;
grab[grabsel].strips_size=0;
for (int group = 0; group < DISPLAY_LIST_COUNT; group++) {
grab[grabsel].groups[group].strips_size=0;
}
g_profiler.stop();
}
@ -1547,7 +1549,7 @@ WRITE32_MEMBER( powervr2_device::ta_yuv_tex_cnt_w )
WRITE32_MEMBER( powervr2_device::ta_list_cont_w )
{
if(data & 0x80000000) {
tafifo_listtype= -1; // no list being received
tafifo_listtype= DISPLAY_LIST_NONE; // no list being received
listtype_used |= (1+4);
}
}
@ -1801,8 +1803,12 @@ void powervr2_device::process_ta_fifo()
// decide number of words per vertex
if (paratype == 7)
{
if ((global_paratype == 5) || (tafifo_listtype == 1) || (tafifo_listtype == 3))
if ((global_paratype == 5) ||
(tafifo_listtype == DISPLAY_LIST_OPAQUE_MOD) ||
(tafifo_listtype == DISPLAY_LIST_TRANS_MOD))
{
tafifo_vertexwords = 16;
}
if (tafifo_vertexwords == 16)
{
tafifo_mask = 15;
@ -1873,13 +1879,13 @@ void powervr2_device::process_ta_fifo()
//printf("%d %d\n",tafifo_listtype,screen().vpos());
switch (tafifo_listtype)
{
case 0: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_opaque_list_irq), this)); break;
case 1: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_opaque_modifier_volume_list_irq), this)); break;
case 2: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_translucent_list_irq), this)); break;
case 3: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_translucent_modifier_volume_list_irq), this)); break;
case 4: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_punch_through_list_irq), this)); break;
case DISPLAY_LIST_OPAQUE: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_opaque_list_irq), this)); break;
case DISPLAY_LIST_OPAQUE_MOD: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_opaque_modifier_volume_list_irq), this)); break;
case DISPLAY_LIST_TRANS: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_translucent_list_irq), this)); break;
case DISPLAY_LIST_TRANS_MOD: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_translucent_modifier_volume_list_irq), this)); break;
case DISPLAY_LIST_PUNCH_THROUGH: machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(powervr2_device::transfer_punch_through_list_irq), this)); break;
}
tafifo_listtype= -1; // no list being received
tafifo_listtype= DISPLAY_LIST_NONE; // no list being received
listtype_used |= (2+8);
}
else if (paratype == 1)
@ -1963,7 +1969,8 @@ void powervr2_device::process_ta_fifo()
}
if (paratype == 4)
{ // polygon or mv
if ((tafifo_listtype == 1) || (tafifo_listtype == 3))
if ((tafifo_listtype == DISPLAY_LIST_OPAQUE_MOD) ||
(tafifo_listtype == DISPLAY_LIST_TRANS_MOD))
{
#if DEBUG_PVRDLIST
osd_printf_verbose(" Modifier Volume\n");
@ -1986,7 +1993,13 @@ void powervr2_device::process_ta_fifo()
if (paratype == 7)
{ // vertex
if ((tafifo_listtype == 1) || (tafifo_listtype == 3))
if (tafifo_listtype < 0 || tafifo_listtype >= DISPLAY_LIST_COUNT) {
logerror("PowerVR2 unrecognized list type %d\n", tafifo_listtype);
return;
}
struct poly_group *grp = rd->groups + tafifo_listtype;
if ((tafifo_listtype == DISPLAY_LIST_OPAQUE_MOD) ||
(tafifo_listtype == DISPLAY_LIST_TRANS_MOD))
{
#if DEBUG_PVRDLIST
osd_printf_verbose(" Vertex modifier volume");
@ -2007,7 +2020,7 @@ void powervr2_device::process_ta_fifo()
#endif
if (texture == 1)
{
if (rd->verts_size <= 65530)
if (rd->verts_size <= (MAX_VERTS - 6) && grp->strips_size < MAX_STRIPS)
{
strip *ts;
vert *tv = &rd->verts[rd->verts_size];
@ -2040,7 +2053,7 @@ void powervr2_device::process_ta_fifo()
sizeof(tv[idx].o));
}
ts = &rd->strips[rd->strips_size++];
ts = &grp->strips[grp->strips_size++];
tex_get_info(&ts->ti);
ts->svert = rd->verts_size;
ts->evert = rd->verts_size + 3;
@ -2056,7 +2069,7 @@ void powervr2_device::process_ta_fifo()
osd_printf_verbose(" V(%f,%f,%f) T(%f,%f)", u2f(tafifo_buff[1]), u2f(tafifo_buff[2]), u2f(tafifo_buff[3]), u2f(tafifo_buff[4]), u2f(tafifo_buff[5]));
osd_printf_verbose("\n");
#endif
if (rd->verts_size <= 65530)
if (rd->verts_size <= (MAX_VERTS - 6))
{
float vert_offset_color[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
float vert_base_color[4];
@ -2121,16 +2134,17 @@ void powervr2_device::process_ta_fifo()
memcpy(tv->b, vert_base_color, sizeof(tv->b));
memcpy(tv->o, vert_offset_color, sizeof(tv->o));
if((!rd->strips_size) ||
rd->strips[rd->strips_size-1].evert != -1)
if(grp->strips_size < MAX_STRIPS &&
((!grp->strips_size) ||
grp->strips[grp->strips_size-1].evert != -1))
{
strip *ts = &rd->strips[rd->strips_size++];
strip *ts = &grp->strips[grp->strips_size++];
tex_get_info(&ts->ti);
ts->svert = rd->verts_size;
ts->evert = -1;
}
if(endofstrip)
rd->strips[rd->strips_size-1].evert = rd->verts_size;
grp->strips[grp->strips_size-1].evert = rd->verts_size;
rd->verts_size++;
}
}
@ -2347,7 +2361,7 @@ inline uint32_t powervr2_device::sample_textured(texinfo *ti, float u, float v,
return c;
}
template <powervr2_device::pix_sample_fn sample_fn>
template <powervr2_device::pix_sample_fn sample_fn, int group_no>
inline void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int y, float xl, float xr, float ul, float ur, float vl, float vr, float wl, float wr, float const bl_in[4], float const br_in[4], float const offl_in[4], float const offr_in[4])
{
int idx;
@ -2417,9 +2431,14 @@ inline void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int
uint32_t offset_color = float_argb_to_packed_argb(offl);
uint32_t base_color = float_argb_to_packed_argb(bl);
c = (this->*sample_fn)(ti, u, v, offset_color, base_color);
if(c & 0xff000000) {
if (group_no == DISPLAY_LIST_OPAQUE) {
*tdata = c;
*wbufline = wl;
*tdata = ti->blend(c, *tdata);
} else {
if(c & 0xff000000) {
*wbufline = wl;
*tdata = ti->blend(c, *tdata);
}
}
}
wbufline++;
@ -2436,7 +2455,7 @@ inline void powervr2_device::render_hline(bitmap_rgb32 &bitmap, texinfo *ti, int
}
}
template <powervr2_device::pix_sample_fn sample_fn>
template <powervr2_device::pix_sample_fn sample_fn, int group_no>
inline void powervr2_device::render_span(bitmap_rgb32 &bitmap, texinfo *ti,
float y0, float y1,
float xl, float xr,
@ -2515,7 +2534,7 @@ inline void powervr2_device::render_span(bitmap_rgb32 &bitmap, texinfo *ti,
}
while(yy0 < yy1) {
render_hline<sample_fn>(bitmap, ti, yy0, xl, xr, ul, ur, vl, vr, wl, wr, bl, br, offl, offr);
render_hline<sample_fn, group_no>(bitmap, ti, yy0, xl, xr, ul, ur, vl, vr, wl, wr, bl, br, offl, offr);
xl += dxldy;
xr += dxrdy;
@ -2567,7 +2586,7 @@ void powervr2_device::sort_vertices(const vert *v, int *i0, int *i1, int *i2)
}
template <powervr2_device::pix_sample_fn sample_fn>
template <powervr2_device::pix_sample_fn sample_fn, int group_no>
inline void powervr2_device::render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v0, const vert *v1, const vert *v2)
{
float dy01, dy02, dy12;
@ -2686,15 +2705,15 @@ inline void powervr2_device::render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti
return;
if(v1->x > v0->x)
render_span<sample_fn>(bitmap, ti, v1->y, v2->y, v0->x, v1->x, v0->u, v1->u, v0->v, v1->v, v0->w, v1->w, v0->b, v1->b, v0->o, v1->o, dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy, db02dy, db12dy, do02dy, do12dy);
render_span<sample_fn, group_no>(bitmap, ti, v1->y, v2->y, v0->x, v1->x, v0->u, v1->u, v0->v, v1->v, v0->w, v1->w, v0->b, v1->b, v0->o, v1->o, dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy, db02dy, db12dy, do02dy, do12dy);
else
render_span<sample_fn>(bitmap, ti, v1->y, v2->y, v1->x, v0->x, v1->u, v0->u, v1->v, v0->v, v1->w, v0->w, v1->b, v0->b, v1->o, v0->o, dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy, db12dy, db02dy, do12dy, do02dy);
render_span<sample_fn, group_no>(bitmap, ti, v1->y, v2->y, v1->x, v0->x, v1->u, v0->u, v1->v, v0->v, v1->w, v0->w, v1->b, v0->b, v1->o, v0->o, dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy, db12dy, db02dy, do12dy, do02dy);
} else if(!dy12) {
if(v2->x > v1->x)
render_span<sample_fn>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy, db01dy, db02dy, do01dy, do02dy);
render_span<sample_fn, group_no>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy, db01dy, db02dy, do01dy, do02dy);
else
render_span<sample_fn>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy, db02dy, db01dy, do02dy, do01dy);
render_span<sample_fn, group_no>(bitmap, ti, v0->y, v1->y, v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o, dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy, db02dy, db01dy, do02dy, do01dy);
} else {
float idk_b[4] = {
@ -2710,23 +2729,24 @@ inline void powervr2_device::render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti
v0->o[3] + do02dy[3] * dy01
};
if(dx01dy < dx02dy) {
render_span<sample_fn>(bitmap, ti, v0->y, v1->y,
render_span<sample_fn, group_no>(bitmap, ti, v0->y, v1->y,
v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o,
dx01dy, dx02dy, du01dy, du02dy, dv01dy, dv02dy, dw01dy, dw02dy, db01dy, db02dy, do01dy, do02dy);
render_span<sample_fn>(bitmap, ti, v1->y, v2->y,
render_span<sample_fn, group_no>(bitmap, ti, v1->y, v2->y,
v1->x, v0->x + dx02dy*dy01, v1->u, v0->u + du02dy*dy01, v1->v, v0->v + dv02dy*dy01, v1->w, v0->w + dw02dy*dy01, v1->b, idk_b, v1->o, idk_o,
dx12dy, dx02dy, du12dy, du02dy, dv12dy, dv02dy, dw12dy, dw02dy, db12dy, db02dy, do12dy, do02dy);
} else {
render_span<sample_fn>(bitmap, ti, v0->y, v1->y,
render_span<sample_fn, group_no>(bitmap, ti, v0->y, v1->y,
v0->x, v0->x, v0->u, v0->u, v0->v, v0->v, v0->w, v0->w, v0->b, v0->b, v0->o, v0->o,
dx02dy, dx01dy, du02dy, du01dy, dv02dy, dv01dy, dw02dy, dw01dy, db02dy, db01dy, do02dy, do01dy);
render_span<sample_fn>(bitmap, ti, v1->y, v2->y,
render_span<sample_fn, group_no>(bitmap, ti, v1->y, v2->y,
v0->x + dx02dy*dy01, v1->x, v0->u + du02dy*dy01, v1->u, v0->v + dv02dy*dy01, v1->v, v0->w + dw02dy*dy01, v1->w, idk_b, v1->b, idk_o, v1->o,
dx02dy, dx12dy, du02dy, du12dy, dv02dy, dv12dy, dw02dy, dw12dy, db02dy, db12dy, do02dy, do12dy);
}
}
}
template <int group_no>
void powervr2_device::render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v)
{
int i0, i1, i2;
@ -2740,16 +2760,16 @@ void powervr2_device::render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert *
if (bilinear) {
switch (ti->tsinstruction) {
case 0:
render_tri_sorted<&powervr2_device::sample_textured<0,true>>(bitmap, ti, v+i0, v+i1, v+i2);
render_tri_sorted<&powervr2_device::sample_textured<0,true>, group_no>(bitmap, ti, v+i0, v+i1, v+i2);
break;
case 1:
render_tri_sorted<&powervr2_device::sample_textured<1,true>>(bitmap, ti, v+i0, v+i1, v+i2);
render_tri_sorted<&powervr2_device::sample_textured<1,true>, group_no>(bitmap, ti, v+i0, v+i1, v+i2);
break;
case 2:
render_tri_sorted<&powervr2_device::sample_textured<2,true>>(bitmap, ti, v+i0, v+i1, v+i2);
render_tri_sorted<&powervr2_device::sample_textured<2,true>, group_no>(bitmap, ti, v+i0, v+i1, v+i2);
break;
case 3:
render_tri_sorted<&powervr2_device::sample_textured<3,true>>(bitmap, ti, v+i0, v+i1, v+i2);
render_tri_sorted<&powervr2_device::sample_textured<3,true>, group_no>(bitmap, ti, v+i0, v+i1, v+i2);
break;
default:
/*
@ -2757,21 +2777,21 @@ void powervr2_device::render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert *
* AND'd with 3
*/
logerror("%s - tsinstruction is 0x%08x\n", (unsigned)ti->tsinstruction);
render_tri_sorted<&powervr2_device::sample_nontextured>(bitmap, ti, v+i0, v+i1, v+i2);
render_tri_sorted<&powervr2_device::sample_nontextured, group_no>(bitmap, ti, v+i0, v+i1, v+i2);
}
} else {
switch (ti->tsinstruction) {
case 0:
render_tri_sorted<&powervr2_device::sample_textured<0,false>>(bitmap, ti, v+i0, v+i1, v+i2);
render_tri_sorted<&powervr2_device::sample_textured<0,false>, group_no>(bitmap, ti, v+i0, v+i1, v+i2);
break;
case 1:
render_tri_sorted<&powervr2_device::sample_textured<1,false>>(bitmap, ti, v+i0, v+i1, v+i2);
render_tri_sorted<&powervr2_device::sample_textured<1,false>, group_no>(bitmap, ti, v+i0, v+i1, v+i2);
break;
case 2:
render_tri_sorted<&powervr2_device::sample_textured<2,false>>(bitmap, ti, v+i0, v+i1, v+i2);
render_tri_sorted<&powervr2_device::sample_textured<2,false>, group_no>(bitmap, ti, v+i0, v+i1, v+i2);
break;
case 3:
render_tri_sorted<&powervr2_device::sample_textured<3,false>>(bitmap, ti, v+i0, v+i1, v+i2);
render_tri_sorted<&powervr2_device::sample_textured<3,false>, group_no>(bitmap, ti, v+i0, v+i1, v+i2);
break;
default:
/*
@ -2779,18 +2799,17 @@ void powervr2_device::render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert *
* AND'd with 3
*/
logerror("%s - tsinstruction is 0x%08x\n", (unsigned)ti->tsinstruction);
render_tri_sorted<&powervr2_device::sample_nontextured>(bitmap, ti, v+i0, v+i1, v+i2);
render_tri_sorted<&powervr2_device::sample_nontextured, group_no>(bitmap, ti, v+i0, v+i1, v+i2);
}
}
} else {
render_tri_sorted<&powervr2_device::sample_nontextured>(bitmap, ti, v+i0, v+i1, v+i2);
render_tri_sorted<&powervr2_device::sample_nontextured, group_no>(bitmap, ti, v+i0, v+i1, v+i2);
}
}
void powervr2_device::render_to_accumulation_buffer(bitmap_rgb32 &bitmap,const rectangle &cliprect)
template <int group_no>
void powervr2_device::render_group_to_accumulation_buffer(bitmap_rgb32 &bitmap,const rectangle &cliprect)
{
dc_state *state = machine().driver_data<dc_state>();
address_space &space = state->m_maincpu->space(AS_PROGRAM);
#if 0
int stride;
uint16_t *bmpaddr16;
@ -2804,17 +2823,14 @@ void powervr2_device::render_to_accumulation_buffer(bitmap_rgb32 &bitmap,const r
//printf("drawtest!\n");
int rs=renderselect;
uint32_t c=space.read_dword(0x05000000+((isp_backgnd_t & 0xfffff8)>>1)+(3+3)*4);
bitmap.fill(c, cliprect);
struct poly_group *grp = grab[rs].groups + group_no;
int ns=grab[rs].strips_size;
if(ns)
memset(wbuffer, 0x00, sizeof(wbuffer));
int ns=grp->strips_size;
for (int cs=0;cs < ns;cs++)
{
strip *ts = &grab[rs].strips[cs];
strip *ts = &grp->strips[cs];
int sv = ts->svert;
int ev = ts->evert;
int i;
@ -2831,11 +2847,29 @@ void powervr2_device::render_to_accumulation_buffer(bitmap_rgb32 &bitmap,const r
for(i=sv; i <= ev-2; i++)
{
if (!(debug_dip_status&0x2))
render_tri(bitmap, &ts->ti, grab[rs].verts + i);
render_tri<group_no>(bitmap, &ts->ti, grab[rs].verts + i);
}
}
grab[rs].busy=0;
}
void powervr2_device::render_to_accumulation_buffer(bitmap_rgb32 &bitmap, const rectangle &cliprect) {
if (renderselect < 0)
return;
memset(wbuffer, 0x00, sizeof(wbuffer));
dc_state *state = machine().driver_data<dc_state>();
address_space &space = state->m_maincpu->space(AS_PROGRAM);
uint32_t c=space.read_dword(0x05000000+((isp_backgnd_t & 0xfffff8)>>1)+(3+3)*4);
bitmap.fill(c, cliprect);
// TODO: modifier volumes
render_group_to_accumulation_buffer<DISPLAY_LIST_OPAQUE>(bitmap, cliprect);
render_group_to_accumulation_buffer<DISPLAY_LIST_TRANS>(bitmap, cliprect);
render_group_to_accumulation_buffer<DISPLAY_LIST_PUNCH_THROUGH>(bitmap, cliprect);
grab[renderselect].busy=0;
}
// copies the accumulation buffer into the framebuffer, converting to the specified format
@ -4125,7 +4159,7 @@ void powervr2_device::device_reset()
tafifo_pos=0;
tafifo_mask=7;
tafifo_vertexwords=8;
tafifo_listtype= -1;
tafifo_listtype= DISPLAY_LIST_NONE;
start_render_received=0;
renderselect= -1;
grabsel=0;

View File

@ -112,16 +112,48 @@ public:
texinfo ti;
};
struct receiveddata {
vert verts[65536];
strip strips[65536];
static const unsigned MAX_VERTS = 65536;
static const unsigned MAX_STRIPS = 65536;
int verts_size, strips_size;
/*
* There are five polygon lists:
*
* Opaque
* Punch-through polygon
* Opaque/punch-through modifier volume
* Translucent
* Translucent modifier volume
*
* They are rendered in that order. List indices are are three bits, so
* technically there are 8 polygon lists, but only the first 5 are valid.
*/
enum {
DISPLAY_LIST_OPAQUE,
DISPLAY_LIST_OPAQUE_MOD,
DISPLAY_LIST_TRANS,
DISPLAY_LIST_TRANS_MOD,
DISPLAY_LIST_PUNCH_THROUGH,
DISPLAY_LIST_LAST,
DISPLAY_LIST_COUNT,
DISPLAY_LIST_NONE = -1
};
struct poly_group {
strip strips[MAX_STRIPS];
int strips_size;
};
struct receiveddata {
vert verts[MAX_VERTS];
struct poly_group groups[DISPLAY_LIST_COUNT];
uint32_t ispbase;
uint32_t fbwsof1;
uint32_t fbwsof2;
int busy;
int valid;
int verts_size;
};
enum {
@ -469,7 +501,7 @@ private:
uint32_t tex_r_default(texinfo *t, float x, float y);
void tex_get_info(texinfo *t);
template <pix_sample_fn sample_fn>
template <pix_sample_fn sample_fn, int group_no>
inline void render_hline(bitmap_rgb32 &bitmap, texinfo *ti,
int y, float xl, float xr,
float ul, float ur, float vl, float vr,
@ -477,7 +509,7 @@ private:
float const bl[4], float const br[4],
float const offl[4], float const offr[4]);
template <pix_sample_fn sample_fn>
template <pix_sample_fn sample_fn, int group_no>
inline void render_span(bitmap_rgb32 &bitmap, texinfo *ti,
float y0, float y1,
float xl, float xr,
@ -493,13 +525,18 @@ private:
float const dbldy[4], float const dbrdy[4],
float const doldy[4], float const dordy[4]);
template <pix_sample_fn sample_fn>
template <pix_sample_fn sample_fn, int group_no>
inline void render_tri_sorted(bitmap_rgb32 &bitmap, texinfo *ti,
const vert *v0,
const vert *v1, const vert *v2);
template <int group_no>
void render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v);
template <int group_no>
void render_group_to_accumulation_buffer(bitmap_rgb32 &bitmap, const rectangle &cliprect);
void sort_vertices(const vert *v, int *i0, int *i1, int *i2);
void render_tri(bitmap_rgb32 &bitmap, texinfo *ti, const vert *v);
void render_to_accumulation_buffer(bitmap_rgb32 &bitmap, const rectangle &cliprect);
void pvr_accumulationbuffer_to_framebuffer(address_space &space, int x, int y);
void pvr_drawframebuffer(bitmap_rgb32 &bitmap,const rectangle &cliprect);