sc/source/core/opencl/formulagroupcl.cxx | 35 ++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 10 deletions(-)
New commits: commit cccf45a3d3ea6b06e6c8a507645d23505a91e8d5 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Tue Dec 16 18:52:48 2014 -0500 Split the wait-for-result part and push-result-to-doc part. Change-Id: I496fa9274922603f4c7efdcab90e66a23df741fa diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 28519b5..5a2bca4 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -3659,28 +3659,31 @@ class CLInterpreterResult SCROW mnGroupLength; + cl_mem mpCLResBuf; + double* mpResBuf; + public: - CLInterpreterResult() : mpKernel(NULL), mnGroupLength(0) {} + CLInterpreterResult() : mpKernel(NULL), mnGroupLength(0), mpCLResBuf(NULL), mpResBuf(NULL) {} CLInterpreterResult( DynamicKernel* pKernel, SCROW nGroupLength ) : - mpKernel(pKernel), mnGroupLength(nGroupLength) {} + mpKernel(pKernel), mnGroupLength(nGroupLength), mpCLResBuf(NULL), mpResBuf(NULL) {} bool isValid() const { return mpKernel != NULL; } - bool pushResultToDocument( ScDocument& rDoc, const ScAddress& rTopPos ) + void waitForResult() { if (!isValid()) - return false; + return; // Map results back - cl_mem res = mpKernel->GetResultBuffer(); + mpCLResBuf = mpKernel->GetResultBuffer(); // Obtain cl context ::opencl::KernelEnv kEnv; ::opencl::setKernelEnv(&kEnv); cl_int err; - double* resbuf = (double*)clEnqueueMapBuffer(kEnv.mpkCmdQueue, - res, + mpResBuf = (double*)clEnqueueMapBuffer(kEnv.mpkCmdQueue, + mpCLResBuf, CL_TRUE, CL_MAP_READ, 0, mnGroupLength * sizeof(double), 0, NULL, NULL, &err); @@ -3688,12 +3691,22 @@ public: if (err != CL_SUCCESS) { SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error: " << err); - return false; + mpResBuf = NULL; } + } + + bool pushResultToDocument( ScDocument& rDoc, const ScAddress& rTopPos ) + { + if (!mpResBuf) + return false; - rDoc.SetFormulaResults(rTopPos, resbuf, mnGroupLength); + rDoc.SetFormulaResults(rTopPos, mpResBuf, mnGroupLength); - err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, res, resbuf, 0, NULL, NULL); + // Obtain cl context + ::opencl::KernelEnv kEnv; + ::opencl::setKernelEnv(&kEnv); + + cl_int err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, mpCLResBuf, mpResBuf, 0, NULL, NULL); if (err != CL_SUCCESS) { SAL_WARN("sc.opencl", "Dynamic formula compiler: OpenCL error: " << err); @@ -3826,6 +3839,8 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, if (!aRes.isValid()) return false; + aRes.waitForResult(); + return aRes.pushResultToDocument(rDoc, rTopPos); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits