mirror of
https://bitbucket.org/mfeemster/fractorium.git
synced 2025-07-01 13:56:06 -04:00
Report memory required in final render dialog.
Fix broken state of ember during failed render with strips.
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user