diff --git a/ares/a26/tia/tia.cpp b/ares/a26/tia/tia.cpp index dab30c379..7588cd309 100644 --- a/ares/a26/tia/tia.cpp +++ b/ares/a26/tia/tia.cpp @@ -112,6 +112,7 @@ auto TIA::scanline() -> void { } auto TIA::frame() -> void { + screen->refreshRateHint(system.frequency(), 228, io.vcounter); screen->frame(); scheduler.exit(Event::Frame); } diff --git a/ares/ares/node/video/screen.cpp b/ares/ares/node/video/screen.cpp index f3fd9f664..2fe73a2de 100644 --- a/ares/ares/node/video/screen.cpp +++ b/ares/ares/node/video/screen.cpp @@ -72,6 +72,10 @@ auto Screen::setRefresh(function refresh) -> void { _refresh = refresh; } +auto Screen::refreshRateHint(double pixelFrequency, int dotsPerLine, int linesPerFrame) -> void { + refreshRateHint(1.0f / ((double)(dotsPerLine * linesPerFrame) / pixelFrequency)); +} + auto Screen::refreshRateHint(double refreshRate) -> void { lock_guard lock(_mutex); platform->refreshRateHint(refreshRate); diff --git a/ares/ares/node/video/screen.hpp b/ares/ares/node/video/screen.hpp index f1239f39f..11e8e985e 100644 --- a/ares/ares/node/video/screen.hpp +++ b/ares/ares/node/video/screen.hpp @@ -35,6 +35,7 @@ struct Screen : Video { auto setRefresh(function refresh) -> void; auto setViewport(u32 x, u32 y, u32 width, u32 height) -> void; auto refreshRateHint(double refreshRate) -> void; + auto refreshRateHint(double pixelFrequency, int dotsPerLine, int linesPerFrame) -> void; auto setSize(u32 width, u32 height) -> void; auto setScale(f64 scaleX, f64 scaleY) -> void; diff --git a/ares/cv/vdp/vdp.cpp b/ares/cv/vdp/vdp.cpp index 758c86466..dc5086a4b 100644 --- a/ares/cv/vdp/vdp.cpp +++ b/ares/cv/vdp/vdp.cpp @@ -17,6 +17,7 @@ auto VDP::load(Node::Object parent) -> void { screen->setScale(1.0, 1.0); screen->setAspect(8.0, 7.0); screen->setViewport(0, 0, 284, 243); + screen->refreshRateHint(system.colorburst(), 228, 262); TMS9918::load(screen); } diff --git a/ares/fc/ppu/ppu.cpp b/ares/fc/ppu/ppu.cpp index 7d1b2723f..7153eaa5a 100644 --- a/ares/fc/ppu/ppu.cpp +++ b/ares/fc/ppu/ppu.cpp @@ -21,6 +21,7 @@ auto PPU::load(Node::Object parent) -> void { screen->setSize(282, displayHeight()); screen->setScale(1.0, 1.0); Region::PAL() ? screen->setAspect(55.0, 43.0) :screen->setAspect(8.0, 7.0); + screen->refreshRateHint(system.frequency() / rate(), 341, vlines()); debugger.load(node); } diff --git a/ares/gb/ppu/ppu.cpp b/ares/gb/ppu/ppu.cpp index fdfa1366e..c26434c32 100644 --- a/ares/gb/ppu/ppu.cpp +++ b/ares/gb/ppu/ppu.cpp @@ -27,6 +27,7 @@ auto PPU::load(Node::Object parent) -> void { screen->setSize(160, 144); screen->setScale(1.0, 1.0); screen->setAspect(1.0, 1.0); + screen->refreshRateHint(4 * 1024 * 1024, 456, 154); if(Model::GameBoy()) { screen->colors(1 << 2, {&PPU::colorGameBoy, this}); diff --git a/ares/gba/ppu/ppu.cpp b/ares/gba/ppu/ppu.cpp index 631c19f18..0079e48bf 100644 --- a/ares/gba/ppu/ppu.cpp +++ b/ares/gba/ppu/ppu.cpp @@ -35,6 +35,7 @@ auto PPU::load(Node::Object parent) -> void { screen->setScale(1.0, 1.0); screen->setAspect(1.0, 1.0); screen->setViewport(0, 0, 240, 160); + screen->refreshRateHint(system.frequency() / 4, 308, 228); colorEmulation = screen->append("Color Emulation", true, [&](auto value) { screen->resetPalette(); diff --git a/ares/md/vdp-performance/vdp.cpp b/ares/md/vdp-performance/vdp.cpp index 0cb4c8944..88b406bc2 100644 --- a/ares/md/vdp-performance/vdp.cpp +++ b/ares/md/vdp-performance/vdp.cpp @@ -25,6 +25,7 @@ auto VDP::load(Node::Object parent) -> void { screen->setSize(1280, 480); screen->setScale(0.25, 0.5); screen->setAspect(32, 35); + screen->refreshRateHint(system.frequency(), 3420, frameHeight()); psg.load(node); debugger.load(node); diff --git a/ares/md/vdp/vdp.cpp b/ares/md/vdp/vdp.cpp index 0548cb7e5..26684ddfd 100644 --- a/ares/md/vdp/vdp.cpp +++ b/ares/md/vdp/vdp.cpp @@ -39,6 +39,7 @@ auto VDP::load(Node::Object parent) -> void { screen->setSize(1388, visibleHeight() * 2); screen->setScale(0.25, 0.5); Region::PAL() ? screen->setAspect(111.0, 100.0) : screen->setAspect(32.0, 35.0); + screen->refreshRateHint(system.frequency(), 3420, frameHeight()); psg.load(node); debugger.load(node); diff --git a/ares/ms/vdp/vdp.cpp b/ares/ms/vdp/vdp.cpp index f6b78e3b8..deee9e94f 100644 --- a/ares/ms/vdp/vdp.cpp +++ b/ares/ms/vdp/vdp.cpp @@ -24,6 +24,7 @@ auto VDP::load(Node::Object parent) -> void { if((Model::MarkIII() || Model::MasterSystemI()) && Region::NTSCJ()) defaultRevision = 1; revision = node->append("Revision", defaultRevision); revision->setAllowedValues({1, 2}); + screen->refreshRateHint(system.colorburst() * 15, 3420, Region::PAL() ? 313 : 262); if(Display::CRT()) { screen->colors(1 << 6, {&VDP::colorMasterSystem, this}); diff --git a/ares/msx/vdp/vdp.cpp b/ares/msx/vdp/vdp.cpp index 2775c292c..15c1694e1 100644 --- a/ares/msx/vdp/vdp.cpp +++ b/ares/msx/vdp/vdp.cpp @@ -30,6 +30,8 @@ auto VDP::load(Node::Object parent) -> void { V9938::pram.allocate(16); V9938::load(screen); } + + screen->refreshRateHint(system.colorburst(), 228, 262); } auto VDP::unload() -> void { diff --git a/ares/myvision/vdp/vdp.cpp b/ares/myvision/vdp/vdp.cpp index f1dc023b1..c13ad41f9 100644 --- a/ares/myvision/vdp/vdp.cpp +++ b/ares/myvision/vdp/vdp.cpp @@ -17,6 +17,7 @@ auto VDP::load(Node::Object parent) -> void { screen->setViewport(0, 0, 284, 243); screen->setScale(1.0, 1.0); screen->setAspect(8.0, 7.0); + screen->refreshRateHint(Constants::Colorburst::NTSC, 228, 262); TMS9918::load(screen); } diff --git a/ares/n64/vi/vi.cpp b/ares/n64/vi/vi.cpp index 0057c2372..1fd1fba1c 100644 --- a/ares/n64/vi/vi.cpp +++ b/ares/n64/vi/vi.cpp @@ -21,6 +21,7 @@ auto VI::load(Node::Object parent) -> void { #endif screen = node->append("Screen", width, height); screen->setRefresh({&VI::refresh, this}); + screen->refreshRateHint(Region::PAL() ? 50 : 60); // TODO: More accurate refresh rate hint screen->colors((1 << 24) + (1 << 15), [&](n32 color) -> n64 { if(color < (1 << 24)) { u64 a = 65535; diff --git a/ares/ng/lspc/lspc.cpp b/ares/ng/lspc/lspc.cpp index 9a829d28d..68adfaaeb 100644 --- a/ares/ng/lspc/lspc.cpp +++ b/ares/ng/lspc/lspc.cpp @@ -16,6 +16,7 @@ auto LSPC::load(Node::Object parent) -> void { screen->setSize(320, 256); screen->setScale(1.0, 1.0); screen->setAspect(1.0, 1.0); + screen->refreshRateHint(6'000'000, 384, 264); vram.allocate(68_KiB >> 1); pram.allocate(16_KiB >> 1); diff --git a/ares/ngp/kge/kge.cpp b/ares/ngp/kge/kge.cpp index 0590de249..2f7b316c0 100644 --- a/ares/ngp/kge/kge.cpp +++ b/ares/ngp/kge/kge.cpp @@ -21,6 +21,7 @@ auto KGE::load(Node::Object parent) -> void { screen->setViewport(0, 0, 160, 152); screen->setScale(1.0, 1.0); screen->setAspect(1.0, 1.0); + screen->refreshRateHint(60); // TODO: More accurate refresh rate hint interframeBlending = screen->append("Interframe Blending", true, [&](auto value) { screen->setInterframeBlending(value); diff --git a/ares/pce/vdp-performance/vdp.cpp b/ares/pce/vdp-performance/vdp.cpp index e7c085e31..633f66f58 100644 --- a/ares/pce/vdp-performance/vdp.cpp +++ b/ares/pce/vdp-performance/vdp.cpp @@ -28,6 +28,7 @@ auto VDP::load(Node::Object parent) -> void { screen->setSize(1128, 263); screen->setScale(0.25, 1.0); screen->setAspect(8.0, 7.0); + screen->refreshRateHint(60); // TODO: More accurate refresh rate hint colorEmulation = screen->append("Color Emulation", true, [&](auto value) { screen->resetPalette(); diff --git a/ares/pce/vdp/vdp.cpp b/ares/pce/vdp/vdp.cpp index 952e5f270..98d49ada9 100644 --- a/ares/pce/vdp/vdp.cpp +++ b/ares/pce/vdp/vdp.cpp @@ -43,6 +43,7 @@ auto VDP::load(Node::Object parent) -> void { screen->setSize(1128, 263); screen->setScale(0.25, 1.0); screen->setAspect(8.0, 7.0); + screen->refreshRateHint(60); // TODO: More accurate refresh rate hint colorEmulation = screen->append("Color Emulation", true, [&](auto value) { screen->resetPalette(); diff --git a/ares/ps1/gpu/blitter.cpp b/ares/ps1/gpu/blitter.cpp index cae7ae5dc..82c3e2336 100644 --- a/ares/ps1/gpu/blitter.cpp +++ b/ares/ps1/gpu/blitter.cpp @@ -1,6 +1,8 @@ auto GPU::Blitter::queue() -> void { self.refreshed = true; + self.screen->refreshRateHint(self.io.videoMode ? 50 : 60); // TODO: More accurate refresh rate hint + //if the display is disabled, output a black screen image if(blank = self.io.displayDisable) { self.screen->frame(); diff --git a/ares/sfc/ppu-performance/ppu.cpp b/ares/sfc/ppu-performance/ppu.cpp index 85e401d63..aa2d1be76 100644 --- a/ares/sfc/ppu-performance/ppu.cpp +++ b/ares/sfc/ppu-performance/ppu.cpp @@ -26,6 +26,7 @@ auto PPU::load(Node::Object parent) -> void { screen->setSize(564, height() * 2); screen->setScale(0.5, 0.5); Region::PAL() ? screen->setAspect(55.0, 43.0) :screen->setAspect(8.0, 7.0); + screen->refreshRateHint(system.cpuFrequency(), 1364, Region::PAL() ? 312 : 262); vramSize = node->append("VRAM", 64_KiB); vramSize->setAllowedValues({64_KiB, 128_KiB}); diff --git a/ares/sfc/ppu/ppu.cpp b/ares/sfc/ppu/ppu.cpp index 3fe1865ce..06760ccc9 100644 --- a/ares/sfc/ppu/ppu.cpp +++ b/ares/sfc/ppu/ppu.cpp @@ -37,6 +37,7 @@ auto PPU::load(Node::Object parent) -> void { screen->setSize(564, height() * 2); screen->setScale(0.5, 0.5); Region::PAL() ? screen->setAspect(55.0, 43.0) :screen->setAspect(8.0, 7.0); + screen->refreshRateHint(system.cpuFrequency(), 1364, Region::PAL() ? 312 : 262); versionPPU1 = node->append("PPU1 Version", 1); versionPPU1->setAllowedValues({1}); diff --git a/ares/sg/vdp/vdp.cpp b/ares/sg/vdp/vdp.cpp index 836b3ab20..b7e0d14f0 100644 --- a/ares/sg/vdp/vdp.cpp +++ b/ares/sg/vdp/vdp.cpp @@ -17,6 +17,7 @@ auto VDP::load(Node::Object parent) -> void { screen->setViewport(0, 0, 284, 243); screen->setScale(1.0, 1.0); screen->setAspect(8.0, 7.0); + screen->refreshRateHint(system.colorburst(), 228, 262); TMS9918::load(screen); } diff --git a/ares/spec/ula/ula.cpp b/ares/spec/ula/ula.cpp index f3e6e4d6e..88122aaa5 100644 --- a/ares/spec/ula/ula.cpp +++ b/ares/spec/ula/ula.cpp @@ -15,6 +15,7 @@ auto ULA::load(Node::Object parent) -> void { screen->setScale(1.0, 1.0); screen->setAspect(1.0, 1.0); screen->setViewport(0, 0, screen->width(), screen->height()); + screen->refreshRateHint(system.frequency(), 224, 312); stream = node->append("Audio"); stream->setChannels(1); diff --git a/ares/ws/ppu/ppu.cpp b/ares/ws/ppu/ppu.cpp index 5be90ff52..5ad6bbbdc 100644 --- a/ares/ws/ppu/ppu.cpp +++ b/ares/ws/ppu/ppu.cpp @@ -221,6 +221,7 @@ auto PPU::frame() -> void { io.vcounter = 0; io.field = !io.field; screen->setViewport(0, 0, screen->width(), screen->height()); + screen->refreshRateHint(3'072'000, 256, io.vcounter); screen->frame(); scheduler.exit(Event::Frame); }