trunk/src/mame/drivers/coolridr.c
| r21471 | r21472 | |
| 369 | 369 | #define CLIPMINX_FULL (0) |
| 370 | 370 | #define CLIPMINY_FULL (0) |
| 371 | 371 | |
| 372 | |
| 372 | 373 | class coolridr_state : public driver_device |
| 373 | 374 | { |
| 374 | 375 | public: |
| r21471 | r21472 | |
| 404 | 405 | decode[0].current_object = 0; |
| 405 | 406 | decode[1].current_object = 0; |
| 406 | 407 | debug_randompal = 9; |
| 407 | | |
| 408 | 408 | } |
| 409 | 409 | |
| 410 | 410 | // Blitter state |
| r21471 | r21472 | |
| 535 | 535 | static void *draw_object_threaded(void *param, int threadid); |
| 536 | 536 | int m_usethreads; |
| 537 | 537 | |
| 538 | |
| 539 | |
| 540 | struct cool_render_object |
| 541 | { |
| 542 | UINT8* indirect_tiles; |
| 543 | UINT32* indirect_zoom; |
| 544 | UINT32 spriteblit[12]; |
| 545 | bitmap_ind16* drawbitmap; |
| 546 | bitmap_ind16* zbitmap; |
| 547 | UINT16 zpri; |
| 548 | UINT8 blittype; |
| 549 | coolridr_state* state; |
| 550 | UINT32 clipvals[3]; |
| 551 | int screen; |
| 552 | }; |
| 553 | |
| 554 | static int comp_sprite_z(const void *q1, const void *q2); |
| 555 | |
| 556 | struct cool_render_object **m_cool_render_object_list1; |
| 557 | struct cool_render_object **m_cool_render_object_list2; |
| 558 | |
| 559 | int m_listcount1; |
| 560 | int m_listcount2; |
| 561 | |
| 562 | |
| 563 | |
| 564 | |
| 565 | |
| 566 | // the decode cache mechansim is an optimization |
| 567 | // we know all gfx are in ROM, and that calling the RLE decompression every time they're used is slow, so we cache the decoded tiles |
| 568 | // and objects after they're used, for future re-use, quite handy with a driving game. |
| 569 | |
| 538 | 570 | #define DECODECACHE_NUMOBJECTCACHES (128) |
| 539 | 571 | |
| 540 | 572 | #define DECODECACHE_NUMSPRITETILES (16*16) |
| r21471 | r21472 | |
| 1025 | 1057 | |
| 1026 | 1058 | |
| 1027 | 1059 | |
| 1028 | | struct cool_render_object |
| 1029 | | { |
| 1030 | | UINT8* indirect_tiles; |
| 1031 | | UINT32* indirect_zoom; |
| 1032 | | UINT32 spriteblit[12]; |
| 1033 | | bitmap_ind16* drawbitmap; |
| 1034 | | bitmap_ind16* zbitmap; |
| 1035 | | UINT16 zpri; |
| 1036 | | UINT8 blittype; |
| 1037 | | coolridr_state* state; |
| 1038 | | UINT32 clipvals[3]; |
| 1039 | | int screen; |
| 1040 | | }; |
| 1041 | 1060 | |
| 1042 | 1061 | #define RLE_BLOCK(writeaddrxor) \ |
| 1043 | 1062 | /* skip the decoding if it's the same tile as last time! */ \ |
| r21471 | r21472 | |
| 2388 | 2407 | |
| 2389 | 2408 | testobject->zpri = m_blitterAddr | m_blittype<<12; |
| 2390 | 2409 | testobject->blittype = m_blittype; |
| 2410 | #if 0 |
| 2391 | 2411 | osd_work_queue *queue; |
| 2412 | #endif |
| 2392 | 2413 | // which queue, which bitmap |
| 2393 | 2414 | if (m_blitterMode == 0x30 || m_blitterMode == 0x40 || m_blitterMode == 0x4f || m_blitterMode == 0x50 || m_blitterMode == 0x60) |
| 2394 | 2415 | { |
| r21471 | r21472 | |
| 2399 | 2420 | testobject->clipvals[1] = m_clipvals[0][1]; |
| 2400 | 2421 | testobject->clipvals[2] = m_clipvals[0][2]; |
| 2401 | 2422 | testobject->screen = 0; |
| 2423 | #if 0 |
| 2402 | 2424 | queue = m_work_queue[0]; |
| 2425 | #endif |
| 2403 | 2426 | } |
| 2404 | 2427 | else // 0x90, 0xa0, 0xaf, 0xb0, 0xc0 |
| 2405 | 2428 | { |
| r21471 | r21472 | |
| 2410 | 2433 | testobject->clipvals[1] = m_clipvals[1][1]; |
| 2411 | 2434 | testobject->clipvals[2] = m_clipvals[1][2]; |
| 2412 | 2435 | testobject->screen = 1; |
| 2436 | #if 0 |
| 2413 | 2437 | queue = m_work_queue[1]; |
| 2438 | #endif |
| 2414 | 2439 | } |
| 2415 | 2440 | |
| 2441 | #if 0 |
| 2416 | 2442 | if (m_usethreads) |
| 2417 | 2443 | { |
| 2418 | 2444 | osd_work_item_queue(queue, draw_object_threaded, testobject, WORK_ITEM_FLAG_AUTO_RELEASE); |
| r21471 | r21472 | |
| 2421 | 2447 | { |
| 2422 | 2448 | draw_object_threaded((void*)testobject,0); |
| 2423 | 2449 | } |
| 2450 | #else |
| 2451 | |
| 2452 | if (m_blitterMode == 0x30 || m_blitterMode == 0x40 || m_blitterMode == 0x4f || m_blitterMode == 0x50 || m_blitterMode == 0x60) |
| 2453 | { |
| 2454 | if (m_listcount1<1000000) |
| 2455 | { |
| 2456 | m_cool_render_object_list1[m_listcount1] = testobject; |
| 2457 | m_listcount1++; |
| 2458 | } |
| 2459 | else |
| 2460 | { |
| 2461 | popmessage("m_listcount1 overflow!\n"); |
| 2462 | } |
| 2463 | } |
| 2464 | else |
| 2465 | { |
| 2466 | if (m_listcount2<1000000) |
| 2467 | { |
| 2468 | m_cool_render_object_list2[m_listcount2] = testobject; |
| 2469 | m_listcount2++; |
| 2470 | } |
| 2471 | else |
| 2472 | { |
| 2473 | popmessage("m_listcount2 overflow!\n"); |
| 2474 | } |
| 2475 | } |
| 2476 | #endif |
| 2424 | 2477 | } |
| 2425 | 2478 | |
| 2426 | 2479 | |
| r21471 | r21472 | |
| 2602 | 2655 | m_blitterClearCount = 0; |
| 2603 | 2656 | } |
| 2604 | 2657 | |
| 2658 | |
| 2659 | |
| 2660 | |
| 2605 | 2661 | WRITE32_MEMBER(coolridr_state::sysh1_fb_data_w) |
| 2606 | 2662 | { |
| 2607 | 2663 | if(m_blitterClearCount == 0) |
| r21471 | r21472 | |
| 2633 | 2689 | { |
| 2634 | 2690 | // wait for our sprite rendering to finish |
| 2635 | 2691 | osd_work_queue_wait(m_work_queue[0], osd_ticks_per_second() * 100); |
| 2636 | | |
| 2692 | |
| 2637 | 2693 | // copy our old buffer to the actual screen |
| 2638 | 2694 | copybitmap(m_screen1_bitmap, m_temp_bitmap_sprites, 0, 0, 0, 0, visarea); |
| 2639 | 2695 | |
| 2640 | | //m_temp_bitmap_sprites.fill(0xff000000, visarea); |
| 2696 | |
| 2697 | |
| 2698 | |
| 2699 | //m_temp_bitmap_sprites2.fill(0xff000000, visarea); |
| 2641 | 2700 | // render the tilemap to the backbuffer, ready for having sprites drawn on it |
| 2642 | 2701 | draw_bg_coolridr(m_temp_bitmap_sprites, visarea, 0); |
| 2643 | | // wipe the z-buffer ready for the sprites |
| 2702 | // wipe the z-buffer ready for the sprites |
| 2644 | 2703 | m_zbuffer_bitmap.fill(0xffff, visarea); |
| 2645 | 2704 | // almost certainly wrong |
| 2646 | 2705 | m_clipvals[0][0] = 0; |
| 2647 | 2706 | m_clipvals[0][1] = 0; |
| 2648 | 2707 | m_clipvals[0][2] = 0; |
| 2649 | 2708 | m_clipblitterMode[0] = 0xff; |
| 2709 | |
| 2710 | //qsort(m_cool_render_object_list1, m_listcount1, sizeof(struct cool_render_object *), comp_sprite_z); |
| 2711 | |
| 2712 | for (int i=0;i<m_listcount1;i++) |
| 2713 | { |
| 2714 | if (m_usethreads) |
| 2715 | { |
| 2716 | osd_work_item_queue(m_work_queue[0], draw_object_threaded, m_cool_render_object_list1[i], WORK_ITEM_FLAG_AUTO_RELEASE); |
| 2717 | } |
| 2718 | else |
| 2719 | { |
| 2720 | draw_object_threaded((void*)m_cool_render_object_list1[i],0); |
| 2721 | } |
| 2722 | } |
| 2723 | |
| 2724 | m_listcount1 = 0; |
| 2725 | |
| 2726 | |
| 2650 | 2727 | } |
| 2651 | 2728 | else if(m_blitterClearMode == 0x8c800000) |
| 2652 | 2729 | { |
| r21471 | r21472 | |
| 2655 | 2732 | |
| 2656 | 2733 | // copy our old buffer to the actual screen |
| 2657 | 2734 | copybitmap(m_screen2_bitmap, m_temp_bitmap_sprites2, 0, 0, 0, 0, visarea); |
| 2735 | |
| 2736 | |
| 2737 | |
| 2738 | |
| 2658 | 2739 | //m_temp_bitmap_sprites2.fill(0xff000000, visarea); |
| 2659 | 2740 | // render the tilemap to the backbuffer, ready for having sprites drawn on it |
| 2660 | 2741 | draw_bg_coolridr(m_temp_bitmap_sprites2, visarea, 1); |
| r21471 | r21472 | |
| 2665 | 2746 | m_clipvals[1][1] = 0; |
| 2666 | 2747 | m_clipvals[1][2] = 0; |
| 2667 | 2748 | m_clipblitterMode[1] = 0xff; |
| 2749 | |
| 2750 | //qsort(m_cool_render_object_list2, m_listcount2, sizeof(struct cool_render_object *), comp_sprite_z); |
| 2751 | |
| 2752 | for (int i=0;i<m_listcount2;i++) |
| 2753 | { |
| 2754 | if (m_usethreads) |
| 2755 | { |
| 2756 | osd_work_item_queue(m_work_queue[1], draw_object_threaded, m_cool_render_object_list2[i], WORK_ITEM_FLAG_AUTO_RELEASE); |
| 2757 | } |
| 2758 | else |
| 2759 | { |
| 2760 | draw_object_threaded((void*)m_cool_render_object_list2[i],0); |
| 2761 | } |
| 2762 | } |
| 2763 | |
| 2764 | m_listcount2 = 0; |
| 2765 | |
| 2668 | 2766 | } |
| 2669 | 2767 | |
| 2670 | 2768 | //printf("frame\n"); |
| r21471 | r21472 | |
| 3529 | 3627 | m_h1_pcg = auto_alloc_array_clear(machine(), UINT8, VRAM_SIZE); |
| 3530 | 3628 | m_h1_pal = auto_alloc_array_clear(machine(), UINT16, VRAM_SIZE); |
| 3531 | 3629 | |
| 3630 | m_cool_render_object_list1 = auto_alloc_array_clear(machine(), struct cool_render_object*, 1000000); |
| 3631 | m_listcount1 = 0; |
| 3632 | |
| 3633 | m_cool_render_object_list2 = auto_alloc_array_clear(machine(), struct cool_render_object*, 1000000); |
| 3634 | m_listcount2 = 0; |
| 3635 | |
| 3636 | |
| 3532 | 3637 | save_pointer(NAME(m_h1_vram), VRAM_SIZE); |
| 3533 | 3638 | save_pointer(NAME(m_h1_pcg), VRAM_SIZE); |
| 3534 | 3639 | save_pointer(NAME(m_h1_pal), VRAM_SIZE); |