summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--officecfg/registry/schema/org/openoffice/Office/Calc.xcs8
-rw-r--r--sc/inc/calcconfig.hxx16
-rw-r--r--sc/source/core/opencl/openclwrapper.cxx51
-rw-r--r--sc/source/core/tool/calcconfig.cxx12
-rw-r--r--sc/source/core/tool/formulaopt.cxx6
-rw-r--r--sc/source/ui/optdlg/calcoptionsdlg.cxx25
-rw-r--r--sc/source/ui/optdlg/calcoptionsdlg.hxx3
-rw-r--r--sc/uiconfig/scalc/ui/formulacalculationoptions.ui31
8 files changed, 62 insertions, 90 deletions
diff --git a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
index aa44d84c4330..c7aac17a05ed 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Calc.xcs
@@ -1392,16 +1392,16 @@
<prop oor:name="OpenCLBlackList" oor:type="oor:string-list" oor:nillable="false">
<!-- UIHints: Tools - Options Spreadsheet Formula -->
<info>
- <desc>Combinations of (OS, OS version, OpenCL platform vendor, OpenCL device name, OpenCL driver version) that are known to be bad. Each entry is a string consisting of six parts separated by slashes. In case a slash, percent or semicolon occurs inside a part, it is replaced by a percent followed by the corresponding number as two hex digits. Any part might contain a single asterisk as a wildcard, matching any value, but there is no more generic regexp support. Has higher priority than OpenCLWhiteList.</desc>
+ <desc>Combinations of (OS, OS version, OpenCL platform vendor, OpenCL device name, OpenCL driver version) that are known to be bad. Each entry is a string consisting of five parts separated by slashes. An empty part matches anything. In case a slash, percent or semicolon occurs inside a part, it is replaced by a percent followed by the corresponding number as two hex digits. The parts except OS can contain regular expressions. Inside these regular expressions the usual characters .*()[]\ are special and should be quoted with a backslash to be interpreted literally. OS should be just one of "Linux", "OS X" (including the space) or "Windows" (without quotes). Has higher priority than OpenCLWhiteList.</desc>
</info>
- <value oor:separator=";">Windows/*/Intel(R) Corporation/*/9.17.10.2884/</value>
+ <value oor:separator=";">Windows//Intel\(R\) Corporation//9\.17\.10\.2884</value>
</prop>
<prop oor:name="OpenCLWhiteList" oor:type="oor:string-list" oor:nillable="false">
<!-- UIHints: Tools - Options Spreadsheet Formula -->
<info>
- <desc>Like OpenCLWhiteList, but for combinations known to be good.</desc>
+ <desc>Like OpenCLBlackList, but for combinations known to be good.</desc>
</info>
- <value oor:separator=";">Linux/*/Advanced Micro Devices, Inc./*/1445.5 (sse2,avx)/;*/*/Advanced Micro Devices, Inc./*/*/;*/*/Intel(R) Corporation/*/*/;*/*/NVIDIA Corporation/*/*/</value>
+ <value oor:separator=";">Linux//Advanced Micro Devices, Inc\.//1445\.5 \(sse2,avx\);//Advanced Micro Devices, Inc\.//;//Intel\(R\) Corporation//;//NVIDIA Corporation//</value>
</prop>
</group>
<group oor:name="Syntax">
diff --git a/sc/inc/calcconfig.hxx b/sc/inc/calcconfig.hxx
index 40a33b6bcd7b..2b93fa3bb171 100644
--- a/sc/inc/calcconfig.hxx
+++ b/sc/inc/calcconfig.hxx
@@ -47,8 +47,7 @@ struct SC_DLLPUBLIC ScCalcConfig
OUString maOSVersion;
OUString maPlatformVendor;
OUString maDevice;
- OUString maDriverVersionMin;
- OUString maDriverVersionMax;
+ OUString maDriverVersion;
OpenCLImplMatcher()
{
@@ -58,14 +57,12 @@ struct SC_DLLPUBLIC ScCalcConfig
const OUString& rOSVersion,
const OUString& rPlatformVendor,
const OUString& rDevice,
- const OUString& rDriverVersionMin,
- const OUString& rDriverVersionMax)
+ const OUString& rDriverVersion)
: maOS(rOS),
maOSVersion(rOSVersion),
maPlatformVendor(rPlatformVendor),
maDevice(rDevice),
- maDriverVersionMin(rDriverVersionMin),
- maDriverVersionMax(rDriverVersionMax)
+ maDriverVersion(rDriverVersion)
{
}
@@ -75,8 +72,7 @@ struct SC_DLLPUBLIC ScCalcConfig
maOSVersion == r.maOSVersion &&
maPlatformVendor == r.maPlatformVendor &&
maDevice == r.maDevice &&
- maDriverVersionMin == r.maDriverVersionMin &&
- maDriverVersionMax == r.maDriverVersionMax;
+ maDriverVersion == r.maDriverVersion;
}
bool operator!=(const OpenCLImplMatcher& r) const
{
@@ -92,9 +88,7 @@ struct SC_DLLPUBLIC ScCalcConfig
(maPlatformVendor == r.maPlatformVendor &&
(maDevice < r.maDevice ||
(maDevice == r.maDevice &&
- (maDriverVersionMin < r.maDriverVersionMin ||
- (maDriverVersionMin == r.maDriverVersionMin &&
- maDriverVersionMax < r.maDriverVersionMax))))))))));
+ (maDriverVersion < r.maDriverVersion)))))))));
}
};
diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index 87cc1c56ed5a..1e4bb7aee42b 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -9,24 +9,26 @@
#include <config_folders.h>
+#include "calcconfig.hxx"
+#include "interpre.hxx"
+#include "opencl_device.hxx"
#include "openclwrapper.hxx"
#include <comphelper/string.hxx>
-#include <rtl/ustring.hxx>
-#include <rtl/strbuf.hxx>
-#include <rtl/digest.h>
+#include <osl/file.hxx>
#include <rtl/bootstrap.hxx>
-#include <boost/scoped_array.hpp>
-
+#include <rtl/digest.h>
+#include <rtl/strbuf.hxx>
+#include <rtl/ustring.hxx>
#include <sal/config.h>
-#include <osl/file.hxx>
-#include "calcconfig.hxx"
-#include "interpre.hxx"
-#include "opencl_device.hxx"
+
+#include <boost/scoped_array.hpp>
+#include <unicode/regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+
#include <cmath>
#ifdef _WIN32
@@ -517,31 +519,44 @@ bool OpenCLDevice::initOpenCLRunEnv( GPUEnv *gpuInfo )
namespace {
+bool match(const OUString& rPattern, const OUString& rInput)
+{
+ if (rPattern == "")
+ return true;
+
+ UErrorCode nIcuError(U_ZERO_ERROR);
+ icu::UnicodeString sIcuPattern(reinterpret_cast<const UChar*>(rPattern.getStr()), rPattern.getLength());
+ icu::UnicodeString sIcuInput(reinterpret_cast<const UChar*>(rInput.getStr()), rInput.getLength());
+ RegexMatcher aMatcher(sIcuPattern, sIcuInput, 0, nIcuError);
+
+ if (nIcuError == U_ZERO_ERROR && aMatcher.matches(nIcuError) && nIcuError == U_ZERO_ERROR)
+ return true;
+
+ return false;
+}
+
bool match(const ScCalcConfig::OpenCLImplMatcher& rListEntry, const OpenCLPlatformInfo& rPlatform, const OpenCLDeviceInfo& rDevice)
{
#if defined WNT
- if (rListEntry.maOS != "*" && rListEntry.maOS != "Windows")
+ if (rListEntry.maOS != "" && rListEntry.maOS != "Windows")
return false;
#elif defined LINUX
- if (rListEntry.maOS != "*" && rListEntry.maOS != "Linux")
+ if (rListEntry.maOS != "" && rListEntry.maOS != "Linux")
return false;
#elif defined MACOSX
- if (rListEntry.maOS != "*" && rListEntry.maOS != "OS X")
+ if (rListEntry.maOS != "" && rListEntry.maOS != "OS X")
return false;
#endif
// OS version check not yet implemented
- if (rListEntry.maPlatformVendor != "*" && rListEntry.maPlatformVendor != rPlatform.maVendor)
+ if (!match(rListEntry.maPlatformVendor, rPlatform.maVendor))
return false;
- if (rListEntry.maDevice != "*" && rListEntry.maDevice != rDevice.maName)
+ if (!match(rListEntry.maDevice, rDevice.maName))
return false;
- if (rListEntry.maDriverVersionMin != "*" &&
- (comphelper::string::compareVersionStrings(rListEntry.maDriverVersionMin, rDevice.maDriver) > 0 ||
- (rListEntry.maDriverVersionMax != "" && comphelper::string::compareVersionStrings(rListEntry.maDriverVersionMax, rDevice.maDriver) < 0) ||
- (rListEntry.maDriverVersionMax == "" && comphelper::string::compareVersionStrings(rListEntry.maDriverVersionMin, rDevice.maDriver) < 0)))
+ if (!match(rListEntry.maDriverVersion, rDevice.maDriver))
return false;
return true;
diff --git a/sc/source/core/tool/calcconfig.cxx b/sc/source/core/tool/calcconfig.cxx
index 69abb2d44564..7c9ace9bb868 100644
--- a/sc/source/core/tool/calcconfig.cxx
+++ b/sc/source/core/tool/calcconfig.cxx
@@ -69,15 +69,15 @@ void ScCalcConfig::setOpenCLConfigToDefault()
// This entry we have had for some time (when blacklisting was
// done elsewhere in the code), so presumably there is a known
// good reason for it.
- maOpenCLBlackList.insert(OpenCLImplMatcher("Windows", "*", "Intel(R) Corporation", "*", "9.17.10.2884", ""));
+ maOpenCLBlackList.insert(OpenCLImplMatcher("Windows", "", "Intel\\(R\\) Corporation", "", "9\\.17\\.10\\.2884"));
// This is what I have tested on Linux and it works for our unit tests.
- maOpenCLWhiteList.insert(OpenCLImplMatcher("Linux", "*", "Advanced Micro Devices, Inc.", "*", "1445.5 (sse2,avx)", ""));
+ maOpenCLWhiteList.insert(OpenCLImplMatcher("Linux", "", "Advanced Micro Devices, Inc\\.", "", "1445\\.5 \\(sse2,avx\\)"));
// For now, assume that AMD, Intel and NVIDIA drivers are good
- maOpenCLWhiteList.insert(OpenCLImplMatcher("*", "*", "Advanced Micro Devices, Inc.", "*", "*", ""));
- maOpenCLWhiteList.insert(OpenCLImplMatcher("*", "*", "Intel(R) Corporation", "*", "*", ""));
- maOpenCLWhiteList.insert(OpenCLImplMatcher("*", "*", "NVIDIA Corporation", "*", "*", ""));
+ maOpenCLWhiteList.insert(OpenCLImplMatcher("", "", "Advanced Micro Devices, Inc\\.", "", ""));
+ maOpenCLWhiteList.insert(OpenCLImplMatcher("", "", "Intel\\(R\\) Corporation", "", ""));
+ maOpenCLWhiteList.insert(OpenCLImplMatcher("", "", "NVIDIA Corporation", "", ""));
}
void ScCalcConfig::reset()
@@ -122,7 +122,7 @@ std::ostream& operator<<(std::ostream& rStream, const ScCalcConfig::OpenCLImplMa
"OSVersion=" << rImpl.maOSVersion << ","
"PlatformVendor=" << rImpl.maPlatformVendor << ","
"Device=" << rImpl.maDevice << ","
- "DriverVersion=[" << rImpl.maDriverVersionMin << "," << rImpl.maDriverVersionMax << "]"
+ "DriverVersion=" << rImpl.maDriverVersion <<
"}";
return rStream;
diff --git a/sc/source/core/tool/formulaopt.cxx b/sc/source/core/tool/formulaopt.cxx
index c5ff895ca466..9f05a01ec2d5 100644
--- a/sc/source/core/tool/formulaopt.cxx
+++ b/sc/source/core/tool/formulaopt.cxx
@@ -293,8 +293,7 @@ css::uno::Sequence<OUString> SetOfOpenCLImplMatcherToStringSequence(std::set<ScC
(*i).maOSVersion.replaceAll("%", "%25").replaceAll("/", "%2F").replaceAll(";", "%3B") + "/" +
(*i).maPlatformVendor.replaceAll("%", "%25").replaceAll("/", "%2F").replaceAll(";", "%3B") + "/" +
(*i).maDevice.replaceAll("%", "%25").replaceAll("/", "%2F").replaceAll(";", "%3B") + "/" +
- (*i).maDriverVersionMin.replaceAll("%", "%25").replaceAll("/", "%2F").replaceAll(";", "%3B") + "/" +
- (*i).maDriverVersionMax.replaceAll("%", "%25").replaceAll("/", "%2F").replaceAll(";", "%3B");
+ (*i).maDriverVersion.replaceAll("%", "%25").replaceAll("/", "%2F").replaceAll(";", "%3B");
}
return result;
@@ -337,8 +336,7 @@ std::set<ScCalcConfig::OpenCLImplMatcher> StringSequenceToSetOfOpenCLImplMatcher
m.maOSVersion = getToken(*i, index);
m.maPlatformVendor = getToken(*i, index);
m.maDevice = getToken(*i, index);
- m.maDriverVersionMin = getToken(*i, index);
- m.maDriverVersionMax = getToken(*i, index);
+ m.maDriverVersion = getToken(*i, index);
result.insert(m);
}
diff --git a/sc/source/ui/optdlg/calcoptionsdlg.cxx b/sc/source/ui/optdlg/calcoptionsdlg.cxx
index 046fd7f16151..acf931861ffa 100644
--- a/sc/source/ui/optdlg/calcoptionsdlg.cxx
+++ b/sc/source/ui/optdlg/calcoptionsdlg.cxx
@@ -160,8 +160,7 @@ ScCalcOptionsDialog::ScCalcOptionsDialog(vcl::Window* pParent, const ScCalcConfi
get(mpOSVersion, "osversion");
get(mpPlatformVendor, "platformvendor");
get(mpDevice, "opencldevice");
- get(mpDriverVersionMin, "opencldriverversionmin");
- get(mpDriverVersionMax, "opencldriverversionmax");
+ get(mpDriverVersion, "opencldriverversion");
get(mpListNewButton, "listbox-new");
get(mpListDeleteButton, "listbox-delete");
get(mpTestButton, "test");
@@ -178,8 +177,7 @@ ScCalcOptionsDialog::ScCalcOptionsDialog(vcl::Window* pParent, const ScCalcConfi
mpOSVersion->SetModifyHdl(LINK(this, ScCalcOptionsDialog, EditModifiedHdl));
mpPlatformVendor->SetModifyHdl(LINK(this, ScCalcOptionsDialog, EditModifiedHdl));
mpDevice->SetModifyHdl(LINK(this, ScCalcOptionsDialog, EditModifiedHdl));
- mpDriverVersionMin->SetModifyHdl(LINK(this, ScCalcOptionsDialog, EditModifiedHdl));
- mpDriverVersionMax->SetModifyHdl(LINK(this, ScCalcOptionsDialog, EditModifiedHdl));
+ mpDriverVersion->SetModifyHdl(LINK(this, ScCalcOptionsDialog, EditModifiedHdl));
mpOpenCLWhiteAndBlackListBox->set_height_request(4* mpOpenCLWhiteAndBlackListBox->GetTextHeight());
mpOpenCLWhiteAndBlackListBox->SetStyle(mpOpenCLWhiteAndBlackListBox->GetStyle() | WB_CLIPCHILDREN | WB_FORCE_MAKEVISIBLE);
@@ -332,10 +330,7 @@ OUString format(const ScCalcConfig::OpenCLImplMatcher& rImpl)
rImpl.maOSVersion + " " +
rImpl.maPlatformVendor + " " +
rImpl.maDevice + " " +
- (rImpl.maDriverVersionMax != "" ?
- OUString("[") + rImpl.maDriverVersionMin + "," + rImpl.maDriverVersionMax + "]" :
- rImpl.maDriverVersionMin)
- );
+ rImpl.maDriverVersion);
}
void fillListBox(ListBox* pListBox, const ScCalcConfig::OpenCLImplMatcherSet& rSet)
@@ -809,13 +804,9 @@ void ScCalcOptionsDialog::EditFieldValueChanged(Control *pCtrl)
{
newImpl.maDevice = sVal;
}
- else if (&rEdit == mpDriverVersionMin)
+ else if (&rEdit == mpDriverVersion)
{
- newImpl.maDriverVersionMin = sVal;
- }
- else if (&rEdit == mpDriverVersionMax)
- {
- newImpl.maDriverVersionMax = sVal;
+ newImpl.maDriverVersion = sVal;
}
else
assert(false && "rEdit does not match any of the Edit fields");
@@ -924,8 +915,7 @@ IMPL_LINK(ScCalcOptionsDialog, OpenCLWhiteAndBlackListSelHdl, Control*, )
mpOSVersion->SetText(impl.maOSVersion);
mpPlatformVendor->SetText(impl.maPlatformVendor);
mpDevice->SetText(impl.maDevice);
- mpDriverVersionMin->SetText(impl.maDriverVersionMin);
- mpDriverVersionMax->SetText(impl.maDriverVersionMax);
+ mpDriverVersion->SetText(impl.maDriverVersion);
return 0;
}
@@ -939,8 +929,7 @@ IMPL_LINK( ScCalcOptionsDialog, ListNewClickHdl, PushButton*, )
mpOSVersion->SetText("");
mpPlatformVendor->SetText("");
mpDevice->SetText("");
- mpDriverVersionMin->SetText("");
- mpDriverVersionMax->SetText("");
+ mpDriverVersion->SetText("");
rSet.insert(aEmpty);
#if HAVE_FEATURE_OPENCL
diff --git a/sc/source/ui/optdlg/calcoptionsdlg.hxx b/sc/source/ui/optdlg/calcoptionsdlg.hxx
index e1a1370daeff..705873cde91c 100644
--- a/sc/source/ui/optdlg/calcoptionsdlg.hxx
+++ b/sc/source/ui/optdlg/calcoptionsdlg.hxx
@@ -83,8 +83,7 @@ private:
Edit* mpOSVersion;
Edit* mpPlatformVendor;
Edit* mpDevice;
- Edit* mpDriverVersionMin;
- Edit* mpDriverVersionMax;
+ Edit* mpDriverVersion;
PushButton* mpListNewButton;
PushButton* mpListDeleteButton;
PushButton* mpTestButton;
diff --git a/sc/uiconfig/scalc/ui/formulacalculationoptions.ui b/sc/uiconfig/scalc/ui/formulacalculationoptions.ui
index 5d359ebc78cc..a157f8d92283 100644
--- a/sc/uiconfig/scalc/ui/formulacalculationoptions.ui
+++ b/sc/uiconfig/scalc/ui/formulacalculationoptions.ui
@@ -302,12 +302,12 @@
</packing>
</child>
<child>
- <object class="GtkLabel" id="opencldriverversionminlabel">
+ <object class="GtkLabel" id="opencldriverversionlabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
- <property name="label" translatable="yes">OpenCL Driver Version Lower Bound</property>
- <property name="mnemonic_widget">opencldriverversionmin:border</property>
+ <property name="label" translatable="yes">OpenCL Driver Version</property>
+ <property name="mnemonic_widget">opencldriverversion:border</property>
</object>
<packing>
<property name="left_attach">0</property>
@@ -315,7 +315,7 @@
</packing>
</child>
<child>
- <object class="GtkEntry" id="opencldriverversionmin:border">
+ <object class="GtkEntry" id="opencldriverversion:border">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
@@ -324,29 +324,6 @@
<property name="top_attach">9</property>
</packing>
</child>
- <child>
- <object class="GtkLabel" id="opencldriverversionmaxlabel">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">OpenCL Driver Version Upper Bound</property>
- <property name="mnemonic_widget">opencldriverversionmax:border</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">10</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="opencldriverversionmax:border">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">11</property>
- </packing>
- </child>
</object>
<packing>
<property name="left_attach">1</property>