[Libreoffice-commits] core.git: Branch 'private/tml/opencl-background-compilation' - sc/source
Tor Lillqvist
tml at collabora.com
Mon Nov 18 08:01:55 PST 2013
sc/source/core/data/formulacell.cxx | 2 +-
sc/source/core/inc/dynamickernel.hxx | 5 ++++-
sc/source/core/opencl/formulagroupcl.cxx | 17 ++++++++++-------
3 files changed, 15 insertions(+), 9 deletions(-)
New commits:
commit aa0389ab7ee0fc2070a595b9d2242e8f1f873ea3
Author: Tor Lillqvist <tml at collabora.com>
Date: Mon Nov 18 17:59:30 2013 +0200
Fix some life-cycle issues for backgroup OpenCL kernel compilation
Now it no longer asserts or crashes in light testing, but it doesn't
properly recalculate either.
Change-Id: I7dc117341eff5ac1b21d7400122cc6e04ae2baf7
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 9f6fa00..cf4516d 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -1771,7 +1771,7 @@ void ScFormulaCell::SetDirty( bool bDirtyFlag )
void ScFormulaCell::SetDirtyVar()
{
bDirty = true;
- if (mxGroup)
+ if (mxGroup && mxGroup->meCalcState == sc::GroupCalcRunning)
mxGroup->meCalcState = sc::GroupCalcEnabled;
// mark the sheet of this cell to be calculated
diff --git a/sc/source/core/inc/dynamickernel.hxx b/sc/source/core/inc/dynamickernel.hxx
index 5d5780f..e4a42aa 100644
--- a/sc/source/core/inc/dynamickernel.hxx
+++ b/sc/source/core/inc/dynamickernel.hxx
@@ -63,7 +63,7 @@ class DynamicKernel : public CompiledFormula
{
private:
DynamicKernel(FormulaTreeNodeRef r):mpRoot(r),
- mpProgram(NULL), mpKernel(NULL), mpResClmem(NULL) {}
+ mpProgram(NULL), mpKernel(NULL), mpResClmem(NULL), mpCode(NULL) {}
public:
static DynamicKernel *create(ScDocument& rDoc,
@@ -88,6 +88,8 @@ public:
cl_mem GetResultBuffer(void) const { return mpResClmem; }
+ void SetPCode(ScTokenArray *pCode) { mpCode = pCode; }
+
private:
void TraverseAST(FormulaTreeNodeRef);
FormulaTreeNodeRef mpRoot;
@@ -99,6 +101,7 @@ private:
cl_mem mpResClmem; // Results
std::set<std::string> inlineDecl;
std::set<std::string> inlineFun;
+ ScTokenArray *mpCode;
};
}
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index 3465dd9..a66e4e1 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -50,7 +50,6 @@ namespace sc { namespace opencl {
size_t DynamicKernelArgument::Marshal(cl_kernel k, int argno, int)
{
FormulaToken *ref = mFormulaTree->GetFormulaToken();
- assert(mpClmem == NULL);
double *pHostBuffer = NULL;
size_t szHostBuffer = 0;
if (ref->GetType() == formula::svSingleVectorRef) {
@@ -131,7 +130,6 @@ public:
virtual size_t Marshal(cl_kernel k, int argno, int)
{
FormulaToken *ref = mFormulaTree->GetFormulaToken();
- assert(mpClmem == NULL);
cl_uint hashCode = 0;
if (ref->GetType() == formula::svString)
{
@@ -221,7 +219,6 @@ public:
size_t DynamicKernelStringArgument::Marshal(cl_kernel k, int argno, int)
{
FormulaToken *ref = mFormulaTree->GetFormulaToken();
- assert(mpClmem == NULL);
// Obtain cl context
KernelEnv kEnv;
OpenclDevice::setKernelEnv(&kEnv);
@@ -1382,6 +1379,8 @@ DynamicKernel::~DynamicKernel()
std::cerr<<"Freeing kernel "<< GetMD5() << " program\n";
clReleaseProgram(mpProgram);
}
+ if (mpCode)
+ delete mpCode;
}
/// Build code
void DynamicKernel::CreateKernel(void)
@@ -1537,14 +1536,16 @@ CompiledFormula* FormulaGroupInterpreterOpenCL::createCompiledFormula(ScDocument
ScFormulaCellGroupRef& xGroup,
ScTokenArray& rCode)
{
- ScTokenArray aCode;
- ScGroupTokenConverter aConverter(aCode, rDoc, *xGroup->mpTopCell, rTopPos);
+ ScTokenArray *pCode = new ScTokenArray();
+ ScGroupTokenConverter aConverter(*pCode, rDoc, *xGroup->mpTopCell, rTopPos);
if (!aConverter.convert(rCode))
{
return NULL;
}
- return DynamicKernel::create(rDoc, rTopPos, aCode);
+ DynamicKernel *result = DynamicKernel::create(rDoc, rTopPos, *pCode);
+ result->SetPCode(pCode);
+ return result;
}
bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc,
@@ -1572,6 +1573,7 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc,
}
else
{
+ assert(xGroup->meCalcState == sc::GroupCalcRunning);
aGuard.clear();
pKernel = static_cast<DynamicKernel*>(createCompiledFormula(rDoc, rTopPos, xGroup, rCode));
}
@@ -1599,7 +1601,8 @@ bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc,
err = clEnqueueUnmapMemObject(kEnv.mpkCmdQueue, res, resbuf, 0, NULL, NULL);
if (err != CL_SUCCESS)
throw OpenCLError(err);
- delete pKernel;
+ if (xGroup->meCalcState == sc::GroupCalcRunning)
+ delete pKernel;
return true;
}
catch (const UnhandledToken &ut) {
More information about the Libreoffice-commits
mailing list