diff options
-rw-r--r-- | src/devices/video/fixfreq.cpp | 55 | ||||
-rw-r--r-- | src/devices/video/fixfreq.h | 20 | ||||
-rw-r--r-- | src/mame/drivers/pong.cpp | 10 |
3 files changed, 59 insertions, 26 deletions
diff --git a/src/devices/video/fixfreq.cpp b/src/devices/video/fixfreq.cpp index c5dc2e5ffcb..4957a0343fa 100644 --- a/src/devices/video/fixfreq.cpp +++ b/src/devices/video/fixfreq.cpp @@ -14,6 +14,7 @@ ***************************************************************************/ #include "emu.h" +#include "rendutil.h" #include "fixfreq.h" //#define VERBOSE 1 @@ -83,7 +84,7 @@ void fixedfreq_monitor_state::update_sync_channel(const time_type &time, const d void fixedfreq_monitor_state::update_bm(const time_type &time) { - const int pixels = round((time - m_line_time) * m_desc.m_hscale / m_clock_period); + const float pixels = (time - m_line_time) * static_cast<time_type>(m_desc.m_hscale) / m_clock_period; const int has_fields = (m_desc.m_fieldcount > 1) ? 1: 0; uint32_t col(0xffff0000); // Mark sync areas @@ -91,7 +92,8 @@ void fixedfreq_monitor_state::update_bm(const time_type &time) if (m_sync_signal >= m_desc.m_sync_threshold) col = m_col; - m_intf.plot_hline(m_last_x, m_last_y + m_sig_field * has_fields, pixels - m_last_x, col); + m_fragments.push_back({static_cast<float>(m_last_y + m_sig_field * has_fields), m_last_x, pixels, col}); + //m_intf.plot_hline(m_last_x, m_last_y + m_sig_field * has_fields, pixels, col); m_last_x = pixels; } @@ -157,7 +159,6 @@ void fixedfreq_monitor_state::update_sync(const time_type &time, const double da fixedfreq_device::fixedfreq_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock), device_video_interface(mconfig, *this, false), - m_cur_bm(0), m_htotal(0), m_vtotal(0), m_refresh_period(time_type(0)), @@ -190,12 +191,8 @@ void fixedfreq_device::device_start() m_refresh_period = time_type(0); - m_cur_bm = 0; - m_htotal = m_monitor.m_hbackporch; m_vtotal = m_monitor.m_vbackporch; - m_bitmap[0] = std::make_unique<bitmap_rgb32>(m_htotal * m_monitor.m_hscale, m_vtotal); - m_bitmap[1] = std::make_unique<bitmap_rgb32>(m_htotal * m_monitor.m_hscale, m_vtotal); m_state.start(); @@ -209,9 +206,6 @@ void fixedfreq_device::device_start() save_item(NAME(m_state.m_last_vsync_time)); save_item(NAME(m_refresh_period)); save_item(NAME(m_state.m_clock_period)); - //save_item(NAME(m_bitmap[0])); - //save_item(NAME(m_bitmap[1])); - save_item(NAME(m_cur_bm)); /* sync separator */ save_item(NAME(m_state.m_vsync_filter)); @@ -235,15 +229,45 @@ void fixedfreq_device::device_post_load() uint32_t fixedfreq_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - copybitmap(bitmap, *m_bitmap[!m_cur_bm], 0, 0, 0, 0, cliprect); + if (screen.screen_type() == SCREEN_TYPE_RASTER) + { + for (auto &f : m_state.m_fragments) + if (f.y < bitmap.height()) + bitmap.plot_box(f.x, f.y, f.xr - f.x, 1, f.col); + } + else if (screen.screen_type() == SCREEN_TYPE_VECTOR) + { + constexpr const uint32_t flags(PRIMFLAG_ANTIALIAS(1) | PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_VECTOR(1)); + const rectangle &visarea = screen.visible_area(); + float xscale = 1.0f / visarea.width(); + float yscale = 1.0f / visarea.height(); + float xoffs = (float)visarea.min_x; + float yoffs = (float)visarea.min_y; + screen.container().empty(); + screen.container().add_rect(0.0f, 0.0f, 1.0f, 1.0f, rgb_t(0xff,0x00,0x00,0x00), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_VECTORBUF(1)); + + for (auto &f : m_state.m_fragments) + { + const float x0((f.x - xoffs) * xscale); + const float y0((f.y - yoffs) * yscale); + const float x1((f.xr - xoffs) * xscale); + const float y1((f.y + 1.0f - yoffs) * yscale); + + screen.container().add_rect( + x0, y0, x1, y1, + (0xff << 24) | (f.col & 0xffffff), + flags); + } + } + m_state.m_fragments.clear(); return 0; } void fixedfreq_device::vsync_start_cb(double refresh_time) { // toggle bitmap - m_cur_bm ^= 1; + //m_cur_bm ^= 1; rectangle visarea(m_monitor.minh(), m_monitor.maxh(), m_monitor.minv(), m_monitor.maxv()); @@ -251,13 +275,6 @@ void fixedfreq_device::vsync_start_cb(double refresh_time) screen().configure(m_htotal * m_monitor.m_hscale, m_vtotal, visarea, DOUBLE_TO_ATTOSECONDS(m_refresh_period)); } -void fixedfreq_device::plot_hline(int x, int y, int w, uint32_t col) -{ - bitmap_rgb32 *bm = m_bitmap[m_cur_bm].get(); - if (y < bm->height()) - bm->plot_box(x, y, w, 1, col); -} - NETDEV_ANALOG_CALLBACK_MEMBER(fixedfreq_device::update_composite_monochrome) { // double is good enough for this exercise; diff --git a/src/devices/video/fixfreq.h b/src/devices/video/fixfreq.h index 6e758ec4ffa..fdbf728f04a 100644 --- a/src/devices/video/fixfreq.h +++ b/src/devices/video/fixfreq.h @@ -60,7 +60,14 @@ struct fixedfreq_monitor_intf { virtual ~fixedfreq_monitor_intf() = default; virtual void vsync_start_cb(double refresh_time) = 0; - virtual void plot_hline(int x, int y, int w, uint32_t col) = 0; +}; + +struct fixedfreq_monitor_line +{ + float y; + float x; + float xr; + uint32_t col; }; struct fixedfreq_monitor_state @@ -127,8 +134,10 @@ struct fixedfreq_monitor_state m_clock_period = 1.0 / m_desc.m_monitor_clock; // Minimum frame period to be passed to video system ? m_min_frame_period = 0.25 * m_clock_period * m_desc.m_vbackporch * m_desc.m_hbackporch; - m_intf.vsync_start_cb(m_min_frame_period); + m_fragments.clear(); + + m_intf.vsync_start_cb(m_min_frame_period); } void reset() @@ -148,6 +157,7 @@ struct fixedfreq_monitor_state m_sig_vsync = 0; m_sig_composite = 0; m_sig_field = 0; + m_fragments.clear(); } void update_sync_channel(const time_type &time, const double newval); @@ -163,7 +173,7 @@ struct fixedfreq_monitor_state double m_sync_signal; uint32_t m_col; - int m_last_x; + float m_last_x; int m_last_y; time_type m_last_sync_time; time_type m_line_time; @@ -180,6 +190,7 @@ struct fixedfreq_monitor_state int m_sig_composite; int m_sig_field; time_type m_min_frame_period; + std::vector<fixedfreq_monitor_line> m_fragments; }; // ======================> fixedfreq_device @@ -254,12 +265,9 @@ protected: //virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); void vsync_start_cb(double refresh_time) override; - void plot_hline(int x, int y, int w, uint32_t col) override; private: - std::unique_ptr<bitmap_rgb32> m_bitmap[2]; - int m_cur_bm; int m_htotal; int m_vtotal; diff --git a/src/mame/drivers/pong.cpp b/src/mame/drivers/pong.cpp index a140ea5ea8a..ea4ad14e7ab 100644 --- a/src/mame/drivers/pong.cpp +++ b/src/mame/drivers/pong.cpp @@ -97,6 +97,12 @@ TODO: Volleyball... * https://www.youtube.com/watch?v=pDrRnJOCKZc (no longer available) * * https://www.youtube.com/watch?v=fiShX2pTz9A + * https://www.youtube.com/watch?v=YmzH4E3x1_g + * + * Breakout videos: + * + * https://www.youtube.com/watch?v=NOGO49j5gCE + * */ static const int NS_PER_CLOCK_PONG = static_cast<int>((double) NETLIST_INTERNAL_RES / (double) 7159000 + 0.5); @@ -483,6 +489,7 @@ void pong_state::pong(machine_config &config) /* video hardware */ SCREEN(config, "screen", SCREEN_TYPE_RASTER); + //SCREEN(config, "screen", SCREEN_TYPE_VECTOR); FIXFREQ(config, m_video).set_screen("screen"); m_video->set_monitor_clock(MASTER_CLOCK_PONG); m_video->set_horz_params(H_TOTAL_PONG-67,H_TOTAL_PONG-40,H_TOTAL_PONG-8,H_TOTAL_PONG); @@ -533,8 +540,9 @@ void breakout_state::breakout(machine_config &config) NETLIST_ANALOG_OUTPUT(config, "maincpu:coin_counter", 0).set_params("CON_T", FUNC(breakout_state::coin_counter_cb)); /* video hardware */ - SCREEN(config, "screen", SCREEN_TYPE_RASTER); FIXFREQ(config, m_video).set_screen("screen"); + SCREEN(config, "screen", SCREEN_TYPE_RASTER); + //SCREEN(config, "screen", SCREEN_TYPE_VECTOR); /* The Pixel width is a 2,1,2,1,2,1,1,1 repeating pattern * Thus we must use double resolution horizontally */ |