Skip to content
Snippets Groups Projects
Commit 5b5be7c8 authored by Micah Elizabeth Scott's avatar Micah Elizabeth Scott
Browse files

Move pResidual calculation up one level

This amazingly helps quite a lot! The idle time between frames is down from 0.8ms to 0.66ms now.
parent 7017969f
No related branches found
No related tags found
No related merge requests found
......@@ -54,7 +54,7 @@ ALWAYS_INLINE static inline uint32_t lutInterpolate(const uint16_t *lut, uint32_
return (lut[index] * invAlpha + lut[index + 1] * alpha) >> 8;
}
static inline uint32_t updatePixel(uint32_t icPrev, uint32_t icNext, unsigned n)
static inline uint32_t updatePixel(uint32_t icPrev, uint32_t icNext, unsigned n, int8_t *pResidual)
{
/*
* Update pipeline for one pixel:
......@@ -77,9 +77,6 @@ static inline uint32_t updatePixel(uint32_t icPrev, uint32_t icNext, unsigned n)
iG = lutInterpolate(&buffers.lutCurrent[1 * 256], iG);
iB = lutInterpolate(&buffers.lutCurrent[2 * 256], iB);
// Pointer to the residual buffer for this pixel
int8_t *pResidual = &residual[n * 3];
// Incorporate the residual from last frame
iR += pResidual[0];
iG += pResidual[1];
......@@ -133,7 +130,10 @@ static void updateDrawBuffer(unsigned interpCoefficient)
uint32_t icPrev = 257 * (0x10000 - interpCoefficient);
uint32_t icNext = 257 * interpCoefficient;
for (int i = 0; i < LEDS_PER_STRIP; ++i) {
// Pointer to the residual buffer for this pixel
int8_t *pResidual = residual;
for (int i = 0; i < LEDS_PER_STRIP; ++i, pResidual += 3) {
// Six output words
union {
......@@ -151,7 +151,7 @@ static void updateDrawBuffer(unsigned interpCoefficient)
* This generates fairly efficient code using the UBFX and BFI instructions.
*/
uint32_t p0 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 0);
uint32_t p0 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 0, pResidual + LEDS_PER_STRIP * 3 * 0);
o5.p0d = p0;
o5.p0c = p0 >> 1;
......@@ -178,7 +178,7 @@ static void updateDrawBuffer(unsigned interpCoefficient)
o0.p0b = p0 >> 22;
o0.p0a = p0 >> 23;
uint32_t p1 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 0);
uint32_t p1 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 1, pResidual + LEDS_PER_STRIP * 3 * 1);
o5.p1d = p1;
o5.p1c = p1 >> 1;
......@@ -205,7 +205,7 @@ static void updateDrawBuffer(unsigned interpCoefficient)
o0.p1b = p1 >> 22;
o0.p1a = p1 >> 23;
uint32_t p2 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 0);
uint32_t p2 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 2, pResidual + LEDS_PER_STRIP * 3 * 2);
o5.p2d = p2;
o5.p2c = p2 >> 1;
......@@ -232,7 +232,7 @@ static void updateDrawBuffer(unsigned interpCoefficient)
o0.p2b = p2 >> 22;
o0.p2a = p2 >> 23;
uint32_t p3 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 0);
uint32_t p3 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 3, pResidual + LEDS_PER_STRIP * 3 * 3);
o5.p3d = p3;
o5.p3c = p3 >> 1;
......@@ -259,7 +259,7 @@ static void updateDrawBuffer(unsigned interpCoefficient)
o0.p3b = p3 >> 22;
o0.p3a = p3 >> 23;
uint32_t p4 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 0);
uint32_t p4 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 4, pResidual + LEDS_PER_STRIP * 3 * 4);
o5.p4d = p4;
o5.p4c = p4 >> 1;
......@@ -286,7 +286,7 @@ static void updateDrawBuffer(unsigned interpCoefficient)
o0.p4b = p4 >> 22;
o0.p4a = p4 >> 23;
uint32_t p5 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 0);
uint32_t p5 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 5, pResidual + LEDS_PER_STRIP * 3 * 5);
o5.p5d = p5;
o5.p5c = p5 >> 1;
......@@ -313,7 +313,7 @@ static void updateDrawBuffer(unsigned interpCoefficient)
o0.p5b = p5 >> 22;
o0.p5a = p5 >> 23;
uint32_t p6 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 0);
uint32_t p6 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 6, pResidual + LEDS_PER_STRIP * 3 * 6);
o5.p6d = p6;
o5.p6c = p6 >> 1;
......@@ -340,7 +340,7 @@ static void updateDrawBuffer(unsigned interpCoefficient)
o0.p6b = p6 >> 22;
o0.p6a = p6 >> 23;
uint32_t p7 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 0);
uint32_t p7 = updatePixel(icPrev, icNext, i + LEDS_PER_STRIP * 7, pResidual + LEDS_PER_STRIP * 3 * 7);
o5.p7d = p7;
o5.p7c = p7 >> 1;
......@@ -383,7 +383,7 @@ extern "C" int main()
while (1) {
buffers.handleUSB();
updateDrawBuffer((millis() << 2) & 0xFFFF);
updateDrawBuffer((millis() << 4) & 0xFFFF);
leds.show();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment