diff --git a/Source/Ember/Variations01.h b/Source/Ember/Variations01.h index 8f8e339..20b5b63 100644 --- a/Source/Ember/Variations01.h +++ b/Source/Ember/Variations01.h @@ -2096,8 +2096,8 @@ protected: m_Params.clear(); m_Params.push_back(ParamWithName(&m_Slices, prefix + "pie_slices", 6, INTEGER_NONZERO, 1)); - m_Params.push_back(ParamWithName(&m_Rotation, prefix + "pie_rotation", T(0.5), REAL_CYCLIC, 0, M_2PI)); - m_Params.push_back(ParamWithName(&m_Thickness, prefix + "pie_thickness", T(0.5), REAL, 0, 1)); + m_Params.push_back(ParamWithName(&m_Rotation, prefix + "pie_rotation", T(0.5), REAL_CYCLIC, 0, M_2PI)); + m_Params.push_back(ParamWithName(&m_Thickness, prefix + "pie_thickness", T(0.5), REAL, 0, 1)); } private: diff --git a/Source/Ember/Variations03.h b/Source/Ember/Variations03.h index e6fc388..20f1fc1 100644 --- a/Source/Ember/Variations03.h +++ b/Source/Ember/Variations03.h @@ -528,7 +528,7 @@ public: return "void GlynnSim1Circle(__constant real_t* radius1, __constant real_t* thickness, __constant real_t* x1, __constant real_t* y1, uint2* mwc, real_t* x, real_t* y)\n" "{\n" - " real_t r = *radius1 * (*thickness + (T(1.0) - *thickness) * MwcNext01(mwc));\n" + " real_t r = *radius1 * (*thickness + ((real_t)(1.0) - *thickness) * MwcNext01(mwc));\n" " real_t phi = M_2PI * MwcNext01(mwc);\n" " real_t sinPhi = sin(phi);\n" " real_t cosPhi = cos(phi);\n" diff --git a/Source/Ember/Variations05.h b/Source/Ember/Variations05.h index 4a678af..624f692 100644 --- a/Source/Ember/Variations05.h +++ b/Source/Ember/Variations05.h @@ -485,8 +485,8 @@ public: "\n" "void CircleTrans1Trans(real_t a, real_t b, real_t x, real_t y, real_t* x1, real_t* y1)\n" "{\n" - " *x1 = (x - a) * T(0.5) + a;\n" - " *y1 = (y - b) * T(0.5) + b;\n" + " *x1 = (x - a) * (real_t)(0.5) + a;\n" + " *y1 = (y - b) * (real_t)(0.5) + b;\n" "}\n" "\n" "void CircleTrans1CircleR(real_t mx, real_t my, real_t sc, real_t seed, real_t dens, real_t* ux, real_t* vy, uint2* mwc)\n" @@ -498,10 +498,10 @@ public: " {\n" " x = fabs(mx) * (1 - 2 * MwcNext01(mwc));\n" " y = fabs(my) * (1 - 2 * MwcNext01(mwc));\n" - " m = (int)floor(T(0.5) * x / sc);\n" - " n = (int)floor(T(0.5) * y / sc);\n" + " m = (int)floor((real_t)(0.5) * x / sc);\n" + " n = (int)floor((real_t)(0.5) * y / sc);\n" " alpha = M_2PI * MwcNext01(mwc);\n" - " u = T(0.3) + T(0.7) * CircleTrans1DiscreteNoise2(m + 10, n + 3);\n" + " u = (real_t)(0.3) + (real_t)(0.7) * CircleTrans1DiscreteNoise2(m + 10, n + 3);\n" " x = u * cos(alpha);\n" " y = u * sin(alpha);\n" "\n" diff --git a/Source/EmberCL/OpenCLWrapper.cpp b/Source/EmberCL/OpenCLWrapper.cpp index 6dee6f8..4135bc6 100644 --- a/Source/EmberCL/OpenCLWrapper.cpp +++ b/Source/EmberCL/OpenCLWrapper.cpp @@ -1130,7 +1130,6 @@ uint OpenCLWrapper::DeviceIndex() const { return m_DeviceIndex; } size_t OpenCLWrapper::GlobalMemSize() const { return GetInfo(PlatformIndex(), DeviceIndex(), CL_DEVICE_GLOBAL_MEM_SIZE); } uint OpenCLWrapper::LocalMemSize() const { return m_LocalMemSize; } size_t OpenCLWrapper::MaxAllocSize() const { return GetInfo(PlatformIndex(), DeviceIndex(), CL_DEVICE_MAX_MEM_ALLOC_SIZE); } -std::vector OpenCLWrapper::ProgramBuildErrors() const { return m_programBuildErrors; } /// /// Makes the even grid dims. @@ -1243,9 +1242,11 @@ bool OpenCLWrapper::CreateSPK(const string& name, const string& program, const s if (CheckCL(err, "cl::Kernel()")) return true;//Everything is ok. - } else { - for (std::vector::iterator i = m_DeviceVec.begin(); i != m_DeviceVec.end(); ++ i ) - m_programBuildErrors.push_back(spk.m_Program.getBuildInfo(*i)); + } + else + { + for (auto& i : m_DeviceVec) + m_ErrorReport.push_back(spk.m_Program.getBuildInfo(i)); } } diff --git a/Source/EmberCL/OpenCLWrapper.h b/Source/EmberCL/OpenCLWrapper.h index d7049fc..a0c6d58 100644 --- a/Source/EmberCL/OpenCLWrapper.h +++ b/Source/EmberCL/OpenCLWrapper.h @@ -218,6 +218,5 @@ private: std::vector m_Buffers; std::vector m_Images; std::vector m_GLImages; - std::vector m_programBuildErrors; }; } diff --git a/Source/EmberCL/RendererCL.cpp b/Source/EmberCL/RendererCL.cpp index 5449538..a6da5a4 100644 --- a/Source/EmberCL/RendererCL.cpp +++ b/Source/EmberCL/RendererCL.cpp @@ -501,8 +501,8 @@ string RendererCL::ErrorReportString() template vector RendererCL::ErrorReport() { - vector ours = EmberReport::ErrorReport(); - vector wrappers = m_Wrapper.ErrorReport(); + auto ours = EmberReport::ErrorReport(); + auto wrappers = m_Wrapper.ErrorReport(); ours.insert(ours.end(), wrappers.begin(), wrappers.end()); return ours; @@ -759,12 +759,7 @@ bool RendererCL::BuildIterProgramForEmber(bool doAccum) } else { - //m_ErrorReport.push_back(string(loc) + "():\nBuilding the following program failed: \n" + m_IterKernel + "\n"); - - std::vector errors = m_Wrapper.ProgramBuildErrors(); - m_ErrorReport.insert(m_ErrorReport.end(), errors.begin(), errors.end()); - m_ErrorReport.push_back(loc); - + m_ErrorReport.push_back(string(loc) + "():\nBuilding the following program failed: \n" + m_IterKernel + "\n"); return false; } @@ -1272,7 +1267,6 @@ int RendererCL::MakeAndGetDensityFilterProgram(size_t ss, uint filterWidth) else { m_ErrorReport.push_back(string(loc) + "():\nBuilding the following program failed: \n" + kernel + "\n"); - //cout << m_ErrorReport.back(); } } @@ -1302,11 +1296,7 @@ int RendererCL::MakeAndGetFinalAccumProgram(T& alphaBase, T& alphaScale) if (b) kernelIndex = m_Wrapper.FindKernelIndex(finalAccumEntryPoint);//Try to find it again, it will be present if successfully built. else - { - std::vector errors = m_Wrapper.ProgramBuildErrors(); - m_ErrorReport.insert(m_ErrorReport.end(), errors.begin(), errors.end()); m_ErrorReport.push_back(loc); - } } return kernelIndex; diff --git a/Source/EmberCL/RendererCL.h b/Source/EmberCL/RendererCL.h index d08c1eb..24eca7a 100644 --- a/Source/EmberCL/RendererCL.h +++ b/Source/EmberCL/RendererCL.h @@ -155,7 +155,9 @@ protected: virtual eRenderStatus AccumulatorToFinalImage(byte* pixels, size_t finalOffset) override; virtual EmberStats Iterate(size_t iterCount, size_t temporalSample) override; +#ifndef TEST_CL private: +#endif //Private functions for making and running OpenCL programs. bool BuildIterProgramForEmber(bool doAccum = true); bool RunIter(size_t iterCount, size_t temporalSample, size_t& itersRan); diff --git a/Source/EmberTester/EmberTester.cpp b/Source/EmberTester/EmberTester.cpp index 47deb50..481604a 100644 --- a/Source/EmberTester/EmberTester.cpp +++ b/Source/EmberTester/EmberTester.cpp @@ -13,7 +13,6 @@ /// using namespace EmberNs; -//#define TEST_CL 1 template void SaveFinalImage(Renderer& renderer, vector& pixels, char* suffix) @@ -94,33 +93,32 @@ string GetEmberCLKernelString(Ember& ember, bool iter, bool log, bool de, return os.str(); } -void MakeTestAllVarsRegPrePostComboFile(const string& filename) +template +void MakeTestAllVarsRegPrePost(vector>& embers) { - EmberToXml writer; - vector> embers; - VariationList varList; uint index = 0; - PaletteList paletteList; ostringstream ss; + VariationList varList; + PaletteList paletteList; QTIsaac rand; paletteList.Init("flam3-palettes.xml"); Timing t; - Ember emberNoVars; - + Ember emberNoVars; + emberNoVars.m_FinalRasW = 640; emberNoVars.m_FinalRasH = 480; emberNoVars.m_Quality = 100; - Xform xform1(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform2(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform3(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform4(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform5(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform6(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform7(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform1(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform2(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform3(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform4(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform5(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform6(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform7(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); emberNoVars.AddXform(xform1); emberNoVars.AddXform(xform2); @@ -138,22 +136,22 @@ void MakeTestAllVarsRegPrePostComboFile(const string& filename) while (index < varList.RegSize()) { - Ember ember1; - unique_ptr> regVar(varList.GetVariationCopy(index, VARTYPE_REG)); - unique_ptr> preVar(varList.GetVariationCopy("pre_" + regVar->Name())); - unique_ptr> postVar(varList.GetVariationCopy("post_" + regVar->Name())); + Ember ember1; + unique_ptr> regVar(varList.GetVariationCopy(index, VARTYPE_REG)); + unique_ptr> preVar(varList.GetVariationCopy("pre_" + regVar->Name())); + unique_ptr> postVar(varList.GetVariationCopy("post_" + regVar->Name())); ember1.m_FinalRasW = 640; ember1.m_FinalRasH = 480; ember1.m_Quality = 100; - Xform xform1(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform2(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform3(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform4(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform5(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform6(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); - Xform xform7(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform1(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform2(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform3(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform4(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform5(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform6(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); + Xform xform7(0.25f, rand.Frand01(), rand.Frand11(), 1, rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11(), rand.Frand11()); if (preVar.get() && postVar.get()) { @@ -204,7 +202,14 @@ void MakeTestAllVarsRegPrePostComboFile(const string& filename) } t.Toc("Creating embers for all possible variations"); +} +void MakeTestAllVarsRegPrePostComboFile(const string& filename) +{ + EmberToXml writer; + vector> embers; + + MakeTestAllVarsRegPrePost(embers); writer.Save(filename, embers, 0, true, false, true); } @@ -320,7 +325,7 @@ bool SearchVar(Variation* var, vector& stringVec, bool matchAll) { bool ret = false; size_t i; - string cl = var->OpenCLString(); + auto cl = var->OpenCLFuncsString() + "\n" + var->OpenCLString(); if (matchAll) { @@ -1315,6 +1320,33 @@ void TestVarTime() //ForEach(times, [&](pair& p) { cout << p.first << "\t" << p.second << "" << endl; }); } +void TestCasting() +{ + vector stringVec; + vector*> varVec; + + stringVec.push_back("T("); + stringVec.push_back(".0f"); + stringVec.push_back(".1f"); + stringVec.push_back(".2f"); + stringVec.push_back(".3f"); + stringVec.push_back(".4f"); + stringVec.push_back(".5f"); + stringVec.push_back(".6f"); + stringVec.push_back(".7f"); + stringVec.push_back(".8f"); + stringVec.push_back(".9f"); + + varVec = FindVarsWith(stringVec); + + for (auto& it : varVec) + { + cout << "Variation " << it->Name() << " contained an improper float cast." << endl; + } + + ClearVec>(varVec); +} + template void TestOperations() { @@ -1472,6 +1504,37 @@ void TestVarsSimilar() } #ifdef TEST_CL + +template +void TestAllVarsCLBuild(bool printSuccess = true) +{ + vector> embers; + QTIsaac rand; + RendererCL renderer; + const char* loc = __FUNCTION__; + + if (!renderer.Init(1, 0, false, 0)) + { + cout << loc << "Creating RendererCL failed, tests will not be run." << endl; + return; + } + + MakeTestAllVarsRegPrePost(embers); + + for (auto& it : embers) + { + renderer.SetEmber(it); + + if (renderer.BuildIterProgramForEmber()) + { + if (printSuccess) + cout << loc << ": Build succeeded for ember " << it.m_Name << endl; + } + else + cout << loc << ": OpenCL program build failed:\n" << renderer.ErrorReport() << endl; + } +} + template void TestCpuGpuResults() { @@ -1747,85 +1810,85 @@ double RandD(QTIsaac& rand) { return ((((rand.Rand()^(rand.Rand()<<15))&0xfffffff)*3.72529e-09)-0.5); } - -#define BEZ_POINT_LENGTH 4 - -void BezierSolve(double t, glm::vec2* src, double* w, glm::vec2& solution) -{ - double s, s2, s3, t2, t3, nom_x, nom_y, denom; - - s = 1 - t; - s2 = s * s; - s3 = s * s * s; - t2 = t * t; - t3 = t * t * t; - - nom_x = w[0] * s3 * src[0].x + w[1] * s2 * 3 * t * src[1].x + w[2] * s * 3 * t2 * src[2].x + w[3] * t3 * src[3].x; - - nom_y = w[0] * s3 * src[0].y + w[1] * s2 * 3 * t * src[1].y + w[2] * s * 3 * t2 * src[2].y + w[3] * t3 * src[3].y; - - denom = w[0] * s3 + w[1] * s2 * 3 * t + w[2] * s * 3 * t2 + w[3] * t3; - - - if (isnan(nom_x) || isnan(nom_y) || isnan(denom) || denom == 0) - return; - - solution.x = nom_x / denom; - solution.y = nom_y / denom; -} - -void BezierSetRect(glm::vec2* points, bool flip, glm::vec4& rect) -{ - double f; - - for (int i = 0; i < BEZ_POINT_LENGTH; i++) - { - if (flip) - f = 1 - points[i].y; - else - f = points[i].y; - - points[i].x = points[i].x * (rect.z - rect.x) + rect.x; - points[i].y = f * (rect.w - rect.y) + rect.y; - } -} - -void BezierUnsetRect(glm::vec2* points, bool flip, glm::vec4& rect) -{ - if ((rect.z - rect.x) == 0 || (rect.w - rect.y) == 0) - return; - - for (int i = 0; i < BEZ_POINT_LENGTH; i++) - { - points[i].x = (points[i].x - rect.x) / (rect.z - rect.x); - points[i].y = (points[i].y - rect.y) / (rect.w - rect.y); - - if (flip) - points[i].y = 1 - points[i].y; - } -} - -struct BezierPoints -{ - glm::vec2 points[4]; -}; - -struct BezierWeights -{ - double points[4]; -}; +// +//#define BEZ_POINT_LENGTH 4 +// +//void BezierSolve(double t, glm::vec2* src, double* w, glm::vec2& solution) +//{ +// double s, s2, s3, t2, t3, nom_x, nom_y, denom; +// +// s = 1 - t; +// s2 = s * s; +// s3 = s * s * s; +// t2 = t * t; +// t3 = t * t * t; +// +// nom_x = w[0] * s3 * src[0].x + w[1] * s2 * 3 * t * src[1].x + w[2] * s * 3 * t2 * src[2].x + w[3] * t3 * src[3].x; +// +// nom_y = w[0] * s3 * src[0].y + w[1] * s2 * 3 * t * src[1].y + w[2] * s * 3 * t2 * src[2].y + w[3] * t3 * src[3].y; +// +// denom = w[0] * s3 + w[1] * s2 * 3 * t + w[2] * s * 3 * t2 + w[3] * t3; +// +// +// if (isnan(nom_x) || isnan(nom_y) || isnan(denom) || denom == 0) +// return; +// +// solution.x = nom_x / denom; +// solution.y = nom_y / denom; +//} +// +//void BezierSetRect(glm::vec2* points, bool flip, glm::vec4& rect) +//{ +// double f; +// +// for (int i = 0; i < BEZ_POINT_LENGTH; i++) +// { +// if (flip) +// f = 1 - points[i].y; +// else +// f = points[i].y; +// +// points[i].x = points[i].x * (rect.z - rect.x) + rect.x; +// points[i].y = f * (rect.w - rect.y) + rect.y; +// } +//} +// +//void BezierUnsetRect(glm::vec2* points, bool flip, glm::vec4& rect) +//{ +// if ((rect.z - rect.x) == 0 || (rect.w - rect.y) == 0) +// return; +// +// for (int i = 0; i < BEZ_POINT_LENGTH; i++) +// { +// points[i].x = (points[i].x - rect.x) / (rect.z - rect.x); +// points[i].y = (points[i].y - rect.y) / (rect.w - rect.y); +// +// if (flip) +// points[i].y = 1 - points[i].y; +// } +//} +// +//struct BezierPoints +//{ +// glm::vec2 points[4]; +//}; +// +//struct BezierWeights +//{ +// double points[4]; +//}; int _tmain(int argc, _TCHAR* argv[]) { //int i; Timing t(4); QTIsaac rand; - glm::vec2 solution, src[4]; - double bezT = 1, w[4]; - BezierPoints curvePoints[4]; - BezierWeights curveWeights[4]; - - BezierSolve(bezT, src, w, solution); + //glm::vec2 solution, src[4]; + //double bezT = 1, w[4]; + //BezierPoints curvePoints[4]; + //BezierWeights curveWeights[4]; + // + //BezierSolve(bezT, src, w, solution); //cout << pow(-1, 5.1) << endl; @@ -1894,6 +1957,10 @@ int _tmain(int argc, _TCHAR* argv[]) //cd2 = sin(cd); /* + t.Tic(); + TestCasting(); + t.Toc("TestCasting()"); + t.Tic(); VariationList vlf; t.Toc("Creating VariationList"); @@ -1990,10 +2057,18 @@ int _tmain(int argc, _TCHAR* argv[]) //TestCpuGpuResults(); //t.Toc("TestCpuGpuResults()"); + t.Tic(); + TestAllVarsCLBuild(); + t.Toc("TestAllVarsCLBuild()"); + #ifdef DO_DOUBLE //t.Tic(); //TestCpuGpuResults(); //t.Toc("TestCpuGpuResults()"); + + t.Tic(); + TestAllVarsCLBuild(); + t.Toc("TestAllVarsCLBuild()"); #endif #endif