diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-12-16 18:52:48 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-12-16 19:16:23 -0500 |
commit | cccf45a3d3ea6b06e6c8a507645d23505a91e8d5 (patch) | |
tree | 6d5bc7b61d2e9935d0c23ce82b21804affbbc71f | |
parent | 1dd1dfc152c7cbeb374fe4f38b08c6af9cef2c06 (diff) |
Split the wait-for-result part and push-result-to-doc part.
Change-Id: I496fa9274922603f4c7efdcab90e66a23df741fa
-rw-r--r-- | sc/source/core/opencl/formulagroupcl.cxx | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 28519b581280..5a2bca4e9e24 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); } |