Blitter: Performance adjustments to 32bpp anim non-SSE blitter
This commit is contained in:
		@@ -11,6 +11,7 @@
 | 
			
		||||
 | 
			
		||||
#include "../stdafx.h"
 | 
			
		||||
#include "../video/video_driver.hpp"
 | 
			
		||||
#include "../zoom_func.h"
 | 
			
		||||
#include "32bpp_anim.hpp"
 | 
			
		||||
 | 
			
		||||
#include "../table/sprites.h"
 | 
			
		||||
@@ -25,10 +26,11 @@ Blitter_32bppAnim::~Blitter_32bppAnim()
 | 
			
		||||
	free(this->anim_alloc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <BlitterMode mode, bool no_anim_translucent>
 | 
			
		||||
template <BlitterMode mode, bool fast_path>
 | 
			
		||||
inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
 | 
			
		||||
{
 | 
			
		||||
	const SpriteData *src = (const SpriteData *)bp->sprite;
 | 
			
		||||
	const BlitterSpriteFlags sprite_flags = src->flags;
 | 
			
		||||
 | 
			
		||||
	const Colour *src_px = (const Colour *)(src->data + src->offset[zoom][0]);
 | 
			
		||||
	const uint16 *src_n  = (const uint16 *)(src->data + src->offset[zoom][1]);
 | 
			
		||||
@@ -42,10 +44,15 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
 | 
			
		||||
	uint16 *anim = this->anim_buf + this->ScreenToAnimOffset((uint32 *)bp->dst) + bp->top * this->anim_buf_pitch + bp->left;
 | 
			
		||||
 | 
			
		||||
	const byte *remap = bp->remap; // store so we don't have to access it via bp everytime
 | 
			
		||||
	const int width = bp->width;
 | 
			
		||||
	const int pitch = bp->pitch;
 | 
			
		||||
	const int anim_pitch = this->anim_buf_pitch;
 | 
			
		||||
	const int skip_left = bp->skip_left;
 | 
			
		||||
	const int height = bp->height;
 | 
			
		||||
 | 
			
		||||
	for (int y = 0; y < bp->height; y++) {
 | 
			
		||||
		Colour *dst_ln = dst + bp->pitch;
 | 
			
		||||
		uint16 *anim_ln = anim + this->anim_buf_pitch;
 | 
			
		||||
	for (int y = 0; y < height; y++) {
 | 
			
		||||
		Colour *dst_ln = dst + pitch;
 | 
			
		||||
		uint16 *anim_ln = anim + anim_pitch;
 | 
			
		||||
 | 
			
		||||
		const Colour *src_px_ln = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
 | 
			
		||||
		src_px++;
 | 
			
		||||
@@ -53,44 +60,52 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
 | 
			
		||||
		const uint16 *src_n_ln = (const uint16 *)((const byte *)src_n + *(const uint32 *)src_n);
 | 
			
		||||
		src_n += 2;
 | 
			
		||||
 | 
			
		||||
		Colour *dst_end = dst + bp->skip_left;
 | 
			
		||||
		Colour *dst_end = dst;
 | 
			
		||||
 | 
			
		||||
		uint n;
 | 
			
		||||
 | 
			
		||||
		while (dst < dst_end) {
 | 
			
		||||
			n = *src_n++;
 | 
			
		||||
		if (!fast_path) {
 | 
			
		||||
			dst_end += skip_left;
 | 
			
		||||
 | 
			
		||||
			if (src_px->a == 0) {
 | 
			
		||||
				dst += n;
 | 
			
		||||
				src_px ++;
 | 
			
		||||
				src_n++;
 | 
			
		||||
			while (dst < dst_end) {
 | 
			
		||||
				n = *src_n++;
 | 
			
		||||
 | 
			
		||||
				if (dst > dst_end) anim += dst - dst_end;
 | 
			
		||||
			} else {
 | 
			
		||||
				if (dst + n > dst_end) {
 | 
			
		||||
					uint d = dst_end - dst;
 | 
			
		||||
					src_px += d;
 | 
			
		||||
					src_n += d;
 | 
			
		||||
				if (src_px->a == 0) {
 | 
			
		||||
					dst += n;
 | 
			
		||||
					src_px ++;
 | 
			
		||||
					src_n++;
 | 
			
		||||
 | 
			
		||||
					dst = dst_end - bp->skip_left;
 | 
			
		||||
					dst_end = dst + bp->width;
 | 
			
		||||
					if (dst > dst_end) anim += dst - dst_end;
 | 
			
		||||
				} else {
 | 
			
		||||
					if (dst + n > dst_end) {
 | 
			
		||||
						uint d = dst_end - dst;
 | 
			
		||||
						src_px += d;
 | 
			
		||||
						src_n += d;
 | 
			
		||||
 | 
			
		||||
					n = min<uint>(n - d, (uint)bp->width);
 | 
			
		||||
					goto draw;
 | 
			
		||||
						dst = dst_end - skip_left;
 | 
			
		||||
						dst_end = dst + width;
 | 
			
		||||
 | 
			
		||||
						n = min<uint>(n - d, (uint)width);
 | 
			
		||||
						goto draw;
 | 
			
		||||
					}
 | 
			
		||||
					dst += n;
 | 
			
		||||
					src_px += n;
 | 
			
		||||
					src_n += n;
 | 
			
		||||
				}
 | 
			
		||||
				dst += n;
 | 
			
		||||
				src_px += n;
 | 
			
		||||
				src_n += n;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			dst -= skip_left;
 | 
			
		||||
			dst_end -= skip_left;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		dst -= bp->skip_left;
 | 
			
		||||
		dst_end -= bp->skip_left;
 | 
			
		||||
 | 
			
		||||
		dst_end += bp->width;
 | 
			
		||||
		dst_end += width;
 | 
			
		||||
 | 
			
		||||
		while (dst < dst_end) {
 | 
			
		||||
			n = min<uint>(*src_n++, (uint)(dst_end - dst));
 | 
			
		||||
			if (fast_path) {
 | 
			
		||||
				n = *src_n++;
 | 
			
		||||
			} else {
 | 
			
		||||
				n = min<uint>(*src_n++, (uint)(dst_end - dst));
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (src_px->a == 0) {
 | 
			
		||||
				anim += n;
 | 
			
		||||
@@ -217,7 +232,7 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
 | 
			
		||||
					break;
 | 
			
		||||
 | 
			
		||||
				default:
 | 
			
		||||
					if (no_anim_translucent) {
 | 
			
		||||
					if (fast_path || (src_px->a == 255 && (sprite_flags & SF_NO_ANIM))) {
 | 
			
		||||
						do {
 | 
			
		||||
							*anim++ = 0;
 | 
			
		||||
							*dst++ = src_px->data;
 | 
			
		||||
@@ -280,7 +295,8 @@ void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL
 | 
			
		||||
			/* FALL THROUGH */
 | 
			
		||||
 | 
			
		||||
		case BM_NORMAL:
 | 
			
		||||
			if ((sprite_flags & SF_NO_ANIM) && !(sprite_flags & SF_TRANSLUCENT)) {
 | 
			
		||||
			if ((sprite_flags & (SF_NO_ANIM | SF_TRANSLUCENT)) == SF_NO_ANIM &&
 | 
			
		||||
					bp->skip_left == 0 && bp->width == UnScaleByZoom(bp->sprite_width, zoom)) {
 | 
			
		||||
				Draw<BM_NORMAL, true>(bp, zoom);
 | 
			
		||||
			} else {
 | 
			
		||||
				Draw<BM_NORMAL, false>(bp, zoom);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user