From f1cc17ea02abdb2a2a44801c922695c7ff9400f5 Mon Sep 17 00:00:00 2001
From: Jaime Passos <lazymyuutsu@gmail.com>
Date: Tue, 10 Sep 2019 17:25:21 -0300
Subject: [PATCH] Enable usage of R_DrawSpan_8_MMX if drawing a flat with
 powers-of-two dimensions

---
 src/r_plane.c | 12 +++++++++++-
 src/screen.c  |  5 +++--
 src/screen.h  |  1 +
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/r_plane.c b/src/r_plane.c
index de5bf9f003..51a69336e2 100644
--- a/src/r_plane.c
+++ b/src/r_plane.c
@@ -652,7 +652,13 @@ static void R_DrawSkyPlane(visplane_t *pl)
 
 boolean R_CheckPowersOfTwo(void)
 {
-	return (ds_powersoftwo = ((!((ds_flatwidth & (ds_flatwidth - 1)) || (ds_flatheight & (ds_flatheight - 1)))) && (ds_flatwidth == ds_flatheight)));
+	if (ds_flatwidth & (ds_flatwidth - 1))
+		ds_powersoftwo = false;
+	else if (ds_flatheight & (ds_flatheight - 1))
+		ds_powersoftwo = false;
+	else if (ds_flatwidth == ds_flatheight)
+		ds_powersoftwo = true;
+	return ds_powersoftwo;
 }
 
 void R_CheckFlatLength(size_t size)
@@ -974,7 +980,11 @@ void R_DrawSinglePlane(visplane_t *pl)
 
 	// Check if the flat has dimensions that are powers-of-two numbers.
 	if (R_CheckPowersOfTwo())
+	{
 		R_CheckFlatLength(ds_flatwidth * ds_flatheight);
+		if (spanfunc == basespanfunc)
+			spanfunc = mmxspanfunc;
+	}
 
 	if (light >= LIGHTLEVELS)
 		light = LIGHTLEVELS-1;
diff --git a/src/screen.c b/src/screen.c
index 4bace52394..547036a60b 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -49,6 +49,7 @@ void (*fuzzcolfunc)(void); // standard fuzzy effect column drawer
 void (*transcolfunc)(void); // translation column drawer
 void (*shadecolfunc)(void); // smokie test..
 void (*spanfunc)(void); // span drawer, use a 64x64 tile
+void (*mmxspanfunc)(void); // span drawer in MMX assembly
 void (*splatfunc)(void); // span drawer w/ transparency
 void (*basespanfunc)(void); // default span func for color mode
 void (*transtransfunc)(void); // translucent translated column drawer
@@ -112,7 +113,7 @@ void SCR_SetMode(void)
 	//
 	if (true)//vid.bpp == 1) //Always run in 8bpp. todo: remove all 16bpp code?
 	{
-		spanfunc = basespanfunc = R_DrawSpan_8;
+		spanfunc = basespanfunc = mmxspanfunc = R_DrawSpan_8;
 		splatfunc = R_DrawSplat_8;
 		transcolfunc = R_DrawTranslatedColumn_8;
 		transtransfunc = R_DrawTranslatedTranslucentColumn_8;
@@ -133,7 +134,7 @@ void SCR_SetMode(void)
 				//fuzzcolfunc = R_DrawTranslucentColumn_8_ASM;
 				walldrawerfunc = R_DrawWallColumn_8_MMX;
 				twosmultipatchfunc = R_Draw2sMultiPatchColumn_8_MMX;
-				//spanfunc = basespanfunc = R_DrawSpan_8_MMX;
+				mmxspanfunc = R_DrawSpan_8_MMX;
 			}
 			else
 			{
diff --git a/src/screen.h b/src/screen.h
index 7aa6fdb638..3554b5520a 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -123,6 +123,7 @@ extern void (*transcolfunc)(void);
 extern void (*shadecolfunc)(void);
 extern void (*spanfunc)(void);
 extern void (*basespanfunc)(void);
+extern void (*mmxspanfunc)(void);
 extern void (*splatfunc)(void);
 extern void (*transtransfunc)(void);
 extern void (*twosmultipatchfunc)(void);
-- 
GitLab