Report memory required in final render dialog.

Fix broken state of ember during failed render with strips.
This commit is contained in:
mfeemster
2014-12-09 00:24:28 -08:00
parent 9263906cb5
commit 3e70b8eec6
10 changed files with 112 additions and 42 deletions

View File

@ -708,10 +708,48 @@ bool FractoriumFinalRenderDialog::SetMemory()
{
if (isVisible() && CreateControllerFromGUI(true))
{
pair<size_t, size_t> p = m_Controller->SyncAndComputeMemory();
bool error = false;
tuple<size_t, size_t, size_t> p = m_Controller->SyncAndComputeMemory();
ui.FinalRenderParamsTable->item(m_MemoryCellIndex, 1)->setText(ToString(get<1>(p)));
ui.FinalRenderParamsTable->item(m_ItersCellIndex, 1)->setText(ToString(get<2>(p)));
if (OpenCL())
{
if (!m_Wrapper.Ok() || PlatformIndex() != m_Wrapper.PlatformIndex() || DeviceIndex() != m_Wrapper.DeviceIndex())
m_Wrapper.Init(PlatformIndex(), DeviceIndex());
if (m_Wrapper.Ok())
{
size_t histSize = get<0>(p);
size_t totalSize = get<1>(p);
size_t maxAlloc = m_Wrapper.MaxAllocSize();
size_t totalAvail = m_Wrapper.GlobalMemSize();
QString s;
if (histSize > maxAlloc)
{
s = "Histogram/Accumulator memory size of " + ToString(histSize) +
" is greater than the max OpenCL allocation size of " + ToString(maxAlloc);
}
if (totalSize > totalAvail)
{
s += "\n\nTotal required memory size of " + ToString(totalSize) +
" is greater than the max OpenCL available memory of " + ToString(totalAvail);
}
if (!s.isEmpty())
{
error = true;
ui.FinalRenderTextOutput->setText(s + ".\n\nRendering will most likely fail.");
}
}
}
if (!error)
ui.FinalRenderTextOutput->clear();
ui.FinalRenderParamsTable->item(m_MemoryCellIndex, 1)->setText(ToString(p.first));
ui.FinalRenderParamsTable->item(m_ItersCellIndex, 1)->setText(ToString(p.second));
return true;
}

View File

@ -151,8 +151,9 @@ FinalRenderEmberController<T>::FinalRenderEmberController(FractoriumFinalRenderD
{
m_Run = true;
m_TotalTimer.Tic();//Begin timing for progress of all operations.
size_t i;
m_GuiState = m_FinalRenderDialog->State();//Cache render settings from the GUI before running.
size_t i;
bool doAll = m_GuiState.m_DoAll && m_EmberFile.Size() > 1;
uint currentStripForProgress = 0;//Sort of a hack to get the strip value to the progress function.
QString path = doAll ? ComposePath(QString::fromStdString(m_EmberFile.m_Embers[0].m_Name)) : ComposePath(Name());
@ -566,8 +567,9 @@ void FinalRenderEmberController<T>::ResetProgress(bool total)
/// </summary>
/// <returns>If successful, memory required in bytes, else zero.</returns>
template <typename T>
pair<size_t, size_t> FinalRenderEmberController<T>::SyncAndComputeMemory()
tuple<size_t, size_t, size_t> FinalRenderEmberController<T>::SyncAndComputeMemory()
{
size_t iterCount;
pair<size_t, size_t> p(0, 0);
if (m_Renderer.get())
@ -587,11 +589,12 @@ pair<size_t, size_t> FinalRenderEmberController<T>::SyncAndComputeMemory()
m_Renderer->ComputeCamera();
CancelPreviewRender();
m_FinalPreviewRenderFunc();
p.first = m_Renderer->MemoryRequired(m_FinalRenderDialog->Strips(), true);
p.second = m_Renderer->TotalIterCount(strips);
p = m_Renderer->MemoryRequired(strips, true);
iterCount = m_Renderer->TotalIterCount(strips);
}
return p;
return tuple<size_t, size_t, size_t>(p.first, p.second, iterCount);
}
/// <summary>

View File

@ -63,7 +63,7 @@ public:
virtual void SyncGuiToEmbers(size_t widthOverride = 0, size_t heightOverride = 0) { }
virtual void SyncCurrentToSizeSpinners(bool scale, bool size) { }
virtual void ResetProgress(bool total = true) { }
virtual pair<size_t, size_t> SyncAndComputeMemory() { return pair<size_t, size_t>(0, 0); }
virtual tuple<size_t, size_t, size_t> SyncAndComputeMemory() { return tuple<size_t, size_t, size_t>(0, 0, 0); }
virtual double OriginalAspect() { return 1; }
virtual QString ComposePath(const QString& name) { return ""; }
@ -121,7 +121,7 @@ public:
virtual void SyncGuiToEmbers(size_t widthOverride = 0, size_t heightOverride = 0) override;
virtual void SyncCurrentToSizeSpinners(bool scale, bool size) override;
virtual void ResetProgress(bool total = true) override;
virtual pair<size_t, size_t> SyncAndComputeMemory() override;
virtual tuple<size_t, size_t, size_t> SyncAndComputeMemory() override;
virtual double OriginalAspect() override { return double(m_Ember->m_OrigFinalRasW) / m_Ember->m_OrigFinalRasH; }
virtual QString Name() const override { return QString::fromStdString(m_Ember->m_Name); }
virtual QString ComposePath(const QString& name) override;