[Libreoffice-commits] core.git: Branch 'feature/calc-pluggable-opencl' - sc/inc sc/Library_scopencl.mk sc/Library_scui.mk sc/source sc/uiconfig
Markus Mohrhard
markus.mohrhard at googlemail.com
Fri Sep 13 05:20:44 PDT 2013
sc/Library_scopencl.mk | 1
sc/Library_scui.mk | 1
sc/inc/platforminfo.hxx | 40 +++++++
sc/source/core/opencl/openclwrapper.cxx | 89 +++++++++++++++++
sc/source/core/opencl/openclwrapper.hxx | 3
sc/source/core/opencl/platforminfo.cxx | 24 ++++
sc/source/ui/optdlg/calcoptionsdlg.cxx | 52 +++++++++-
sc/source/ui/optdlg/calcoptionsdlg.hxx | 10 +
sc/uiconfig/scalc/ui/formulacalculationoptions.ui | 111 ++++++++++++++++++++--
9 files changed, 322 insertions(+), 9 deletions(-)
New commits:
commit 3f41ef4c5fe059628c17a560df7e0ec697871903
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date: Fri Sep 13 14:11:43 2013 +0200
inital work on showing available opencl platforms/devices
Change-Id: I7e9beb3abeee42b19788980d43fb1ab5140e3e65
diff --git a/sc/Library_scopencl.mk b/sc/Library_scopencl.mk
index 2942e47..44137826 100644
--- a/sc/Library_scopencl.mk
+++ b/sc/Library_scopencl.mk
@@ -35,6 +35,7 @@ $(eval $(call gb_Library_use_libraries,scopencl,\
$(eval $(call gb_Library_add_exception_objects,scopencl,\
sc/source/core/opencl/formulagroupcl \
+ sc/source/core/opencl/platforminfo \
sc/source/core/opencl/openclwrapper \
sc/source/core/opencl/clcc/clew \
))
diff --git a/sc/Library_scui.mk b/sc/Library_scui.mk
index f553dde..85028ee 100644
--- a/sc/Library_scui.mk
+++ b/sc/Library_scui.mk
@@ -35,6 +35,7 @@ $(eval $(call gb_Library_use_libraries,scui,\
i18nlangtag \
sal \
sc \
+ scopencl \
sfx \
sot \
svl \
diff --git a/sc/inc/platforminfo.hxx b/sc/inc/platforminfo.hxx
new file mode 100644
index 0000000..bae6e41
--- /dev/null
+++ b/sc/inc/platforminfo.hxx
@@ -0,0 +1,40 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef SC_PLATFORM_INFO_HXX
+#define SC_PLATFORM_INFO_HXX
+
+#include <vector>
+
+#include <rtl/ustring.hxx>
+
+#include "scdllapi.h"
+
+namespace sc {
+
+struct SC_DLLPUBLIC OpenclDeviceInfo
+{
+ size_t mnId;
+ OUString maName;
+ OUString maVendor;
+};
+
+struct SC_DLLPUBLIC OpenclPlatformInfo
+{
+ void* mnId;
+ OUString maVendor;
+ OUString maName;
+ std::vector<OpenclDeviceInfo> maDevices;
+};
+
+SC_DLLPUBLIC std::vector<OpenclPlatformInfo> listAllOpenclPlatforms();
+
+}
+
+#endif
diff --git a/sc/source/core/opencl/openclwrapper.cxx b/sc/source/core/opencl/openclwrapper.cxx
index c1791f9..a45241c 100644
--- a/sc/source/core/opencl/openclwrapper.cxx
+++ b/sc/source/core/opencl/openclwrapper.cxx
@@ -9,6 +9,9 @@
#include "openclwrapper.hxx"
+#include <rtl/ustring.hxx>
+#include <boost/scoped_array.hpp>
+
#include "sal/config.h"
#include "oclkernels.hxx"
@@ -2628,6 +2631,92 @@ int OclCalc::oclHostMatrixInverse32Bits( const char* aKernelName, float *fpOclMa
return 0;
}
+namespace {
+
+void createDeviceInfo(cl_device_id aDeviceId, OpenclPlatformInfo& rPlatformInfo)
+{
+ OpenclDeviceInfo aDeviceInfo;
+ char pName[64];
+ cl_int nState = clGetDeviceInfo(aDeviceId, CL_DEVICE_NAME, 64, pName, NULL);
+ if(nState != CL_SUCCESS)
+ return;
+
+ aDeviceInfo.maName = OUString::createFromAscii(pName);
+
+ char pVendor[64];
+ nState = clGetDeviceInfo(aDeviceId, CL_DEVICE_VENDOR, 64, pName, NULL);
+ if(nState != CL_SUCCESS)
+ return;
+
+ aDeviceInfo.maVendor = OUString::createFromAscii(pVendor);
+
+ rPlatformInfo.maDevices.push_back(aDeviceInfo);
+}
+
+bool createPlatformInfo(cl_platform_id nPlatformId, OpenclPlatformInfo& rPlatformInfo)
+{
+ rPlatformInfo.mnId = nPlatformId;
+ char pName[64];
+ cl_int nState = clGetPlatformInfo(nPlatformId, CL_PLATFORM_NAME, 64,
+ pName, NULL);
+ if(nState != CL_SUCCESS)
+ return false;
+ rPlatformInfo.maName = OUString::createFromAscii(pName);
+
+ char pVendor[64];
+ nState = clGetPlatformInfo(nPlatformId, CL_PLATFORM_VENDOR, 64,
+ pVendor, NULL);
+ if(nState != CL_SUCCESS)
+ return false;
+
+ rPlatformInfo.maVendor = OUString::createFromAscii(pName);
+
+ cl_uint nDevices;
+ nState = clGetDeviceIDs(nPlatformId, CL_DEVICE_TYPE_ALL, 0, NULL, &nDevices);
+ if(nState != CL_SUCCESS)
+ return false;
+
+ boost::scoped_array<cl_device_id> pDevices(new cl_device_id[nDevices]);
+ nState = clGetDeviceIDs(nPlatformId, CL_DEVICE_TYPE_ALL, nDevices, pDevices.get(), NULL);
+ if(nState != CL_SUCCESS)
+ return false;
+
+ for(size_t i = 0; i < nDevices; ++i)
+ {
+ createDeviceInfo(pDevices[i], rPlatformInfo);
+ }
+
+ return true;
+}
+
+}
+
+void fillOpenCLInfo(std::vector<OpenclPlatformInfo>& rPlatforms)
+{
+ int status = clewInit("libOpenCL.so");
+ if (status < 0)
+ return;
+
+ cl_uint nPlatforms;
+ cl_int nState = clGetPlatformIDs(0, NULL, &nPlatforms);
+
+ if(nState != CL_SUCCESS)
+ return;
+
+ boost::scoped_array<cl_platform_id> pPlatforms(new cl_platform_id[nPlatforms]);
+ nState = clGetPlatformIDs(nPlatforms, pPlatforms.get(), NULL);
+
+ if(nState != CL_SUCCESS)
+ return;
+
+ for(size_t i = 0; i < nPlatforms; ++i)
+ {
+ OpenclPlatformInfo aPlatformInfo;
+ if(createPlatformInfo(pPlatforms[i], aPlatformInfo))
+ rPlatforms.push_back(aPlatformInfo);
+ }
+}
+
}}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/opencl/openclwrapper.hxx b/sc/source/core/opencl/openclwrapper.hxx
index 431a771..adaa98e 100644
--- a/sc/source/core/opencl/openclwrapper.hxx
+++ b/sc/source/core/opencl/openclwrapper.hxx
@@ -14,6 +14,7 @@
#include <formula/opcode.hxx>
#include <sal/detail/log.h>
#include <cassert>
+#include "platforminfo.hxx"
#include "clcc/clew.h"
@@ -279,6 +280,8 @@ public:
friend class agency;
};
+void fillOpenCLInfo(std::vector<OpenclPlatformInfo>& rPlatforms);
+
}}
#endif
diff --git a/sc/source/core/opencl/platforminfo.cxx b/sc/source/core/opencl/platforminfo.cxx
new file mode 100644
index 0000000..e5700d6
--- /dev/null
+++ b/sc/source/core/opencl/platforminfo.cxx
@@ -0,0 +1,24 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "platforminfo.hxx"
+#include "openclwrapper.hxx"
+
+namespace sc {
+
+std::vector<OpenclPlatformInfo> listAllOpenclPlatforms()
+{
+ std::vector<OpenclPlatformInfo> aPlatforms;
+ opencl::fillOpenCLInfo(aPlatforms);
+ return aPlatforms;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/optdlg/calcoptionsdlg.cxx b/sc/source/ui/optdlg/calcoptionsdlg.cxx
index dd6003c..8167736 100644
--- a/sc/source/ui/optdlg/calcoptionsdlg.cxx
+++ b/sc/source/ui/optdlg/calcoptionsdlg.cxx
@@ -7,8 +7,6 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
-#include <config_features.h>
-
#include "calcoptionsdlg.hxx"
#include "sc.hrc"
#include "scresid.hxx"
@@ -16,6 +14,10 @@
#include "svtools/svlbitm.hxx"
#include "svtools/treelistentry.hxx"
+#if HAVE_FEATURE_OPENCL
+#include "platforminfo.hxx"
+#endif
+
namespace {
typedef enum {
@@ -113,6 +115,14 @@ ScCalcOptionsDialog::ScCalcOptionsDialog(Window* pParent, const ScCalcConfig& rC
get(mpFtAnnotation, "annotation");
get(mpBtnTrue, "true");
get(mpBtnFalse, "false");
+ get(mpOpenclInfoList, "opencl_list");
+ get(mpBtnAutomaticSelectionTrue, "automatic_select_true");
+ get(mpBtnAutomaticSelectionFalse, "automatic_select_false");
+
+ mpOpenclInfoList->set_height_request(4* mpOpenclInfoList->GetTextHeight());
+ mpOpenclInfoList->SetStyle(mpOpenclInfoList->GetStyle() | WB_CLIPCHILDREN | WB_FORCE_MAKEVISIBLE);
+ mpOpenclInfoList->SetHighlightRange();
+ mpOpenclInfoList->GetParent()->Hide();
maCaptionStringRefSyntax = get<Window>("ref_syntax_caption")->GetText();
maDescStringRefSyntax = get<Window>("ref_syntax_desc")->GetText();
@@ -177,6 +187,36 @@ void ScCalcOptionsDialog::setValueAt(size_t nPos, const OUString &rValue)
pModel->InvalidateEntry(pEntry);
}
+#if HAVE_FEATURE_OPENCL
+
+void ScCalcOptionsDialog::fillOpenclList()
+{
+ mpOpenclInfoList->SetUpdateMode(false);
+ mpOpenclInfoList->Clear();
+ std::vector<sc::OpenclPlatformInfo> aPlatformInfo = sc::listAllOpenclPlatforms();
+ for(std::vector<sc::OpenclPlatformInfo>::const_iterator it = aPlatformInfo.begin(),
+ itEnd = aPlatformInfo.end(); it != itEnd; ++it)
+ {
+ SvTreeListEntry* pEntry = new SvTreeListEntry;
+ pEntry->AddItem(new SvLBoxContextBmp(pEntry, 0, Image(), Image(), 0));
+ pEntry->AddItem(new SvLBoxString(pEntry, 0, it->maVendor));
+ mpOpenclInfoList->GetModel()->Insert(pEntry);
+
+ for(std::vector<sc::OpenclDeviceInfo>::const_iterator
+ itr = it->maDevices.begin(), itrEnd = it->maDevices.end(); itr != itrEnd; ++itr)
+ {
+ SvTreeListEntry* pDeviceEntry = new SvTreeListEntry;
+pDeviceEntry->AddItem(new SvLBoxContextBmp(pDeviceEntry, 0, Image(), Image(), 0));
+pDeviceEntry->AddItem(new SvLBoxString(pDeviceEntry, 0, itr->maName));
+mpOpenclInfoList->GetModel()->Insert(pDeviceEntry, pEntry);
+ }
+ }
+
+ mpOpenclInfoList->SetUpdateMode(true);
+}
+
+#endif
+
void ScCalcOptionsDialog::FillOptionsList()
{
mpLbSettings->SetUpdateMode(false);
@@ -198,6 +238,7 @@ void ScCalcOptionsDialog::FillOptionsList()
pModel->Insert(createBoolItem(maCaptionEmptyStringAsZero,maConfig.mbEmptyStringAsZero));
#if HAVE_FEATURE_OPENCL
pModel->Insert(createBoolItem(maCaptionOpenCLEnabled,maConfig.mbOpenCLEnabled));
+ fillOpenclList();
#endif
mpLbSettings->SetUpdateMode(true);
@@ -214,6 +255,7 @@ void ScCalcOptionsDialog::SelectionChanged()
mpBtnTrue->Hide();
mpBtnFalse->Hide();
mpLbOptionEdit->Show();
+ mpOpenclInfoList->GetParent()->Hide();
mpLbOptionEdit->Clear();
mpLbOptionEdit->InsertEntry(maUseFormulaSyntax);
@@ -253,11 +295,17 @@ void ScCalcOptionsDialog::SelectionChanged()
{
bValue = maConfig.mbEmptyStringAsZero;
mpFtAnnotation->SetText(maDescEmptyStringAsZero);
+ mpOpenclInfoList->GetParent()->Hide();
}
else
{
bValue = maConfig.mbOpenCLEnabled;
mpFtAnnotation->SetText(maDescOpenCLEnabled);
+ mpOpenclInfoList->GetParent()->Show();
+ if(bValue)
+ mpOpenclInfoList->GetParent()->Enable();
+ else
+ mpOpenclInfoList->GetParent()->Disable();
}
if ( bValue )
diff --git a/sc/source/ui/optdlg/calcoptionsdlg.hxx b/sc/source/ui/optdlg/calcoptionsdlg.hxx
index 3badc9a..b52b46f 100644
--- a/sc/source/ui/optdlg/calcoptionsdlg.hxx
+++ b/sc/source/ui/optdlg/calcoptionsdlg.hxx
@@ -10,10 +10,13 @@
#ifndef __SC_OPTDLG_CALCOPTIONSDLG_HXX__
#define __SC_OPTDLG_CALCOPTIONSDLG_HXX__
+#include <config_features.h>
+
#include "vcl/dialog.hxx"
#include "vcl/button.hxx"
#include "vcl/fixed.hxx"
#include "svx/checklbx.hxx"
+#include "svtools/treelistbox.hxx"
#include "calcconfig.hxx"
@@ -33,6 +36,9 @@ private:
void SelectionChanged();
void ListOptionValueChanged();
void RadioValueChanged();
+#if HAVE_FEATURE_OPENCL
+ void fillOpenclList();
+#endif
OUString toString(formula::FormulaGrammar::AddressConvention eConv) const;
OUString toString(bool bVal) const;
@@ -48,6 +54,10 @@ private:
FixedText* mpFtAnnotation;
+ SvTreeListBox* mpOpenclInfoList;
+ RadioButton* mpBtnAutomaticSelectionTrue;
+ RadioButton* mpBtnAutomaticSelectionFalse;
+
OUString maTrue;
OUString maFalse;
diff --git a/sc/uiconfig/scalc/ui/formulacalculationoptions.ui b/sc/uiconfig/scalc/ui/formulacalculationoptions.ui
index 0f00fa3..a848051 100644
--- a/sc/uiconfig/scalc/ui/formulacalculationoptions.ui
+++ b/sc/uiconfig/scalc/ui/formulacalculationoptions.ui
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.6 -->
+ <!-- interface-requires LibreOffice 1.0 -->
<object class="GtkDialog" id="FormulaCalculationOptions">
<property name="can_focus">False</property>
<property name="border_width">6</property>
@@ -66,6 +67,9 @@
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="Check List Box-selection1"/>
+ </child>
</object>
<packing>
<property name="left_attach">0</property>
@@ -173,6 +177,7 @@
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="wrap">True</property>
+ <property name="ellipsize">end</property>
<property name="max_width_chars">56</property>
</object>
<packing>
@@ -190,7 +195,7 @@
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">3</property>
+ <property name="top_attach">4</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
@@ -205,7 +210,7 @@
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">4</property>
+ <property name="top_attach">5</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
@@ -218,7 +223,7 @@
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">5</property>
+ <property name="top_attach">6</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
@@ -231,7 +236,7 @@
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">6</property>
+ <property name="top_attach">7</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
@@ -246,7 +251,7 @@
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">7</property>
+ <property name="top_attach">8</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
@@ -259,7 +264,7 @@
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">8</property>
+ <property name="top_attach">9</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
@@ -274,7 +279,99 @@
</object>
<packing>
<property name="left_attach">0</property>
- <property name="top_attach">9</property>
+ <property name="top_attach">10</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid6">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="row_spacing">2</property>
+ <child>
+ <object class="svtlo-SvTreeListBox" id="opencl_list">
+ <property name="visible">True</property>
+ <property name="app_paintable">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="Tree List-selection1"/>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Automatic Selection of Platform/Device:</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="automatic_select_true">
+ <property name="label" translatable="yes">True</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="xalign">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">automatic_select_false</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton" id="automatic_select_false">
+ <property name="label" translatable="yes">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="xalign">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">automatic_select_true</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
More information about the Libreoffice-commits
mailing list