From 487a0819ce5c14c6c70c1a5959350de4f27dac4d Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Thu, 9 Mar 2017 20:44:48 +0000 Subject: [PATCH] =?UTF-8?q?OpenCLImageFilter=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WindowsFormsApplication1.sln | 20 + WindowsFormsApplication1/Bild2.png | Bin 0 -> 1234 bytes WindowsFormsApplication1/Form1.Designer.cs | 303 ++++ WindowsFormsApplication1/Form1.cs | 171 ++ WindowsFormsApplication1/Form1.resx | 132 ++ WindowsFormsApplication1/ImageFilter.cs | 181 +++ .../OpenCLImageFilter.csproj | 98 ++ WindowsFormsApplication1/OpenCLRunner.cs | 560 +++++++ WindowsFormsApplication1/Program.cs | 21 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + .../Properties/Resources.resx | 117 ++ .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + WindowsFormsApplication1/SimpleCL.cl | 6 + .../bin/Debug/OpenCL.NET.dll | Bin 0 -> 36864 bytes .../bin/Debug/OpenCL.NET.xml | 143 ++ .../bin/Debug/OpenCLTemplate.dll | Bin 0 -> 340992 bytes .../bin/Debug/OpenCLTemplate.xml | 1417 +++++++++++++++++ .../bin/Debug/WindowsFormsApplication1.exe | Bin 0 -> 25088 bytes WindowsFormsApplication1/filter.cl | 64 + WindowsFormsApplication1/filter_gauss3x3.txt | 4 + WindowsFormsApplication1/filter_gauss5x5.txt | 6 + WindowsFormsApplication1/filter_neutral.txt | 13 + WindowsFormsApplication1/filter_test.txt | 6 + 25 files changed, 3394 insertions(+) create mode 100644 WindowsFormsApplication1.sln create mode 100644 WindowsFormsApplication1/Bild2.png create mode 100644 WindowsFormsApplication1/Form1.Designer.cs create mode 100644 WindowsFormsApplication1/Form1.cs create mode 100644 WindowsFormsApplication1/Form1.resx create mode 100644 WindowsFormsApplication1/ImageFilter.cs create mode 100644 WindowsFormsApplication1/OpenCLImageFilter.csproj create mode 100644 WindowsFormsApplication1/OpenCLRunner.cs create mode 100644 WindowsFormsApplication1/Program.cs create mode 100644 WindowsFormsApplication1/Properties/AssemblyInfo.cs create mode 100644 WindowsFormsApplication1/Properties/Resources.Designer.cs create mode 100644 WindowsFormsApplication1/Properties/Resources.resx create mode 100644 WindowsFormsApplication1/Properties/Settings.Designer.cs create mode 100644 WindowsFormsApplication1/Properties/Settings.settings create mode 100644 WindowsFormsApplication1/SimpleCL.cl create mode 100644 WindowsFormsApplication1/bin/Debug/OpenCL.NET.dll create mode 100644 WindowsFormsApplication1/bin/Debug/OpenCL.NET.xml create mode 100644 WindowsFormsApplication1/bin/Debug/OpenCLTemplate.dll create mode 100644 WindowsFormsApplication1/bin/Debug/OpenCLTemplate.xml create mode 100644 WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe create mode 100644 WindowsFormsApplication1/filter.cl create mode 100644 WindowsFormsApplication1/filter_gauss3x3.txt create mode 100644 WindowsFormsApplication1/filter_gauss5x5.txt create mode 100644 WindowsFormsApplication1/filter_neutral.txt create mode 100644 WindowsFormsApplication1/filter_test.txt diff --git a/WindowsFormsApplication1.sln b/WindowsFormsApplication1.sln new file mode 100644 index 0000000..b7f2945 --- /dev/null +++ b/WindowsFormsApplication1.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenCLImageFilter", "WindowsFormsApplication1\OpenCLImageFilter.csproj", "{25E1C72C-5114-4EA3-8DD8-F9435E832214}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {25E1C72C-5114-4EA3-8DD8-F9435E832214}.Debug|x86.ActiveCfg = Debug|x86 + {25E1C72C-5114-4EA3-8DD8-F9435E832214}.Debug|x86.Build.0 = Debug|x86 + {25E1C72C-5114-4EA3-8DD8-F9435E832214}.Release|x86.ActiveCfg = Release|x86 + {25E1C72C-5114-4EA3-8DD8-F9435E832214}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/WindowsFormsApplication1/Bild2.png b/WindowsFormsApplication1/Bild2.png new file mode 100644 index 0000000000000000000000000000000000000000..01362713bb81ed4b814abbc4cbc70072fd5fb447 GIT binary patch literal 1234 zcmV;@1TFiCP)WdKBJATc0Hb#5RsFflM7GB7$dFgi0cAS*C2Ffi@ z{F^TQXR7pPQ}dtIwlXlzrr_7Y&-c!z_xdg}%4hpO|F&&qV4U6d`30a1EOXR8?*Np6 zO-|Zp13(#Q=e&JB0Vo5#i0!irKpAM{O8XoEPzLvMv3*VeD1*^lZ=Z7j%Ah}8?IQwE z20iI*pDO^A!LzB9UhcF{F92n*&dv520H6$hdsx36 zXrD0v%0Q`oh5`6)1FiPC1HiW$D7Mc{0KU&aw|(vd@J$Bl?V|#~cNkc-j}`z=H!x}+ zMF5^_VAnpn06fvaw0+b8c$R^6`&a<*6a$C$F#;gJflvF`0g&0it$j=Z$Z6o&KGpza zGjMJn2LSRI__vP_02vIXw2vDAu?=Rmk0$_84JNjaGXU`n=C+SN0Fex)x6c#+Vi-hd zpIHFRHVD!_69JfK5T||S0x-iMRQpT^z}FyJ`$Pc1%OGI;1OdR_AZGi-0l?BAZ2N=) zz{VhQ`$Pjk+aP%R1O!0OAb$JA1VFYldX{qgjpy%jzmJT~eaeF6V=^ z2050xhy$`3Bv|LA_S=?x2GJMU(SF;W%pmj%yW4MjWip7nyutR{zG)1CuI*O)?T8!( z5f`S=emgFKLAX_^wcn18ZV+op%I&vvgfhFZbfz<~GGMM*Ed2wL-@lgyW-77*Icq}4>!Hm15 zhy%Z+%r|hqUywNPUeII%-#ccBgDIJ6;CRnCaWFCS47~1|C=RA)l7Y*8L&ZUm%rLOO zbFMfD6?X&Udq<0dfbli3ynDJh2pdNOv*!nhgW&Npuz7-pI7kr}1A}MCh=WA2H_(2H zk~l~gV*}Oah>3%wu{6+olAbt79Ww)^XGw~K2gJre<7ukm;4v{Uxcxj~aqzHc8{B)M zwm5iXR1I!CQ(hcAIC=(y$9{GD?TU2_Mh>j@|6aF(LHAMB{`%_g8uT4f?eFBCLC5~p z{$XwyT-~|a7cy#aY0ql^QicrV-KzbL^cx8KRQuiOG&tL#+8<1h!Qs|w|5h#=>~E^} z6>`mBXI|~A<$}R>SnVrEGFVNjeUqFT{CivN8|K)cy{`7nb71iEqS|-Lp24fycg=^v w2B6xv&)VSq-qF>*OV)q$zW~*~W8Mt@1Nbkt4~=WP&Hw-a07*qoM6N<$g7V=&&j0`b literal 0 HcmV?d00001 diff --git a/WindowsFormsApplication1/Form1.Designer.cs b/WindowsFormsApplication1/Form1.Designer.cs new file mode 100644 index 0000000..9372919 --- /dev/null +++ b/WindowsFormsApplication1/Form1.Designer.cs @@ -0,0 +1,303 @@ +namespace OpenCLImageFilter +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.pictureBrowse = new System.Windows.Forms.Button(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.pictureFile = new System.Windows.Forms.TextBox(); + this.openclBrowse = new System.Windows.Forms.Button(); + this.openCLFile = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.openFileDialog2 = new System.Windows.Forms.OpenFileDialog(); + this.buttonApplyFilter = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.buttonBrowseFilter = new System.Windows.Forms.Button(); + this.label4 = new System.Windows.Forms.Label(); + this.textStatus = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.filterSelector = new System.Windows.Forms.ComboBox(); + this.openFileDialog3 = new System.Windows.Forms.OpenFileDialog(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.SuspendLayout(); + // + // pictureBrowse + // + this.pictureBrowse.Location = new System.Drawing.Point(224, 16); + this.pictureBrowse.Name = "pictureBrowse"; + this.pictureBrowse.Size = new System.Drawing.Size(85, 20); + this.pictureBrowse.TabIndex = 0; + this.pictureBrowse.Text = "Browse..."; + this.pictureBrowse.UseVisualStyleBackColor = true; + this.pictureBrowse.Click += new System.EventHandler(this.button1_Click); + // + // openFileDialog1 + // + this.openFileDialog1.Filter = "Images|*.bmp;*.jpg;*.png"; + this.openFileDialog1.Title = "Select Source Image"; + // + // pictureFile + // + this.pictureFile.Location = new System.Drawing.Point(73, 16); + this.pictureFile.Name = "pictureFile"; + this.pictureFile.Size = new System.Drawing.Size(145, 20); + this.pictureFile.TabIndex = 1; + this.pictureFile.Text = "..\\..\\Bild2.png"; + this.pictureFile.TextChanged += new System.EventHandler(this.pictureFile_TextChanged); + // + // openclBrowse + // + this.openclBrowse.Location = new System.Drawing.Point(224, 42); + this.openclBrowse.Name = "openclBrowse"; + this.openclBrowse.Size = new System.Drawing.Size(85, 20); + this.openclBrowse.TabIndex = 2; + this.openclBrowse.Text = "Browse..."; + this.openclBrowse.UseVisualStyleBackColor = true; + this.openclBrowse.Click += new System.EventHandler(this.openclBrowse_Click); + // + // openCLFile + // + this.openCLFile.Location = new System.Drawing.Point(73, 42); + this.openCLFile.Name = "openCLFile"; + this.openCLFile.Size = new System.Drawing.Size(145, 20); + this.openCLFile.TabIndex = 3; + this.openCLFile.Text = "..\\..\\filter.cl"; + this.openCLFile.TextChanged += new System.EventHandler(this.openCLFile_TextChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(6, 20); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(64, 13); + this.label1.TabIndex = 4; + this.label1.Text = "Image-Path:"; + this.label1.Click += new System.EventHandler(this.label1_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(6, 45); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(50, 13); + this.label2.TabIndex = 5; + this.label2.Text = "\"filter.cl\":"; + // + // openFileDialog2 + // + this.openFileDialog2.Filter = "OpenCL|*.cl"; + this.openFileDialog2.Title = "Select OpenCL-File"; + // + // buttonApplyFilter + // + this.buttonApplyFilter.Location = new System.Drawing.Point(234, 41); + this.buttonApplyFilter.Name = "buttonApplyFilter"; + this.buttonApplyFilter.Size = new System.Drawing.Size(75, 21); + this.buttonApplyFilter.TabIndex = 6; + this.buttonApplyFilter.Text = "Apply Filter"; + this.buttonApplyFilter.UseVisualStyleBackColor = true; + this.buttonApplyFilter.Click += new System.EventHandler(this.button1_Click_1); + // + // pictureBox1 + // + this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pictureBox1.Location = new System.Drawing.Point(9, 110); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(300, 300); + this.pictureBox1.TabIndex = 7; + this.pictureBox1.TabStop = false; + // + // pictureBox2 + // + this.pictureBox2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pictureBox2.Location = new System.Drawing.Point(9, 112); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(300, 300); + this.pictureBox2.TabIndex = 8; + this.pictureBox2.TabStop = false; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.pictureBox1); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.openCLFile); + this.groupBox1.Controls.Add(this.pictureFile); + this.groupBox1.Controls.Add(this.pictureBrowse); + this.groupBox1.Controls.Add(this.openclBrowse); + this.groupBox1.Location = new System.Drawing.Point(15, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(319, 421); + this.groupBox1.TabIndex = 11; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Source-Image"; + this.groupBox1.Enter += new System.EventHandler(this.groupBox1_Enter); + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.textBox1); + this.groupBox2.Controls.Add(this.button1); + this.groupBox2.Controls.Add(this.buttonBrowseFilter); + this.groupBox2.Controls.Add(this.label4); + this.groupBox2.Controls.Add(this.textStatus); + this.groupBox2.Controls.Add(this.label3); + this.groupBox2.Controls.Add(this.filterSelector); + this.groupBox2.Controls.Add(this.pictureBox2); + this.groupBox2.Controls.Add(this.buttonApplyFilter); + this.groupBox2.Location = new System.Drawing.Point(349, 12); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(319, 421); + this.groupBox2.TabIndex = 12; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Output-Image"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(74, 41); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(73, 20); + this.textBox1.TabIndex = 8; + this.textBox1.Text = "100"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(153, 41); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 21); + this.button1.TabIndex = 13; + this.button1.Text = "Apply Again"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click_2); + // + // buttonBrowseFilter + // + this.buttonBrowseFilter.Location = new System.Drawing.Point(234, 15); + this.buttonBrowseFilter.Name = "buttonBrowseFilter"; + this.buttonBrowseFilter.Size = new System.Drawing.Size(75, 21); + this.buttonBrowseFilter.TabIndex = 8; + this.buttonBrowseFilter.Text = "Browse..."; + this.buttonBrowseFilter.UseVisualStyleBackColor = true; + this.buttonBrowseFilter.Click += new System.EventHandler(this.buttonBrowseFilter_Click); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(6, 70); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(37, 13); + this.label4.TabIndex = 12; + this.label4.Text = "Status"; + // + // textStatus + // + this.textStatus.BackColor = System.Drawing.SystemColors.Control; + this.textStatus.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.textStatus.Enabled = false; + this.textStatus.Location = new System.Drawing.Point(9, 86); + this.textStatus.Name = "textStatus"; + this.textStatus.Size = new System.Drawing.Size(300, 13); + this.textStatus.TabIndex = 11; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(6, 20); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(62, 13); + this.label3.TabIndex = 10; + this.label3.Text = "Select Filter"; + this.label3.Click += new System.EventHandler(this.label3_Click); + // + // filterSelector + // + this.filterSelector.FormattingEnabled = true; + this.filterSelector.Location = new System.Drawing.Point(74, 15); + this.filterSelector.Name = "filterSelector"; + this.filterSelector.Size = new System.Drawing.Size(154, 21); + this.filterSelector.TabIndex = 9; + this.filterSelector.SelectedIndexChanged += new System.EventHandler(this.filterSelector_SelectedIndexChanged); + // + // openFileDialog3 + // + this.openFileDialog3.Filter = "Filter-Matrix|filter*.txt"; + this.openFileDialog3.Title = "Select Filter-File"; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(681, 450); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.groupBox2); + this.Name = "Form1"; + this.Text = "OpenCL ImageFilter"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button pictureBrowse; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.TextBox pictureFile; + private System.Windows.Forms.Button openclBrowse; + private System.Windows.Forms.TextBox openCLFile; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.OpenFileDialog openFileDialog2; + private System.Windows.Forms.Button buttonApplyFilter; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ComboBox filterSelector; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox textStatus; + private System.Windows.Forms.Button buttonBrowseFilter; + private System.Windows.Forms.OpenFileDialog openFileDialog3; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.TextBox textBox1; + } +} + diff --git a/WindowsFormsApplication1/Form1.cs b/WindowsFormsApplication1/Form1.cs new file mode 100644 index 0000000..aac3ae5 --- /dev/null +++ b/WindowsFormsApplication1/Form1.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.IO; +using System.Windows.Forms; +using SimpleOpenCLRunner; + + +namespace OpenCLImageFilter +{ + public partial class Form1 : Form + { + private ImageFilter oImageFilter; + + public Form1() + { + InitializeComponent(); + this.oImageFilter = new ImageFilter(); + this.setPicture(); + this.readCL(); + } + + private void button1_Click(object sender, EventArgs e) + { + this.openFileDialog1.FileName = this.pictureFile.Text; + if (this.openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + if (!File.Exists(this.openFileDialog1.FileName)) + { + MessageBox.Show("Invalid Picture Path"); + return; + } + this.pictureFile.Text = openFileDialog1.FileName; + this.setPicture(); + } + } + + private void openclBrowse_Click(object sender, EventArgs e) + { + this.openFileDialog2.FileName = this.openCLFile.Text; + if (this.openFileDialog2.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + if (!File.Exists(this.openFileDialog2.FileName)) + { + MessageBox.Show("Invalid OpenCL-File Path"); + return; + } + this.openCLFile.Text = openFileDialog2.FileName; + this.readCL(); + + } + } + + private void button1_Click_1(object sender, EventArgs e) + { + this.readCL(); + + if (!File.Exists(this.pictureFile.Text)) + { + MessageBox.Show("Invalid Picture Path"); + return; + } + Bitmap org_file = new Bitmap(this.pictureFile.Text); + + this.pictureBox1.Image = org_file; + this.Refresh(); + this.pictureBox2.Image = this.oImageFilter.run(org_file, this.textStatus); + this.Refresh(); + } + + private void label4_Click(object sender, EventArgs e) + { + + } + + private void label1_Click(object sender, EventArgs e) + { + + } + + private void groupBox1_Enter(object sender, EventArgs e) + { + + } + + private void label3_Click(object sender, EventArgs e) + { + + } + + private void buttonBrowseFilter_Click(object sender, EventArgs e) + { + this.openFileDialog3.FileName = this.openCLFile.Text; + if (this.openFileDialog3.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + if (!File.Exists(this.openFileDialog3.FileName)) + { + MessageBox.Show("Invalid Filter-File Path"); + return; + } + + if (!this.filterSelector.Items.Contains(this.openFileDialog3.FileName)) + { + this.filterSelector.Items.Add(this.openFileDialog3.FileName); + } + this.filterSelector.SelectedIndex = this.filterSelector.Items.IndexOf(this.openFileDialog3.FileName); + this.setFilter(); + } + } + + private void filterSelector_SelectedIndexChanged(object sender, EventArgs e) + { + this.setFilter(); + } + + private void setFilter() + { + this.textStatus.Text = "Preparing Filter..."; + this.Refresh(); + + string oFileName = (string)this.filterSelector.Items[this.filterSelector.SelectedIndex]; + + this.oImageFilter.readMask(oFileName); + + this.textStatus.Text += " Done!"; + this.Refresh(); + } + + private void setPicture() + { + this.textStatus.Text = "Reading Source-Image..."; + this.Refresh(); + Bitmap org_file = new Bitmap(this.pictureFile.Text); + this.pictureBox1.Image = org_file; + this.textStatus.Text += " Done!"; + this.Refresh(); + } + + private void readCL() + { + this.textStatus.Text = "Preparing OpenCL-File..."; + this.Refresh(); + this.oImageFilter.readCL(this.openCLFile.Text); + this.textStatus.Text += " Done!"; + this.Refresh(); + } + + + private void button1_Click_2(object sender, EventArgs e) + { + this.textStatus.Text = "Running " + this.textBox1.Text + " times incrementell..."; + this.pictureBox2.Image = this.oImageFilter.run_again(int.Parse(this.textBox1.Text)); + this.Refresh(); + this.textStatus.Text += " Done!"; + } + + private void pictureFile_TextChanged(object sender, EventArgs e) + { + this.setPicture(); + } + + private void openCLFile_TextChanged(object sender, EventArgs e) + { + this.readCL(); + } + } +} diff --git a/WindowsFormsApplication1/Form1.resx b/WindowsFormsApplication1/Form1.resx new file mode 100644 index 0000000..cc85890 --- /dev/null +++ b/WindowsFormsApplication1/Form1.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 150, 17 + + + True + + + 283, 17 + + \ No newline at end of file diff --git a/WindowsFormsApplication1/ImageFilter.cs b/WindowsFormsApplication1/ImageFilter.cs new file mode 100644 index 0000000..c16fc77 --- /dev/null +++ b/WindowsFormsApplication1/ImageFilter.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Drawing; +using OpenCLTemplate; +using System.Windows.Forms; +using System.IO; +using SimpleOpenCLRunner; + +namespace OpenCLImageFilter +{ + class ImageFilter + { + private float[] afMask; + + private bool bInit = false; + + private Bitmap oInputImage; + private byte[] bPicture; + private byte[] bPictureOut; + + private int[] anWorkers; + + public ImageFilter() + { + OpenCLRunner.init(); + } + + public void readCL(string oFileName) + { + OpenCLRunner.readCL(oFileName); + OpenCLRunner.compile(); + } + + + public void readMask(string oFileName) + { + StreamReader oBuffer = new StreamReader(oFileName, System.Text.Encoding.UTF8); + + int size = int.Parse(oBuffer.ReadLine()); + float[] afMask = new float[size * size]; + String[] oVars; + for (int nI = 0; nI < size; nI++) + { + oVars = (oBuffer.ReadLine()).Split(','); + for (int nJ = 0; nJ < size; nJ++) + { + afMask[nJ * size + nI] = float.Parse(oVars[nJ]); + } + } + + this.setMask(afMask); + } + + public void setMask(float[] afMask) + { + this.afMask = afMask; + this.bInit = true; + + int nMaskSize = (int)Math.Sqrt((double)this.afMask.Length); + + OpenCLRunner.createVariable("mask", this.afMask); + OpenCLRunner.createVariable("maskSize", new int[] { nMaskSize }); + } + + public Bitmap run_again(int times) + { + if (!this.bInit) + { + MessageBox.Show("Select an Filter first!"); + return new Bitmap(1,1); + } + Bitmap oOutputImage = new Bitmap(this.oInputImage.Width, this.oInputImage.Height); + + + OpenCLRunner.createFunction("recycle", new string[] {"pictureIn", + "pictureOut", + "dimensions"}); + + for (int nI = 0; nI < times; nI++) + { + OpenCLRunner.runFunction("recycle"); + OpenCLRunner.runFunction("filter"); + } + + OpenCLRunner.returnData("pictureOut", ref bPictureOut); + + + //unserialzing the image + long i; + i = 0; + for (int nI = 0; nI < oInputImage.Height; nI++) + { + for (int nJ = 0; nJ < oInputImage.Width; nJ++) + { + oOutputImage.SetPixel(nJ, nI, Color.FromArgb((int)bPictureOut[i + 0], (int)bPictureOut[i + 1], (int)bPictureOut[i + 2], (int)bPictureOut[i + 3])); + i += 4; + } + } + + return oOutputImage; + } + + public Bitmap run(Bitmap oInputImage, TextBox textStatus) + { + if (!this.bInit) + { + MessageBox.Show("Select an Filter first!"); + return oInputImage; + } + + textStatus.Text = "Preparing Image..."; + textStatus.Parent.Refresh(); + + Bitmap oOutputImage = new Bitmap(oInputImage.Width, oInputImage.Height); + + this.oInputImage = oInputImage; + + this.bPicture = new byte[oInputImage.Width * oInputImage.Height * 4]; + this.bPictureOut = new byte[oInputImage.Width * oInputImage.Height * 4]; + + this.anWorkers = new int[] { oInputImage.Height, oInputImage.Width }; + + + OpenCLRunner.setWorkers(this.anWorkers); + + //serializing the Image + long i = 0; + for (int nI = 0; nI < oInputImage.Height; nI++) + { + for (int nJ = 0; nJ < oInputImage.Width; nJ++) + { + this.bPicture[i + 0] = oInputImage.GetPixel(nJ, nI).A; + this.bPicture[i + 1] = oInputImage.GetPixel(nJ, nI).R; + this.bPicture[i + 2] = oInputImage.GetPixel(nJ, nI).G; + this.bPicture[i + 3] = oInputImage.GetPixel(nJ, nI).B; + i += 4; + } + } + + textStatus.Text = "Sending Image to GPU..."; + textStatus.Parent.Refresh(); + + OpenCLRunner.createVariable("pictureIn", bPicture); + OpenCLRunner.createVariable("pictureOut", bPictureOut); + OpenCLRunner.createVariable("dimensions", new int[] { oInputImage.Width, oInputImage.Height }); + + textStatus.Text = "Calculating..."; + textStatus.Parent.Refresh(); + + OpenCLRunner.createFunction("filter", new string[] { "pictureIn", + "pictureOut", + "dimensions", + "mask", + "maskSize" }); + OpenCLRunner.runFunction("filter"); + + + textStatus.Text = "Pulling back the data..."; + textStatus.Parent.Refresh(); + + OpenCLRunner.returnData("pictureOut", ref bPictureOut); + + //unserializing the image + i = 0; + for (int nI = 0; nI < oInputImage.Height; nI++) + { + for (int nJ = 0; nJ < oInputImage.Width; nJ++) + { + oOutputImage.SetPixel(nJ, nI, Color.FromArgb((int)bPictureOut[i + 0], (int)bPictureOut[i + 1], (int)bPictureOut[i + 2], (int)bPictureOut[i + 3])); + i += 4; + } + } + + textStatus.Text += " Done!"; + textStatus.Parent.Refresh(); + return oOutputImage; + } + } +} diff --git a/WindowsFormsApplication1/OpenCLImageFilter.csproj b/WindowsFormsApplication1/OpenCLImageFilter.csproj new file mode 100644 index 0000000..7e8410a --- /dev/null +++ b/WindowsFormsApplication1/OpenCLImageFilter.csproj @@ -0,0 +1,98 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {25E1C72C-5114-4EA3-8DD8-F9435E832214} + WinExe + Properties + OpenCLImageFilter + WindowsFormsApplication1 + v4.0 + Client + 512 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\..\Code Snippets\OpenCLTemplate\OpenCL.NET.dll + + + False + ..\..\..\Code Snippets\OpenCLTemplate\OpenCLTemplate.dll + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/WindowsFormsApplication1/OpenCLRunner.cs b/WindowsFormsApplication1/OpenCLRunner.cs new file mode 100644 index 0000000..4a2f485 --- /dev/null +++ b/WindowsFormsApplication1/OpenCLRunner.cs @@ -0,0 +1,560 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using OpenCLTemplate; +using System.Windows.Forms; + + +namespace SimpleOpenCLRunner +{ + class OpenCLRunner + { + private static String oCLCode; + private static bool bInit = false; + private static bool bCompiled = false; + private static bool bRead = false; + private static int[] anWorkers = new int[] { 1 }; + + private static TimeSpan oElapsedExecutionTime; + private static TimeSpan oElapsedInitTime; + private static TimeSpan oElapsedCompileTime; + + private static System.Diagnostics.Stopwatch oWatch = new System.Diagnostics.Stopwatch(); + + private static Dictionary oFunctionDict = new Dictionary(); + private static Dictionary oVarDict = new Dictionary(); + + private static List oCompileLogsList = new List(); + + public static bool init() + { + try + { + System.Diagnostics.Stopwatch oWatch = new System.Diagnostics.Stopwatch(); + oWatch.Start(); + + //init + CLCalc.InitCL(); + OpenCLRunner.bInit = true; + + oWatch.Stop(); + OpenCLRunner.oElapsedInitTime = oWatch.Elapsed; CLCalc.InitCL(); + } + catch (Exception e) + { + MessageBox.Show("CLCalc-Error:\n===================\n\n" + e.ToString() + "\n\n" + e.Message); + OpenCLRunner.bInit = false; + } + return OpenCLRunner.bInit; + } + + + public static void start() + { + OpenCLRunner.oWatch.Start(); + } + public static TimeSpan stop() + { + OpenCLRunner.oWatch.Stop(); + return OpenCLRunner.oWatch.Elapsed; + } + + public static void setWorkers(int[] anWorkers) + { + OpenCLRunner.anWorkers = anWorkers; + } + + public static int[] getWorkers() + { + return OpenCLRunner.anWorkers; + } + + public static TimeSpan getExecutionTime() + { + return OpenCLRunner.oElapsedExecutionTime; + } + public static TimeSpan getInitTime() + { + return OpenCLRunner.oElapsedInitTime; + } + public static TimeSpan getCompileTime() + { + return OpenCLRunner.oElapsedCompileTime; + } + + + public static void readCL(String oFilename) + { + if (!OpenCLRunner.bInit) + { + OpenCLRunner.init(); + } + if (!File.Exists(oFilename)) + { + MessageBox.Show("Datei \"" + oFilename + "\" nicht vorhanden"); + OpenCLRunner.bRead = false; + } + else + { + StreamReader oBuffer = new StreamReader(oFilename, System.Text.Encoding.UTF8); + OpenCLRunner.bRead = false; + OpenCLRunner.oCLCode = ""; + while (!oBuffer.EndOfStream) + { + OpenCLRunner.oCLCode += oBuffer.ReadLine() + "\r\n"; + } + oBuffer.Close(); + OpenCLRunner.bCompiled = false; + OpenCLRunner.bRead = true; + } + } + + + public static bool compile() + { + if (OpenCLRunner.bInit) + { + if (OpenCLRunner.bRead) + { + try + { + System.Diagnostics.Stopwatch oWatch = new System.Diagnostics.Stopwatch(); + oWatch.Start(); + + OpenCLRunner.bCompiled = false; + CLCalc.Program.Compile(OpenCLRunner.oCLCode, out OpenCLRunner.oCompileLogsList); + OpenCLRunner.bCompiled = true; + + oWatch.Stop(); + OpenCLRunner.oElapsedCompileTime = oWatch.Elapsed; + } + catch (Exception e) + { + MessageBox.Show("CLCalc-Error:\n===================\n\n" + e.ToString() + "\n\n" + e.Data); + + List.Enumerator iCompileLogs = OpenCLRunner.oCompileLogsList.GetEnumerator(); + while(iCompileLogs.MoveNext()) + { + MessageBox.Show("CompileLogs:\n===================\n\n" + iCompileLogs.Current); + } + } + } + else + { + MessageBox.Show("CL-Code must be read before compile!"); + } + } + else + { + MessageBox.Show("CL-Device must be initiated before compile!"); + } + + return OpenCLRunner.bCompiled; + } + + + + public static OpenCLFunction createFunction(String oCLFunctionName, string[] oVarNames) + { + return OpenCLRunner.createFunction(oCLFunctionName, OpenCLRunner.Variables(oVarNames)); + } + + public static OpenCLFunction createFunction(String oCLFunctionName, OpenCLVariable[] aoCLVars) + { + OpenCLFunction oCLFunction = OpenCLRunner.createFunction(oCLFunctionName); + oCLFunction.setVars(aoCLVars); + return oCLFunction; + } + + public static OpenCLFunction createFunction(String oCLFunctionName) + { + OpenCLFunction oCLFunction; + if (OpenCLRunner.oFunctionDict.ContainsKey(oCLFunctionName)) + { + OpenCLRunner.oFunctionDict.TryGetValue(oCLFunctionName, out oCLFunction); + } + else + { + oCLFunction = new OpenCLFunction(oCLFunctionName); + OpenCLRunner.oFunctionDict.Add(oCLFunctionName, oCLFunction); + } + return oCLFunction; + } + + + + public static OpenCLVariable createVariable(string oVarName, float[] fInput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.set(fInput); + } + else + { + oCLVar = new OpenCLVariable(fInput); + OpenCLRunner.oVarDict.Add(oVarName, oCLVar); + } + return oCLVar; + } + + public static OpenCLVariable createVariable(string oVarName, byte[] bInput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.set(bInput); + } + else + { + oCLVar = new OpenCLVariable(bInput); + OpenCLRunner.oVarDict.Add(oVarName, oCLVar); + } + return oCLVar; + } + public static OpenCLVariable createVariable(string oVarName, double[] dInput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.set(dInput); + } + else + { + oCLVar = new OpenCLVariable(dInput); + OpenCLRunner.oVarDict.Add(oVarName, oCLVar); + } + return oCLVar; + } + public static OpenCLVariable createVariable(string oVarName, char[] cInput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.set(cInput); + } + else + { + oCLVar = new OpenCLVariable(cInput); + OpenCLRunner.oVarDict.Add(oVarName, oCLVar); + } + return oCLVar; + } + public static OpenCLVariable createVariable(string oVarName, int[] nInput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.set(nInput); + } + else + { + oCLVar = new OpenCLVariable(nInput); + OpenCLRunner.oVarDict.Add(oVarName, oCLVar); + } + return oCLVar; + } + public static OpenCLVariable createVariable(string oVarName, long[] lInput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.set(lInput); + } + else + { + oCLVar = new OpenCLVariable(lInput); + OpenCLRunner.oVarDict.Add(oVarName, oCLVar); + } + return oCLVar; + } + + + + public static OpenCLVariable Variable(string oVarName) + { + OpenCLVariable oCLVar; + if (!OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + MessageBox.Show("Variable \"" + oVarName + "\" existiert nicht!"); + } + return oCLVar; + } + + public static OpenCLVariable[] Variables(string[] oVarNames) + { + OpenCLVariable[] oCLVars = new OpenCLVariable[oVarNames.Length]; + + for (int nI = 0; nI < oVarNames.Length; nI++) + { + if (!OpenCLRunner.oVarDict.TryGetValue(oVarNames[nI], out oCLVars[nI])) + { + MessageBox.Show("Variable \"" + oVarNames[nI] + "\" existiert nicht!"); + } + } + return oCLVars; + } + + + + public static bool returnData(string oVarName, ref byte[] bOutput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.returnData(ref bOutput); + return true; + } + else + { + MessageBox.Show("Variable \"" + oVarName + "\" existiert nicht!"); + return false; + } + } + public static bool returnData(string oVarName, ref float[] fOutput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.returnData(ref fOutput); + return true; + } + else + { + MessageBox.Show("Variable \"" + oVarName + "\" existiert nicht!"); + return false; + } + } + public static bool returnData(string oVarName, ref double[] dOutput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.returnData(ref dOutput); + return true; + } + else + { + MessageBox.Show("Variable \"" + oVarName + "\" existiert nicht!"); + return false; + } + } + public static bool returnData(string oVarName, ref int[] nOutput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.returnData(ref nOutput); + return true; + } + else + { + MessageBox.Show("Variable \"" + oVarName + "\" existiert nicht!"); + return false; + } + } + public static bool returnData(string oVarName, ref long[] lOutput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.returnData(ref lOutput); + return true; + } + else + { + MessageBox.Show("Variable \"" + oVarName + "\" existiert nicht!"); + return false; + } + } + public static bool returnData(string oVarName, ref char[] cOutput) + { + OpenCLVariable oCLVar; + if (OpenCLRunner.oVarDict.TryGetValue(oVarName, out oCLVar)) + { + oCLVar.returnData(ref cOutput); + return true; + } + else + { + MessageBox.Show("Variable \"" + oVarName + "\" existiert nicht!"); + return false; + } + } + + + + + public static void runFunction(String oCLFunctionName) + { + OpenCLFunction oCLFunction; + if (OpenCLRunner.oFunctionDict.TryGetValue(oCLFunctionName, out oCLFunction)) + { + oCLFunction.run(); + } + else + { + MessageBox.Show("Funktion \"" + oCLFunctionName + "\" existiert nicht!"); + } + } + + public static void runFunction(String oCLFunctionName, OpenCLVariable[] aoCLVars) + { + OpenCLFunction oCLFunction; + if (OpenCLRunner.oFunctionDict.TryGetValue(oCLFunctionName, out oCLFunction)) + { + System.Diagnostics.Stopwatch oWatch = new System.Diagnostics.Stopwatch(); + oWatch.Start(); + + oCLFunction.run(aoCLVars); + + oWatch.Stop(); + oElapsedExecutionTime = oWatch.Elapsed; + } + else + { + MessageBox.Show("Funktion \"" + oCLFunctionName + "\" existiert nicht!"); + } + } + + + } + + + + + class OpenCLFunction + { + private CLCalc.Program.Kernel oCLFunction; + private bool bArgsSet = false; + private OpenCLVariable[] aoCLVars; + + public OpenCLFunction(string oCLFunctionName) + { + try + { + this.oCLFunction = new CLCalc.Program.Kernel(oCLFunctionName); + } + catch (Exception e) + { + MessageBox.Show("CLCalc-Error:\n===================\n\n" + e.ToString()); + } + } + + public void run() + { + if(bArgsSet) { + this.run(this.aoCLVars); + } else { + MessageBox.Show("Variablen wurden nicht gesetzt!"); + } + } + + public void setVars(OpenCLVariable[] aoCLVars) { + this.aoCLVars = aoCLVars; + this.bArgsSet = true; + } + + public void run(OpenCLVariable[] aoGpuVars) + { + CLCalc.Program.Variable[] aoCLGpuVars = new CLCalc.Program.Variable[aoGpuVars.Length]; + for(int nI = 0; nI < aoGpuVars.Length; nI++) { + aoCLGpuVars[nI] = aoGpuVars[nI].getCLVar(); + } + //run on GPU + this.oCLFunction.Execute(aoCLGpuVars, OpenCLRunner.getWorkers()); + } + } + + + + + class OpenCLVariable + { + private CLCalc.Program.Variable oCLVar; + + public CLCalc.Program.Variable getCLVar() + { + return this.oCLVar; + } + + public OpenCLVariable(byte[] bInput) + { + this.oCLVar = new CLCalc.Program.Variable(bInput); + } + public OpenCLVariable(char[] cInput) + { + this.oCLVar = new CLCalc.Program.Variable(cInput); + } + public OpenCLVariable(double[] dInput) + { + this.oCLVar = new CLCalc.Program.Variable(dInput); + } + public OpenCLVariable(float[] fInput) + { + this.oCLVar = new CLCalc.Program.Variable(fInput); + } + public OpenCLVariable(int[] nInput) + { + this.oCLVar = new CLCalc.Program.Variable(nInput); + } + public OpenCLVariable(long[] lInput) + { + this.oCLVar = new CLCalc.Program.Variable(lInput); + } + + + public void set(byte[] bInput) + { + this.oCLVar.WriteToDevice(bInput); + } + public void set(char[] cInput) + { + this.oCLVar.WriteToDevice(cInput); + } + public void set(double[] dInput) + { + this.oCLVar.WriteToDevice(dInput); + } + public void set(float[] fInput) + { + this.oCLVar.WriteToDevice(fInput); + } + public void set(int[] nInput) + { + this.oCLVar.WriteToDevice(nInput); + } + public void set(long[] lInput) + { + this.oCLVar.WriteToDevice(lInput); + } + + + public void returnData(ref byte[] bVar) + { + this.oCLVar.ReadFromDeviceTo(bVar); + } + public void returnData(ref char[] cVar) + { + this.oCLVar.ReadFromDeviceTo(cVar); + } + public void returnData(ref double[] dVar) + { + this.oCLVar.ReadFromDeviceTo(dVar); + } + public void returnData(ref float[] fVar) + { + this.oCLVar.ReadFromDeviceTo(fVar); + } + public void returnData(ref int[] nVar) + { + this.oCLVar.ReadFromDeviceTo(nVar); + } + public void returnData(ref long[] lVar) + { + this.oCLVar.ReadFromDeviceTo(lVar); + } + } +} diff --git a/WindowsFormsApplication1/Program.cs b/WindowsFormsApplication1/Program.cs new file mode 100644 index 0000000..01de5a2 --- /dev/null +++ b/WindowsFormsApplication1/Program.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace OpenCLImageFilter +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/WindowsFormsApplication1/Properties/AssemblyInfo.cs b/WindowsFormsApplication1/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f640cbc --- /dev/null +++ b/WindowsFormsApplication1/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("WindowsFormsApplication1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("WindowsFormsApplication1")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e8c53c6f-4a95-467d-98f8-284f6a222ff2")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/WindowsFormsApplication1/Properties/Resources.Designer.cs b/WindowsFormsApplication1/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d770331 --- /dev/null +++ b/WindowsFormsApplication1/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.1 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace OpenCLImageFilter.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpenCLImageFilter.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/WindowsFormsApplication1/Properties/Resources.resx b/WindowsFormsApplication1/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/WindowsFormsApplication1/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/WindowsFormsApplication1/Properties/Settings.Designer.cs b/WindowsFormsApplication1/Properties/Settings.Designer.cs new file mode 100644 index 0000000..c1c350b --- /dev/null +++ b/WindowsFormsApplication1/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.1 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace OpenCLImageFilter.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/WindowsFormsApplication1/Properties/Settings.settings b/WindowsFormsApplication1/Properties/Settings.settings new file mode 100644 index 0000000..abf36c5 --- /dev/null +++ b/WindowsFormsApplication1/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/WindowsFormsApplication1/SimpleCL.cl b/WindowsFormsApplication1/SimpleCL.cl new file mode 100644 index 0000000..85c0791 --- /dev/null +++ b/WindowsFormsApplication1/SimpleCL.cl @@ -0,0 +1,6 @@ +kernel void +sum(global float16 * x, global float16 * y) +{ + int i = get_global_id(0); + x[i] = x[i] + y[i]; +} diff --git a/WindowsFormsApplication1/bin/Debug/OpenCL.NET.dll b/WindowsFormsApplication1/bin/Debug/OpenCL.NET.dll new file mode 100644 index 0000000000000000000000000000000000000000..1cb7ace997a5d1ce014c86cc7a6ca265cc665fa0 GIT binary patch literal 36864 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 literal 0 HcmV?d00001 diff --git a/WindowsFormsApplication1/bin/Debug/OpenCL.NET.xml b/WindowsFormsApplication1/bin/Debug/OpenCL.NET.xml new file mode 100644 index 0000000..3026ddc --- /dev/null +++ b/WindowsFormsApplication1/bin/Debug/OpenCL.NET.xml @@ -0,0 +1,143 @@ + + + + OpenCL.NET + + + + + This class provides the driver interface for OpenGL interoperability + with OpenCL standard. + + + + + This class provides the driver interface to OpenCL functions. + + + + + Used to represent a platform dependent sized variable. + On 32 bit platforms it is 4 bytes wide (int, uint), on 64 bit it is + 8 bytes wide (long, ulong). + + This class maps to the C/C++ native size_t data type. + + + + + Creates a new instance based on the given value. + + Integer value to represent. + + + + Creates a new instance based on the given value. + + Integer value to represent. + + + + Creates a new instance based on the given value. + + Integer value to represent. + + + + Creates a new instance based on the given value. + + Integer value to represent. + + + + Converts the object to int. + + Object to convert. + Integer value represented by the object. + + + + Converts the object to uint. + + Object to convert. + Integer value represented by the object. + + + + Converts the object to long. + + Object to convert. + Integer value represented by the object. + + + + Converts the object to ulong. + + Object to convert. + Integer value represented by the object. + + + + Converts the given integer to an object. + + Integer value to convert. + New object representing this value. + + + + Converts the given integer to an object. + + Integer value to convert. + New object representing this value. + + + + Converts the given integer to an object. + + Integer value to convert. + New object representing this value. + + + + Converts the given integer to an object. + + Integer value to convert. + New object representing this value. + + + + Compares two SizeT objects. + + First value to compare. + Second value to compare. + true or false for the comparison result. + + + + Compares two SizeT objects. + + First value to compare. + Second value to compare. + true or false for the comparison result. + + + + Returns a value indicating whether this instance is equal to a specified object. + + An object to compare with this instance or null. + true if obj is an instance of System.IntPtr and equals the value of this instance; otherwise, false. + + + + Converts the numeric value of the current object to its equivalent string representation. + + The string representation of the value of this instance. + + + + Returns the hash code for this instance. + + A 32-bit signed integer hash code. + + + diff --git a/WindowsFormsApplication1/bin/Debug/OpenCLTemplate.dll b/WindowsFormsApplication1/bin/Debug/OpenCLTemplate.dll new file mode 100644 index 0000000000000000000000000000000000000000..5e2b3d4ec2ac8801837721457eef2317a0bafc10 GIT binary patch literal 340992 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 V>ti9MG9d8*-h$rz`{k3s{{k13`s@Gz literal 0 HcmV?d00001 diff --git a/WindowsFormsApplication1/bin/Debug/OpenCLTemplate.xml b/WindowsFormsApplication1/bin/Debug/OpenCLTemplate.xml new file mode 100644 index 0000000..bcbd296 --- /dev/null +++ b/WindowsFormsApplication1/bin/Debug/OpenCLTemplate.xml @@ -0,0 +1,1417 @@ + + + + OpenCLTemplate + + + + OpenCL calculations class + + + String to include to enable Double Precision calculations + + + Currently used acceleration + + + Initialization error + + + Sets CLCalc status to NotUsingCL + + + Initializes OpenCL and reads devices + + + Initializes OpenCL from an existing Context and reads devices + Existing context pointer + Existing command queue pointer + + + Tries to execute actual code in device to check its availability. + Command queue number to check + + + Releases OpenCL resources + + + Last found error + + + List of available platforms + + + List of available devices + + + Gets string to include to enable Double Precision calculations + + + Gets acceleration type being used + + + Gets initialization error description + + + Last error. Throws exception if not set to success. + + + OpenCL accelerations + + + Has not tested what type of acceleration is going to be used. + + + OpenCL used to accelerate calculations + + + No OpenCL used/supported + + + Class to hold OpenCL devices + + + Device ID + + + Device type string + + + Device name string + + + Device vendor string + + + OpenCL version string + + + Execution capabilities of the device + + + Is device available? + + + Is device compiler available? + + + Maximum memory allocation size in bytes + + + Memory size in bytes + + + Maximum number of work-items + that can be specified in each dimension of the work-group + to clEnqueueNDRangeKernel. + + + Maximum number of work-items in a + work-group executing a kernel using the data parallel execution model. + + + Constructor + Device ID + + + Class to hold OpenCL Platforms + + + Platform ID + + + OpenCL profile string. Profile name supported by the implementation. + + + OpenCL version string. + + + OpenCL name string. + + + OpenCL vendor string. + + + OpenCL extensions string. + + + Constructor. + Sets this platform's ID + + + Program related stuff + + + Local event + + + OpenCL context using all devices + + + Synchronous command queues that are executed in call order + + + Asynchronous command queues + + + Default synchronous command queue set as the first GPU, for ease of use. + + + Compiled program + + + Ends all commands being executed + + + Compiles program contained in a single string. + Source code to compile + + + Compiles program contained in a single string. Returns build logs for each device. + Source code to compile + Build logs for each device + + + Compiles the program. + Source code to compile + + + Compiles the program. Returns the build logs for each device. + Source code array to compile + Build logs for each device + + + Variables class + + + Data to be stored + + + Original variable length + + + Memory buffer + + + Constructor. Creates from an existing OpenCL variable + OpenCL variable pointer + Original array length + sizeOf(array datatype) + + + Constructor. + Variable whose size will be allocated in device memory. + + + Constructor. + Variable whose size will be allocated in device memory. + + + Constructor. + Variable whose size will be allocated in device memory. + + + Constructor. + Variable whose size will be allocated in device memory. + + + Constructor. + Variable whose size will be allocated in device memory. + + + Constructor. + Variable whose size will be allocated in device memory. + + + Writes variable to device + Values to write to device + Command queue to use + TRUE to return only after completed writing. + OpenCL Event associated to this operation + OpenCL Events that need to finish before this one can start + + + Writes variable to device + Values to write to device + + + Writes variable to device + Values to write to device + Command queue to use + TRUE to return only after completed writing. + OpenCL Event associated to this operation + OpenCL Events that need to finish before this one can start + + + Writes variable to device + Values to write to device + + + Writes variable to device + Values to write to device + Command queue to use + TRUE to return only after completed writing. + OpenCL Event associated to this operation + OpenCL Events that need to finish before this one can start + + + Writes variable to device + Values to write to device + + + Writes variable to device + Values to write to device + Command queue to use + TRUE to return only after completed writing. + OpenCL Event associated to this operation + OpenCL Events that need to finish before this one can start + + + Writes variable to device + Values to write to device + + + Writes variable to device + Values to write to device + Command queue to use + TRUE to return only after completed writing. + OpenCL Event associated to this operation + OpenCL Events that need to finish before this one can start + + + Writes variable to device + Values to write to device + + + Writes variable to device + Values to write to device + Command queue to use + TRUE to return only after completed writing. + OpenCL Event associated to this operation + OpenCL Events that need to finish before this one can start + + + Writes variable to device + Values to write to device + + + Reads variable from device. + Values to store data coming from device + Command queue to use + TRUE to return only after completed reading. + OpenCL Event associated with this operation + OpenCL Events that need to finish before this one can start + + + Reads variable from device. Does not return until data has been copied. + Values to store data coming from device + + + Reads variable from device. + Values to store data coming from device + Command queue to use + TRUE to return only after completed reading. + OpenCL Event associated with this operation + OpenCL Events that need to finish before this one can start + + + Reads variable from device. Does not return until data has been copied. + Values to store data coming from device + + + Reads variable from device. + Values to store data coming from device + Command queue to use + TRUE to return only after completed reading. + OpenCL Event associated with this operation + OpenCL Events that need to finish before this one can start + + + Reads variable from device. Does not return until data has been copied. + Values to store data coming from device + + + Reads variable from device. + Values to store data coming from device + Command queue to use + TRUE to return only after completed reading. + OpenCL Event associated with this operation + OpenCL Events that need to finish before this one can start + + + Reads variable from device. Does not return until data has been copied. + Values to store data coming from device + + + Reads variable from device. + Values to store data coming from device + Command queue to use + TRUE to return only after completed reading. + OpenCL Event associated with this operation + OpenCL Events that need to finish before this one can start + + + Reads variable from device. Does not return until data has been copied. + Values to store data coming from device + + + Reads variable from device. + Values to store data coming from device + Command queue to use + TRUE to return only after completed reading. + OpenCL Event associated with this operation + OpenCL Events that need to finish before this one can start + + + Reads variable from device. Does not return until data has been copied. + Values to store data coming from device + + + Sets this variable as an argument for a kernel + Index of kernel argument + Kernel to receive argument + + + Releases variable from memory. + + + Destructor + + + Returns the size of the stored variable + + + Kernels class + + + Local kernel storage + + + Number of arguments + + + Creates a new Kernel + + + + "Remember" variables + + + Sets kernel arguments + Variables to be set as arguments + + + Execute this kernel + Command queue to use + Arguments of the kernel function + Array of maximum index arrays. Total work-items = product(max[i],i+0..n-1), n=max.Length + Events to wait before executing this + Event of this command + + + Execute this kernel + Command queue to use + Arguments of the kernel function + Array of maximum index arrays. Total work-items = product(max[i],i+0..n-1), n=max.Length + Local work sizes + Events to wait before executing this + Event of this command + + + Execute this kernel + Array of maximum index arrays. Total work-items = product(max[i],i+0..n-1), n=max.Length + Arguments of the kernel function + + + Execute this kernel using work_dim = 1 + Global work size in one-dimension. global_work_size = new int[1] {GlobalWorkSize} + Arguments of the kernel function + + + Execute this kernel + Array of maximum index arrays. Total work-items = product(max[i],i+0..n-1), n=max.Length + Local work sizes + Arguments of the kernel function + + + Releases kernel from memory + + + Destructor + + + Gets how many arguments this kernel has + + + OpenCL programs + + + Basic linear algebra functions + + + Float vector sum kernel + + + float matrix multiplication kernel + + + float Gauss Seidel method + + + LU factorizaton method + + + Constructor. Builds OpenCL program. + + + Converts vector to matrix + Vector + Matrix first dimension + Matrix second dimension + + + Converts matrix to vector + Matrix + Matrix first dimension + Matrix second dimension + + + Returns the sum of two matrices + Matrix 1 + Matrix 2 + + + Matrix multiplication + Matrix 1 + Matrix 2 + + + Gauss Seidel method for iterative linear system solving. Returns unknown x + Matrix M so that Mx=b + Initial estimate + Known vector b + Gauss-Seidel iterations per step + Maximum number of times Gauss-Seidel iterations + Desired sqrt(Sum(error[i]^2))*number of equations + Estimated absolute error per component + + + Gauss Seidel method for iterative linear system solving. Returns unknown x + Matrix M so that Mx=b + Initial estimate + Known vector b + Estimated error per equation + + + Solves linear system Mx = b by LU decomposition. Returns x + Matrix M + Vector b + Maximum acceptable absolute error + Maximum iterations + + + Calculates LU decomposition of M matrix + Matrix to decompose + Matrix dimension + Swap index + + + Gauss Seidel method. Make sure to send x = b. Replaces x. + + + Matrix multiplication. Dimensions { p, r }. + + + + Basic linear algebra functions + + + Float vector sum kernel + + + double matrix multiplication kernel + + + double Gauss Seidel method + + + LU factorizaton method + + + Constructor. Builds OpenCL program. + + + Converts vector to matrix + Vector + Matrix first dimension + Matrix second dimension + + + Converts matrix to vector + Matrix + Matrix first dimension + Matrix second dimension + + + Returns the sum of two matrices + Matrix 1 + Matrix 2 + + + Matrix multiplication + Matrix 1 + Matrix 2 + + + Gauss Seidel method for iterative linear system solving. Returns unknown x + Matrix M so that Mx=b + Initial estimate + Known vector b + Gauss-Seidel iterations per step + Maximum number of times Gauss-Seidel iterations + Desired sqrt(Sum(error[i]^2))*number of equations + Estimated absolute error per component + + + Gauss Seidel method for iterative linear system solving. Returns unknown x + Matrix M so that Mx=b + Initial estimate + Known vector b + Estimated error per equation + + + Solves linear system Mx = b by LU decomposition. Returns x + Matrix M + Vector b + Maximum acceptable absolute error + Maximum iterations + + + Calculates LU decomposition of M matrix + Matrix to decompose + Matrix dimension + Swap index + + + Gauss Seidel method. Make sure to send x = b. Replaces x. + + + Matrix multiplication. Dimensions { p, r }. + + + + Float differential equation integrator + + + Writes final Y values and estimated absolute errors + + + Updates X to current time + + + Independent variable current value in OpenCL memory + + + Dynamic system current state in OpenCL memory + + + Derivative calculator + + + Constructor. + Initial state of system + Desired step per integration pass + Initial independent variable value + Function to calculate derivatives vector + + + Integrates equation set to a final value using current stepsize. Ideally, final value + and currentX should multiples of stepsize. + Final value to reach. + + + Sets current state + New independent variable value + New state values + + + Takes an integration step. Saves and returns stepsize back to what it was. + Step size to use + + + Takes an integration step + + + Sets step size. + Step size to use + + + Gets current values of space-state variables (from Device). + + + Gets current absolute error sum + + + Gets current independent variable value (from Device). + + + Function to calculate derivatives vector + IN: Scalar. Independent variable. + IN: State-space vector. + OUT: Derivatives + + + OpenCL source + + + double differential equation integrator + + + Writes final Y values and estimated absolute errors + + + Updates X to current time + + + Independent variable current value in OpenCL memory + + + Dynamic system current state in OpenCL memory + + + Derivative calculator + + + Constructor. + Initial state of system + Desired step per integration pass + Initial independent variable value + Function to calculate derivatives vector + + + Integrates equation set to a final value using current stepsize. Ideally, final value + and currentX should multiples of stepsize. + Final value to reach. + + + Sets current state + New independent variable value + New state values + + + Takes an integration step. Saves and returns stepsize back to what it was. + Step size to use + + + Takes an integration step + + + Sets step size. + Step size to use + + + Gets current values of space-state variables (from Device). + + + Gets current absolute error sum + + + Gets current independent variable value (from Device). + + + Function to calculate derivatives vector + IN: Scalar. Independent variable. + IN: State-space vector. + OUT: Derivatives + + + OpenCL source + + + Discrete element modeling. Calculates derivatives of n particle-spring model into a 6n space-state + system (positions, velocities, x,y,z each). + + + Mass values (n) + + + Original positions (3n) + + + Origins (L) origs[i] connects to dests[i] + + + Destinations (L) + + + Spring constants (L) + + + Spring constants to ground (n) + + + Damping (L) + + + Damping to ground (n) + + + Number of Connections (1) + + + Initial distances (L) + + + Actuating forces (3*n) + + + Connection forces (L) + + + Nodes connections (int, 20*n) + + + Initial lengths kernel. work_dim = 1, globalsize = n + + + Initial length arguments + + + Reset forces kernel. work_dim = 1, globalsize = 3n + + + Reset forces arguments + + + Calculate forces kernel. work_dim = 1, globalsize = L + + + Calculate forces arguments + + + Calculate forces kernel. work_dim = 1, globalsize = n + + + Calculate forces arguments + + + Calculate forces kernel. work_dim = 1, globalsize = L + + + Calculate forces arguments + + + Calculate nodes connections. work_dim = 1, globalsize = n + + + Calculate nodes connections arguments + + + Constructor. + Number of masses in the system + Number of connections + Mass of each vertex + Position and velocity of vertexes + [2*3*i] - posx, [2*(3*i+1)] - posy, [2*(3*i+2)] - posz, + [1+2*3*i] - velx, [1+2*(3*i+1)] - vely, [1+2*(3*i+2)] - velz + Origin vertex of connections. Spring connects Origin[i] to Dests[i] + Destination vertex of connections. Spring connects Origin[i] to Dests[i] + Spring constant for each connection + Spring constant for each mass, connecting to ground (nMass) + Structural damping (relative-speed dependant) (nConnections) + Absolute damping proportional to speed relative to Earth (nMass) + + + Calculates derivatives of deformable body space-state vector dydx[6n]. dydx[2i] - i-th position deriv, + dydx[2i+1] - ith velocity deriv + + + Reset forces. Work_dim = 1, nmax = { nMasses } + + + Derivatives sketch. Work_dim = 1, nmax = { 3 * nMasses } + Forces + Masses + Independent variable + State space vector + Derivatives + + + Initial L0 calculation. work_dim = 1, global_work_size[0]=nConnections + + + Forces calculation. Returns forces. Work_dim = 1, nmax = { nConnections } + + + Calculates forces to ground. w_dim=1, global_work_size = nMasses + + + Calculates forces to ground. w_dim=1, global_work_size = nMasses + + + Floating point particle system physics + + + Motion Newton-law 1D solver. Kernel: rk46 + + + Force applier to particles. Kernels: ResetForces, ApplyGravity, FloorCollision + + + Collision applier to particles. Kernels: ResetForces, ApplyGravity, FloorCollision + + + Initializes physics program. Components indexes: [i] - x, [i+1] - y, [i+2] - z + Number of particles + + + Sets particles parameters + Positions (3*numParticles) + Speeds (3*numParticles) + Masses (numParticles) + Collision sizes (numParticles) + + + Gets particles positions + + + Gets how many close neighbors a particle has. Use this to avoid drawing unnecessary particles + + + Gets simulation time + + + Stepsize + + + Executes an integration step + + + Motion step arguments + + + Takes an integration step + Step size + + + Applies gravity + + + Apply gravity arguments + + + Applies gravity force. + Gravity force. Remember to use negative for down direction. + + + Clear forces + + + Apply gravity arguments + + + Clears forces + + + Floor collision + + + Apply floor collision arguments + + + Applies floor collision? + + + Wall collision + + + Apply floor collision arguments + + + Applies floor collision? + + + Self collision + + + Apply self collision arguments + + + Applies self collision? + + + Reset close neighbors + + + Apply self collision arguments + + + Marching cubes algorithm for isosurface reconstruction + + + Compute normals of faces? + + + X, y and z increments. step[0] = deltaX, step[1] = deltaY, step[2] = deltaZ + + + X, y and z initial values. initVals[0] = x0, initVals[1] = y0, initVals[2] = z0 + + + Isolevel to look for + + + Values of the function + + + Length of each dimension - max[0] = maxX, max[1]=maxY, max[2]=maxZ + + + Edge coordinates. + + + Edge normals. + + + Edge coordinates. + + + Element index to build triangles + + + CL variable isolevel + + + OpenCL variable that stores function values. F(x,y,z) = CLFuncVals[x+maxX*y+maxX*maxY*z] + + + CL Edge coordinates. Geometry data compatible with OpenGL + + + CL Edge normals. Geometry data compatible with OpenGL + + + CL Element index array. Geometry data compatible with OpenGL + + + Auxiliary/preliminary normals + + + OpenCL x, y and z step sizes + + + OpenCL x, y and z initial values within grid + + + Kernel to interpolate points + + + Creates a new isosurface calculator. You may pass variables created from a OpenGL context to the CL variables if you are using interop or NULL + if not using OpenCL/GL interop. + Values of the evaluated 3D function f(x,y,z). FuncValues=float[maxX,maxY,maxZ] + + + Creates a new isosurface calculator. You may pass variables created from a OpenGL context to the CL variables if you are using interop or NULL + if not using OpenCL/GL interop. + Values of the evaluated 3D function f(x,y,z). FuncValues=float[maxX,maxY,maxZ] + OpenCL variable (float) to hold edge coordinates. Dimension has to be 9 * maxX * maxY * maxZ + OpenCL variable (float) to hold edge normals. Dimension has to be 9 * maxX * maxY * maxZ + OpenCL variable (int) to hold element array index. Dimension has to be 5 * 3 * (maxX - 1) * (maxY - 1) * (maxZ - 1) + + + Creates a new isosurface calculator. You may pass variables created from a OpenGL context to the CL variables if you are using interop or NULL + if not using OpenCL/GL interop. + Values of the evaluated 3D function f(x,y,z). FuncValues=float[maxX,maxY,maxZ] + OpenCL variable (float) to hold edge coordinates. Dimension has to be 9 * maxX * maxY * maxZ + OpenCL variable (float) to hold edge normals. Dimension has to be 9 * maxX * maxY * maxZ + OpenCL variable (int) to hold element array index. Dimension has to be 5 * 3 * (maxX - 1) * (maxY - 1) * (maxZ - 1) + + + Sets function values + Values to set + + + Calculates isosurface corresponding to a given isolevel + + + + Retrieves edge information. Can be used to draw marching cubes geometry using OpeGL + Edge vertexes coordinates + Edge vertexes normal vectors + Element index array (triangles) + + + Gets or sets x, y and z increments. Increments[0] = deltaX, Increments[1] = deltaY, Increments[2] = deltaZ + + + Gets or sets x, y and z intial values. InitValues[0] = x0, InitValues[1] = y0, InitValues[2] = z0 + + + Gets or sets current isolevel + + + Displays OpenCL related information + + + + Required designer variable. + + + + + Clean up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + Constructor. + + + + An useful class to read/write/delete/count registry keys + + + + + To read a registry key. + input: KeyName (string) + output: value (string) + + + + + To write into a registry key. + input: KeyName (string) , Value (object) + output: true or false + + + + + To delete a registry key. + input: KeyName (string) + output: true or false + + + + + To delete a sub key and any child. + input: void + output: true or false + + + + + Retrive the count of subkeys at the current key. + input: void + output: number of subkeys + + + + + Retrive the count of values in the key. + input: void + output: number of keys + + + + + A property to show or hide error messages + (default = false) + + + + + A property to set the SubKey value + (default = "SOFTWARE\\" + Application.ProductName.ToUpper()) + + + + + A property to set the BaseRegistryKey value. + (default = Registry.LocalMachine) + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + Creates a Matrix of real numbers. + + + Matrix items + + + Linear Solve parameter. Maximum mean error allowable to linear solve method. + + + Linear Solve parameter. Limit linear solution correction iterations. + + + Linear Solve parameter. Should the solution method halt if a hard singulariry is found in matrix? + + + Linear Solve parameter. Should the method ignore if the matrix has a close-to-zero determinant and keep solving? + + + Constructor. Initializes a [0,0] matrix. + + + Constructor. Creates matrix from existing items. + Matrix items to create matrix from. + + + Copy constructor. + Matrix to copy from. + + + Constructor. Creates empty matrix with specified dimensions. + Number of rows in matrix. + Number of columns in matrix. + + + Sums two matrixes. + First matrix to sum. + Second matrix to sum. + + + Subtracts two matrixes. + Matrix to subtract from. + Matrix to be subtracted. + + + Matrix multiplication. Notice that m1 rows should be the same as m2 lines for compatibility. + First matrix to multiply. + Second matrix to multiply. + + + Matrix scalar multiplication. + Matrix to multiply. + Scalar to multiply. + + + Matrix scalar multiplication. + Matrix to multiply. + Scalar to multiply. + + + Matrix post-vector multiplication. Notice that a vector is a [1,Cols] matrix which means + vector length should be equal matrix number of columns. + Matrix to multiply. + vector to multiply. + + + Matrix pre-vector multiplication. Notice that a vector is a [1,Cols] matrix which means + vector length should be equal matrix number of lines. + Matrix to multiply. + vector to multiply. + + + Matrix scalar division. + Matrix to multiply. + Scalar to divide each element of matrix. + + + Compares matrixes and returns true if they are identical. + Matrix to compare to. + + + Returns matrix transpose. + + + Element-wise product. This is not regular matrix product. It multiplies elements + at corresponding positions. + Matrix to multiply element-wise. + + + Returns Euclidean norm of the matrix. + + + Dot product of two matrixes. + Matrix to dot product with/ + + + Element-wise inversion. Returns the matrix with each element (x) inverted (1/x). + + + Creates internal LU factorization of this matrix. + + + Returns the solution x to the linear system Ax=b, A being this matrix. + Right-hand side known values. + + + Returns the determinant of this matrix. + + + Returns the inverse of this matrix. + + + Returns the solution x to the linear system A'Ax=A'b, A being this matrix. + Right-hand side known values. + + + Returns the weighted solution x to the linear system A'WAx=A'Wb, + A being this matrix. TO DO: Correct quality check + Right-hand side known values. + Weight matrix. + + + Returns the weighted solution x to the linear system A'DAx=A'Db, + A being this matrix. D is a diagonal weight matrix. + Right-hand side known values. + Main diagonal elements of diagonal weight matrix D. + + + Calculates R², corrected R² and Quadratic Error for the trySolution x to the linear system A'Ax=A'b, + A being this matrix. + Right-hand side known values. + Solution to use to evaluate quality indexers. + + + Applies the Gram-Schmidt orthonormalization method to this matrix, replacing + it by the orthonormalized matrix. + + + Applies the Gram-Schmidt orthonormalization method to this matrix, replacing + it by the orthonormalized matrix and also correcting right-hand Y values for a linear system solve. + Right-hand side known values. + + + Applies the Gram-Schmidt orthonormalization method to this matrix using + a pre-set order of normalization. Replaces current matrix + by the orthonormalized matrix and also correcting + right-hand Y values for a linear system solve. + Right-hand side known values. + Line order to apply the orthonormalization method. + Starts orthonormalization from line lineOrder[indStart]. Assumes previous lines are already + normalized. + + + Returns a string representing this matrix. + + + Accesses items in current matrix. + Row of element to access. + Column of element to access. + + + Gets the number of rows in this matrix. + + + Gets the number of columns in this matrix. + + + Returns the R² index of last fit. + + + Returns corrected R² index of last fit. + + + Returns the sum of quadratic errors of last fit. + + + Class to help editing OpenCL code + + + Constructor. Takes care of a Rich Text Box KeyUp event to paint things + RichTextBox to control + + + Help indentation? + + + Regular text color + + + Regular text font + + + Comments color + + + Comments font + + + List of string structures to mark + + + KeyUp event handler + + + Forces OpenCL RichTextBox to be updated + + + Stops updating text box while coloring text + Rich text box to lock + + + Restarts updating text box + Rich text box to unlock + + + Defines a structure of strings to mark + + + Description of string type + + + Color to use for this string type + + + Font to be used in this list of strings + + + List of strings of this type + + + OpenCL Helper Editor + + + + Required designer variable. + + + + + Clean up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + Constructor. + + + Button to test code + + + + The main entry point for the application. + + + + diff --git a/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe b/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe new file mode 100644 index 0000000000000000000000000000000000000000..af1defb7cc1745616eaf0f83ba85b043276b9fe4 GIT binary patch literal 25088 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 nWidth) nX = nWidth-1; + if(nY < 0) nY = 0; + if(nY >= nHeight) nY = nHeight-1; + +// if(nX > -1 && nX < nWidth && nY > -1 && nY < nHeight) { //if mask is not outside the image + f4Pixel += (afMask[nK]/fMaskSum) * convert_float4(ac4PictureIn[(nY * nWidth) + nX]); +// } + } + + return convert_uchar4(f4Pixel); +} + + +kernel void +recycle(global uchar4* ac4PictureIn, global uchar4* ac4PictureOut, global int* nDim) +{ + int nXpixel = get_global_id(0); + int nYpixel = get_global_id(1); + + int nPos = (nYpixel * nDim[0]) + nXpixel; + +// uchar4 c4Temp = ac4PictureIn[nPos]; + + ac4PictureIn[nPos] = ac4PictureOut[nPos]; +// ac4PictureOut[nPos] = c4Temp; +} \ No newline at end of file diff --git a/WindowsFormsApplication1/filter_gauss3x3.txt b/WindowsFormsApplication1/filter_gauss3x3.txt new file mode 100644 index 0000000..842098d --- /dev/null +++ b/WindowsFormsApplication1/filter_gauss3x3.txt @@ -0,0 +1,4 @@ +3 +1, 2, 1 +2, 4, 2 +1, 2, 1 \ No newline at end of file diff --git a/WindowsFormsApplication1/filter_gauss5x5.txt b/WindowsFormsApplication1/filter_gauss5x5.txt new file mode 100644 index 0000000..7780211 --- /dev/null +++ b/WindowsFormsApplication1/filter_gauss5x5.txt @@ -0,0 +1,6 @@ +5 +1, 2, 4, 2, 1, +2, 4, 8, 4, 2, +4, 8, 16,8, 4, +2, 4, 8, 4, 2, +1, 2, 4, 2, 1, \ No newline at end of file diff --git a/WindowsFormsApplication1/filter_neutral.txt b/WindowsFormsApplication1/filter_neutral.txt new file mode 100644 index 0000000..27f5fe8 --- /dev/null +++ b/WindowsFormsApplication1/filter_neutral.txt @@ -0,0 +1,13 @@ +3 +0,0,0 +0,1,0 +0,0,0 + + + +5 +0,0,0,0,0 +0,0,0,0,0 +0,0,1,0,0 +0,0,0,0,0 +0,0,0,0,0 diff --git a/WindowsFormsApplication1/filter_test.txt b/WindowsFormsApplication1/filter_test.txt new file mode 100644 index 0000000..564f2f8 --- /dev/null +++ b/WindowsFormsApplication1/filter_test.txt @@ -0,0 +1,6 @@ +5 +1, 1, 1, 1, 1, +1, 0, 0, 0, 1, +1, 0, 0, 0, 1, +1, 0, 0, 0, 1, +1, 1, 1, 1, 1, \ No newline at end of file