From: <m97...@us...> - 2011-02-26 22:57:46
|
Revision: 11974 http://openmsx.svn.sourceforge.net/openmsx/?rev=11974&view=rev Author: m9710797 Date: 2011-02-26 22:57:40 +0000 (Sat, 26 Feb 2011) Log Message: ----------- Swapped order of cmdEngine->sync() and renderer->updateXXX() Before this patch I could trigger this scenario: VDPVRAM::updateDisplayEnabled() { ... renderer->updateDisplayEnabled(); --> PixelRenderer::updateDisplayEnabled() --> PixelRenderer::sync() --> PixelRenderer::renderUntil() cmdEngine->sync(); --> VDPCmdEngine::sync() --> HmmmCommand::execute() --> VDPVRAM::cmdWrite() --> VDPVRAM::writeCommon() --> VRAMWindow::notify() --> PixelRenderer::updateVRAM() --> PixelRenderer::renderUntil() ... } So in VDPVRAM::updateDisplayEnabled(), the first statement renderer->updateDisplayEnabled() indirectly triggers PixelRenderer::renderUntil(), this is done for timestamp 'now'. The second statement cmdEngine->sync() also triggers PixelRenderer::renderUntil(), but this is possibly done for timestamps between 'last-cmdEngine-sync' and 'now'. So from the standpoint of PixelRenderer::renderUntil(), time appears to go backwards. Simply swapping the order of the two statements above fixes the problem. There is a similar situation in updateSpritesEnabled() and updateDisplayMode(). Modified Paths: -------------- openmsx/trunk/src/video/VDPVRAM.cc Modified: openmsx/trunk/src/video/VDPVRAM.cc =================================================================== --- openmsx/trunk/src/video/VDPVRAM.cc 2011-02-26 22:57:23 UTC (rev 11973) +++ openmsx/trunk/src/video/VDPVRAM.cc 2011-02-26 22:57:40 UTC (rev 11974) @@ -175,24 +175,25 @@ void VDPVRAM::updateDisplayMode(DisplayMode mode, EmuTime::param time) { + assert(vdp.isInsideFrame(time)); + cmdEngine->updateDisplayMode(mode, time); renderer->updateDisplayMode(mode, time); - cmdEngine->updateDisplayMode(mode, time); spriteChecker->updateDisplayMode(mode, time); } void VDPVRAM::updateDisplayEnabled(bool enabled, EmuTime::param time) { assert(vdp.isInsideFrame(time)); + cmdEngine->sync(time); renderer->updateDisplayEnabled(enabled, time); - cmdEngine->sync(time); spriteChecker->updateDisplayEnabled(enabled, time); } void VDPVRAM::updateSpritesEnabled(bool enabled, EmuTime::param time) { assert(vdp.isInsideFrame(time)); + cmdEngine->sync(time); renderer->updateSpritesEnabled(enabled, time); - cmdEngine->sync(time); spriteChecker->updateSpritesEnabled(enabled, time); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |