trunk/src/emu/video/polynew.h
r24766 | r24767 | |
120 | 120 | |
121 | 121 | // construction/destruction |
122 | 122 | poly_manager(running_machine &machine, UINT8 flags = 0); |
| 123 | poly_manager(screen_device &screen, UINT8 flags = 0); |
123 | 124 | virtual ~poly_manager(); |
124 | 125 | |
125 | 126 | // getters |
126 | 127 | running_machine &machine() const { return m_machine; } |
| 128 | screen_device &screen() const { assert(m_screen != NULL); return *m_screen; } |
127 | 129 | |
128 | 130 | // synchronization |
129 | 131 | void wait(const char *debug_reason = "general"); |
r24766 | r24767 | |
247 | 249 | |
248 | 250 | // queue management |
249 | 251 | running_machine & m_machine; |
| 252 | screen_device * m_screen; |
250 | 253 | osd_work_queue * m_queue; // work queue |
251 | 254 | |
252 | 255 | // arrays |
r24766 | r24767 | |
279 | 282 | template<typename _BaseType, class _ObjectData, int _MaxParams, int _MaxPolys> |
280 | 283 | poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::poly_manager(running_machine &machine, UINT8 flags) |
281 | 284 | : m_machine(machine), |
| 285 | m_screen(NULL), |
282 | 286 | m_queue(NULL), |
283 | 287 | m_polygon(machine, *this), |
284 | 288 | m_object(machine, *this), |
r24766 | r24767 | |
302 | 306 | } |
303 | 307 | |
304 | 308 | |
| 309 | template<typename _BaseType, class _ObjectData, int _MaxParams, int _MaxPolys> |
| 310 | poly_manager<_BaseType, _ObjectData, _MaxParams, _MaxPolys>::poly_manager(screen_device &screen, UINT8 flags) |
| 311 | : m_machine(screen.machine()), |
| 312 | m_screen(&screen), |
| 313 | m_queue(NULL), |
| 314 | m_polygon(screen.machine(), *this), |
| 315 | m_object(screen.machine(), *this), |
| 316 | m_unit(screen.machine(), *this), |
| 317 | m_flags(flags), |
| 318 | m_triangles(0), |
| 319 | m_quads(0), |
| 320 | m_pixels(0) |
| 321 | { |
| 322 | #if KEEP_STATISTICS |
| 323 | memset(m_conflicts, 0, sizeof(m_conflicts)); |
| 324 | memset(m_resolved, 0, sizeof(m_resolved)); |
| 325 | #endif |
| 326 | |
| 327 | // create the work queue |
| 328 | if (!(flags & POLYFLAG_NO_WORK_QUEUE)) |
| 329 | m_queue = osd_work_queue_alloc(WORK_QUEUE_FLAG_MULTI | WORK_QUEUE_FLAG_HIGH_FREQ); |
| 330 | |
| 331 | // request a pre-save callback for synchronization |
| 332 | machine().save().register_presave(save_prepost_delegate(FUNC(poly_manager::presave), this)); |
| 333 | } |
| 334 | |
| 335 | |
305 | 336 | //------------------------------------------------- |
306 | 337 | // ~poly_manager - destructor |
307 | 338 | //------------------------------------------------- |
trunk/src/mame/drivers/cobra.c
r24766 | r24767 | |
353 | 353 | class cobra_renderer : public poly_manager<float, cobra_polydata, 8, 10000> |
354 | 354 | { |
355 | 355 | public: |
356 | | cobra_renderer(running_machine &machine) |
357 | | : poly_manager<float, cobra_polydata, 8, 10000>(machine) |
| 356 | cobra_renderer(screen_device &screen) |
| 357 | : poly_manager<float, cobra_polydata, 8, 10000>(screen) |
358 | 358 | { |
359 | | m_texture_ram = auto_alloc_array(machine, UINT32, 0x100000); |
| 359 | m_texture_ram = auto_alloc_array(machine(), UINT32, 0x100000); |
360 | 360 | |
361 | | m_framebuffer = auto_bitmap_rgb32_alloc(machine, 1024, 1024); |
362 | | m_backbuffer = auto_bitmap_rgb32_alloc(machine, 1024, 1024); |
363 | | m_overlay = auto_bitmap_rgb32_alloc(machine, 1024, 1024); |
364 | | m_zbuffer = auto_bitmap_ind32_alloc(machine, 1024, 1024); |
365 | | m_stencil = auto_bitmap_ind32_alloc(machine, 1024, 1024); |
| 361 | m_framebuffer = auto_bitmap_rgb32_alloc(machine(), 1024, 1024); |
| 362 | m_backbuffer = auto_bitmap_rgb32_alloc(machine(), 1024, 1024); |
| 363 | m_overlay = auto_bitmap_rgb32_alloc(machine(), 1024, 1024); |
| 364 | m_zbuffer = auto_bitmap_ind32_alloc(machine(), 1024, 1024); |
| 365 | m_stencil = auto_bitmap_ind32_alloc(machine(), 1024, 1024); |
366 | 366 | |
367 | | m_gfx_regmask = auto_alloc_array(machine, UINT32, 0x100); |
| 367 | m_gfx_regmask = auto_alloc_array(machine(), UINT32, 0x100); |
368 | 368 | for (int i=0; i < 0x100; i++) |
369 | 369 | { |
370 | 370 | UINT32 mask = 0; |
r24766 | r24767 | |
386 | 386 | void draw_point(const rectangle &visarea, vertex_t &v, UINT32 color); |
387 | 387 | void draw_line(const rectangle &visarea, vertex_t &v1, vertex_t &v2); |
388 | 388 | |
389 | | void gfx_init(running_machine &machine); |
| 389 | void gfx_init(); |
390 | 390 | void gfx_exit(running_machine &machine); |
391 | 391 | void gfx_reset(running_machine &machine); |
392 | 392 | void gfx_fifo_exec(running_machine &machine); |
r24766 | r24767 | |
999 | 999 | { |
1000 | 1000 | machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(cobra_state::cobra_video_exit), this)); |
1001 | 1001 | |
1002 | | m_renderer = auto_alloc(machine(), cobra_renderer(machine())); |
1003 | | m_renderer->gfx_init(machine()); |
| 1002 | m_renderer = auto_alloc(machine(), cobra_renderer(*m_screen)); |
| 1003 | m_renderer->gfx_init(); |
1004 | 1004 | } |
1005 | 1005 | |
1006 | 1006 | UINT32 cobra_state::screen_update_cobra(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
r24766 | r24767 | |
2017 | 2017 | } |
2018 | 2018 | } |
2019 | 2019 | |
2020 | | void cobra_renderer::gfx_init(running_machine &machine) |
| 2020 | void cobra_renderer::gfx_init() |
2021 | 2021 | { |
2022 | | const rectangle& visarea = machine.primary_screen->visible_area(); |
| 2022 | const rectangle& visarea = screen().visible_area(); |
2023 | 2023 | |
2024 | | m_gfx_gram = auto_alloc_array(machine, UINT32, 0x40000); |
| 2024 | m_gfx_gram = auto_alloc_array(machine(), UINT32, 0x40000); |
2025 | 2025 | |
2026 | | m_gfx_register = auto_alloc_array(machine, UINT64, 0x3000); |
| 2026 | m_gfx_register = auto_alloc_array(machine(), UINT64, 0x3000); |
2027 | 2027 | m_gfx_register_select = 0; |
2028 | 2028 | |
2029 | 2029 | float zvalue = 10000000.0f; |
r24766 | r24767 | |
2134 | 2134 | { |
2135 | 2135 | case 0x0000: |
2136 | 2136 | { |
2137 | | const rectangle& visarea = machine.primary_screen->visible_area(); |
| 2137 | const rectangle& visarea = screen().visible_area(); |
2138 | 2138 | |
2139 | 2139 | copybitmap_trans(*m_framebuffer, *m_backbuffer, 0, 0, 0, 0, visarea, 0); |
2140 | 2140 | m_backbuffer->fill(0xff000000, visarea); |
r24766 | r24767 | |
2155 | 2155 | if (cobra->m_gfx_fifo_loopback != 0) |
2156 | 2156 | return; |
2157 | 2157 | |
2158 | | const rectangle& visarea = machine.primary_screen->visible_area(); |
| 2158 | const rectangle& visarea = screen().visible_area(); |
2159 | 2159 | vertex_t vert[32]; |
2160 | 2160 | |
2161 | 2161 | cobra_fifo *fifo_in = cobra->m_gfxfifo_in; |
trunk/src/mame/machine/segamsys.c
r24766 | r24767 | |
1141 | 1141 | Even though some games set bit 7, it does nothing. |
1142 | 1142 | */ |
1143 | 1143 | |
1144 | | static void end_of_frame(running_machine &machine, struct sms_vdp *chip) |
| 1144 | static void end_of_frame(screen_device &screen, struct sms_vdp *chip) |
1145 | 1145 | { |
1146 | 1146 | UINT8 m1 = (chip->regs[0x1]&0x10)>>4; |
1147 | 1147 | UINT8 m2 = (chip->regs[0x0]&0x02)>>1; |
r24766 | r24767 | |
1154 | 1154 | { |
1155 | 1155 | rectangle visarea(0, 256-1, 0, sms_mode_table[chip->screen_mode].sms2_height-1); |
1156 | 1156 | |
1157 | | if (chip->chip_id==3) machine.primary_screen->configure(256, 256, visarea, HZ_TO_ATTOSECONDS(chip->sms_framerate)); |
| 1157 | if (chip->chip_id==3) screen.configure(256, 256, visarea, HZ_TO_ATTOSECONDS(chip->sms_framerate)); |
1158 | 1158 | |
1159 | 1159 | } |
1160 | 1160 | else /* 160x144 */ |
1161 | 1161 | { |
1162 | 1162 | rectangle visarea((256-160)/2, (256-160)/2+160-1, (192-144)/2, (192-144)/2+144-1); |
1163 | 1163 | |
1164 | | machine.primary_screen->configure(256, 256, visarea, HZ_TO_ATTOSECONDS(chip->sms_framerate)); |
| 1164 | screen.configure(256, 256, visarea, HZ_TO_ATTOSECONDS(chip->sms_framerate)); |
1165 | 1165 | } |
1166 | 1166 | |
1167 | 1167 | |
r24766 | r24767 | |
1179 | 1179 | // rising edge |
1180 | 1180 | if (vblank_on) |
1181 | 1181 | { |
1182 | | end_of_frame(screen.machine(), md_sms_vdp); |
| 1182 | end_of_frame(screen, md_sms_vdp); |
1183 | 1183 | |
1184 | 1184 | // the SMS has a 'RESET' button on the machine, it generates an NMI |
1185 | 1185 | if (screen.machine().root_device().ioport("PAUSE")->read_safe(0x00)) |
r24766 | r24767 | |
1245 | 1245 | // rising edge |
1246 | 1246 | if (vblank_on) |
1247 | 1247 | { |
1248 | | end_of_frame(screen.machine(), vdp1); |
1249 | | end_of_frame(screen.machine(), vdp2); |
| 1248 | end_of_frame(screen, vdp1); |
| 1249 | end_of_frame(screen, vdp2); |
1250 | 1250 | } |
1251 | 1251 | } |
1252 | 1252 | |
r24766 | r24767 | |
1255 | 1255 | { |
1256 | 1256 | // rising edge |
1257 | 1257 | if (vblank_on) |
1258 | | end_of_frame(screen.machine(), md_sms_vdp); |
| 1258 | end_of_frame(screen, md_sms_vdp); |
1259 | 1259 | } |
1260 | 1260 | |
1261 | 1261 | SCREEN_VBLANK(megatech_bios) |
1262 | 1262 | { |
1263 | 1263 | // rising edge |
1264 | 1264 | if (vblank_on) |
1265 | | end_of_frame(screen.machine(), vdp1); |
| 1265 | end_of_frame(screen, vdp1); |
1266 | 1266 | } |
1267 | 1267 | |
1268 | 1268 | SCREEN_UPDATE_RGB32(megatech_md_sms) |
trunk/src/mame/machine/namcos2.c
r24766 | r24767 | |
677 | 677 | } |
678 | 678 | } |
679 | 679 | |
680 | | void namcos2_adjust_posirq_timer( running_machine &machine, int scanline ) |
| 680 | void namcos2_shared_state::adjust_posirq_timer( int scanline ) |
681 | 681 | { |
682 | | namcos2_posirq_timer->adjust(machine.primary_screen->time_until_pos(scanline, 80), scanline); |
| 682 | namcos2_posirq_timer->adjust(m_screen->time_until_pos(scanline, 80), scanline); |
683 | 683 | } |
684 | 684 | |
685 | 685 | INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_master_vblank) |
686 | 686 | { |
687 | | if (!is_system21()) namcos2_adjust_posirq_timer(machine(), GetPosIRQScanline(machine())); |
| 687 | if (!is_system21()) adjust_posirq_timer(GetPosIRQScanline(machine())); |
688 | 688 | device.execute().set_input_line(namcos2_68k_master_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE); |
689 | 689 | } |
690 | 690 | |
691 | 691 | INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_slave_vblank) |
692 | 692 | { |
693 | | if (!is_system21()) namcos2_adjust_posirq_timer(machine(), GetPosIRQScanline(machine())); |
| 693 | if (!is_system21()) adjust_posirq_timer(GetPosIRQScanline(machine())); |
694 | 694 | device.execute().set_input_line(namcos2_68k_slave_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE); |
695 | 695 | } |
696 | 696 | |
r24766 | r24767 | |
701 | 701 | scanline = 0x50+0x89; /* HACK for Winning Run */ |
702 | 702 | |
703 | 703 | //printf( "namcos2_68k_gpu_vblank(%d)\n",namcos2_68k_gpu_C148[NAMCOS2_C148_POSIRQ] ); |
704 | | namcos2_adjust_posirq_timer(machine(), scanline); |
| 704 | adjust_posirq_timer(scanline); |
705 | 705 | device.execute().set_input_line(namcos2_68k_gpu_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE); |
706 | 706 | } |
707 | 707 | |