Exemple #1
0
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;
	}
}
Exemple #2
0
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;
}
Exemple #3
0
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 );
}
Exemple #4
0
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++;
}