mirror of
https://bitbucket.org/mfeemster/fractorium.git
synced 2025-02-08 05:50:07 -05:00
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.
This commit is contained in:
parent
a0ed758999
commit
6c9d9e57cc
@ -68,9 +68,9 @@ namespace EmberNs
|
|||||||
#define TMAX std::numeric_limits<T>::max()
|
#define TMAX std::numeric_limits<T>::max()
|
||||||
#define FLOAT_MAX_TAN 8388607.0f
|
#define FLOAT_MAX_TAN 8388607.0f
|
||||||
#define FLOAT_MIN_TAN -FLOAT_MAX_TAN
|
#define FLOAT_MIN_TAN -FLOAT_MAX_TAN
|
||||||
#define CURVES_LENGTH 131072
|
#define CURVES_LENGTH 65536
|
||||||
#define CURVES_LENGTH_M1 131071.0f
|
#define CURVES_LENGTH_M1 65535.0f
|
||||||
#define ONE_OVER_CURVES_LENGTH_M1 7.62945273935e-6f
|
#define ONE_OVER_CURVES_LENGTH_M1 1.525902189669e-5f
|
||||||
#define EMPTYFIELD -9999
|
#define EMPTYFIELD -9999
|
||||||
typedef std::chrono::high_resolution_clock Clock;
|
typedef std::chrono::high_resolution_clock Clock;
|
||||||
typedef std::chrono::duration<double, std::ratio<1, 1000>> DoubleMs;
|
typedef std::chrono::duration<double, std::ratio<1, 1000>> DoubleMs;
|
||||||
|
@ -85,8 +85,8 @@ static string ConstantDefinesString(bool doublePrecision)
|
|||||||
"#define SQRT5 2.2360679774997896964091736687313\n"
|
"#define SQRT5 2.2360679774997896964091736687313\n"
|
||||||
"#define M_PHI 1.61803398874989484820458683436563\n"
|
"#define M_PHI 1.61803398874989484820458683436563\n"
|
||||||
"#define DEG_2_RAD (MPI / 180)\n"
|
"#define DEG_2_RAD (MPI / 180)\n"
|
||||||
"#define CURVES_LENGTH_M1 131071.0f\n"
|
"#define CURVES_LENGTH_M1 ((real_bucket_t)" << CURVES_LENGTH_M1 << ")\n" <<
|
||||||
"#define ONE_OVER_CURVES_LENGTH_M1 7.62945273935e-6f\n"
|
"#define ONE_OVER_CURVES_LENGTH_M1 ((real_bucket_t)" << ONE_OVER_CURVES_LENGTH_M1 << ")\n" <<
|
||||||
"\n"
|
"\n"
|
||||||
"//Index in each dimension of a thread within a block.\n"
|
"//Index in each dimension of a thread within a block.\n"
|
||||||
"#define THREAD_ID_X (get_local_id(0))\n"
|
"#define THREAD_ID_X (get_local_id(0))\n"
|
||||||
|
@ -630,6 +630,20 @@ bool RendererCL<T, bucketT>::RandVec(vector<QTIsaac<ISAAC_SIZE, ISAAC_INT>>& ran
|
|||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get whether any devices are from Nvidia.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if an devices are from Nvidia, else false.</returns>
|
||||||
|
template <typename T, typename bucketT>
|
||||||
|
bool RendererCL<T, bucketT>::AnyNvidia() const
|
||||||
|
{
|
||||||
|
for (auto& dev : m_Devices)
|
||||||
|
if (dev->Nvidia())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Protected virtual functions overridden from Renderer.
|
/// Protected virtual functions overridden from Renderer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -21,6 +21,7 @@ public:
|
|||||||
virtual ~RendererCLBase() { }
|
virtual ~RendererCLBase() { }
|
||||||
virtual bool ReadFinal(v4F* pixels) = 0;
|
virtual bool ReadFinal(v4F* pixels) = 0;
|
||||||
virtual bool ClearFinal() = 0;
|
virtual bool ClearFinal() = 0;
|
||||||
|
virtual bool AnyNvidia() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -154,6 +155,7 @@ public:
|
|||||||
virtual string ErrorReportString() override;
|
virtual string ErrorReportString() override;
|
||||||
virtual vector<string> ErrorReport() override;
|
virtual vector<string> ErrorReport() override;
|
||||||
virtual bool RandVec(vector<QTIsaac<ISAAC_SIZE, ISAAC_INT>>& randVec) override;
|
virtual bool RandVec(vector<QTIsaac<ISAAC_SIZE, ISAAC_INT>>& randVec) override;
|
||||||
|
virtual bool AnyNvidia() const override;
|
||||||
|
|
||||||
#ifndef TEST_CL
|
#ifndef TEST_CL
|
||||||
protected:
|
protected:
|
||||||
|
@ -40,7 +40,7 @@ bool RendererClDevice::Init()
|
|||||||
|
|
||||||
if (b && m_Wrapper.Ok() && !m_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_WarpSize = m_NVidia ? 32 : 64;
|
||||||
m_Init = true;
|
m_Init = true;
|
||||||
}
|
}
|
||||||
|
@ -53,14 +53,31 @@ void Fractorium::InitMenusUI()
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
void FractoriumEmberController<T>::NewFlock(size_t count)
|
void FractoriumEmberController<T>::NewFlock(size_t count)
|
||||||
{
|
{
|
||||||
|
bool nv = false;
|
||||||
Ember<T> ember;
|
Ember<T> ember;
|
||||||
StopAllPreviewRenderers();
|
StopAllPreviewRenderers();
|
||||||
m_EmberFile.Clear();
|
m_EmberFile.Clear();
|
||||||
m_EmberFile.m_Filename = EmberFile<T>::DefaultFilename();
|
m_EmberFile.m_Filename = EmberFile<T>::DefaultFilename();
|
||||||
|
vector<eVariationId> filteredVariations;
|
||||||
|
vector<eVariationId>& 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++)
|
for (size_t i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
m_SheepTools->Random(ember, m_FilteredVariations, static_cast<intmax_t>(QTIsaac<ISAAC_SIZE, ISAAC_INT>::LockedFrand<T>(-2, 2)), 0, MAX_CL_VARS);
|
m_SheepTools->Random(ember, filteredVariationsRef, static_cast<intmax_t>(QTIsaac<ISAAC_SIZE, ISAAC_INT>::LockedFrand<T>(-2, 2)), 0, MAX_CL_VARS);
|
||||||
ParamsToEmber(ember);
|
ParamsToEmber(ember);
|
||||||
ember.m_Index = i;
|
ember.m_Index = i;
|
||||||
ember.m_Name = m_EmberFile.m_Filename.toStdString() + "_" + ToString(i + 1ULL).toStdString();
|
ember.m_Name = m_EmberFile.m_Filename.toStdString() + "_" + ToString(i + 1ULL).toStdString();
|
||||||
|
Loading…
Reference in New Issue
Block a user