Previous 199869 Revisions Next

r40589 Thursday 3rd September, 2015 at 08:34:30 UTC by Andrew Gardner
midzeus is now using the polynew rasterizing architecture. (nw)
[src/mame/includes]midzeus.h
[src/mame/video]midzeus.c

trunk/src/mame/includes/midzeus.h
r249100r249101
7979   void zeus_register_update(offs_t offset);
8080   int zeus_fifo_process(const UINT32 *data, int numwords);
8181   void zeus_draw_model(UINT32 texdata, int logit);
82   void zeus_draw_quad(int long_fmt, const UINT32 *databuffer, UINT32 texdata, int logit);
8382
8483   void log_fifo_command(const UINT32 *data, int numwords, const char *suffix);
8584   void log_waveram(UINT32 length_and_base);
r249100r249101
105104   int zeus2_fifo_process(const UINT32 *data, int numwords);
106105   void zeus2_pointer_write(UINT8 which, UINT32 value);
107106   void zeus2_draw_model(UINT32 baseaddr, UINT16 count, int logit);
108   void zeus2_draw_quad(const UINT32 *databuffer, UINT32 texoffs, int logit);
109107   void log_fifo_command(const UINT32 *data, int numwords, const char *suffix);
110108};
trunk/src/mame/video/midzeus.c
r249100r249101
88
99#include "emu.h"
1010#include "includes/midzeus.h"
11#include "video/polylgcy.h"
11#include "video/poly.h"
1212#include "video/rgbutil.h"
1313
1414
r249100r249101
6363};
6464
6565
66class midzeus_renderer : public poly_manager<float, mz_poly_extra_data, 4, 10000>
67{
68public:
69    midzeus_renderer(midzeus_state &state);
70   
71    void render_poly(INT32 scanline, const extent_t& extent, const mz_poly_extra_data& object, int threadid);
72    void render_poly_solid_fixedz(INT32 scanline, const extent_t& extent, const mz_poly_extra_data& object, int threadid);
73   
74    void zeus_draw_quad(int long_fmt, const UINT32 *databuffer, UINT32 texdata, int logit);
75    void zeus_draw_debug_quad(const rectangle& rect, const vertex_t* vert);
76   
77private:
78    midzeus_state& m_state;
79};
6680
81typedef midzeus_renderer::vertex_t poly_vertex;
82
83
6784/*************************************
6885 *
6986 *  Global variables
7087 *
7188 *************************************/
7289
73static legacy_poly_manager *poly;
90static midzeus_renderer *poly;
7491static UINT8 log_fifo;
7592
7693static UINT32 zeus_fifo[20];
r249100r249101
102119INLINE UINT8 get_texel_8bit(const void *base, int y, int x, int width);
103120INLINE UINT8 get_texel_alt_8bit(const void *base, int y, int x, int width);
104121
105static void render_poly(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
106static void render_poly_solid_fixedz(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
107122
108
109123/*************************************
110124 *
111125 *  Macros
r249100r249101
257271 *
258272 *************************************/
259273
274midzeus_renderer::midzeus_renderer(midzeus_state &state)
275    : poly_manager<float, mz_poly_extra_data, 4, 10000>(state.machine()),
276      m_state(state)
277{}
278
260279VIDEO_START_MEMBER(midzeus_state,midzeus)
261280{
262281   int i;
r249100r249101
270289      m_palette->set_pen_color(i, pal5bit(i >> 10), pal5bit(i >> 5), pal5bit(i >> 0));
271290
272291   /* initialize polygon engine */
273   poly = poly_alloc(machine(), 10000, sizeof(mz_poly_extra_data), POLYFLAG_ALLOW_QUADS);
274
292    poly = auto_alloc(machine(), midzeus_renderer(*this));
293   
275294   /* we need to cleanup on exit */
276295   machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(midzeus_state::exit_handler), this));
277296
r249100r249101
315334   }
316335   fclose(f);
317336#endif
318
319   poly_free(poly);
320337}
321338
322339
r249100r249101
331348{
332349   int x, y;
333350
334   poly_wait(poly, "VIDEO_UPDATE");
351   poly->wait("VIDEO_UPDATE");
335352
336353   /* normal update case */
337354   if (!machine().input().code_pressed(KEYCODE_W))
r249100r249101
639656               // m_zeusbase[0x46] = ??? = 0x00000000
640657               // m_zeusbase[0x4c] = ??? = 0x00808080 (brightness?)
641658               // m_zeusbase[0x4e] = ??? = 0x00808080 (brightness?)
642               mz_poly_extra_data *extra = (mz_poly_extra_data *)poly_get_extra_data(poly);
659                    mz_poly_extra_data& extra = poly->object_data_alloc();
643660               poly_vertex vert[4];
644661
645662               vert[0].x = (INT16)m_zeusbase[0x08];
r249100r249101
651668               vert[3].x = (INT16)m_zeusbase[0x0e];
652669               vert[3].y = (INT16)(m_zeusbase[0x0e] >> 16);
653670
654               extra->solidcolor = m_zeusbase[0x00];
655               extra->zoffset = 0x7fff;
671               extra.solidcolor = m_zeusbase[0x00];
672               extra.zoffset = 0x7fff;
656673
657               poly_render_quad(poly, NULL, zeus_cliprect, render_poly_solid_fixedz, 0, &vert[0], &vert[1], &vert[2], &vert[3]);
658               poly_wait(poly, "Normal");
674                    poly->zeus_draw_debug_quad(zeus_cliprect, vert);
675               poly->wait("Normal");
659676            }
660677            else
661678               logerror("Execute unknown command\n");
r249100r249101
728745            else
729746               src = (const UINT32 *)waveram0_ptr_from_expanded_addr(m_zeusbase[0xb4]);
730747
731            poly_wait(poly, "vram_read");
748            poly->wait("vram_read");
732749            m_zeusbase[0xb0] = WAVERAM_READ32(src, 0);
733750            m_zeusbase[0xb2] = WAVERAM_READ32(src, 1);
734751         }
r249100r249101
958975         else
959976         {
960977            UINT32 texdata = (m_zeusbase[0x06] << 16) | (m_zeusbase[0x00] >> 16);
961            zeus_draw_quad(FALSE, data, texdata, log_fifo);
978            poly->zeus_draw_quad(FALSE, data, texdata, log_fifo);
962979         }
963980         break;
964981
r249100r249101
10721089               case 0x25:  /* mk4 */
10731090               case 0x28:  /* mk4r1 */
10741091               case 0x30:  /* invasn */
1075                  zeus_draw_quad(TRUE, databuffer, texdata, logit);
1092                  poly->zeus_draw_quad(TRUE, databuffer, texdata, logit);
10761093                  break;
10771094
10781095               default:
r249100r249101
10961113 *
10971114 *************************************/
10981115
1099void midzeus_state::zeus_draw_quad(int long_fmt, const UINT32 *databuffer, UINT32 texdata, int logit)
1116void midzeus_renderer::zeus_draw_quad(int long_fmt, const UINT32 *databuffer, UINT32 texdata, int logit)
11001117{
1101   poly_draw_scanline_func callback;
1102   mz_poly_extra_data *extra;
11031118   poly_vertex clipvert[8];
11041119   poly_vertex vert[4];
11051120   UINT32 ushift, vshift;
r249100r249101
11121127   texbase = ((texdata >> 10) & 0x3f0000) | (texdata & 0xffff);
11131128   texwshift = (texdata >> 22) & 7;
11141129
1115   ushift = 8 - ((m_zeusbase[0x04] >> 4) & 3);
1116   vshift = 8 - ((m_zeusbase[0x04] >> 6) & 3);
1130   ushift = 8 - ((m_state.m_zeusbase[0x04] >> 4) & 3);
1131   vshift = 8 - ((m_state.m_zeusbase[0x04] >> 6) & 3);
11171132
11181133   int xy_offset = long_fmt ? 2 : 1;
11191134
r249100r249101
11871202      }
11881203   }
11891204
1190   numverts = poly_zclip_if_less(4, &vert[0], &clipvert[0], 4, 512.0f);
1205   numverts = poly->zclip_if_less(4, &vert[0], &clipvert[0], 4, 512.0f);
11911206   if (numverts < 3)
11921207      return;
11931208
r249100r249101
12151230         clipvert[i].y += 0.0005f;
12161231   }
12171232
1218   extra = (mz_poly_extra_data *)poly_get_extra_data(poly);
1233    mz_poly_extra_data& extra = poly->object_data_alloc();
12191234
12201235   if (ctrl_word & 0x01000000)
12211236   {
12221237      UINT32 tex_type = (texdata >> 16) & 3;
1223      extra->texwidth = 512 >> texwshift;
1224      extra->voffset = ctrl_word & 0xffff;
1238      extra.texwidth = 512 >> texwshift;
1239      extra.voffset = ctrl_word & 0xffff;
12251240
1226      extra->texbase = waveram0_ptr_from_texture_addr(texbase, extra->texwidth);
1241      extra.texbase = waveram0_ptr_from_texture_addr(texbase, extra.texwidth);
12271242
12281243      if (tex_type == 1)
12291244      {
1230         extra->get_texel = texdata & 0x00200000 ? get_texel_8bit : get_texel_4bit;
1245         extra.get_texel = texdata & 0x00200000 ? get_texel_8bit : get_texel_4bit;
12311246      }
12321247      else if (tex_type == 2)
12331248      {
1234         extra->get_texel = texdata & 0x00200000 ? get_texel_alt_8bit : get_texel_alt_4bit;
1249         extra.get_texel = texdata & 0x00200000 ? get_texel_alt_8bit : get_texel_alt_4bit;
12351250      }
12361251      else
12371252      {
r249100r249101
12401255      }
12411256   }
12421257
1243   callback = render_poly;
1258   extra.ctrl_word = ctrl_word;
1259   extra.solidcolor = m_state.m_zeusbase[0x00] & 0x7fff;
1260   extra.zoffset = m_state.m_zeusbase[0x7e] >> 16;
1261   extra.alpha = m_state.m_zeusbase[0x4e];
1262   extra.blend = m_state.m_zeusbase[0x5c];
1263   extra.depth_test_enable = !(m_state.m_zeusbase[0x04] & 0x800);
1264   extra.depth_write_enable = m_state.m_zeusbase[0x04] & 0x200;
1265   extra.transcolor = ((ctrl_word >> 16) & 1) ? 0 : 0x100;
1266   extra.palbase = waveram0_ptr_from_block_addr(zeus_palbase);
12441267
1245   extra->ctrl_word = ctrl_word;
1246   extra->solidcolor = m_zeusbase[0x00] & 0x7fff;
1247   extra->zoffset = m_zeusbase[0x7e] >> 16;
1248   extra->alpha = m_zeusbase[0x4e];
1249   extra->blend = m_zeusbase[0x5c];
1250   extra->depth_test_enable = !(m_zeusbase[0x04] & 0x800);
1251   extra->depth_write_enable = m_zeusbase[0x04] & 0x200;
1252   extra->transcolor = ((ctrl_word >> 16) & 1) ? 0 : 0x100;
1253   extra->palbase = waveram0_ptr_from_block_addr(zeus_palbase);
1268    // Note: Before being upgraded to the new polygon rasterizing code, this function call was
1269    //       a poly_render_quad_fan.  It appears as though the new code defaults to a fan if
1270    //       the template argument is 4, but keep an eye out for missing quads.
1271    poly->render_polygon<4>(zeus_cliprect,
1272                            render_delegate(FUNC(midzeus_renderer::render_poly), this),
1273                            4,
1274                            clipvert);
1275}
12541276
1255   poly_render_quad_fan(poly, NULL, zeus_cliprect, callback, 4, numverts, &clipvert[0]);
1277void midzeus_renderer::zeus_draw_debug_quad(const rectangle& rect, const vertex_t *vert)
1278{
1279    poly->render_polygon<4>(rect, render_delegate(FUNC(midzeus_renderer::render_poly_solid_fixedz), this), 0, vert);
12561280}
12571281
12581282
1259
12601283/*************************************
12611284 *
12621285 *  Rasterizers
12631286 *
12641287 *************************************/
12651288
1266static void render_poly(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid)
1289void midzeus_renderer::render_poly(INT32 scanline, const extent_t& extent, const mz_poly_extra_data& object, int threadid)
12671290{
1268   const mz_poly_extra_data *extra = (const mz_poly_extra_data *)extradata;
1269   INT32 curz = extent->param[0].start;
1270   INT32 curu = extent->param[1].start;
1271   INT32 curv = extent->param[2].start;
1272   INT32 curi = extent->param[3].start;
1273   INT32 dzdx = extent->param[0].dpdx;
1274   INT32 dudx = extent->param[1].dpdx;
1275   INT32 dvdx = extent->param[2].dpdx;
1276   INT32 didx = extent->param[3].dpdx;
1277   const void *texbase = extra->texbase;
1278   const void *palbase = extra->palbase;
1279   UINT16 transcolor = extra->transcolor;
1280   UINT32 texwidth = extra->texwidth;
1291   INT32 curz = extent.param[0].start;
1292   INT32 curu = extent.param[1].start;
1293   INT32 curv = extent.param[2].start;
1294   INT32 curi = extent.param[3].start;
1295   INT32 dzdx = extent.param[0].dpdx;
1296   INT32 dudx = extent.param[1].dpdx;
1297   INT32 dvdx = extent.param[2].dpdx;
1298   INT32 didx = extent.param[3].dpdx;
1299   const void *texbase = object.texbase;
1300   const void *palbase = object.palbase;
1301   UINT16 transcolor = object.transcolor;
1302   UINT32 texwidth = object.texwidth;
12811303
1282   for (UINT32 x = extent->startx; x < extent->stopx; x++)
1304   for (UINT32 x = extent.startx; x < extent.stopx; x++)
12831305   {
12841306      UINT16 *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, scanline, x);
1285      INT32 depth = (curz >> 16) + extra->zoffset;
1307      INT32 depth = (curz >> 16) + object.zoffset;
12861308
12871309      if (depth > 0x7fff)
12881310         depth = 0x7fff;
r249100r249101
12911313
12921314      bool depth_pass;
12931315
1294      if (extra->depth_test_enable)
1316      if (object.depth_test_enable)
12951317         depth_pass = depth >= 0 && depth <= *depthptr;
12961318      else
12971319         depth_pass = true;
r249100r249101
13021324
13031325         bool src_valid = true;
13041326
1305         if ((extra->ctrl_word & 0x000c0000) == 0x000c0000)
1327         if ((object.ctrl_word & 0x000c0000) == 0x000c0000)
13061328         {
1307            src.set_r(pal5bit(extra->solidcolor >> 10));
1308            src.set_g(pal5bit(extra->solidcolor >> 5));
1309            src.set_b(pal5bit(extra->solidcolor));
1329            src.set_r(pal5bit(object.solidcolor >> 10));
1330            src.set_g(pal5bit(object.solidcolor >> 5));
1331            src.set_b(pal5bit(object.solidcolor));
13101332         }
13111333         else
13121334         {
13131335            UINT32 u0 = curu >> 8;
1314            UINT32 v0 = extra->voffset + (curv >> 8);
1336            UINT32 v0 = object.voffset + (curv >> 8);
13151337            UINT32 u1 = u0 + 1;
13161338            UINT32 v1 = v0 + 1;
13171339
13181340            UINT8 texels[4];
13191341
1320            texels[0] = extra->get_texel(texbase, v0, u0, texwidth);
1321            texels[1] = extra->get_texel(texbase, v0, u1, texwidth);
1322            texels[2] = extra->get_texel(texbase, v1, u0, texwidth);
1323            texels[3] = extra->get_texel(texbase, v1, u1, texwidth);
1342            texels[0] = object.get_texel(texbase, v0, u0, texwidth);
1343            texels[1] = object.get_texel(texbase, v0, u1, texwidth);
1344            texels[2] = object.get_texel(texbase, v1, u0, texwidth);
1345            texels[3] = object.get_texel(texbase, v1, u1, texwidth);
13241346
13251347            if (texels[0] != transcolor)
13261348            {
1327               rgb_t color[4];
1349               rgb_t color[4] = {0, 0, 0, 0};
13281350
13291351               for (UINT32 i = 0; i < 4; ++i)
13301352               {
r249100r249101
13571379            UINT32 outg = 0;
13581380            UINT32 outb = 0;
13591381
1360            UINT32 srca = extra->alpha & 0xff;
1361            UINT32 dsta = (extra->alpha >> 8) & 0xff;
1382            UINT32 srca = object.alpha & 0xff;
1383            UINT32 dsta = (object.alpha >> 8) & 0xff;
13621384
13631385            // Destination enable?
1364            if (extra->blend & 0x00800000)
1386            if (object.blend & 0x00800000)
13651387            {
13661388               UINT16 dst = WAVERAM_READPIX(zeus_renderbase, scanline, x);
13671389
r249100r249101
13741396               dstb = (dstb << 3) | (dstb >> 2);
13751397            }
13761398
1377            switch (extra->blend)
1399            switch (object.blend)
13781400            {
13791401               case BLEND_OPAQUE1:
13801402               {
r249100r249101
14591481
14601482            WAVERAM_WRITEPIX(zeus_renderbase, scanline, x, (outr << 10) | (outg << 5) | outb);
14611483
1462            if (extra->depth_write_enable)
1484            if (object.depth_write_enable)
14631485               *depthptr = depth;
14641486         }
14651487      }
r249100r249101
14731495
14741496
14751497
1476static void render_poly_solid_fixedz(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid)
1498void midzeus_renderer::render_poly_solid_fixedz(INT32 scanline, const extent_t& extent, const mz_poly_extra_data& object, int threadid)
14771499{
1478   const mz_poly_extra_data *extra = (const mz_poly_extra_data *)extradata;
1479   UINT16 color = extra->solidcolor;
1480   UINT16 depth = extra->zoffset;
1500   UINT16 color = object.solidcolor;
1501   UINT16 depth = object.zoffset;
14811502   int x;
14821503
1483   for (x = extent->startx; x < extent->stopx; x++)
1504   for (x = extent.startx; x < extent.stopx; x++)
14841505      waveram_plot_depth(scanline, x, color, depth);
14851506}
14861507


Previous 199869 Revisions Next


© 1997-2024 The MAME Team