From fd80c0f0d66e9ada94804612c44d72df193c7292 Mon Sep 17 00:00:00 2001 From: pagefault <> Date: Mon, 11 Jul 2005 13:16:26 +0000 Subject: [PATCH] Optimisation to frame draw code, only draw frames that change --- zsnes/src/linux/copyvwin.asm | 20 ++++++++++++++++++++ zsnes/src/linux/sw_draw.c | 15 ++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/zsnes/src/linux/copyvwin.asm b/zsnes/src/linux/copyvwin.asm index 2d667c76..54fd0aff 100644 --- a/zsnes/src/linux/copyvwin.asm +++ b/zsnes/src/linux/copyvwin.asm @@ -28,6 +28,26 @@ EXTSYM _2xSaISuperEagleLineW, _2xSaISuper2xSaILineW,newengen,cfield,HalfTrans EXTSYM GUIOn2,FilteredGUI,SpecialLine,vidbufferofsb,HalfTransB,HalfTransC ALIGN32 +section .data +NEWSYM frametot, dd 0 + +section .text + +NEWSYM CheckFrame + pushad + xor eax,eax + mov ebx,[vidbuffer] + add ebx,16*2+256*2+32*2 + add ebx,8*288*2 + mov ecx,62000 +.loopit + add eax,[ebx] + add ebx,4 + dec ecx + jnz .loopit + mov [frametot],eax + popad + ret SECTION .bss NEWSYM AddEndBytes, resd 1 ; Number of bytes between each line diff --git a/zsnes/src/linux/sw_draw.c b/zsnes/src/linux/sw_draw.c index 8a407cfd..b240ec42 100644 --- a/zsnes/src/linux/sw_draw.c +++ b/zsnes/src/linux/sw_draw.c @@ -28,7 +28,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #define DWORD unsigned long typedef enum { FALSE = 0, TRUE = !FALSE } BOOL; - +extern void CheckFrame(); // VIDEO VARIABLES extern unsigned char cvidmode; extern SDL_Surface *surface; @@ -40,6 +40,8 @@ extern void LinuxExit(); extern unsigned int vidbuffer; extern DWORD converta; extern unsigned char curblank; +extern int frametot; +int prevtot = 0; void UpdateVFrame(void); BOOL sw_start(int width, int height, int req_depth, int FullScreen) @@ -133,9 +135,16 @@ void sw_drawwin() // the value of newengen is equal to 1. // (see ProcessTransparencies in newgfx16.asm // for ZSNES' current transparency code) - UpdateVFrame(); - if (curblank != 0) return; + + prevtot = frametot; + CheckFrame(); + + UpdateVFrame(); + + if (prevtot == frametot) { return; } + + if (curblank != 0) return; LockSurface(); ScreenPtr = vidbuffer;