basic/source/uno/namecont.cxx | 7 + chart2/source/view/inc/GL3DRenderer.hxx | 2 chart2/source/view/main/GL3DRenderer.cxx | 19 +++-- sc/qa/unit/opencl-test.cxx | 5 + sc/source/core/opencl/formulagroupcl.cxx | 114 ++++++++++++++++++++++++------- sc/source/core/opencl/op_logical.cxx | 37 ++++++++++ sc/source/core/opencl/op_logical.hxx | 7 + sc/source/core/opencl/op_math.cxx | 93 +++++++++---------------- sc/source/core/opencl/op_spreadsheet.cxx | 49 +++++++++++-- sc/source/core/opencl/op_spreadsheet.hxx | 1 sc/source/core/opencl/op_statistical.cxx | 92 ++++++++++++++----------- sc/source/core/opencl/opbase.cxx | 10 +- sc/source/core/opencl/opbase.hxx | 8 +- vcl/source/opengl/OpenGLContext.cxx | 2 14 files changed, 305 insertions(+), 141 deletions(-)
New commits: commit a903cac829f0c607b5895cbaae51ab4951ed8567 Author: Markus Mohrhard <[email protected]> Date: Tue Jun 10 15:57:59 2014 +0200 fix assert Change-Id: I55627efdf50bea4c1371b6c54df67cc71d5fce2f diff --git a/sc/qa/unit/opencl-test.cxx b/sc/qa/unit/opencl-test.cxx index 951f4b5..ee6b2e3 100644 --- a/sc/qa/unit/opencl-test.cxx +++ b/sc/qa/unit/opencl-test.cxx @@ -3870,7 +3870,10 @@ void ScOpenclTest::testMathFormulaMod() { double fLibre = pDoc->GetValue(ScAddress(2,i,0)); double fExcel = pDocRes->GetValue(ScAddress(2,i,0)); - CPPUNIT_ASSERT_DOUBLES_EQUAL(fExcel, fLibre, fabs(0.0001*fExcel)); + if(fExcel == 0.0f) + CPPUNIT_ASSERT_DOUBLES_EQUAL(fExcel, fLibre, 1e-10); + else + CPPUNIT_ASSERT_DOUBLES_EQUAL(fExcel, fLibre, fabs(0.0001*fExcel)); } xDocSh->DoClose(); xDocShRes->DoClose(); commit 7cfc80cb1663c1f4b4e813ab90c95fae01d1afc1 Author: haochen <[email protected]> Date: Sat May 31 14:28:22 2014 +0800 GPU Calc:Support default 2nd parameter in ROUND Change-Id: I003ba9c945dbc3c6417d0502902610c0eaff2bda diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 9b45c91..5f6b4ff 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -1487,7 +1487,9 @@ public: #ifdef UNROLLING_FACTOR ss << "\tint i;\n\t"; - ss << "int currentCount0, currentCount1;\n\t"; + ss << "int currentCount0;\n"; + for ( unsigned i = 0; i < vSubArguments.size()-1; i++) + ss << "int currentCount"<<i+1<<";\n"; std::stringstream temp3,temp4; int outLoopSize = UNROLLING_FACTOR; if (nCurWindowSize/outLoopSize != 0){ diff --git a/sc/source/core/opencl/op_math.cxx b/sc/source/core/opencl/op_math.cxx index 36c94f6..555da592 100644 --- a/sc/source/core/opencl/op_math.cxx +++ b/sc/source/core/opencl/op_math.cxx @@ -1707,11 +1707,17 @@ void OpRound::GenSlidingWindowFunction(std::stringstream &ss, ss << " int singleIndex = gid0;\n"; GenTmpVariables(ss,vSubArguments); CheckAllSubArgumentIsNan(ss,vSubArguments); - ss << " for(int i=0;i<tmp1;i++)\n"; - ss << " tmp0 = tmp0 * 10;\n"; + if(vSubArguments.size() ==2) + { + ss << " for(int i=0;i<tmp1;i++)\n"; + ss << " tmp0 = tmp0 * 10;\n"; + } ss << " double tmp=round(tmp0);\n"; - ss << " for(int i=0;i<tmp1;i++)\n"; - ss << " tmp = tmp / 10;\n"; + if(vSubArguments.size() ==2) + { + ss << " for(int i=0;i<tmp1;i++)\n"; + ss << " tmp = tmp / 10;\n"; + } ss << " return tmp;\n"; ss << "}"; } commit c0ea62fcb7f2bd809eea0fd45fb71e31ffba871a Author: haochen <[email protected]> Date: Sat May 31 13:54:22 2014 +0800 GPU Calc:Support 3rd parameter in FLOOR Change-Id: Ie3a265f34a5f589d41e802b63df4be6a64989b05 diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 91a54f4..9b45c91 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -419,7 +419,7 @@ size_t DynamicKernelStringArgument::Marshal(cl_kernel k, int argno, int, cl_prog if (CL_SUCCESS != err) throw OpenCLError(err, __FILE__, __LINE__); - cl_uint *pHashBuffer = (cl_uint*)clEnqueueMapBuffer( + pHashBuffer = (cl_uint*)clEnqueueMapBuffer( kEnv.mpkCmdQueue, mpClmem, CL_TRUE, CL_MAP_WRITE, 0, szHostBuffer, 0, NULL, NULL, &err); if (CL_SUCCESS != err) diff --git a/sc/source/core/opencl/op_math.cxx b/sc/source/core/opencl/op_math.cxx index 4a960b3..36c94f6 100644 --- a/sc/source/core/opencl/op_math.cxx +++ b/sc/source/core/opencl/op_math.cxx @@ -424,14 +424,6 @@ void OpEven::GenSlidingWindowFunction(std::stringstream &ss, void OpMod::GenSlidingWindowFunction(std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { -#ifdef ISNAN - FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR0= static_cast<const - formula::SingleVectorRefToken *>(tmpCur0); - FormulaToken *tmpCur1 = vSubArguments[0]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR1= static_cast<const - formula::SingleVectorRefToken *>(tmpCur1); -#endif ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; for (unsigned i = 0; i < vSubArguments.size(); i++) @@ -444,22 +436,13 @@ void OpMod::GenSlidingWindowFunction(std::stringstream &ss, ss <<" int gid0=get_global_id(0);\n"; ss << " double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << ";\n"; - ss <<" double arg1 =" << vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << " double arg1 =" << vSubArguments[1]->GenSlidingWindowDeclRef(); ss << ";\n"; -#ifdef ISNAN - ss<< " if(isNan(arg0)||(gid0>="; - ss<<tmpCurDVR0->GetArrayLength(); - ss<<"))\n"; - ss<<" arg0 = 0;\n"; -#endif -#ifdef ISNAN - ss<< " if(isNan(arg1)||(gid0>="; - ss<<tmpCurDVR1->GetArrayLength(); - ss<<"))\n"; - ss<<" arg1 = 0;\n"; -#endif + ss << " if(isNan(arg0)||arg0 == 0)\n"; + ss << " return 0;\n"; + ss << " if(isNan(arg1) || arg1 ==0)\n"; + ss << " return NAN;\n"; ss << " double tem;\n"; - ss << " if(arg1 != 0) {\n"; ss << " if(arg0 < 0 && arg1 > 0)\n"; ss << " while(arg0 < 0)\n"; ss << " arg0 += arg1;\n"; @@ -467,9 +450,6 @@ void OpMod::GenSlidingWindowFunction(std::stringstream &ss, ss << " while(arg0 > 0)\n"; ss << " arg0 += arg1;\n"; ss << " tem = fmod(arg0,arg1);\n"; - ss << " }\n"; - ss << " else\n"; - ss << " tem = 0;\n"; ss << " if(arg1 < 0 && tem > 0)\n"; ss << " tem = -tem;\n"; ss << " return tem;\n"; @@ -2318,9 +2298,6 @@ void OpFloor::GenSlidingWindowFunction( std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { - FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR= static_cast<const - formula::SingleVectorRefToken *>(tmpCur); ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; for (unsigned i = 0; i < vSubArguments.size(); i++) @@ -2330,35 +2307,27 @@ void OpFloor::GenSlidingWindowFunction( vSubArguments[i]->GenSlidingWindowDecl(ss); } ss << ")\n{\n"; - ss <<" int gid0=get_global_id(0);\n"; - ss << " double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n"; - ss << " double arg1 = " << vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << " int gid0=get_global_id(0);\n"; + ss << " double arg0,arg1,arg2=0.0;\n"; + ss << " arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << ";\n"; - ss << " double arg2 = " << vSubArguments[2]->GenSlidingWindowDeclRef(); + ss << " arg1 = " << vSubArguments[1]->GenSlidingWindowDeclRef(); ss << ";\n"; -#ifdef ISNAN - ss<< " if(isNan(arg0)||(gid0>="; - ss<<tmpCurDVR->GetArrayLength(); - ss<<"))\n"; - ss<<" arg0 = 0;\n"; - ss<< " if(isNan(arg1)||(gid0>="; - ss<<tmpCurDVR->GetArrayLength(); - ss<<"))\n"; - ss<<" arg1 = 0;\n"; - ss<< " if(isNan(arg2)||(gid0>="; - ss<<tmpCurDVR->GetArrayLength(); - ss<<"))\n"; - ss<<" arg2 = 0;\n"; -#endif - ss <<" if(arg1==0.0)\n"; - ss <<" return 0.0;\n"; - ss <<" else if(arg0*arg1<0.0)\n"; - ss <<" return 0.0000000001;\n"; - ss <<" else if(arg2==0.0&&arg0<0.0)\n"; - ss <<" return (trunc(arg0/arg1)+1)*arg1;\n"; - ss <<" else\n"; - ss <<" return trunc(arg0/arg1)*arg1;\n"; + if ( 3 == vSubArguments.size() ) + { + ss << " arg2 = " << vSubArguments[2]->GenSlidingWindowDeclRef(); + ss << ";\n"; + } + ss << " if(isNan(arg0) || isNan(arg1))\n"; + ss << " return 0;\n"; + ss << " if(isNan(arg2))\n"; + ss << " arg2 = 0.0;\n"; + ss << " if(arg0*arg1<0)\n"; + ss << " return NAN;\n"; + ss << " else if(arg2==0.0&&arg0<0.0)\n"; + ss << " return (trunc(arg0/arg1)+1)*arg1;\n"; + ss << " else\n"; + ss << " return trunc(arg0/arg1)*arg1;\n"; ss << "}\n"; } void OpBitOr::GenSlidingWindowFunction(std::stringstream &ss, diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index 88541e2..20dbb49 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -3678,6 +3678,20 @@ void OpGamma::GenSlidingWindowFunction( void OpCorrel::GenSlidingWindowFunction( std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { + if( vSubArguments.size() !=2 ||vSubArguments[0]->GetFormulaToken() + ->GetType() != formula::svDoubleVectorRef||vSubArguments[1] + ->GetFormulaToken()->GetType() != formula::svDoubleVectorRef ) + ///only support DoubleVector in OpCorrelfor GPU calculating. + throw Unhandled(); + const formula::DoubleVectorRefToken* pCurDVRX = + static_cast<const formula::DoubleVectorRefToken *>( + vSubArguments[0]->GetFormulaToken()); + const formula::DoubleVectorRefToken* pCurDVRY = + static_cast<const formula::DoubleVectorRefToken *>( + vSubArguments[1]->GetFormulaToken()); + if( pCurDVRX->GetRefRowSize() != pCurDVRY->GetRefRowSize() ) + throw Unhandled(); + ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; for (unsigned i = 0; i < vSubArguments.size(); i++) @@ -3698,16 +3712,8 @@ void OpCorrel::GenSlidingWindowFunction( ss << "double arg1 = 0.0;\n\t"; ss << "int cnt = 0;\n\t"; - FormulaToken *pCurX = vSubArguments[0]->GetFormulaToken(); - FormulaToken *pCurY = vSubArguments[1]->GetFormulaToken(); - const formula::DoubleVectorRefToken* pCurDVRX = - static_cast<const formula::DoubleVectorRefToken *>(pCurX); - const formula::DoubleVectorRefToken* pCurDVRY = - static_cast<const formula::DoubleVectorRefToken *>(pCurY); - size_t nCurWindowSizeX = pCurDVRX->GetRefRowSize(); - size_t nCurWindowSizeY = pCurDVRY->GetRefRowSize(); - if(nCurWindowSizeX == nCurWindowSizeY) - { + size_t nCurWindowSizeX = pCurDVRY->GetRefRowSize(); + ss << "for (int i = "; if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) { ss << "gid0; i < " << nCurWindowSizeX << "; i++) {\n\t\t"; @@ -3880,7 +3886,6 @@ void OpCorrel::GenSlidingWindowFunction( ss << "}\n\t"; ss << "}\n"; ss << "}"; - } } void OpNegbinomdist::GenSlidingWindowFunction( @@ -3959,10 +3964,20 @@ void OpNegbinomdist::GenSlidingWindowFunction( void OpPearson::GenSlidingWindowFunction( std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { - FormulaToken* pCur = vSubArguments[0]->GetFormulaToken(); - assert(pCur); + if( vSubArguments.size() !=2 ||vSubArguments[0]->GetFormulaToken() + ->GetType() != formula::svDoubleVectorRef||vSubArguments[1] + ->GetFormulaToken()->GetType() != formula::svDoubleVectorRef ) + ///only support DoubleVector in OpPearson for GPU calculating. + throw Unhandled(); const formula::DoubleVectorRefToken* pDVR = - static_cast<const formula::DoubleVectorRefToken *>(pCur); + static_cast<const formula::DoubleVectorRefToken *>( + vSubArguments[0]->GetFormulaToken()); + const formula::DoubleVectorRefToken* pCurDVRY = + static_cast<const formula::DoubleVectorRefToken *>( + vSubArguments[1]->GetFormulaToken()); + if( pDVR->GetRefRowSize() != pCurDVRY->GetRefRowSize() ) + throw Unhandled(); + size_t nCurWindowSize = pDVR->GetRefRowSize(); ss << "\ndouble " << sSymName; @@ -4000,6 +4015,7 @@ void OpPearson::GenSlidingWindowFunction( ss << ";\n"; ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(true); ss << " ;\n"; + ss << " if(isNan(fInx)||isNan(fIny)){fInx=0.0;fIny=0.0;fCount = fCount-1;}\n"; ss << " fSumX += fInx;\n"; ss << " fSumY += fIny;\n"; ss << " fCount = fCount + 1;\n"; @@ -4026,6 +4042,7 @@ void OpPearson::GenSlidingWindowFunction( ss << " ;\n"; ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(true); ss << " ;\n"; + ss << " if(isNan(fInx)||isNan(fIny)){fInx=0.0;fIny=0.0;}\n"; ss << " fSumDeltaXDeltaY += (fInx - fMeanX) * (fIny - fMeanY);\n"; ss << " fSumX += pow(fInx - fMeanX,2);\n"; ss << " fSumY += pow(fIny - fMeanY,2);\n"; @@ -4579,11 +4596,21 @@ void OpCritBinom::GenSlidingWindowFunction(std::stringstream& ss, void OpRsq::GenSlidingWindowFunction( std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments) { - FormulaToken* pCur = vSubArguments[1]->GetFormulaToken(); - assert(pCur); - const formula::DoubleVectorRefToken* pCurDVR = - static_cast<const formula::DoubleVectorRefToken *>(pCur); - size_t nCurWindowSize = pCurDVR->GetRefRowSize(); + if( vSubArguments.size() !=2 ||vSubArguments[0]->GetFormulaToken() + ->GetType() != formula::svDoubleVectorRef||vSubArguments[1] + ->GetFormulaToken()->GetType() != formula::svDoubleVectorRef ) + ///only support DoubleVector in OpRsq for GPU calculating. + throw Unhandled(); + const formula::DoubleVectorRefToken* pCurDVR1 = + static_cast<const formula::DoubleVectorRefToken *>( + vSubArguments[0]->GetFormulaToken()); + const formula::DoubleVectorRefToken* pCurDVR2 = + static_cast<const formula::DoubleVectorRefToken *>( + vSubArguments[1]->GetFormulaToken()); + if( pCurDVR1->GetRefRowSize() != pCurDVR2->GetRefRowSize() ) + throw Unhandled(); + + size_t nCurWindowSize = pCurDVR1->GetRefRowSize(); ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; @@ -4605,29 +4632,18 @@ void OpRsq::GenSlidingWindowFunction( ss << " double tmp0,tmp1;\n"; vSubArguments.size(); ss <<"\n"; - FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); - const formula::DoubleVectorRefToken*tmpCurDVR0= static_cast<const - formula::DoubleVectorRefToken *>(tmpCur0); - FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); - const formula::DoubleVectorRefToken*tmpCurDVR1= static_cast<const - formula::DoubleVectorRefToken *>(tmpCur1); - ss << " int buffer_fInx_len = "; - ss << tmpCurDVR0->GetArrayLength(); - ss << ";\n"; - ss << " int buffer_fIny_len = "; - ss << tmpCurDVR1->GetArrayLength(); - ss << ";\n"; + ss << " for(int i=0; i<"<<nCurWindowSize<<"; i++)\n"; ss << " {\n"; - ss << " if((gid0+i)>=buffer_fInx_len || isNan("; - ss << vSubArguments[0]->GenSlidingWindowDeclRef(); + ss << " if(isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef(true); ss << "))\n"; ss << " fInx = 0;\n"; ss << " else\n"; ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); ss << ";\n"; - ss << " if((gid0+i)>=buffer_fIny_len || isNan("; - ss << vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << " if(isNan("; + ss << vSubArguments[1]->GenSlidingWindowDeclRef(true); ss << "))\n"; ss << " fIny = 0;\n"; ss << " else\n"; @@ -4643,14 +4659,14 @@ void OpRsq::GenSlidingWindowFunction( ss << " fSumY = 0.0;\n"; ss << " for(int i=0; i<"<<nCurWindowSize<<"; i++)\n"; ss << " {\n"; - ss << " if((gid0+i)>=buffer_fInx_len || isNan("; - ss << vSubArguments[0]->GenSlidingWindowDeclRef(); + ss << " if(isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef(true); ss << "))\n"; ss << " fInx = 0;\n"; ss << " else\n"; ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); ss << ";\n"; - ss << " if((gid0+i)>=buffer_fIny_len || isNan("; + ss << " if(isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss << "))\n"; ss << " fIny = 0;\n"; commit 0fa58160b90aa9817e5a6fb18c7427895f4b2f4f Author: haochen <[email protected]> Date: Thu May 29 09:14:53 2014 +0800 GPU Calc:Support IF formula in GPUInterpret Change-Id: I9b2cebb99812d28e25c961129f73585d60690846 diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index c0b62f2..91a54f4 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -1682,6 +1682,18 @@ public: } virtual std::string BinFuncName(void) const SAL_OVERRIDE { return "leq"; } }; +class OpLess: public Binary { +public: + virtual std::string GetBottom(void) SAL_OVERRIDE { return "0"; } + virtual std::string Gen2(const std::string &lhs, const std::string &rhs) const SAL_OVERRIDE + { + std::stringstream ss; + ss << "("<< lhs << "<" << rhs <<")"; + return ss.str(); + } + virtual std::string BinFuncName(void) const SAL_OVERRIDE { return "less"; } +}; + class OpGreater: public Binary { public: @@ -2267,6 +2279,9 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments( case ocLessEqual: mvSubArguments.push_back(SoPHelper(ts, ft->Children[i], new OpLessEqual)); break; + case ocLess: + mvSubArguments.push_back(SoPHelper(ts, ft->Children[i], new OpLess)); + break; case ocEqual: mvSubArguments.push_back(SoPHelper(ts, ft->Children[i], new OpEqual)); break; @@ -2872,6 +2887,10 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments( mvSubArguments.push_back(SoPHelper(ts, ft->Children[i], new OpAveDev)); break; + case ocIf: + mvSubArguments.push_back(SoPHelper(ts, + ft->Children[i], new OpIf)); + break; case ocExternal: if ( !(pChild->GetExternal().compareTo(OUString( "com.sun.star.sheet.addin.Analysis.getEffect")))) diff --git a/sc/source/core/opencl/op_logical.cxx b/sc/source/core/opencl/op_logical.cxx index 79dc74a..9dce77b 100644 --- a/sc/source/core/opencl/op_logical.cxx +++ b/sc/source/core/opencl/op_logical.cxx @@ -314,6 +314,43 @@ void OpXor::GenSlidingWindowFunction(std::stringstream &ss, ss << " return t;\n"; ss << "}\n"; } +void OpIf::GenSlidingWindowFunction(std::stringstream &ss, + const std::string &sSymName, SubArguments &vSubArguments) +{ + ss << "\ndouble " << sSymName; + ss << "_"<< BinFuncName() <<"("; + if(vSubArguments.size()!=3) throw Unhandled("unknown operand for ocPush"); + for (unsigned i = 0; i < vSubArguments.size(); i++) + { + if (i) + ss << ","; + vSubArguments[i]->GenSlidingWindowDecl(ss); + } + ss << ") {\n"; + ss << " int gid0 = get_global_id(0);\n"; + + FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); + if(tmpCur0->GetType() == formula::svDoubleVectorRef) + { + throw UnhandledToken(tmpCur0, "unknown operand for ocPush"); + } + else + { + ss << " if(isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef(); + ss << ")|| "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef(); + ss << " == 0)\n"; + ss << " return "; + ss << vSubArguments[2]->GenSlidingWindowDeclRef(); + ss << ";\n"; + ss << " else"; + ss <<" return "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef(); + ss <<";\n"; + } + ss << "}\n"; +} }} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/core/opencl/op_logical.hxx b/sc/source/core/opencl/op_logical.hxx index 357ddd8..4365a57 100644 --- a/sc/source/core/opencl/op_logical.hxx +++ b/sc/source/core/opencl/op_logical.hxx @@ -44,6 +44,13 @@ public: const std::string &sSymName, SubArguments &vSubArguments) SAL_OVERRIDE; virtual std::string BinFuncName(void) const SAL_OVERRIDE { return "Xor"; } }; +class OpIf:public Normal +{ +public: + virtual void GenSlidingWindowFunction(std::stringstream &ss, + const std::string &sSymName, SubArguments &vSubArguments) SAL_OVERRIDE; + virtual std::string BinFuncName(void) const SAL_OVERRIDE { return "IF"; } +}; }} commit c3383aafa18ef9d03b04b2a4719e71fdfabc14eb Author: haochen <[email protected]> Date: Thu May 29 09:09:55 2014 +0800 GPU Calc:Support string arguments in VLookup Change-Id: Ic2400a13c07c5b08beccaeffef4899c8f8b43af8 diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 4f40e25..c0b62f2 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -378,28 +378,55 @@ size_t DynamicKernelStringArgument::Marshal(cl_kernel k, int argno, int, cl_prog vRef = pDVR->GetArrays()[mnIndex]; } size_t szHostBuffer = nStrings * sizeof(cl_int); - // Marshal strings. Right now we pass hashes of these string - mpClmem = clCreateBuffer(kEnv.mpkContext, - (cl_mem_flags) CL_MEM_READ_ONLY|CL_MEM_ALLOC_HOST_PTR, - szHostBuffer, NULL, &err); - if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); - cl_uint *pHashBuffer = (cl_uint*)clEnqueueMapBuffer( - kEnv.mpkCmdQueue, mpClmem, CL_TRUE, CL_MAP_WRITE, 0, - szHostBuffer, 0, NULL, NULL, &err); - if (CL_SUCCESS != err) - throw OpenCLError(err, __FILE__, __LINE__); - for (size_t i = 0; i < nStrings; i++) + cl_uint *pHashBuffer = NULL; + + if ( vRef.mpStringArray != NULL) { - if (vRef.mpStringArray[i]) - { - const OUString tmp = OUString(vRef.mpStringArray[i]); - pHashBuffer[i] = tmp.hashCode(); - } - else + // Marshal strings. Right now we pass hashes of these string + mpClmem = clCreateBuffer(kEnv.mpkContext, + (cl_mem_flags) CL_MEM_READ_ONLY|CL_MEM_ALLOC_HOST_PTR, + szHostBuffer, NULL, &err); + if (CL_SUCCESS != err) + throw OpenCLError(err, __FILE__, __LINE__); + + pHashBuffer = (cl_uint*)clEnqueueMapBuffer( + kEnv.mpkCmdQueue, mpClmem, CL_TRUE, CL_MAP_WRITE, 0, + szHostBuffer, 0, NULL, NULL, &err); + if (CL_SUCCESS != err) + throw OpenCLError(err, __FILE__, __LINE__); + + for (size_t i = 0; i < nStrings; i++) { + if (vRef.mpStringArray[i]) + { + const OUString tmp = OUString(vRef.mpStringArray[i]); + pHashBuffer[i] = tmp.hashCode(); + } + else + { + pHashBuffer[i] = 0; + } + } + } + else + { + if (nStrings == 0) + szHostBuffer = sizeof(cl_int); // a dummy small value + // Marshal as a buffer of NANs + mpClmem = clCreateBuffer(kEnv.mpkContext, + (cl_mem_flags) CL_MEM_READ_ONLY|CL_MEM_ALLOC_HOST_PTR, + szHostBuffer, NULL, &err); + if (CL_SUCCESS != err) + throw OpenCLError(err, __FILE__, __LINE__); + + cl_uint *pHashBuffer = (cl_uint*)clEnqueueMapBuffer( + kEnv.mpkCmdQueue, mpClmem, CL_TRUE, CL_MAP_WRITE, 0, + szHostBuffer, 0, NULL, NULL, &err); + if (CL_SUCCESS != err) + throw OpenCLError(err, __FILE__, __LINE__); + + for (size_t i = 0; i < szHostBuffer/sizeof(cl_int); i++) pHashBuffer[i] = 0; - } } err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpClmem, pHashBuffer, 0, NULL, NULL); @@ -425,6 +452,7 @@ public: ss << ", "; mStringArgument.GenSlidingWindowDecl(ss); } + virtual bool IsMixedArgument() const SAL_OVERRIDE {return true;} virtual void GenSlidingWindowFunction(std::stringstream &) SAL_OVERRIDE {} /// Generate declaration virtual void GenDecl(std::stringstream &ss) const SAL_OVERRIDE @@ -439,12 +467,20 @@ public: ss << ","; mStringArgument.GenDeclRef(ss); } - virtual std::string GenSlidingWindowDeclRef(bool) const SAL_OVERRIDE + virtual void GenNumDeclRef(std::stringstream& ss) const SAL_OVERRIDE + { + VectorRef::GenSlidingWindowDecl(ss); + } + virtual void GenStringDeclRef(std::stringstream& ss) const SAL_OVERRIDE + { + mStringArgument.GenSlidingWindowDecl(ss); + } + virtual std::string GenSlidingWindowDeclRef(bool nested) const SAL_OVERRIDE { std::stringstream ss; ss << "(!isNan(" << VectorRef::GenSlidingWindowDeclRef(); ss << ")?" << VectorRef::GenSlidingWindowDeclRef(); - ss << ":" << mStringArgument.GenSlidingWindowDeclRef(); + ss << ":" << mStringArgument.GenSlidingWindowDeclRef(nested); ss << ")"; return ss.str(); } @@ -725,15 +761,16 @@ public: ss << ","; mStringArgument.GenDeclRef(ss); } - virtual std::string GenSlidingWindowDeclRef(bool) const SAL_OVERRIDE + virtual std::string GenSlidingWindowDeclRef(bool nested) const SAL_OVERRIDE { std::stringstream ss; ss << "(!isNan(" << mDoubleArgument.GenSlidingWindowDeclRef(); ss << ")?" << mDoubleArgument.GenSlidingWindowDeclRef(); - ss << ":" << mStringArgument.GenSlidingWindowDeclRef(); + ss << ":" << mStringArgument.GenSlidingWindowDeclRef(nested); ss << ")"; return ss.str(); } + virtual bool IsMixedArgument() const SAL_OVERRIDE {return true;} virtual std::string GenDoubleSlidingWindowDeclRef(bool=false) const SAL_OVERRIDE { std::stringstream ss; @@ -746,6 +783,14 @@ public: ss << mStringArgument.GenSlidingWindowDeclRef(); return ss.str(); } + virtual void GenNumDeclRef(std::stringstream& ss) const SAL_OVERRIDE + { + mDoubleArgument.GenDeclRef(ss); + } + virtual void GenStringDeclRef(std::stringstream& ss) const SAL_OVERRIDE + { + mStringArgument.GenDeclRef(ss); + } virtual size_t Marshal(cl_kernel k, int argno, int vw, cl_program p) SAL_OVERRIDE { int i = mDoubleArgument.Marshal(k, argno, vw, p); diff --git a/sc/source/core/opencl/op_spreadsheet.cxx b/sc/source/core/opencl/op_spreadsheet.cxx index d2b78c9..3610850 100644 --- a/sc/source/core/opencl/op_spreadsheet.cxx +++ b/sc/source/core/opencl/op_spreadsheet.cxx @@ -157,10 +157,32 @@ void OpVLookup::GenSlidingWindowFunction(std::stringstream &ss, ss << " == "; ss << j+1; ss << ")\n"; - ss << " tmp = "; - vSubArguments[1+j]->GenDeclRef(ss); - ss << "[rowNum];\n"; + if( !(vSubArguments[1+j]->IsMixedArgument())) + { + ss << "{"; + ss << " tmp = "; + vSubArguments[1+j]->GenDeclRef(ss); + ss << "[rowNum];\n"; + ss << "}"; + + } + else + { + ss << "{"; + + ss << " tmp = isNan("; + vSubArguments[1+j]->GenNumDeclRef(ss); + ss << "[rowNum]"<<")?"; + vSubArguments[1+j]->GenNumDeclRef(ss); + ss << "[rowNum]:"; + vSubArguments[1+j]->GenStringDeclRef(ss); + ss << "[rowNum];\n"; + ss << "}"; + + + + } } ss << " return tmp;\n"; ss << " }\n"; @@ -221,9 +243,24 @@ void OpVLookup::GenSlidingWindowFunction(std::stringstream &ss, ss << " == "; ss << j+1; ss << ")\n"; - ss << " tmp = "; - vSubArguments[1+j]->GenDeclRef(ss); - ss << "[rowNum];\n"; + ///Add MixedArguments for string support in Vlookup. + if( !(vSubArguments[1+j]->IsMixedArgument())) + { + ss << " tmp = "; + vSubArguments[1+j]->GenDeclRef(ss); + ss << "[rowNum];\n"; + } + else + { + ss << " tmp = isNan("; + vSubArguments[1+j]->GenNumDeclRef(ss); + ss << "[rowNum]"<<")?"; + vSubArguments[1+j]->GenNumDeclRef(ss); + ss << "[rowNum]:"; + vSubArguments[1+j]->GenStringDeclRef(ss); + ss << "[rowNum];\n"; + } + } ss << " return tmp;\n"; diff --git a/sc/source/core/opencl/op_spreadsheet.hxx b/sc/source/core/opencl/op_spreadsheet.hxx index 53a0109..0179506 100644 --- a/sc/source/core/opencl/op_spreadsheet.hxx +++ b/sc/source/core/opencl/op_spreadsheet.hxx @@ -20,6 +20,7 @@ public: virtual void GenSlidingWindowFunction(std::stringstream &ss, const std::string &sSymName, SubArguments &vSubArguments) SAL_OVERRIDE; virtual std::string BinFuncName(void) const SAL_OVERRIDE { return "VLookup"; } + virtual bool takeString() const SAL_OVERRIDE { return true; } }; }} diff --git a/sc/source/core/opencl/opbase.cxx b/sc/source/core/opencl/opbase.cxx index dfda160..ccd653c 100644 --- a/sc/source/core/opencl/opbase.cxx +++ b/sc/source/core/opencl/opbase.cxx @@ -59,15 +59,15 @@ void VectorRef::GenSlidingWindowDecl(std::stringstream &ss) const } /// When referenced in a sliding window function -std::string VectorRef::GenSlidingWindowDeclRef(bool) const +std::string VectorRef::GenSlidingWindowDeclRef(bool nested) const { std::stringstream ss; formula::SingleVectorRefToken *pSVR = dynamic_cast<formula::SingleVectorRefToken*>(DynamicKernelArgument::GetFormulaToken()); - if (pSVR) + if (pSVR&&nested) ss << "(gid0 < " << pSVR->GetArrayLength() << "?"; ss << mSymName << "[gid0]"; - if (pSVR) + if (pSVR&&nested) ss << ":NAN)"; return ss.str(); } @@ -155,7 +155,7 @@ void CheckVariables::CheckSubArgumentIsNan( std::stringstream & ss, ss<< " if("; } ss<< "isNan("; - ss<< vSubArguments[i]->GenSlidingWindowDeclRef(); + ss<< vSubArguments[i]->GenSlidingWindowDeclRef(false); ss<<"))\n"; ss<< " tmp"; ss<< i; @@ -164,7 +164,7 @@ void CheckVariables::CheckSubArgumentIsNan( std::stringstream & ss, ss <<" tmp"; ss <<i; ss << "="; - ss << vSubArguments[i]->GenSlidingWindowDeclRef(); + ss << vSubArguments[i]->GenSlidingWindowDeclRef(false); ss<<";\n"; } diff --git a/sc/source/core/opencl/opbase.hxx b/sc/source/core/opencl/opbase.hxx index 6cd04a9..d1d0005 100644 --- a/sc/source/core/opencl/opbase.hxx +++ b/sc/source/core/opencl/opbase.hxx @@ -165,8 +165,14 @@ public: virtual std::string GenStringSlidingWindowDeclRef(bool=false) const { return std::string(""); } + virtual bool IsMixedArgument() const + { return false; } + /// Generate use/references to the argument virtual void GenDeclRef(std::stringstream &ss) const; + virtual void GenNumDeclRef(std::stringstream &ss) const{ss << ",";} + + virtual void GenStringDeclRef(std::stringstream &ss) const{ss << ",";} /// Create buffer and pass the buffer to a given kernel virtual size_t Marshal(cl_kernel, int, int, cl_program) = 0; @@ -205,7 +211,7 @@ public: virtual void GenSlidingWindowDecl(std::stringstream &ss) const SAL_OVERRIDE; /// When referenced in a sliding window function - virtual std::string GenSlidingWindowDeclRef(bool=false) const SAL_OVERRIDE; + virtual std::string GenSlidingWindowDeclRef(bool=true) const SAL_OVERRIDE; /// Create buffer and pass the buffer to a given kernel virtual size_t Marshal(cl_kernel, int, int, cl_program) SAL_OVERRIDE; commit aa294679810972d43f1ad0735319d9a06936210b Author: weigao <[email protected]> Date: Tue Jun 10 01:18:38 2014 -0700 add global scale matrix Change-Id: Ied37fdbe92a83ac588ccf14f694ffb53769d92d1 diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index e56d6d7..ad013e9 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -374,6 +374,8 @@ private: MaterialParameters m_Batchmaterial; GLuint m_Batch3DUBOBuffer; GLint m_Batch3DActualSizeLight; + + glm::mat4 m_GlobalScaleMatrix; }; } diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index dc39999..a7d1496 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -308,6 +308,7 @@ void OpenGL3DRenderer::init() glViewport(0, 0, m_iWidth, m_iHeight); Set3DSenceInfo(0xFFFFFF, true); + m_GlobalScaleMatrix = glm::scale(0.01f, 0.01f, 0.01f); } void OpenGL3DRenderer::SetSize(const Size& rSize) @@ -724,7 +725,7 @@ void OpenGL3DRenderer::RenderLine3D(const Polygon3DInfo& polygon) PosVecf3 angle = {0.0f, 0.0f, 0.0f}; PosVecf3 scale = {1.0f, 1.0f, m_fHeightWeight}; MoveModelf(trans, angle, scale); - + m_Model =m_GlobalScaleMatrix * m_Model; m_3DMVP = m_3DProjection * m_3DView * m_Model; for (size_t i = 0; i < polygon.verticesList.size(); i++) @@ -795,6 +796,7 @@ void OpenGL3DRenderer::RenderPolygon3D(const Polygon3DInfo& polygon) PosVecf3 angle = {0.0f, 0.0f, 0.0f}; PosVecf3 scale = {1.0f, 1.0f, m_fHeightWeight}; MoveModelf(trans, angle, scale); + m_Model =m_GlobalScaleMatrix * m_Model; glm::mat3 normalMatrix(m_Model); glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); @@ -1219,7 +1221,7 @@ void OpenGL3DRenderer::RenderExtrudeBottomSurface(const Extrude3DInfo& extrude3D glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); m_Model = aTranslationMatrix * extrude3D.rotation * topTrans * topScale; } - + m_Model =m_GlobalScaleMatrix * m_Model; if(!mbPickingMode) { glm::mat3 normalMatrix(m_Model); @@ -1264,7 +1266,7 @@ void OpenGL3DRenderer::RenderExtrudeMiddleSurface(const Extrude3DInfo& extrude3D glm::mat4 reverseMatrix = glm::translate(glm::vec3(0.0, 0.0, -1.0)); m_Model = m_Model * reverseMatrix; } - + m_Model =m_GlobalScaleMatrix * m_Model; if(!mbPickingMode) { glm::mat3 normalMatrix(m_Model); @@ -1309,7 +1311,7 @@ void OpenGL3DRenderer::RenderExtrudeTopSurface(const Extrude3DInfo& extrude3D) glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); m_Model = aTranslationMatrix * extrude3D.rotation * topTrans * topScale * orgTrans; } - + m_Model =m_GlobalScaleMatrix * m_Model; if(!mbPickingMode) { glm::mat3 normalMatrix(m_Model); @@ -1340,7 +1342,7 @@ void OpenGL3DRenderer::RenderNonRoundedBar(const Extrude3DInfo& extrude3D) glm::mat4 reverseMatrix = glm::translate(glm::vec3(0.0, 0.0, -1.0)); m_Model = m_Model * reverseMatrix; } - + m_Model =m_GlobalScaleMatrix * m_Model; if(!mbPickingMode) { glm::mat3 normalMatrix(m_Model); @@ -1637,6 +1639,7 @@ void OpenGL3DRenderer::RenderTextShape() PosVecf3 angle = {0.0f, 0.0f, 0.0f}; PosVecf3 scale = {1.0, 1.0, 1.0f}; MoveModelf(trans, angle, scale); + m_Model =m_GlobalScaleMatrix * m_Model; glm::mat4 aMVP = m_3DProjection * m_3DView * m_Model; glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer); CHECK_GL_ERROR(); @@ -1690,6 +1693,8 @@ void OpenGL3DRenderer::RenderTextShape() void OpenGL3DRenderer::CreateSceneBoxView() { + m_CameraInfo.cameraPos = glm::vec3(m_GlobalScaleMatrix * glm::vec4(m_CameraInfo.cameraPos, 1.0)); + m_CameraInfo.cameraOrg = glm::vec3(m_GlobalScaleMatrix * glm::vec4(m_CameraInfo.cameraOrg, 1.0)); m_3DView = glm::lookAt(m_CameraInfo.cameraPos, m_CameraInfo.cameraOrg, m_CameraInfo.cameraUp); @@ -1810,6 +1815,7 @@ void OpenGL3DRenderer::GetBatchMiddleInfo(const Extrude3DInfo &extrude3D) glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); m_Model = aTranslationMatrix * extrude3D.rotation * scale; } + m_Model =m_GlobalScaleMatrix * m_Model; glm::mat3 normalMatrix(m_Model); glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); m_BarSurface[MIDDLE_SURFACE].modelMatrixList.push_back(m_Model); @@ -1844,6 +1850,7 @@ void OpenGL3DRenderer::GetBatchTopAndFlatInfo(const Extrude3DInfo &extrude3D) glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); m_Model = aTranslationMatrix * extrude3D.rotation * topTrans * topScale * orgTrans; } + m_Model =m_GlobalScaleMatrix * m_Model; glm::mat3 normalMatrix(m_Model); glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); m_BarSurface[TOP_SURFACE].modelMatrixList.push_back(m_Model); @@ -1853,6 +1860,7 @@ void OpenGL3DRenderer::GetBatchTopAndFlatInfo(const Extrude3DInfo &extrude3D) glm::mat4 aTranslationMatrix = glm::translate(glm::vec3(trans.x, trans.y, trans.z)); glm::mat4 flatScale = glm::scale(xyScale, xyScale, xyScale); m_Model = aTranslationMatrix * extrude3D.rotation * flatScale; + m_Model =m_GlobalScaleMatrix * m_Model; normalMatrix = glm::mat3(m_Model); normalInverseTranspos = glm::inverseTranspose(normalMatrix); @@ -1878,6 +1886,7 @@ void OpenGL3DRenderer::GetBatchBarsInfo() glm::mat4 transformMatrix = glm::translate(glm::vec3(extrude3DInfo.xTransform, extrude3DInfo.yTransform, extrude3DInfo.zTransform)); glm::mat4 scaleMatrix = glm::scale(extrude3DInfo.xScale, extrude3DInfo.yScale, extrude3DInfo.zScale); m_Model = transformMatrix * extrude3DInfo.rotation * scaleMatrix; + m_Model = m_GlobalScaleMatrix * m_Model; glm::mat3 normalMatrix(m_Model); glm::mat3 normalInverseTranspos = glm::inverseTranspose(normalMatrix); m_BarSurface[0].modelMatrixList.push_back(m_Model); commit 29eceedd7b290ea19aa8deb987b5d6f1fa355198 Author: weigao <[email protected]> Date: Mon Jun 9 23:46:03 2014 -0700 Modified the depth bit to 24 Change-Id: I57387f9250c0c62c3cab7a75571d001fef99fdb4 diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx index 71e9409..548790d 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -204,7 +204,7 @@ bool InitMultisample(PIXELFORMATDESCRIPTOR pfd, int& rPixelFormat) WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB, WGL_COLOR_BITS_ARB,24, WGL_ALPHA_BITS_ARB,8, - WGL_DEPTH_BITS_ARB,16, + WGL_DEPTH_BITS_ARB,24, WGL_STENCIL_BITS_ARB,0, WGL_DOUBLE_BUFFER_ARB,GL_TRUE, WGL_SAMPLE_BUFFERS_ARB,GL_TRUE, commit 9284a63adddde51ceb4730b870391b1e2af3de4a Author: Markus Mohrhard <[email protected]> Date: Mon Jun 9 11:27:28 2014 +0200 iprevent violation of exception spec Change-Id: I1f638ae3a2e88e0cadaab0046ef087fe77e16b06 diff --git a/basic/source/uno/namecont.cxx b/basic/source/uno/namecont.cxx index 78fbb35..01250f4 100644 --- a/basic/source/uno/namecont.cxx +++ b/basic/source/uno/namecont.cxx @@ -2434,7 +2434,12 @@ void SAL_CALL SfxLibraryContainer::loadLibrary( const OUString& Name ) aFile = aElementName; aFile += "."; aFile += maLibElementFileExtension; - xElementStream = xLibraryStor->openStreamElement( aFile, embed::ElementModes::READ ); + try + { + xElementStream = xLibraryStor->openStreamElement( aFile, embed::ElementModes::READ ); + } + catch(const uno::Exception& ) + {} } if ( xElementStream.is() ) _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
