summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2014-12-16 18:52:48 -0500
committerKohei Yoshida <kohei.yoshida@collabora.com>2014-12-16 19:16:23 -0500
commitcccf45a3d3ea6b06e6c8a507645d23505a91e8d5 (patch)
tree6d5bc7b61d2e9935d0c23ce82b21804affbbc71f
parent1dd1dfc152c7cbeb374fe4f38b08c6af9cef2c06 (diff)
Split the wait-for-result part and push-result-to-doc part.
Change-Id: I496fa9274922603f4c7efdcab90e66a23df741fa
-rw-r--r--sc/source/core/opencl/formulagroupcl.cxx35
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);
}