mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2025-09-05 22:57:51 -04:00
Reduce glTexSubImage2D calls
- far less texture update calls for high speed waterfall rates
This commit is contained in:
parent
67c184262a
commit
c200048bf7
@ -91,15 +91,46 @@ void WaterfallPanel::step() {
|
|||||||
waterfall_slice[i] = (unsigned char) floor(wv * 255.0);
|
waterfall_slice[i] = (unsigned char) floor(wv * 255.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int newBufSize = (half_fft_size*lines_buffered+half_fft_size);
|
||||||
|
if (lineBuffer[j].size() < newBufSize) {
|
||||||
|
lineBuffer[j].resize(newBufSize);
|
||||||
|
rLineBuffer[j].resize(newBufSize);
|
||||||
|
}
|
||||||
|
memcpy(&(lineBuffer[j][half_fft_size*lines_buffered]), waterfall_slice, sizeof(unsigned char) * half_fft_size);
|
||||||
|
}
|
||||||
|
lines_buffered++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void WaterfallPanel::update() {
|
||||||
|
int half_fft_size = fft_size / 2;
|
||||||
|
|
||||||
|
for (int i = 0; i < lines_buffered; i++) {
|
||||||
|
for (int j = 0; j < 2; j++) {
|
||||||
|
memcpy(&(rLineBuffer[j][i*half_fft_size]),
|
||||||
|
&(lineBuffer[j][((lines_buffered-1)*half_fft_size)-(i*half_fft_size)]), sizeof(unsigned char) * half_fft_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int run_ofs = 0;
|
||||||
|
while (lines_buffered) {
|
||||||
|
int run_lines = lines_buffered;
|
||||||
|
if (run_lines > waterfall_ofs[0]) {
|
||||||
|
run_lines = waterfall_ofs[0];
|
||||||
|
}
|
||||||
|
for (int j = 0; j < 2; j++) {
|
||||||
glBindTexture(GL_TEXTURE_2D, waterfall[j]);
|
glBindTexture(GL_TEXTURE_2D, waterfall[j]);
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, waterfall_ofs[j], half_fft_size, 1, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, (GLvoid *) waterfall_slice);
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, waterfall_ofs[j]-run_lines, half_fft_size, run_lines,
|
||||||
|
GL_COLOR_INDEX, GL_UNSIGNED_BYTE, (GLvoid *) &(rLineBuffer[j][run_ofs]));
|
||||||
|
|
||||||
|
waterfall_ofs[j]-=run_lines;
|
||||||
|
|
||||||
if (waterfall_ofs[j] == 0) {
|
if (waterfall_ofs[j] == 0) {
|
||||||
waterfall_ofs[j] = waterfall_lines;
|
waterfall_ofs[j] = waterfall_lines;
|
||||||
}
|
}
|
||||||
|
|
||||||
waterfall_ofs[j]--;
|
|
||||||
}
|
}
|
||||||
|
run_ofs += run_lines*half_fft_size;
|
||||||
|
lines_buffered-=run_lines;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ public:
|
|||||||
void refreshTheme();
|
void refreshTheme();
|
||||||
void setPoints(std::vector<float> &points);
|
void setPoints(std::vector<float> &points);
|
||||||
void step();
|
void step();
|
||||||
|
void update();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void drawPanelContents();
|
void drawPanelContents();
|
||||||
@ -21,6 +22,9 @@ private:
|
|||||||
int fft_size;
|
int fft_size;
|
||||||
int waterfall_lines;
|
int waterfall_lines;
|
||||||
unsigned char *waterfall_slice;
|
unsigned char *waterfall_slice;
|
||||||
|
std::vector<unsigned char> lineBuffer[2];
|
||||||
|
std::vector<unsigned char> rLineBuffer[2];
|
||||||
|
int lines_buffered;
|
||||||
|
|
||||||
ColorTheme *activeTheme;
|
ColorTheme *activeTheme;
|
||||||
};
|
};
|
||||||
|
@ -100,6 +100,7 @@ void WaterfallCanvas::processInputQueue() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
waterfallPanel.update();
|
||||||
tex_update.unlock();
|
tex_update.unlock();
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user