From 020c60feec8e3e2f199f92de0a8e75661c822761 Mon Sep 17 00:00:00 2001 From: helixhorned Date: Sun, 18 Mar 2012 23:17:17 +0000 Subject: [PATCH] Port tvlineasm2 to C and enable transmaskvline2 code also for all-C builds. With the same setup as before, a screen-filling translucent wall (with nothing drawn behind it) renders at about 7 fps faster (from 60-something fps initially) git-svn-id: https://svn.eduke32.com/eduke32@2498 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/include/a.h | 3 ++ polymer/eduke32/build/src/a-c.c | 66 +++++++++++++++++++++++++++++- polymer/eduke32/build/src/engine.c | 6 +-- 3 files changed, 71 insertions(+), 4 deletions(-) diff --git a/polymer/eduke32/build/include/a.h b/polymer/eduke32/build/include/a.h index 9f7411c59..a59de21d6 100644 --- a/polymer/eduke32/build/include/a.h +++ b/polymer/eduke32/build/include/a.h @@ -135,6 +135,9 @@ void mvlineasm4(int32_t cnt, char *p); void setuptvlineasm(int32_t neglogy); int32_t tvlineasm1(int32_t vinc, intptr_t paloffs, int32_t cnt, uint32_t vplc, intptr_t bufplc, intptr_t p); +void setuptvlineasm2(int32_t neglogy, intptr_t paloffs1, intptr_t paloffs2); +void tvlineasm2(uint32_t vplc2, int32_t vinc1, intptr_t bufplc1, intptr_t bufplc2, uint32_t vplc1, intptr_t p); + void msethlineshift(int32_t logx, int32_t logy); void mhline(intptr_t bufplc, uint32_t bx, int32_t cntup16, int32_t junk, uint32_t by, intptr_t p); diff --git a/polymer/eduke32/build/src/a-c.c b/polymer/eduke32/build/src/a-c.c index 3c7af40e5..a55b014a1 100644 --- a/polymer/eduke32/build/src/a-c.c +++ b/polymer/eduke32/build/src/a-c.c @@ -22,6 +22,7 @@ extern void *reciptable; static int32_t bpl, transmode = 0; static int32_t glogx, glogy, gbxinc, gbyinc, gpinc; static char *gbuf, *gpal, *ghlinepal, *gtrans; +static char *gpal2; //Global variable functions void setvlinebpl(int32_t dabpl) { bpl = dabpl; } @@ -208,7 +209,7 @@ void mvlineasm4(int32_t cnt, char *p) void setuptvlineasm(int32_t neglogy) { glogy = neglogy; } // cnt+1 loop iterations! -void tvlineasm1(int32_t vinc, intptr_t paloffs, int32_t cnt, uint32_t vplc, intptr_t bufplc, intptr_t p) +int32_t tvlineasm1(int32_t vinc, intptr_t paloffs, int32_t cnt, uint32_t vplc, intptr_t bufplc, intptr_t p) { char ch; @@ -242,8 +243,71 @@ void tvlineasm1(int32_t vinc, intptr_t paloffs, int32_t cnt, uint32_t vplc, intp } while (--cnt); } + + return vplc; } +void setuptvlineasm2(int32_t neglogy, intptr_t paloffs1, intptr_t paloffs2) +{ + glogy = neglogy; + gpal = (char *)paloffs1; + gpal2 = (char *)paloffs2; +} +// Pass: asm1=vinc2, asm2=pend +// Return: asm1=vplc1, asm2=vplc2 +void tvlineasm2(uint32_t vplc2, int32_t vinc1, intptr_t bufplc1, intptr_t bufplc2, uint32_t vplc1, intptr_t p) +{ + char ch; + + int32_t cnt = (asm2-p-1)/bpl; // >= 1 + const int32_t vinc2 = asm1; + + const char *const buf1 = (char *)bufplc1; + const char *const buf2 = (char *)bufplc2; + const int32_t logy = glogy, ourbpl = bpl, transm = transmode; + + char *pp = (char *)p; + + cnt++; + + if (transm) + { + do + { + ch = buf1[vplc1>>logy]; + if (ch != 255) pp[0] = gtrans[pp[0]|(gpal[ch]<<8)]; + vplc1 += vinc1; + + ch = buf2[vplc2>>logy]; + if (ch != 255) pp[1] = gtrans[pp[1]|(gpal2[ch]<<8)]; + vplc2 += vinc2; + + pp += ourbpl; + } + while (--cnt > 0); + } + else + { + do + { + ch = buf1[vplc1>>logy]; + if (ch != 255) pp[0] = gtrans[(pp[0]<<8)|gpal[ch]]; + vplc1 += vinc1; + + ch = buf2[vplc2>>logy]; + if (ch != 255) pp[1] = gtrans[(pp[1]<<8)|gpal2[ch]]; + vplc2 += vinc2; + + pp += ourbpl; + } + while (--cnt); + } + + asm1 = vplc1; + asm2 = vplc2; +} + + //Floor sprite horizontal line functions void msethlineshift(int32_t logx, int32_t logy) { glogx = logx; glogy = logy; } // cntup16>>16 + 1 iterations diff --git a/polymer/eduke32/build/src/engine.c b/polymer/eduke32/build/src/engine.c index fe8a84d9e..0daa8e5bc 100644 --- a/polymer/eduke32/build/src/engine.c +++ b/polymer/eduke32/build/src/engine.c @@ -3875,7 +3875,7 @@ static void transmaskvline(int32_t x) // // transmaskvline2 (internal) // -#ifndef ENGINE_USING_A_C +#if 1 //ndef ENGINE_USING_A_C static void transmaskvline2(int32_t x) { int32_t i, y1, y2, x2; @@ -3950,7 +3950,7 @@ static void transmaskvline2(int32_t x) // // transmaskwallscan (internal) // -static inline void transmaskwallscan(int32_t x1, int32_t x2) +static void transmaskwallscan(int32_t x1, int32_t x2) { int32_t x; @@ -3963,7 +3963,7 @@ static inline void transmaskwallscan(int32_t x1, int32_t x2) x = x1; while ((startumost[x+windowx1] > startdmost[x+windowx1]) && (x <= x2)) x++; -#ifndef ENGINE_USING_A_C +#if 1 //ndef ENGINE_USING_A_C if ((x <= x2) && (x&1)) transmaskvline(x), x++; while (x < x2) transmaskvline2(x), x += 2; #endif