From 624e45afa86702ed2a34d1435987c94dcfa9f747 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 8 Sep 2023 01:19:48 -0500 Subject: [PATCH] optimize renderSamples only render sample which has changed --- src/engine/engine.cpp | 14 +++++++++----- src/engine/engine.h | 8 ++++++-- src/gui/doAction.cpp | 28 ++++++++++++++-------------- src/gui/gui.cpp | 2 +- src/gui/sampleEdit.cpp | 36 +++++++++++++++--------------------- 5 files changed, 45 insertions(+), 43 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 86eebfa31..5bbcff1eb 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -396,13 +396,13 @@ int DivEngine::loadSampleROMs() { return error; } -void DivEngine::renderSamplesP() { +void DivEngine::renderSamplesP(int whichSample) { BUSY_BEGIN; - renderSamples(); + renderSamples(whichSample); BUSY_END; } -void DivEngine::renderSamples() { +void DivEngine::renderSamples(int whichSample) { sPreview.sample=-1; sPreview.pos=0; sPreview.dir=false; @@ -418,8 +418,12 @@ void DivEngine::renderSamples() { } // step 1: render samples - for (int i=0; irender(formatMask); + if (whichSample==-1) { + for (int i=0; irender(formatMask); + } + } else if (whichSample>=0 && whichSamplerender(formatMask); } // step 2: render samples to dispatch diff --git a/src/engine/engine.h b/src/engine/engine.h index ff7437c6e..c1b760bdf 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -1064,10 +1064,14 @@ class DivEngine { unsigned int getSampleFormatMask(); // UNSAFE render samples - only execute when locked - void renderSamples(); + void renderSamples(int whichSample=-1); // public render samples - void renderSamplesP(); + // values for whichSample + // -2: don't render anything - just update chip sample memory + // -1: render all samples + // >=0: render specific sample + void renderSamplesP(int whichSample=-1); // public swap channels void swapChannelsP(int src, int dest); diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 1b4402c77..ebb26cac9 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -919,7 +919,7 @@ void FurnaceGUI::doAction(int what) { sample->strip(start,end); updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); sampleSelStart=-1; sampleSelEnd=-1; @@ -965,7 +965,7 @@ void FurnaceGUI::doAction(int what) { memcpy(&(sample->data16[pos]),sampleClipboard,sizeof(short)*sampleClipboardLen); } } - e->renderSamples(); + e->renderSamples(curSample); }); sampleSelStart=pos; sampleSelEnd=pos+sampleClipboardLen; @@ -995,7 +995,7 @@ void FurnaceGUI::doAction(int what) { sample->data16[pos+i]=sampleClipboard[i]; } } - e->renderSamples(); + e->renderSamples(curSample); }); sampleSelStart=pos; sampleSelEnd=pos+sampleClipboardLen; @@ -1032,7 +1032,7 @@ void FurnaceGUI::doAction(int what) { sample->data16[pos+i]=val; } } - e->renderSamples(); + e->renderSamples(curSample); }); sampleSelStart=pos; sampleSelEnd=pos+sampleClipboardLen; @@ -1104,7 +1104,7 @@ void FurnaceGUI::doAction(int what) { updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); MARK_MODIFIED; break; @@ -1135,7 +1135,7 @@ void FurnaceGUI::doAction(int what) { updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); MARK_MODIFIED; break; @@ -1166,7 +1166,7 @@ void FurnaceGUI::doAction(int what) { updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); MARK_MODIFIED; break; @@ -1195,7 +1195,7 @@ void FurnaceGUI::doAction(int what) { updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); MARK_MODIFIED; break; @@ -1211,7 +1211,7 @@ void FurnaceGUI::doAction(int what) { sample->strip(start,end); updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); sampleSelStart=-1; sampleSelEnd=-1; @@ -1229,7 +1229,7 @@ void FurnaceGUI::doAction(int what) { sample->trim(start,end); updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); sampleSelStart=-1; sampleSelEnd=-1; @@ -1264,7 +1264,7 @@ void FurnaceGUI::doAction(int what) { updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); MARK_MODIFIED; break; @@ -1291,7 +1291,7 @@ void FurnaceGUI::doAction(int what) { updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); MARK_MODIFIED; break; @@ -1316,7 +1316,7 @@ void FurnaceGUI::doAction(int what) { updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); MARK_MODIFIED; break; @@ -1441,7 +1441,7 @@ void FurnaceGUI::doAction(int what) { sample->loop=true; updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); MARK_MODIFIED; break; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 30ddd43c9..176e99a02 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3254,7 +3254,7 @@ void FurnaceGUI::pointUp(int x, int y, int button) { if (sampleDragActive) { logD("stopping sample drag"); if (sampleDragMode) { - e->renderSamplesP(); + e->renderSamplesP(curSample); } else { if (sampleSelStart>sampleSelEnd) { sampleSelStart^=sampleSelEnd; diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index 43e53618f..20fe69960 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -432,7 +432,7 @@ void FurnaceGUI::drawSampleEdit() { } updateSampleTex=true; if (e->getSampleFormatMask()&(1U<renderSamplesP(); + e->renderSamplesP(curSample); } } popWarningColor(); @@ -462,7 +462,7 @@ void FurnaceGUI::drawSampleEdit() { sample->prepareUndo(true); e->lockEngine([this,sample,i]() { sample->convert((DivSampleDepth)i); - e->renderSamples(); + e->renderSamples(curSample); }); updateSampleTex=true; MARK_MODIFIED; @@ -483,7 +483,7 @@ void FurnaceGUI::drawSampleEdit() { if (ImGui::Checkbox("BRR emphasis",&be)) { sample->prepareUndo(true); sample->brrEmphasis=be; - e->renderSamplesP(); + e->renderSamplesP(curSample); updateSampleTex=true; MARK_MODIFIED; } @@ -500,7 +500,7 @@ void FurnaceGUI::drawSampleEdit() { if (ImGui::Checkbox("8-bit dither",&di)) { sample->prepareUndo(true); sample->dither=di; - e->renderSamplesP(); + e->renderSamplesP(curSample); updateSampleTex=true; MARK_MODIFIED; } @@ -631,7 +631,7 @@ void FurnaceGUI::drawSampleEdit() { if (ImGui::Selectable(sampleLoopModes[i])) { sample->prepareUndo(true); sample->loopMode=(DivSampleLoopMode)i; - e->renderSamplesP(); + e->renderSamplesP(curSample); updateSampleTex=true; MARK_MODIFIED; } @@ -657,7 +657,7 @@ void FurnaceGUI::drawSampleEdit() { } updateSampleTex=true; if (e->getSampleFormatMask()&(1U<renderSamplesP(); + e->renderSamplesP(curSample); } } if (ImGui::IsItemActive()) { @@ -683,7 +683,7 @@ void FurnaceGUI::drawSampleEdit() { } updateSampleTex=true; if (e->getSampleFormatMask()&(1U<renderSamplesP(); + e->renderSamplesP(curSample); } } if (ImGui::IsItemActive()) { @@ -752,7 +752,7 @@ void FurnaceGUI::drawSampleEdit() { ImGui::PushStyleColor(ImGuiCol_CheckMark,baseColor); if (ImGui::Checkbox(id,&sample->renderOn[i][j])) { - e->renderSamplesP(); + e->renderSamplesP(curSample); } ImGui::PopStyleColor(4); @@ -795,12 +795,6 @@ void FurnaceGUI::drawSampleEdit() { ImGui::EndTable(); } - /* - if (ImGui::Button("Apply")) { - e->renderSamplesP(); - } - ImGui::SameLine(); - */ ImGui::Separator(); pushToggleColors(!sampleDragMode); @@ -846,7 +840,7 @@ void FurnaceGUI::drawSampleEdit() { if (!sample->resize(resizeSize)) { showError("couldn't resize! make sure your sample is 8 or 16-bit."); } - e->renderSamples(); + e->renderSamples(curSample); }); updateSampleTex=true; sampleSelStart=-1; @@ -901,7 +895,7 @@ void FurnaceGUI::drawSampleEdit() { if (!sample->resample(targetRate,resampleTarget,resampleStrat)) { showError("couldn't resample! make sure your sample is 8 or 16-bit."); } - e->renderSamples(); + e->renderSamples(curSample); }); updateSampleTex=true; sampleSelStart=-1; @@ -972,7 +966,7 @@ void FurnaceGUI::drawSampleEdit() { updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); MARK_MODIFIED; ImGui::CloseCurrentPopup(); @@ -1021,7 +1015,7 @@ void FurnaceGUI::drawSampleEdit() { if (!sample->insert(pos,silenceSize)) { showError("couldn't insert! make sure your sample is 8 or 16-bit."); } - e->renderSamples(); + e->renderSamples(curSample); }); updateSampleTex=true; sampleSelStart=pos; @@ -1182,7 +1176,7 @@ void FurnaceGUI::drawSampleEdit() { updateSampleTex=true; - e->renderSamples(); + e->renderSamples(curSample); }); MARK_MODIFIED; ImGui::CloseCurrentPopup(); @@ -1869,7 +1863,7 @@ void FurnaceGUI::doUndoSample() { DivSample* sample=e->song.sample[curSample]; e->lockEngine([this,sample]() { if (sample->undo()==2) { - e->renderSamples(); + e->renderSamples(curSample); updateSampleTex=true; } }); @@ -1881,7 +1875,7 @@ void FurnaceGUI::doRedoSample() { DivSample* sample=e->song.sample[curSample]; e->lockEngine([this,sample]() { if (sample->redo()==2) { - e->renderSamples(); + e->renderSamples(curSample); updateSampleTex=true; } });