diff --git a/src/emu/video/polynew.h b/src/emu/video/polynew.h index c0f1fec468b..2b51d3f3607 100644 --- a/src/emu/video/polynew.h +++ b/src/emu/video/polynew.h @@ -120,10 +120,12 @@ public: // construction/destruction poly_manager(running_machine &machine, UINT8 flags = 0); + poly_manager(screen_device &screen, UINT8 flags = 0); virtual ~poly_manager(); // getters running_machine &machine() const { return m_machine; } + screen_device &screen() const { assert(m_screen != NULL); return *m_screen; } // synchronization void wait(const char *debug_reason = "general"); @@ -247,6 +249,7 @@ private: // queue management running_machine & m_machine; + screen_device * m_screen; osd_work_queue * m_queue; // work queue // arrays @@ -279,6 +282,7 @@ private: template poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::poly_manager(running_machine &machine, UINT8 flags) : m_machine(machine), + m_screen(NULL), m_queue(NULL), m_polygon(machine, *this), m_object(machine, *this), @@ -302,6 +306,33 @@ poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::poly_manager(runnin } +template +poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::poly_manager(screen_device &screen, UINT8 flags) + : m_machine(screen.machine()), + m_screen(&screen), + m_queue(NULL), + m_polygon(screen.machine(), *this), + m_object(screen.machine(), *this), + m_unit(screen.machine(), *this), + m_flags(flags), + m_triangles(0), + m_quads(0), + m_pixels(0) +{ +#if KEEP_STATISTICS + memset(m_conflicts, 0, sizeof(m_conflicts)); + memset(m_resolved, 0, sizeof(m_resolved)); +#endif + + // create the work queue + if (!(flags & POLYFLAG_NO_WORK_QUEUE)) + m_queue = osd_work_queue_alloc(WORK_QUEUE_FLAG_MULTI | WORK_QUEUE_FLAG_HIGH_FREQ); + + // request a pre-save callback for synchronization + machine().save().register_presave(save_prepost_delegate(FUNC(poly_manager::presave), this)); +} + + //------------------------------------------------- // ~poly_manager - destructor //------------------------------------------------- diff --git a/src/mame/drivers/cobra.c b/src/mame/drivers/cobra.c index fad41f77c2d..25a90f45c71 100644 --- a/src/mame/drivers/cobra.c +++ b/src/mame/drivers/cobra.c @@ -353,18 +353,18 @@ struct cobra_polydata class cobra_renderer : public poly_manager { public: - cobra_renderer(running_machine &machine) - : poly_manager(machine) + cobra_renderer(screen_device &screen) + : poly_manager(screen) { - m_texture_ram = auto_alloc_array(machine, UINT32, 0x100000); + m_texture_ram = auto_alloc_array(machine(), UINT32, 0x100000); - m_framebuffer = auto_bitmap_rgb32_alloc(machine, 1024, 1024); - m_backbuffer = auto_bitmap_rgb32_alloc(machine, 1024, 1024); - m_overlay = auto_bitmap_rgb32_alloc(machine, 1024, 1024); - m_zbuffer = auto_bitmap_ind32_alloc(machine, 1024, 1024); - m_stencil = auto_bitmap_ind32_alloc(machine, 1024, 1024); + m_framebuffer = auto_bitmap_rgb32_alloc(machine(), 1024, 1024); + m_backbuffer = auto_bitmap_rgb32_alloc(machine(), 1024, 1024); + m_overlay = auto_bitmap_rgb32_alloc(machine(), 1024, 1024); + m_zbuffer = auto_bitmap_ind32_alloc(machine(), 1024, 1024); + m_stencil = auto_bitmap_ind32_alloc(machine(), 1024, 1024); - m_gfx_regmask = auto_alloc_array(machine, UINT32, 0x100); + m_gfx_regmask = auto_alloc_array(machine(), UINT32, 0x100); for (int i=0; i < 0x100; i++) { UINT32 mask = 0; @@ -386,7 +386,7 @@ public: void draw_point(const rectangle &visarea, vertex_t &v, UINT32 color); void draw_line(const rectangle &visarea, vertex_t &v1, vertex_t &v2); - void gfx_init(running_machine &machine); + void gfx_init(); void gfx_exit(running_machine &machine); void gfx_reset(running_machine &machine); void gfx_fifo_exec(running_machine &machine); @@ -999,8 +999,8 @@ void cobra_state::video_start() { machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(cobra_state::cobra_video_exit), this)); - m_renderer = auto_alloc(machine(), cobra_renderer(machine())); - m_renderer->gfx_init(machine()); + m_renderer = auto_alloc(machine(), cobra_renderer(*m_screen)); + m_renderer->gfx_init(); } UINT32 cobra_state::screen_update_cobra(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -2017,13 +2017,13 @@ void cobra_renderer::display(bitmap_rgb32 *bitmap, const rectangle &cliprect) } } -void cobra_renderer::gfx_init(running_machine &machine) +void cobra_renderer::gfx_init() { - const rectangle& visarea = machine.primary_screen->visible_area(); + const rectangle& visarea = screen().visible_area(); - m_gfx_gram = auto_alloc_array(machine, UINT32, 0x40000); + m_gfx_gram = auto_alloc_array(machine(), UINT32, 0x40000); - m_gfx_register = auto_alloc_array(machine, UINT64, 0x3000); + m_gfx_register = auto_alloc_array(machine(), UINT64, 0x3000); m_gfx_register_select = 0; float zvalue = 10000000.0f; @@ -2134,7 +2134,7 @@ void cobra_renderer::gfx_write_reg(running_machine &machine, UINT64 data) { case 0x0000: { - const rectangle& visarea = machine.primary_screen->visible_area(); + const rectangle& visarea = screen().visible_area(); copybitmap_trans(*m_framebuffer, *m_backbuffer, 0, 0, 0, 0, visarea, 0); m_backbuffer->fill(0xff000000, visarea); @@ -2155,7 +2155,7 @@ void cobra_renderer::gfx_fifo_exec(running_machine &machine) if (cobra->m_gfx_fifo_loopback != 0) return; - const rectangle& visarea = machine.primary_screen->visible_area(); + const rectangle& visarea = screen().visible_area(); vertex_t vert[32]; cobra_fifo *fifo_in = cobra->m_gfxfifo_in; diff --git a/src/mame/drivers/deco_mlc.c b/src/mame/drivers/deco_mlc.c index 8639d1c94d0..4b758c6352a 100644 --- a/src/mame/drivers/deco_mlc.c +++ b/src/mame/drivers/deco_mlc.c @@ -206,7 +206,7 @@ WRITE32_MEMBER(deco_mlc_state::avengrs_palette_w) TIMER_DEVICE_CALLBACK_MEMBER(deco_mlc_state::interrupt_gen) { -// logerror("hit scanline IRQ %d (%08x)\n", machine.primary_screen->vpos(), info.i); +// logerror("hit scanline IRQ %d (%08x)\n", m_screen->vpos(), info.i); m_maincpu->set_input_line(m_mainCpuIsArm ? ARM_IRQ_LINE : 1, HOLD_LINE); } diff --git a/src/mame/includes/namcos2.h b/src/mame/includes/namcos2.h index 486876d939b..0bc149560ac 100644 --- a/src/mame/includes/namcos2.h +++ b/src/mame/includes/namcos2.h @@ -196,6 +196,7 @@ public: INTERRUPT_GEN_MEMBER(namcos2_68k_slave_vblank); INTERRUPT_GEN_MEMBER(namcos2_68k_gpu_vblank); TIMER_CALLBACK_MEMBER(namcos2_posirq_tick); + void adjust_posirq_timer( int scanline ); DECLARE_WRITE8_MEMBER( namcos2_68k_eeprom_w ); DECLARE_READ8_MEMBER( namcos2_68k_eeprom_r ); @@ -366,8 +367,6 @@ extern void (*namcos2_kickstart)(running_machine &machine, int internal); #define NAMCOS2_C148_SERIRQ 6 /* 0x1cc000 */ #define NAMCOS2_C148_VBLANKIRQ 7 /* 0x1ce000 */ -void namcos2_adjust_posirq_timer( running_machine &machine, int scanline ); - /**************************************************************/ /* MASTER CPU RAM MEMORY */ /**************************************************************/ diff --git a/src/mame/machine/namcos2.c b/src/mame/machine/namcos2.c index a6715125de8..19fdc5feddf 100644 --- a/src/mame/machine/namcos2.c +++ b/src/mame/machine/namcos2.c @@ -677,20 +677,20 @@ TIMER_CALLBACK_MEMBER(namcos2_shared_state::namcos2_posirq_tick) } } -void namcos2_adjust_posirq_timer( running_machine &machine, int scanline ) +void namcos2_shared_state::adjust_posirq_timer( int scanline ) { - namcos2_posirq_timer->adjust(machine.primary_screen->time_until_pos(scanline, 80), scanline); + namcos2_posirq_timer->adjust(m_screen->time_until_pos(scanline, 80), scanline); } INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_master_vblank) { - if (!is_system21()) namcos2_adjust_posirq_timer(machine(), GetPosIRQScanline(machine())); + if (!is_system21()) adjust_posirq_timer(GetPosIRQScanline(machine())); device.execute().set_input_line(namcos2_68k_master_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE); } INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_slave_vblank) { - if (!is_system21()) namcos2_adjust_posirq_timer(machine(), GetPosIRQScanline(machine())); + if (!is_system21()) adjust_posirq_timer(GetPosIRQScanline(machine())); device.execute().set_input_line(namcos2_68k_slave_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE); } @@ -701,7 +701,7 @@ INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_gpu_vblank) scanline = 0x50+0x89; /* HACK for Winning Run */ //printf( "namcos2_68k_gpu_vblank(%d)\n",namcos2_68k_gpu_C148[NAMCOS2_C148_POSIRQ] ); - namcos2_adjust_posirq_timer(machine(), scanline); + adjust_posirq_timer(scanline); device.execute().set_input_line(namcos2_68k_gpu_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE); } diff --git a/src/mame/machine/segamsys.c b/src/mame/machine/segamsys.c index 865e47d55a6..2765ddeed72 100644 --- a/src/mame/machine/segamsys.c +++ b/src/mame/machine/segamsys.c @@ -1141,7 +1141,7 @@ static void show_tiles(struct sms_vdp* chip) Even though some games set bit 7, it does nothing. */ -static void end_of_frame(running_machine &machine, struct sms_vdp *chip) +static void end_of_frame(screen_device &screen, struct sms_vdp *chip) { UINT8 m1 = (chip->regs[0x1]&0x10)>>4; UINT8 m2 = (chip->regs[0x0]&0x02)>>1; @@ -1154,14 +1154,14 @@ static void end_of_frame(running_machine &machine, struct sms_vdp *chip) { rectangle visarea(0, 256-1, 0, sms_mode_table[chip->screen_mode].sms2_height-1); - if (chip->chip_id==3) machine.primary_screen->configure(256, 256, visarea, HZ_TO_ATTOSECONDS(chip->sms_framerate)); + if (chip->chip_id==3) screen.configure(256, 256, visarea, HZ_TO_ATTOSECONDS(chip->sms_framerate)); } else /* 160x144 */ { rectangle visarea((256-160)/2, (256-160)/2+160-1, (192-144)/2, (192-144)/2+144-1); - machine.primary_screen->configure(256, 256, visarea, HZ_TO_ATTOSECONDS(chip->sms_framerate)); + screen.configure(256, 256, visarea, HZ_TO_ATTOSECONDS(chip->sms_framerate)); } @@ -1179,7 +1179,7 @@ SCREEN_VBLANK(sms) // rising edge if (vblank_on) { - end_of_frame(screen.machine(), md_sms_vdp); + end_of_frame(screen, md_sms_vdp); // the SMS has a 'RESET' button on the machine, it generates an NMI if (screen.machine().root_device().ioport("PAUSE")->read_safe(0x00)) @@ -1245,8 +1245,8 @@ SCREEN_VBLANK(systeme) // rising edge if (vblank_on) { - end_of_frame(screen.machine(), vdp1); - end_of_frame(screen.machine(), vdp2); + end_of_frame(screen, vdp1); + end_of_frame(screen, vdp2); } } @@ -1255,14 +1255,14 @@ SCREEN_VBLANK(megatech_md_sms) { // rising edge if (vblank_on) - end_of_frame(screen.machine(), md_sms_vdp); + end_of_frame(screen, md_sms_vdp); } SCREEN_VBLANK(megatech_bios) { // rising edge if (vblank_on) - end_of_frame(screen.machine(), vdp1); + end_of_frame(screen, vdp1); } SCREEN_UPDATE_RGB32(megatech_md_sms) diff --git a/src/mame/machine/snes.c b/src/mame/machine/snes.c index 7d6bb6c4e4a..2a187550c3e 100644 --- a/src/mame/machine/snes.c +++ b/src/mame/machine/snes.c @@ -1134,7 +1134,7 @@ void snes_state::machine_reset() /* Set STAT78 to NTSC or PAL */ if (ATTOSECONDS_TO_HZ(m_screen->frame_period().attoseconds) >= 59.0f) m_ppu.m_stat78 = SNES_NTSC; - else /* if (ATTOSECONDS_TO_HZ(machine.primary_screen->frame_period().attoseconds) == 50.0f) */ + else /* if (ATTOSECONDS_TO_HZ(m_screen->frame_period().attoseconds) == 50.0f) */ m_ppu.m_stat78 = SNES_PAL; // reset does this to these registers diff --git a/src/mame/video/amiga.c b/src/mame/video/amiga.c index 7a3a8648c58..8cbbc5d9fb0 100644 --- a/src/mame/video/amiga.c +++ b/src/mame/video/amiga.c @@ -943,7 +943,7 @@ void amiga_render_scanline(running_machine &machine, bitmap_ind16 &bitmap, int s } #if 0 - if ( machine.primary_screen->frame_number() % 64 == 0 && scanline == 100 ) + if ( m_screen->frame_number() % 64 == 0 && scanline == 100 ) { const char *m_lores = "LORES"; const char *m_hires = "HIRES"; @@ -980,7 +980,7 @@ void amiga_render_scanline(running_machine &machine, bitmap_ind16 &bitmap, int s CUSTOM_REG(REG_COLOR00) = save_color0; #if GUESS_COPPER_OFFSET - if (machine.primary_screen->frame_number() % 64 == 0 && scanline == 0) + if (m_screen->frame_number() % 64 == 0 && scanline == 0) { if (machine.input().code_pressed(KEYCODE_Q)) popmessage("%d", state->m_wait_offset -= 1); diff --git a/src/mame/video/amigaaga.c b/src/mame/video/amigaaga.c index 9f75ede17d7..07c5cde3135 100644 --- a/src/mame/video/amigaaga.c +++ b/src/mame/video/amigaaga.c @@ -802,7 +802,7 @@ void amiga_aga_render_scanline(running_machine &machine, bitmap_rgb32 &bitmap, i } #if 0 - if ( machine.primary_screen->frame_number() % 16 == 0 && scanline == 250 ) + if ( m_screen->frame_number() % 16 == 0 && scanline == 250 ) { const char *m_lores = "LORES"; const char *m_hires = "HIRES"; @@ -840,7 +840,7 @@ void amiga_aga_render_scanline(running_machine &machine, bitmap_rgb32 &bitmap, i CUSTOM_REG(REG_COLOR00) = save_color0; #if GUESS_COPPER_OFFSET - if (machine.primary_screen->frame_number() % 64 == 0 && scanline == 0) + if (m_screen->frame_number() % 64 == 0 && scanline == 0) { if (machine.input().code_pressed(KEYCODE_Q)) popmessage("%d", wait_offset -= 1); diff --git a/src/mame/video/namcos2.c b/src/mame/video/namcos2.c index 1d48f94febd..6d3e36c31b6 100644 --- a/src/mame/video/namcos2.c +++ b/src/mame/video/namcos2.c @@ -347,7 +347,7 @@ WRITE16_MEMBER( namcos2_state::paletteram_word_w ) /*case 0x180a:*/ case 0x180b: if (data^m_paletteram[offset]) { m_paletteram[offset] = data; - namcos2_adjust_posirq_timer(machine(),get_pos_irq_scanline()); + adjust_posirq_timer(get_pos_irq_scanline()); } break;