Skip to content

Commit

Permalink
HUB75 optimization (double buffer only)
Browse files Browse the repository at this point in the history
In double duffer mode, the screen is blanked at each show(). So we can drop setPixelColor(BLACK) calls until we receive a pixel with different color.
  • Loading branch information
softhack007 committed Aug 7, 2024
1 parent b284464 commit fb2402f
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 1 deletion.
6 changes: 5 additions & 1 deletion wled00/bus_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -503,7 +503,7 @@ BusHub75Matrix::BusHub75Matrix(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWh

_valid = false;
mxconfig.double_buff = false; // default to off, known to cause issue with some effects but needs more memory

isBlack = false;

fourScanPanel = nullptr;

Expand Down Expand Up @@ -671,6 +671,8 @@ BusHub75Matrix::BusHub75Matrix(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWh
}
else {
_valid = true;
display->clearScreen(); // initially clear the screen buffer
isBlack = true;
}

switch(bc.type) {
Expand Down Expand Up @@ -700,6 +702,7 @@ BusHub75Matrix::BusHub75Matrix(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWh

void __attribute__((hot)) BusHub75Matrix::setPixelColor(uint16_t pix, uint32_t c) {
if (!_valid || pix >= _len) return;
if (isBlack && (c == BLACK)) return; // reject black pixels directly after clearScreen()
#ifndef NO_CIE1931
c = unGamma24(c); // to use the driver linear brightness feature, we first need to undo WLED gamma correction
#endif
Expand All @@ -719,6 +722,7 @@ void __attribute__((hot)) BusHub75Matrix::setPixelColor(uint16_t pix, uint32_t
int y = pix / pxwidth;
display->drawPixelRGB888(int16_t(x), int16_t(y), r, g, b);
}
isBlack = false;
}

void BusHub75Matrix::setBrightness(uint8_t b, bool immediate) {
Expand Down
3 changes: 3 additions & 0 deletions wled00/bus_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,7 @@ class BusHub75Matrix : public Bus {
display->flipDMABuffer(); // Show the back buffer, set currently output buffer to the back (i.e. no longer being sent to LED panels)
// while(!previousBufferFree) delay(1); // experimental - Wait before we allow any writing to the buffer. Stop flicker.
display->clearScreen(); // Now clear the back-buffer
isBlack = true;
}
}

Expand All @@ -369,6 +370,7 @@ class BusHub75Matrix : public Bus {
// delete fourScanPanel;
delete display;
_valid = false;
isBlack = false;
}

~BusHub75Matrix() {
Expand All @@ -379,6 +381,7 @@ class BusHub75Matrix : public Bus {
MatrixPanel_I2S_DMA *display = nullptr;
VirtualMatrixPanel *fourScanPanel = nullptr;
HUB75_I2S_CFG mxconfig;
bool isBlack = false;

};
#endif
Expand Down

0 comments on commit fb2402f

Please sign in to comment.