From 6c9d9e57ccadd867e3e4722e15f765b8ffda1617 Mon Sep 17 00:00:00 2001 From: Person Date: Mon, 7 Aug 2017 19:53:13 -0700 Subject: [PATCH] Bug fixes: --Disallow the use of synth when randomly generating xforms if the user has an Nvidia device present on their system. Code changes: --Use some CPU defines in CL code. --Change curves color scaling buffer to be 2^16 per channel instead of 2^17 which was probably overkill. --Code in RendererClDevice::Init() to detect Nvidia was wrong even thought it technically worked. --- Source/Ember/EmberDefines.h | 6 +++--- Source/EmberCL/EmberCLStructs.h | 4 ++-- Source/EmberCL/RendererCL.cpp | 14 ++++++++++++++ Source/EmberCL/RendererCL.h | 2 ++ Source/EmberCL/RendererClDevice.cpp | 2 +- Source/Fractorium/FractoriumMenus.cpp | 19 ++++++++++++++++++- 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/Source/Ember/EmberDefines.h b/Source/Ember/EmberDefines.h index 5a6f80e..75114ab 100644 --- a/Source/Ember/EmberDefines.h +++ b/Source/Ember/EmberDefines.h @@ -68,9 +68,9 @@ namespace EmberNs #define TMAX std::numeric_limits::max() #define FLOAT_MAX_TAN 8388607.0f #define FLOAT_MIN_TAN -FLOAT_MAX_TAN -#define CURVES_LENGTH 131072 -#define CURVES_LENGTH_M1 131071.0f -#define ONE_OVER_CURVES_LENGTH_M1 7.62945273935e-6f +#define CURVES_LENGTH 65536 +#define CURVES_LENGTH_M1 65535.0f +#define ONE_OVER_CURVES_LENGTH_M1 1.525902189669e-5f #define EMPTYFIELD -9999 typedef std::chrono::high_resolution_clock Clock; typedef std::chrono::duration> DoubleMs; diff --git a/Source/EmberCL/EmberCLStructs.h b/Source/EmberCL/EmberCLStructs.h index e8f1437..63f839f 100644 --- a/Source/EmberCL/EmberCLStructs.h +++ b/Source/EmberCL/EmberCLStructs.h @@ -85,8 +85,8 @@ static string ConstantDefinesString(bool doublePrecision) "#define SQRT5 2.2360679774997896964091736687313\n" "#define M_PHI 1.61803398874989484820458683436563\n" "#define DEG_2_RAD (MPI / 180)\n" - "#define CURVES_LENGTH_M1 131071.0f\n" - "#define ONE_OVER_CURVES_LENGTH_M1 7.62945273935e-6f\n" + "#define CURVES_LENGTH_M1 ((real_bucket_t)" << CURVES_LENGTH_M1 << ")\n" << + "#define ONE_OVER_CURVES_LENGTH_M1 ((real_bucket_t)" << ONE_OVER_CURVES_LENGTH_M1 << ")\n" << "\n" "//Index in each dimension of a thread within a block.\n" "#define THREAD_ID_X (get_local_id(0))\n" diff --git a/Source/EmberCL/RendererCL.cpp b/Source/EmberCL/RendererCL.cpp index 19f942d..c3ce654 100644 --- a/Source/EmberCL/RendererCL.cpp +++ b/Source/EmberCL/RendererCL.cpp @@ -630,6 +630,20 @@ bool RendererCL::RandVec(vector>& ran return b; } +/// +/// Get whether any devices are from Nvidia. +/// +/// True if an devices are from Nvidia, else false. +template +bool RendererCL::AnyNvidia() const +{ + for (auto& dev : m_Devices) + if (dev->Nvidia()) + return true; + + return false; +} + /// /// Protected virtual functions overridden from Renderer. /// diff --git a/Source/EmberCL/RendererCL.h b/Source/EmberCL/RendererCL.h index 8114c29..8ac17c4 100644 --- a/Source/EmberCL/RendererCL.h +++ b/Source/EmberCL/RendererCL.h @@ -21,6 +21,7 @@ public: virtual ~RendererCLBase() { } virtual bool ReadFinal(v4F* pixels) = 0; virtual bool ClearFinal() = 0; + virtual bool AnyNvidia() const = 0; }; /// @@ -154,6 +155,7 @@ public: virtual string ErrorReportString() override; virtual vector ErrorReport() override; virtual bool RandVec(vector>& randVec) override; + virtual bool AnyNvidia() const override; #ifndef TEST_CL protected: diff --git a/Source/EmberCL/RendererClDevice.cpp b/Source/EmberCL/RendererClDevice.cpp index c199566..fb3e27b 100644 --- a/Source/EmberCL/RendererClDevice.cpp +++ b/Source/EmberCL/RendererClDevice.cpp @@ -40,7 +40,7 @@ bool RendererClDevice::Init() if (b && m_Wrapper.Ok() && !m_Init) { - m_NVidia = ToLower(m_Info->PlatformName(m_PlatformIndex)).find_first_of("nvidia") != string::npos && m_Wrapper.LocalMemSize() > (32 * 1024); + m_NVidia = Find(ToLower(m_Info->PlatformName(m_PlatformIndex)), "nvidia") && m_Wrapper.LocalMemSize() > (32 * 1024); m_WarpSize = m_NVidia ? 32 : 64; m_Init = true; } diff --git a/Source/Fractorium/FractoriumMenus.cpp b/Source/Fractorium/FractoriumMenus.cpp index 7144c86..71d5bcc 100644 --- a/Source/Fractorium/FractoriumMenus.cpp +++ b/Source/Fractorium/FractoriumMenus.cpp @@ -53,14 +53,31 @@ void Fractorium::InitMenusUI() template void FractoriumEmberController::NewFlock(size_t count) { + bool nv = false; Ember ember; StopAllPreviewRenderers(); m_EmberFile.Clear(); m_EmberFile.m_Filename = EmberFile::DefaultFilename(); + vector filteredVariations; + vector& filteredVariationsRef = m_FilteredVariations; + auto& deviceNames = OpenCLInfo::Instance()->AllDeviceNames(); + + for (auto& dev : deviceNames) + if (Find(ToLower(dev), "nvidia")) + nv = true; + + if (nv)//Nvidia cannot handle synth. It takes over a minute to compile and uses about 4GB of memory. + { + filteredVariations = m_FilteredVariations; + filteredVariationsRef = filteredVariations; + std::remove(filteredVariations.begin(), filteredVariations.end(), eVariationId::VAR_SYNTH); + std::remove(filteredVariations.begin(), filteredVariations.end(), eVariationId::VAR_PRE_SYNTH); + std::remove(filteredVariations.begin(), filteredVariations.end(), eVariationId::VAR_POST_SYNTH); + } for (size_t i = 0; i < count; i++) { - m_SheepTools->Random(ember, m_FilteredVariations, static_cast(QTIsaac::LockedFrand(-2, 2)), 0, MAX_CL_VARS); + m_SheepTools->Random(ember, filteredVariationsRef, static_cast(QTIsaac::LockedFrand(-2, 2)), 0, MAX_CL_VARS); ParamsToEmber(ember); ember.m_Index = i; ember.m_Name = m_EmberFile.m_Filename.toStdString() + "_" + ToString(i + 1ULL).toStdString();