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 | |