static void RENDER_StartLineHandler(const void * s) { if (s) { const Bitu *src = (Bitu*)s; Bit8u* unusedPtr; Bitu unusedPitch; if (!GFX_StartUpdate( unusedPtr, unusedPitch )) { RENDER_DrawLine = RENDER_EmptyLineHandler; return; } if (render.src.bpp == 8) { RENDER_DrawLine = GFX_LineHandler8; } else if ((render.src.bpp == 15) || (render.src.bpp == 16)) { RENDER_DrawLine = GFX_LineHandler16; } else { RENDER_DrawLine = GFX_LineHandler32; } RENDER_DrawLine( s ); return; } }
bool RENDER_StartUpdate(void) { if (GCC_UNLIKELY(render.updating)) return false; if (GCC_UNLIKELY(!render.active)) return false; if (GCC_UNLIKELY(render.frameskip.count<render.frameskip.max)) { render.frameskip.count++; return false; } render.frameskip.count=0; if (render.scale.inMode == scalerMode8) { Check_Palette(); } render.scale.inLine = 0; render.scale.outLine = 0; render.scale.cacheRead = (Bit8u*)&scalerSourceCache; render.scale.outWrite = 0; render.scale.outPitch = 0; Scaler_ChangedLines[0] = 0; Scaler_ChangedLineIndex = 0; /* Clearing the cache will first process the line to make sure it's never the same */ if (GCC_UNLIKELY( render.scale.clearCache) ) { // LOG_MSG("Clearing cache"); //Will always have to update the screen with this one anyway, so let's update already if (GCC_UNLIKELY(!GFX_StartUpdate( render.scale.outWrite, render.scale.outPitch ))) return false; render.fullFrame = true; render.scale.clearCache = false; RENDER_DrawLine = RENDER_ClearCacheHandler; } else { if (render.pal.changed) { /* Assume pal changes always do a full screen update anyway */ if (GCC_UNLIKELY(!GFX_StartUpdate( render.scale.outWrite, render.scale.outPitch ))) return false; RENDER_DrawLine = render.scale.linePalHandler; render.fullFrame = true; } else { RENDER_DrawLine = RENDER_StartLineHandler; if (GCC_UNLIKELY(CaptureState & (CAPTURE_IMAGE|CAPTURE_VIDEO))) render.fullFrame = true; else render.fullFrame = false; } } render.updating = true; return true; }
static void RENDER_StartLineHandler(const void * s) { if (s) { const Bitu *src = (Bitu*)s; Bitu *cache = (Bitu*)(render.scale.cacheRead); Bits count = render.src.start; #if defined(__SSE__) if(sse2_available) { #if defined (_MSC_VER) #define SIZEOF_INT_P 4 #endif static const Bitu simd_inc = 16/SIZEOF_INT_P; while (count >= (Bits)simd_inc) { __m128i v = _mm_loadu_si128((const __m128i*)src); __m128i c = _mm_loadu_si128((const __m128i*)cache); __m128i cmp = _mm_cmpeq_epi32(v, c); if (GCC_UNLIKELY(_mm_movemask_epi8(cmp) != 0xFFFF)) goto cacheMiss; count-=simd_inc; src+=simd_inc; cache+=simd_inc; } } #endif while (count) { if (GCC_UNLIKELY(src[0] != cache[0])) goto cacheMiss; count--; src++; cache++; } } /* cacheHit */ render.scale.cacheRead += render.scale.cachePitch; Scaler_ChangedLines[0] += Scaler_Aspect[ render.scale.inLine ]; render.scale.inLine++; render.scale.outLine++; return; cacheMiss: if (!GFX_StartUpdate( render.scale.outWrite, render.scale.outPitch )) { RENDER_DrawLine = RENDER_EmptyLineHandler; return; } render.scale.outWrite += render.scale.outPitch * Scaler_ChangedLines[0]; RENDER_DrawLine = render.scale.lineHandler; RENDER_DrawLine( s ); }
static void RENDER_StartLineHandler(const void * s) { if (s) { const Bitu *src = (Bitu*)s; Bitu *cache = (Bitu*)(render.scale.cacheRead); for (Bits x=render.src.start;x>0;) { if (GCC_UNLIKELY(src[0] != cache[0])) { if (!GFX_StartUpdate( render.scale.outWrite, render.scale.outPitch )) { RENDER_DrawLine = RENDER_EmptyLineHandler; return; } render.scale.outWrite += render.scale.outPitch * Scaler_ChangedLines[0]; RENDER_DrawLine = render.scale.lineHandler; RENDER_DrawLine( s ); return; } x--; src++; cache++; } } render.scale.cacheRead += render.scale.cachePitch; Scaler_ChangedLines[0] += Scaler_Aspect[ render.scale.inLine ]; render.scale.inLine++; render.scale.outLine++; }