From f37b2f886c76e1d1fc304100563517cde66d6902 Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Thu, 13 Jul 2017 17:02:51 -0400 Subject: [PATCH 01/17] Starting to figure out openCL kernel with textrue --- .../tutorial/clTexture/ObjectModel.class | Bin 0 -> 1475 bytes .../tutorial/clTexture/TextureDriver.class | Bin 2764 -> 3355 bytes .../tutorial/clTexture/TextureMaker.class | Bin 7166 -> 10140 bytes nbproject/private/private.xml | 1 + src/tutorial/clTexture/ObjectModel.java | 57 ++++++++ src/tutorial/clTexture/TextureDriver.java | 43 ++++-- src/tutorial/clTexture/TextureMaker.java | 122 ++++++++++++++---- 7 files changed, 190 insertions(+), 33 deletions(-) create mode 100644 build/classes/tutorial/clTexture/ObjectModel.class create mode 100644 src/tutorial/clTexture/ObjectModel.java diff --git a/build/classes/tutorial/clTexture/ObjectModel.class b/build/classes/tutorial/clTexture/ObjectModel.class new file mode 100644 index 0000000000000000000000000000000000000000..a60563b06a9ffc53901fb8d30cc71fe9280096fd GIT binary patch literal 1475 zcmaKsU2_vv7{~u7Z%dZNlBBJ?iB%BNBs5ehpaq1aq@<)2Xi3$M7u)1CZfD)?ESrLN zUV81N-@zH35y*Ja55VW}b1?j$-86Kxc=PP@a?W#p=YP)G*Khvb18@Z!1}+A?Bu-TPD87Z4-A; z6H_;^VBoGowj0>b>VDq~6;xB<$gU1T{k+*_iQljvXz?>Q9M1`FDHz3##zteht&pnw zU9B+IayDXo9oG6=TMDO0INjQ| zckQa@_|;KG2W+0|+M%sr?vBz5lkXdBuKN9;qZ^Lw>i7Z58R@Pt;Rn5{`)s@CR{b6A z@w3>PoqbP!&ca71S~!VQ78+Qza9X^3Xj+&?$-)xuTR0=R7M3kMz>0;3VjkhKg;gvY zShMg1Z3F8TzL6>4;yZ=2|F0;?BQ0Fp>kXAwuzK#I_CzloP*zIGqi3?_c-=UwkS;cx zqOhc+feVpzr;E+Q^@;`;dhT6Mj=kC-{()e3v|CdI>q?=*xqRDvGz@EZ^hDjDF`x zzE|8Yy+X27-b=eLkSYz3et}HhDE)=Z07vMQUm=?}2RItntf*$iwaR`iZzP%dGg@ql zwgi)Q0x3+wB3OZFXNXlKQkC9yf-DeY2~z|IZG?hPagGt8a2}r#RJ;rH67(-}c8vZT z(oyYR{@4H?vNA!5pQ!iX0btCrM!>Nde_Zk_?U!&7GCU-)$G{vU*?HKDM|gac;W3HF4a~z6Tw;h}uU?xxOE(AfGrv0{?L**6 z1DPP6GVnB>VR+Vy=Op$G|G8e&dI!v;740zl1zejN1hOo1a9KQ_?4&?;s}HT6UWBH_Mh zJbcMqm4M#GsZ`#*HPt1Mclo@`Vb@CkQq(Hk#IOmq0{NMrM1Cgdjs*|kd4(EOE4+Xg z6_(;)X2>1#y@Z$9IV2Fugxv*=&5>R+sc;ytaQIb)*KkDPb-W?*rovlzTj3oXRd|=- z7~f|YhZNppcLeV%e8BD~YBNPzQPFYO3Lm0Y;)KFU&N;Nl-aA|v!lcc`?9pU_=Zwti%Zo)T$++<3A(9NXE`9Se`^u+ECc zh~_{?(u`QLtnoXatrP5;~e?Q`ZI@p*R$o|;TS@qu3#H!s9eDoje;eG#kbHVAv>e+n8x%mcQD@ z>?0TUQe-$y{J6pV?Lvrf8hM4p&~%iLzW~J~K?!j>6W3!lhKT$z66-sXR@l{*74vgLwW6jkthSLZV41G>crU5d~N)is>Afg;r64HW9`;u@LQIG141F4Yr6n z+~NpVGcFF@tdTZTB0^Y&)gL z7bv7lv`Kg*awGy0>*xah=EHkEC23T212tHhP6{%)uhLEsn0XR&+5@73uHz`RQ5Gz> zG1o@L5qMXZk77PiIP5f7KG8LAg1%zvVxR+lbRrifHR3j!?IJR}F#}N|vFBoI7Sf&C zv61pynSV*AsKh*twnInO#BNqn6Z0<=m?CV1ZCsTz84KvjnKT&-ZCo9gLY)%k{uhpZ zdGz?eb|SEk3dLyy2~u$fZR=)io+!!$x+p79e%i)jdX{UFO>;+a?S{F>DC%sG4iMdad!r<2b=J-B29zW?^cFE5A^fvq&U(D5&H CmSqkA delta 1316 zcmYL|`Bz(25XV0+Bzf@iz=Q)0rU`4YvJ_4itg;CTVx?Fulu9X83K1y;kfmZ>V(Wsn zi_}<^)~atb|guiL>H@O=4fBoBCQS+_B{CdU$+n%H)mI6;ExdCapEImO7h96&|N9HJ3J*J;$3i_p#IF zByZW&aw=8mEeM?Ej4Edh3R3e%WLHQ3NPN=fZRXW{&gLCbHt$kra^B`W-naRH1)B>B z7xjP-IcsxC)sOht<`Y#f%c0l2vDl}4X7jlQe_?Y)eHJz3OBM{Gsa1bo>Xz3Z{fesw zc2|6MdS)_S*b+~S+kDL_n{OmdkuO$yO@pp$__r#3$C5#4Dlt47Uk}<=b!1|B(pP5q z0tvZ5>axFf`CtE(k)%jQphhV55aAwn3aj_JS_T=)hR8m#30;EqqE*XksI~kCo+a0{ zLD26S!!(L)uQ_l(O`@HonFl1j1RH1Y$_GC?q&awRlA6k>Pp**bu;BvZp=KPyq0GM= z@+w!jGnDBw9U?)2je&qeG&mR>bch9PR}S&JD7Gphu50QhqU-07?{z3#z;Y;(1B)F> zg7prY7H^#si&mdTLsFKb!~`RvZj`IUC?TJ%!c8N^JSbY53~C3P>7paAgWcz`3eqy&vSF(JK6FI0w ziYSrMX%#m^(w`RBhlRUFlI-FUDX(2TvPoN|&BSMtWfJ;FpXY9|dnKkr+9qQyk~S;p z+F;X7N_#>^rTlMjm&4}lyB*3L$`?s*PnNGxDa?rD1JaUS$#hT(=#$1AlCt*R&YJI*Efbi%W0}DJv1=2V LBfFiF!$a49#d_TB diff --git a/build/classes/tutorial/clTexture/TextureMaker.class b/build/classes/tutorial/clTexture/TextureMaker.class index 909640ed501e7b3da4878ab3a72163bdee4767c2..4db345d77f6731ea08761c556c36544ecfc198b4 100644 GIT binary patch literal 10140 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 delta 3148 zcmZuz33yc175>k>nR#zsZXgp9k_ibUtRagb2mvQ7LfC{r1Og#!I)nftSy&RbR>wk% zC|!hCwN%@p#YS7HAY?L#rBGB_Y|&b)EwxlCRoZGT)s|MR_}@1O)vxn?bMCq4p6#CP zz6WYP8WB7B(UV6243lLh9yakk8;j6k;t?BObOf*vk81FJ4SrzaF%x@j*!ZD|$87|# zPt*5n@I(OVIH18n6P-5KxD5}wZ1h7yZx3ngNsS%W*i$xsgd=v0qCeL1M>Y2`1Gs&r z#(tt1k8AL>jc4$zi4!J%YNJ0owDiw3IBDWJ8-@6}jbGrD2G48ofn%ISqp!(@jA{~_>+yXcq0XG;=GAJ zTlkBKziQH37T&h;H@suv?-{cuQnmq^!Ly+Eg|rvUbJv$SQ@!xJjWA%M=>0)VV8AWdy`_UI_HgiAsvX&4?&0 z(O?bMDp6P~$Z?K&a%!nlQk8Vmpu40g2}-(>9vaKgSf=zeB}+-RgcLSnlfrVWP?96P zl;ldDlHQuDkEENDucScw3UZwtMy|8d&JIVVpOXGEK+w(gIkLX3tg5xCb&a+<(3C++ z3T3d8A}Ll;ign586hK;Tqj{Al`=}nXc=S5SS8nE zn9&%hLRr?TzhM>&0-A r$SKLqRaQgOq-aZY z?FvDE=U8Tz^JdTP&XnBp7z)_zi`XuHb~%epH;%3b*O5tj;aiX|| za3yyqIDXhqSY6Zwqv$Za^ffVy8yWU8%YU-Wcc^R?P zPIUW!hhEL$)4*@k7>3vA0$IE7cYSCg>VDFc~3CA*BYZFbB;%%};uT z7PN9l|8zIeXN~E5c@PsauTEY=>Uj;V^uD5lunr<^RB{cDK8*DG++JPiF~g|v=JrY; zgC}O#R~qugkr_u%7s-kvTN6TY(;iVAN_b~d^Gb7zXUgI$Ov-k#dVPM$Tfq^cU|5IGuKf@J@G0=m;R>(Sx!uk~cx-dA7 zqL5{{(s2}rtYX8EI7;etQcB~v<|xYI7!nSI0!I=kpHZ5?&^WHGD-8t5mv*+!=B^GxEcjBPB&2;GhnY{5``5hEG)@z{nLxRXKMPLVGY-i@8u zfrkk9!a*1AWz&5Fr?87J={Io}_u~zG%Psm%P?XKV=V-vof;VVHr-|Xd(g^3>)agbz zkA|4r2_7oAjRp-GY`ZMHoh6kN_VF2xG4Fo*{TiKJ%M9+sTzmnWNjbquvW2b(+zJ>0 z-z5?)RseI)5-|C^Luf4+th~e;{nUwx*jBRXV^+rj5dBrc-{V+%8w!7yA0MIq~Kxnz$3`Qqv(Uj zn8&>shJEb6{mkP*RHGBMNU#GBQOC2?a-1#nG)v$ahVR7H9?W7R--)|utb~obooV+_ z$q0M}U!|dH3}9#8O$VY3?hZ!ZM>UGY@O9U{&6ksV4;@paBqi^qr0&W9JQvYsVwyg> zkCl@g+*_!`r)NMx0yD;>*W@K|V|oo+DK~v)0<((kJVs`A*c file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Image.java + file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/ObjectModel.java file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Texture.java file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/TextureMaker.java file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/TextureDriver.java diff --git a/src/tutorial/clTexture/ObjectModel.java b/src/tutorial/clTexture/ObjectModel.java new file mode 100644 index 0000000..61d45ec --- /dev/null +++ b/src/tutorial/clTexture/ObjectModel.java @@ -0,0 +1,57 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package tutorial.clTexture; + +import java.nio.FloatBuffer; +import org.lwjgl.BufferUtils; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL15.*; + +/* + * @author labramson + */ +public class ObjectModel { + private int drawCount; + private int vertexId; + private int textureId; + + public ObjectModel(float[] vertices, float[] texCoords){ + drawCount = vertices.length/2; + vertexId = glGenBuffers(); + glBindBuffer(GL_ARRAY_BUFFER, vertexId); + glBufferData(GL_ARRAY_BUFFER, createFloatBuff(vertices), GL_STATIC_DRAW); + + textureId = glGenBuffers(); + glBindBuffer(GL_ARRAY_BUFFER, textureId); + glBufferData(GL_ARRAY_BUFFER, createFloatBuff(texCoords), GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + } + + public void renderVBO(){ + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + glBindBuffer(GL_ARRAY_BUFFER, vertexId); + glVertexPointer(2, GL_FLOAT, 0, 0); + + glBindBuffer(GL_ARRAY_BUFFER, textureId); + glTexCoordPointer(2, GL_FLOAT, 0, 0); + + glDrawArrays(GL_TRIANGLES, 0, drawCount); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + } + + private FloatBuffer createFloatBuff(float[] data){ + FloatBuffer vFloatBuff = BufferUtils.createFloatBuffer(data.length); + vFloatBuff.put(data); + vFloatBuff.flip(); + return vFloatBuff; + } +} diff --git a/src/tutorial/clTexture/TextureDriver.java b/src/tutorial/clTexture/TextureDriver.java index 6f0ecb0..4a0d63c 100644 --- a/src/tutorial/clTexture/TextureDriver.java +++ b/src/tutorial/clTexture/TextureDriver.java @@ -5,6 +5,7 @@ */ package tutorial.clTexture; +import java.nio.FloatBuffer; import static org.lwjgl.opengl.GL11.*; import org.lwjgl.opengl.*; import org.lwjgl.*; @@ -17,7 +18,7 @@ public class TextureDriver { //IMAGE FOR THE TEXTURE private static final String imgDir = "C:\\Users\\labramson\\Documents\\Tutorial\\res\\"; - public static String imgName = "smileTexture2.jpg"; + public static String imgName = "texture.png"; //CONSTRUCTOR public TextureDriver() {} @@ -31,20 +32,39 @@ public static void main(String... args) throws Exception { //OBJECT USED TO MAKE THE TEXTURE TextureMaker tex = new TextureMaker(img.getImg(), texture); - texture = tex.makeTexture(); - tex.makeCLTexture(); + texture = tex.setupTexture(); + tex.makeCLTexture(texture); + + float[] vertices = new float[]{ + -0.5f, 0.5f, + 0.5f, 0.5f, + 0.5f, -0.5f, + 0.5f, -0.5f, + -0.5f, -0.5f, + -0.5f, 0.5f, + }; + + float[] texCoords = new float[]{ + 0, 0, + 1, 0, + 1, 1, + 1, 1, + 0, 1, + 0, 0 + }; + + //ObjectModel objModel = new ObjectModel(vertices, texCoords); while (!Display.isCloseRequested()) { //CLEARS SCREEN EACH LOOP glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - //ENABLES GL_TEXTURE_2D + //ENABLES GL_TEXTURE_2D glEnable(GL_TEXTURE_2D); - //BIND THE TEXTURE texture.bind(); - glPixelStorei(GL_PACK_ALIGNMENT, 4); - + + //objModel.renderVBO(); //DRAW A SQUARE WITH MAPPED TEXTURE glBegin(GL_QUADS); glTexCoord2f(0, 0); @@ -59,7 +79,6 @@ public static void main(String... args) throws Exception { glTexCoord2f(1, 0); glVertex2i(200, 100); //bottom left glEnd(); - //IF ESC THEN CLOSE if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { Display.destroy(); @@ -92,4 +111,10 @@ public static void initGL() { glOrtho(0, 300, 300, 0, 1, -1); glMatrixMode(GL_MODELVIEW); } -} \ No newline at end of file + + static FloatBuffer toFloatBuffer(float[] floats) { + FloatBuffer buf = BufferUtils.createFloatBuffer(floats.length).put(floats); + buf.rewind(); + return buf; + } +} diff --git a/src/tutorial/clTexture/TextureMaker.java b/src/tutorial/clTexture/TextureMaker.java index e83c893..52e151a 100644 --- a/src/tutorial/clTexture/TextureMaker.java +++ b/src/tutorial/clTexture/TextureMaker.java @@ -18,22 +18,28 @@ import java.awt.image.WritableRaster; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.nio.FloatBuffer; import java.util.HashMap; import java.util.Hashtable; import java.util.List; +import org.lwjgl.BufferUtils; +import org.lwjgl.PointerBuffer; //GL imports import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; -import static org.lwjgl.opengl.GL11.GL_LINEAR; +import static org.lwjgl.opengl.GL11.GL_NEAREST; import static org.lwjgl.opengl.GL11.GL_RGB; import static org.lwjgl.opengl.GL11.GL_RGB8; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.GL_TEXTURE_MAG_FILTER; import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_S; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_T; import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE; import static org.lwjgl.opengl.GL11.glTexImage2D; import static org.lwjgl.opengl.GL11.glTexParameteri; +import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; import static org.lwjgl.opengl.GL15.GL_ARRAY_BUFFER; import static org.lwjgl.opengl.GL15.GL_DYNAMIC_DRAW; import org.lwjgl.opengl.Display; @@ -42,13 +48,28 @@ //CL imports import org.lwjgl.opencl.CL; import org.lwjgl.opencl.CL10; +import static org.lwjgl.opencl.CL10.CL_MEM_COPY_HOST_PTR; +import static org.lwjgl.opencl.CL10.CL_MEM_READ_ONLY; +import static org.lwjgl.opencl.CL10.CL_MEM_WRITE_ONLY; +import static org.lwjgl.opencl.CL10.clBuildProgram; +import static org.lwjgl.opencl.CL10.clCreateBuffer; +import static org.lwjgl.opencl.CL10.clCreateKernel; +import static org.lwjgl.opencl.CL10.clCreateProgramWithSource; +import static org.lwjgl.opencl.CL10.clEnqueueNDRangeKernel; +import static org.lwjgl.opencl.CL10.clEnqueueReadBuffer; +import static org.lwjgl.opencl.CL10.clEnqueueWriteBuffer; +import static org.lwjgl.opencl.CL10.clFinish; import org.lwjgl.opencl.CL10GL; +import org.lwjgl.opencl.CL12GL; import org.lwjgl.opencl.CLContext; import org.lwjgl.opencl.CLDevice; import org.lwjgl.opencl.CLPlatform; import org.lwjgl.opencl.CLCommandQueue; import org.lwjgl.opencl.CLMem; +import org.lwjgl.opencl.CLKernel; +import org.lwjgl.opencl.CLProgram; import org.lwjgl.opencl.Util; +import static tutorial.clTexture.TextureDriver.toFloatBuffer; /* * @author labramson @@ -66,6 +87,15 @@ public class TextureMaker { private BufferedImage image; private ByteBuffer textureBuff; + static final String source + = "kernel void sum(global const float *a, global const float *b, global float *answer)" + + "{ unsigned int xid = get_global_id(0); answer[xid] = a[xid] + b[xid];}"; + + //buffers for input and output + static final FloatBuffer a = toFloatBuffer(new float[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); + static final FloatBuffer b = toFloatBuffer(new float[]{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}); + static final FloatBuffer answer = BufferUtils.createFloatBuffer(a.capacity()); + public TextureMaker(BufferedImage image, Texture texture) { this.image = image; this.texture = texture; @@ -84,7 +114,7 @@ public TextureMaker(BufferedImage image, Texture texture) { DataBuffer.TYPE_BYTE); } - public Texture makeTexture() { + public Texture setupTexture() { int textureID = this.texture.textureID; int textureTarget = this.texture.target; Texture texture = new Texture(textureTarget, textureID); @@ -104,10 +134,12 @@ public Texture makeTexture() { ByteBuffer texBuff = imgToTexBuff(bufferedImage, texture); textureBuff = texBuff; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, bufferedImage.getWidth(), bufferedImage.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, texBuff); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, bufferedImage.getWidth(), bufferedImage.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, (ByteBuffer)texBuff); return texture; } @@ -157,7 +189,7 @@ private ByteBuffer imgToTexBuff(BufferedImage bufferedImage, Texture texture) { return imageBuffer; } - public void makeCLTexture() { + public void makeCLTexture(Texture texture) { try { // Initialize OpenCL and create a context and command queue CL.create(); @@ -183,15 +215,53 @@ public void makeCLTexture() { // Create an command queue using our OpenCL context and the first device in our list of devices CLCommandQueue queue = CL10.clCreateCommandQueue(context, devices.get(0), CL10.CL_QUEUE_PROFILING_ENABLE, null); System.out.println("Command Queue created"); + + CLMem mem = CL12GL.clCreateFromGLTexture(context, CL10.CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, texture.textureID, null); + GL11.glFinish(); - //CLMem clglMem = createSharedMem(context, texture); - //CLMem gltoCLTex = CL10GL.clCreateFromGLTexture(context, CL_MEM_READ_WRITE, GL_TEXTURE_BUFFER, 0,texture, errcode_ret); - - // use the shared memory in CL - //useSharedMem(clglMem, queue); - //System.out.println("Shared Mem used"); - + //BELOW IS CODE TO TRY TO WORK WITH A KERNEL; KERNEL WILL NEED TO STUFF WITH TEXTURE + //THIS CODE IS FROM MY HelloWorld.java + + //Allocates memory for input buffers + CLMem aMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, a, null); + clEnqueueWriteBuffer(queue, aMem, 1, 0, a, null, null); + + CLMem bMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, b, null); + clEnqueueWriteBuffer(queue, bMem, 1, 0, b, null, null); + + //Allocates memory four output buffer + CLMem answerMem = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_COPY_HOST_PTR, answer, null); + clFinish(queue); + + //Creates the program using context & source + CLProgram program = clCreateProgramWithSource(context, source, null); + //Checks if there was an error in creation + Util.checkCLError(clBuildProgram(program, devices.get(0), "", null)); + + //Creates the kernel; function name passed in must match kernel method in OCL source + //sum method is defined in String source used in creating the program + CLKernel kernel = clCreateKernel(program, "sum", null); + + //Execute the kernel + PointerBuffer kernel1DGlobalWorkSize = BufferUtils.createPointerBuffer(1); + kernel1DGlobalWorkSize.put(0, a.capacity()); + //Set arguments for the kernel; inputs & output + kernel.setArg(0, aMem); + kernel.setArg(1, bMem); + kernel.setArg(2, answerMem); + //Enqueue the kernel + clEnqueueNDRangeKernel(queue, kernel, 1, null, kernel1DGlobalWorkSize, null, null, null); + + //Read results from memory back into buffer + clEnqueueReadBuffer(queue, answerMem, 1, 0, answer, null, null); + clFinish(queue); + System.out.print(a); + System.out.println("+"); + System.out.print(b); + System.out.println("="); + System.out.print(answer); + } catch (Exception e) { e.printStackTrace(); System.out.println("*** Problem initializing OpenCL"); @@ -203,9 +273,9 @@ public CLMem createSharedMem(CLContext context, Texture texture) { int glBufId = GL15.glGenBuffers(); // Load the buffer with data using glBufferData(); // initialize buffer object - + GL15.glBindBuffer(GL_ARRAY_BUFFER, glBufId); - + //int size = (texture.getImageHeight() * texture.getImageWidth() * 4); GL15.glBufferData(GL_ARRAY_BUFFER, textureBuff, GL_DYNAMIC_DRAW); // Create the shared OpenCL memory object from the OpenGL buffer @@ -213,14 +283,16 @@ public CLMem createSharedMem(CLContext context, Texture texture) { return glMem; } - - public void useSharedMem(CLMem clmem, CLCommandQueue queue){ + + public void useSharedMem(CLMem clmem, CLCommandQueue queue) { System.out.println("Acquiring mem lock"); // Acquire the lock for the 'glMem' memory object int error = CL10GL.clEnqueueAcquireGLObjects(queue, clmem, null, null); // Remember to check for errors - if(error != CL10.CL_SUCCESS) { Util.checkCLError(error); } - + if (error != CL10.CL_SUCCESS) { + Util.checkCLError(error); + } + // Now execute an OpenCL command using the shared memory object, // such as uploading data to the memory object using 'CL10.clEnqueueWriteBuffer()' // or running a kernel using 'CL10.clEnqueueNDRangeKernel()' with the correct parameters @@ -228,7 +300,9 @@ public void useSharedMem(CLMem clmem, CLCommandQueue queue){ System.out.println("Doing Stuff"); // Release the lock on the 'glMem' memory object error = CL10GL.clEnqueueReleaseGLObjects(queue, clmem, null, null); - if(error != CL10.CL_SUCCESS) { Util.checkCLError(error); } + if (error != CL10.CL_SUCCESS) { + Util.checkCLError(error); + } // Remember to flush the command queue when you are done. // Flushing the queue ensures that all of the OpenCL commands @@ -237,12 +311,12 @@ public void useSharedMem(CLMem clmem, CLCommandQueue queue){ deleteSharedMem(clmem); //System.out.println("Finished using CL & released shared mem"); } - - public void deleteSharedMem(CLMem clmem){ + + public void deleteSharedMem(CLMem clmem) { // Delete/release an OpenCL shared memory object CL10.clReleaseMemObject(clmem); } - - public void textureViaGLTex(){ + + public void textureViaGLTex() { } } From 59c6938bfe057031fc06b1f660044796280ac7df Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Fri, 14 Jul 2017 11:00:22 -0400 Subject: [PATCH 02/17] Re-organized & commented code --- .../classes/tutorial/clTexture/Texture.class | Bin 1649 -> 1651 bytes .../tutorial/clTexture/TextureDriver.class | Bin 3355 -> 3361 bytes .../tutorial/clTexture/TextureMaker.class | Bin 10140 -> 9655 bytes src/tutorial/clTexture/SharingMemCode.txt | 42 ++++ src/tutorial/clTexture/Texture.java | 4 +- src/tutorial/clTexture/TextureDriver.java | 8 +- src/tutorial/clTexture/TextureMaker.java | 217 ++++++++++-------- 7 files changed, 166 insertions(+), 105 deletions(-) create mode 100644 src/tutorial/clTexture/SharingMemCode.txt diff --git a/build/classes/tutorial/clTexture/Texture.class b/build/classes/tutorial/clTexture/Texture.class index 6c5b5927aaa191f7d73ae45474cf0034d14dfe2b..7f88e7e42f1e353ffb98e6e84e2b399c5e3251dc 100644 GIT binary patch delta 155 zcmey!^O3i e*_OAJfqU|0R$pN*s5pBYP@D@S&NJDV%?<$Vbse$* delta 131 zcmey&^O0x6KSm)j25}w+2@oN|Ai%>Q${?^=fT@XTvIGkcBj@A=EHb>T3~~(e3=9m6 z3|b7DlLc9X8M!9kW07HGo&1|cfsuQ%3~MkW&*TEuAYtyA3_@C3TNqf|fCP72-c|>zO-kT}<5Q#LyQgc=*o diff --git a/build/classes/tutorial/clTexture/TextureDriver.class b/build/classes/tutorial/clTexture/TextureDriver.class index 02d79acf663727e06da56ac3b564d865245776f0..7a795cf1ba28e5dd3d757b3e24d471de1ce7e4bb 100644 GIT binary patch delta 190 zcmbO&wNPq9I;)^yac*W#YDj8DNoi54kzQ88<|5WS)=&$EOAJ;FHyCUf?lIUgJYukC zc*)?z@Q%Tm;WL8^!!HImhW`xijO+}aj64ipjG_!aj8Y7~j7kiCjH(QQj5-WKjQR}0 zjK&P%jAjfGjCKq$jE)SklTEpg$R;ufFeEXEG9)udFr+a^Go&!cFr+dlFr+gmGh|E_ q<4G3GW?*B;Vc=xQ1**tnkYmW7+{I(YS;WA_P|U#3P%`->PY?i5bSU-! delta 184 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 diff --git a/src/tutorial/clTexture/SharingMemCode.txt b/src/tutorial/clTexture/SharingMemCode.txt new file mode 100644 index 0000000..277fdf1 --- /dev/null +++ b/src/tutorial/clTexture/SharingMemCode.txt @@ -0,0 +1,42 @@ +// public CLMem createSharedMem(CLContext context, Texture texture) { +// // Create an OpenGL buffer +// int glBufId = GL15.glGenBuffers(); +// // Load the buffer with data using glBufferData(); +// // initialize buffer object +// +// GL15.glBindBuffer(GL_ARRAY_BUFFER, glBufId); +// +// //int size = (texture.getImageHeight() * texture.getImageWidth() * 4); +// GL15.glBufferData(GL_ARRAY_BUFFER, textureBuff, GL_DYNAMIC_DRAW); +// // Create the shared OpenCL memory object from the OpenGL buffer +// CLMem glMem = CL10GL.clCreateFromGLBuffer(context, CL10.CL_MEM_READ_WRITE, glBufId, null); +// +// return glMem; +// } +// +// public void useSharedMem(CLMem clmem, CLCommandQueue queue) { +// System.out.println("Acquiring mem lock"); +// // Acquire the lock for the 'glMem' memory object +// int error = CL10GL.clEnqueueAcquireGLObjects(queue, clmem, null, null); +// // Remember to check for errors +// if (error != CL10.CL_SUCCESS) { +// Util.checkCLError(error); +// } +// +// // Now execute an OpenCL command using the shared memory object, +// // such as uploading data to the memory object using 'CL10.clEnqueueWriteBuffer()' +// // or running a kernel using 'CL10.clEnqueueNDRangeKernel()' with the correct parameters +// // ... +// System.out.println("Doing Stuff"); +// // Release the lock on the 'glMem' memory object +// error = CL10GL.clEnqueueReleaseGLObjects(queue, clmem, null, null); +// if (error != CL10.CL_SUCCESS) { +// Util.checkCLError(error); +// } +// +// // Remember to flush the command queue when you are done. +// // Flushing the queue ensures that all of the OpenCL commands +// // sent to the queue have completed before the program continues. +// CL10.clFinish(queue); +// //System.out.println("Finished using CL & released shared mem"); +// } \ No newline at end of file diff --git a/src/tutorial/clTexture/Texture.java b/src/tutorial/clTexture/Texture.java index c7736c6..e7f2eba 100644 --- a/src/tutorial/clTexture/Texture.java +++ b/src/tutorial/clTexture/Texture.java @@ -40,11 +40,11 @@ public int getImageHeight() { } public float getWidth() { - return widthRatio; + return width; } public float getHeight() { - return heightRatio; + return height; } public void setTextureWidth(int texWidth) { diff --git a/src/tutorial/clTexture/TextureDriver.java b/src/tutorial/clTexture/TextureDriver.java index 4a0d63c..143b8c8 100644 --- a/src/tutorial/clTexture/TextureDriver.java +++ b/src/tutorial/clTexture/TextureDriver.java @@ -18,7 +18,7 @@ public class TextureDriver { //IMAGE FOR THE TEXTURE private static final String imgDir = "C:\\Users\\labramson\\Documents\\Tutorial\\res\\"; - public static String imgName = "texture.png"; + public static String imgName = "smileTexture2.jpg"; //CONSTRUCTOR public TextureDriver() {} @@ -30,7 +30,7 @@ public static void main(String... args) throws Exception { Image img = new Image(imgDir + "" + imgName); Texture texture = new Texture(GL_TEXTURE_2D, GL11.glGenTextures()); - //OBJECT USED TO MAKE THE TEXTURE + //OBJECT USED TO MAKE THE TEXTURE; GETS THE IMAGE AND INIT TEXTURE TextureMaker tex = new TextureMaker(img.getImg(), texture); texture = tex.setupTexture(); tex.makeCLTexture(texture); @@ -53,8 +53,6 @@ public static void main(String... args) throws Exception { 0, 0 }; - //ObjectModel objModel = new ObjectModel(vertices, texCoords); - while (!Display.isCloseRequested()) { //CLEARS SCREEN EACH LOOP glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -64,7 +62,6 @@ public static void main(String... args) throws Exception { texture.bind(); glPixelStorei(GL_PACK_ALIGNMENT, 4); - //objModel.renderVBO(); //DRAW A SQUARE WITH MAPPED TEXTURE glBegin(GL_QUADS); glTexCoord2f(0, 0); @@ -79,6 +76,7 @@ public static void main(String... args) throws Exception { glTexCoord2f(1, 0); glVertex2i(200, 100); //bottom left glEnd(); + //IF ESC THEN CLOSE if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { Display.destroy(); diff --git a/src/tutorial/clTexture/TextureMaker.java b/src/tutorial/clTexture/TextureMaker.java index 52e151a..3d0b362 100644 --- a/src/tutorial/clTexture/TextureMaker.java +++ b/src/tutorial/clTexture/TextureMaker.java @@ -90,6 +90,24 @@ public class TextureMaker { static final String source = "kernel void sum(global const float *a, global const float *b, global float *answer)" + "{ unsigned int xid = get_global_id(0); answer[xid] = a[xid] + b[xid];}"; + static final String code = "kernel void readImg (BufferedImage img)" + + "{ for (int x = 0; x < image.getWidth(); x++) {\n" + + " for (int y = 0; y < image.getHeight(); y++) {\n" + + " final int clr = image.getRGB(x, y);\n" + + " final int red = (clr & 0x00ff0000) >> 16;\n" + + " final int green = (clr & 0x0000ff00) >> 8;\n" + + " final int blue = clr & 0x000000ff;\n" + + "\n" + + " // Color Red get cordinates\n" + + " if (red == 255) {\n" + + " System.out.println(String.format(\"Coordinate %d %d\", x, y));\n" + + " } else {\n" + + " System.out.println(\"Red Color value = \" + red);\n" + + " System.out.println(\"Green Color value = \" + green);\n" + + " System.out.println(\"Blue Color value = \" + blue);\n" + + " }\n" + + " }\n" + + " }}"; //buffers for input and output static final FloatBuffer a = toFloatBuffer(new float[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); @@ -114,32 +132,37 @@ public TextureMaker(BufferedImage image, Texture texture) { DataBuffer.TYPE_BYTE); } + /*BINDS THE IMAGE TO THE TEXTURE + RETURNS THE TEXTURE + */ public Texture setupTexture() { - int textureID = this.texture.textureID; - int textureTarget = this.texture.target; - Texture texture = new Texture(textureTarget, textureID); int srcPixelFormat = 0; + // bind this texture - GL11.glBindTexture(textureTarget, textureID); - + GL11.glBindTexture(this.texture.target, this.texture.textureID); + + //GETS THE IMAGE & SETS WIDTH/HEIGHT OF IMAGE TO THAT OF TEXTURE BufferedImage bufferedImage = this.image; - texture.setWidth(bufferedImage.getWidth()); - texture.setHeight(bufferedImage.getHeight()); + this.texture.setWidth(bufferedImage.getWidth()); + this.texture.setHeight(bufferedImage.getHeight()); + //GETS COLOR MODEL OF THE IMAGE if (bufferedImage.getColorModel().hasAlpha()) { srcPixelFormat = GL11.GL_RGBA; } else { srcPixelFormat = GL11.GL_RGB; } + //CONVERTES THE BufferedImage TO a ByteBuffer for the texture ByteBuffer texBuff = imgToTexBuff(bufferedImage, texture); textureBuff = texBuff; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, bufferedImage.getWidth(), bufferedImage.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, (ByteBuffer)texBuff); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, bufferedImage.getWidth()+1, bufferedImage.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, (ByteBuffer) texBuff); return texture; } @@ -149,36 +172,25 @@ private ByteBuffer imgToTexBuff(BufferedImage bufferedImage, Texture texture) { WritableRaster raster; BufferedImage texImage; - int texWidth = 2; - int texHeight = 2; - - // find the closest power of 2 for the width and height of the produced texture - while (texWidth < bufferedImage.getWidth()) { - texWidth *= 2; - } - while (texHeight < bufferedImage.getHeight()) { - texHeight *= 2; - } - - texture.setTextureHeight(texHeight); - texture.setTextureWidth(texWidth); + texture.setTextureHeight(bufferedImage.getHeight()); + texture.setTextureWidth(bufferedImage.getWidth()); // create a raster that can be used by OpenGL as a source for a texture if (bufferedImage.getColorModel().hasAlpha()) { - raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, texWidth, texHeight, 4, null); + raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, bufferedImage.getWidth()+1, bufferedImage.getHeight(), 4, null); texImage = new BufferedImage(glAlphaColorModel, raster, false, new Hashtable()); } else { - raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, texWidth, texHeight, 3, null); + raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, bufferedImage.getWidth()+1, bufferedImage.getHeight(), 3, null); texImage = new BufferedImage(glColorModel, raster, false, new Hashtable()); } // copy the source image into the produced image Graphics g = texImage.getGraphics(); g.setColor(new Color(0f, 0f, 0f, 0f)); - g.fillRect(0, 0, texWidth, texHeight); + g.fillRect(0, 0, bufferedImage.getWidth()+1, bufferedImage.getHeight()); g.drawImage(bufferedImage, 0, 0, null); - // build a byte buffer from the temporary image used by OpenGL to produce a texture + // build a byte buffer from the temporary image to produce a texture byte[] data = ((DataBufferByte) texImage.getRaster().getDataBuffer()).getData(); imageBuffer = ByteBuffer.allocateDirect(data.length); @@ -191,10 +203,27 @@ private ByteBuffer imgToTexBuff(BufferedImage bufferedImage, Texture texture) { public void makeCLTexture(Texture texture) { try { + CLContext context = createCLContext(); + + // Create an command queue using our OpenCL context and the first device in our list of devices + CLCommandQueue queue = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(0), CL10.CL_QUEUE_PROFILING_ENABLE, null); + System.out.println("Command Queue created"); + + CLMem mem = CL12GL.clCreateFromGLTexture(context, CL10.CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, texture.textureID, null); + GL11.glFinish(); + + kernelFunction(context, queue); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("*** Problem initializing OpenCL"); + } + } + + private CLContext createCLContext(){ + try { // Initialize OpenCL and create a context and command queue CL.create(); - System.out.println("\n****************"); - System.out.println("CL created"); + System.out.println("\nCL created"); // Drawable context that OpenCL needs Drawable drawable = Display.getDrawable(); @@ -212,16 +241,20 @@ public void makeCLTexture(Texture texture) { CLContext context = CLContext.create(platform, devices, null, drawable, null); System.out.println("Context created"); - // Create an command queue using our OpenCL context and the first device in our list of devices - CLCommandQueue queue = CL10.clCreateCommandQueue(context, devices.get(0), CL10.CL_QUEUE_PROFILING_ENABLE, null); - System.out.println("Command Queue created"); + return context; - CLMem mem = CL12GL.clCreateFromGLTexture(context, CL10.CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, texture.textureID, null); - GL11.glFinish(); + } catch (Exception e) { + e.printStackTrace(); + System.out.println("*** Problem initializing OpenCL"); + return null; + } + } + + private void kernelFunction(CLContext context, CLCommandQueue queue){ + //BELOW IS CODE TO TRY TO WORK WITH A KERNEL; KERNEL WILL NEED TO STUFF WITH TEXTURE + //THIS CODE IS FROM MY HelloWorld.java; + //needs to be passed the texture - //BELOW IS CODE TO TRY TO WORK WITH A KERNEL; KERNEL WILL NEED TO STUFF WITH TEXTURE - //THIS CODE IS FROM MY HelloWorld.java - //Allocates memory for input buffers CLMem aMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, a, null); clEnqueueWriteBuffer(queue, aMem, 1, 0, a, null, null); @@ -236,7 +269,7 @@ public void makeCLTexture(Texture texture) { //Creates the program using context & source CLProgram program = clCreateProgramWithSource(context, source, null); //Checks if there was an error in creation - Util.checkCLError(clBuildProgram(program, devices.get(0), "", null)); + Util.checkCLError(clBuildProgram(program, context.getInfoDevices().get(0), "", null)); //Creates the kernel; function name passed in must match kernel method in OCL source //sum method is defined in String source used in creating the program @@ -255,68 +288,56 @@ public void makeCLTexture(Texture texture) { //Read results from memory back into buffer clEnqueueReadBuffer(queue, answerMem, 1, 0, answer, null, null); clFinish(queue); - - System.out.print(a); - System.out.println("+"); - System.out.print(b); - System.out.println("="); - System.out.print(answer); - - } catch (Exception e) { - e.printStackTrace(); - System.out.println("*** Problem initializing OpenCL"); - } - } - - public CLMem createSharedMem(CLContext context, Texture texture) { - // Create an OpenGL buffer - int glBufId = GL15.glGenBuffers(); - // Load the buffer with data using glBufferData(); - // initialize buffer object - GL15.glBindBuffer(GL_ARRAY_BUFFER, glBufId); - - //int size = (texture.getImageHeight() * texture.getImageWidth() * 4); - GL15.glBufferData(GL_ARRAY_BUFFER, textureBuff, GL_DYNAMIC_DRAW); - // Create the shared OpenCL memory object from the OpenGL buffer - CLMem glMem = CL10GL.clCreateFromGLBuffer(context, CL10.CL_MEM_READ_WRITE, glBufId, null); - - return glMem; - } - - public void useSharedMem(CLMem clmem, CLCommandQueue queue) { - System.out.println("Acquiring mem lock"); - // Acquire the lock for the 'glMem' memory object - int error = CL10GL.clEnqueueAcquireGLObjects(queue, clmem, null, null); - // Remember to check for errors - if (error != CL10.CL_SUCCESS) { - Util.checkCLError(error); - } - - // Now execute an OpenCL command using the shared memory object, - // such as uploading data to the memory object using 'CL10.clEnqueueWriteBuffer()' - // or running a kernel using 'CL10.clEnqueueNDRangeKernel()' with the correct parameters - // ... - System.out.println("Doing Stuff"); - // Release the lock on the 'glMem' memory object - error = CL10GL.clEnqueueReleaseGLObjects(queue, clmem, null, null); - if (error != CL10.CL_SUCCESS) { - Util.checkCLError(error); - } - - // Remember to flush the command queue when you are done. - // Flushing the queue ensures that all of the OpenCL commands - // sent to the queue have completed before the program continues. - CL10.clFinish(queue); - deleteSharedMem(clmem); - //System.out.println("Finished using CL & released shared mem"); - } - - public void deleteSharedMem(CLMem clmem) { - // Delete/release an OpenCL shared memory object - CL10.clReleaseMemObject(clmem); - } +// System.out.print(a); +// System.out.println("+"); +// System.out.print(b); +// System.out.println("="); +// System.out.print(answer); - public void textureViaGLTex() { + //END OF KERNEL WORK; PRINTS OUT ANSWER FROM FLOAT BUFFER WITH ANSWER } -} + +// public CLMem createSharedMem(CLContext context, Texture texture) { +// // Create an OpenGL buffer +// int glBufId = GL15.glGenBuffers(); +// // Load the buffer with data using glBufferData(); +// // initialize buffer object +// +// GL15.glBindBuffer(GL_ARRAY_BUFFER, glBufId); +// +// //int size = (texture.getImageHeight() * texture.getImageWidth() * 4); +// GL15.glBufferData(GL_ARRAY_BUFFER, textureBuff, GL_DYNAMIC_DRAW); +// // Create the shared OpenCL memory object from the OpenGL buffer +// CLMem glMem = CL10GL.clCreateFromGLBuffer(context, CL10.CL_MEM_READ_WRITE, glBufId, null); +// +// return glMem; +// } +// +// public void useSharedMem(CLMem clmem, CLCommandQueue queue) { +// System.out.println("Acquiring mem lock"); +// // Acquire the lock for the 'glMem' memory object +// int error = CL10GL.clEnqueueAcquireGLObjects(queue, clmem, null, null); +// // Remember to check for errors +// if (error != CL10.CL_SUCCESS) { +// Util.checkCLError(error); +// } +// +// // Now execute an OpenCL command using the shared memory object, +// // such as uploading data to the memory object using 'CL10.clEnqueueWriteBuffer()' +// // or running a kernel using 'CL10.clEnqueueNDRangeKernel()' with the correct parameters +// // ... +// System.out.println("Doing Stuff"); +// // Release the lock on the 'glMem' memory object +// error = CL10GL.clEnqueueReleaseGLObjects(queue, clmem, null, null); +// if (error != CL10.CL_SUCCESS) { +// Util.checkCLError(error); +// } +// +// // Remember to flush the command queue when you are done. +// // Flushing the queue ensures that all of the OpenCL commands +// // sent to the queue have completed before the program continues. +// CL10.clFinish(queue); +// //System.out.println("Finished using CL & released shared mem"); +// } +} \ No newline at end of file From 3593792d8af590baf2875815313cf925008e7379 Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Mon, 17 Jul 2017 09:34:12 -0400 Subject: [PATCH 03/17] Refactored structure --- build/classes/tutorial/clTexture/Image.class | Bin 2422 -> 3402 bytes build/classes/tutorial/clTexture/Main.class | Bin 0 -> 2821 bytes .../tutorial/clTexture/ObjectModel.class | Bin 1475 -> 0 bytes .../tutorial/clTexture/SharingMemCode.txt | 42 ++++ .../classes/tutorial/clTexture/Texture.class | Bin 1651 -> 6845 bytes .../tutorial/clTexture/TextureDriver.class | Bin 3361 -> 0 bytes .../tutorial/clTexture/TextureMaker.class | Bin 9655 -> 8837 bytes nbproject/private/private.xml | 5 +- src/tutorial/clTexture/Image.java | 114 +++++---- .../{TextureDriver.java => Main.java} | 33 +-- src/tutorial/clTexture/ObjectModel.java | 57 ----- src/tutorial/clTexture/Texture.java | 233 ++++++++++++++---- src/tutorial/clTexture/TextureMaker.java | 8 +- 13 files changed, 309 insertions(+), 183 deletions(-) create mode 100644 build/classes/tutorial/clTexture/Main.class delete mode 100644 build/classes/tutorial/clTexture/ObjectModel.class create mode 100644 build/classes/tutorial/clTexture/SharingMemCode.txt delete mode 100644 build/classes/tutorial/clTexture/TextureDriver.class rename src/tutorial/clTexture/{TextureDriver.java => Main.java} (78%) delete mode 100644 src/tutorial/clTexture/ObjectModel.java diff --git a/build/classes/tutorial/clTexture/Image.class b/build/classes/tutorial/clTexture/Image.class index 08fed336bc0ac1b6d56168da1317bd1c98d10594..e6b6226d3bcee89c14aa2b3e8f39fc238aae8c4d 100644 GIT binary patch literal 3402 zcmai0`Ewi99sfM7q_sC|J4YScA$L-cEyN)OJ0wx@0kMg(4QQfQ$qX$!R6SK9=L?5R5pzcJJP(&4Y@U%~KsZ&#Zq_t^KJZ~yfr zfSd7!fj*oukinP|b8t9gmy6})(JRKzi+u<8nz@l8v%VkN@E*KcW!#W-@ zun&(Kcnpsl_yv9`cTdRWS8{n$$5T3<7Koj9vVKlLqy^$R+nLMx0-7^FC$MwqoV94B ztn+@#nYZTb)WE{*tnJy^w0!Fq*fi(f;TCh&V8JbT!-cHv3S84HR3lQtoO5gMG zJN_|&&O{*QTKT!unD06Hx&GcW0?|Qg73dgp^7hEW{EY35TQe?CHV+jtmV3tX9Qhs| zM*W;q64*B6FZcyg+*HOLx0n0{&rVf*)*0FfCs3int2Zefw0#+-Vi!2Ho?p!oHp3$5 zUuRuBcP?e@qVE*)1fW$R892~3=3AKuhpl4hz9DU2u%$YIu0(I3BJUJZ0~dUCY4i@H%g}j~j>uap1%9N31no_i}qLr~tJcs86 zY78njspE_^NU3z<1rs;okcpdch)Gepm=Ni2I$vDyS*x}+FBuQ(c+teK@e(0aY^t!T zxi|3}8PLmkMaOSV{0^_`c+JG`@dttJRTl#f8VahSZozll)G4c!Qz@1f|7hZMToh=p zimTWp=}$WTY~n9?!^E3-%fw&tHxqB;9TV^3J%JrniRO@HrI~miAL#hd#7Fp8$0sH} z#otZ*1OGH}371WLhR+4MuhwJ&8*A~8&YZI|oG8r}8%vcFCn4K?gRGo<$+z+u_R!8m zI_v>iKh4==QSJ}Bb6xUudTJ`2mRdWdJ4?X~WA0RurAJxQOkGysaHvI+YANlnGrdk$ zXuYGzF~tI45085+CxJG)uTl`s!X0btzec8p=E|!P*7=nc&*iqMfZ!4kyz5)!O;)0{vYZS7R#Z)>s{^LFhHd`fKU}Qj_#lKyNHoHOggf zD+7hm)I(D_rfofOf%7Xk zz)f{x>ZrdSp&%r6J~~sfy+sb(UScn&TLslU^_~X;O&A1)P#Ytx{)Eu34ouW)$J%hSc^kWZiM18zh#drzg zpyzJ09P@le|#7hh-PTDsCsy`^B^CAvuA;!_O!6vSY6>J?| zMb{(`+74)|=$>3g&oZ`+e1Oy%_IN#edjtEyGOjri?TM~p`{V}xma(IZojp-)jgm5U z^+ct8O%rA8o}lEOGWLFjeP!%F66=Y5xq=@K^{wFAGOnBG>xpSRDkCw`S4Qtd-z7#B zV0et!00YEz5c?VVQJlaSP9lf9kjD@n$1p$JBmA7+gUh6>U>slJUi=ql@ITzAus+Ru z{(dI?PRd4zu15JAR3g6#v0lM8oI;woj`4OL@a1qWV@@Y;j`-s WpQht$g*Ay|z2)q>!sCkT-tPb%-c2b0 literal 2422 zcmah~-&0dZ7(JU`H@RFDkpO~PYOM_+n2JgftX5DYEkP;>wY1hta!D?RBn>x$olc*e z+Lv~wGkt06Lx-2nboxL$1)SFDAJ9L^>1faHz2S$FDa_sdcK7@Ce0#pLn}44D`8R;G zSk`eES0fm~wJ=6?r0}keHoPaBF&%?QM`(>p>$2Sd=+RjBf#9WVpSw%qW?|Z_*mCSm2AsUTB+x$QRGku63du}i z%35)%6)RcGNwXJoBeuJRN`EJ$fS=2Rm5B=&Im=OTZb0u|N&X)Pg2{TvS4dY^GFI8K zOGO?(qG)qB-#6))nY(GT?44zQrec|-%A-r*oQGbI?yfo<2g~+~RbUD4^IIY3YD}7Z zvndVz8s;=)1j0P)j9YAftc&H2aAMS}xU}7(3AD!QA%zrOq_4B)QZH8leX>-oWGwgW zx+3|MEQf(tk=0-smWtV1K!8k3h~$8MAN zmmF)63#BUe^mNDbPVh!~XQl33tliTBT3I?3ij0$}EAFMHm#R+cIeh zg;gQTu~a=h`dMG;FjUVWFki6Cq@yNR#lCv71}TU(KDIyrO;TaBnxwwi`=rEFPnEIP zAf$ZQzQ)myTo1566W@gR9lj?21_JT!4FuEi#3n-H@x%tSb%bRfS%)4^tfL{`vkv1o zhWT)U?MXz~9_B{vFbFE4+X&l9;26c-L#vmduhT2;!ZGFzjtESTE+*5&^*H@~jO;)+ zBmA7@-SHCrnqxoxkIE$XG0DHM|5o=V4m?IbC|>>yYzoo0f%(5>`7g(SxW+Dh>#-c%``=4=RJTI23Md86Ib#FyM%{@pB=>WFTUMC%Zwa`cMZ3e9t6eD&!0R9u>GZH1FbVXyZHHmRj=_gLJK@` z7^lfkFVA@v{piCLyoCu`w{e~?$pAj*ukKfz`-W@Z;S#>bJKW_m9$^SSVOVi_gS*@& zlV{0p2-o<3j#iM7w;0vI!Z+g~_vj~k{m95yk5ziKgY(rb&R11M1hbOz3O>W2hVvQ* z#J^||PciZo!RHM0X=u|3AY@I1d|*AfB-snb2IGGq{3{JtsVpDuQI)RYI(U#mzR8@C qmttqI{$lXhp23&M$IHRS+6%}Ndj?-7i7y8?ycj&SXYjCsxbh!>iTr{9 diff --git a/build/classes/tutorial/clTexture/Main.class b/build/classes/tutorial/clTexture/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..2df373ede6eaea8a8458263d5515066fc516f59c GIT binary patch literal 2821 zcmZ`*`F9)D75<(rYvl2Gk>kY1O|uXnvK0 zz69_+e4*hUozH0% zI0;*L3ql?go+GQ05LbvNq%7o=24BZ_P?1A{jw(*e>Wq*@4NE$<;vw1mG=-nZ^XEc- zq2a8K?f9jrcv#3I$vgb783&O3>R-_l!hTf8V|ZN0ukdRjze(W<4Zl@L+NI*K?JIQV z7R=LT)-l~;b|Ua?x41{4b;xrof$0WQrc<>PG)f;bOI#)Q+O8ekuF#n2n^H&&c?ELY zbGB<8s+Q&~f6|W}Pz&MJJm(eqc0r`2^J^MSL_zy@5C4 zcxJG#IzMj_|K7~ZNM9{h*Y>h&-pQ$X5oNp$Gb0Rdt~yU>t|gq>n|I>m=o4Pm&s!t5 zq@r1%y+yLDuzuA=uWY&WbTqefr-2_~w}FE~4q>-KPn`rs2r6`6SuXpkwo{Nuy6YSg z(+d4VyJwG8EWa}Am~*~as(9|~u$QlvEH|jkPR7MB>syss15e>;13$zr1HZ#F;@PtV zsgCM6RR*5J??vnn2L6cM8vbP9dHmVH3pi)sMIkRqTrcAl1Fy>VHN0-%4cWdK#kvZK z?Ut)S_Mo*i=b3)Nz*~6Rz&oP!T?6Ok?0cf>FF42YSv?jb85hGiJ3{=S{=edV1tWHJ z%dl1Q419oR4SaZo;cu6Vfse$@$71jkSzW-V8a^}dIsT?$*}w{p7zpuqg>^yxOQx=*q;!`|Sa; zzMe+Ti`JquYPqq$tZPn@F@?>Udc9a{*|9Nc`tA^;`>k25(n}9Is*> zwN6#7N?&9_PiH z98E0I%@Sp-MVqNgR?7u5VB01tOKx7FtzumoGg4U!TQh6s%+;m0M;uD=(4-wm_b2nd z73pg)bGQf5RGak8JYO-Iag!r|v8K4K=;S=JFjin!+5w$p+=u<(q{mn?!_iN4uNfh= z8FnnN9i}o}Gqh%aandvHYmKX}s3xzNdCV4DkY4-NnJ6dgF4dO^*6i)!jhNy+4K$z^ z-^VUqb3cf7&1ja%A$K5ooN1(cxXbdX_-yK5LBoYebZ;yK^x(%_8#Mvkj-PP%1n$6{ zRL{ez$UDA~ybnS&hDcmQ)AU6or&pkLHZMc}6fLC7Fjml-yNI^wfpqIXL$t4;V|>Rl z(jhuugqOaP{kkrC(?#z3bZe6qVnYW>cS}o%o{mCCA;fhpMzl`j8*U8Qa2fAJjLS$a zL~kO*#&gg^e3x!*3bDCkZ-_1D|Mwg@5@RDIMwg!!;C~}F5|qu@hAkK*-Gv+ZemnM| z4|ibzIqbj$fw~8`;$G}T0k^>>$fqcIn(&?_oR1OEr-;cjMCp0rbdD&!f?>Rl{Tz&A zcpnEMEVtC~qV6Hu-bOTsDWPchA&g*@xZXv6I~xCkT^gD+wEbH?oW{sZQ0xG+$g7Ae z$=%tA2i$NGTc^`%2me-ZeTZ$HH-xw`#7*asI@rIA3=y~xC9#L$ZjZyio|OXLX&pF> z^*F+0Pw?&C1mh@yn51*ZE~kGZE#)vyd2vtUovUGcg3j5ZQD$^V}!!s|fxLEFKV4en3*u3EH2*Cd|^S!}O*W;Wz7bndw{r^k;@xuhZxLJ%IS1?f&sDj8PX+xH*qh&Wan+4 Sp=H%AX%7$(g(*H8aQy$vu%TQ4 literal 0 HcmV?d00001 diff --git a/build/classes/tutorial/clTexture/ObjectModel.class b/build/classes/tutorial/clTexture/ObjectModel.class deleted file mode 100644 index a60563b06a9ffc53901fb8d30cc71fe9280096fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1475 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 N_oIocAJV#g_&?K;CX4_8 literal 1651 zcmaJ>>rN9<5T4WfF58P$s9Y5AMk&gIfO1t7Qf*Q-0fO=8wrtwPr6px6J^}CGI~Wra zh{hj2fDdK-=IkjYW%19dYX)R9A1jRh7RkJ-oq9jQ3?9X1iWtTP)sM}7hjzIL-+4Jgx5(vKc zP0o9*!nzD^S)S7bNKsIqU#L8>Rj1*2XcWztN|U>SA{)&;TTr^}H0-zSgNohSu_`V+ z*>baLxw}@&;kR-|yt;EFXr%15y(S{AS#@`OlBUutz^pipJwf3-H%J`Wp5htF%a$5E z9lA*jTRO06wn{+_22XXoowNiT-3&~n!O;n(fv1|QoJ`l#NlI>eR`uf>>rhRiZ#Ubm zs$Fz=RzsCf?^~ZNg9d5bpfqI+x<;8eJvV5bh77vSo;w`NvUQKG8*KHn7@(X%Hz_A* z=<4MN%5V$QwHh_^U1i^{;-dY{R?T#e_iL`%JhU57ugbHtf|51&B^If;(Kx=76uz_s z;arq~C77SoAS5*?N)1|4gBf&)$w>`<&;}|8X$W!{uMdcaq0@yQBnrc46e^6IQTV$o z7=g@Egu{>-($F#m&nF4M zW}+AKHZVtlId%mmAAm9M(*sCet0~_Eil-F)3P*@|nK8Htjk`le&xf1{EROdUPXrd{ zX;O8bQJrJl`Q%$q>!}OXvGdl2!0Py=YBR8UDtMDx&~@gp$$4yYK_Xqg4u875$%nz1 zdeC(ifw=_Ch|GV@bl9%| diff --git a/build/classes/tutorial/clTexture/TextureDriver.class b/build/classes/tutorial/clTexture/TextureDriver.class deleted file mode 100644 index 7a795cf1ba28e5dd3d757b3e24d471de1ce7e4bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3361 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 diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index da79a1f..67ba32c 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -3,10 +3,9 @@ - file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Image.java - file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/ObjectModel.java - file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Texture.java file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/TextureMaker.java + file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Texture.java + file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/CLTextureMaker.java file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/TextureDriver.java diff --git a/src/tutorial/clTexture/Image.java b/src/tutorial/clTexture/Image.java index 043cc9d..e0a946e 100644 --- a/src/tutorial/clTexture/Image.java +++ b/src/tutorial/clTexture/Image.java @@ -1,39 +1,53 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ package tutorial.clTexture; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.color.ColorSpace; import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.ComponentColorModel; +import java.awt.image.DataBuffer; +import java.awt.image.DataBufferByte; +import java.awt.image.Raster; +import java.awt.image.WritableRaster; import java.io.FileInputStream; import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Hashtable; import javax.imageio.ImageIO; -import org.lwjgl.BufferUtils; - /* - * @author labramson + * @author LAA */ public class Image { + private final int width, height; + private BufferedImage img; - private final int width; - private final int height; - private BufferedImage image; - private ByteBuffer buffer; + /* The color model including alpha for the GL image */ + private ColorModel glAlphaColorModel; + /* The color model for the GL image */ + private ColorModel glColorModel; public Image(String imgFile) { - System.out.println("Made image"); - BufferedImage img = this.getImageFile(imgFile); - ByteBuffer buff = this.createByteBuff(img); + this.img = getBuffImage(imgFile); this.width = img.getWidth(); this.height = img.getHeight(); - this.image = img; - this.buffer = buff; + this.glAlphaColorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), + new int[]{8, 8, 8, 8}, + true, + false, + ComponentColorModel.TRANSLUCENT, + DataBuffer.TYPE_BYTE); + + this.glColorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), + new int[]{8, 8, 8, 0}, + false, + false, + ComponentColorModel.OPAQUE, + DataBuffer.TYPE_BYTE); } - public BufferedImage getImageFile(String imageFile) { - System.out.println("read image file"); + private BufferedImage getBuffImage(String imageFile) { try { BufferedImage img = ImageIO.read(new FileInputStream(imageFile)); return img; @@ -43,44 +57,46 @@ public BufferedImage getImageFile(String imageFile) { } } - private ByteBuffer createByteBuff(BufferedImage img) { - System.out.println("Made image buffer"); - try { - int pixels[] = new int[img.getWidth() * img.getHeight()]; - img.getRGB(0, 0, img.getWidth(), img.getHeight(), pixels, 0, img.getWidth()); + public ByteBuffer getByeBuff() { + ByteBuffer byteBuffer; + WritableRaster raster; + BufferedImage texImage; - ByteBuffer buffer = BufferUtils.createByteBuffer(img.getWidth() * img.getHeight() * 4); + // create a raster that can be used by OpenGL as a source for a texture + if (this.img.getColorModel().hasAlpha()) { + raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, this.img.getWidth() + 1, this.img.getHeight(), 4, null); + texImage = new BufferedImage(glAlphaColorModel, raster, false, new Hashtable()); + } else { + raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, this.img.getWidth() + 1, this.img.getHeight(), 3, null); + texImage = new BufferedImage(glColorModel, raster, false, new Hashtable()); + } - for (int x = 0; x < img.getWidth(); x++) { - for (int y = 0; y < img.getHeight(); y++) { - int pixel = pixels[y * img.getWidth() + x]; - buffer.put((byte) ((pixel >> 16) & 0xFF)); - buffer.put((byte) ((pixel >> 8) & 0xFF)); - buffer.put((byte) (pixel & 0xFF)); - } - } + // copy the source image into the produced image + Graphics g = texImage.getGraphics(); + g.setColor(new Color(0f, 0f, 0f, 0f)); + g.fillRect(0, 0, this.img.getWidth() + 1, this.img.getHeight()); + g.drawImage(this.img, 0, 0, null); - buffer.flip(); - return buffer; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } + // build a byte buffer from the temporary image to produce a texture + byte[] data = ((DataBufferByte) texImage.getRaster().getDataBuffer()).getData(); + + byteBuffer = ByteBuffer.allocateDirect(data.length); + byteBuffer.order(ByteOrder.nativeOrder()); + byteBuffer.put(data, 0, data.length); + byteBuffer.flip(); - public int getWidth() { + return byteBuffer; + } + + public int getWidth(){ return width; } - - public int getHeight() { + + public int getHeight(){ return height; } - - public ByteBuffer getBuffer() { - return buffer; - } - public BufferedImage getImg() { - return image; + public BufferedImage getImg(){ + return img; } } diff --git a/src/tutorial/clTexture/TextureDriver.java b/src/tutorial/clTexture/Main.java similarity index 78% rename from src/tutorial/clTexture/TextureDriver.java rename to src/tutorial/clTexture/Main.java index 143b8c8..bc9dc57 100644 --- a/src/tutorial/clTexture/TextureDriver.java +++ b/src/tutorial/clTexture/Main.java @@ -14,44 +14,25 @@ /* * @author labramson */ -public class TextureDriver { +public class Main { //IMAGE FOR THE TEXTURE private static final String imgDir = "C:\\Users\\labramson\\Documents\\Tutorial\\res\\"; public static String imgName = "smileTexture2.jpg"; //CONSTRUCTOR - public TextureDriver() {} + public Main() {} public static void main(String... args) throws Exception { initDisplay(); initGL(); + //GET THE IMAGE AND GREATE THE GL TEXTURE Image img = new Image(imgDir + "" + imgName); - Texture texture = new Texture(GL_TEXTURE_2D, GL11.glGenTextures()); - - //OBJECT USED TO MAKE THE TEXTURE; GETS THE IMAGE AND INIT TEXTURE - TextureMaker tex = new TextureMaker(img.getImg(), texture); - texture = tex.setupTexture(); - tex.makeCLTexture(texture); - - float[] vertices = new float[]{ - -0.5f, 0.5f, - 0.5f, 0.5f, - 0.5f, -0.5f, - 0.5f, -0.5f, - -0.5f, -0.5f, - -0.5f, 0.5f, - }; - - float[] texCoords = new float[]{ - 0, 0, - 1, 0, - 1, 1, - 1, 1, - 0, 1, - 0, 0 - }; + Texture texture = new Texture(img, GL_TEXTURE_2D, GL11.glGenTextures()); + + //CONVERT GL TEXTURE TO CL TEXTURE + texture.convertToCL(); while (!Display.isCloseRequested()) { //CLEARS SCREEN EACH LOOP diff --git a/src/tutorial/clTexture/ObjectModel.java b/src/tutorial/clTexture/ObjectModel.java deleted file mode 100644 index 61d45ec..0000000 --- a/src/tutorial/clTexture/ObjectModel.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package tutorial.clTexture; - -import java.nio.FloatBuffer; -import org.lwjgl.BufferUtils; -import static org.lwjgl.opengl.GL11.*; -import static org.lwjgl.opengl.GL15.*; - -/* - * @author labramson - */ -public class ObjectModel { - private int drawCount; - private int vertexId; - private int textureId; - - public ObjectModel(float[] vertices, float[] texCoords){ - drawCount = vertices.length/2; - vertexId = glGenBuffers(); - glBindBuffer(GL_ARRAY_BUFFER, vertexId); - glBufferData(GL_ARRAY_BUFFER, createFloatBuff(vertices), GL_STATIC_DRAW); - - textureId = glGenBuffers(); - glBindBuffer(GL_ARRAY_BUFFER, textureId); - glBufferData(GL_ARRAY_BUFFER, createFloatBuff(texCoords), GL_STATIC_DRAW); - - glBindBuffer(GL_ARRAY_BUFFER, 0); - } - - public void renderVBO(){ - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - - glBindBuffer(GL_ARRAY_BUFFER, vertexId); - glVertexPointer(2, GL_FLOAT, 0, 0); - - glBindBuffer(GL_ARRAY_BUFFER, textureId); - glTexCoordPointer(2, GL_FLOAT, 0, 0); - - glDrawArrays(GL_TRIANGLES, 0, drawCount); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisableClientState(GL_VERTEX_ARRAY); - } - - private FloatBuffer createFloatBuff(float[] data){ - FloatBuffer vFloatBuff = BufferUtils.createFloatBuffer(data.length); - vFloatBuff.put(data); - vFloatBuff.flip(); - return vFloatBuff; - } -} diff --git a/src/tutorial/clTexture/Texture.java b/src/tutorial/clTexture/Texture.java index e7f2eba..677fc93 100644 --- a/src/tutorial/clTexture/Texture.java +++ b/src/tutorial/clTexture/Texture.java @@ -5,67 +5,214 @@ */ package tutorial.clTexture; +import java.awt.image.BufferedImage; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.util.List; +import org.lwjgl.BufferUtils; +import org.lwjgl.PointerBuffer; +import org.lwjgl.opencl.CL; +import org.lwjgl.opencl.CL10; +import static org.lwjgl.opencl.CL10.CL_MEM_COPY_HOST_PTR; +import static org.lwjgl.opencl.CL10.CL_MEM_READ_ONLY; +import static org.lwjgl.opencl.CL10.CL_MEM_WRITE_ONLY; +import static org.lwjgl.opencl.CL10.clBuildProgram; +import static org.lwjgl.opencl.CL10.clCreateBuffer; +import static org.lwjgl.opencl.CL10.clCreateKernel; +import static org.lwjgl.opencl.CL10.clCreateProgramWithSource; +import static org.lwjgl.opencl.CL10.clEnqueueNDRangeKernel; +import static org.lwjgl.opencl.CL10.clEnqueueReadBuffer; +import static org.lwjgl.opencl.CL10.clEnqueueWriteBuffer; +import static org.lwjgl.opencl.CL10.clFinish; +import org.lwjgl.opencl.CL10GL; +import org.lwjgl.opencl.CL12GL; +import org.lwjgl.opencl.CLCommandQueue; +import org.lwjgl.opencl.CLContext; +import org.lwjgl.opencl.CLDevice; +import org.lwjgl.opencl.CLKernel; +import org.lwjgl.opencl.CLMem; +import org.lwjgl.opencl.CLPlatform; +import org.lwjgl.opencl.CLProgram; +import org.lwjgl.opencl.Util; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.Drawable; import org.lwjgl.opengl.GL11; +import static org.lwjgl.opengl.GL11.GL_NEAREST; +import static org.lwjgl.opengl.GL11.GL_RGB; +import static org.lwjgl.opengl.GL11.GL_RGB8; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_MAG_FILTER; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_S; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_T; +import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE; +import static org.lwjgl.opengl.GL11.glTexImage2D; +import static org.lwjgl.opengl.GL11.glTexParameteri; +import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; +import static tutorial.clTexture.Main.toFloatBuffer; +/** + * + * @author LAA + */ public class Texture { - - public int target, textureID, height, width, texWidth, texHeight; - private float widthRatio, heightRatio; - - public Texture(int target, int textureID) { + private int width, height, target, id; + private Image image; + + static final String source + = "kernel void sum(global const float *a, global const float *b, global float *answer)" + + "{ unsigned int xid = get_global_id(0); answer[xid] = a[xid] + b[xid];}"; + static final FloatBuffer a = toFloatBuffer(new float[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); + static final FloatBuffer b = toFloatBuffer(new float[]{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}); + static final FloatBuffer answer = BufferUtils.createFloatBuffer(a.capacity()); + + public Texture(Image image, int target, int id){ + this.image = image; + this.width = image.getWidth(); + this.height = image.getHeight(); this.target = target; - this.textureID = textureID; - } + this.id = id; + + int srcPixelFormat = 0; + + // bind this texture + GL11.glBindTexture(target, id); - public void bind() { - GL11.glBindTexture(target, textureID); - } + //GETS COLOR MODEL OF THE IMAGE + if (image.getImg().getColorModel().hasAlpha()) { + srcPixelFormat = GL11.GL_RGBA; + } else { + srcPixelFormat = GL11.GL_RGB; + } + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - public void setWidth(int width) { - this.width = width; - setWidth(); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.getWidth()+1, image.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); } + + public void convertToCL(){ + try { + CLContext context = createCLContext(); - public void setHeight(int height) { - this.height = height; - setHeight(); - } + // Create an command queue using our OpenCL context and the first device in our list of devices + CLCommandQueue queue = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(0), CL10.CL_QUEUE_PROFILING_ENABLE, null); + System.out.println("Command Queue created"); + + CLMem mem = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_READ_ONLY, target, 0, id, null); + + GL11.glFinish(); - public int getImageWidth() { - return width; + kernelFunction(context, queue); + } catch (Exception e) { + System.out.println("*** Problem creating CL texture"); + e.printStackTrace(); + } } + + private CLContext createCLContext(){ + try { + // Initialize OpenCL and create a context and command queue + CL.create(); + System.out.println("\nCL created"); - public int getImageHeight() { - return height; - } + // Drawable context that OpenCL needs + Drawable drawable = Display.getDrawable(); + System.out.println("Drawable created"); - public float getWidth() { - return width; - } + // LWJGL CLPlatform object + CLPlatform platform = CLPlatform.getPlatforms().get(0); + System.out.println("Platform created"); - public float getHeight() { - return height; - } + // List of LJWGL CLDevice objects representing hardware or software contexts that OpenCL can use + List devices = platform.getDevices(CL10.CL_DEVICE_TYPE_GPU); + System.out.println("Devices obtained"); - public void setTextureWidth(int texWidth) { - this.texWidth = texWidth; - setWidth(); - } + // Create the OpenCL context using the patform, devices, and the OpenGL drawable + CLContext context = CLContext.create(platform, devices, null, drawable, null); + System.out.println("Context created"); - public void setTextureHeight(int texHeight) { - this.texHeight = texHeight; - setHeight(); - } + return context; - private void setWidth() { - if (texWidth != 0) { - widthRatio = ((float) width) / texWidth; + } catch (Exception e) { + System.out.println("*** Problem initializing OpenCL"); + e.printStackTrace(); + return null; } } + + private void kernelFunction(CLContext context, CLCommandQueue queue){ + //BELOW IS CODE TO TRY TO WORK WITH A KERNEL; KERNEL WILL NEED TO STUFF WITH TEXTURE + //THIS CODE IS FROM MY HelloWorld.java; + //needs to be passed the texture + System.out.println("Hello"); + + //Allocates memory for input buffers + CLMem aMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, a, null); + clEnqueueWriteBuffer(queue, aMem, 1, 0, a, null, null); - private void setHeight() { - if (texHeight != 0) { - heightRatio = ((float) height) / texHeight; - } + CLMem bMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, b, null); + clEnqueueWriteBuffer(queue, bMem, 1, 0, b, null, null); + + //Allocates memory four output buffer + CLMem answerMem = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_COPY_HOST_PTR, answer, null); + clFinish(queue); + + //Creates the program using context & source + CLProgram program = clCreateProgramWithSource(context, source, null); + //Checks if there was an error in creation + Util.checkCLError(clBuildProgram(program, context.getInfoDevices().get(0), "", null)); + + //Creates the kernel; function name passed in must match kernel method in OCL source + //sum method is defined in String source used in creating the program + CLKernel kernel = clCreateKernel(program, "sum", null); + + //Execute the kernel + PointerBuffer kernel1DGlobalWorkSize = BufferUtils.createPointerBuffer(1); + kernel1DGlobalWorkSize.put(0, a.capacity()); + //Set arguments for the kernel; inputs & output + kernel.setArg(0, aMem); + kernel.setArg(1, bMem); + kernel.setArg(2, answerMem); + //Enqueue the kernel + clEnqueueNDRangeKernel(queue, kernel, 1, null, kernel1DGlobalWorkSize, null, null, null); + + //Read results from memory back into buffer + clEnqueueReadBuffer(queue, answerMem, 1, 0, answer, null, null); + clFinish(queue); + +// System.out.print(a); +// System.out.println("+"); +// System.out.print(b); +// System.out.println("="); +// System.out.print(answer); + + //END OF KERNEL WORK; PRINTS OUT ANSWER FROM FLOAT BUFFER WITH ANSWER + } + + public void bind() { + GL11.glBindTexture(target, id); + } + + public int getTarget(){ + return target; + } + + public int getId(){ + return id; + } + + public int getWidth(){ + return width; + } + + public int getHeight(){ + return height; + } + + public Image getImage(){ + return image; } } diff --git a/src/tutorial/clTexture/TextureMaker.java b/src/tutorial/clTexture/TextureMaker.java index 3d0b362..88bd8f0 100644 --- a/src/tutorial/clTexture/TextureMaker.java +++ b/src/tutorial/clTexture/TextureMaker.java @@ -69,7 +69,7 @@ import org.lwjgl.opencl.CLKernel; import org.lwjgl.opencl.CLProgram; import org.lwjgl.opencl.Util; -import static tutorial.clTexture.TextureDriver.toFloatBuffer; +import static tutorial.clTexture.Main.toFloatBuffer; /* * @author labramson @@ -85,7 +85,6 @@ public class TextureMaker { private Texture texture; private BufferedImage image; - private ByteBuffer textureBuff; static final String source = "kernel void sum(global const float *a, global const float *b, global float *answer)" @@ -155,7 +154,6 @@ public Texture setupTexture() { //CONVERTES THE BufferedImage TO a ByteBuffer for the texture ByteBuffer texBuff = imgToTexBuff(bufferedImage, texture); - textureBuff = texBuff; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); @@ -172,8 +170,8 @@ private ByteBuffer imgToTexBuff(BufferedImage bufferedImage, Texture texture) { WritableRaster raster; BufferedImage texImage; - texture.setTextureHeight(bufferedImage.getHeight()); - texture.setTextureWidth(bufferedImage.getWidth()); + //texture.setTextureHeight(bufferedImage.getHeight()); + //texture.setTextureWidth(bufferedImage.getWidth()); // create a raster that can be used by OpenGL as a source for a texture if (bufferedImage.getColorModel().hasAlpha()) { From 18253f26fef75d046335429bbbc0ded5fceb005b Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Mon, 17 Jul 2017 17:04:58 -0400 Subject: [PATCH 04/17] Trying to get data from image clmem --- build/classes/tutorial/clTexture/Image.class | Bin 3402 -> 3590 bytes .../classes/tutorial/clTexture/Texture.class | Bin 6845 -> 7462 bytes .../tutorial/clTexture/TextureMaker.class | Bin 8837 -> 0 bytes nbproject/project.properties | 2 +- src/tutorial/clTexture/Image.java | 16 +- src/tutorial/clTexture/Main.java | 2 +- src/tutorial/clTexture/Texture.java | 231 ++++++------ src/tutorial/clTexture/TextureMaker.java | 341 ------------------ 8 files changed, 141 insertions(+), 451 deletions(-) delete mode 100644 build/classes/tutorial/clTexture/TextureMaker.class delete mode 100644 src/tutorial/clTexture/TextureMaker.java diff --git a/build/classes/tutorial/clTexture/Image.class b/build/classes/tutorial/clTexture/Image.class index e6b6226d3bcee89c14aa2b3e8f39fc238aae8c4d..d3d3878466dab29ab8ed968a76562d0db6d1f4d3 100644 GIT binary patch delta 1446 zcmZvc`%_g_6vsb@b1nxCTO>r}^74X~#YM?L;a-s;uR_`a(T%sykKaBy|9N? zcI;{PekvJ0I-nF${nFSp(@eiK{w2*c0 zl{uh{UmZ%=>#%{AWD%_nIXtSh$F%mi*4k{sHti0{?6c``NFt)`omzAy(@jqjy$<{7 zv*~w8XTV{QA)6;0Rx+H#0UayqFv6(AL7uc*8M8U$kgHSYa9E3{Y@T)q@QlMaN3?iW zi|6#&^A3%?VDqBGIwl;B@{+^LyrQ*NwK%55ahum{UO)f)rUc^+*Dxam<(yF5%Qi(R zWr`*qR@}};#Uom~gN^P{v)X(U*ZsrHFD>V!ViTJcTi9&#mf~&RF<4O>iSFy}8R!c1 z^oP45fzF=3h|Rl-_o#6HF>_POsjzupaf%Pz)mB#NX-*hq)ra^0f2Vyc8VR(IbaqCD z6(91E&BuyQ_|)bz#pitCHdtFK%lT6A6<-^q_J&8pCE}LAg@SH#TP!XPH!d z%Q?k&OexNDL2;2w?z~l4_&uJ@v|@(KHdhq0{Gj-eImJ)RD}Lq|*YZs^q{U+Qg$KGy zn#K-9BmD;E;7HV9WnJu~XRu`FaL+)rDLNbp_g6{%OPCGpA??&RaPge)tXZ`|rU-n} zd!bjfbWN`837YuWF1*Hep;q=p45_I?WTksD`Pg`s*z&PO2Cyh#8HHrAM%G#y2y#fG zZI#nZi3o?ele=Ws+TGkEQ4(~Qbu_UZ$CL$m7g(O2=5f<3>7n2>D`v>3FP^F|_Q*7* z#5qZ(GgJO1vHaPBNi4z4Na3b zO}@J|#Xo-ID0T7Cj`bd^D=oh@OCXdYziA3Q3jLO8F2uIl;!2{&8o#A=(=GQloR%dV>}X7Wo>)9f#;$a2%zB9g@(J6a|uWm&~B%emM#MQgdA<$EMMi78?5T z$D1IdYRHmt6)t>}q9nwM(lZHdF<>h0umHl)-wR7jmF}M^vqLiwckWoydAC#>AH~I) ROikb7Ox;Uf-V^f*{RfWl{l@?R delta 1325 zcmZvb`*TxO5XV0^_a;ZKC#j{jCAAis)>qOJtSM+)QK|TBsuW6yqBhb>sWnBcfS?3? z;0t_R74eBrM60&axy{%ahM(~lhhH846~;X`83#skXZCFN?Bl!N-E+A4TvO@Xg+I;! z8RlJ5Y<5YKTOwkMOCx!sJz}&+jkZ=$VXxL6Yt8Vw=62R<(yY=v#KW2nIyD=NwvtZo znB8x`!JFPcc1twFTbi5c(%eFqx6*0u&CsoQTXTe?7IhPa-G%gIp}0N0e($!iozpv} zikf#!iFbKV@xJB*JjI8akNDU-;jHP&a7^i@$~&s_nAb>c654Jt`( z(a+r#Jl0X^DNHgYfH zJV=oN4v>|_9F!H?z?|Ha*~D3f`IF83Rbop(_mI5ib{YJ72@VOtwj@{;4D)=I?lMi> z$NfU>Mwwd0Z=8v$Uy)HBkb;hsXqBQ_nXMU1lu+LVSy6>dr%{6CEmo!@`)Of$xo9ld zL9>^zH2|XnJzOnpnOA#pjQE9RP-;e$P_Rjr;E~G)4+-ANdIkln!M5SA8k`8qjb1i- IQ{XoIFD1;)@c;k- diff --git a/build/classes/tutorial/clTexture/Texture.class b/build/classes/tutorial/clTexture/Texture.class index 591ead4e33322ccfbdab88488453cfaedd3162ff..4e5452e8fbd236261897a3c7b758634645417d4d 100644 GIT binary patch literal 7462 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 Li#hAbcE|q$=A7+o delta 3207 zcmaJ@33yc175>j`@8!)6NrpfeNJ4;!*&wn7GD3s|kzmLoNQhYLkUT;l8?3RaO4V!~k2)~YR7+iGiDtKIBgTie>!(iQyg8v=#q>o?!rdzO3lbMAcy zB2UaqJa^{tCjrcrD-G;5aF2m|Ev&(PX{f?J3*ES1L!Z{r0~&fzFQ3uNXDxWJUo$>u z;Q$U=cnF{O0=vpJ<6%NOn>6Z&fxi1;`u8Hqy@cSlS*82}Eyn8%l&Vcm$B`O&2OvxDU zG z*rU*lwF-`gS~PTnUe@X54g5jjkNA^;Hx>SjzZm$d!dv*8!fE_n;UD;?!oToug&nxX zz<(6Z;H)7~BI0rKjr>Jk@fqS*5)hKd)%0|AMZ4Pynzq_o?Sj^r9gW**LXmZo7@zWP%{0rl&h@_s2)XoE_%W=>q?9yR)-LA&T`%!ZK0G zB*|51C5kpp%aeTPxOrmZWGN6Z*eNpAkZDQ^2kRtMM{dL#E?=YW!PiL z3?(zA+>k4j%#ztk=Ez(n^CZ`h3MKPpfs#sz(A`bZZPD`1Xm@*g!}?8jYutI$%5$o+ zCnN&xcD%N$T~JU|T<4yOZjYCDbVb|k^6IS{HrO${tyW`K3UdD+pY23dH9eg@v6Ve- zcBdfke>GlUQ(c(q64CMt_AYP*=Ei8>lFr_Z>|$?G@eRyud*^DqzcCt%cG+<|)*%QK z)z;P)uMt=@T)o5A?h0~7taf+wlvnSFyJR~?d&O3BRg=dJ2-=h zP=z>avilQNyy}27-Y=XCeHH1saCeS|yK_3+oioIJ0&c=PIo&tAw5y1-cU(G~#@*RB z+=D!0V*}TAKo-%0zF+PxIR;-z=@9%SrNameAz^61970-2?hve!ydea=6~5fOBorCx z!x%G+jJ*hEh0O}zL6})#qr#V!{#sU%CzP2)mJ50>fRZ&GBV?S1y`hk{=et=O^HN7v zwh$bfOdxxJetEHx>oR0SoY0IRSV*Yo6BG%{c7 zc#X7k?PG@SVtzWPWo{~7Y{F(@j9lMA%!Y<^W<4&nEATsL``rKvu+%TpOxc*gP3162~MrN{(U_Je;f8uK)d zF)g6GRrF^G9j@jJw}Rf)W6Sx-{iq}sqrOR$=|i0H&SOruVjDGALt#7mwY3COno5z5 zoNag-OAHh$p65NAidQDmzV4ozlDJ&^TSR}8D6Z3Ri3^vG#9!tHK7+(EV;D2*^^tOo z&5%+?e?`QnDYHlk`;JgSA~!Ufh>l*4xZ&5+qe7-vH$)XOxN4WTGZD8CyA?TjH~9%Z zu(xA2ukHxmhoyKw+v9_j+|7pgFe`Z{%l#2I9aRWWZZRcqqy9oR(7UL?L)koPN$jNZ zrBtr7<)iSJk<74&s^N(lktDL34^xnb4ewuPp4-yvp;u$WbhGS^lyl7B!cKt|GQL5(oz_>bB4l zlB<)b2?s(;30@sBd`T>em|@dPQ^UCCj$tfs4jW#Uq?Wrc>`MXuuwMg-GSVb$vdfcL z(OeexYd;oh?Am76v>s27Ta9{72Ji`nxEI;D2UBn#W?~-};sFlngKWV4yu=Q$6(45v zJj(1IW*v^;;~2pGIEsV%`--?OaI@h<%;kmxerqCU36U@ZD zEcQ0msTMm~@@?$OX4dTkEPa3`8}T7FfI-76*aUa#8nFpRrZ&Pb^!zJ5j(Qq-#SOS$ ze{OX86AyTXt?;btnJ&35e5wfqAH|+jkx|ZF^ZZ)TAp)uN1YF|D{}T3}7rtv$;ou>< zdXe<=qe}C`X%y4OrKVpPRhZveqX?&+6KO28ER;1$qa-Vxf-D+u4d>uu4$oFO-ZaCL`9}`BGBU1 zM4#sS_0fQqIwwy}l&8{6BVCItEgeh=SEf2YiR%ZkP`9sOV=lKb99{6rtl|ZDD{4so Jq#MSk-UdG&aSi|g diff --git a/build/classes/tutorial/clTexture/TextureMaker.class b/build/classes/tutorial/clTexture/TextureMaker.class deleted file mode 100644 index fb7ba56236d9a5a5fe4e15276b5076d82930b63b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8837 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 diff --git a/nbproject/project.properties b/nbproject/project.properties index 22a892d..524bfb8 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -86,7 +86,7 @@ javadoc.splitindex=true javadoc.use=true javadoc.version=false javadoc.windowtitle= -main.class=tutorial.texture.TextureDriver +main.class=tutorial.clTexture.Main manifest.file=manifest.mf meta.inf.dir=${src.dir}/META-INF mkdist.disabled=false diff --git a/src/tutorial/clTexture/Image.java b/src/tutorial/clTexture/Image.java index e0a946e..9469745 100644 --- a/src/tutorial/clTexture/Image.java +++ b/src/tutorial/clTexture/Image.java @@ -20,6 +20,7 @@ * @author LAA */ public class Image { + private final int width, height; private BufferedImage img; @@ -48,6 +49,7 @@ public Image(String imgFile) { } private BufferedImage getBuffImage(String imageFile) { + System.out.println("Fetching image file"); try { BufferedImage img = ImageIO.read(new FileInputStream(imageFile)); return img; @@ -62,6 +64,8 @@ public ByteBuffer getByeBuff() { WritableRaster raster; BufferedImage texImage; + System.out.println("Making image byte buffer"); + // create a raster that can be used by OpenGL as a source for a texture if (this.img.getColorModel().hasAlpha()) { raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, this.img.getWidth() + 1, this.img.getHeight(), 4, null); @@ -87,16 +91,16 @@ public ByteBuffer getByeBuff() { return byteBuffer; } - - public int getWidth(){ + + public int getWidth() { return width; } - - public int getHeight(){ + + public int getHeight() { return height; } - - public BufferedImage getImg(){ + + public BufferedImage getImg() { return img; } } diff --git a/src/tutorial/clTexture/Main.java b/src/tutorial/clTexture/Main.java index bc9dc57..ddcb3c5 100644 --- a/src/tutorial/clTexture/Main.java +++ b/src/tutorial/clTexture/Main.java @@ -41,7 +41,7 @@ public static void main(String... args) throws Exception { glEnable(GL_TEXTURE_2D); //BIND THE TEXTURE texture.bind(); - glPixelStorei(GL_PACK_ALIGNMENT, 4); + glPixelStorei(GL_PACK_ALIGNMENT, 4); //DRAW A SQUARE WITH MAPPED TEXTURE glBegin(GL_QUADS); diff --git a/src/tutorial/clTexture/Texture.java b/src/tutorial/clTexture/Texture.java index 677fc93..e3069a1 100644 --- a/src/tutorial/clTexture/Texture.java +++ b/src/tutorial/clTexture/Texture.java @@ -5,12 +5,29 @@ */ package tutorial.clTexture; -import java.awt.image.BufferedImage; -import java.nio.ByteBuffer; import java.nio.FloatBuffer; +import java.nio.ByteBuffer; import java.util.List; + import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; import org.lwjgl.PointerBuffer; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.Drawable; +import org.lwjgl.opengl.GL11; +import static org.lwjgl.opengl.GL11.GL_NEAREST; +import static org.lwjgl.opengl.GL11.GL_RGB; +import static org.lwjgl.opengl.GL11.GL_RGB8; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_MAG_FILTER; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_S; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_T; +import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE; +import static org.lwjgl.opengl.GL11.glTexImage2D; +import static org.lwjgl.opengl.GL11.glTexParameteri; +import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; + import org.lwjgl.opencl.CL; import org.lwjgl.opencl.CL10; import static org.lwjgl.opencl.CL10.CL_MEM_COPY_HOST_PTR; @@ -25,7 +42,6 @@ import static org.lwjgl.opencl.CL10.clEnqueueWriteBuffer; import static org.lwjgl.opencl.CL10.clFinish; import org.lwjgl.opencl.CL10GL; -import org.lwjgl.opencl.CL12GL; import org.lwjgl.opencl.CLCommandQueue; import org.lwjgl.opencl.CLContext; import org.lwjgl.opencl.CLDevice; @@ -34,75 +50,82 @@ import org.lwjgl.opencl.CLPlatform; import org.lwjgl.opencl.CLProgram; import org.lwjgl.opencl.Util; -import org.lwjgl.opengl.Display; -import org.lwjgl.opengl.Drawable; -import org.lwjgl.opengl.GL11; -import static org.lwjgl.opengl.GL11.GL_NEAREST; -import static org.lwjgl.opengl.GL11.GL_RGB; -import static org.lwjgl.opengl.GL11.GL_RGB8; -import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; -import static org.lwjgl.opengl.GL11.GL_TEXTURE_MAG_FILTER; -import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER; -import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_S; -import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_T; -import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE; -import static org.lwjgl.opengl.GL11.glTexImage2D; -import static org.lwjgl.opengl.GL11.glTexParameteri; -import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; + import static tutorial.clTexture.Main.toFloatBuffer; -/** - * +/* * @author LAA */ public class Texture { - private int width, height, target, id; - private Image image; - + + private final int width, height, target, id; + private final Image image; + static final String source = "kernel void sum(global const float *a, global const float *b, global float *answer)" + "{ unsigned int xid = get_global_id(0); answer[xid] = a[xid] + b[xid];}"; + static final String kernel + = "kernel void imgTest()" + + "{ //Do stuff here }"; static final FloatBuffer a = toFloatBuffer(new float[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); static final FloatBuffer b = toFloatBuffer(new float[]{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}); static final FloatBuffer answer = BufferUtils.createFloatBuffer(a.capacity()); + + public ByteBuffer buf, ptrbufs; + public PointerBuffer pointers; - public Texture(Image image, int target, int id){ + + static PointerBuffer ptrbuff; + + public Texture(Image image, int target, int id) { this.image = image; this.width = image.getWidth(); this.height = image.getHeight(); this.target = target; this.id = id; + + //byte[] bytes = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + buf = ByteBuffer.allocateDirect(16); + buf.put(0, ) + + // Create a direct (memory-mapped) ByteBuffer with a 10 byte capacity. + // buf = ByteBuffer.wrap(bytes); + pointers = new PointerBuffer(buf); + + byte[] ptrs = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + ByteBuffer ptrbufs = ByteBuffer.allocateDirect(10); + // Create a direct (memory-mapped) ByteBuffer with a 10 byte capacity. + ptrbufs = ByteBuffer.wrap(ptrs); +// // Get the ByteBuffer's capacity + int capacity = buf.capacity(); // 10 + + System.out.println(capacity); + + - int srcPixelFormat = 0; // bind this texture GL11.glBindTexture(target, id); - //GETS COLOR MODEL OF THE IMAGE - if (image.getImg().getColorModel().hasAlpha()) { - srcPixelFormat = GL11.GL_RGBA; - } else { - srcPixelFormat = GL11.GL_RGB; - } - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.getWidth()+1, image.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.getWidth() + 1, image.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); } - - public void convertToCL(){ + + public void convertToCL() { try { CLContext context = createCLContext(); // Create an command queue using our OpenCL context and the first device in our list of devices CLCommandQueue queue = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(0), CL10.CL_QUEUE_PROFILING_ENABLE, null); System.out.println("Command Queue created"); - - CLMem mem = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_READ_ONLY, target, 0, id, null); - + + CLMem mem = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_READ_ONLY, target, 0, id, null); + + System.out.println(CL10.clGetImageInfo(mem, CL10.CL_IMAGE_WIDTH, buf, pointers)); GL11.glFinish(); kernelFunction(context, queue); @@ -111,9 +134,9 @@ public void convertToCL(){ e.printStackTrace(); } } - - private CLContext createCLContext(){ - try { + + private CLContext createCLContext() { + try { // Initialize OpenCL and create a context and command queue CL.create(); System.out.println("\nCL created"); @@ -136,83 +159,87 @@ private CLContext createCLContext(){ return context; - } catch (Exception e) { + } catch (LWJGLException e) { System.out.println("*** Problem initializing OpenCL"); e.printStackTrace(); return null; } } - - private void kernelFunction(CLContext context, CLCommandQueue queue){ + + private void kernelFunction(CLContext context, CLCommandQueue queue) { //BELOW IS CODE TO TRY TO WORK WITH A KERNEL; KERNEL WILL NEED TO STUFF WITH TEXTURE - //THIS CODE IS FROM MY HelloWorld.java; - //needs to be passed the texture - System.out.println("Hello"); - - //Allocates memory for input buffers - CLMem aMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, a, null); - clEnqueueWriteBuffer(queue, aMem, 1, 0, a, null, null); - - CLMem bMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, b, null); - clEnqueueWriteBuffer(queue, bMem, 1, 0, b, null, null); - - //Allocates memory four output buffer - CLMem answerMem = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_COPY_HOST_PTR, answer, null); - clFinish(queue); - - //Creates the program using context & source - CLProgram program = clCreateProgramWithSource(context, source, null); - //Checks if there was an error in creation - Util.checkCLError(clBuildProgram(program, context.getInfoDevices().get(0), "", null)); - - //Creates the kernel; function name passed in must match kernel method in OCL source - //sum method is defined in String source used in creating the program - CLKernel kernel = clCreateKernel(program, "sum", null); - - //Execute the kernel - PointerBuffer kernel1DGlobalWorkSize = BufferUtils.createPointerBuffer(1); - kernel1DGlobalWorkSize.put(0, a.capacity()); - //Set arguments for the kernel; inputs & output - kernel.setArg(0, aMem); - kernel.setArg(1, bMem); - kernel.setArg(2, answerMem); - //Enqueue the kernel - clEnqueueNDRangeKernel(queue, kernel, 1, null, kernel1DGlobalWorkSize, null, null, null); - - //Read results from memory back into buffer - clEnqueueReadBuffer(queue, answerMem, 1, 0, answer, null, null); - clFinish(queue); - -// System.out.print(a); -// System.out.println("+"); -// System.out.print(b); -// System.out.println("="); -// System.out.print(answer); - - //END OF KERNEL WORK; PRINTS OUT ANSWER FROM FLOAT BUFFER WITH ANSWER + //THIS CODE IS FROM MY HelloWorld.java + //needs to be passed the texture + + //Allocates memory for input buffers + CLMem aMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, a, null); + clEnqueueWriteBuffer(queue, aMem, 1, 0, a, null, null); + + CLMem bMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, b, null); + clEnqueueWriteBuffer(queue, bMem, 1, 0, b, null, null); + + //Allocates memory four output buffer + CLMem answerMem = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_COPY_HOST_PTR, answer, null); + clFinish(queue); + + //Creates the program using context & source + CLProgram program = clCreateProgramWithSource(context, source, null); + //Checks if there was an error in creation + Util.checkCLError(clBuildProgram(program, context.getInfoDevices().get(0), "", null)); + + //Creates the kernel; function name passed in must match kernel method in OCL source + //sum method is defined in String source used in creating the program + CLKernel kernel = clCreateKernel(program, "sum", null); + + //Execute the kernel + PointerBuffer kernel1DGlobalWorkSize = BufferUtils.createPointerBuffer(1); + kernel1DGlobalWorkSize.put(0, a.capacity()); + //Set arguments for the kernel; inputs & output + kernel.setArg(0, aMem); + kernel.setArg(1, bMem); + kernel.setArg(2, answerMem); + //Enqueue the kernel + clEnqueueNDRangeKernel(queue, kernel, 1, null, kernel1DGlobalWorkSize, null, null, null); + + //Read results from memory back into buffer + clEnqueueReadBuffer(queue, answerMem, 1, 0, answer, null, null); + clFinish(queue); + + //END OF KERNEL WORK; PRINTS OUT ANSWER FROM FLOAT BUFFER WITH ANSWER + for (int i = 0; i < a.capacity(); i++) { + System.out.print(a.get(i) + " "); + } + System.out.println("+"); + for (int i = 0; i < b.capacity(); i++) { + System.out.print(b.get(i) + " "); + } + System.out.println("="); + for (int i = 0; i < answer.capacity(); i++) { + System.out.print(answer.get(i) + " "); + } } - + public void bind() { GL11.glBindTexture(target, id); } - - public int getTarget(){ + + public int getTarget() { return target; } - - public int getId(){ + + public Image getImage() { + return image; + } + + public int getId() { return id; } - - public int getWidth(){ + + public int getWidth() { return width; } - - public int getHeight(){ + + public int getHeight() { return height; } - - public Image getImage(){ - return image; - } } diff --git a/src/tutorial/clTexture/TextureMaker.java b/src/tutorial/clTexture/TextureMaker.java deleted file mode 100644 index 88bd8f0..0000000 --- a/src/tutorial/clTexture/TextureMaker.java +++ /dev/null @@ -1,341 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package tutorial.clTexture; - -//Java imports -import java.awt.Graphics; -import java.awt.Color; -import java.awt.color.ColorSpace; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.ComponentColorModel; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.Raster; -import java.awt.image.WritableRaster; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.FloatBuffer; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.List; -import org.lwjgl.BufferUtils; -import org.lwjgl.PointerBuffer; - -//GL imports -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL15; -import static org.lwjgl.opengl.GL11.GL_NEAREST; -import static org.lwjgl.opengl.GL11.GL_RGB; -import static org.lwjgl.opengl.GL11.GL_RGB8; -import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; -import static org.lwjgl.opengl.GL11.GL_TEXTURE_MAG_FILTER; -import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER; -import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_S; -import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_T; -import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE; -import static org.lwjgl.opengl.GL11.glTexImage2D; -import static org.lwjgl.opengl.GL11.glTexParameteri; -import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; -import static org.lwjgl.opengl.GL15.GL_ARRAY_BUFFER; -import static org.lwjgl.opengl.GL15.GL_DYNAMIC_DRAW; -import org.lwjgl.opengl.Display; -import org.lwjgl.opengl.Drawable; - -//CL imports -import org.lwjgl.opencl.CL; -import org.lwjgl.opencl.CL10; -import static org.lwjgl.opencl.CL10.CL_MEM_COPY_HOST_PTR; -import static org.lwjgl.opencl.CL10.CL_MEM_READ_ONLY; -import static org.lwjgl.opencl.CL10.CL_MEM_WRITE_ONLY; -import static org.lwjgl.opencl.CL10.clBuildProgram; -import static org.lwjgl.opencl.CL10.clCreateBuffer; -import static org.lwjgl.opencl.CL10.clCreateKernel; -import static org.lwjgl.opencl.CL10.clCreateProgramWithSource; -import static org.lwjgl.opencl.CL10.clEnqueueNDRangeKernel; -import static org.lwjgl.opencl.CL10.clEnqueueReadBuffer; -import static org.lwjgl.opencl.CL10.clEnqueueWriteBuffer; -import static org.lwjgl.opencl.CL10.clFinish; -import org.lwjgl.opencl.CL10GL; -import org.lwjgl.opencl.CL12GL; -import org.lwjgl.opencl.CLContext; -import org.lwjgl.opencl.CLDevice; -import org.lwjgl.opencl.CLPlatform; -import org.lwjgl.opencl.CLCommandQueue; -import org.lwjgl.opencl.CLMem; -import org.lwjgl.opencl.CLKernel; -import org.lwjgl.opencl.CLProgram; -import org.lwjgl.opencl.Util; -import static tutorial.clTexture.Main.toFloatBuffer; - -/* - * @author labramson - */ -public class TextureMaker { - - /* The table of textures that have been loaded in this loader */ - private HashMap table = new HashMap(); - /* The color model including alpha for the GL image */ - private ColorModel glAlphaColorModel; - /* The color model for the GL image */ - private ColorModel glColorModel; - - private Texture texture; - private BufferedImage image; - - static final String source - = "kernel void sum(global const float *a, global const float *b, global float *answer)" - + "{ unsigned int xid = get_global_id(0); answer[xid] = a[xid] + b[xid];}"; - static final String code = "kernel void readImg (BufferedImage img)" - + "{ for (int x = 0; x < image.getWidth(); x++) {\n" - + " for (int y = 0; y < image.getHeight(); y++) {\n" - + " final int clr = image.getRGB(x, y);\n" - + " final int red = (clr & 0x00ff0000) >> 16;\n" - + " final int green = (clr & 0x0000ff00) >> 8;\n" - + " final int blue = clr & 0x000000ff;\n" - + "\n" - + " // Color Red get cordinates\n" - + " if (red == 255) {\n" - + " System.out.println(String.format(\"Coordinate %d %d\", x, y));\n" - + " } else {\n" - + " System.out.println(\"Red Color value = \" + red);\n" - + " System.out.println(\"Green Color value = \" + green);\n" - + " System.out.println(\"Blue Color value = \" + blue);\n" - + " }\n" - + " }\n" - + " }}"; - - //buffers for input and output - static final FloatBuffer a = toFloatBuffer(new float[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); - static final FloatBuffer b = toFloatBuffer(new float[]{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}); - static final FloatBuffer answer = BufferUtils.createFloatBuffer(a.capacity()); - - public TextureMaker(BufferedImage image, Texture texture) { - this.image = image; - this.texture = texture; - this.glAlphaColorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), - new int[]{8, 8, 8, 8}, - true, - false, - ComponentColorModel.TRANSLUCENT, - DataBuffer.TYPE_BYTE); - - this.glColorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), - new int[]{8, 8, 8, 0}, - false, - false, - ComponentColorModel.OPAQUE, - DataBuffer.TYPE_BYTE); - } - - /*BINDS THE IMAGE TO THE TEXTURE - RETURNS THE TEXTURE - */ - public Texture setupTexture() { - int srcPixelFormat = 0; - - // bind this texture - GL11.glBindTexture(this.texture.target, this.texture.textureID); - - //GETS THE IMAGE & SETS WIDTH/HEIGHT OF IMAGE TO THAT OF TEXTURE - BufferedImage bufferedImage = this.image; - this.texture.setWidth(bufferedImage.getWidth()); - this.texture.setHeight(bufferedImage.getHeight()); - - //GETS COLOR MODEL OF THE IMAGE - if (bufferedImage.getColorModel().hasAlpha()) { - srcPixelFormat = GL11.GL_RGBA; - } else { - srcPixelFormat = GL11.GL_RGB; - } - - //CONVERTES THE BufferedImage TO a ByteBuffer for the texture - ByteBuffer texBuff = imgToTexBuff(bufferedImage, texture); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, bufferedImage.getWidth()+1, bufferedImage.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, (ByteBuffer) texBuff); - - return texture; - } - - private ByteBuffer imgToTexBuff(BufferedImage bufferedImage, Texture texture) { - ByteBuffer imageBuffer = null; - WritableRaster raster; - BufferedImage texImage; - - //texture.setTextureHeight(bufferedImage.getHeight()); - //texture.setTextureWidth(bufferedImage.getWidth()); - - // create a raster that can be used by OpenGL as a source for a texture - if (bufferedImage.getColorModel().hasAlpha()) { - raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, bufferedImage.getWidth()+1, bufferedImage.getHeight(), 4, null); - texImage = new BufferedImage(glAlphaColorModel, raster, false, new Hashtable()); - } else { - raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, bufferedImage.getWidth()+1, bufferedImage.getHeight(), 3, null); - texImage = new BufferedImage(glColorModel, raster, false, new Hashtable()); - } - - // copy the source image into the produced image - Graphics g = texImage.getGraphics(); - g.setColor(new Color(0f, 0f, 0f, 0f)); - g.fillRect(0, 0, bufferedImage.getWidth()+1, bufferedImage.getHeight()); - g.drawImage(bufferedImage, 0, 0, null); - - // build a byte buffer from the temporary image to produce a texture - byte[] data = ((DataBufferByte) texImage.getRaster().getDataBuffer()).getData(); - - imageBuffer = ByteBuffer.allocateDirect(data.length); - imageBuffer.order(ByteOrder.nativeOrder()); - imageBuffer.put(data, 0, data.length); - imageBuffer.flip(); - - return imageBuffer; - } - - public void makeCLTexture(Texture texture) { - try { - CLContext context = createCLContext(); - - // Create an command queue using our OpenCL context and the first device in our list of devices - CLCommandQueue queue = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(0), CL10.CL_QUEUE_PROFILING_ENABLE, null); - System.out.println("Command Queue created"); - - CLMem mem = CL12GL.clCreateFromGLTexture(context, CL10.CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, texture.textureID, null); - GL11.glFinish(); - - kernelFunction(context, queue); - } catch (Exception e) { - e.printStackTrace(); - System.out.println("*** Problem initializing OpenCL"); - } - } - - private CLContext createCLContext(){ - try { - // Initialize OpenCL and create a context and command queue - CL.create(); - System.out.println("\nCL created"); - - // Drawable context that OpenCL needs - Drawable drawable = Display.getDrawable(); - System.out.println("Drawable created"); - - // LWJGL CLPlatform object - CLPlatform platform = CLPlatform.getPlatforms().get(0); - System.out.println("Platform created"); - - // List of LJWGL CLDevice objects representing hardware or software contexts that OpenCL can use - List devices = platform.getDevices(CL10.CL_DEVICE_TYPE_GPU); - System.out.println("Devices obtained"); - - // Create the OpenCL context using the patform, devices, and the OpenGL drawable - CLContext context = CLContext.create(platform, devices, null, drawable, null); - System.out.println("Context created"); - - return context; - - } catch (Exception e) { - e.printStackTrace(); - System.out.println("*** Problem initializing OpenCL"); - return null; - } - } - - private void kernelFunction(CLContext context, CLCommandQueue queue){ - //BELOW IS CODE TO TRY TO WORK WITH A KERNEL; KERNEL WILL NEED TO STUFF WITH TEXTURE - //THIS CODE IS FROM MY HelloWorld.java; - //needs to be passed the texture - - //Allocates memory for input buffers - CLMem aMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, a, null); - clEnqueueWriteBuffer(queue, aMem, 1, 0, a, null, null); - - CLMem bMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, b, null); - clEnqueueWriteBuffer(queue, bMem, 1, 0, b, null, null); - - //Allocates memory four output buffer - CLMem answerMem = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_COPY_HOST_PTR, answer, null); - clFinish(queue); - - //Creates the program using context & source - CLProgram program = clCreateProgramWithSource(context, source, null); - //Checks if there was an error in creation - Util.checkCLError(clBuildProgram(program, context.getInfoDevices().get(0), "", null)); - - //Creates the kernel; function name passed in must match kernel method in OCL source - //sum method is defined in String source used in creating the program - CLKernel kernel = clCreateKernel(program, "sum", null); - - //Execute the kernel - PointerBuffer kernel1DGlobalWorkSize = BufferUtils.createPointerBuffer(1); - kernel1DGlobalWorkSize.put(0, a.capacity()); - //Set arguments for the kernel; inputs & output - kernel.setArg(0, aMem); - kernel.setArg(1, bMem); - kernel.setArg(2, answerMem); - //Enqueue the kernel - clEnqueueNDRangeKernel(queue, kernel, 1, null, kernel1DGlobalWorkSize, null, null, null); - - //Read results from memory back into buffer - clEnqueueReadBuffer(queue, answerMem, 1, 0, answer, null, null); - clFinish(queue); - -// System.out.print(a); -// System.out.println("+"); -// System.out.print(b); -// System.out.println("="); -// System.out.print(answer); - - //END OF KERNEL WORK; PRINTS OUT ANSWER FROM FLOAT BUFFER WITH ANSWER - } - -// public CLMem createSharedMem(CLContext context, Texture texture) { -// // Create an OpenGL buffer -// int glBufId = GL15.glGenBuffers(); -// // Load the buffer with data using glBufferData(); -// // initialize buffer object -// -// GL15.glBindBuffer(GL_ARRAY_BUFFER, glBufId); -// -// //int size = (texture.getImageHeight() * texture.getImageWidth() * 4); -// GL15.glBufferData(GL_ARRAY_BUFFER, textureBuff, GL_DYNAMIC_DRAW); -// // Create the shared OpenCL memory object from the OpenGL buffer -// CLMem glMem = CL10GL.clCreateFromGLBuffer(context, CL10.CL_MEM_READ_WRITE, glBufId, null); -// -// return glMem; -// } -// -// public void useSharedMem(CLMem clmem, CLCommandQueue queue) { -// System.out.println("Acquiring mem lock"); -// // Acquire the lock for the 'glMem' memory object -// int error = CL10GL.clEnqueueAcquireGLObjects(queue, clmem, null, null); -// // Remember to check for errors -// if (error != CL10.CL_SUCCESS) { -// Util.checkCLError(error); -// } -// -// // Now execute an OpenCL command using the shared memory object, -// // such as uploading data to the memory object using 'CL10.clEnqueueWriteBuffer()' -// // or running a kernel using 'CL10.clEnqueueNDRangeKernel()' with the correct parameters -// // ... -// System.out.println("Doing Stuff"); -// // Release the lock on the 'glMem' memory object -// error = CL10GL.clEnqueueReleaseGLObjects(queue, clmem, null, null); -// if (error != CL10.CL_SUCCESS) { -// Util.checkCLError(error); -// } -// -// // Remember to flush the command queue when you are done. -// // Flushing the queue ensures that all of the OpenCL commands -// // sent to the queue have completed before the program continues. -// CL10.clFinish(queue); -// //System.out.println("Finished using CL & released shared mem"); -// } -} \ No newline at end of file From baa5d7b090febd209ab482b124f7a31fd33c677e Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Thu, 20 Jul 2017 16:58:46 -0400 Subject: [PATCH 05/17] trying demoFractal logic --- .../tutorial/clTexture/DemoFractal$1.class | Bin 0 -> 1260 bytes .../tutorial/clTexture/DemoFractal$2.class | Bin 0 -> 1112 bytes .../tutorial/clTexture/DemoFractal.class | Bin 0 -> 24567 bytes .../classes/tutorial/clTexture/Texture.class | Bin 7462 -> 10214 bytes nbproject/private/private.xml | 6 +- src/tutorial/clTexture/DemoFractal.java | 891 ++++++++++++++++++ src/tutorial/clTexture/Texture.java | 180 +++- 7 files changed, 1036 insertions(+), 41 deletions(-) create mode 100644 build/classes/tutorial/clTexture/DemoFractal$1.class create mode 100644 build/classes/tutorial/clTexture/DemoFractal$2.class create mode 100644 build/classes/tutorial/clTexture/DemoFractal.class create mode 100644 src/tutorial/clTexture/DemoFractal.java diff --git a/build/classes/tutorial/clTexture/DemoFractal$1.class b/build/classes/tutorial/clTexture/DemoFractal$1.class new file mode 100644 index 0000000000000000000000000000000000000000..17ee923520a7206c54b00d8489a29a790105a956 GIT binary patch literal 1260 zcmah|T~8B16g^W4OV?Ej3W~^wP^7fTf}lP?NX%BEanVEw54@1+GFg@^yUlhB{wQBe z{E838XMdFOOxsAcPbalSP~dWkAr$)MPSBF8)=*bGPJ#LPrXYUiLxu|G~Q06m&$O1*v%jc(k+3x;{U*l z`vO@fK2ichZV;*0jnk@1_GC4rXT*&?8SYC4quq99bs_@R%P3Nb6UusB(VYEHpu(!o zOM0HFr2;+>QV~0-H>j6Sqtp#AWT)V+5Pj+QMMS; z+>INFrwAr@zC);Goe9hSoTrcLLFDhK^f*2;@X*3CYzro?S+KBTVAaAStQlCh@EA`7 z#;>fNgCXnZPtcAibZqg#Y$;KdB z%{G_IS+kqvujt!Z`iSg%S}iV9?-!Hk7gJ5XnHI8xZw$A&zn||Nj3bkOM&`S1<~8ot uS>{URAL###feYf!BrU=TYLjL$(F}hNlg)Vw)10#`%6*J*WfE<0=JOk4OgTdU literal 0 HcmV?d00001 diff --git a/build/classes/tutorial/clTexture/DemoFractal$2.class b/build/classes/tutorial/clTexture/DemoFractal$2.class new file mode 100644 index 0000000000000000000000000000000000000000..ea575395fc9f3b5296d5ba30255451164f187510 GIT binary patch literal 1112 zcmah|4Nns>7=Fqo2gd=E4-r(HFm-IgA$~hUBF8W$2bydl8a1YDWgK=_a@Pa-S(*rm zCjJ0_l=1DhCv zcxIg;?Www881#cstR>A25motyq?sXK)wo>el#JreWZDQ}a9)O?h&;*TSWq~1PNLib z>FVF&VO@$<5y!ki{Dr)~&3CygdDw6(Its!@sXY@0%3a#mVkz0&6j8~jv_wRJO=V=A zSVekvqF|S6@v)5=J(Y*SuBarciIu?YFLR`9bB2?OP!4NS#iV3a=q**ZFza9rt^)`C z4hAr9;jV)P++!H~U&c}r$hwF~;XCiuTDAP9nq4hdD$ie(KV%(p{egprcx2(RgC}@O zR-Wx-Zh`8mqJ}H?wj0t_JA$;ip6{tplkXmva)Z}CF-)G#LkGf~2hS&D-ak%Ayvq^a zGyb-!oXVS8XO8S_Kh~njkWz_e=#-V*c}-?$@=WliIdOc4)YTbgPqB37gkPOP(ZU|B z+Qu`Cti$ylDSCm4uSoqs`t2bu40RvC zD$;j=o&)s$5>EC2FO;4;QdeoWANh0rNnrKk(nFiCwH*J*DfG_nb0 HQ%}zy&9xGu literal 0 HcmV?d00001 diff --git a/build/classes/tutorial/clTexture/DemoFractal.class b/build/classes/tutorial/clTexture/DemoFractal.class new file mode 100644 index 0000000000000000000000000000000000000000..ad87a733ab82cfc6847d320afa5d64a7a041ee08 GIT binary patch literal 24567 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 Y-Y{}D_ao;BFXB85zm==;Z?hf!A3VJbF#rGn literal 0 HcmV?d00001 diff --git a/build/classes/tutorial/clTexture/Texture.class b/build/classes/tutorial/clTexture/Texture.class index 4e5452e8fbd236261897a3c7b758634645417d4d..dd0fecea2e8ae9db9d622079aab2d8aab1b09dda 100644 GIT binary patch literal 10214 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 Li#hAbcE|q$=A7+o diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index 67ba32c..7b3a961 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -3,10 +3,8 @@ - file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/TextureMaker.java - file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Texture.java - file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/CLTextureMaker.java - file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/TextureDriver.java + file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Main.java + file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Image.java diff --git a/src/tutorial/clTexture/DemoFractal.java b/src/tutorial/clTexture/DemoFractal.java new file mode 100644 index 0000000..8526288 --- /dev/null +++ b/src/tutorial/clTexture/DemoFractal.java @@ -0,0 +1,891 @@ +/* + * Copyright (c) 2002-2010 LWJGL Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package tutorial.clTexture; + +import org.lwjgl.BufferUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.PointerBuffer; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opencl.*; +import org.lwjgl.opencl.api.Filter; +import org.lwjgl.opengl.*; +import org.lwjgl.util.Color; +import org.lwjgl.util.ReadableColor; + +import java.io.*; +import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static java.lang.Math.*; +import static org.lwjgl.opencl.CL10.*; +import static org.lwjgl.opencl.CL10GL.*; +import static org.lwjgl.opencl.KHRGLEvent.*; +import static org.lwjgl.opengl.AMDDebugOutput.*; +import static org.lwjgl.opengl.ARBCLEvent.*; +import static org.lwjgl.opengl.ARBDebugOutput.*; +import static org.lwjgl.opengl.ARBSync.*; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL15.*; +import static org.lwjgl.opengl.GL20.*; +import static org.lwjgl.opengl.GL21.*; + +/* + THIS DEMO USES CODE PORTED FROM JogAmp.org + Original code: http://github.com/mbien/jocl-demos + Original author: Michael Bien + ___ ___ ___ + / /\ / /\ ___ / /\ http://jocl.jogamp.org/ + / /:/ / /::\ /__/\ / /::\ a http://jogamp.org/ project. + /__/::\ / /:/\:\ \ \:\ / /:/\:\ + \__\/\:\ / /:/~/::\ \ \:\ / /:/~/::\ + \ \:\ /__/:/ /:/\:\ ___ \__\:\/__/:/ /:/\:\ + \__\:\\ \:\/:/__\//__/\ | |:|\ \:\/:/__\/ + / /:/ \ \::/ \ \:\| |:| \ \::/ + /__/:/ \ \:\ \ \:\__|:| \ \:\ + \__\/ \ \:\ \__\::::/ \ \:\ + \__\/ ~~~~ \__\/ + ___ ___ ___ ___ ___ + / /\ / /\ / /\ /__/\ / /\ + / /::\ / /::\ / /:/_ \ \:\ / /:/ + / /:/\:\ / /:/\:\ / /:/ /\ \ \:\ / /:/ ___ ___ + / /:/ \:\ / /:/~/:// /:/ /:/_ _____\__\:\ / /:/ ___ /__/\ / /\ + /__/:/ \__\:\/__/:/ /://__/:/ /:/ /\/__/::::::::\/__/:/ / /\\ \:\ / /:/ + \ \:\ / /:/\ \:\/:/ \ \:\/:/ /:/\ \:\~~\~~\/\ \:\ / /:/ \ \:\ /:/ + \ \:\ /:/ \ \::/ \ \::/ /:/ \ \:\ ~~~ \ \:\ /:/ \ \:\/:/ + \ \:\/:/ \ \:\ \ \:\/:/ \ \:\ \ \:\/:/ \ \::/ + \ \::/ \ \:\ \ \::/ \ \:\ \ \::/ \__\/ + \__\/ \__\/ \__\/ \__\/ \__\/ + _____ ___ ___ ___ ___ + / /::\ / /\ /__/\ / /\ / /\ + / /:/\:\ / /:/_ | |::\ / /::\ / /:/_ + / /:/ \:\ / /:/ /\ | |:|:\ / /:/\:\ / /:/ /\ + /__/:/ \__\:| / /:/ /:/_ __|__|:|\:\ / /:/ \:\ / /:/ /::\ + \ \:\ / /:/ /__/:/ /:/ /\ /__/::::| \:\ /__/:/ \__\:\ /__/:/ /:/\:\ + \ \:\ /:/ \ \:\/:/ /:/ \ \:\~~\__\/ \ \:\ / /:/ \ \:\/:/~/:/ + \ \:\/:/ \ \::/ /:/ \ \:\ \ \:\ /:/ \ \::/ /:/ + \ \::/ \ \:\/:/ \ \:\ \ \:\/:/ \__\/ /:/ + \__\/ \ \::/ \ \:\ \ \::/ /__/:/ + \__\/ \__\/ \__\/ \__\/ +*/ + +/** + * Computes the Mandelbrot set with OpenCL using multiple GPUs and renders the result with OpenGL. + * A shared PBO is used as storage for the fractal image.
+ * http://en.wikipedia.org/wiki/Mandelbrot_set + *

+ * controls:
+ * keys 1-9 control parallelism level
+ * space enables/disables slice seperator
+ * 'd' toggles between 32/64bit floatingpoint precision
+ * mouse/mousewheel to drag and zoom
+ * 'Home' to reset the viewport
+ *

+ * + * @author Michael Bien, Spasi + */ +public class DemoFractal { + + // max number of used GPUs + private static final int MAX_PARALLELISM_LEVEL = 8; + + private static final int COLOR_MAP_SIZE = 32 * 2 * 4; + + private Set params; + + private CLContext clContext; + private CLCommandQueue[] queues; + private CLKernel[] kernels; + private CLProgram[] programs; + + private CLMem[] glBuffers; + private IntBuffer glIDs; + + private boolean useTextures; + + // Texture rendering + private int dlist; + private int vsh; + private int fsh; + private int program; + + private CLMem[] colorMap; + + private final PointerBuffer kernel2DGlobalWorkSize; + + // max per pixel iterations to compute the fractal + private int maxIterations = 500; + + private int width = 512; + private int height = 512; + + private double minX = -2f; + private double minY = -1.2f; + private double maxX = 0.6f; + private double maxY = 1.3f; + + private boolean dragging; + private double dragX; + private double dragY; + private double dragMinX; + private double dragMinY; + private double dragMaxX; + private double dragMaxY; + + private int mouseX; + private int mouseY; + + private int slices; + + private boolean drawSeparator; + private boolean doublePrecision = true; + private boolean buffersInitialized; + private boolean rebuild; + + private boolean run = true; + + // EVENT SYNCING + + private final PointerBuffer syncBuffer = BufferUtils.createPointerBuffer(1); + + private boolean syncGLtoCL; // true if we can make GL wait on events generated from CL queues. + private CLEvent[] clEvents; + private GLSync[] clSyncs; + + private boolean syncCLtoGL; // true if we can make CL wait on sync objects generated from GL. + private GLSync glSync; + private CLEvent glEvent; + + public DemoFractal(final String[] args) { + params = new HashSet(); + + for ( int i = 0; i < args.length; i++ ) { + final String arg = args[i]; + + if ( arg.charAt(0) != '-' && arg.charAt(0) != '/' ) + throw new IllegalArgumentException("Invalid command-line argument: " + args[i]); + + final String param = arg.substring(1); + + if ( "forcePBO".equalsIgnoreCase(param) ) + params.add("forcePBO"); + else if ( "forceCPU".equalsIgnoreCase(param) ) + params.add("forceCPU"); + else if ( "debugGL".equalsIgnoreCase(param) ) + params.add("debugGL"); + else if ( "iterations".equalsIgnoreCase(param) ) { + if ( args.length < i + 1 + 1 ) + throw new IllegalArgumentException("Invalid iterations argument specified."); + + try { + this.maxIterations = Integer.parseInt(args[++i]); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid number of iterations specified."); + } + } else if ( "res".equalsIgnoreCase(param) ) { + if ( args.length < i + 2 + 1 ) + throw new IllegalArgumentException("Invalid res argument specified."); + + try { + this.width = Integer.parseInt(args[++i]); + this.height = Integer.parseInt(args[++i]); + + if ( width < 1 || height < 1 ) + throw new IllegalArgumentException("Invalid res dimensions specified."); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid res dimensions specified."); + } + } + } + + kernel2DGlobalWorkSize = BufferUtils.createPointerBuffer(2); + } + + public static void main(String args[]) { + DemoFractal demo = new DemoFractal(args); + demo.init(); + demo.run(); + } + + public void init() { + try { + CL.create(); + Display.setDisplayMode(new DisplayMode(width, height)); + Display.setTitle("OpenCL Fractal Demo"); + Display.setSwapInterval(0); + Display.create(new PixelFormat(), new ContextAttribs().withDebug(params.contains("debugGL"))); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + + try { + initCL(Display.getDrawable()); + } catch (Exception e) { + if ( clContext != null ) + clReleaseContext(clContext); + Display.destroy(); + throw new RuntimeException(e); + } + + glDisable(GL_DEPTH_TEST); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + initView(Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); + + initGLObjects(); + glFinish(); + + setKernelConstants(); + } + + private void initCL(Drawable drawable) throws Exception { + // Find a platform + List platforms = CLPlatform.getPlatforms(); + if ( platforms == null ) + throw new RuntimeException("No OpenCL platforms found."); + + final CLPlatform platform = platforms.get(0); // just grab the first one + + // Find devices with GL sharing support + final Filter glSharingFilter = new Filter() { + public boolean accept(final CLDevice device) { + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + return caps.CL_KHR_gl_sharing; + } + }; + int device_type = params.contains("forceCPU") ? CL_DEVICE_TYPE_CPU : CL_DEVICE_TYPE_GPU; + List devices = platform.getDevices(device_type, glSharingFilter); + if ( devices == null ) { + device_type = CL_DEVICE_TYPE_CPU; + devices = platform.getDevices(device_type, glSharingFilter); + if ( devices == null ) + throw new RuntimeException("No OpenCL devices found with KHR_gl_sharing support."); + } + + // Create the context + clContext = CLContext.create(platform, devices, new CLContextCallback() { + protected void handleMessage(final String errinfo, final ByteBuffer private_info) { + System.out.println("[CONTEXT MESSAGE] " + errinfo); + } + }, drawable, null); + + slices = min(devices.size(), MAX_PARALLELISM_LEVEL); + + // create command queues for every GPU, setup colormap and init kernels + queues = new CLCommandQueue[slices]; + kernels = new CLKernel[slices]; + colorMap = new CLMem[slices]; + + for ( int i = 0; i < slices; i++ ) { + colorMap[i] = clCreateBuffer(clContext, CL_MEM_READ_ONLY, COLOR_MAP_SIZE, null); + colorMap[i].checkValid(); + + // create command queue and upload color map buffer on each used device + queues[i] = clCreateCommandQueue(clContext, devices.get(i), CL_QUEUE_PROFILING_ENABLE, null); + queues[i].checkValid(); + + final ByteBuffer colorMapBuffer = clEnqueueMapBuffer(queues[i], colorMap[i], CL_TRUE, CL_MAP_WRITE, 0, COLOR_MAP_SIZE, null, null, null); + initColorMap(colorMapBuffer.asIntBuffer(), 32, Color.BLUE, Color.GREEN, Color.RED); + clEnqueueUnmapMemObject(queues[i], colorMap[i], colorMapBuffer, null, null); + } + + // check if we have 64bit FP support on all devices + // if yes we can use only one program for all devices + one kernel per device. + // if not we will have to create (at least) one program for 32 and one for 64bit devices. + // since there are different vendor extensions for double FP we use one program per device. + // (OpenCL spec is not very clear about this usecases) + boolean all64bit = true; + for ( CLDevice device : devices ) { + if ( !isDoubleFPAvailable(device) ) { + all64bit = false; + break; + } + } + + // load program(s) + programs = new CLProgram[all64bit ? 1 : slices]; + + final ContextCapabilities caps = GLContext.getCapabilities(); + + if ( !caps.OpenGL20 ) + throw new RuntimeException("OpenGL 2.0 is required to run this demo."); + else if ( device_type == CL_DEVICE_TYPE_CPU && !caps.OpenGL21 ) + throw new RuntimeException("OpenGL 2.1 is required to run this demo."); + + if ( params.contains("debugGL") ) { + if ( caps.GL_ARB_debug_output ) + glDebugMessageCallbackARB(new ARBDebugOutputCallback()); + else if ( caps.GL_AMD_debug_output ) + glDebugMessageCallbackAMD(new AMDDebugOutputCallback()); + } + + if ( device_type == CL_DEVICE_TYPE_GPU ) + System.out.println("OpenCL Device Type: GPU (Use -forceCPU to use CPU)"); + else + System.out.println("OpenCL Device Type: CPU"); + for ( int i = 0; i < devices.size(); i++ ) + System.out.println("OpenCL Device #" + (i + 1) + " supports KHR_gl_event = " + CLCapabilities.getDeviceCapabilities(devices.get(i)).CL_KHR_gl_event); + + System.out.println("\nMax Iterations: " + maxIterations + " (Use -iterations to change)"); + System.out.println("Display resolution: " + width + "x" + height + " (Use -res to change)"); + + System.out.println("\nOpenGL caps.GL_ARB_sync = " + caps.GL_ARB_sync); + System.out.println("OpenGL caps.GL_ARB_cl_event = " + caps.GL_ARB_cl_event); + + // Use PBO if we're on a CPU implementation + useTextures = device_type == CL_DEVICE_TYPE_GPU && (!caps.OpenGL21 || !params.contains("forcePBO")); + if ( useTextures ) { + System.out.println("\nCL/GL Sharing method: TEXTURES (use -forcePBO to use PBO + DrawPixels)"); + System.out.println("Rendering method: Shader on a fullscreen quad"); + } else { + System.out.println("\nCL/GL Sharing method: PIXEL BUFFER OBJECTS"); + System.out.println("Rendering method: DrawPixels"); + } + + buildPrograms(); + + // Detect GLtoCL synchronization method + syncGLtoCL = caps.GL_ARB_cl_event; // GL3.2 or ARB_sync implied + if ( syncGLtoCL ) { + clEvents = new CLEvent[slices]; + clSyncs = new GLSync[slices]; + System.out.println("\nGL to CL sync: Using OpenCL events"); + } else + System.out.println("\nGL to CL sync: Using clFinish"); + + // Detect CLtoGL synchronization method + syncCLtoGL = caps.OpenGL32 || caps.GL_ARB_sync; + if ( syncCLtoGL ) { + for ( CLDevice device : devices ) { + if ( !CLCapabilities.getDeviceCapabilities(device).CL_KHR_gl_event ) { + syncCLtoGL = false; + break; + } + } + } + if ( syncCLtoGL ) { + System.out.println("CL to GL sync: Using OpenGL sync objects"); + } else + System.out.println("CL to GL sync: Using glFinish"); + + if ( useTextures ) { + dlist = glGenLists(1); + + glNewList(dlist, GL_COMPILE); + glBegin(GL_QUADS); + { + glTexCoord2f(0.0f, 0.0f); + glVertex2f(0, 0); + + glTexCoord2f(0.0f, 1.0f); + glVertex2i(0, height); + + glTexCoord2f(1.0f, 1.0f); + glVertex2f(width, height); + + glTexCoord2f(1.0f, 0.0f); + glVertex2f(width, 0); + } + glEnd(); + glEndList(); + + vsh = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vsh, "varying vec2 texCoord;\n" + + "\n" + + "void main(void) {\n" + + "\tgl_Position = ftransform();\n" + + "\ttexCoord = gl_MultiTexCoord0.xy;\n" + + "}"); + glCompileShader(vsh); + + fsh = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fsh, "uniform sampler2D mandelbrot;\n" + + "\n" + + "varying vec2 texCoord;\n" + + "\n" + + "void main(void) {\n" + + "\tgl_FragColor = texture2D(mandelbrot, texCoord);" + + "}"); + glCompileShader(fsh); + + program = glCreateProgram(); + glAttachShader(program, vsh); + glAttachShader(program, fsh); + glLinkProgram(program); + + glUseProgram(program); + glUniform1i(glGetUniformLocation(program, "mandelbrot"), 0); + } + + System.out.println(""); + } + + private void buildPrograms() { + /* + * workaround: The driver keeps using the old binaries for some reason. + * to solve this we simple create a new program and release the old. + * however rebuilding programs should be possible -> remove when drivers are fixed. + * (again: the spec is not very clear about this kind of usages) + */ + if ( programs[0] != null ) { + for ( CLProgram program : programs ) + clReleaseProgram(program); + } + + try { + createPrograms(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + // disable 64bit floating point math if not available + for ( int i = 0; i < programs.length; i++ ) { + final CLDevice device = queues[i].getCLDevice(); + + final StringBuilder options = new StringBuilder(useTextures ? "-D USE_TEXTURE" : ""); + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + if ( doublePrecision && isDoubleFPAvailable(device) ) { + //cl_khr_fp64 + options.append(" -D DOUBLE_FP"); + + //amd's verson of double precision floating point math + if ( !caps.CL_KHR_fp64 && caps.CL_AMD_fp64 ) + options.append(" -D AMD_FP"); + } + + System.out.println("\nOpenCL COMPILER OPTIONS: " + options); + + try { + clBuildProgram(programs[i], device, options, null); + } finally { + System.out.println("BUILD LOG: " + programs[i].getBuildInfoString(device, CL_PROGRAM_BUILD_LOG)); + } + } + + rebuild = false; + + // init kernel with constants + for ( int i = 0; i < kernels.length; i++ ) + kernels[i] = clCreateKernel(programs[min(i, programs.length)], "mandelbrot", null); + } + + private void initGLObjects() { + if ( glBuffers == null ) { + glBuffers = new CLMem[slices]; + glIDs = BufferUtils.createIntBuffer(slices); + } else { + for ( CLMem mem : glBuffers ) + clReleaseMemObject(mem); + + if ( useTextures ) + glDeleteTextures(glIDs); + else + glDeleteBuffers(glIDs); + } + + if ( useTextures ) { + glGenTextures(glIDs); + + // Init textures + for ( int i = 0; i < slices; i++ ) { + glBindTexture(GL_TEXTURE_2D, glIDs.get(i)); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width / slices, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer)null); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glBuffers[i] = clCreateFromGLTexture2D(clContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, glIDs.get(i), null); + } + glBindTexture(GL_TEXTURE_2D, 0); + } else { + glGenBuffers(glIDs); + + // setup one empty PBO per slice + for ( int i = 0; i < slices; i++ ) { + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glIDs.get(i)); + glBufferData(GL_PIXEL_UNPACK_BUFFER, width * height * 4 / slices, GL_STREAM_DRAW); + + glBuffers[i] = clCreateFromGLBuffer(clContext, CL_MEM_WRITE_ONLY, glIDs.get(i), null); + } + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); + } + + buffersInitialized = true; + } + + // init kernels with constants + + private void setKernelConstants() { + for ( int i = 0; i < slices; i++ ) { + kernels[i] + .setArg(6, glBuffers[i]) + .setArg(7, colorMap[i]) + .setArg(8, COLOR_MAP_SIZE) + .setArg(9, maxIterations); + } + } + + // rendering cycle + + private void run() { + long startTime = System.currentTimeMillis() + 5000; + long fps = 0; + + while ( run ) { + if ( !Display.isVisible() ) + Thread.yield(); + + handleIO(); + display(); + + Display.update(); + if ( Display.isCloseRequested() ) + break; + + if ( startTime > System.currentTimeMillis() ) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println(fps + " frames in 5 seconds = " + (fps / (timeUsed / 1000f))); + fps = 0; + } + } + + clReleaseContext(clContext); + + if ( useTextures ) { + glDeleteProgram(program); + glDeleteShader(fsh); + glDeleteShader(vsh); + + glDeleteLists(dlist, 1); + } + + CL.destroy(); + Display.destroy(); + } + + public void display() { + // TODO: Need to clean-up events, test when ARB_cl_events & KHR_gl_event are implemented. + + // make sure GL does not use our objects before we start computing + if ( syncCLtoGL && glEvent != null ) { + for ( final CLCommandQueue queue : queues ) + clEnqueueWaitForEvents(queue, glEvent); + } else + glFinish(); + + if ( !buffersInitialized ) { + initGLObjects(); + setKernelConstants(); + } + + if ( rebuild ) { + buildPrograms(); + setKernelConstants(); + } + compute(doublePrecision); + + render(); + } + + // OpenCL + + private void compute(final boolean is64bit) { + int sliceWidth = (int)(width / (float)slices); + double rangeX = (maxX - minX) / slices; + double rangeY = (maxY - minY); + + kernel2DGlobalWorkSize.put(0, sliceWidth).put(1, height); + + // start computation + for ( int i = 0; i < slices; i++ ) { + kernels[i].setArg(0, sliceWidth).setArg(1, height); + if ( !is64bit || !isDoubleFPAvailable(queues[i].getCLDevice()) ) { + kernels[i] + .setArg(2, (float)(minX + rangeX * i)).setArg(3, (float)minY) + .setArg(4, (float)rangeX).setArg(5, (float)rangeY); + } else { + kernels[i] + .setArg(2, minX + rangeX * i).setArg(3, minY) + .setArg(4, rangeX).setArg(5, rangeY); + } + + // acquire GL objects, and enqueue a kernel with a probe from the list + clEnqueueAcquireGLObjects(queues[i], glBuffers[i], null, null); + + clEnqueueNDRangeKernel(queues[i], kernels[i], 2, + null, + kernel2DGlobalWorkSize, + null, + null, null); + + clEnqueueReleaseGLObjects(queues[i], glBuffers[i], null, syncGLtoCL ? syncBuffer : null); + if ( syncGLtoCL ) { + clEvents[i] = queues[i].getCLEvent(syncBuffer.get(0)); + clSyncs[i] = glCreateSyncFromCLeventARB(queues[i].getParent(), clEvents[i], 0); + } + } + + // block until done (important: finish before doing further gl work) + if ( !syncGLtoCL ) { + for ( int i = 0; i < slices; i++ ) + clFinish(queues[i]); + } + } + + // OpenGL + + private void render() { + glClear(GL_COLOR_BUFFER_BIT); + + if ( syncGLtoCL ) { + for ( int i = 0; i < slices; i++ ) + glWaitSync(clSyncs[i], 0, 0); + } + + //draw slices + int sliceWidth = width / slices; + + if ( useTextures ) { + for ( int i = 0; i < slices; i++ ) { + int seperatorOffset = drawSeparator ? i : 0; + + glBindTexture(GL_TEXTURE_2D, glIDs.get(i)); + glCallList(dlist); + } + } else { + for ( int i = 0; i < slices; i++ ) { + int seperatorOffset = drawSeparator ? i : 0; + + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glIDs.get(i)); + glRasterPos2i(sliceWidth * i + seperatorOffset, 0); + + glDrawPixels(sliceWidth, height, GL_RGBA, GL_UNSIGNED_BYTE, 0); + } + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); + } + + if ( syncCLtoGL ) { + glSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + glEvent = clCreateEventFromGLsyncKHR(clContext, glSync, null); + } + + //draw info text + /* + textRenderer.beginRendering(width, height, false); + textRenderer.draw("device/time/precision", 10, height - 15); + for ( int i = 0; i < slices; i++ ) { + CLDevice device = queues[i].getDevice(); + boolean doubleFP = doublePrecision && isDoubleFPAvailable(device); + CLEvent event = probes.getEvent(i); + long start = event.getProfilingInfo(START); + long end = event.getProfilingInfo(END); + textRenderer.draw(device.getType().toString() + i + " " + + (int)((end - start) / 1000000.0f) + "ms @" + + (doubleFP ? "64bit" : "32bit"), 10, height - (20 + 16 * (slices - i))); + } + textRenderer.endRendering(); + */ + } + + private void handleIO() { + if ( Keyboard.getNumKeyboardEvents() != 0 ) { + while ( Keyboard.next() ) { + if ( Keyboard.getEventKeyState() ) + continue; + + final int key = Keyboard.getEventKey(); + + if ( Keyboard.KEY_1 <= key && key <= Keyboard.KEY_8 ) { + int number = key - Keyboard.KEY_1 + 1; + slices = min(number, min(queues.length, MAX_PARALLELISM_LEVEL)); + System.out.println("NEW PARALLELISM LEVEL: " + slices); + buffersInitialized = false; + } else { + switch ( Keyboard.getEventKey() ) { + case Keyboard.KEY_SPACE: + drawSeparator = !drawSeparator; + System.out.println("SEPARATOR DRAWING IS NOW: " + (drawSeparator ? "ON" : "OFF")); + break; + case Keyboard.KEY_D: + doublePrecision = !doublePrecision; + System.out.println("DOUBLE PRECISION IS NOW: " + (doublePrecision ? "ON" : "OFF")); + rebuild = true; + break; + case Keyboard.KEY_HOME: + minX = -2f; + minY = -1.2f; + maxX = 0.6f; + maxY = 1.3f; + break; + case Keyboard.KEY_ESCAPE: + run = false; + break; + } + } + } + } + + while ( Mouse.next() ) { + final int eventBtn = Mouse.getEventButton(); + + final int x = Mouse.getX(); + final int y = Mouse.getY(); + + if ( Mouse.isButtonDown(0) && (x != mouseX || y != mouseY) ) { + if ( !dragging ) { + dragging = true; + + dragX = mouseX; + dragY = mouseY; + + dragMinX = minX; + dragMinY = minY; + dragMaxX = maxX; + dragMaxY = maxY; + } + + double offsetX = (x - dragX) * (maxX - minX) / width; + double offsetY = (y - dragY) * (maxY - minY) / height; + + minX = dragMinX - offsetX; + minY = dragMinY - offsetY; + + maxX = dragMaxX - offsetX; + maxY = dragMaxY - offsetY; + } else { + if ( dragging ) + dragging = false; + + if ( eventBtn == -1 ) { + final int dwheel = Mouse.getEventDWheel(); + if ( dwheel != 0 ) { + double scaleFactor = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) ? 0.25 : 0.05; + double scale = dwheel > 0 ? scaleFactor : -scaleFactor; + + double deltaX = scale * (maxX - minX); + double deltaY = scale * (maxY - minY); + + // offset for "zoom to cursor" + double offsetX = (x / (double)width - 0.5) * deltaX * 2.0; + double offsetY = (y / (double)height - 0.5) * deltaY * 2.0; + + minX += deltaX + offsetX; + minY += deltaY - offsetY; + + maxX += -deltaX + offsetX; + maxY += -deltaY - offsetY; + } + } + } + + mouseX = x; + mouseY = y; + } + } + + private static boolean isDoubleFPAvailable(CLDevice device) { + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + return caps.CL_KHR_fp64 || caps.CL_AMD_fp64; + } + + private void createPrograms() throws IOException { + final String source = getProgramSource("org/lwjgl/test/opencl/gl/Mandelbrot.cl"); + for ( int i = 0; i < programs.length; i++ ) + programs[i] = clCreateProgramWithSource(clContext, source, null); + } + + private String getProgramSource(final String file) throws IOException { + InputStream source = null; + URL sourceURL = Thread.currentThread().getContextClassLoader().getResource(file); + if(sourceURL != null) { + source = sourceURL.openStream(); + } + if ( source == null ) // dev-mode + source = new FileInputStream("src/java/" + file); + final BufferedReader reader = new BufferedReader(new InputStreamReader(source)); + + final StringBuilder sb = new StringBuilder(); + String line; + try { + while ( (line = reader.readLine()) != null ) + sb.append(line).append("\n"); + } finally { + source.close(); + } + + return sb.toString(); + } + + private static void initColorMap(IntBuffer colorMap, int stepSize, ReadableColor... colors) { + for ( int n = 0; n < colors.length - 1; n++ ) { + ReadableColor color = colors[n]; + int r0 = color.getRed(); + int g0 = color.getGreen(); + int b0 = color.getBlue(); + + color = colors[n + 1]; + int r1 = color.getRed(); + int g1 = color.getGreen(); + int b1 = color.getBlue(); + + int deltaR = r1 - r0; + int deltaG = g1 - g0; + int deltaB = b1 - b0; + + for ( int step = 0; step < stepSize; step++ ) { + float alpha = (float)step / (stepSize - 1); + int r = (int)(r0 + alpha * deltaR); + int g = (int)(g0 + alpha * deltaG); + int b = (int)(b0 + alpha * deltaB); + colorMap.put((r << 0) | (g << 8) | (b << 16)); + } + } + } + + private static void initView(int width, int height) { + glViewport(0, 0, width, height); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0, width, 0.0, height, 0.0, 1.0); + } + +} \ No newline at end of file diff --git a/src/tutorial/clTexture/Texture.java b/src/tutorial/clTexture/Texture.java index e3069a1..bc02008 100644 --- a/src/tutorial/clTexture/Texture.java +++ b/src/tutorial/clTexture/Texture.java @@ -5,9 +5,13 @@ */ package tutorial.clTexture; +import java.awt.Color; +import static java.lang.Math.min; import java.nio.FloatBuffer; import java.nio.ByteBuffer; +import java.nio.IntBuffer; import java.util.List; +import java.util.Set; import org.lwjgl.BufferUtils; import org.lwjgl.LWJGLException; @@ -30,9 +34,12 @@ import org.lwjgl.opencl.CL; import org.lwjgl.opencl.CL10; +import static org.lwjgl.opencl.CL10.CL_MAP_WRITE; import static org.lwjgl.opencl.CL10.CL_MEM_COPY_HOST_PTR; import static org.lwjgl.opencl.CL10.CL_MEM_READ_ONLY; import static org.lwjgl.opencl.CL10.CL_MEM_WRITE_ONLY; +import static org.lwjgl.opencl.CL10.CL_QUEUE_PROFILING_ENABLE; +import static org.lwjgl.opencl.CL10.CL_TRUE; import static org.lwjgl.opencl.CL10.clBuildProgram; import static org.lwjgl.opencl.CL10.clCreateBuffer; import static org.lwjgl.opencl.CL10.clCreateKernel; @@ -42,14 +49,24 @@ import static org.lwjgl.opencl.CL10.clEnqueueWriteBuffer; import static org.lwjgl.opencl.CL10.clFinish; import org.lwjgl.opencl.CL10GL; +import org.lwjgl.opencl.CLCapabilities; import org.lwjgl.opencl.CLCommandQueue; import org.lwjgl.opencl.CLContext; import org.lwjgl.opencl.CLDevice; +import org.lwjgl.opencl.CLDeviceCapabilities; +import org.lwjgl.opencl.CLEvent; import org.lwjgl.opencl.CLKernel; import org.lwjgl.opencl.CLMem; import org.lwjgl.opencl.CLPlatform; import org.lwjgl.opencl.CLProgram; import org.lwjgl.opencl.Util; +import org.lwjgl.opencl.api.Filter; +import org.lwjgl.opengl.ContextCapabilities; +import static org.lwjgl.opengl.GL11.GL_COMPILE; +import static org.lwjgl.opengl.GL11.glGenLists; +import static org.lwjgl.opengl.GL11.glNewList; +import org.lwjgl.opengl.GLContext; +import org.lwjgl.opengl.GLSync; import static tutorial.clTexture.Main.toFloatBuffer; @@ -61,21 +78,54 @@ public class Texture { private final int width, height, target, id; private final Image image; + //KERNEL EXAMPLE VARIABLES static final String source = "kernel void sum(global const float *a, global const float *b, global float *answer)" + "{ unsigned int xid = get_global_id(0); answer[xid] = a[xid] + b[xid];}"; - static final String kernel - = "kernel void imgTest()" - + "{ //Do stuff here }"; static final FloatBuffer a = toFloatBuffer(new float[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); static final FloatBuffer b = toFloatBuffer(new float[]{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}); static final FloatBuffer answer = BufferUtils.createFloatBuffer(a.capacity()); + //TRYING TO WORK WITH BUFFERS public ByteBuffer buf, ptrbufs; - public PointerBuffer pointers; - + public PointerBuffer pointers, ptrbuff; - static PointerBuffer ptrbuff; + //MY KERNEL FUNCTION FROM TEXTBOOK PG + static final String kernel + = "kernel void imgTest(read_only image2d_t srcImage, write_only image2d_t finalImage){\n" + + " constant sampler_t sampler = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;\n" + + " uint offset get_global_id(1) * 0x4000 + get_global_id(0)*0x1000;\n" + + " int2 coord = (int2)(get_global_id(0), get_global_id(1));\n" + + " uint4 pixel = read_imageui(srcImage, sampler, coord);\n" + + " pixel.x -= offset;\n" + + " write_imageui(finalImage, coord, pixel);\n" + + "}"; + + //VARS FOR CL CONVERSION + private static final int MAX_GPUS = 8; //Max GPUs used at once + private CLContext clContext; //CL context + private CLCommandQueue[] queues; //array of cl command queues + private CLKernel[] kernels; //array of cl kernels for + private CLProgram[] programs; //array of cl programs for + private CLMem[] glBuffers; //array of clm for + private CLMem[] colorMap; //array of cl color maps for + private IntBuffer glIDs; //int buffer for + private boolean useTextures; //for something... + private final PointerBuffer kernel2DGlobalWorkSize = BufferUtils.createPointerBuffer(2); //the global work size of the kernel + private int slices; //dividing up the image for faster processing + private boolean drawSeparator; //no idea what this is + private boolean doublePrecision = true; //doubles used instead of floats + private boolean buffersInitialized; //buffers for something initialized + private boolean rebuild; //boolean for rerendering + private boolean run = true; //boolena for running the program + private final PointerBuffer syncBuffer = BufferUtils.createPointerBuffer(1); //buffer for dealing with gl cl sync + private boolean syncGLtoCL; // true if we can make GL wait on events generated from CL queues. + private boolean syncCLtoGL; // true if we can make CL wait on sync objects generated from GL. + private CLEvent[] clEvents; //array of cl events for + private CLEvent glEvent; //cl event + private GLSync[] clSyncs; //array of gl sync objects for + private GLSync glSync; //glsync so that cl & gl dont cause race condition + private int deviceType = CL10.CL_DEVICE_TYPE_GPU; public Texture(Image image, int target, int id) { this.image = image; @@ -84,26 +134,6 @@ public Texture(Image image, int target, int id) { this.target = target; this.id = id; - //byte[] bytes = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - buf = ByteBuffer.allocateDirect(16); - buf.put(0, ) - - // Create a direct (memory-mapped) ByteBuffer with a 10 byte capacity. - // buf = ByteBuffer.wrap(bytes); - pointers = new PointerBuffer(buf); - - byte[] ptrs = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - ByteBuffer ptrbufs = ByteBuffer.allocateDirect(10); - // Create a direct (memory-mapped) ByteBuffer with a 10 byte capacity. - ptrbufs = ByteBuffer.wrap(ptrs); -// // Get the ByteBuffer's capacity - int capacity = buf.capacity(); // 10 - - System.out.println(capacity); - - - - // bind this texture GL11.glBindTexture(target, id); @@ -119,16 +149,29 @@ public void convertToCL() { try { CLContext context = createCLContext(); + queues = new CLCommandQueue[slices]; + kernels = new CLKernel[slices]; + // Create an command queue using our OpenCL context and the first device in our list of devices - CLCommandQueue queue = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(0), CL10.CL_QUEUE_PROFILING_ENABLE, null); + for (int i = 0; i < slices; i++) { + colorMap[i] = clCreateBuffer(clContext, CL_MEM_READ_ONLY, 256, null); + colorMap[i].checkValid(); + + // create command queue and upload color map buffer on each used device + queues[i] = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(i), CL_QUEUE_PROFILING_ENABLE, null); + queues[i].checkValid(); + + CL10.clEnqueueUnmapMemObject(queues[i], colorMap[i], null, null, null); + } + //CLCommandQueue queue = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(0), CL10.CL_QUEUE_PROFILING_ENABLE, null); System.out.println("Command Queue created"); CLMem mem = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_READ_ONLY, target, 0, id, null); + CLMem mem2 = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_WRITE_ONLY, target, 0, id, null); - System.out.println(CL10.clGetImageInfo(mem, CL10.CL_IMAGE_WIDTH, buf, pointers)); GL11.glFinish(); - kernelFunction(context, queue); + kernelFunction(context, queues); } catch (Exception e) { System.out.println("*** Problem creating CL texture"); e.printStackTrace(); @@ -149,14 +192,29 @@ private CLContext createCLContext() { CLPlatform platform = CLPlatform.getPlatforms().get(0); System.out.println("Platform created"); + final Filter glSharingFilter; + glSharingFilter = (final CLDevice device) -> { + final CLDeviceCapabilities abilities = CLCapabilities.getDeviceCapabilities(device); + return abilities.CL_KHR_gl_sharing; + }; + // List of LJWGL CLDevice objects representing hardware or software contexts that OpenCL can use List devices = platform.getDevices(CL10.CL_DEVICE_TYPE_GPU); + if (devices == null) { + deviceType = CL10.CL_DEVICE_TYPE_CPU; + devices = platform.getDevices(CL10.CL_DEVICE_TYPE_CPU, glSharingFilter); + if (devices == null) { + throw new RuntimeException("No OpenCL devices found with KHR_gl_sharing support."); + } + } System.out.println("Devices obtained"); // Create the OpenCL context using the patform, devices, and the OpenGL drawable CLContext context = CLContext.create(platform, devices, null, drawable, null); System.out.println("Context created"); + slices = min(devices.size(), MAX_GPUS); + return context; } catch (LWJGLException e) { @@ -166,11 +224,12 @@ private CLContext createCLContext() { } } - private void kernelFunction(CLContext context, CLCommandQueue queue) { + private void kernelFunction(CLContext context, CLCommandQueue[] queues) { //BELOW IS CODE TO TRY TO WORK WITH A KERNEL; KERNEL WILL NEED TO STUFF WITH TEXTURE //THIS CODE IS FROM MY HelloWorld.java //needs to be passed the texture + /* //Allocates memory for input buffers CLMem aMem = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, a, null); clEnqueueWriteBuffer(queue, aMem, 1, 0, a, null, null); @@ -183,21 +242,21 @@ private void kernelFunction(CLContext context, CLCommandQueue queue) { clFinish(queue); //Creates the program using context & source - CLProgram program = clCreateProgramWithSource(context, source, null); - //Checks if there was an error in creation - Util.checkCLError(clBuildProgram(program, context.getInfoDevices().get(0), "", null)); - - //Creates the kernel; function name passed in must match kernel method in OCL source - //sum method is defined in String source used in creating the program - CLKernel kernel = clCreateKernel(program, "sum", null); + CLProgram program = clCreateProgramWithSource(context, kernel, null); + + //Creates the kernel; function name passed in must match kernel method + //in OCL sourcesum method is defined in String source used in creating the program + CLKernel kernel = clCreateKernel(program, "imgTest", null); //Execute the kernel PointerBuffer kernel1DGlobalWorkSize = BufferUtils.createPointerBuffer(1); kernel1DGlobalWorkSize.put(0, a.capacity()); + //Set arguments for the kernel; inputs & output kernel.setArg(0, aMem); kernel.setArg(1, bMem); kernel.setArg(2, answerMem); + //Enqueue the kernel clEnqueueNDRangeKernel(queue, kernel, 1, null, kernel1DGlobalWorkSize, null, null, null); @@ -217,6 +276,53 @@ private void kernelFunction(CLContext context, CLCommandQueue queue) { for (int i = 0; i < answer.capacity(); i++) { System.out.print(answer.get(i) + " "); } + */ + //Trying logic from demofractal + for (int i = 0; i < programs.length; i++) { + programs[i] = clCreateProgramWithSource(clContext, kernel, null); + //Checks if there was an error in creation + Util.checkCLError(clBuildProgram(programs[i], context.getInfoDevices().get(i), "", null)); + } + + for (int i = 0; i < kernels.length; i++) { + kernels[i] = clCreateKernel(programs[min(i, programs.length)], "imgTest", null); + } + + final ContextCapabilities abilities = GLContext.getCapabilities(); + // Detect GLtoCL synchronization method + syncGLtoCL = abilities.GL_ARB_cl_event; // GL3.2 or ARB_sync implied + if (syncGLtoCL) { + clEvents = new CLEvent[slices]; + clSyncs = new GLSync[slices]; + System.out.println("\nGL to CL sync: Using OpenCL events"); + } else { + System.out.println("\nGL to CL sync: Using clFinish"); + } + // Detect CLtoGL synchronization method + syncCLtoGL = abilities.OpenGL32 || abilities.GL_ARB_sync; + if (syncCLtoGL) { + for (CLDevice device : context.getInfoDevices()) { + if (!CLCapabilities.getDeviceCapabilities(device).CL_KHR_gl_event) { + syncCLtoGL = false; + break; + } + } + } + if (syncCLtoGL) { + System.out.println("CL to GL sync: Using OpenGL sync objects"); + } else { + System.out.println("CL to GL sync: Using glFinish"); + } + + useTextures = (deviceType == CL10.CL_DEVICE_TYPE_GPU) && (!abilities.OpenGL21); + + if (useTextures){ + glNewList(glGenLists(1), GL_COMPILE); + + + } + + } public void bind() { From 38ee76ac3440839df7c76ae796360f62fddded9f Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Fri, 21 Jul 2017 11:47:50 -0400 Subject: [PATCH 06/17] Refactored cl converting functions into main --- .../tutorial/clTexture/DemoFractal$1.class | Bin 1260 -> 1260 bytes .../tutorial/clTexture/DemoFractal$2.class | Bin 1112 -> 1112 bytes .../tutorial/clTexture/DemoFractal.class | Bin 24567 -> 24589 bytes build/classes/tutorial/clTexture/Main.class | Bin 2821 -> 11199 bytes .../classes/tutorial/clTexture/Texture.class | Bin 10214 -> 6540 bytes nbproject/private/private.xml | 1 + src/tutorial/clTexture/DemoFractal.java | 1526 +++++++++-------- src/tutorial/clTexture/Main.java | 243 ++- src/tutorial/clTexture/Texture.java | 123 +- 9 files changed, 1016 insertions(+), 877 deletions(-) diff --git a/build/classes/tutorial/clTexture/DemoFractal$1.class b/build/classes/tutorial/clTexture/DemoFractal$1.class index 17ee923520a7206c54b00d8489a29a790105a956..3b8cb0bc2b5282803d0473411041294635e2cda7 100644 GIT binary patch delta 29 jcmaFE`G#`?2MeRZWKI@uRwV{jM&-$oEFnPtIu<(saJUBR delta 29 jcmaFE`G#`?2MeS0WKI@uR#^sCM!Ct6EFnPtIu<(sZ?p#2 diff --git a/build/classes/tutorial/clTexture/DemoFractal$2.class b/build/classes/tutorial/clTexture/DemoFractal$2.class index ea575395fc9f3b5296d5ba30255451164f187510..3042adffd12e8187d9a450a7abcc353b8e9dc3cd 100644 GIT binary patch delta 23 fcmcb?af4&ST4qMW$?KS-S&bPa8BHehv3LOhUQPyQ delta 23 fcmcb?af4&ST4qM=$?KS-S#=pC8TBUfv3LOhU7!Y4 diff --git a/build/classes/tutorial/clTexture/DemoFractal.class b/build/classes/tutorial/clTexture/DemoFractal.class index ad87a733ab82cfc6847d320afa5d64a7a041ee08..2bda4cab132af135804b573f0eb02699c1d980f3 100644 GIT binary patch delta 9744 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 I=^_067udjA4FCWD diff --git a/build/classes/tutorial/clTexture/Main.class b/build/classes/tutorial/clTexture/Main.class index 2df373ede6eaea8a8458263d5515066fc516f59c..3240521fd0cb25f7bf157e9501754e2684490da3 100644 GIT binary patch literal 11199 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 Sp=H%AX%7$(g(*H8aQy$vu%TQ4 diff --git a/build/classes/tutorial/clTexture/Texture.class b/build/classes/tutorial/clTexture/Texture.class index dd0fecea2e8ae9db9d622079aab2d8aab1b09dda..147860a95e7422266ba895425d8ca76bc82e3aa8 100644 GIT binary patch delta 2824 zcmZuz33yyp75>j`ck<>=l9@DV_AY7DWRfsRx~EM_TcASI(loUgvA`ru;}`vA`TiL9I^wuf}%ad+Rg^CJ1oP8#pDqKkH+v5g~#0Zseu&y%#FtdpD^$w zo)VKI27ZpG-8d@KzcBC&o=w3m_@%5pC*oHMzZN{E@EgJBQ*a!=b>nviPT==${6WlL z5b>fc|Ixs$_>%{J#!DUy;AKw@%fBeRV&GN$H3fgeYi_*m#^1%`AL4ORw)=*NQ___; z4g3@T67g^IRVvM6i~oq(TO!_;`O~8PS7F?&w)NZaKl5H&dA!oTl1#&%AMbJ8Nv79* zt)>V;wRCnw!`DR38{P9u3EswNsAbEVP}hb~b9-3f9fdOrt%^9gqdC%XHNjp|y3su1 z-ekU!Tj6)Lws(f2Jp|k37x7YaZ>zZ{WnEcYdvH~KRkg+qxJ?mhvXNb*8$B9**ru^v z#HYZ1ndaTDjE1U8jn84d#ztJG$f0pJZr5m#nR`TQ6m5fukFp>qxil$qYf2$QlZUiM z1e+CkHKkG-A=eDqGSmjHtG7EGKcx@T#p&cDK$D*`6iv~TNm&|g_@tt#nzAW}TM^mX zwjtaT)s#zlit;rTP@$%2vez9VqF7JJmJQFlurJ&Z)%Y~7BTVh=ZVR^eZ|0&qyTTn- z?TysC~xX%@{kSEm)tD(1*EN5Wq#S_zdZ3TP^$ za!nO9n>m=argniic8TLcTBK>QG^U1@C|ati7T?xX zN6R$6#Tq_=O&V9Qp!21rS7MVnGkw@x>YGEkTvKj5Q#f&M>?LPg^*;vi^c_ zU!=v{o0)0ubvezQ?v(iIsm!E`sfFgA?3c_dr$o%|oE-C%zc?**bEq#A?2Sg+gY}V~ zXnc3h5;B+PRhapCIWc=zZt{O2h;G(UGtNzbW z?oWsVz314>&Mmmw3KB-Eh0GHRnPe7jLA!-pC$IyZ)|gL%(JxH5#>^NCd$Eo4b6{q_ zh5ZwF%>?p=;Ca8?32UACW+8LJLMEDpG3>OEnPuT;alM6nc^KsraRY8-`FVh*^Y_ZZ zvo{AGggubsOu#V$XMlxEgbFyU8MoP9xFfck4KLvhfGc!x3pIDjhpUjqy(#4Ci?9VH zTx}(`Vi7t}%N4KSI#1iw7_(z&Ph1 zN=8sRp$0}!HjHwA#VF1jf=ARKtL%u%K^P2G15l13IP4>+X7}m=)Rc{4?ijynsBz>t z#xS4wJ3m{r1%$&`SmTrMo>m!li>} z6V~!{?Et)do^`$qB(UrO?yMbhrhO=2ISdct$N)D3qp0HXLX7eG?dK~phGra$G0`95 zV?E3V_%L(q5k9m>`Tcneci?f1;0YYy_wWRs!Yep}*ZD;}iKBRvAH&mlmYjHwyf{X) z@jR8|I4xjHA;5aLIcXujjIS^iY?zO)%3)(MN++}vye_LTryTctOkwS7d;^&&tjQg; z@$VVt)y?eubq;(5eB-duY0Mi3F_esBuEH&9twQcf{+(eP2cyER3g6%r*my+an4&OH zavCh1Ez6AWzV4KxogAsUv8~mbGvrgJhltTC> zZl8z~WRy5giF4oC04|w~@xKGov81>2toI$ba}saQ{pWh~p-kp{*QBX^A4rYY*m>iJ zQ}Yu%Nowy0y-!Y>nqO^kHg^?gS)UfGNdC{{!`pPr>ok#Q4fj&I=?ff6;QYWSme=zo zT5(y~`}L+W1Aw>qQ};H~n0yj2E9r#q;JZ9BpfJSWBYsTqJw8Oc>?3tfUTkGUlgocW zLzD7f*wEzmU)0c)?((lGogDGR1#MLjtSgs82TzxSH%T>5z4&n7YJk!k;6t wKL<@$UUApr?MXVX8Akmm)^ZVXTq;~4?9OLM?!Fdv{I>(kc>4Q1Yr_xT1po{oh5!Hn literal 10214 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 file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Main.java file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Image.java + file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Texture.java
diff --git a/src/tutorial/clTexture/DemoFractal.java b/src/tutorial/clTexture/DemoFractal.java index 8526288..c0590ca 100644 --- a/src/tutorial/clTexture/DemoFractal.java +++ b/src/tutorial/clTexture/DemoFractal.java @@ -100,11 +100,11 @@ \ \::/ \ \:\/:/ \ \:\ \ \:\/:/ \__\/ /:/ \__\/ \ \::/ \ \:\ \ \::/ /__/:/ \__\/ \__\/ \__\/ \__\/ -*/ - + */ /** - * Computes the Mandelbrot set with OpenCL using multiple GPUs and renders the result with OpenGL. - * A shared PBO is used as storage for the fractal image.
+ * Computes the Mandelbrot set with OpenCL using multiple GPUs and renders the + * result with OpenGL. A shared PBO is used as storage for the fractal + * image.
* http://en.wikipedia.org/wiki/Mandelbrot_set *

* controls:
@@ -119,593 +119,613 @@ */ public class DemoFractal { - // max number of used GPUs - private static final int MAX_PARALLELISM_LEVEL = 8; - - private static final int COLOR_MAP_SIZE = 32 * 2 * 4; - - private Set params; - - private CLContext clContext; - private CLCommandQueue[] queues; - private CLKernel[] kernels; - private CLProgram[] programs; - - private CLMem[] glBuffers; - private IntBuffer glIDs; - - private boolean useTextures; - - // Texture rendering - private int dlist; - private int vsh; - private int fsh; - private int program; - - private CLMem[] colorMap; - - private final PointerBuffer kernel2DGlobalWorkSize; - - // max per pixel iterations to compute the fractal - private int maxIterations = 500; - - private int width = 512; - private int height = 512; - - private double minX = -2f; - private double minY = -1.2f; - private double maxX = 0.6f; - private double maxY = 1.3f; - - private boolean dragging; - private double dragX; - private double dragY; - private double dragMinX; - private double dragMinY; - private double dragMaxX; - private double dragMaxY; - - private int mouseX; - private int mouseY; - - private int slices; - - private boolean drawSeparator; - private boolean doublePrecision = true; - private boolean buffersInitialized; - private boolean rebuild; + // max number of used GPUs + private static final int MAX_PARALLELISM_LEVEL = 8; - private boolean run = true; + private static final int COLOR_MAP_SIZE = 32 * 2 * 4; - // EVENT SYNCING + private Set params; - private final PointerBuffer syncBuffer = BufferUtils.createPointerBuffer(1); - - private boolean syncGLtoCL; // true if we can make GL wait on events generated from CL queues. - private CLEvent[] clEvents; - private GLSync[] clSyncs; - - private boolean syncCLtoGL; // true if we can make CL wait on sync objects generated from GL. - private GLSync glSync; - private CLEvent glEvent; - - public DemoFractal(final String[] args) { - params = new HashSet(); - - for ( int i = 0; i < args.length; i++ ) { - final String arg = args[i]; - - if ( arg.charAt(0) != '-' && arg.charAt(0) != '/' ) - throw new IllegalArgumentException("Invalid command-line argument: " + args[i]); - - final String param = arg.substring(1); - - if ( "forcePBO".equalsIgnoreCase(param) ) - params.add("forcePBO"); - else if ( "forceCPU".equalsIgnoreCase(param) ) - params.add("forceCPU"); - else if ( "debugGL".equalsIgnoreCase(param) ) - params.add("debugGL"); - else if ( "iterations".equalsIgnoreCase(param) ) { - if ( args.length < i + 1 + 1 ) - throw new IllegalArgumentException("Invalid iterations argument specified."); - - try { - this.maxIterations = Integer.parseInt(args[++i]); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("Invalid number of iterations specified."); - } - } else if ( "res".equalsIgnoreCase(param) ) { - if ( args.length < i + 2 + 1 ) - throw new IllegalArgumentException("Invalid res argument specified."); - - try { - this.width = Integer.parseInt(args[++i]); - this.height = Integer.parseInt(args[++i]); - - if ( width < 1 || height < 1 ) - throw new IllegalArgumentException("Invalid res dimensions specified."); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("Invalid res dimensions specified."); - } - } - } - - kernel2DGlobalWorkSize = BufferUtils.createPointerBuffer(2); - } - - public static void main(String args[]) { - DemoFractal demo = new DemoFractal(args); - demo.init(); - demo.run(); - } - - public void init() { - try { - CL.create(); - Display.setDisplayMode(new DisplayMode(width, height)); - Display.setTitle("OpenCL Fractal Demo"); - Display.setSwapInterval(0); - Display.create(new PixelFormat(), new ContextAttribs().withDebug(params.contains("debugGL"))); - } catch (LWJGLException e) { - throw new RuntimeException(e); - } - - try { - initCL(Display.getDrawable()); - } catch (Exception e) { - if ( clContext != null ) - clReleaseContext(clContext); - Display.destroy(); - throw new RuntimeException(e); - } - - glDisable(GL_DEPTH_TEST); - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - - initView(Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); - - initGLObjects(); - glFinish(); - - setKernelConstants(); - } - - private void initCL(Drawable drawable) throws Exception { - // Find a platform - List platforms = CLPlatform.getPlatforms(); - if ( platforms == null ) - throw new RuntimeException("No OpenCL platforms found."); - - final CLPlatform platform = platforms.get(0); // just grab the first one - - // Find devices with GL sharing support - final Filter glSharingFilter = new Filter() { - public boolean accept(final CLDevice device) { - final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); - return caps.CL_KHR_gl_sharing; - } - }; - int device_type = params.contains("forceCPU") ? CL_DEVICE_TYPE_CPU : CL_DEVICE_TYPE_GPU; - List devices = platform.getDevices(device_type, glSharingFilter); - if ( devices == null ) { - device_type = CL_DEVICE_TYPE_CPU; - devices = platform.getDevices(device_type, glSharingFilter); - if ( devices == null ) - throw new RuntimeException("No OpenCL devices found with KHR_gl_sharing support."); - } + private CLContext clContext; + private CLCommandQueue[] queues; + private CLKernel[] kernels; + private CLProgram[] programs; - // Create the context - clContext = CLContext.create(platform, devices, new CLContextCallback() { - protected void handleMessage(final String errinfo, final ByteBuffer private_info) { - System.out.println("[CONTEXT MESSAGE] " + errinfo); - } - }, drawable, null); + private CLMem[] glBuffers; + private IntBuffer glIDs; - slices = min(devices.size(), MAX_PARALLELISM_LEVEL); + private boolean useTextures; - // create command queues for every GPU, setup colormap and init kernels - queues = new CLCommandQueue[slices]; - kernels = new CLKernel[slices]; - colorMap = new CLMem[slices]; + // Texture rendering + private int dlist; + private int vsh; + private int fsh; + private int program; + + private CLMem[] colorMap; - for ( int i = 0; i < slices; i++ ) { - colorMap[i] = clCreateBuffer(clContext, CL_MEM_READ_ONLY, COLOR_MAP_SIZE, null); - colorMap[i].checkValid(); - - // create command queue and upload color map buffer on each used device - queues[i] = clCreateCommandQueue(clContext, devices.get(i), CL_QUEUE_PROFILING_ENABLE, null); - queues[i].checkValid(); - - final ByteBuffer colorMapBuffer = clEnqueueMapBuffer(queues[i], colorMap[i], CL_TRUE, CL_MAP_WRITE, 0, COLOR_MAP_SIZE, null, null, null); - initColorMap(colorMapBuffer.asIntBuffer(), 32, Color.BLUE, Color.GREEN, Color.RED); - clEnqueueUnmapMemObject(queues[i], colorMap[i], colorMapBuffer, null, null); - } - - // check if we have 64bit FP support on all devices - // if yes we can use only one program for all devices + one kernel per device. - // if not we will have to create (at least) one program for 32 and one for 64bit devices. - // since there are different vendor extensions for double FP we use one program per device. - // (OpenCL spec is not very clear about this usecases) - boolean all64bit = true; - for ( CLDevice device : devices ) { - if ( !isDoubleFPAvailable(device) ) { - all64bit = false; - break; - } - } - - // load program(s) - programs = new CLProgram[all64bit ? 1 : slices]; - - final ContextCapabilities caps = GLContext.getCapabilities(); - - if ( !caps.OpenGL20 ) - throw new RuntimeException("OpenGL 2.0 is required to run this demo."); - else if ( device_type == CL_DEVICE_TYPE_CPU && !caps.OpenGL21 ) - throw new RuntimeException("OpenGL 2.1 is required to run this demo."); - - if ( params.contains("debugGL") ) { - if ( caps.GL_ARB_debug_output ) - glDebugMessageCallbackARB(new ARBDebugOutputCallback()); - else if ( caps.GL_AMD_debug_output ) - glDebugMessageCallbackAMD(new AMDDebugOutputCallback()); - } - - if ( device_type == CL_DEVICE_TYPE_GPU ) - System.out.println("OpenCL Device Type: GPU (Use -forceCPU to use CPU)"); - else - System.out.println("OpenCL Device Type: CPU"); - for ( int i = 0; i < devices.size(); i++ ) - System.out.println("OpenCL Device #" + (i + 1) + " supports KHR_gl_event = " + CLCapabilities.getDeviceCapabilities(devices.get(i)).CL_KHR_gl_event); - - System.out.println("\nMax Iterations: " + maxIterations + " (Use -iterations to change)"); - System.out.println("Display resolution: " + width + "x" + height + " (Use -res to change)"); - - System.out.println("\nOpenGL caps.GL_ARB_sync = " + caps.GL_ARB_sync); - System.out.println("OpenGL caps.GL_ARB_cl_event = " + caps.GL_ARB_cl_event); - - // Use PBO if we're on a CPU implementation - useTextures = device_type == CL_DEVICE_TYPE_GPU && (!caps.OpenGL21 || !params.contains("forcePBO")); - if ( useTextures ) { - System.out.println("\nCL/GL Sharing method: TEXTURES (use -forcePBO to use PBO + DrawPixels)"); - System.out.println("Rendering method: Shader on a fullscreen quad"); - } else { - System.out.println("\nCL/GL Sharing method: PIXEL BUFFER OBJECTS"); - System.out.println("Rendering method: DrawPixels"); - } - - buildPrograms(); - - // Detect GLtoCL synchronization method - syncGLtoCL = caps.GL_ARB_cl_event; // GL3.2 or ARB_sync implied - if ( syncGLtoCL ) { - clEvents = new CLEvent[slices]; - clSyncs = new GLSync[slices]; - System.out.println("\nGL to CL sync: Using OpenCL events"); - } else - System.out.println("\nGL to CL sync: Using clFinish"); - - // Detect CLtoGL synchronization method - syncCLtoGL = caps.OpenGL32 || caps.GL_ARB_sync; - if ( syncCLtoGL ) { - for ( CLDevice device : devices ) { - if ( !CLCapabilities.getDeviceCapabilities(device).CL_KHR_gl_event ) { - syncCLtoGL = false; - break; - } - } - } - if ( syncCLtoGL ) { - System.out.println("CL to GL sync: Using OpenGL sync objects"); - } else - System.out.println("CL to GL sync: Using glFinish"); - - if ( useTextures ) { - dlist = glGenLists(1); - - glNewList(dlist, GL_COMPILE); - glBegin(GL_QUADS); - { - glTexCoord2f(0.0f, 0.0f); - glVertex2f(0, 0); - - glTexCoord2f(0.0f, 1.0f); - glVertex2i(0, height); - - glTexCoord2f(1.0f, 1.0f); - glVertex2f(width, height); - - glTexCoord2f(1.0f, 0.0f); - glVertex2f(width, 0); - } - glEnd(); - glEndList(); - - vsh = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vsh, "varying vec2 texCoord;\n" + - "\n" + - "void main(void) {\n" + - "\tgl_Position = ftransform();\n" + - "\ttexCoord = gl_MultiTexCoord0.xy;\n" + - "}"); - glCompileShader(vsh); - - fsh = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fsh, "uniform sampler2D mandelbrot;\n" + - "\n" + - "varying vec2 texCoord;\n" + - "\n" + - "void main(void) {\n" + - "\tgl_FragColor = texture2D(mandelbrot, texCoord);" + - "}"); - glCompileShader(fsh); - - program = glCreateProgram(); - glAttachShader(program, vsh); - glAttachShader(program, fsh); - glLinkProgram(program); - - glUseProgram(program); - glUniform1i(glGetUniformLocation(program, "mandelbrot"), 0); - } - - System.out.println(""); - } - - private void buildPrograms() { - /* + private final PointerBuffer kernel2DGlobalWorkSize; + + // max per pixel iterations to compute the fractal + private int maxIterations = 500; + + private int width = 512; + private int height = 512; + + private double minX = -2f; + private double minY = -1.2f; + private double maxX = 0.6f; + private double maxY = 1.3f; + + private boolean dragging; + private double dragX; + private double dragY; + private double dragMinX; + private double dragMinY; + private double dragMaxX; + private double dragMaxY; + + private int mouseX; + private int mouseY; + + private int slices; + + private boolean drawSeparator; + private boolean doublePrecision = true; + private boolean buffersInitialized; + private boolean rebuild; + + private boolean run = true; + + // EVENT SYNCING + private final PointerBuffer syncBuffer = BufferUtils.createPointerBuffer(1); + + private boolean syncGLtoCL; // true if we can make GL wait on events generated from CL queues. + private CLEvent[] clEvents; + private GLSync[] clSyncs; + + private boolean syncCLtoGL; // true if we can make CL wait on sync objects generated from GL. + private GLSync glSync; + private CLEvent glEvent; + + public DemoFractal(final String[] args) { + params = new HashSet(); + + for (int i = 0; i < args.length; i++) { + final String arg = args[i]; + + if (arg.charAt(0) != '-' && arg.charAt(0) != '/') { + throw new IllegalArgumentException("Invalid command-line argument: " + args[i]); + } + + final String param = arg.substring(1); + + if ("forcePBO".equalsIgnoreCase(param)) { + params.add("forcePBO"); + } else if ("forceCPU".equalsIgnoreCase(param)) { + params.add("forceCPU"); + } else if ("debugGL".equalsIgnoreCase(param)) { + params.add("debugGL"); + } else if ("iterations".equalsIgnoreCase(param)) { + if (args.length < i + 1 + 1) { + throw new IllegalArgumentException("Invalid iterations argument specified."); + } + + try { + this.maxIterations = Integer.parseInt(args[++i]); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid number of iterations specified."); + } + } else if ("res".equalsIgnoreCase(param)) { + if (args.length < i + 2 + 1) { + throw new IllegalArgumentException("Invalid res argument specified."); + } + + try { + this.width = Integer.parseInt(args[++i]); + this.height = Integer.parseInt(args[++i]); + + if (width < 1 || height < 1) { + throw new IllegalArgumentException("Invalid res dimensions specified."); + } + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Invalid res dimensions specified."); + } + } + } + + kernel2DGlobalWorkSize = BufferUtils.createPointerBuffer(2); + } + + public static void main(String args[]) { + DemoFractal demo = new DemoFractal(args); + demo.init(); + demo.run(); + } + + public void init() { + try { + CL.create(); + Display.setDisplayMode(new DisplayMode(width, height)); + Display.setTitle("OpenCL Fractal Demo"); + Display.setSwapInterval(0); + Display.create(new PixelFormat(), new ContextAttribs().withDebug(params.contains("debugGL"))); + } catch (LWJGLException e) { + throw new RuntimeException(e); + } + + try { + initCL(Display.getDrawable()); + } catch (Exception e) { + if (clContext != null) { + clReleaseContext(clContext); + } + Display.destroy(); + throw new RuntimeException(e); + } + + glDisable(GL_DEPTH_TEST); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + initView(Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); + + initGLObjects(); + glFinish(); + + setKernelConstants(); + } + + private void initCL(Drawable drawable) throws Exception { + // Find a platform + List platforms = CLPlatform.getPlatforms(); + if (platforms == null) { + throw new RuntimeException("No OpenCL platforms found."); + } + + final CLPlatform platform = platforms.get(0); // just grab the first one + + // Find devices with GL sharing support + final Filter glSharingFilter = new Filter() { + public boolean accept(final CLDevice device) { + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + return caps.CL_KHR_gl_sharing; + } + }; + int device_type = params.contains("forceCPU") ? CL_DEVICE_TYPE_CPU : CL_DEVICE_TYPE_GPU; + List devices = platform.getDevices(device_type, glSharingFilter); + if (devices == null) { + device_type = CL_DEVICE_TYPE_CPU; + devices = platform.getDevices(device_type, glSharingFilter); + if (devices == null) { + throw new RuntimeException("No OpenCL devices found with KHR_gl_sharing support."); + } + } + + // Create the context + clContext = CLContext.create(platform, devices, new CLContextCallback() { + protected void handleMessage(final String errinfo, final ByteBuffer private_info) { + System.out.println("[CONTEXT MESSAGE] " + errinfo); + } + }, drawable, null); + + slices = min(devices.size(), MAX_PARALLELISM_LEVEL); + + // create command queues for every GPU, setup colormap and init kernels + queues = new CLCommandQueue[slices]; + kernels = new CLKernel[slices]; + colorMap = new CLMem[slices]; + + for (int i = 0; i < slices; i++) { + colorMap[i] = clCreateBuffer(clContext, CL_MEM_READ_ONLY, COLOR_MAP_SIZE, null); + colorMap[i].checkValid(); + + // create command queue and upload color map buffer on each used device + queues[i] = clCreateCommandQueue(clContext, devices.get(i), CL_QUEUE_PROFILING_ENABLE, null); + queues[i].checkValid(); + + final ByteBuffer colorMapBuffer = clEnqueueMapBuffer(queues[i], colorMap[i], CL_TRUE, CL_MAP_WRITE, 0, COLOR_MAP_SIZE, null, null, null); + initColorMap(colorMapBuffer.asIntBuffer(), 32, Color.BLUE, Color.GREEN, Color.RED); + clEnqueueUnmapMemObject(queues[i], colorMap[i], colorMapBuffer, null, null); + } + + // check if we have 64bit FP support on all devices + // if yes we can use only one program for all devices + one kernel per device. + // if not we will have to create (at least) one program for 32 and one for 64bit devices. + // since there are different vendor extensions for double FP we use one program per device. + // (OpenCL spec is not very clear about this usecases) + boolean all64bit = true; + for (CLDevice device : devices) { + if (!isDoubleFPAvailable(device)) { + all64bit = false; + break; + } + } + + // load program(s) + programs = new CLProgram[all64bit ? 1 : slices]; + + final ContextCapabilities caps = GLContext.getCapabilities(); + + if (!caps.OpenGL20) { + throw new RuntimeException("OpenGL 2.0 is required to run this demo."); + } else if (device_type == CL_DEVICE_TYPE_CPU && !caps.OpenGL21) { + throw new RuntimeException("OpenGL 2.1 is required to run this demo."); + } + + if (params.contains("debugGL")) { + if (caps.GL_ARB_debug_output) { + glDebugMessageCallbackARB(new ARBDebugOutputCallback()); + } else if (caps.GL_AMD_debug_output) { + glDebugMessageCallbackAMD(new AMDDebugOutputCallback()); + } + } + + if (device_type == CL_DEVICE_TYPE_GPU) { + System.out.println("OpenCL Device Type: GPU (Use -forceCPU to use CPU)"); + } else { + System.out.println("OpenCL Device Type: CPU"); + } + for (int i = 0; i < devices.size(); i++) { + System.out.println("OpenCL Device #" + (i + 1) + " supports KHR_gl_event = " + CLCapabilities.getDeviceCapabilities(devices.get(i)).CL_KHR_gl_event); + } + + System.out.println("\nMax Iterations: " + maxIterations + " (Use -iterations to change)"); + System.out.println("Display resolution: " + width + "x" + height + " (Use -res to change)"); + + System.out.println("\nOpenGL caps.GL_ARB_sync = " + caps.GL_ARB_sync); + System.out.println("OpenGL caps.GL_ARB_cl_event = " + caps.GL_ARB_cl_event); + + // Use PBO if we're on a CPU implementation + useTextures = device_type == CL_DEVICE_TYPE_GPU && (!caps.OpenGL21 || !params.contains("forcePBO")); + if (useTextures) { + System.out.println("\nCL/GL Sharing method: TEXTURES (use -forcePBO to use PBO + DrawPixels)"); + System.out.println("Rendering method: Shader on a fullscreen quad"); + } else { + System.out.println("\nCL/GL Sharing method: PIXEL BUFFER OBJECTS"); + System.out.println("Rendering method: DrawPixels"); + } + + buildPrograms(); + + // Detect GLtoCL synchronization method + syncGLtoCL = caps.GL_ARB_cl_event; // GL3.2 or ARB_sync implied + if (syncGLtoCL) { + clEvents = new CLEvent[slices]; + clSyncs = new GLSync[slices]; + System.out.println("\nGL to CL sync: Using OpenCL events"); + } else { + System.out.println("\nGL to CL sync: Using clFinish"); + } + + // Detect CLtoGL synchronization method + syncCLtoGL = caps.OpenGL32 || caps.GL_ARB_sync; + if (syncCLtoGL) { + for (CLDevice device : devices) { + if (!CLCapabilities.getDeviceCapabilities(device).CL_KHR_gl_event) { + syncCLtoGL = false; + break; + } + } + } + if (syncCLtoGL) { + System.out.println("CL to GL sync: Using OpenGL sync objects"); + } else { + System.out.println("CL to GL sync: Using glFinish"); + } + + if (useTextures) { + dlist = glGenLists(1); + + glNewList(dlist, GL_COMPILE); + glBegin(GL_QUADS); + { + glTexCoord2f(0.0f, 0.0f); + glVertex2f(0, 0); + + glTexCoord2f(0.0f, 1.0f); + glVertex2i(0, height); + + glTexCoord2f(1.0f, 1.0f); + glVertex2f(width, height); + + glTexCoord2f(1.0f, 0.0f); + glVertex2f(width, 0); + } + glEnd(); + glEndList(); + + vsh = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vsh, "varying vec2 texCoord;\n" + + "\n" + + "void main(void) {\n" + + "\tgl_Position = ftransform();\n" + + "\ttexCoord = gl_MultiTexCoord0.xy;\n" + + "}"); + glCompileShader(vsh); + + fsh = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fsh, "uniform sampler2D mandelbrot;\n" + + "\n" + + "varying vec2 texCoord;\n" + + "\n" + + "void main(void) {\n" + + "\tgl_FragColor = texture2D(mandelbrot, texCoord);" + + "}"); + glCompileShader(fsh); + + System.out.println("HERE"); + program = glCreateProgram(); + glAttachShader(program, vsh); + glAttachShader(program, fsh); + glLinkProgram(program); + + glUseProgram(program); + glUniform1i(glGetUniformLocation(program, "mandelbrot"), 0); + } + + System.out.println(""); + } + + private void buildPrograms() { + /* * workaround: The driver keeps using the old binaries for some reason. * to solve this we simple create a new program and release the old. * however rebuilding programs should be possible -> remove when drivers are fixed. * (again: the spec is not very clear about this kind of usages) - */ - if ( programs[0] != null ) { - for ( CLProgram program : programs ) - clReleaseProgram(program); - } - - try { - createPrograms(); - } catch (IOException e) { - throw new RuntimeException(e); - } - - // disable 64bit floating point math if not available - for ( int i = 0; i < programs.length; i++ ) { - final CLDevice device = queues[i].getCLDevice(); - - final StringBuilder options = new StringBuilder(useTextures ? "-D USE_TEXTURE" : ""); - final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); - if ( doublePrecision && isDoubleFPAvailable(device) ) { - //cl_khr_fp64 - options.append(" -D DOUBLE_FP"); - - //amd's verson of double precision floating point math - if ( !caps.CL_KHR_fp64 && caps.CL_AMD_fp64 ) - options.append(" -D AMD_FP"); - } - - System.out.println("\nOpenCL COMPILER OPTIONS: " + options); - - try { - clBuildProgram(programs[i], device, options, null); - } finally { - System.out.println("BUILD LOG: " + programs[i].getBuildInfoString(device, CL_PROGRAM_BUILD_LOG)); - } - } - - rebuild = false; - - // init kernel with constants - for ( int i = 0; i < kernels.length; i++ ) - kernels[i] = clCreateKernel(programs[min(i, programs.length)], "mandelbrot", null); - } - - private void initGLObjects() { - if ( glBuffers == null ) { - glBuffers = new CLMem[slices]; - glIDs = BufferUtils.createIntBuffer(slices); - } else { - for ( CLMem mem : glBuffers ) - clReleaseMemObject(mem); - - if ( useTextures ) - glDeleteTextures(glIDs); - else - glDeleteBuffers(glIDs); - } - - if ( useTextures ) { - glGenTextures(glIDs); - - // Init textures - for ( int i = 0; i < slices; i++ ) { - glBindTexture(GL_TEXTURE_2D, glIDs.get(i)); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width / slices, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer)null); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - glBuffers[i] = clCreateFromGLTexture2D(clContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, glIDs.get(i), null); - } - glBindTexture(GL_TEXTURE_2D, 0); - } else { - glGenBuffers(glIDs); - - // setup one empty PBO per slice - for ( int i = 0; i < slices; i++ ) { - glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glIDs.get(i)); - glBufferData(GL_PIXEL_UNPACK_BUFFER, width * height * 4 / slices, GL_STREAM_DRAW); - - glBuffers[i] = clCreateFromGLBuffer(clContext, CL_MEM_WRITE_ONLY, glIDs.get(i), null); - } - glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); - } - - buffersInitialized = true; - } - - // init kernels with constants - - private void setKernelConstants() { - for ( int i = 0; i < slices; i++ ) { - kernels[i] - .setArg(6, glBuffers[i]) - .setArg(7, colorMap[i]) - .setArg(8, COLOR_MAP_SIZE) - .setArg(9, maxIterations); - } - } - - // rendering cycle - - private void run() { - long startTime = System.currentTimeMillis() + 5000; - long fps = 0; - - while ( run ) { - if ( !Display.isVisible() ) - Thread.yield(); - - handleIO(); - display(); - - Display.update(); - if ( Display.isCloseRequested() ) - break; - - if ( startTime > System.currentTimeMillis() ) { - fps++; - } else { - long timeUsed = 5000 + (startTime - System.currentTimeMillis()); - startTime = System.currentTimeMillis() + 5000; - System.out.println(fps + " frames in 5 seconds = " + (fps / (timeUsed / 1000f))); - fps = 0; - } - } - - clReleaseContext(clContext); - - if ( useTextures ) { - glDeleteProgram(program); - glDeleteShader(fsh); - glDeleteShader(vsh); - - glDeleteLists(dlist, 1); - } - - CL.destroy(); - Display.destroy(); - } - - public void display() { - // TODO: Need to clean-up events, test when ARB_cl_events & KHR_gl_event are implemented. - - // make sure GL does not use our objects before we start computing - if ( syncCLtoGL && glEvent != null ) { - for ( final CLCommandQueue queue : queues ) - clEnqueueWaitForEvents(queue, glEvent); - } else - glFinish(); - - if ( !buffersInitialized ) { - initGLObjects(); - setKernelConstants(); - } - - if ( rebuild ) { - buildPrograms(); - setKernelConstants(); - } - compute(doublePrecision); - - render(); - } - - // OpenCL - - private void compute(final boolean is64bit) { - int sliceWidth = (int)(width / (float)slices); - double rangeX = (maxX - minX) / slices; - double rangeY = (maxY - minY); - - kernel2DGlobalWorkSize.put(0, sliceWidth).put(1, height); - - // start computation - for ( int i = 0; i < slices; i++ ) { - kernels[i].setArg(0, sliceWidth).setArg(1, height); - if ( !is64bit || !isDoubleFPAvailable(queues[i].getCLDevice()) ) { - kernels[i] - .setArg(2, (float)(minX + rangeX * i)).setArg(3, (float)minY) - .setArg(4, (float)rangeX).setArg(5, (float)rangeY); - } else { - kernels[i] - .setArg(2, minX + rangeX * i).setArg(3, minY) - .setArg(4, rangeX).setArg(5, rangeY); - } - - // acquire GL objects, and enqueue a kernel with a probe from the list - clEnqueueAcquireGLObjects(queues[i], glBuffers[i], null, null); - - clEnqueueNDRangeKernel(queues[i], kernels[i], 2, - null, - kernel2DGlobalWorkSize, - null, - null, null); - - clEnqueueReleaseGLObjects(queues[i], glBuffers[i], null, syncGLtoCL ? syncBuffer : null); - if ( syncGLtoCL ) { - clEvents[i] = queues[i].getCLEvent(syncBuffer.get(0)); - clSyncs[i] = glCreateSyncFromCLeventARB(queues[i].getParent(), clEvents[i], 0); - } - } - - // block until done (important: finish before doing further gl work) - if ( !syncGLtoCL ) { - for ( int i = 0; i < slices; i++ ) - clFinish(queues[i]); - } - } - - // OpenGL - - private void render() { - glClear(GL_COLOR_BUFFER_BIT); - - if ( syncGLtoCL ) { - for ( int i = 0; i < slices; i++ ) - glWaitSync(clSyncs[i], 0, 0); - } - - //draw slices - int sliceWidth = width / slices; - - if ( useTextures ) { - for ( int i = 0; i < slices; i++ ) { - int seperatorOffset = drawSeparator ? i : 0; - - glBindTexture(GL_TEXTURE_2D, glIDs.get(i)); - glCallList(dlist); - } - } else { - for ( int i = 0; i < slices; i++ ) { - int seperatorOffset = drawSeparator ? i : 0; - - glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glIDs.get(i)); - glRasterPos2i(sliceWidth * i + seperatorOffset, 0); - - glDrawPixels(sliceWidth, height, GL_RGBA, GL_UNSIGNED_BYTE, 0); - } - glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); - } - - if ( syncCLtoGL ) { - glSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - glEvent = clCreateEventFromGLsyncKHR(clContext, glSync, null); - } - - //draw info text - /* + */ + if (programs[0] != null) { + for (CLProgram program : programs) { + clReleaseProgram(program); + } + } + + try { + createPrograms(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + // disable 64bit floating point math if not available + for (int i = 0; i < programs.length; i++) { + final CLDevice device = queues[i].getCLDevice(); + + final StringBuilder options = new StringBuilder(useTextures ? "-D USE_TEXTURE" : ""); + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + if (doublePrecision && isDoubleFPAvailable(device)) { + //cl_khr_fp64 + options.append(" -D DOUBLE_FP"); + + //amd's verson of double precision floating point math + if (!caps.CL_KHR_fp64 && caps.CL_AMD_fp64) { + options.append(" -D AMD_FP"); + } + } + + System.out.println("\nOpenCL COMPILER OPTIONS: " + options); + + try { + clBuildProgram(programs[i], device, options, null); + } finally { + System.out.println("BUILD LOG: " + programs[i].getBuildInfoString(device, CL_PROGRAM_BUILD_LOG)); + } + } + + rebuild = false; + + // init kernel with constants + for (int i = 0; i < kernels.length; i++) { + kernels[i] = clCreateKernel(programs[min(i, programs.length)], "mandelbrot", null); + } + } + + private void initGLObjects() { + if (glBuffers == null) { + glBuffers = new CLMem[slices]; + glIDs = BufferUtils.createIntBuffer(slices); + } else { + for (CLMem mem : glBuffers) { + clReleaseMemObject(mem); + } + + if (useTextures) { + glDeleteTextures(glIDs); + } else { + glDeleteBuffers(glIDs); + } + } + + if (useTextures) { + glGenTextures(glIDs); + + // Init textures + for (int i = 0; i < slices; i++) { + glBindTexture(GL_TEXTURE_2D, glIDs.get(i)); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width / slices, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer) null); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glBuffers[i] = clCreateFromGLTexture2D(clContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, glIDs.get(i), null); + } + glBindTexture(GL_TEXTURE_2D, 0); + } else { + glGenBuffers(glIDs); + + // setup one empty PBO per slice + for (int i = 0; i < slices; i++) { + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glIDs.get(i)); + glBufferData(GL_PIXEL_UNPACK_BUFFER, width * height * 4 / slices, GL_STREAM_DRAW); + + glBuffers[i] = clCreateFromGLBuffer(clContext, CL_MEM_WRITE_ONLY, glIDs.get(i), null); + } + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); + } + + buffersInitialized = true; + } + + // init kernels with constants + private void setKernelConstants() { + for (int i = 0; i < slices; i++) { + kernels[i] + .setArg(6, glBuffers[i]) + .setArg(7, colorMap[i]) + .setArg(8, COLOR_MAP_SIZE) + .setArg(9, maxIterations); + } + } + + // rendering cycle + private void run() { + long startTime = System.currentTimeMillis() + 5000; + long fps = 0; + + while (run) { + if (!Display.isVisible()) { + Thread.yield(); + } + + handleIO(); + display(); + + Display.update(); + if (Display.isCloseRequested()) { + break; + } + + if (startTime > System.currentTimeMillis()) { + fps++; + } else { + long timeUsed = 5000 + (startTime - System.currentTimeMillis()); + startTime = System.currentTimeMillis() + 5000; + System.out.println(fps + " frames in 5 seconds = " + (fps / (timeUsed / 1000f))); + fps = 0; + } + } + + clReleaseContext(clContext); + + if (useTextures) { + glDeleteProgram(program); + glDeleteShader(fsh); + glDeleteShader(vsh); + + glDeleteLists(dlist, 1); + } + + CL.destroy(); + Display.destroy(); + } + + public void display() { + // TODO: Need to clean-up events, test when ARB_cl_events & KHR_gl_event are implemented. + + // make sure GL does not use our objects before we start computing + if (syncCLtoGL && glEvent != null) { + for (final CLCommandQueue queue : queues) { + clEnqueueWaitForEvents(queue, glEvent); + } + } else { + glFinish(); + } + + if (!buffersInitialized) { + initGLObjects(); + setKernelConstants(); + } + + if (rebuild) { + buildPrograms(); + setKernelConstants(); + } + compute(doublePrecision); + + render(); + } + + // OpenCL + private void compute(final boolean is64bit) { + int sliceWidth = (int) (width / (float) slices); + double rangeX = (maxX - minX) / slices; + double rangeY = (maxY - minY); + + kernel2DGlobalWorkSize.put(0, sliceWidth).put(1, height); + + // start computation + for (int i = 0; i < slices; i++) { + kernels[i].setArg(0, sliceWidth).setArg(1, height); + if (!is64bit || !isDoubleFPAvailable(queues[i].getCLDevice())) { + kernels[i] + .setArg(2, (float) (minX + rangeX * i)).setArg(3, (float) minY) + .setArg(4, (float) rangeX).setArg(5, (float) rangeY); + } else { + kernels[i] + .setArg(2, minX + rangeX * i).setArg(3, minY) + .setArg(4, rangeX).setArg(5, rangeY); + } + + // acquire GL objects, and enqueue a kernel with a probe from the list + clEnqueueAcquireGLObjects(queues[i], glBuffers[i], null, null); + + clEnqueueNDRangeKernel(queues[i], kernels[i], 2, + null, + kernel2DGlobalWorkSize, + null, + null, null); + + clEnqueueReleaseGLObjects(queues[i], glBuffers[i], null, syncGLtoCL ? syncBuffer : null); + if (syncGLtoCL) { + clEvents[i] = queues[i].getCLEvent(syncBuffer.get(0)); + clSyncs[i] = glCreateSyncFromCLeventARB(queues[i].getParent(), clEvents[i], 0); + } + } + + // block until done (important: finish before doing further gl work) + if (!syncGLtoCL) { + for (int i = 0; i < slices; i++) { + clFinish(queues[i]); + } + } + } + + // OpenGL + private void render() { + glClear(GL_COLOR_BUFFER_BIT); + + if (syncGLtoCL) { + for (int i = 0; i < slices; i++) { + glWaitSync(clSyncs[i], 0, 0); + } + } + + //draw slices + int sliceWidth = width / slices; + + if (useTextures) { + for (int i = 0; i < slices; i++) { + int seperatorOffset = drawSeparator ? i : 0; + + glBindTexture(GL_TEXTURE_2D, glIDs.get(i)); + glCallList(dlist); + } + } else { + for (int i = 0; i < slices; i++) { + int seperatorOffset = drawSeparator ? i : 0; + + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glIDs.get(i)); + glRasterPos2i(sliceWidth * i + seperatorOffset, 0); + + glDrawPixels(sliceWidth, height, GL_RGBA, GL_UNSIGNED_BYTE, 0); + } + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); + } + + if (syncCLtoGL) { + glSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + glEvent = clCreateEventFromGLsyncKHR(clContext, glSync, null); + } + + //draw info text + /* textRenderer.beginRendering(width, height, false); textRenderer.draw("device/time/precision", 10, height - 15); for ( int i = 0; i < slices; i++ ) { @@ -719,173 +739,179 @@ private void render() { + (doubleFP ? "64bit" : "32bit"), 10, height - (20 + 16 * (slices - i))); } textRenderer.endRendering(); - */ - } - - private void handleIO() { - if ( Keyboard.getNumKeyboardEvents() != 0 ) { - while ( Keyboard.next() ) { - if ( Keyboard.getEventKeyState() ) - continue; - - final int key = Keyboard.getEventKey(); - - if ( Keyboard.KEY_1 <= key && key <= Keyboard.KEY_8 ) { - int number = key - Keyboard.KEY_1 + 1; - slices = min(number, min(queues.length, MAX_PARALLELISM_LEVEL)); - System.out.println("NEW PARALLELISM LEVEL: " + slices); - buffersInitialized = false; - } else { - switch ( Keyboard.getEventKey() ) { - case Keyboard.KEY_SPACE: - drawSeparator = !drawSeparator; - System.out.println("SEPARATOR DRAWING IS NOW: " + (drawSeparator ? "ON" : "OFF")); - break; - case Keyboard.KEY_D: - doublePrecision = !doublePrecision; - System.out.println("DOUBLE PRECISION IS NOW: " + (doublePrecision ? "ON" : "OFF")); - rebuild = true; - break; - case Keyboard.KEY_HOME: - minX = -2f; - minY = -1.2f; - maxX = 0.6f; - maxY = 1.3f; - break; - case Keyboard.KEY_ESCAPE: - run = false; - break; - } - } - } - } - - while ( Mouse.next() ) { - final int eventBtn = Mouse.getEventButton(); - - final int x = Mouse.getX(); - final int y = Mouse.getY(); - - if ( Mouse.isButtonDown(0) && (x != mouseX || y != mouseY) ) { - if ( !dragging ) { - dragging = true; - - dragX = mouseX; - dragY = mouseY; - - dragMinX = minX; - dragMinY = minY; - dragMaxX = maxX; - dragMaxY = maxY; - } - - double offsetX = (x - dragX) * (maxX - minX) / width; - double offsetY = (y - dragY) * (maxY - minY) / height; - - minX = dragMinX - offsetX; - minY = dragMinY - offsetY; - - maxX = dragMaxX - offsetX; - maxY = dragMaxY - offsetY; - } else { - if ( dragging ) - dragging = false; - - if ( eventBtn == -1 ) { - final int dwheel = Mouse.getEventDWheel(); - if ( dwheel != 0 ) { - double scaleFactor = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) ? 0.25 : 0.05; - double scale = dwheel > 0 ? scaleFactor : -scaleFactor; - - double deltaX = scale * (maxX - minX); - double deltaY = scale * (maxY - minY); - - // offset for "zoom to cursor" - double offsetX = (x / (double)width - 0.5) * deltaX * 2.0; - double offsetY = (y / (double)height - 0.5) * deltaY * 2.0; - - minX += deltaX + offsetX; - minY += deltaY - offsetY; - - maxX += -deltaX + offsetX; - maxY += -deltaY - offsetY; - } - } - } - - mouseX = x; - mouseY = y; - } - } - - private static boolean isDoubleFPAvailable(CLDevice device) { - final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); - return caps.CL_KHR_fp64 || caps.CL_AMD_fp64; - } - - private void createPrograms() throws IOException { - final String source = getProgramSource("org/lwjgl/test/opencl/gl/Mandelbrot.cl"); - for ( int i = 0; i < programs.length; i++ ) - programs[i] = clCreateProgramWithSource(clContext, source, null); - } - - private String getProgramSource(final String file) throws IOException { - InputStream source = null; - URL sourceURL = Thread.currentThread().getContextClassLoader().getResource(file); - if(sourceURL != null) { - source = sourceURL.openStream(); - } - if ( source == null ) // dev-mode - source = new FileInputStream("src/java/" + file); - final BufferedReader reader = new BufferedReader(new InputStreamReader(source)); - - final StringBuilder sb = new StringBuilder(); - String line; - try { - while ( (line = reader.readLine()) != null ) - sb.append(line).append("\n"); - } finally { - source.close(); - } - - return sb.toString(); - } - - private static void initColorMap(IntBuffer colorMap, int stepSize, ReadableColor... colors) { - for ( int n = 0; n < colors.length - 1; n++ ) { - ReadableColor color = colors[n]; - int r0 = color.getRed(); - int g0 = color.getGreen(); - int b0 = color.getBlue(); - - color = colors[n + 1]; - int r1 = color.getRed(); - int g1 = color.getGreen(); - int b1 = color.getBlue(); - - int deltaR = r1 - r0; - int deltaG = g1 - g0; - int deltaB = b1 - b0; - - for ( int step = 0; step < stepSize; step++ ) { - float alpha = (float)step / (stepSize - 1); - int r = (int)(r0 + alpha * deltaR); - int g = (int)(g0 + alpha * deltaG); - int b = (int)(b0 + alpha * deltaB); - colorMap.put((r << 0) | (g << 8) | (b << 16)); - } - } - } - - private static void initView(int width, int height) { - glViewport(0, 0, width, height); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0.0, width, 0.0, height, 0.0, 1.0); - } - -} \ No newline at end of file + */ + } + + private void handleIO() { + if (Keyboard.getNumKeyboardEvents() != 0) { + while (Keyboard.next()) { + if (Keyboard.getEventKeyState()) { + continue; + } + + final int key = Keyboard.getEventKey(); + + if (Keyboard.KEY_1 <= key && key <= Keyboard.KEY_8) { + int number = key - Keyboard.KEY_1 + 1; + slices = min(number, min(queues.length, MAX_PARALLELISM_LEVEL)); + System.out.println("NEW PARALLELISM LEVEL: " + slices); + buffersInitialized = false; + } else { + switch (Keyboard.getEventKey()) { + case Keyboard.KEY_SPACE: + drawSeparator = !drawSeparator; + System.out.println("SEPARATOR DRAWING IS NOW: " + (drawSeparator ? "ON" : "OFF")); + break; + case Keyboard.KEY_D: + doublePrecision = !doublePrecision; + System.out.println("DOUBLE PRECISION IS NOW: " + (doublePrecision ? "ON" : "OFF")); + rebuild = true; + break; + case Keyboard.KEY_HOME: + minX = -2f; + minY = -1.2f; + maxX = 0.6f; + maxY = 1.3f; + break; + case Keyboard.KEY_ESCAPE: + run = false; + break; + } + } + } + } + + while (Mouse.next()) { + final int eventBtn = Mouse.getEventButton(); + + final int x = Mouse.getX(); + final int y = Mouse.getY(); + + if (Mouse.isButtonDown(0) && (x != mouseX || y != mouseY)) { + if (!dragging) { + dragging = true; + + dragX = mouseX; + dragY = mouseY; + + dragMinX = minX; + dragMinY = minY; + dragMaxX = maxX; + dragMaxY = maxY; + } + + double offsetX = (x - dragX) * (maxX - minX) / width; + double offsetY = (y - dragY) * (maxY - minY) / height; + + minX = dragMinX - offsetX; + minY = dragMinY - offsetY; + + maxX = dragMaxX - offsetX; + maxY = dragMaxY - offsetY; + } else { + if (dragging) { + dragging = false; + } + + if (eventBtn == -1) { + final int dwheel = Mouse.getEventDWheel(); + if (dwheel != 0) { + double scaleFactor = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL) ? 0.25 : 0.05; + double scale = dwheel > 0 ? scaleFactor : -scaleFactor; + + double deltaX = scale * (maxX - minX); + double deltaY = scale * (maxY - minY); + + // offset for "zoom to cursor" + double offsetX = (x / (double) width - 0.5) * deltaX * 2.0; + double offsetY = (y / (double) height - 0.5) * deltaY * 2.0; + + minX += deltaX + offsetX; + minY += deltaY - offsetY; + + maxX += -deltaX + offsetX; + maxY += -deltaY - offsetY; + } + } + } + + mouseX = x; + mouseY = y; + } + } + + private static boolean isDoubleFPAvailable(CLDevice device) { + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + return caps.CL_KHR_fp64 || caps.CL_AMD_fp64; + } + + private void createPrograms() throws IOException { + final String source = getProgramSource("org/lwjgl/test/opencl/gl/Mandelbrot.cl"); + for (int i = 0; i < programs.length; i++) { + programs[i] = clCreateProgramWithSource(clContext, source, null); + } + } + + private String getProgramSource(final String file) throws IOException { + InputStream source = null; + URL sourceURL = Thread.currentThread().getContextClassLoader().getResource(file); + if (sourceURL != null) { + source = sourceURL.openStream(); + } + if (source == null) // dev-mode + { + source = new FileInputStream("src/java/" + file); + } + final BufferedReader reader = new BufferedReader(new InputStreamReader(source)); + + final StringBuilder sb = new StringBuilder(); + String line; + try { + while ((line = reader.readLine()) != null) { + sb.append(line).append("\n"); + } + } finally { + source.close(); + } + + return sb.toString(); + } + + private static void initColorMap(IntBuffer colorMap, int stepSize, ReadableColor... colors) { + for (int n = 0; n < colors.length - 1; n++) { + ReadableColor color = colors[n]; + int r0 = color.getRed(); + int g0 = color.getGreen(); + int b0 = color.getBlue(); + + color = colors[n + 1]; + int r1 = color.getRed(); + int g1 = color.getGreen(); + int b1 = color.getBlue(); + + int deltaR = r1 - r0; + int deltaG = g1 - g0; + int deltaB = b1 - b0; + + for (int step = 0; step < stepSize; step++) { + float alpha = (float) step / (stepSize - 1); + int r = (int) (r0 + alpha * deltaR); + int g = (int) (g0 + alpha * deltaG); + int b = (int) (b0 + alpha * deltaB); + colorMap.put((r << 0) | (g << 8) | (b << 16)); + } + } + } + + private static void initView(int width, int height) { + glViewport(0, 0, width, height); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0, width, 0.0, height, 0.0, 1.0); + } + +} diff --git a/src/tutorial/clTexture/Main.java b/src/tutorial/clTexture/Main.java index ddcb3c5..ee81bb1 100644 --- a/src/tutorial/clTexture/Main.java +++ b/src/tutorial/clTexture/Main.java @@ -5,11 +5,35 @@ */ package tutorial.clTexture; +import static java.lang.Math.min; import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.util.List; import static org.lwjgl.opengl.GL11.*; import org.lwjgl.opengl.*; import org.lwjgl.*; import org.lwjgl.input.Keyboard; +import org.lwjgl.opencl.CL; +import org.lwjgl.opencl.CL10; +import static org.lwjgl.opencl.CL10.CL_PROGRAM_BUILD_LOG; +import static org.lwjgl.opencl.CL10.CL_QUEUE_PROFILING_ENABLE; +import org.lwjgl.opencl.CL10GL; +import org.lwjgl.opencl.CLCapabilities; +import org.lwjgl.opencl.CLCommandQueue; +import org.lwjgl.opencl.CLContext; +import org.lwjgl.opencl.CLDevice; +import org.lwjgl.opencl.CLDeviceCapabilities; +import org.lwjgl.opencl.CLEvent; +import org.lwjgl.opencl.CLKernel; +import org.lwjgl.opencl.CLMem; +import org.lwjgl.opencl.CLPlatform; +import org.lwjgl.opencl.CLProgram; +import org.lwjgl.opencl.api.Filter; +import static org.lwjgl.opengl.GL20.glCreateProgram; +import static org.lwjgl.opengl.GL20.glGetUniformLocation; +import static org.lwjgl.opengl.GL20.glLinkProgram; +import static org.lwjgl.opengl.GL20.glUniform1i; +import static org.lwjgl.opengl.GL20.glUseProgram; /* * @author labramson @@ -20,8 +44,46 @@ public class Main { private static final String imgDir = "C:\\Users\\labramson\\Documents\\Tutorial\\res\\"; public static String imgName = "smileTexture2.jpg"; + static final String kernel + = "kernel void imgTest(read_only image2d_t srcImage, write_only image2d_t finalImage){\n" + + " sampler_t sampler = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;\n" + + " uint offset = get_global_id(1) * 0x4000 + get_global_id(0)*0x1000;\n" + + " int2 coord = (int2)(get_global_id(0), get_global_id(1));\n" + + " uint4 pixel = read_imageui(srcImage, sampler, coord);\n" + + " pixel.x -= offset;\n" + + " write_imageui(finalImage, coord, pixel);\n" + + "}"; + + //VARS FOR CL CONVERSION + private static final int MAX_GPUS = 8; //Max GPUs used at once + private CLContext context; //CL context + private CLCommandQueue[] queues; //array of cl command queues + private CLKernel[] kernels; //array of cl kernels for + private CLProgram[] programs; //array of cl programs for + private int program; //array of cl programs for + private CLMem[] glBuffers; //array of clm for + private CLMem[] colorMap; //array of cl color maps for + private IntBuffer glIDs; //int buffer for + private boolean useTextures; //for something... + private final PointerBuffer kernel2DGlobalWorkSize = BufferUtils.createPointerBuffer(2); //the global work size of the kernel + private int slices; //dividing up the image for faster processing + private boolean drawSeparator; //no idea what this is + private boolean doublePrecision = true; //doubles used instead of floats + private boolean buffersInitialized; //buffers for something initialized + private boolean rebuild; //boolean for rerendering + private boolean run = true; //boolena for running the program + private final PointerBuffer syncBuffer = BufferUtils.createPointerBuffer(1); //buffer for dealing with gl cl sync + private boolean syncGLtoCL; // true if we can make GL wait on events generated from CL queues. + private boolean syncCLtoGL; // true if we can make CL wait on sync objects generated from GL. + private CLEvent[] clEvents; //array of cl events for + private CLEvent glEvent; //cl event + private GLSync[] clSyncs; //array of gl sync objects for + private GLSync glSync; //glsync so that cl & gl dont cause race condition + private int deviceType = CL10.CL_DEVICE_TYPE_GPU; + //CONSTRUCTOR - public Main() {} + public Main() { + } public static void main(String... args) throws Exception { initDisplay(); @@ -30,18 +92,17 @@ public static void main(String... args) throws Exception { //GET THE IMAGE AND GREATE THE GL TEXTURE Image img = new Image(imgDir + "" + imgName); Texture texture = new Texture(img, GL_TEXTURE_2D, GL11.glGenTextures()); - - //CONVERT GL TEXTURE TO CL TEXTURE - texture.convertToCL(); + //init + Main run = new Main(); + run.initCL(); + + CLMem mem = run.createTexture(texture); + + //CONVERT GL TEXTURE TO CL TEXTURE while (!Display.isCloseRequested()) { - //CLEARS SCREEN EACH LOOP - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - //ENABLES GL_TEXTURE_2D - glEnable(GL_TEXTURE_2D); - //BIND THE TEXTURE - texture.bind(); - glPixelStorei(GL_PACK_ALIGNMENT, 4); + //SETS GL SETTINGS + glSettings(); //DRAW A SQUARE WITH MAPPED TEXTURE glBegin(GL_QUADS); @@ -57,7 +118,7 @@ public static void main(String... args) throws Exception { glTexCoord2f(1, 0); glVertex2i(200, 100); //bottom left glEnd(); - + //IF ESC THEN CLOSE if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { Display.destroy(); @@ -85,15 +146,165 @@ public static void initDisplay() { } public static void initGL() { + glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, 300, 300, 0, 1, -1); glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + } + + public static void glSettings() { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //CLEARS SCREEN EACH LOOP + glDisable(GL_DEPTH_TEST); //DISABLES DEPTH TEST + glEnable(GL_TEXTURE_2D); //ENABLES GL_TEXTURE_2D + glPixelStorei(GL_PACK_ALIGNMENT, 4); + } + + public void initCL() { + try { + // Initialize OpenCL + CL.create(); + System.out.println("\nCL created"); + + // Drawable context that OpenCL needs + Drawable drawable = Display.getDrawable(); + System.out.println("Drawable created"); + + // LWJGL CLPlatform object + CLPlatform platform = CLPlatform.getPlatforms().get(0); + System.out.println("Platform created"); + + final Filter glSharingFilter; + glSharingFilter = (final CLDevice device) -> { + final CLDeviceCapabilities abilities = CLCapabilities.getDeviceCapabilities(device); + return abilities.CL_KHR_gl_sharing; + }; + + // List of LJWGL CLDevice objects representing hardware or software contexts that OpenCL can use + List devices = platform.getDevices(CL10.CL_DEVICE_TYPE_GPU); + if (devices == null) { + deviceType = CL10.CL_DEVICE_TYPE_CPU; + devices = platform.getDevices(CL10.CL_DEVICE_TYPE_CPU, glSharingFilter); + if (devices == null) { + throw new RuntimeException("No OpenCL devices found with KHR_gl_sharing support."); + } + } + System.out.println("Devices obtained"); + + slices = min(devices.size(), MAX_GPUS); + System.out.println("Slices:" + slices); + + // Create the OpenCL context using the patform, devices, and the OpenGL drawable + context = CLContext.create(platform, devices, null, drawable, null); + System.out.println("Context created"); + + // Create an command queue using our OpenCL context + queues = new CLCommandQueue[slices]; + fillQueue(context); + System.out.println("Command Queue created"); + + buildProgram(context); + System.out.println("Program created"); + + kernels = new CLKernel[slices]; + initKernel(); + System.out.println("Kernel initialized"); + + //CHECK SYNC STATUS BTWN GL & CL + syncStatus(context); + + //CLMem mem = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_READ_ONLY, target, 0, id, null); + //CLMem mem2 = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_WRITE_ONLY, target, 0, id, null); + } catch (Exception e) { + System.out.println("*** Problem creating CL texture"); + e.printStackTrace(); + } + } + + //CREATES THE CL PROGRAM WITH CORRECT OPTIONS + private void buildProgram(CLContext context) { + programs = new CLProgram[slices]; + if (programs[0] != null) { + for (CLProgram program : programs) { + CL10.clReleaseProgram(program); + } + } + + for (int i = 0; i < programs.length; i++) { + programs[i] = CL10.clCreateProgramWithSource(context, kernel, null); + } + + for (int i = 0; i < programs.length; i++) { + final CLDevice device = queues[i].getCLDevice(); + final StringBuilder options = new StringBuilder(useTextures ? "-D USE_TEXTURE" : ""); + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + + if (doublePrecision) { + //cl_khr_fp64 + options.append(" -D DOUBLE_FP"); + + //amd's verson of double precision floating point math + if (!caps.CL_KHR_fp64 && caps.CL_AMD_fp64) { + options.append(" -D AMD_FP"); + } + } + System.out.println("\nOpenCL COMPILER OPTIONS: " + options); + + try { + CL10.clBuildProgram(programs[i], device, options, null); + } finally { + System.out.println("BUILD LOG: " + programs[i].getBuildInfoString(device, CL_PROGRAM_BUILD_LOG)); + } + } + } + + private void fillQueue(CLContext context) { + for (int i = 0; i < slices; i++) { + // create command queue and upload color map buffer on each used device + queues[i] = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(i), CL_QUEUE_PROFILING_ENABLE, null); + queues[i].checkValid(); + } + } + + private void initKernel() { + // init kernel with constants + for (int i = 0; i < kernels.length; i++) { + kernels[i] = CL10.clCreateKernel(programs[min(i, programs.length)], "imgTest", null); + } + } + + private void syncStatus(CLContext context) { + final ContextCapabilities abilities = GLContext.getCapabilities(); + + syncGLtoCL = abilities.GL_ARB_cl_event; // GL3.2 or ARB_sync implied + if (syncGLtoCL) { + clEvents = new CLEvent[slices]; + clSyncs = new GLSync[slices]; + System.out.println("\nGL to CL sync: Using OpenCL events"); + } else { + System.out.println("\nGL to CL sync: Using clFinish"); + } + + // Detect CLtoGL synchronization method + syncCLtoGL = abilities.OpenGL32 || abilities.GL_ARB_sync; + if (syncCLtoGL) { + for (CLDevice device : context.getInfoDevices()) { + if (!CLCapabilities.getDeviceCapabilities(device).CL_KHR_gl_event) { + syncCLtoGL = false; + break; + } + } + } + + if (syncCLtoGL) { + System.out.println("CL to GL sync: Using OpenGL sync objects"); + } else { + System.out.println("CL to GL sync: Using glFinish"); + } } - static FloatBuffer toFloatBuffer(float[] floats) { - FloatBuffer buf = BufferUtils.createFloatBuffer(floats.length).put(floats); - buf.rewind(); - return buf; + private CLMem createTexture(Texture texture) { + return CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_READ_ONLY, texture.getTarget(), 0, texture.getId(), null); } } diff --git a/src/tutorial/clTexture/Texture.java b/src/tutorial/clTexture/Texture.java index bc02008..7e9c027 100644 --- a/src/tutorial/clTexture/Texture.java +++ b/src/tutorial/clTexture/Texture.java @@ -5,19 +5,13 @@ */ package tutorial.clTexture; -import java.awt.Color; import static java.lang.Math.min; import java.nio.FloatBuffer; import java.nio.ByteBuffer; import java.nio.IntBuffer; -import java.util.List; -import java.util.Set; import org.lwjgl.BufferUtils; -import org.lwjgl.LWJGLException; import org.lwjgl.PointerBuffer; -import org.lwjgl.opengl.Display; -import org.lwjgl.opengl.Drawable; import org.lwjgl.opengl.GL11; import static org.lwjgl.opengl.GL11.GL_NEAREST; import static org.lwjgl.opengl.GL11.GL_RGB; @@ -32,35 +26,19 @@ import static org.lwjgl.opengl.GL11.glTexParameteri; import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; -import org.lwjgl.opencl.CL; import org.lwjgl.opencl.CL10; -import static org.lwjgl.opencl.CL10.CL_MAP_WRITE; -import static org.lwjgl.opencl.CL10.CL_MEM_COPY_HOST_PTR; -import static org.lwjgl.opencl.CL10.CL_MEM_READ_ONLY; -import static org.lwjgl.opencl.CL10.CL_MEM_WRITE_ONLY; -import static org.lwjgl.opencl.CL10.CL_QUEUE_PROFILING_ENABLE; -import static org.lwjgl.opencl.CL10.CL_TRUE; import static org.lwjgl.opencl.CL10.clBuildProgram; -import static org.lwjgl.opencl.CL10.clCreateBuffer; import static org.lwjgl.opencl.CL10.clCreateKernel; import static org.lwjgl.opencl.CL10.clCreateProgramWithSource; -import static org.lwjgl.opencl.CL10.clEnqueueNDRangeKernel; -import static org.lwjgl.opencl.CL10.clEnqueueReadBuffer; -import static org.lwjgl.opencl.CL10.clEnqueueWriteBuffer; -import static org.lwjgl.opencl.CL10.clFinish; -import org.lwjgl.opencl.CL10GL; import org.lwjgl.opencl.CLCapabilities; import org.lwjgl.opencl.CLCommandQueue; import org.lwjgl.opencl.CLContext; import org.lwjgl.opencl.CLDevice; -import org.lwjgl.opencl.CLDeviceCapabilities; import org.lwjgl.opencl.CLEvent; import org.lwjgl.opencl.CLKernel; import org.lwjgl.opencl.CLMem; -import org.lwjgl.opencl.CLPlatform; import org.lwjgl.opencl.CLProgram; import org.lwjgl.opencl.Util; -import org.lwjgl.opencl.api.Filter; import org.lwjgl.opengl.ContextCapabilities; import static org.lwjgl.opengl.GL11.GL_COMPILE; import static org.lwjgl.opengl.GL11.glGenLists; @@ -68,8 +46,6 @@ import org.lwjgl.opengl.GLContext; import org.lwjgl.opengl.GLSync; -import static tutorial.clTexture.Main.toFloatBuffer; - /* * @author LAA */ @@ -86,9 +62,9 @@ public class Texture { static final FloatBuffer b = toFloatBuffer(new float[]{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}); static final FloatBuffer answer = BufferUtils.createFloatBuffer(a.capacity()); - //TRYING TO WORK WITH BUFFERS - public ByteBuffer buf, ptrbufs; - public PointerBuffer pointers, ptrbuff; +// //TRYING TO WORK WITH BUFFERS +// public ByteBuffer buf, ptrbufs; +// public PointerBuffer pointers, ptrbuff; //MY KERNEL FUNCTION FROM TEXTBOOK PG static final String kernel @@ -145,85 +121,6 @@ public Texture(Image image, int target, int id) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.getWidth() + 1, image.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); } - public void convertToCL() { - try { - CLContext context = createCLContext(); - - queues = new CLCommandQueue[slices]; - kernels = new CLKernel[slices]; - - // Create an command queue using our OpenCL context and the first device in our list of devices - for (int i = 0; i < slices; i++) { - colorMap[i] = clCreateBuffer(clContext, CL_MEM_READ_ONLY, 256, null); - colorMap[i].checkValid(); - - // create command queue and upload color map buffer on each used device - queues[i] = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(i), CL_QUEUE_PROFILING_ENABLE, null); - queues[i].checkValid(); - - CL10.clEnqueueUnmapMemObject(queues[i], colorMap[i], null, null, null); - } - //CLCommandQueue queue = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(0), CL10.CL_QUEUE_PROFILING_ENABLE, null); - System.out.println("Command Queue created"); - - CLMem mem = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_READ_ONLY, target, 0, id, null); - CLMem mem2 = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_WRITE_ONLY, target, 0, id, null); - - GL11.glFinish(); - - kernelFunction(context, queues); - } catch (Exception e) { - System.out.println("*** Problem creating CL texture"); - e.printStackTrace(); - } - } - - private CLContext createCLContext() { - try { - // Initialize OpenCL and create a context and command queue - CL.create(); - System.out.println("\nCL created"); - - // Drawable context that OpenCL needs - Drawable drawable = Display.getDrawable(); - System.out.println("Drawable created"); - - // LWJGL CLPlatform object - CLPlatform platform = CLPlatform.getPlatforms().get(0); - System.out.println("Platform created"); - - final Filter glSharingFilter; - glSharingFilter = (final CLDevice device) -> { - final CLDeviceCapabilities abilities = CLCapabilities.getDeviceCapabilities(device); - return abilities.CL_KHR_gl_sharing; - }; - - // List of LJWGL CLDevice objects representing hardware or software contexts that OpenCL can use - List devices = platform.getDevices(CL10.CL_DEVICE_TYPE_GPU); - if (devices == null) { - deviceType = CL10.CL_DEVICE_TYPE_CPU; - devices = platform.getDevices(CL10.CL_DEVICE_TYPE_CPU, glSharingFilter); - if (devices == null) { - throw new RuntimeException("No OpenCL devices found with KHR_gl_sharing support."); - } - } - System.out.println("Devices obtained"); - - // Create the OpenCL context using the patform, devices, and the OpenGL drawable - CLContext context = CLContext.create(platform, devices, null, drawable, null); - System.out.println("Context created"); - - slices = min(devices.size(), MAX_GPUS); - - return context; - - } catch (LWJGLException e) { - System.out.println("*** Problem initializing OpenCL"); - e.printStackTrace(); - return null; - } - } - private void kernelFunction(CLContext context, CLCommandQueue[] queues) { //BELOW IS CODE TO TRY TO WORK WITH A KERNEL; KERNEL WILL NEED TO STUFF WITH TEXTURE //THIS CODE IS FROM MY HelloWorld.java @@ -279,9 +176,10 @@ private void kernelFunction(CLContext context, CLCommandQueue[] queues) { */ //Trying logic from demofractal for (int i = 0; i < programs.length; i++) { - programs[i] = clCreateProgramWithSource(clContext, kernel, null); + final CLDevice device = queues[i].getCLDevice(); + programs[i] = clCreateProgramWithSource(context, kernel, null); //Checks if there was an error in creation - Util.checkCLError(clBuildProgram(programs[i], context.getInfoDevices().get(i), "", null)); + Util.checkCLError(clBuildProgram(programs[i],device, "", null)); } for (int i = 0; i < kernels.length; i++) { @@ -319,10 +217,7 @@ private void kernelFunction(CLContext context, CLCommandQueue[] queues) { if (useTextures){ glNewList(glGenLists(1), GL_COMPILE); - } - - } public void bind() { @@ -348,4 +243,10 @@ public int getWidth() { public int getHeight() { return height; } + + static FloatBuffer toFloatBuffer(float[] floats) { + FloatBuffer buf = BufferUtils.createFloatBuffer(floats.length).put(floats); + buf.rewind(); + return buf; + } } From 066623961793a654d3c4f11970895ce3e23f5015 Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Fri, 21 Jul 2017 13:02:39 -0400 Subject: [PATCH 07/17] More converting over --- build/classes/tutorial/clTexture/Image.class | Bin 3590 -> 3590 bytes build/classes/tutorial/clTexture/Main.class | Bin 11199 -> 11676 bytes .../classes/tutorial/clTexture/Texture.class | Bin 6540 -> 1439 bytes src/tutorial/clTexture/Image.java | 6 +- src/tutorial/clTexture/Main.java | 60 ++++-- src/tutorial/clTexture/Texture.java | 181 ------------------ 6 files changed, 42 insertions(+), 205 deletions(-) diff --git a/build/classes/tutorial/clTexture/Image.class b/build/classes/tutorial/clTexture/Image.class index d3d3878466dab29ab8ed968a76562d0db6d1f4d3..ab1b44aa566eabe2d5cc336a6003a4bf11cae408 100644 GIT binary patch delta 30 jcmZpZX_MI?%q1wqV9a2`z`!8HV9HJz@p`Pw)is delta 30 jcmZpZX_MI?%q7UgV9a2`z`(%7V9HJz@p`O;7~E diff --git a/build/classes/tutorial/clTexture/Main.class b/build/classes/tutorial/clTexture/Main.class index 3240521fd0cb25f7bf157e9501754e2684490da3..cdbb97695e70cf2884a2e85274d9ea9b7fee4d28 100644 GIT binary patch delta 5508 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 lNa6xM8K{#a!%Wk0h^aF(%v9t^8~c2AmWCe+!et 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 Date: Fri, 21 Jul 2017 15:42:40 -0400 Subject: [PATCH 08/17] Reading & printing texture image values WORKS --- build/classes/tutorial/clTexture/Main.class | Bin 11676 -> 14594 bytes res/stripe.jpg | Bin 0 -> 705 bytes src/tutorial/clTexture/Main.java | 185 +++++++++++++++----- 3 files changed, 145 insertions(+), 40 deletions(-) create mode 100644 res/stripe.jpg diff --git a/build/classes/tutorial/clTexture/Main.class b/build/classes/tutorial/clTexture/Main.class index cdbb97695e70cf2884a2e85274d9ea9b7fee4d28..ef67b06336db5b1c45c9249e4b8be7e41b3eaa8f 100644 GIT binary patch literal 14594 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 diff --git a/res/stripe.jpg b/res/stripe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98139391a9cf36356b230cd1c075af8edf4affac GIT binary patch literal 705 zcmex= zRY=j$kxe)-kzJ`!#HexNLJno8jR!@8E`CrkPAY2R|V^&07y2J$~}^+4C1KUw!=a z`ODXD-+%o41@ado12e>1aG#<1OAzQUCSV+}u!H=?$W#u*%z`YeiiT`Lj)Clng~Cck zjT|CQ6Blkg$f;}`^g%SK=pvVxipfLOk07sseMX$en#l4Q++zrT-D2QjW&}navmk># z!}t3?Y@`1LraqAWt+lKC-z?LvU(Ek_3;#1r5vk$%&#>b^!@ng`b8G%H{AXZaU4Kev o5A%P9)NsH5442(D#yiv>Txb8OslRdlclrMeSDJ$t@c+LF0PK?ICjbBd literal 0 HcmV?d00001 diff --git a/src/tutorial/clTexture/Main.java b/src/tutorial/clTexture/Main.java index f5df634..1cbe412 100644 --- a/src/tutorial/clTexture/Main.java +++ b/src/tutorial/clTexture/Main.java @@ -5,19 +5,13 @@ */ package tutorial.clTexture; -import static java.lang.Math.min; import java.nio.IntBuffer; import java.util.List; -import static org.lwjgl.opengl.GL11.*; -import org.lwjgl.opengl.*; import org.lwjgl.*; import org.lwjgl.input.Keyboard; -import org.lwjgl.opencl.CL; import org.lwjgl.opencl.CL10; -import static org.lwjgl.opencl.CL10.CL_PROGRAM_BUILD_LOG; -import static org.lwjgl.opencl.CL10.CL_QUEUE_PROFILING_ENABLE; -import static org.lwjgl.opencl.CL10.clReleaseMemObject; import org.lwjgl.opencl.CL10GL; +import org.lwjgl.opencl.CL; import org.lwjgl.opencl.CLCapabilities; import org.lwjgl.opencl.CLCommandQueue; import org.lwjgl.opencl.CLContext; @@ -29,23 +23,39 @@ import org.lwjgl.opencl.CLPlatform; import org.lwjgl.opencl.CLProgram; import org.lwjgl.opencl.api.Filter; +import org.lwjgl.opengl.*; +import static java.lang.Math.min; +import static org.lwjgl.opencl.CL10.CL_PROGRAM_BUILD_LOG; +import static org.lwjgl.opencl.CL10.CL_QUEUE_PROFILING_ENABLE; +import static org.lwjgl.opencl.CL10.clEnqueueNDRangeKernel; +import static org.lwjgl.opencl.CL10.clEnqueueWaitForEvents; +import static org.lwjgl.opencl.CL10.clFinish; +import static org.lwjgl.opencl.CL10.clReleaseMemObject; +import static org.lwjgl.opencl.CL10GL.clEnqueueAcquireGLObjects; +import static org.lwjgl.opencl.KHRGLEvent.clCreateEventFromGLsyncKHR; +import static org.lwjgl.opengl.ARBCLEvent.glCreateSyncFromCLeventARB; +import static org.lwjgl.opengl.ARBSync.GL_SYNC_GPU_COMMANDS_COMPLETE; +import static org.lwjgl.opengl.ARBSync.glFenceSync; +import static org.lwjgl.opengl.ARBSync.glWaitSync; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL15.glBindBuffer; import static org.lwjgl.opengl.GL15.glDeleteBuffers; +import static org.lwjgl.opengl.GL21.GL_PIXEL_UNPACK_BUFFER; /* * @author labramson */ public class Main { - private Image img; + public static Image img; static final String kernel - = "kernel void imgTest(read_only image2d_t srcImage, write_only image2d_t finalImage){\n" - + " sampler_t sampler = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;\n" - + " uint offset = get_global_id(1) * 0x4000 + get_global_id(0)*0x1000;\n" - + " int2 coord = (int2)(get_global_id(0), get_global_id(1));\n" - + " uint4 pixel = read_imageui(srcImage, sampler, coord);\n" - + " pixel.x -= offset;\n" - + " write_imageui(finalImage, coord, pixel);\n" + = "kernel void imgTest(__read_only image2d_t inputTexture){\n" + + " int2 imgCoords = (int2)(get_global_id(0), get_global_id(1));\n" + + " //printf(\"Coord x:%d Coord y:%d \", imgCoords.x, imgCoords.y);\n\n" + + " const sampler_t smp = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;\n\n" + + " float4 imgVal = read_imagef(inputTexture, smp, imgCoords); \n" + + " printf(\"(%d, %d) RGBA(%f, %f, %f, %f)\\n\", imgCoords.x, imgCoords.y, imgVal.x, imgVal.y, imgVal.z, imgVal.w);\n" + "}"; //VARS FOR CL CONVERSION @@ -56,7 +66,7 @@ public class Main { private CLProgram[] programs; //array of cl programs for private CLMem[] glBuffers; //array of clm for private IntBuffer glIDs; //int buffer for - private boolean useTextures; //for something... + private boolean useTextures = true; //for something... private final PointerBuffer kernel2DGlobalWorkSize = BufferUtils.createPointerBuffer(2); //the global work size of the kernel private int slices; //dividing up the image for faster processing private boolean drawSeparator; //no idea what this is @@ -74,8 +84,7 @@ public class Main { private int deviceType = CL10.CL_DEVICE_TYPE_GPU; //CONSTRUCTOR - public Main() { - } + public Main() {} public static void main(String... args) throws Exception { //IMAGE FOR THE TEXTURE @@ -86,33 +95,24 @@ public static void main(String... args) throws Exception { initDisplay(); initGL(); + + //Program object used to run functions + Main run = new Main(); //init - Main run = new Main(); run.initCL(); run.initGLTexture(img); - - //CLMem mem = run.createTexture(texture); - //CONVERT GL TEXTURE TO CL TEXTURE + glFinish(); + run.setKernelParams(); + + //Display Loop while (!Display.isCloseRequested()) { + run.display(img); + //SETS GL SETTINGS glSettings(); - //DRAW A SQUARE WITH MAPPED TEXTURE - glBegin(GL_QUADS); - glTexCoord2f(0, 0); - glVertex2i(100, 100); //upper left - - glTexCoord2f(0, 1); - glVertex2i(100, 200); //upper right - - glTexCoord2f(1, 1); - glVertex2i(200, 200); //bottom right - - glTexCoord2f(1, 0); - glVertex2i(200, 100); //bottom left - glEnd(); - + //IF ESC THEN CLOSE if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { Display.destroy(); @@ -235,9 +235,22 @@ public void initCL() { //CHECK SYNC STATUS BTWN GL & CL syncStatus(context); + + //DRAW A SQUARE WITH MAPPED TEXTURE + glBegin(GL_QUADS); + glTexCoord2f(0, 0); + glVertex2i(100, 100); //upper left + + glTexCoord2f(0, 1); + glVertex2i(100, 200); //upper right + + glTexCoord2f(1, 1); + glVertex2i(200, 200); //bottom right + + glTexCoord2f(1, 0); + glVertex2i(200, 100); //bottom left + glEnd(); - //CLMem mem = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_READ_ONLY, target, 0, id, null); - //CLMem mem2 = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_WRITE_ONLY, target, 0, id, null); } catch (Exception e) { System.out.println("*** Problem creating CL texture"); e.printStackTrace(); @@ -283,7 +296,7 @@ private void buildProgram(CLContext context) { private void fillQueue(CLContext context) { for (int i = 0; i < slices; i++) { - // create command queue and upload color map buffer on each used device + // create command queue on each used device queues[i] = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(i), CL_QUEUE_PROFILING_ENABLE, null); queues[i].checkValid(); } @@ -296,6 +309,13 @@ private void initKernel() { } } + private void setKernelParams() { + for (int i = 0; i < slices; i++) { + kernels[i] + .setArg(0, glBuffers[i]); + } + } + private void syncStatus(CLContext context) { final ContextCapabilities abilities = GLContext.getCapabilities(); @@ -325,4 +345,89 @@ private void syncStatus(CLContext context) { System.out.println("CL to GL sync: Using glFinish"); } } + + public void display(Image img){ + if (syncCLtoGL && glEvent != null) { + for (final CLCommandQueue queue : queues) { + clEnqueueWaitForEvents(queue, glEvent); + } + } else { + glFinish(); + } + + if (!buffersInitialized) { + initGLTexture(img); + setKernelParams(); + } + + if (rebuild) { + buildProgram(context); + setKernelParams(); + } + + kernel2DGlobalWorkSize.put(0, img.getWidth()).put(1, img.getHeight()); + + for (int i = 0; i < slices; i++) { + // acquire GL objects, and enqueue a kernel with a probe from the list + clEnqueueAcquireGLObjects(queues[i], glBuffers[i], null, null); + + clEnqueueNDRangeKernel(queues[i], kernels[i], 2, + null, + kernel2DGlobalWorkSize, + null, + null, null); + + CL10GL.clEnqueueReleaseGLObjects(queues[i], glBuffers[i], null, syncGLtoCL ? syncBuffer : null); + if (syncGLtoCL) { + clEvents[i] = queues[i].getCLEvent(syncBuffer.get(0)); + clSyncs[i] = glCreateSyncFromCLeventARB(queues[i].getParent(), clEvents[i], 0); + } + } + + // block until done (important: finish before doing further gl work) + if (!syncGLtoCL) { + for (int i = 0; i < slices; i++) { + clFinish(queues[i]); + } + } + + render(img); + } + + private void render(Image img){ + glClear(GL_COLOR_BUFFER_BIT); + + if (syncGLtoCL) { + for (int i = 0; i < slices; i++) { + glWaitSync(clSyncs[i], 0, 0); + } + } + + //draw slices + int sliceWidth = img.getWidth() / slices; + + if (useTextures) { + for (int i = 0; i < slices; i++) { + int seperatorOffset = drawSeparator ? i : 0; + + glBindTexture(GL_TEXTURE_2D, glIDs.get(i)); + //glCallList(dlist); + } + } else { + for (int i = 0; i < slices; i++) { + int seperatorOffset = drawSeparator ? i : 0; + + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glIDs.get(i)); + glRasterPos2i(sliceWidth * i + seperatorOffset, 0); + + glDrawPixels(sliceWidth, img.getHeight(), GL_RGBA, GL_UNSIGNED_BYTE, 0); + } + glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); + } + + if (syncCLtoGL) { + glSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + glEvent = clCreateEventFromGLsyncKHR(context, glSync, null); + } + } } From ac094210f0be15e20f06b224b74f9b50aebf24e2 Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Fri, 21 Jul 2017 17:03:15 -0400 Subject: [PATCH 09/17] TEXTURE APPEARS! --- build/classes/tutorial/clTexture/Main.class | Bin 14594 -> 14349 bytes src/tutorial/clTexture/Main.java | 137 ++++++++++---------- 2 files changed, 71 insertions(+), 66 deletions(-) diff --git a/build/classes/tutorial/clTexture/Main.class b/build/classes/tutorial/clTexture/Main.class index ef67b06336db5b1c45c9249e4b8be7e41b3eaa8f..061cde17e8941da09747969225dd694aaaaae979 100644 GIT binary patch delta 6729 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 delta 6975 zcmZ`;d3;pW_5YqbGkKGj7m^HwtdIzVC5s`EMZ#(T5lGkqMxX+Lj3E#b$bzWoxPZ8# zIBp4A1(%3b6d}nV6_>VZwY6@oMQgQ-wXJQnt*w?K{J!VSB=L`5^GVLR_uO;uJ@>5l zzTCR`+UC$}r=L9zV4OK*$y7_GSu)*{88&_(=fxvk%59k`v$Qo^!TAd2D7ZkuT))io z%X~{JEUC1SEaxd$;FpDp7uiUX#WwktD5$bzsbcb^%Q6KQ+6Z~1TALTyvRqbZYo&tk zSaPwAvt*T$SKG2iYP7Xh!8%K7ZH$tjb}sQto#OQh>Mhw|qewPtr$Ko(DQL9ektPM3 z6>N!{(fk6B48%SEMaXSH>CFmS6tpU6Q?OM}d8vYJmRzQ~xLi9|*zn4BWw_Fot0bhY zt1Y?4mTToY8*^lba_#g*7l&6#*DKg%%MEg)vfrc}H`^h(Me5^uzFYmW+m_qpc9ngP zU+%E6Lc$4>C3jkKmtXD<0CJxa?^p0$OCIpcgEm&nV!!NDzWug5BoF)L5!L;pHjYTA zUmmmMfbR6TYV~`5c|!4%emQ8#Q%Vm#t%O5g9RAyrA1Iw&g{6$uB>Mmr?RV1wZo3%YJ!92VYh8AN%Ds8&}Bd zD&SA7ko>e)OGby^(A9qCmp8TZmW?KP+m?6a-FPXMpX=Vgu;e|(zqI6p;`jaXfnR>5 z;~y&cwGuy4eSDlCW92sreyf7~&M&|B%O^Vg2VMMAZT*p^OQM&^c=?mI8r433*5S{z z^%ouZtBUkD1)p2;g)M)Ve<;I0RbgM+5c!v`^luMv1NpC#uT*PaEBFs-d(xEUq_X_i zmQ(VL%5vJ0GXhWjrn+#Qr!wHLJny2_a~3VD63AT6fj|7Qr@)Te(iUtBwg`rW_jpso z&*vtFmwOAsPw;PtcXW8TFDE&nttGfLxUIFVS@~o|_^@x{n7EdP`gPh*tZlBjv?{o{ zrn#oIsacRz+tjwUA-JeHxURmXzNs-h!G@$XyjSjKA^U-&QajXo1+87sWnKG*v*%lN~4?MF;$NjN{D zbj;uIxr1Nggk|C#W19pA@8bgpzs3m%zftg8?fw<7g?A=w3pplH0LKh4Ne=#Ik{z7k zd@=Z3kk;D9^Vioj6t8QDX{)%hroPb;M|r&Bb4-f13h=pQ0*)DI202nfvUqfUdQ)>< zal@q>>Kcmc8#lML7S9h}wzjFJxz;hMX0T(@@Oi3b(jAjwG98n}l}xtD6l90LNlg#u zrg?{}NJAVm)Z_@9m*@R zDV}2rO_5{H)^4$au?kAKINrt29sG*wC`ru9DK+Of_yyi`%s4aNF%!&0%be?&NoJyB z%FM*@#>AYa$&Q&~rmASu9Q*`7btn$}>gWiD{cTs^=%GhdKAi~d$a59=LwOoge`T^0zk!dt9?VP`-|=E7vNC@Ib? zPL?vqEHPD%S!$LkxG-EjpgyNs_rJ(7%gqXbRpt6J86C5ddNSV$e>7l%{|)@ikufqP zJR~X8lTBQfGhVkXzqa-%7LBUmmP=q)=#qi&b5#%xcH1QG?V_ z@3$mX``^Ypj#+Eg9sVroLz!G_f{wYw)CmR@&B|R?HGB2a*%vKcwq&+t);p%&Y+z{R za%9%RW#tvKSD(MgF&pWSrU56yoUUa(KJz6<;&()%*w4;IH!!%&1Q>ZnoVVR zVPI%Ui)nRCn@Vdj4=fF~u)Eb<>X>cjGRs`x!&w@ z@Ue2;U~Y8GP3C6D++uEZ%x-N>F}FG9cC*JZcbIVa#eq39?sUvu=5EK_WA1fif`&`G z>2UC&uCQ12c%Op%&37I1fO*itXZVX{_Bm$1dB`yj5BqGM~8w2APX#78f(c5eGEOxqUi; zi)maJ(+6BkgSwb*;9~0D#Y~LENfe%ml<*7onz$dcB*x_Tz?bjs3L!4v7lG9UKYNH* zVCQ>XN~|| z%$wouMrMY$s2f=kWM_DLFeHMZ9msQOIT7Si?qTh)BN*<9U_=CY$x|X2*?HyzQuG`i z=sA{P5aCMpzJpL4Rv`~-D0~eHP>XS>!z8T7bkw698!!i(c)UhbVGAxq8!pCHa$ic$ zE6BN>3cVW5xW+yBxai^V6~1;i+l>FXz7)qbPO@dV(*oDeJltnGYuJ||YUICU&V=U- z_wrddW#Jq5H_4(iBHPAkj(e%oZPYqTTFjCc&}vT3kf+)RVs(r3(UUUqne;btnT z1+&sZkr(k=TVv9!qt*5291k^L+>Nm=EQz2rB~2nYCxUSU24OsZ2P6%`#0Vy(q=EDh z2h=j+T4pF02X3Qh-HtTup;qp|7=%%bJ5h?exFf4^Y{zn{Q-3m3&f`L5DG6I5n4FUM zn+T?)B>JofruMHp*fq?(h(kN&>|jjoWys&hGlf|CqYKJ*&Sk5BVV@TPi)>_=*0s<*Vvm%%uiS-rz6oo7BHOI$k=iOM6G z)ya@@TeG9|h0)&mo~hX(HmC2$#ABGVynxc{NOm_a=)v3tY){K3m^TRX>GYKzf(2CO z!m1sHo4i7HDtnQJ?Bag!p2yPx4^Wd2vbB%Kd>PHyC z0$0eQR?6}<386PJjrD6L-o|{^uSL8=u3+6-%M#PfinW^+elH8uL(EkNS%|uM6FJVy z$IC1|Z?No~;N9axmYq*{3;!!q{6Dz$SA?hWB}4UJl7O!y8DC2VPRdaHS4QF#g%pZ; zT8eN+#)p_#CNYm_-Izu{NRmuRlmT>&5#p01PBxVED@l<6PcjK#$UqsybW{X~GgHY& zzll1Z4CWex`}ouP_|s!KcBJOm6`EtyEy=L3!jjC8C0SrreGByNbOqZS7~zFdy_3$l zk*>+4B*ihqU(to_wEK2X>B|_YjsKAeu8d^@#<+4F-;cqHvkL-O(W64q5dPE?>KlHG z!yB?oyK(gb^+@)ZLHvPhI^hcp?7_8V-l7PuEAw$6z8%9eyn!8b*y;@55$x>1K*iU$ zBZ2f?N~gE=I`$3hYwf%-=GH1kX%T%pf}0k7oAKso1n6i=%5~kih5hK9P85~JeQU}8 z%^6-;oDw)AEf&0MRHa2h$5jC2#%DSf{qOVJtLg1qWL z{B~h6Jd7V3_h>I9_AE9JBboPzN2_5y)<5-0uvW{retyZ&2;ABinX)d1;?3AO9NpF zcxTlP39&l8-!E8z%7>goPZ&qJ&Y>qvaAne1H5lW{q?e1rm`r-f=#ykLCE=?#CP^EY zQb~qIC84S^T|r7cMANbuJ$F?{_y2wW{!ztDqGHOBCXbGRb>62mD|0lyx z%D}f{R0e6F1bT@*5W(G*`GrStPZ#dx_V>19L^Mf+(B6fPSi;!bh5I!1-_K0li3Dwa zSE~RgKF|T1=)rba-cEQuUD(HU_O)Z8TK*{Z3lTHKfkj^L3F zB;@O)PQ-PdIT4*YfE$DYkM?iY$!5PU+}nZ7UzG0cQR#&;6OARe@ad9=|I}z4mkPLauzG|5cVH$M^dbw zZ;Fxp9*%!+XE*q{ts75jqq;9bcXJN2HQ}`EQlZ};tnQ<14rQ16gk3)?T?9|{k0>wc z^c0&Yfi~y((>hMl1fmX=ExK-kryGa5@r(xieKB%34!_{uPdl^cS zsd132`BG1O1QAz_e^!SeaeBj4LYC)J&op%&rlCBdqm1Jr8pojt-q=-s2(R+IqVMo9 zBcABw6~32W7wF@k;0-*>etDGpSoV;+ zB^M(!Kqm5G;KgL*yF?Ek$s=R54fHU5HfY6rx7XxsMNMAHq<60SsL*6_780XRhV*X` z5DCnn2~%03V$C97ZnCW(ccS*>dtKb>P-pWAd|gGs5xn#SS26B=*mj3rqx-$ym-#`L v%$2jqePxt0=bI^Q`$GeApe%p|H$ Date: Mon, 24 Jul 2017 17:09:40 -0400 Subject: [PATCH 10/17] attempting to write to an output image --- build/classes/tutorial/clTexture/Main.class | Bin 14349 -> 15119 bytes nbproject/private/private.xml | 1 + src/tutorial/clTexture/Main.java | 42 +++++++++++++++----- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/build/classes/tutorial/clTexture/Main.class b/build/classes/tutorial/clTexture/Main.class index 061cde17e8941da09747969225dd694aaaaae979..e04dc8783198fc773abca3a6a1ea0b49f0cc9e21 100644 GIT binary patch delta 7023 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:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Main.java file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Image.java file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Texture.java + file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/DemoFractal.java diff --git a/src/tutorial/clTexture/Main.java b/src/tutorial/clTexture/Main.java index 719650e..b3511af 100644 --- a/src/tutorial/clTexture/Main.java +++ b/src/tutorial/clTexture/Main.java @@ -49,7 +49,7 @@ public class Main { public static Image img; - static final String kernel + static final String source = "kernel void imgTest(__read_only image2d_t inputTexture){\n" + " int2 imgCoords = (int2)(get_global_id(0), get_global_id(1));\n" + " //printf(\"Coord x:%d Coord y:%d \", imgCoords.x, imgCoords.y);\n\n" @@ -58,6 +58,16 @@ public class Main { + " printf(\"(%d, %d) RGBA(%f, %f, %f, %f)\\n\", imgCoords.x, imgCoords.y, imgVal.x, imgVal.y, imgVal.z, imgVal.w);\n" + "}"; + static final String code + = "kernel void imgTest2(read_only image2d_t inTexture, write_only image2d_t outTexture){\n" + + " const sampler_t smp = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;\n\n" + + " uint offset = get_global_id(1)*0x4000 + get_global_id(0)*0x1000;\n" + + " int2 coord = (int2)(get_global_id(0), get_global_id(1));\n" + + " uint4 pixel = read_imageui(inTexture, smp, coord);\n" + + " pixel.x -= offset;\n" + + " write_imageui(outTexture, coord, pixel);\n" + + "}"; + //VARS FOR CL CONVERSION private CLCommandQueue[] queues; //array of cl command queues private CLContext context; //CL context @@ -65,15 +75,17 @@ public class Main { private CLEvent[] clEvents; //array of cl events for private CLKernel[] kernels; //array of cl kernels for private CLMem[] glBuffers; //array of clm for + private CLMem[] glBuffersOut; //array of clm for private CLProgram[] programs; //array of cl programs for private GLSync glSync; //glsync so that cl & gl dont cause race condition private GLSync[] clSyncs; //array of gl sync objects for private IntBuffer glIDs; //int buffer for + private IntBuffer glIDs2; //int buffer for private boolean buffersInitialized; //buffers for something initialized private boolean doublePrecision = true; //doubles used instead of floats private boolean drawSeparator; //no idea what this is private boolean rebuild; //boolean for rerendering - private boolean run = true; //boolena for running the program + private boolean run = true; //boolean for running the program private boolean syncCLtoGL; // true if we can make CL wait on sync objects generated from GL. private boolean syncGLtoCL; // true if we can make GL wait on events generated from CL queues. private boolean useTextures = true; //for something... @@ -82,6 +94,7 @@ public class Main { private int deviceType = CL10.CL_DEVICE_TYPE_GPU; private int slices; //dividing up the image for faster processing private static final int MAX_GPUS = 8; //Max GPUs used at once + public static Image img2; //CONSTRUCTOR public Main() { @@ -93,7 +106,8 @@ public static void main(String... args) throws Exception { String imgName = "smileTexture2.jpg"; //CREATE IMAGE OBJECT Image img = new Image(imgDir + "" + imgName); - + img2 = new Image(imgDir + "" + imgName); + //INIT DISPLAY & GL CONTEXT initDisplay(); initGL(); @@ -163,7 +177,10 @@ public static void glSettings() { public void initGLTexture(Image img) { if (glBuffers == null) { glBuffers = new CLMem[slices]; + glBuffersOut = new CLMem[slices]; + glIDs = BufferUtils.createIntBuffer(slices); + glIDs2 = BufferUtils.createIntBuffer(slices); } else { for (CLMem mem : glBuffers) { clReleaseMemObject(mem); @@ -178,12 +195,18 @@ public void initGLTexture(Image img) { if (useTextures) { GL11.glGenTextures(glIDs); - + GL11.glGenTextures(glIDs2); for (int i = 0; i < slices; i++) { Texture texture = new Texture(img, GL_TEXTURE_2D, glIDs.get(i)); glBuffers[i] = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_READ_ONLY, texture.getTarget(), 0, texture.getId(), null); } glBindTexture(GL_TEXTURE_2D, 0); + + for (int i = 0; i < slices; i++) { + Texture texture = new Texture(img2, GL_TEXTURE_2D, glIDs2.get(i)); + glBuffersOut[i] = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_WRITE_ONLY, texture.getTarget(), 0, texture.getId(), null); + } + glBindTexture(GL_TEXTURE_2D, 0); } buffersInitialized = true; } @@ -258,7 +281,7 @@ private void buildProgram(CLContext context) { } for (int i = 0; i < programs.length; i++) { - programs[i] = CL10.clCreateProgramWithSource(context, kernel, null); + programs[i] = CL10.clCreateProgramWithSource(context, code, null); } for (int i = 0; i < programs.length; i++) { @@ -297,14 +320,15 @@ private void fillQueue(CLContext context) { //INITIALIZES THE KERNEL private void initKernel() { for (int i = 0; i < kernels.length; i++) { - kernels[i] = CL10.clCreateKernel(programs[min(i, programs.length)], "imgTest", null); + kernels[i] = CL10.clCreateKernel(programs[min(i, programs.length)], "imgTest2", null); } } //PASSES IN THE ARGUMENTS TO THE KERNEL private void setKernelParams() { for (int i = 0; i < slices; i++) { - kernels[i].setArg(0, glBuffers[i]); + kernels[i].setArg(0, glBuffers[i]) + .setArg(1, glBuffersOut[i]); } } @@ -408,8 +432,8 @@ private void render(Image img) { int seperatorOffset = drawSeparator ? i : 0; //BIND THE TEXTURE - glBindTexture(GL_TEXTURE_2D, glIDs.get(i)); - + glBindTexture(GL_TEXTURE_2D, glIDs2.get(i)); + //SETS GL SETTINGS glSettings(); From 438379112fdf3a4f4d5b437a47cef7f22c2bdf67 Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Tue, 25 Jul 2017 13:35:08 -0400 Subject: [PATCH 11/17] writing to texture working --- build/built-jar.properties | 4 +- build/classes/tutorial/clTexture/Main.class | Bin 15119 -> 15311 bytes res/blank.jpg | Bin 0 -> 667 bytes src/tutorial/clTexture/Main.java | 76 +++++++++++++------- 4 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 res/blank.jpg diff --git a/build/built-jar.properties b/build/built-jar.properties index e26f71e..01945bc 100644 --- a/build/built-jar.properties +++ b/build/built-jar.properties @@ -1,4 +1,4 @@ -#Tue, 11 Jul 2017 15:33:57 -0400 +#Tue, 25 Jul 2017 12:58:27 -0400 -C\:\\Users\\labramson\\Downloads\\Tutorial\\Tutorial= +C\:\\Users\\labramson\\Documents\\Tutorial= diff --git a/build/classes/tutorial/clTexture/Main.class b/build/classes/tutorial/clTexture/Main.class index e04dc8783198fc773abca3a6a1ea0b49f0cc9e21..bbd40205e56a9f54cfe6fc58f0a6c249219108d4 100644 GIT binary patch delta 7222 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 BO`HG# delta 7178 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 qA3 5 & coord.y > 5) { \n" + + " pixel.x /= 1.5;\n" + + " pixel.y /= 1.5;\n" + + " pixel.z /= 1.5;\n" + + " }\n" + + " write_imagef(outTexture, coord, pixel);\n" + "}"; //VARS FOR CL CONVERSION @@ -82,19 +87,17 @@ public class Main { private IntBuffer glIDs; //int buffer for private IntBuffer glIDs2; //int buffer for private boolean buffersInitialized; //buffers for something initialized - private boolean doublePrecision = true; //doubles used instead of floats private boolean drawSeparator; //no idea what this is private boolean rebuild; //boolean for rerendering - private boolean run = true; //boolean for running the program private boolean syncCLtoGL; // true if we can make CL wait on sync objects generated from GL. private boolean syncGLtoCL; // true if we can make GL wait on events generated from CL queues. - private boolean useTextures = true; //for something... + private final boolean doublePrecision = true; //doubles used instead of floats + private final boolean useTextures = true; //for something... private final PointerBuffer kernel2DGlobalWorkSize = BufferUtils.createPointerBuffer(2); //the global work size of the kernel private final PointerBuffer syncBuffer = BufferUtils.createPointerBuffer(1); //buffer for dealing with gl cl sync private int deviceType = CL10.CL_DEVICE_TYPE_GPU; private int slices; //dividing up the image for faster processing private static final int MAX_GPUS = 8; //Max GPUs used at once - public static Image img2; //CONSTRUCTOR public Main() { @@ -103,11 +106,12 @@ public Main() { public static void main(String... args) throws Exception { //IMAGE FILE String imgDir = "C:\\Users\\labramson\\Documents\\Tutorial\\res\\"; - String imgName = "smileTexture2.jpg"; + String imgName = "texture.png"; + String imgName2 = "blank.jpg"; //CREATE IMAGE OBJECT - Image img = new Image(imgDir + "" + imgName); - img2 = new Image(imgDir + "" + imgName); - + img = new Image(imgDir + "" + imgName); + img2 = new Image(imgDir + "" + imgName2); + //INIT DISPLAY & GL CONTEXT initDisplay(); initGL(); @@ -117,10 +121,14 @@ public static void main(String... args) throws Exception { //SET UP CL run.initCL(); + //CREATE THE TEXTURE IN GL CONTEXT run.initGLTexture(img); + run.initWritableTexture(img2); + //COMPLETE ALL GL glFinish(); + //SET THE KERNEL PARAMS FOR CL COMPUTAIONS run.setKernelParams(); @@ -148,7 +156,6 @@ public static void initDisplay() { try { Display.setDisplayMode(new DisplayMode(300, 300)); Display.setTitle("Texture Demo"); - Display.setSwapInterval(0); Display.create(); } catch (LWJGLException e) { e.printStackTrace(); @@ -157,7 +164,6 @@ public static void initDisplay() { } public static void initGL() { - glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight()); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, 300, 300, 0, 1, -1); @@ -177,10 +183,8 @@ public static void glSettings() { public void initGLTexture(Image img) { if (glBuffers == null) { glBuffers = new CLMem[slices]; - glBuffersOut = new CLMem[slices]; - + glIDs = BufferUtils.createIntBuffer(slices); - glIDs2 = BufferUtils.createIntBuffer(slices); } else { for (CLMem mem : glBuffers) { clReleaseMemObject(mem); @@ -195,16 +199,38 @@ public void initGLTexture(Image img) { if (useTextures) { GL11.glGenTextures(glIDs); - GL11.glGenTextures(glIDs2); for (int i = 0; i < slices; i++) { Texture texture = new Texture(img, GL_TEXTURE_2D, glIDs.get(i)); glBuffers[i] = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_READ_ONLY, texture.getTarget(), 0, texture.getId(), null); + inTexture = texture; } glBindTexture(GL_TEXTURE_2D, 0); - + } + } + + public void initWritableTexture(Image img) { + if (glBuffersOut == null) { + glBuffersOut = new CLMem[slices]; + + glIDs2 = BufferUtils.createIntBuffer(slices); + } else { + for (CLMem mem : glBuffersOut) { + clReleaseMemObject(mem); + } + + if (useTextures) { + glDeleteTextures(glIDs2); + } else { + glDeleteBuffers(glIDs2); + } + } + + if (useTextures) { + GL11.glGenTextures(glIDs2); for (int i = 0; i < slices; i++) { - Texture texture = new Texture(img2, GL_TEXTURE_2D, glIDs2.get(i)); + Texture texture = new Texture(img, GL_TEXTURE_2D, glIDs2.get(i)); glBuffersOut[i] = CL10GL.clCreateFromGLTexture2D(context, CL10.CL_MEM_WRITE_ONLY, texture.getTarget(), 0, texture.getId(), null); + outTexture = texture; } glBindTexture(GL_TEXTURE_2D, 0); } @@ -244,7 +270,7 @@ public void initCL() { System.out.println("Devices obtained"); slices = min(devices.size(), MAX_GPUS); - System.out.println("Slices:" + slices); + System.out.println("Slices: " + slices); // Create the OpenCL context using the patform, devices, and the OpenGL drawable context = CLContext.create(platform, devices, null, drawable, null); @@ -266,7 +292,7 @@ public void initCL() { syncStatus(context); } catch (Exception e) { - System.out.println("*** Problem creating CL texture"); + System.out.println("*** Problem creating CL context"); e.printStackTrace(); } } @@ -393,6 +419,7 @@ public void display(Image img) { for (int i = 0; i < slices; i++) { // acquire GL objects, and enqueue a kernel with a probe from the list clEnqueueAcquireGLObjects(queues[i], glBuffers[i], null, null); + clEnqueueAcquireGLObjects(queues[i], glBuffersOut[i], null, null); clEnqueueNDRangeKernel(queues[i], kernels[i], 2, null, @@ -401,6 +428,7 @@ public void display(Image img) { null, null); CL10GL.clEnqueueReleaseGLObjects(queues[i], glBuffers[i], null, syncGLtoCL ? syncBuffer : null); + CL10GL.clEnqueueReleaseGLObjects(queues[i], glBuffersOut[i], null, syncGLtoCL ? syncBuffer : null); if (syncGLtoCL) { clEvents[i] = queues[i].getCLEvent(syncBuffer.get(0)); clSyncs[i] = glCreateSyncFromCLeventARB(queues[i].getParent(), clEvents[i], 0); @@ -432,7 +460,7 @@ private void render(Image img) { int seperatorOffset = drawSeparator ? i : 0; //BIND THE TEXTURE - glBindTexture(GL_TEXTURE_2D, glIDs2.get(i)); + glBindTexture(GL_TEXTURE_2D, outTexture.getId()); //SETS GL SETTINGS glSettings(); From 912fed359b07a2d86d894a16e46c34b28987efce Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Fri, 28 Jul 2017 17:01:28 -0400 Subject: [PATCH 12/17] trying to convert logic to 3D --- build/classes/tutorial/clTexture/Main.class | Bin 15311 -> 15323 bytes .../classes/tutorial/clTexture3d/Image.class | Bin 0 -> 3594 bytes build/classes/tutorial/clTexture3d/Main.class | Bin 0 -> 16035 bytes .../tutorial/clTexture3d/Texture.class | Bin 0 -> 1445 bytes src/tutorial/clTexture/Main.java | 14 +- src/tutorial/clTexture3d/Image.java | 106 ++++ src/tutorial/clTexture3d/Main.java | 544 ++++++++++++++++++ src/tutorial/clTexture3d/Texture.java | 74 +++ 8 files changed, 731 insertions(+), 7 deletions(-) create mode 100644 build/classes/tutorial/clTexture3d/Image.class create mode 100644 build/classes/tutorial/clTexture3d/Main.class create mode 100644 build/classes/tutorial/clTexture3d/Texture.class create mode 100644 src/tutorial/clTexture3d/Image.java create mode 100644 src/tutorial/clTexture3d/Main.java create mode 100644 src/tutorial/clTexture3d/Texture.java diff --git a/build/classes/tutorial/clTexture/Main.class b/build/classes/tutorial/clTexture/Main.class index bbd40205e56a9f54cfe6fc58f0a6c249219108d4..13660a772e2c57f2645caaae8edebe4234d26222 100644 GIT binary patch delta 47 zcmX?Ke!F}_i~ytD=2(H{jFW^UBou(4AhRMhN3T*r-&Vm;&(xX=B(_;YXt^c;aQ_W^ delta 40 wcmcaze!hG|i~yt1=2(H{i~7)?AZigd{dw2rbqG03_!Oj{pDw diff --git a/build/classes/tutorial/clTexture3d/Image.class b/build/classes/tutorial/clTexture3d/Image.class new file mode 100644 index 0000000000000000000000000000000000000000..acd1ad74bdcb7785fcc1c3028cf887a07f957cf3 GIT binary patch literal 3594 zcmai1X?Gh}8Gf!u(#Vr>7B_L?I8L23PZVf#FbqjV`*$nGM2<> ztXvpZ1wTxZ#okE@vv@0xw06J!TD|2+niDvf=nqWfokDWty04aPk0xTCRq}05;Lg@S<~+xjfJ`d^ipG6=EzHDNtl6kV zx6QO*-S4PdJ?B})oRcZhQY35nmO$IWh>ow*FhiXSsG}wNNuG8toDcaE<2)rP)K|^n z_9QZ93S}>22Y?tV)_Y}HOuPrrnRpl@CQjkBi5bkAco*(7@gX@oiTebOw=i_Huu?4K z?Y!T}vhJEtMiMot_GXG!#y0T{d{dw02V9bbQam^LT)zQyy71nN=!ZEc@iNZLLUi59s*5i5Kt#8c|}3el>=e z_#vJXI5cTpty`Cs>swT(&%}@LV;w&+@l*Uv$Ingt0>32ZYdHofG%>R3sq8y$^1M~b zDUQfser4iC{90glO! z6&)KUHu1WSH%x5dO%s2@O%s2{EfasiUj+`|{+tTzt%EbQc*V}JEw%b=W;@$fLiUVZ zl6?7+Z{;&QhDQ^r@EA!7wi1B6J`o=99k&-!^Yf{cwAv8P%ypi=6}l^w8B}=AS?r5! zTVbJTHz;oNvVdNcLT;XVGQYK;vr;N0dunQm=Zr+j3Y-bUl3R5G4L9VnL!s$*k8+^; z%B)9<3v>_cJq`6up8A|sQY~MBJs)P#a76@-hbJJzG<-SThZE3R15JHe5FsY_(|52m8(ZR~L*VOSQ={n?`7= z%k-@$#`%#n*jJ-{b(^4+LV#KHh9FgV%1NBv!JSqV)>Zb>QhV03uBoaEoN7>0OT&!_ z1u3cZsl}4*t@0A+C-$=AR#83H7>ZZt@-p`AF~?Im9;zL=W>K2#RPa@or@XAZ#dhT_-&wW8r><&LO;Xg276S3X5Ul3? z+ufBKn=ju=5(^_d#{mthib0R0<;arj6lL)m1yr{k#xcIPCHeLj<*OPmAI>`E)uX<7 zEvau_59*sY1ixbtvdwcm%csBdO|XsMPY!HA3=9lzplu!6z`$$JDu}Ej8ct*D&#jbl-+yjz^($>_dcU zb>KJ-;V%B2z!V1Y1e1D@yIn!JcrPB}69dQl@O~!KCa>Z!sb`__59oardph@4ux|^U zX{L6^CiYJb-IyGzpiA7KaGdY7UHsRS`@_UWzDLK2(|+EkUBu}ik?J8*()9oX+fPRl z*Ea6NFp4o1PH!!oUOb}08K*pvzNFK-z&V@`LK81AMd{@&8QMXH79f47g6`*WQVVg9 zTn;8NU2Nj;w z4OVc^+~5sn7vMR9y_}B{&vBw~4nss?3?IM(K8PZVx{8Z<8jtdgVj3^;t?6~l;T9gl zKaj@1Fpq!ZafSOdEew$iDeB5HYt%oj3j9`x`z;*C1SW~`0)J-&az$JTDe{>#fS!9hEOJ`R&S@M6=OzZb#+ElvMhEPMM4K literal 0 HcmV?d00001 diff --git a/build/classes/tutorial/clTexture3d/Main.class b/build/classes/tutorial/clTexture3d/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..bdd7606a3de53154d3276baa6689589d11b85c73 GIT binary patch literal 16035 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 Q9Y=6{7;PTnhxv2=3opSxEdT%j literal 0 HcmV?d00001 diff --git a/build/classes/tutorial/clTexture3d/Texture.class b/build/classes/tutorial/clTexture3d/Texture.class new file mode 100644 index 0000000000000000000000000000000000000000..d86740f525300a906e72d7fe08f45fd3866b7367 GIT binary patch literal 1445 zcmaJ>+fvg|6kX|swjl^DAOZyi1WUMty9iaWAeR}&D}&Ez32B(pIx!V_)Bo{7XQ(nh z_yPWfKjOG{8qi^)?abcm>~q$>o|7NHzI_Lm~#PSCud1wo4< zmPFiDp8mcGs(WHPHGg32$nGjhd8g`l4-^dL{&#R^XMA5lY`u0s zm+iYw)p}AtE?VxMS**~K*{zk#%D%}kTnEOOS9abg7!3Ctq{0+pMW@Pyqd5tYVg-9a z9kj5%BrSfnbd?(qcXm-tT+Y&$a9%ZABo4QO4yi9|b+=?~I+C*%WH5bXzBLte*Ie7E zoE+H|qxRaWQf=+d&i=zbr=cGs8hX)}zyl5A7}d~)ZVkGi>w*gEW6QH# zhXd!1KTMU4DV$n``r)C19(L9bS#@eg;nefZmdojAz6U?d{Dxc;(wo0f!uURhc$qu- z0OHi_2~kEm;%hd=*X)b0*+A+9uX;bSlmlG-go+roqklzIpJ*VaPkceVffmt;29kQV zfs{VbfSMgRM{7n)=OUT5b6gV?y+lfS41p0BFq&ykCX>;0ZzA2L&|Swl(w`YDf 5 & coord.y > 5) { \n" - + " pixel.x /= 1.5;\n" - + " pixel.y /= 1.5;\n" - + " pixel.z /= 1.5;\n" + + " pixel.x /= 1.5;\n" + + " pixel.y /= 1.5;\n" + + " pixel.z /= 1.5;\n" + " }\n" + " write_imagef(outTexture, coord, pixel);\n" + "}"; @@ -121,14 +121,14 @@ public static void main(String... args) throws Exception { //SET UP CL run.initCL(); - + //CREATE THE TEXTURE IN GL CONTEXT run.initGLTexture(img); run.initWritableTexture(img2); - + //COMPLETE ALL GL glFinish(); - + //SET THE KERNEL PARAMS FOR CL COMPUTAIONS run.setKernelParams(); diff --git a/src/tutorial/clTexture3d/Image.java b/src/tutorial/clTexture3d/Image.java new file mode 100644 index 0000000..88763e8 --- /dev/null +++ b/src/tutorial/clTexture3d/Image.java @@ -0,0 +1,106 @@ +package tutorial.clTexture3d; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.color.ColorSpace; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.ComponentColorModel; +import java.awt.image.DataBuffer; +import java.awt.image.DataBufferByte; +import java.awt.image.Raster; +import java.awt.image.WritableRaster; +import java.io.FileInputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Hashtable; +import javax.imageio.ImageIO; + +/* + * @author LAA + */ +public class Image { + + private final int width, height; + private final BufferedImage img; + + /* The color model including alpha for the GL image */ + private final ColorModel glAlphaColorModel; + /* The color model for the GL image */ + private final ColorModel glColorModel; + + public Image(String imgFile) { + this.img = getBuffImage(imgFile); + this.width = img.getWidth(); + this.height = img.getHeight(); + this.glAlphaColorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), + new int[]{8, 8, 8, 8}, + true, + false, + ComponentColorModel.TRANSLUCENT, + DataBuffer.TYPE_BYTE); + + this.glColorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), + new int[]{8, 8, 8, 0}, + false, + false, + ComponentColorModel.OPAQUE, + DataBuffer.TYPE_BYTE); + } + + private BufferedImage getBuffImage(String imageFile) { + System.out.println("Fetching image file"); + try { + BufferedImage img = ImageIO.read(new FileInputStream(imageFile)); + return img; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public ByteBuffer getByeBuff() { + ByteBuffer byteBuffer; + WritableRaster raster; + BufferedImage texImage; + + System.out.println("Making image byte buffer"); + + // create a raster that can be used by OpenGL as a source for a texture + if (this.img.getColorModel().hasAlpha()) { + raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, this.img.getWidth() + 1, this.img.getHeight(), 4, null); + texImage = new BufferedImage(glAlphaColorModel, raster, false, new Hashtable()); + } else { + raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, this.img.getWidth() + 1, this.img.getHeight(), 3, null); + texImage = new BufferedImage(glColorModel, raster, false, new Hashtable()); + } + + // copy the source image into the produced image + Graphics g = texImage.getGraphics(); + g.setColor(new Color(0f, 0f, 0f, 0f)); + g.fillRect(0, 0, this.img.getWidth() + 1, this.img.getHeight()); + g.drawImage(this.img, 0, 0, null); + + // build a byte buffer from the temporary image to produce a texture + byte[] data = ((DataBufferByte) texImage.getRaster().getDataBuffer()).getData(); + + byteBuffer = ByteBuffer.allocateDirect(data.length); + byteBuffer.order(ByteOrder.nativeOrder()); + byteBuffer.put(data, 0, data.length); + byteBuffer.flip(); + + return byteBuffer; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public BufferedImage getImg() { + return img; + } +} diff --git a/src/tutorial/clTexture3d/Main.java b/src/tutorial/clTexture3d/Main.java new file mode 100644 index 0000000..ee01f3d --- /dev/null +++ b/src/tutorial/clTexture3d/Main.java @@ -0,0 +1,544 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package tutorial.clTexture3d; + +import java.nio.IntBuffer; +import java.util.List; +import org.lwjgl.*; +import org.lwjgl.input.Keyboard; +import org.lwjgl.opencl.CL10; +import org.lwjgl.opencl.CL10GL; +import org.lwjgl.opencl.CL; +import org.lwjgl.opencl.CLCapabilities; +import org.lwjgl.opencl.CLCommandQueue; +import org.lwjgl.opencl.CLContext; +import org.lwjgl.opencl.CLDevice; +import org.lwjgl.opencl.CLDeviceCapabilities; +import org.lwjgl.opencl.CLEvent; +import org.lwjgl.opencl.CLKernel; +import org.lwjgl.opencl.CLMem; +import org.lwjgl.opencl.CLPlatform; +import org.lwjgl.opencl.CLProgram; +import org.lwjgl.opencl.api.Filter; +import org.lwjgl.opengl.*; +import static java.lang.Math.min; +import static org.lwjgl.opencl.CL10.CL_PROGRAM_BUILD_LOG; +import static org.lwjgl.opencl.CL10.CL_QUEUE_PROFILING_ENABLE; +import static org.lwjgl.opencl.CL10.clEnqueueNDRangeKernel; +import static org.lwjgl.opencl.CL10.clEnqueueWaitForEvents; +import static org.lwjgl.opencl.CL10.clFinish; +import static org.lwjgl.opencl.CL10.clReleaseMemObject; +import static org.lwjgl.opencl.CL10GL.clEnqueueAcquireGLObjects; +import static org.lwjgl.opencl.KHRGLEvent.clCreateEventFromGLsyncKHR; +import static org.lwjgl.opengl.ARBCLEvent.glCreateSyncFromCLeventARB; +import static org.lwjgl.opengl.ARBSync.GL_SYNC_GPU_COMMANDS_COMPLETE; +import static org.lwjgl.opengl.ARBSync.glFenceSync; +import static org.lwjgl.opengl.ARBSync.glWaitSync; +import static org.lwjgl.opengl.GL11.*; +import static org.lwjgl.opengl.GL12.*; +import static org.lwjgl.opengl.GL15.glBindBuffer; +import static org.lwjgl.opengl.GL15.glDeleteBuffers; +import static org.lwjgl.opengl.GL21.GL_PIXEL_UNPACK_BUFFER; + +/* + * @author labramson + */ +public class Main { + + public static Image img; + public static Image img2; + private Texture inTexture, outTexture; + + static final String source + = "kernel void imgTest(__read_only image2d_t inputTexture){\n" + + " int2 imgCoords = (int2)(get_global_id(0), get_global_id(1));\n" + + " //printf(\"Coord x:%d Coord y:%d \", imgCoords.x, imgCoords.y);\n\n" + + " const sampler_t smp = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;\n\n" + + " float4 imgVal = read_imagef(inputTexture, smp, imgCoords); \n" + + " printf(\"(%d, %d) RGBA(%f, %f, %f, %f)\\n\", imgCoords.x, imgCoords.y, imgVal.x, imgVal.y, imgVal.z, imgVal.w);\n" + + "}"; + static final String code + = "kernel void imgTest2(__read_only image3d_t inTexture, __write_only image3d_t outTexture){\n" + + " #pragma OPENCL EXTENSION cl_khr_3d_image_writes: enable;\n" + + " const sampler_t smp = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;\n\n" + + " uint offset = get_global_id(1)*0x4000 + get_global_id(0)*0x1000;\n" + + " int2 coord = (int2)(get_global_id(0), get_global_id(1));\n" + + " float4 pixel = read_imagef(inTexture, smp, coord);\n" + + " if (coord.x > 5 & coord.y > 5) { \n" + + " pixel.x -= 1.5;\n" + + " pixel.y -= 1.5;\n" + + " pixel.z -= 1.5;\n" + + " }\n" + + " write_imagef(outTexture, coord, pixel);\n" + + "}"; + + //VARS FOR CL CONVERSION + private CLCommandQueue[] queues; //array of cl command queues + private CLContext context; //CL context + private CLEvent glEvent; //cl event + private CLEvent[] clEvents; //array of cl events for + private CLKernel[] kernels; //array of cl kernels for + private CLMem[] glBuffers; //array of clm for + private CLMem[] glBuffersOut; //array of clm for + private CLProgram[] programs; //array of cl programs for + private GLSync glSync; //glsync so that cl & gl dont cause race condition + private GLSync[] clSyncs; //array of gl sync objects for + private IntBuffer glIDs; //int buffer for + private IntBuffer glIDs2; //int buffer for + private boolean buffersInitialized; //buffers for something initialized + private boolean drawSeparator; //no idea what this is + private boolean rebuild; //boolean for rerendering + private boolean syncCLtoGL; // true if we can make CL wait on sync objects generated from GL. + private boolean syncGLtoCL; // true if we can make GL wait on events generated from CL queues. + private final boolean doublePrecision = true; //doubles used instead of floats + private final boolean useTextures = true; //for something... + private final PointerBuffer kernel2DGlobalWorkSize = BufferUtils.createPointerBuffer(2); //the global work size of the kernel + private final PointerBuffer syncBuffer = BufferUtils.createPointerBuffer(1); //buffer for dealing with gl cl sync + private int deviceType = CL10.CL_DEVICE_TYPE_GPU; + private int slices; //dividing up the image for faster processing + private static final int MAX_GPUS = 8; //Max GPUs used at once + + //CONSTRUCTOR + public Main() { + } + + public static void main(String... args) throws Exception { + //IMAGE FILE + String imgDir = "C:\\Users\\labramson\\Documents\\Tutorial\\res\\"; + String imgName = "texture.png"; + String imgName2 = "blank.jpg"; + //CREATE IMAGE OBJECT + img = new Image(imgDir + "" + imgName); + img2 = new Image(imgDir + "" + imgName2); + + //INIT DISPLAY & GL CONTEXT + initDisplay(); + initGL(); + + //INSTANCE OF MAIN TO RUN FUNCTIONS + Main run = new Main(); + + //SET UP CL + run.initCL(); + + //CREATE THE TEXTURE IN GL CONTEXT + run.initGLTexture(img); + run.initWritableTexture(img2); + + //COMPLETE ALL GL + glFinish(); + + //SET THE KERNEL PARAMS FOR CL COMPUTAIONS + run.setKernelParams(); + + //DISPLAY LOOP + while (!Display.isCloseRequested()) { + //ALLOWS DISPLAYING ON SCREEN + run.display(img); + + //IF ESC THEN CLOSE + if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { + Display.destroy(); + System.exit(0); + } + + //UPDATES THE DISPLAY WITH 60 FPS + Display.update(); + Display.sync(60); + } + + //DESTROYS THE DISPLAY + Display.destroy(); + } + + public static void initDisplay() { + try { + Display.setDisplayMode(new DisplayMode(300, 300)); + Display.setTitle("Texture Demo"); + Display.create(); + } catch (LWJGLException e) { + e.printStackTrace(); + } + Display.update(); + } + + public static void initGL() { + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, 300, 300, 0, 1, -1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + } + + //GL SETTINGS FOR THE TEXTURE + public static void glSettings() { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //CLEARS SCREEN EACH LOOP + glEnable(GL_DEPTH_TEST); //DISABLES DEPTH TEST + glEnable(GL_TEXTURE_3D); //ENABLES GL_TEXTURE_3D + glPixelStorei(GL_PACK_ALIGNMENT, 4); + } + + //INITIALIZE THE GL TEXTURE + public void initGLTexture(Image img) { + if (glBuffers == null) { + glBuffers = new CLMem[slices]; + + glIDs = BufferUtils.createIntBuffer(slices); + } else { + for (CLMem mem : glBuffers) { + clReleaseMemObject(mem); + } + + if (useTextures) { + glDeleteTextures(glIDs); + } else { + glDeleteBuffers(glIDs); + } + } + + if (useTextures) { + GL11.glGenTextures(glIDs); + for (int i = 0; i < slices; i++) { + Texture texture = new Texture(img, GL_TEXTURE_3D, glIDs.get(i)); + glBuffers[i] = CL10GL.clCreateFromGLTexture3D(context, CL10.CL_MEM_READ_ONLY, texture.getTarget(), 0, texture.getId(), null); + inTexture = texture; + } + glBindTexture(GL_TEXTURE_3D, 0); + } + } + + public void initWritableTexture(Image img) { + if (glBuffersOut == null) { + glBuffersOut = new CLMem[slices]; + + glIDs2 = BufferUtils.createIntBuffer(slices); + } else { + for (CLMem mem : glBuffersOut) { + clReleaseMemObject(mem); + } + + if (useTextures) { + glDeleteTextures(glIDs2); + } else { + glDeleteBuffers(glIDs2); + } + } + + if (useTextures) { + GL11.glGenTextures(glIDs2); + for (int i = 0; i < slices; i++) { + Texture texture = new Texture(img, GL_TEXTURE_3D, glIDs2.get(i)); + glBuffersOut[i] = CL10GL.clCreateFromGLTexture3D(context, CL10.CL_MEM_WRITE_ONLY, texture.getTarget(), 0, texture.getId(), null); + outTexture = texture; + } + glBindTexture(GL_TEXTURE_3D, 0); + } + buffersInitialized = true; + } + + //INITIALIZE CL PLATFORM, DEVICES, CONTEXT, COMMAND QUEUE, KERNEL + public void initCL() { + try { + // Initialize OpenCL + CL.create(); + System.out.println("\nCL created"); + + // Drawable context that OpenCL needs + Drawable drawable = Display.getDrawable(); + System.out.println("Drawable created"); + + // LWJGL CLPlatform object + CLPlatform platform = CLPlatform.getPlatforms().get(0); + System.out.println("Platform created"); + + final Filter glSharingFilter; + glSharingFilter = (final CLDevice device) -> { + final CLDeviceCapabilities abilities = CLCapabilities.getDeviceCapabilities(device); + System.out.println(abilities.CL_KHR_3d_image_writes); + return abilities.CL_KHR_gl_sharing; + }; + + // List of LJWGL CLDevice objects representing hardware or software contexts that OpenCL can use + List devices = platform.getDevices(CL10.CL_DEVICE_TYPE_GPU); + if (devices == null) { + deviceType = CL10.CL_DEVICE_TYPE_CPU; + devices = platform.getDevices(CL10.CL_DEVICE_TYPE_CPU, glSharingFilter); + if (devices == null) { + throw new RuntimeException("No OpenCL devices found with KHR_gl_sharing support."); + } + } + System.out.println("Devices obtained"); + + slices = min(devices.size(), MAX_GPUS); + System.out.println("Slices: " + slices); + + // Create the OpenCL context using the patform, devices, and the OpenGL drawable + context = CLContext.create(platform, devices, null, drawable, null); + System.out.println("Context created"); + + // Create an command queue using our OpenCL context + queues = new CLCommandQueue[slices]; + fillQueue(context); + System.out.println("Command Queue created"); + + buildProgram(context); + System.out.println("Program created"); + + kernels = new CLKernel[slices]; + initKernel(); + System.out.println("Kernel initialized"); + + //CHECK SYNC STATUS BTWN GL & CL + syncStatus(context); + + } catch (Exception e) { + System.out.println("*** Problem creating CL context"); + e.printStackTrace(); + } + } + + //CREATES THE CL PROGRAM WITH CORRECT OPTIONS + private void buildProgram(CLContext context) { + programs = new CLProgram[slices]; + if (programs[0] != null) { + for (CLProgram program : programs) { + CL10.clReleaseProgram(program); + } + } + + for (int i = 0; i < programs.length; i++) { + programs[i] = CL10.clCreateProgramWithSource(context, code, null); + } + + for (int i = 0; i < programs.length; i++) { + final CLDevice device = queues[i].getCLDevice(); + final StringBuilder options = new StringBuilder(useTextures ? "-D USE_TEXTURE" : ""); + final CLDeviceCapabilities caps = CLCapabilities.getDeviceCapabilities(device); + + if (doublePrecision) { + //cl_khr_fp64 + options.append(" -D DOUBLE_FP"); + + //amd's verson of double precision floating point math + if (!caps.CL_KHR_fp64 && caps.CL_AMD_fp64) { + options.append(" -D AMD_FP"); + } + } + System.out.println("\nOpenCL COMPILER OPTIONS: " + options); + + try { + CL10.clBuildProgram(programs[i], device, options, null); + } finally { + System.out.println("BUILD LOG: " + programs[i].getBuildInfoString(device, CL_PROGRAM_BUILD_LOG)); + } + } + } + + //FILLS THE COMMAND QUEUE APPROPRIATELY + private void fillQueue(CLContext context) { + for (int i = 0; i < slices; i++) { + // create command queue on each used device + queues[i] = CL10.clCreateCommandQueue(context, context.getInfoDevices().get(i), CL_QUEUE_PROFILING_ENABLE, null); + queues[i].checkValid(); + } + } + + //INITIALIZES THE KERNEL + private void initKernel() { + for (int i = 0; i < kernels.length; i++) { + kernels[i] = CL10.clCreateKernel(programs[min(i, programs.length)], "imgTest2", null); + } + } + + //PASSES IN THE ARGUMENTS TO THE KERNEL + private void setKernelParams() { + for (int i = 0; i < slices; i++) { + kernels[i].setArg(0, glBuffers[i]) + .setArg(1, glBuffersOut[i]); + } + } + + //CHECKS THE SYNC STATUS BTWN GL & CL AND VISE VERSA + private void syncStatus(CLContext context) { + final ContextCapabilities abilities = GLContext.getCapabilities(); + + syncGLtoCL = abilities.GL_ARB_cl_event; // GL3.2 or ARB_sync implied + if (syncGLtoCL) { + clEvents = new CLEvent[slices]; + clSyncs = new GLSync[slices]; + System.out.println("\nGL to CL sync: Using OpenCL events"); + } else { + System.out.println("\nGL to CL sync: Using clFinish"); + } + + // Detect CLtoGL synchronization method + syncCLtoGL = abilities.OpenGL32 || abilities.GL_ARB_sync; + if (syncCLtoGL) { + for (CLDevice device : context.getInfoDevices()) { + if (!CLCapabilities.getDeviceCapabilities(device).CL_KHR_gl_event) { + syncCLtoGL = false; + break; + } + } + } + + if (syncCLtoGL) { + System.out.println("CL to GL sync: Using OpenGL sync objects"); + } else { + System.out.println("CL to GL sync: Using glFinish"); + } + } + + //DISPLAYS THE RESULTS + public void display(Image img) { + //CHECKS TO MAKE SURE ALL GL EVENTS HAVE COMPLETED + if (syncCLtoGL && glEvent != null) { + for (final CLCommandQueue queue : queues) { + clEnqueueWaitForEvents(queue, glEvent); + } + } else { + glFinish(); + } + + //IF THE GL TEXTURE BUFFERS HAVE NOT BEEN INITIALIZED + if (!buffersInitialized) { + initGLTexture(img); + setKernelParams(); + } + + //IF CHANGES OCCURED, AND NEEDS TO REBUILD PROGRAM & KERNEL + if (rebuild) { + buildProgram(context); + setKernelParams(); + } + + //SETS THE WORKSIZE OF THE KERNEL + kernel2DGlobalWorkSize.put(0, img.getWidth()).put(1, img.getHeight()); + + //GETS THE GL OBJECTS + for (int i = 0; i < slices; i++) { + // acquire GL objects, and enqueue a kernel with a probe from the list + clEnqueueAcquireGLObjects(queues[i], glBuffers[i], null, null); + clEnqueueAcquireGLObjects(queues[i], glBuffersOut[i], null, null); + + clEnqueueNDRangeKernel(queues[i], kernels[i], 2, + null, + kernel2DGlobalWorkSize, + null, + null, null); + + CL10GL.clEnqueueReleaseGLObjects(queues[i], glBuffers[i], null, syncGLtoCL ? syncBuffer : null); + CL10GL.clEnqueueReleaseGLObjects(queues[i], glBuffersOut[i], null, syncGLtoCL ? syncBuffer : null); + if (syncGLtoCL) { + clEvents[i] = queues[i].getCLEvent(syncBuffer.get(0)); + clSyncs[i] = glCreateSyncFromCLeventARB(queues[i].getParent(), clEvents[i], 0); + } + } + + // block until done (important: finish before doing further gl work) + if (!syncGLtoCL) { + for (int i = 0; i < slices; i++) { + clFinish(queues[i]); + } + } + + //RENDER THE TEXTURE + render(img); + } + + private void render(Image img) { + if (syncGLtoCL) { + for (int i = 0; i < slices; i++) { + glWaitSync(clSyncs[i], 0, 0); + } + } + + //draw slices + int sliceWidth = img.getWidth() / slices; + + for (int i = 0; i < slices; i++) { + int seperatorOffset = drawSeparator ? i : 0; + + //BIND THE TEXTURE + glBindTexture(GL_TEXTURE_2D, outTexture.getId()); + + //SETS GL SETTINGS + glSettings(); + + //DRAW A CUBE WITH MAPPED TEXTURE + glBegin(GL_QUADS); + //front + System.out.println("Drawing front"); + glTexCoord2f(0, 0); + glVertex3i(-1, -1, 1); //upper left + glTexCoord2f(0, 1); + glVertex3i(1, -1, 1); //upper right + glTexCoord2f(1, 1); + glVertex3i(1, 1, 1); //bottom right + glTexCoord2f(1, 0); + glVertex3i(-1, 1, 1); //bottom left + //back + System.out.println("Drawing back"); + glTexCoord2f(0, 0); + glVertex3i(-1, -1, -1); //upper left + glTexCoord2f(0, 1); + glVertex3i(-1, 1, -1); //upper right + glTexCoord2f(1, 1); + glVertex3i(1, 1, -1); //bottom right + glTexCoord2f(1, 0); + glVertex3i(1, -1, -1); //bottom left + + //bottom + System.out.println("Drawing bottom"); + glTexCoord2f(0, 0); + glVertex3i(-1, -1, -1); //upper left + glTexCoord2f(0, 1); + glVertex3i(-1, -1, 1); //upper right + glTexCoord2f(1, 1); + glVertex3i(-1, 1, 1); //bottom right + glTexCoord2f(1, 0); + glVertex3i(-1, 1, -1); //bottom left + //top + System.out.println("Drawing top"); + glTexCoord2f(0, 0); + glVertex3i(1, -1, -1); //upper left + glTexCoord2f(0, 1); + glVertex3i(1, -1, 1); //upper right + glTexCoord2f(1, 1); + glVertex3i(1, 1, 1); //bottom right + glTexCoord2f(1, 0); + glVertex3i(1, 1, -1); //bottom left + + //left + System.out.println("Drawing left"); + glTexCoord2f(0, 0); + glVertex3i(-1, -1, -1); //upper left + glTexCoord2f(0, 1); + glVertex3i(1, -1, -1); //upper right + glTexCoord2f(1, 1); + glVertex3i(1, -1, 1); //bottom right + glTexCoord2f(1, 0); + glVertex3i(-1, -1, 1); //bottom left + //right + System.out.println("Drawing right"); + glTexCoord2f(0, 0); + glVertex3i(-1, 1, -1); //upper left + glTexCoord2f(0, 1); + glVertex3i(1, 1, -1); //upper right + glTexCoord2f(1, 1); + glVertex3i(1, 1, 1); //bottom right + glTexCoord2f(1, 0); + glVertex3i(-1, 1, 1); //bottom left + glEnd(); + } + + //CHECKING SYNC + if (syncCLtoGL) { + glSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + glEvent = clCreateEventFromGLsyncKHR(context, glSync, null); + } + } +} diff --git a/src/tutorial/clTexture3d/Texture.java b/src/tutorial/clTexture3d/Texture.java new file mode 100644 index 0000000..06d31ff --- /dev/null +++ b/src/tutorial/clTexture3d/Texture.java @@ -0,0 +1,74 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package tutorial.clTexture3d; + +import org.lwjgl.opengl.GL11; +import static org.lwjgl.opengl.GL11.GL_NEAREST; +import static org.lwjgl.opengl.GL11.GL_RGB; +import static org.lwjgl.opengl.GL11.GL_RGB8; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_MAG_FILTER; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_S; +import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_T; +import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE; +import static org.lwjgl.opengl.GL11.glTexImage2D; +import static org.lwjgl.opengl.GL11.glTexParameteri; +import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; +import static org.lwjgl.opengl.GL12.GL_TEXTURE_3D; +import static org.lwjgl.opengl.GL12.glTexImage3D; + +/* + * @author LAA + */ +public class Texture { + + private final int width, height, target, id; + private final Image image; + + public Texture(Image image, int target, int id) { + this.image = image; + this.width = image.getWidth(); + this.height = image.getHeight(); + this.target = target; + this.id = id; + + // bind this texture + GL11.glBindTexture(target, id); + + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.getWidth() + 1, image.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); + glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8, 5, 5, 5, 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); + } + + public void bind() { + GL11.glBindTexture(target, id); + } + + public int getTarget() { + return target; + } + + public Image getImage() { + return image; + } + + public int getId() { + return id; + } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } +} From 9fb8923e68fecc4126348668ec304d9563903522 Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Mon, 31 Jul 2017 17:01:22 -0400 Subject: [PATCH 13/17] read & write image kernel no error --- build/classes/tutorial/clTexture3d/Main.class | Bin 16035 -> 16124 bytes .../tutorial/clTexture3d/Texture.class | Bin 1445 -> 1472 bytes nbproject/private/private.xml | 7 +++---- src/tutorial/clTexture3d/Main.java | 18 ++++++++++-------- src/tutorial/clTexture3d/Texture.java | 13 +++++++------ 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/build/classes/tutorial/clTexture3d/Main.class b/build/classes/tutorial/clTexture3d/Main.class index bdd7606a3de53154d3276baa6689589d11b85c73..57f50c8716400bb77a266248d8850576f7e84129 100644 GIT binary patch delta 5039 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 delta 4999 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 K=mBiPgZ~9YE*;ze diff --git a/build/classes/tutorial/clTexture3d/Texture.class b/build/classes/tutorial/clTexture3d/Texture.class index d86740f525300a906e72d7fe08f45fd3866b7367..73da51751f065a0c2c464187a0576a52cad6153b 100644 GIT binary patch literal 1472 zcmaJ>*-{fx5IvJUVGt5P6a#`HCc`oUf^05?MN?8PCF1iW8Ir+}P~$}9P5;LSts+YK z;0O34{)Oe~nL#NWO{%*4_PwW<)A!EzpI^TLxQSvMQ*r1i^x#Gk8BC`zgITd|iZv(J zyog&O7DOzjpkOHsyeCY-GOc${5ARP8@d?MBi8yr=~zDDu~rgt6FpDte6Ml zj5&r~HR%Xh6?(0GqiQP1ZaFQdX8CU0YVeeAL=6nfA6(s?(F%YL<=qj=?ls`_70{vtB6}3XbcS!V)4StHFZ9 zIZ2UZ2itxh^svtaJ#MuOmCFYQJLx7WXBkT{FFdLw-~*qj)U#&GE}NT{)U5gyOzj!3 z4F!EoyQ{aV}^T2FS-QSv?{)c}?MHZtf25>2kdnz=Hspv(YigB^di`6gUf{2SE zR#8x~hIJJi*i>;J4>+5^(fD;K=$6X#y3wfWk4t-InWG&DMELY{R_g^)`5Pb2d1LFU z%HW?Ewy|$IrfqTR+;JzGB0Ggcv(VbzRnSj*-INWhsTU3%*KOJyk?KZp)6A~RT_N22 z1p@Lr7~!Sv;cJLdlNeeVp~cl?#?>Up)#S(3WRp71`=7-iY#S+Uu#JxF;4#!}Iv2`x9^)L1@QI=jfo}Ahg?hA57T>Gz#KX- z?`BcGvwjxEt;~y~b4TJtCC&#LURyEOxp)d3{SCg39CwBJ)8NR*GvM2S;5<3`8{Ba= f^J*ZNZzup9I}6?j1oPPifD>oI#X#_c+uY<#^I literal 1445 zcmaJ>+fvg|6kX|swjl^DAOZyi1WUMty9iaWAeR}&D}&Ez32B(pIx!V_)Bo{7XQ(nh z_yPWfKjOG{8qi^)?abcm>~q$>o|7NHzI_Lm~#PSCud1wo4< zmPFiDp8mcGs(WHPHGg32$nGjhd8g`l4-^dL{&#R^XMA5lY`u0s zm+iYw)p}AtE?VxMS**~K*{zk#%D%}kTnEOOS9abg7!3Ctq{0+pMW@Pyqd5tYVg-9a z9kj5%BrSfnbd?(qcXm-tT+Y&$a9%ZABo4QO4yi9|b+=?~I+C*%WH5bXzBLte*Ie7E zoE+H|qxRaWQf=+d&i=zbr=cGs8hX)}zyl5A7}d~)ZVkGi>w*gEW6QH# zhXd!1KTMU4DV$n``r)C19(L9bS#@eg;nefZmdojAz6U?d{Dxc;(wo0f!uURhc$qu- z0OHi_2~kEm;%hd=*X)b0*+A+9uX;bSlmlG-go+roqklzIpJ*VaPkceVffmt;29kQV zfs{VbfSMgRM{7n)=OUT5b6gV?y+lfS41p0BFq&ykCX>;0ZzA2L&|Swl(w`YDf - file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Main.java - file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Image.java - file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/Texture.java - file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture/DemoFractal.java + file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture3d/Texture.java + file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture3d/Main.java + file:/C:/Users/labramson/Documents/Tutorial/src/tutorial/clTexture3d/Image.java diff --git a/src/tutorial/clTexture3d/Main.java b/src/tutorial/clTexture3d/Main.java index ee01f3d..51282f0 100644 --- a/src/tutorial/clTexture3d/Main.java +++ b/src/tutorial/clTexture3d/Main.java @@ -62,15 +62,15 @@ public class Main { + "}"; static final String code = "kernel void imgTest2(__read_only image3d_t inTexture, __write_only image3d_t outTexture){\n" - + " #pragma OPENCL EXTENSION cl_khr_3d_image_writes: enable;\n" + + " #pragma OPENCL EXTENSION cl_khr_3d_image_writes : enable\n" + " const sampler_t smp = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;\n\n" + " uint offset = get_global_id(1)*0x4000 + get_global_id(0)*0x1000;\n" - + " int2 coord = (int2)(get_global_id(0), get_global_id(1));\n" + + " int4 coord = (int4)(get_global_id(0), get_global_id(1), get_global_id(2), get_global_id(3));\n" + " float4 pixel = read_imagef(inTexture, smp, coord);\n" + " if (coord.x > 5 & coord.y > 5) { \n" - + " pixel.x -= 1.5;\n" + + " pixel.x -= 1.5;\n" + " pixel.y -= 1.5;\n" - + " pixel.z -= 1.5;\n" + + " pixel.z -= 1.5;\n" + " }\n" + " write_imagef(outTexture, coord, pixel);\n" + "}"; @@ -95,7 +95,7 @@ public class Main { private boolean syncGLtoCL; // true if we can make GL wait on events generated from CL queues. private final boolean doublePrecision = true; //doubles used instead of floats private final boolean useTextures = true; //for something... - private final PointerBuffer kernel2DGlobalWorkSize = BufferUtils.createPointerBuffer(2); //the global work size of the kernel + private final PointerBuffer kernel2DGlobalWorkSize = BufferUtils.createPointerBuffer(3); //the global work size of the kernel private final PointerBuffer syncBuffer = BufferUtils.createPointerBuffer(1); //buffer for dealing with gl cl sync private int deviceType = CL10.CL_DEVICE_TYPE_GPU; private int slices; //dividing up the image for faster processing @@ -416,7 +416,7 @@ public void display(Image img) { } //SETS THE WORKSIZE OF THE KERNEL - kernel2DGlobalWorkSize.put(0, img.getWidth()).put(1, img.getHeight()); + kernel2DGlobalWorkSize.put(0, img.getWidth()).put(1, img.getHeight()).put(2, 15); //GETS THE GL OBJECTS for (int i = 0; i < slices; i++) { @@ -424,7 +424,7 @@ public void display(Image img) { clEnqueueAcquireGLObjects(queues[i], glBuffers[i], null, null); clEnqueueAcquireGLObjects(queues[i], glBuffersOut[i], null, null); - clEnqueueNDRangeKernel(queues[i], kernels[i], 2, + clEnqueueNDRangeKernel(queues[i], kernels[i], 3, null, kernel2DGlobalWorkSize, null, @@ -441,6 +441,8 @@ public void display(Image img) { // block until done (important: finish before doing further gl work) if (!syncGLtoCL) { for (int i = 0; i < slices; i++) { + System.out.println("I: " + i); + //System.out.println("q: " + queues[i].isValid()); clFinish(queues[i]); } } @@ -463,7 +465,7 @@ private void render(Image img) { int seperatorOffset = drawSeparator ? i : 0; //BIND THE TEXTURE - glBindTexture(GL_TEXTURE_2D, outTexture.getId()); + glBindTexture(GL_TEXTURE_3D, outTexture.getId()); //SETS GL SETTINGS glSettings(); diff --git a/src/tutorial/clTexture3d/Texture.java b/src/tutorial/clTexture3d/Texture.java index 06d31ff..22d8c50 100644 --- a/src/tutorial/clTexture3d/Texture.java +++ b/src/tutorial/clTexture3d/Texture.java @@ -26,26 +26,27 @@ */ public class Texture { - private final int width, height, target, id; + private final int width, height, depth, target, id; private final Image image; public Texture(Image image, int target, int id) { this.image = image; this.width = image.getWidth(); this.height = image.getHeight(); + this.depth = 1024; this.target = target; this.id = id; // bind this texture GL11.glBindTexture(target, id); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.getWidth() + 1, image.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); - glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8, 5, 5, 5, 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); + glTexImage3D(target, 0, GL_RGB8, 5, 5, 5, 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); } public void bind() { From cd37bb7facf0ab65b77f64b0d4d691cfb90ad157 Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Tue, 1 Aug 2017 17:00:44 -0400 Subject: [PATCH 14/17] trying to makde 3d texture work --- build/classes/tutorial/clTexture/Main.class | Bin 15323 -> 15477 bytes .../classes/tutorial/clTexture3d/Image.class | Bin 3594 -> 3648 bytes build/classes/tutorial/clTexture3d/Main.class | Bin 16124 -> 16277 bytes .../tutorial/clTexture3d/Texture.class | Bin 1472 -> 1482 bytes src/tutorial/clTexture/Main.java | 11 ++ src/tutorial/clTexture3d/Image.java | 2 + src/tutorial/clTexture3d/Main.java | 143 +++++++++--------- src/tutorial/clTexture3d/Texture.java | 4 +- 8 files changed, 89 insertions(+), 71 deletions(-) diff --git a/build/classes/tutorial/clTexture/Main.class b/build/classes/tutorial/clTexture/Main.class index 13660a772e2c57f2645caaae8edebe4234d26222..49b1f3f2440ec6d3ddb4c560e3950a116ce0214c 100644 GIT binary patch delta 3981 zcma)9dwkF37eDXw{o3>Se)h20u$jq*v6~q-j7V$~O~l-mS~K57B+RAwwMa=9(WjK6 z&_%k}`27}17fQP5E|(%w=}P6&h~GIMn|{CldcD3o=RD6j&$&P6`E2)$qcbbFonHSc z5#{i|4GInV8eC-1&!soeKSV)Xtf0un09>NfKm~&oT@n+hzbcUCb4b?bHoceuC{ zcPVqBp1E78MG6+z$#O{Jzeo2x7x!XnNMgLt!4enu;{gq3se=by8ij`<(HhGPmOFSj zh6s=8=Hm*UFj(#2Nten{;$V%+J>}wQJmcV5EyHszy@2N(ykPL68hS}HTjgM_;&o0X zr0)MwMzwCd>|nj(4F<0`*yz%9Ofz^@`I|HauQ_;K@f$8(gEt*)Rud&Iw%{!XZ-Ztt0!Kb?V%%#cr+{F%j5kgn&RFk_5 zb}Qav@TKCf9PD+lPx)Uf*sq%hG~{n0k%xl{zE%6*Ir!eeA!Yxd%70YqCvC`|UG&5+ zO8u(kIb5miBTD|JoZr=_KNK7_IOgIwPN=}2nv)urfRn1}lrI0$qMlZ8MgVI|F%+K&@sc!EuY6NEV`kA_r7hOki^NBTPmlO<<^{HxsAwjTTbzU^^;p4*#sS&rz*mx7w9yIxjv$D7+AEn#pp4~dH4;%M}- zJd}r79?l~ajP$lN7?)I{j$LMX6kiTd8mF&sNj_Qi<=Cx{)g_-y}WAb9k=ho8?qZ z?0{|`(k0Ey7T!q%L|mco$s)GC*Ngxp;A5hZp({!vE_T%^X4>aQGBoE z`*?}v`}qNj3$*8#@`IMX6?WMdY)VpW~M-dZUk**ftkyy}@k{ z1=oR6Jfy~XH>Miz^3-+(Z^(0W9)!M>N#62c!8EejcU0*`xDX}LJz9ZGA}>`xK3vPaaKYUrfk z1$2u3k`u?hw&_(OwL87EQl)aJp1@Ufn$8Fg&?9n4(-1++0HIhCwiGN>fJ*2h1Vmd9 zL6J?Mz!{oB^$g?}QTrp|G;?8u9~3RqDWr2$y_20ve@}ecK&c}e!h1O*Lp(W{(KfZt z-$cylB6C=kcsZG!T$wvCn-&vHYN?yrqZe&9HJNq)9m7Rs{ z`jplM*o7hxg=h(N616}>sds>e(1nPRT(UT}tTstXX_vq^--IHPPLpd83!I?1h*RXC zhI$ECo&n!dcGgQ`=|EQBe{5;xIZG@5ktKP0)Kb-g_Hp8bw=#RaU$vf6pD6kYO%NyS z*7OeI(Nsd|NE?uVW)fZ=twkc5OU93om7Ja@awJvuy8$hPZgNgO>70CWZEf3VZA+xK z6f|gQXp})KgVrQX(&Rpp@=9?HO}Fym%cS)^+}NRqdU X;{-fm>kNGw6{g7q&<%k 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 A8UO$Q diff --git a/build/classes/tutorial/clTexture3d/Image.class b/build/classes/tutorial/clTexture3d/Image.class index acd1ad74bdcb7785fcc1c3028cf887a07f957cf3..032d5700ba2be727bb232f42500160b610d27e45 100644 GIT binary patch delta 1205 zcmZvb{Zmv`7{@<%@2+P#oW@CtAeX`#6IpCcN?Ndtz%>mkq1XVk7QBm#h-54IQc+e` zX8Cf>viJ8FvedARs0e#=>L-6}re>O^UmE{~W}KdLVagxeo&BC?&-vcxd!O%fp53v@ z*zhlB$0vYmIi*=hmnOlQB7u7}vsr7Sdu?=|jWUXEMUSS4bqY@tC2RM4EvzphM_-f; zntnDa1~jwSq#5LX#b(XLJP;*sb8XQK@t|fa+f;__iXEDmm7dK*79LhSqN!w9^C*v5 z*lFQ$3r|?WlbSYmDW1|)@wDa{c59wxkBy$Q@Vte+ihYXx$A7B}IS2d_*PD~XH{48< zk#esy+{s;rYglAxw^1#N{KIaOdyp6WKitb|lN>TErp|CZb&3}aFLBtRB<1CM*5?L# zD{~t&yx!Z^>r8&4xF5OYyeh9o|*EXLz3v9Af@bH|C!Vmqn9&X!wW`|IcvA zyd)nhju<}SQ^Qe?8IJRrVU!bw&nXzbV9cSy|2ytOSB9_oMloUdmPx}& zzB7E!4~8H4X*3;abW61q)?eG)>hcF=^iVYCG$iDzKtviW_DM9$nis5M zY_N)N!7A3tIs*r>MXxE8D#)>1_@dmdz=E{=zd9X1CW%~@ z2&TADut|m@C4$ST5y@s&(nX65!5wnvSF?*&xfgAW$mJU+&Cd*XaGFkj7202{;cwPr z>ui-YHI&KYw@P)5BGDohyK-`7y3W&F$|`P?n!4CK%^PI7<2|__-wtdhYyqK9HOuvL|lwYb`uisPDWFcLc1?e*u};(Q^O* delta 1142 zcmZvb`EOKJ6vsbr-VC?By-@<%MW(Sp*gAz$#Zp>apio6nXu&QpEF&G-Dc!6?tD@Ew z*%aynTv!xT)Cvd|$5NmSkPzb!{=zSWpZJx(fdoDGwIMF#CEs&$*84r@ymWYHxc85{ zL&Lxvu4;-|t(nD|Oo6Co0&A_d&T8wewm}h7ysXJ&qoPrhLEPFmS!l|nnM4LHn$5H- z+BD;6*L2XSct!ItT^YP;Yb7;X=+^Y`nu_we;tfsMww}ON3vVjk(iHHvrk8gtylde- z>w8~Q!v~5FHPhIp`H1bB9qhE)E(^OYe609HvFFUKxdCUdm+QtSmeFTez(T|0%rUHF zm0>m|hL^1N7$x2jw{py9Jcpc?Sa+;A(NSC_<|XZ&Taqi2UGZ3(EjLf`rQsllyl61jJxrh1 z6U@&(!dHr~4M#bq_{Q)p-#LW){tA27g1O~o95;N=4-OCbm18~0;>wQJjxJm9M@7Hk zCr%hna?0>CrwwQL#W28GFF!PC(yycxzZnKOrx-Gv=YruP!-h+w4VSqx5DP7E2Zl15 zoQhd;01%S3$z((uXXoNenVBzT8orc)h#Z4sSqYYVQN7!#@NVnLQ|5~&n}Fa}p5!T! zR(qOfBrafA;K!F_l}dbb)}z%nzK|dfiP!cCkRz2VS>)HqzgHul#eR({iI>i`N-oOb zS)Q}?z&VH#JKXecWcAOVnPN(cscELAm|h;r3k?r4V_9U7!W5CZNM6VlQ;MRxNQ#+t zk<*gsQX#mIvEH91r*|oxET@|lY@?dPa&`T3E9a;qO+CNUz;#x0gD93jjrPQ${sA!2MOF^(On|K zu13iZ;Mm(8p)Biimc?gcjZ4>KbHqmOXxxr;^S^{-_0-{i)I`)1b) U{r_jXc6$G8-F)BVdOxb+Zw&UofdBvi diff --git a/build/classes/tutorial/clTexture3d/Main.class b/build/classes/tutorial/clTexture3d/Main.class index 57f50c8716400bb77a266248d8850576f7e84129..f85d75302c7f14e336915477c499ab4111bb6698 100644 GIT binary patch delta 6676 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 O6#}1UnHTUy-1%?QBfzcz delta 6569 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 D+lGmv diff --git a/build/classes/tutorial/clTexture3d/Texture.class b/build/classes/tutorial/clTexture3d/Texture.class index 73da51751f065a0c2c464187a0576a52cad6153b..4a3aef20f8f0dcf62175c5fb0c8a2d60a63b9877 100644 GIT binary patch delta 130 zcmX@WeTsWSC^P3r1}+8`1_p-G$#Kk5Oada4tC?;1w6`&^vLpaWcC9T8oRfDk8~DmI zs4}Q9s4-{)p&o-agE@l^g9C#ugBOq&!eGcy!eGRp05nGnVj6=YgA$MjG?zh&L7IUP S%#vUbWncoaHk-3_G6DbyjuVLh delta 120 zcmX@beSmvIC^P4C1}+8`1_p-g$#Kk5%z`WoldG6*m^nB&CLduo@Ks 5 & coord.y > 5) { \n" - + " pixel.x -= 1.5;\n" + + " pixel.x -= 1.5;\n" + " pixel.y -= 1.5;\n" - + " pixel.z -= 1.5;\n" + + " pixel.z -= 1.5;\n" + " }\n" + " write_imagef(outTexture, coord, pixel);\n" + "}"; @@ -123,14 +123,14 @@ public static void main(String... args) throws Exception { //SET UP CL run.initCL(); - + //CREATE THE TEXTURE IN GL CONTEXT run.initGLTexture(img); run.initWritableTexture(img2); - + //COMPLETE ALL GL glFinish(); - + //SET THE KERNEL PARAMS FOR CL COMPUTAIONS run.setKernelParams(); @@ -168,7 +168,7 @@ public static void initDisplay() { public static void initGL() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); - glOrtho(0, 300, 300, 0, 1, -1); + glOrtho(0, 300, 300, 0, 5, -5); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } @@ -178,7 +178,7 @@ public static void glSettings() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //CLEARS SCREEN EACH LOOP glEnable(GL_DEPTH_TEST); //DISABLES DEPTH TEST glEnable(GL_TEXTURE_3D); //ENABLES GL_TEXTURE_3D - glPixelStorei(GL_PACK_ALIGNMENT, 4); + glPixelStorei(GL_PACK_ALIGNMENT, 4); } //INITIALIZE THE GL TEXTURE @@ -416,7 +416,7 @@ public void display(Image img) { } //SETS THE WORKSIZE OF THE KERNEL - kernel2DGlobalWorkSize.put(0, img.getWidth()).put(1, img.getHeight()).put(2, 15); + kernel2DGlobalWorkSize.put(0, img.getWidth()).put(1, img.getHeight()).put(2, img.getHeight()); //GETS THE GL OBJECTS for (int i = 0; i < slices; i++) { @@ -442,7 +442,7 @@ public void display(Image img) { if (!syncGLtoCL) { for (int i = 0; i < slices; i++) { System.out.println("I: " + i); - //System.out.println("q: " + queues[i].isValid()); + System.out.println("q: " + queues[i].isValid()); clFinish(queues[i]); } } @@ -472,68 +472,73 @@ private void render(Image img) { //DRAW A CUBE WITH MAPPED TEXTURE glBegin(GL_QUADS); - //front - System.out.println("Drawing front"); - glTexCoord2f(0, 0); - glVertex3i(-1, -1, 1); //upper left - glTexCoord2f(0, 1); - glVertex3i(1, -1, 1); //upper right - glTexCoord2f(1, 1); - glVertex3i(1, 1, 1); //bottom right - glTexCoord2f(1, 0); - glVertex3i(-1, 1, 1); //bottom left - //back - System.out.println("Drawing back"); - glTexCoord2f(0, 0); - glVertex3i(-1, -1, -1); //upper left - glTexCoord2f(0, 1); - glVertex3i(-1, 1, -1); //upper right - glTexCoord2f(1, 1); - glVertex3i(1, 1, -1); //bottom right - glTexCoord2f(1, 0); - glVertex3i(1, -1, -1); //bottom left - //bottom - System.out.println("Drawing bottom"); - glTexCoord2f(0, 0); - glVertex3i(-1, -1, -1); //upper left - glTexCoord2f(0, 1); - glVertex3i(-1, -1, 1); //upper right - glTexCoord2f(1, 1); - glVertex3i(-1, 1, 1); //bottom right - glTexCoord2f(1, 0); - glVertex3i(-1, 1, -1); //bottom left - //top + // Top-face System.out.println("Drawing top"); - glTexCoord2f(0, 0); - glVertex3i(1, -1, -1); //upper left - glTexCoord2f(0, 1); - glVertex3i(1, -1, 1); //upper right - glTexCoord2f(1, 1); - glVertex3i(1, 1, 1); //bottom right - glTexCoord2f(1, 0); - glVertex3i(1, 1, -1); //bottom left - - //left + glTexCoord3f(0f, 0f, 0f); + glVertex3f(1.0f, 1.0f, -1.0f); + glTexCoord3f(0f, 1.0f, 0f); + glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord3f(1.0f, 1.0f, 0f); + glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord3f(1.0f, 0f, 0f); + glVertex3f(1.0f, 1.0f, 1.0f); + + // Bottom-face + System.out.println("Drawing bottom"); + glTexCoord3f(0f, 0f, 0f); + glVertex3f(1.0f, -1.0f, 1.0f); + glTexCoord3f(0f, 1.0f, 0f); + glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord3f(1.0f, 1.0f, 0f); + glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord3f(1.0f, 0f, 0f); + glVertex3f(1.0f, -1.0f, -1.0f); + + // Front-face + System.out.println("Drawing front"); + glTexCoord3f(0f, 0f, 0f); + glVertex3f(1.0f, 1.0f, 1.0f); + glTexCoord3f(0f, 1.0f, 0f); + glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord3f(1.0f, 1.0f, 0f); + glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord3f(1.0f, 0f, 0f); + glVertex3f(1.0f, -1.0f, 1.0f); + + // Back-face + System.out.println("Drawing back"); + glTexCoord3f(0f, 0f, 0f); + glVertex3f(1.0f, -1.0f, -1.0f); + glTexCoord3f(0f, 1.0f, 0f); + glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord3f(1.0f, 1.0f, 0f); + glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord3f(1.0f, 0f, 0f); + glVertex3f(1.0f, 1.0f, -1.0f); + + // Left-face System.out.println("Drawing left"); - glTexCoord2f(0, 0); - glVertex3i(-1, -1, -1); //upper left - glTexCoord2f(0, 1); - glVertex3i(1, -1, -1); //upper right - glTexCoord2f(1, 1); - glVertex3i(1, -1, 1); //bottom right - glTexCoord2f(1, 0); - glVertex3i(-1, -1, 1); //bottom left - //right + glTexCoord3f(0f, 0f, 0f); + glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord3f(0f, 1.0f, 0f); + glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord3f(1.0f, 1.0f, 0f); + glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord3f(1.0f, 0f, 0f); + glVertex3f(-1.0f, -1.0f, 1.0f); + + // Right-face System.out.println("Drawing right"); - glTexCoord2f(0, 0); - glVertex3i(-1, 1, -1); //upper left - glTexCoord2f(0, 1); - glVertex3i(1, 1, -1); //upper right - glTexCoord2f(1, 1); - glVertex3i(1, 1, 1); //bottom right - glTexCoord2f(1, 0); - glVertex3i(-1, 1, 1); //bottom left + glTexCoord3f(0f, 0f, 0f); + glVertex3f(1.0f, 1.0f, -1.0f); + glTexCoord3f(0f, 1.0f, 0f); + glVertex3f(1.0f, 1.0f, 1.0f); + glTexCoord3f(1.0f, 1.0f, 0f); + glVertex3f(1.0f, -1.0f, 1.0f); + glTexCoord3f(1.0f, 0f, 0f); + glVertex3f(1.0f, -1.0f, -1.0f); + glEnd(); } diff --git a/src/tutorial/clTexture3d/Texture.java b/src/tutorial/clTexture3d/Texture.java index 22d8c50..fa65fac 100644 --- a/src/tutorial/clTexture3d/Texture.java +++ b/src/tutorial/clTexture3d/Texture.java @@ -33,7 +33,7 @@ public Texture(Image image, int target, int id) { this.image = image; this.width = image.getWidth(); this.height = image.getHeight(); - this.depth = 1024; + this.depth = 20; this.target = target; this.id = id; @@ -46,7 +46,7 @@ public Texture(Image image, int target, int id) { glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.getWidth() + 1, image.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); - glTexImage3D(target, 0, GL_RGB8, 5, 5, 5, 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); + glTexImage3D(target, 0, GL_RGB8, image.getWidth() + 1, image.getHeight(), depth, 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); } public void bind() { From 3b66557b6b84961ca57646fd31bd7ee7fc103161 Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Wed, 2 Aug 2017 10:59:30 -0400 Subject: [PATCH 15/17] got 3d texture working --- .../classes/tutorial/clTexture3d/Image.class | Bin 3648 -> 3714 bytes build/classes/tutorial/clTexture3d/Main.class | Bin 16277 -> 16356 bytes .../tutorial/clTexture3d/Texture.class | Bin 1482 -> 1957 bytes res/smileTexture.jpg | Bin 2537 -> 979 bytes res/smileTexture2.jpg | Bin 979 -> 0 bytes src/tutorial/clTexture3d/Image.java | 12 +- src/tutorial/clTexture3d/Main.java | 209 +++++++++++------- src/tutorial/clTexture3d/Texture.java | 47 ++-- 8 files changed, 161 insertions(+), 107 deletions(-) delete mode 100644 res/smileTexture2.jpg diff --git a/build/classes/tutorial/clTexture3d/Image.class b/build/classes/tutorial/clTexture3d/Image.class index 032d5700ba2be727bb232f42500160b610d27e45..2d7f2b128c29446428ba62dd422be5583ca888b2 100644 GIT binary patch delta 1623 zcmai!*>hAy6vlrycV>F#(vlEDlEDmw04kYakVPTEC4k5lqCpr2BQla9i`k4r;>sW> zuBh>B}I6PqH+l*-s z(LraBE{6x{Ry^cTK+0h|J&In3A|4L%h*|YfXB&_4xWg0dP^1+*9i|u(5uP+=mtwa= z8BaMp%^qW(G3HtG?Ky|_Jg<1cVHPhs?BykgmwClRea5_MjH`G}@p|9yMFD?fvMbem z^v|*!>kYTqo*D`^B~#1HoV&nY5v^vQW*N6@ZsaD-24b4I%+qW%(R>rdO|*b{?jd_= z;7#^hgxykqxIt6RTbhL|(p0fXaX|An2Q4NpPo}muw{$d>wzMajlBL^P+LDSxns-=i zQPi5~NmRCURxX$6l^tE%Q|nUQ$wa$ZZn5HB&3nA>Hu#F|57_7S`XYrN@{!_W&0#)K ze5(13&n-&&{w{IP`HHKmIimT3FD=GrR!;P$DwlS)b#|Ktzf$yTj&e+MoD-Upc$xtQ zHK#c3M*L-EL!423tvSm#ieb&Se5d)IA2dI5PV*Dzk0<;!_VLrfCaZ3a92N+WZ#0r9 z-zb#vqEE()iWx7eWV{F?USXNtiM?4y7YLCfez)7~%t)7e1WytwAHs=Gu>TlDt20jA z&I{JXea85W35fC80egV)C&~REtX*f@zAQBFsMN{f7O`an#ZJXXDOWL#VwsuF^fXas z5)->iHg~H)3bW+6jT#vVO_s1!sOOk-GO~re*z$+SF(%~adrTanARZlH(jbMk75%jp z9>rF_fP+ku1&ai1I7}Ap%&iN`X)6$=3R&px7#B*LvgN|8K#CXzb0j0ca_-1biTq0? z!io%)m4XjoZBT-UbFZiPL>l=uKs2Pj>8n93{gff0NLp7$U4Y>#PGzOZkIviLap4KUqfhPzo8u9_M4 znR>Qud0Z0{;I$st4KvH5yviT;pB*H+COU{nHaiv#`)!%>xIPy3sEkGXWj9&vmXPQE zs*BRA>7tGv?qm;lagchs59{SP#~7ANdtR>V1vc>;4Vh-vi`Es=>owGhmNl~0TG7|E z?&655!_t*HSCGuQGwZlJjUOX_E;)a(?2?=t#d;+#lVu){ zY#*o;ZwbgR8}}cPAbSL*WfE`65Yt(}2nox)H!@?c$K}atbaG>Q%xrn1#>fth&Tbwv ad6Vq?%F?!x{&L=JndG9;#2YfOd;bCG-V&Dp delta 1514 zcmZvc`&SiJ6vscq%y2HlfQp7(@d6^2JdD(mB&`U7FcF1t+*2qzh9Z0 z25#iM!ws}Ml(Rie;C_c(c4+AVE$!4&hhmpvw?i6x6fuVoom$_ep*xK@dqX_v&_l1H z&moI`hXEc^>~pw=heIT^uR(_)_B%YnqbkV(#X*OqI&?0NX?R>Q>`*|`;Sh&49MSNE zh9|YbQx44>RXpvml4l&A8QEDc*E>i%NsVdpm|Y z%H#dzwW6-?8yHM9C-%iUdbPVs#oI3L@UAy(<(Ti`c_UV2;ro1`_|WAeK306<@+qHr z7p#in^?dH~1t$$M1D_rH6Xn(YJ^lN%t5b^8E?@GM%NZ}<&h{$p!ou&FR7|;?<(y*L zYpZUe*SAH8CwyVr+M^f%tThkQVEqsMm*2~jY+%k496gTS1rCGq15(_&b zWod4LQFseRVI&xZ6d6-7^vMKok=c3apcEModV@}pGes!6z`Qhp_4DGr?LG2v!S|wZcIiWx_%Yn`mdV z+#FlwqS(e!n&fY2=A`_NleBVyC>Lqt53%}_?Ob9OXi!j@`vzt4wy1AA6uCm$G49;yX O3|#KL>h5S@*7i42T?MHC diff --git a/build/classes/tutorial/clTexture3d/Main.class b/build/classes/tutorial/clTexture3d/Main.class index f85d75302c7f14e336915477c499ab4111bb6698..b89bc7d0e83d183e6ab3c4bd01c5c62d67074d4e 100644 GIT binary patch delta 7273 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 literal 1482 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 diff --git a/src/tutorial/clTexture3d/Image.java b/src/tutorial/clTexture3d/Image.java index ecc9e74..357f2e0 100644 --- a/src/tutorial/clTexture3d/Image.java +++ b/src/tutorial/clTexture3d/Image.java @@ -20,8 +20,7 @@ * @author LAA */ public class Image { - - private final int width, height; + private final int width, height, depth; private final BufferedImage img; /* The color model including alpha for the GL image */ @@ -33,13 +32,14 @@ public Image(String imgFile) { this.img = getBuffImage(imgFile); this.width = img.getWidth(); this.height = img.getHeight(); + this.depth = getDepth(); + this.glAlphaColorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{8, 8, 8, 8}, true, false, ComponentColorModel.TRANSLUCENT, DataBuffer.TYPE_BYTE); - this.glColorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{8, 8, 8, 0}, false, @@ -72,7 +72,6 @@ public ByteBuffer getByeBuff() { texImage = new BufferedImage(glAlphaColorModel, raster, false, new Hashtable()); } else { raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, this.img.getWidth() + 1, this.img.getHeight(), 3, null); - texImage = new BufferedImage(glColorModel, raster, false, new Hashtable()); } @@ -81,7 +80,6 @@ public ByteBuffer getByeBuff() { g.setColor(new Color(0f, 0f, 0f, 0f)); g.fillRect(0, 0, this.img.getWidth() + 1, this.img.getHeight()); g.drawImage(this.img, 0, 0, null); - g.fill3DRect(0, 0, width, height, true); // build a byte buffer from the temporary image to produce a texture byte[] data = ((DataBufferByte) texImage.getRaster().getDataBuffer()).getData(); @@ -101,6 +99,10 @@ public int getWidth() { public int getHeight() { return height; } + + public int getDepth(){ + return depth; + } public BufferedImage getImg() { return img; diff --git a/src/tutorial/clTexture3d/Main.java b/src/tutorial/clTexture3d/Main.java index fc452cd..f12db27 100644 --- a/src/tutorial/clTexture3d/Main.java +++ b/src/tutorial/clTexture3d/Main.java @@ -5,6 +5,7 @@ */ package tutorial.clTexture3d; +import com.sun.prism.impl.BufferUtil; import java.nio.IntBuffer; import java.util.List; import org.lwjgl.*; @@ -25,6 +26,8 @@ import org.lwjgl.opencl.api.Filter; import org.lwjgl.opengl.*; import static java.lang.Math.min; +import java.nio.ByteBuffer; +import java.nio.ShortBuffer; import static org.lwjgl.opencl.CL10.CL_PROGRAM_BUILD_LOG; import static org.lwjgl.opencl.CL10.CL_QUEUE_PROFILING_ENABLE; import static org.lwjgl.opencl.CL10.clEnqueueNDRangeKernel; @@ -37,22 +40,22 @@ import static org.lwjgl.opengl.ARBSync.GL_SYNC_GPU_COMMANDS_COMPLETE; import static org.lwjgl.opengl.ARBSync.glFenceSync; import static org.lwjgl.opengl.ARBSync.glWaitSync; +import static org.lwjgl.opengl.ARBTextureRg.GL_R16F; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL12.*; -import static org.lwjgl.opengl.GL15.glBindBuffer; +//import static org.lwjgl.opengl.GL15.glBindBuffer; import static org.lwjgl.opengl.GL15.glDeleteBuffers; -import static org.lwjgl.opengl.GL21.GL_PIXEL_UNPACK_BUFFER; +//import static org.lwjgl.opengl.GL21.GL_PIXEL_UNPACK_BUFFER; /* * @author labramson */ public class Main { - public static Image img; public static Image img2; private Texture inTexture, outTexture; - static final String source + static final String kernel_Sample = "kernel void imgTest(__read_only image2d_t inputTexture){\n" + " int2 imgCoords = (int2)(get_global_id(0), get_global_id(1));\n" + " //printf(\"Coord x:%d Coord y:%d \", imgCoords.x, imgCoords.y);\n\n" @@ -60,18 +63,18 @@ public class Main { + " float4 imgVal = read_imagef(inputTexture, smp, imgCoords); \n" + " printf(\"(%d, %d) RGBA(%f, %f, %f, %f)\\n\", imgCoords.x, imgCoords.y, imgVal.x, imgVal.y, imgVal.z, imgVal.w);\n" + "}"; - static final String code + static final String kernel_3DImage = "kernel void imgTest2(__read_only image3d_t inTexture, __write_only image3d_t outTexture){\n" + " #pragma OPENCL EXTENSION cl_khr_3d_image_writes : enable\n" + " const sampler_t smp = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;\n\n" + " uint offset = get_global_id(1)*0x4000 + get_global_id(0)*0x1000;\n" + " int4 coord = (int4)(get_global_id(0), get_global_id(1), get_global_id(2), 0);\n" + " float4 pixel = read_imagef(inTexture, smp, coord);\n" - + " if (coord.x > 5 & coord.y > 5) { \n" - + " pixel.x -= 1.5;\n" - + " pixel.y -= 1.5;\n" - + " pixel.z -= 1.5;\n" - + " }\n" + + " //if (coord.x > 5 & coord.y > 5) { \n" + + " pixel.x = 1.0;\n" + + " // pixel.y -= 1.5;\n" + + " // pixel.z -= 1.5;\n" + + " //}\n" + " write_imagef(outTexture, coord, pixel);\n" + "}"; @@ -182,7 +185,7 @@ public static void glSettings() { } //INITIALIZE THE GL TEXTURE - public void initGLTexture(Image img) { + public void initGLTexture(Image img) throws Exception { if (glBuffers == null) { glBuffers = new CLMem[slices]; @@ -202,7 +205,25 @@ public void initGLTexture(Image img) { if (useTextures) { GL11.glGenTextures(glIDs); for (int i = 0; i < slices; i++) { - Texture texture = new Texture(img, GL_TEXTURE_3D, glIDs.get(i)); + ByteBuffer bbuf = BufferUtil.newByteBuffer(64 * 64 * 64 * 2); + ShortBuffer sbuf = bbuf.asShortBuffer(); + for (int x=0; x<64; x++) { + for (int y=0; y<64; y++) { + for (int z=0; z<64; z++) { + + short value = 0; + if (x>16 && x<50 && y>16 && y<50) { + value = 128; + } + sbuf.put(value); + } + } + } + + bbuf.flip(); + + + Texture texture = new Texture(64, 64, 64, GL_R16F, bbuf); glBuffers[i] = CL10GL.clCreateFromGLTexture3D(context, CL10.CL_MEM_READ_ONLY, texture.getTarget(), 0, texture.getId(), null); inTexture = texture; } @@ -210,7 +231,7 @@ public void initGLTexture(Image img) { } } - public void initWritableTexture(Image img) { + public void initWritableTexture(Image img) throws Exception { if (glBuffersOut == null) { glBuffersOut = new CLMem[slices]; @@ -230,7 +251,7 @@ public void initWritableTexture(Image img) { if (useTextures) { GL11.glGenTextures(glIDs2); for (int i = 0; i < slices; i++) { - Texture texture = new Texture(img, GL_TEXTURE_3D, glIDs2.get(i)); + Texture texture = new Texture(64, 64, 64, GL_R16F, null); glBuffersOut[i] = CL10GL.clCreateFromGLTexture3D(context, CL10.CL_MEM_WRITE_ONLY, texture.getTarget(), 0, texture.getId(), null); outTexture = texture; } @@ -294,7 +315,7 @@ public void initCL() { //CHECK SYNC STATUS BTWN GL & CL syncStatus(context); - } catch (Exception e) { + } catch (RuntimeException | LWJGLException e) { System.out.println("*** Problem creating CL context"); e.printStackTrace(); } @@ -310,7 +331,7 @@ private void buildProgram(CLContext context) { } for (int i = 0; i < programs.length; i++) { - programs[i] = CL10.clCreateProgramWithSource(context, code, null); + programs[i] = CL10.clCreateProgramWithSource(context, kernel_3DImage, null); } for (int i = 0; i < programs.length; i++) { @@ -393,7 +414,7 @@ private void syncStatus(CLContext context) { } //DISPLAYS THE RESULTS - public void display(Image img) { + public void display(Image img) throws Exception { //CHECKS TO MAKE SURE ALL GL EVENTS HAVE COMPLETED if (syncCLtoGL && glEvent != null) { for (final CLCommandQueue queue : queues) { @@ -416,7 +437,7 @@ public void display(Image img) { } //SETS THE WORKSIZE OF THE KERNEL - kernel2DGlobalWorkSize.put(0, img.getWidth()).put(1, img.getHeight()).put(2, img.getHeight()); + kernel2DGlobalWorkSize.put(0, 64).put(1, 64).put(2, 64); //GETS THE GL OBJECTS for (int i = 0; i < slices; i++) { @@ -463,83 +484,99 @@ private void render(Image img) { for (int i = 0; i < slices; i++) { int seperatorOffset = drawSeparator ? i : 0; + + //SETS GL SETTINGS + glSettings(); //BIND THE TEXTURE + glEnable(GL_TEXTURE_3D); glBindTexture(GL_TEXTURE_3D, outTexture.getId()); - //SETS GL SETTINGS - glSettings(); - //DRAW A CUBE WITH MAPPED TEXTURE glBegin(GL_QUADS); - // Top-face - System.out.println("Drawing top"); - glTexCoord3f(0f, 0f, 0f); - glVertex3f(1.0f, 1.0f, -1.0f); - glTexCoord3f(0f, 1.0f, 0f); - glVertex3f(-1.0f, 1.0f, -1.0f); - glTexCoord3f(1.0f, 1.0f, 0f); - glVertex3f(-1.0f, 1.0f, 1.0f); - glTexCoord3f(1.0f, 0f, 0f); - glVertex3f(1.0f, 1.0f, 1.0f); - - // Bottom-face - System.out.println("Drawing bottom"); - glTexCoord3f(0f, 0f, 0f); - glVertex3f(1.0f, -1.0f, 1.0f); - glTexCoord3f(0f, 1.0f, 0f); - glVertex3f(-1.0f, -1.0f, 1.0f); - glTexCoord3f(1.0f, 1.0f, 0f); - glVertex3f(-1.0f, -1.0f, -1.0f); - glTexCoord3f(1.0f, 0f, 0f); - glVertex3f(1.0f, -1.0f, -1.0f); - - // Front-face - System.out.println("Drawing front"); - glTexCoord3f(0f, 0f, 0f); - glVertex3f(1.0f, 1.0f, 1.0f); - glTexCoord3f(0f, 1.0f, 0f); - glVertex3f(-1.0f, 1.0f, 1.0f); - glTexCoord3f(1.0f, 1.0f, 0f); - glVertex3f(-1.0f, -1.0f, 1.0f); - glTexCoord3f(1.0f, 0f, 0f); - glVertex3f(1.0f, -1.0f, 1.0f); - - // Back-face - System.out.println("Drawing back"); - glTexCoord3f(0f, 0f, 0f); - glVertex3f(1.0f, -1.0f, -1.0f); - glTexCoord3f(0f, 1.0f, 0f); - glVertex3f(-1.0f, -1.0f, -1.0f); - glTexCoord3f(1.0f, 1.0f, 0f); - glVertex3f(-1.0f, 1.0f, -1.0f); - glTexCoord3f(1.0f, 0f, 0f); - glVertex3f(1.0f, 1.0f, -1.0f); - - // Left-face - System.out.println("Drawing left"); - glTexCoord3f(0f, 0f, 0f); - glVertex3f(-1.0f, 1.0f, 1.0f); - glTexCoord3f(0f, 1.0f, 0f); - glVertex3f(-1.0f, 1.0f, -1.0f); - glTexCoord3f(1.0f, 1.0f, 0f); - glVertex3f(-1.0f, -1.0f, -1.0f); - glTexCoord3f(1.0f, 0f, 0f); - glVertex3f(-1.0f, -1.0f, 1.0f); - - // Right-face - System.out.println("Drawing right"); - glTexCoord3f(0f, 0f, 0f); - glVertex3f(1.0f, 1.0f, -1.0f); - glTexCoord3f(0f, 1.0f, 0f); - glVertex3f(1.0f, 1.0f, 1.0f); - glTexCoord3f(1.0f, 1.0f, 0f); - glVertex3f(1.0f, -1.0f, 1.0f); - glTexCoord3f(1.0f, 0f, 0f); - glVertex3f(1.0f, -1.0f, -1.0f); + glTexCoord2f(0, 0); + glVertex2i(100, 100); //upper left + + glTexCoord2f(0, 1); + glVertex2i(100, 200); //upper right + + glTexCoord2f(1, 1); + glVertex2i(200, 200); //bottom right + + glTexCoord2f(1, 0); + glVertex2i(200, 100); //bottom left + +// // Top-face +// System.out.println("Drawing top"); +// glTexCoord3f(0f, 0f, 0f); +// glVertex3f(1.0f, 1.0f, -1.0f); +// glTexCoord3f(0f, 1.0f, 0f); +// glVertex3f(-1.0f, 1.0f, -1.0f); +// glTexCoord3f(1.0f, 1.0f, 0f); +// glVertex3f(-1.0f, 1.0f, 1.0f); +// glTexCoord3f(1.0f, 0f, 0f); +// glVertex3f(1.0f, 1.0f, 1.0f); +// +// // Bottom-face +// System.out.println("Drawing bottom"); +// glTexCoord3f(0f, 0f, 0f); +// glVertex3f(1.0f, -1.0f, 1.0f); +// glTexCoord3f(0f, 1.0f, 0f); +// glVertex3f(-1.0f, -1.0f, 1.0f); +// glTexCoord3f(1.0f, 1.0f, 0f); +// glVertex3f(-1.0f, -1.0f, -1.0f); +// glTexCoord3f(1.0f, 0f, 0f); +// glVertex3f(1.0f, -1.0f, -1.0f); +// +// // Front-face +// System.out.println("Drawing front"); +// glTexCoord3f(0f, 0f, 0f); +// glVertex3f(1.0f, 1.0f, 1.0f); +// glTexCoord3f(0f, 1.0f, 0f); +// glVertex3f(-1.0f, 1.0f, 1.0f); +// glTexCoord3f(1.0f, 1.0f, 0f); +// glVertex3f(-1.0f, -1.0f, 1.0f); +// glTexCoord3f(1.0f, 0f, 0f); +// glVertex3f(1.0f, -1.0f, 1.0f); +// +// // Back-face +// System.out.println("Drawing back"); +// glTexCoord3f(0f, 0f, 0f); +// glVertex3f(1.0f, -1.0f, -1.0f); +// glTexCoord3f(0f, 1.0f, 0f); +// glVertex3f(-1.0f, -1.0f, -1.0f); +// glTexCoord3f(1.0f, 1.0f, 0f); +// glVertex3f(-1.0f, 1.0f, -1.0f); +// glTexCoord3f(1.0f, 0f, 0f); +// glVertex3f(1.0f, 1.0f, -1.0f); +// +// // Left-face +// System.out.println("Drawing left"); +// glTexCoord3f(0f, 0f, 0f); +// glVertex3f(-1.0f, 1.0f, 1.0f); +// glTexCoord3f(0f, 1.0f, 0f); +// glVertex3f(-1.0f, 1.0f, -1.0f); +// glTexCoord3f(1.0f, 1.0f, 0f); +// glVertex3f(-1.0f, -1.0f, -1.0f); +// glTexCoord3f(1.0f, 0f, 0f); +// glVertex3f(-1.0f, -1.0f, 1.0f); +// +// // Right-face +// System.out.println("Drawing right"); +// glTexCoord3f(0f, 0f, 0f); +// glVertex3f(1.0f, 1.0f, -1.0f); +// glTexCoord3f(0f, 1.0f, 0f); +// glVertex3f(1.0f, 1.0f, 1.0f); +// glTexCoord3f(1.0f, 1.0f, 0f); +// glVertex3f(1.0f, -1.0f, 1.0f); +// glTexCoord3f(1.0f, 0f, 0f); +// glVertex3f(1.0f, -1.0f, -1.0f); glEnd(); + + glBindTexture(GL_TEXTURE_3D, 0); + glDisable(GL_TEXTURE_3D); } //CHECKING SYNC diff --git a/src/tutorial/clTexture3d/Texture.java b/src/tutorial/clTexture3d/Texture.java index fa65fac..25c923b 100644 --- a/src/tutorial/clTexture3d/Texture.java +++ b/src/tutorial/clTexture3d/Texture.java @@ -5,10 +5,15 @@ */ package tutorial.clTexture3d; +import java.nio.ByteBuffer; +import static org.lwjgl.opengl.ARBTextureRg.GL_R16; +import static org.lwjgl.opengl.ARBTextureRg.GL_R16F; import org.lwjgl.opengl.GL11; import static org.lwjgl.opengl.GL11.GL_NEAREST; +import static org.lwjgl.opengl.GL11.GL_RED; import static org.lwjgl.opengl.GL11.GL_RGB; import static org.lwjgl.opengl.GL11.GL_RGB8; +import static org.lwjgl.opengl.GL11.GL_RGBA; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.GL_TEXTURE_MAG_FILTER; import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER; @@ -20,23 +25,21 @@ import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE; import static org.lwjgl.opengl.GL12.GL_TEXTURE_3D; import static org.lwjgl.opengl.GL12.glTexImage3D; +import static org.lwjgl.opengl.GL30.GL_RGBA16F; /* * @author LAA */ public class Texture { + private int width, height, depth, target, id; - private final int width, height, depth, target, id; - private final Image image; - - public Texture(Image image, int target, int id) { - this.image = image; - this.width = image.getWidth(); - this.height = image.getHeight(); - this.depth = 20; - this.target = target; - this.id = id; - + public Texture(int width, int height, int depth, int colorFormat, ByteBuffer buff) throws Exception { + this.width = width; + this.height = height; + this.depth = depth; + this.target = GL_TEXTURE_3D; + this.id = GL11.glGenTextures(); + // bind this texture GL11.glBindTexture(target, id); @@ -46,7 +49,19 @@ public Texture(Image image, int target, int id) { glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.getWidth() + 1, image.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); - glTexImage3D(target, 0, GL_RGB8, image.getWidth() + 1, image.getHeight(), depth, 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); + switch (colorFormat){ + case GL_RGB8: + glTexImage3D(target, 0, colorFormat, width, height, depth, 0, GL_RGB, GL_UNSIGNED_BYTE, buff); + break; + case GL_RGBA16F: + glTexImage3D(target, 0, colorFormat, width, height, depth, 0, GL_RGBA, GL_UNSIGNED_BYTE, buff); + break; + case GL_R16F: + glTexImage3D(target, 0, colorFormat, width, height, depth, 0, GL_RED, GL_UNSIGNED_BYTE, buff); + break; + default: + throw new Exception("Unrecognized texture color format: " + colorFormat); + } } public void bind() { @@ -57,10 +72,6 @@ public int getTarget() { return target; } - public Image getImage() { - return image; - } - public int getId() { return id; } @@ -72,4 +83,8 @@ public int getWidth() { public int getHeight() { return height; } + + public int getDepth(){ + return depth; + } } From c3495eaf6bbf9cbb60492b249de0582047cfe1f3 Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Wed, 2 Aug 2017 15:49:31 -0400 Subject: [PATCH 16/17] 3d Texture workign with simple edge detection --- build/classes/tutorial/clTexture3d/Main.class | Bin 16356 -> 16776 bytes .../tutorial/clTexture3d/Texture.class | Bin 1957 -> 1999 bytes src/tutorial/clTexture3d/Main.java | 106 +++++++++--------- src/tutorial/clTexture3d/Texture.java | 8 +- 4 files changed, 63 insertions(+), 51 deletions(-) diff --git a/build/classes/tutorial/clTexture3d/Main.class b/build/classes/tutorial/clTexture3d/Main.class index b89bc7d0e83d183e6ab3c4bd01c5c62d67074d4e..e7b06f0fff9145c043bb440fb0e5cee1c52a9880 100644 GIT binary patch delta 8003 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 delta 8057 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 Nqwl!nSvexV{y)mp<68g# diff --git a/build/classes/tutorial/clTexture3d/Texture.class b/build/classes/tutorial/clTexture3d/Texture.class index 0f23866ed3af0adfafe81d015de0cb8015558fb6..46fe7cea7d1318a814ba6a540010d497ce688e9b 100644 GIT binary patch delta 354 zcmXAkyGjE=6o$Xa?(CRE5`&3k%|>i=lU0Kkh!|ob5fKzbEkq&;VwYBX#VU=}^Z^SI ztSkh@mr$_q5k&AE^sr7b|91}O_TOdSvX4DC`AG^7RMMWiXRRB+g{wW$DqKgR7ou~b zN6;S^?L<$coPt{l%1+KVxxDiA3nTaR?65A{w9dFrE}yVvT~rBM*R{(oW70P*lS7hJ z$jIzbB7A0;q$dA7%Pg?YBD*YcOr1U}3}|pmlV?_WrOi8Qe9+-rDu38eLu@i7lUx4| zWJ4&Cc%ejqim6P{AQ9t)B%PQlLSj=2t8#{x1E7faD_cE-ujCnKC1>+qTW^tO+a7vN ewPUlUU?03t?Z@;bbRg7J-8eoqp*o3aV9XyXe=&Lh delta 345 zcmY+9%`QVx6otRj`=^ztMjNiSLW2IFG?6x%Y9j~(kroLPBQr7c0Gf^@h9{AD05K9G z24$vkXySgd!m&CYfiB z3UwA)XNe9~j#;KhjcdK$u)+fko@nyMD(|%UWKENx^_N-`3%V&kS#p?&@}gKo6IG!; zB)cebBPvnG(_$FK`_?u;AT&CG@?cwj+uLA}P22aIX4}51?x<#LDkzvvM7yGch^|CO LzZBFoFh>0c%$PO! diff --git a/src/tutorial/clTexture3d/Main.java b/src/tutorial/clTexture3d/Main.java index f12db27..80a6081 100644 --- a/src/tutorial/clTexture3d/Main.java +++ b/src/tutorial/clTexture3d/Main.java @@ -27,6 +27,7 @@ import org.lwjgl.opengl.*; import static java.lang.Math.min; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.nio.ShortBuffer; import static org.lwjgl.opencl.CL10.CL_PROGRAM_BUILD_LOG; import static org.lwjgl.opencl.CL10.CL_QUEUE_PROFILING_ENABLE; @@ -40,19 +41,21 @@ import static org.lwjgl.opengl.ARBSync.GL_SYNC_GPU_COMMANDS_COMPLETE; import static org.lwjgl.opengl.ARBSync.glFenceSync; import static org.lwjgl.opengl.ARBSync.glWaitSync; +import static org.lwjgl.opengl.ARBTextureRg.GL_R16; import static org.lwjgl.opengl.ARBTextureRg.GL_R16F; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL12.*; //import static org.lwjgl.opengl.GL15.glBindBuffer; import static org.lwjgl.opengl.GL15.glDeleteBuffers; +import static org.lwjgl.opengl.GL30.GL_RGBA16F; //import static org.lwjgl.opengl.GL21.GL_PIXEL_UNPACK_BUFFER; /* * @author labramson */ public class Main { - public static Image img; - public static Image img2; + //public static Image img; + //public static Image img2; private Texture inTexture, outTexture; static final String kernel_Sample @@ -67,14 +70,26 @@ public class Main { = "kernel void imgTest2(__read_only image3d_t inTexture, __write_only image3d_t outTexture){\n" + " #pragma OPENCL EXTENSION cl_khr_3d_image_writes : enable\n" + " const sampler_t smp = CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;\n\n" - + " uint offset = get_global_id(1)*0x4000 + get_global_id(0)*0x1000;\n" + " int4 coord = (int4)(get_global_id(0), get_global_id(1), get_global_id(2), 0);\n" + + " int4 coordL = (int4)(get_global_id(0)-1, get_global_id(1), get_global_id(2), 0);\n" + + " int4 coordR = (int4)(get_global_id(0)+1, get_global_id(1), get_global_id(2), 0);\n" + + " int4 coordT = (int4)(get_global_id(0), get_global_id(1)-1, get_global_id(2), 0);\n" + + " int4 coordBo = (int4)(get_global_id(0), get_global_id(1)+1, get_global_id(2), 0);\n" + + " int4 coordF = (int4)(get_global_id(0), get_global_id(1), get_global_id(2)-1, 0);\n" + + " int4 coordBa = (int4)(get_global_id(0), get_global_id(1), get_global_id(2)-1, 0);\n" + " float4 pixel = read_imagef(inTexture, smp, coord);\n" - + " //if (coord.x > 5 & coord.y > 5) { \n" - + " pixel.x = 1.0;\n" - + " // pixel.y -= 1.5;\n" - + " // pixel.z -= 1.5;\n" - + " //}\n" + + " float4 pixelL = read_imagef(inTexture, smp, coordL);\n" + + " float4 pixelR = read_imagef(inTexture, smp, coordR);\n" + + " float4 pixelT = read_imagef(inTexture, smp, coordT);\n" + + " float4 pixelBo = read_imagef(inTexture, smp, coordBo);\n" + + " float4 pixelF = read_imagef(inTexture, smp, coordF);\n" + + " float4 pixelBa = read_imagef(inTexture, smp, coordBa);\n" + + " pixel.x = (pixelR.x - pixelL.x); \n" + + " if (pixel.x < 0.0) {pixel.x = -pixel.x;} \n" + + " pixel.y = pixelT.x - pixelBo.x; \n" + + " if (pixel.y < 0.0) {pixel.y = -pixel.y;} \n" + + " pixel.z = pixelF.x - pixelBa.x; \n" + + " if (pixel.z < 0.0) {pixel.z = -pixel.z;} \n" + " write_imagef(outTexture, coord, pixel);\n" + "}"; @@ -109,14 +124,6 @@ public Main() { } public static void main(String... args) throws Exception { - //IMAGE FILE - String imgDir = "C:\\Users\\labramson\\Documents\\Tutorial\\res\\"; - String imgName = "texture.png"; - String imgName2 = "blank.jpg"; - //CREATE IMAGE OBJECT - img = new Image(imgDir + "" + imgName); - img2 = new Image(imgDir + "" + imgName2); - //INIT DISPLAY & GL CONTEXT initDisplay(); initGL(); @@ -128,8 +135,8 @@ public static void main(String... args) throws Exception { run.initCL(); //CREATE THE TEXTURE IN GL CONTEXT - run.initGLTexture(img); - run.initWritableTexture(img2); + run.initGLTexture(); + run.initWritableTexture(); //COMPLETE ALL GL glFinish(); @@ -140,7 +147,7 @@ public static void main(String... args) throws Exception { //DISPLAY LOOP while (!Display.isCloseRequested()) { //ALLOWS DISPLAYING ON SCREEN - run.display(img); + run.display(); //IF ESC THEN CLOSE if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { @@ -171,7 +178,7 @@ public static void initDisplay() { public static void initGL() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); - glOrtho(0, 300, 300, 0, 5, -5); + glOrtho(0, 300, 300, 0, 10, -300); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } @@ -185,7 +192,7 @@ public static void glSettings() { } //INITIALIZE THE GL TEXTURE - public void initGLTexture(Image img) throws Exception { + public void initGLTexture() throws Exception { if (glBuffers == null) { glBuffers = new CLMem[slices]; @@ -207,31 +214,35 @@ public void initGLTexture(Image img) throws Exception { for (int i = 0; i < slices; i++) { ByteBuffer bbuf = BufferUtil.newByteBuffer(64 * 64 * 64 * 2); ShortBuffer sbuf = bbuf.asShortBuffer(); - for (int x=0; x<64; x++) { + for (int z=0; z<64; z++) { for (int y=0; y<64; y++) { - for (int z=0; z<64; z++) { - + for (int x=0; x<64; x++) { short value = 0; - if (x>16 && x<50 && y>16 && y<50) { + if ( x>16 && x<50 && y>16 && y<50 && z>16 && z<50) { + value = 32767; + } + else if ( x>18 && x<48 && y>18 && y<48 && z>18 && z<48) { value = 128; } sbuf.put(value); } } } - + + bbuf.flip(); - + bbuf.order(ByteOrder.LITTLE_ENDIAN); Texture texture = new Texture(64, 64, 64, GL_R16F, bbuf); glBuffers[i] = CL10GL.clCreateFromGLTexture3D(context, CL10.CL_MEM_READ_ONLY, texture.getTarget(), 0, texture.getId(), null); inTexture = texture; } + //UNBINDS THE TEXTURE glBindTexture(GL_TEXTURE_3D, 0); } } - public void initWritableTexture(Image img) throws Exception { + public void initWritableTexture() throws Exception { if (glBuffersOut == null) { glBuffersOut = new CLMem[slices]; @@ -251,7 +262,7 @@ public void initWritableTexture(Image img) throws Exception { if (useTextures) { GL11.glGenTextures(glIDs2); for (int i = 0; i < slices; i++) { - Texture texture = new Texture(64, 64, 64, GL_R16F, null); + Texture texture = new Texture(64, 64, 64, GL_RGBA16F, null); glBuffersOut[i] = CL10GL.clCreateFromGLTexture3D(context, CL10.CL_MEM_WRITE_ONLY, texture.getTarget(), 0, texture.getId(), null); outTexture = texture; } @@ -414,7 +425,7 @@ private void syncStatus(CLContext context) { } //DISPLAYS THE RESULTS - public void display(Image img) throws Exception { + public void display() throws Exception { //CHECKS TO MAKE SURE ALL GL EVENTS HAVE COMPLETED if (syncCLtoGL && glEvent != null) { for (final CLCommandQueue queue : queues) { @@ -426,7 +437,7 @@ public void display(Image img) throws Exception { //IF THE GL TEXTURE BUFFERS HAVE NOT BEEN INITIALIZED if (!buffersInitialized) { - initGLTexture(img); + initGLTexture(); setKernelParams(); } @@ -462,17 +473,15 @@ public void display(Image img) throws Exception { // block until done (important: finish before doing further gl work) if (!syncGLtoCL) { for (int i = 0; i < slices; i++) { - System.out.println("I: " + i); - System.out.println("q: " + queues[i].isValid()); clFinish(queues[i]); } } //RENDER THE TEXTURE - render(img); + render(); } - private void render(Image img) { + private void render() { if (syncGLtoCL) { for (int i = 0; i < slices; i++) { glWaitSync(clSyncs[i], 0, 0); @@ -480,10 +489,10 @@ private void render(Image img) { } //draw slices - int sliceWidth = img.getWidth() / slices; + //int sliceWidth = texture.getWidth() / slices; for (int i = 0; i < slices; i++) { - int seperatorOffset = drawSeparator ? i : 0; + //int seperatorOffset = drawSeparator ? i : 0; //SETS GL SETTINGS glSettings(); @@ -494,18 +503,15 @@ private void render(Image img) { //DRAW A CUBE WITH MAPPED TEXTURE glBegin(GL_QUADS); - - glTexCoord2f(0, 0); - glVertex2i(100, 100); //upper left - - glTexCoord2f(0, 1); - glVertex2i(100, 200); //upper right - - glTexCoord2f(1, 1); - glVertex2i(200, 200); //bottom right - - glTexCoord2f(1, 0); - glVertex2i(200, 100); //bottom left + //System.out.println("Drawing front"); + glTexCoord3f(0f, 0f, 0.5f); + glVertex3f(100, 100, 0); //upper left + glTexCoord3f(0f, 1.0f, 0.5f); + glVertex3f(100, 200, 0); //upper right + glTexCoord3f(1.0f, 1.0f, 0.5f); + glVertex3f(200, 200, 0); //bottom right + glTexCoord3f(1.0f, 0f, 0.5f); + glVertex3f(200, 100, 0); //bottom left // // Top-face // System.out.println("Drawing top"); @@ -585,4 +591,4 @@ private void render(Image img) { glEvent = clCreateEventFromGLsyncKHR(context, glSync, null); } } -} +} \ No newline at end of file diff --git a/src/tutorial/clTexture3d/Texture.java b/src/tutorial/clTexture3d/Texture.java index 25c923b..f2d562d 100644 --- a/src/tutorial/clTexture3d/Texture.java +++ b/src/tutorial/clTexture3d/Texture.java @@ -6,6 +6,7 @@ package tutorial.clTexture3d; import java.nio.ByteBuffer; +import java.nio.ShortBuffer; import static org.lwjgl.opengl.ARBTextureRg.GL_R16; import static org.lwjgl.opengl.ARBTextureRg.GL_R16F; import org.lwjgl.opengl.GL11; @@ -14,6 +15,7 @@ import static org.lwjgl.opengl.GL11.GL_RGB; import static org.lwjgl.opengl.GL11.GL_RGB8; import static org.lwjgl.opengl.GL11.GL_RGBA; +import static org.lwjgl.opengl.GL11.GL_SHORT; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.GL_TEXTURE_MAG_FILTER; import static org.lwjgl.opengl.GL11.GL_TEXTURE_MIN_FILTER; @@ -51,13 +53,17 @@ public Texture(int width, int height, int depth, int colorFormat, ByteBuffer buf // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.getWidth() + 1, image.getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.getByeBuff()); switch (colorFormat){ case GL_RGB8: + //glTexImage3D(); glTexImage3D(target, 0, colorFormat, width, height, depth, 0, GL_RGB, GL_UNSIGNED_BYTE, buff); break; case GL_RGBA16F: glTexImage3D(target, 0, colorFormat, width, height, depth, 0, GL_RGBA, GL_UNSIGNED_BYTE, buff); break; case GL_R16F: - glTexImage3D(target, 0, colorFormat, width, height, depth, 0, GL_RED, GL_UNSIGNED_BYTE, buff); + glTexImage3D(target, 0, colorFormat, width, height, depth, 0, GL_RED, GL_SHORT, buff); + break; + case GL_R16: + glTexImage3D(target, 0, colorFormat, width, height, depth, 0, GL_RED, GL_SHORT, buff); break; default: throw new Exception("Unrecognized texture color format: " + colorFormat); From 0546382a93dac089956431b50a18b448e9d3b3f6 Mon Sep 17 00:00:00 2001 From: Lindsey Abramson Date: Wed, 2 Aug 2017 15:55:46 -0400 Subject: [PATCH 17/17] removing extra shape render from main --- build/classes/tutorial/clTexture/Main.class | Bin 15477 -> 15323 bytes src/tutorial/clTexture/Main.java | 9 --------- 2 files changed, 9 deletions(-) diff --git a/build/classes/tutorial/clTexture/Main.class b/build/classes/tutorial/clTexture/Main.class index 49b1f3f2440ec6d3ddb4c560e3950a116ce0214c..eea93f80399249b6a79aa624cc5c4e24b696a7ab 100644 GIT binary patch delta 3791 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 delta 3981 zcma)9dwkF37eDXw{o3>Se)h20u$jq*v6~q-j7V$~O~l-mS~K57B+RAwwMa=9(WjK6 z&_%k}`27}17fQP5E|(%w=}P6&h~GIMn|{CldcD3o=RD6j&$&P6`E2)$qcbbFonHSc z5#{i|4GInV8eC-1&!soeKSV)Xtf0un09>NfKm~&oT@n+hzbcUCb4b?bHoceuC{ zcPVqBp1E78MG6+z$#O{Jzeo2x7x!XnNMgLt!4enu;{gq3se=by8ij`<(HhGPmOFSj zh6s=8=Hm*UFj(#2Nten{;$V%+J>}wQJmcV5EyHszy@2N(ykPL68hS}HTjgM_;&o0X zr0)MwMzwCd>|nj(4F<0`*yz%9Ofz^@`I|HauQ_;K@f$8(gEt*)Rud&Iw%{!XZ-Ztt0!Kb?V%%#cr+{F%j5kgn&RFk_5 zb}Qav@TKCf9PD+lPx)Uf*sq%hG~{n0k%xl{zE%6*Ir!eeA!Yxd%70YqCvC`|UG&5+ zO8u(kIb5miBTD|JoZr=_KNK7_IOgIwPN=}2nv)urfRn1}lrI0$qMlZ8MgVI|F%+K&@sc!EuY6NEV`kA_r7hOki^NBTPmlO<<^{HxsAwjTTbzU^^;p4*#sS&rz*mx7w9yIxjv$D7+AEn#pp4~dH4;%M}- zJd}r79?l~ajP$lN7?)I{j$LMX6kiTd8mF&sNj_Qi<=Cx{)g_-y}WAb9k=ho8?qZ z?0{|`(k0Ey7T!q%L|mco$s)GC*Ngxp;A5hZp({!vE_T%^X4>aQGBoE z`*?}v`}qNj3$*8#@`IMX6?WMdY)VpW~M-dZUk**ftkyy}@k{ z1=oR6Jfy~XH>Miz^3-+(Z^(0W9)!M>N#62c!8EejcU0*`xDX}LJz9ZGA}>`xK3vPaaKYUrfk z1$2u3k`u?hw&_(OwL87EQl)aJp1@Ufn$8Fg&?9n4(-1++0HIhCwiGN>fJ*2h1Vmd9 zL6J?Mz!{oB^$g?}QTrp|G;?8u9~3RqDWr2$y_20ve@}ecK&c}e!h1O*Lp(W{(KfZt z-$cylB6C=kcsZG!T$wvCn-&vHYN?yrqZe&9HJNq)9m7Rs{ z`jplM*o7hxg=h(N616}>sds>e(1nPRT(UT}tTstXX_vq^--IHPPLpd83!I?1h*RXC zhI$ECo&n!dcGgQ`=|EQBe{5;xIZG@5ktKP0)Kb-g_Hp8bw=#RaU$vf6pD6kYO%NyS z*7OeI(Nsd|NE?uVW)fZ=twkc5OU93om7Ja@awJvuy8$hPZgNgO>70CWZEf3VZA+xK z6f|gQXp})KgVrQX(&Rpp@=9?HO}Fym%cS)^+}NRqdU X;{-fm>kNGw6{g7q&<%k zYm+^mo<m@mNJXMa%H-mpXA-Bh% zzr8CL@5WFv!s1~$WnirD-9J_;kD9M^b?$ocX>{j-J=CXkN$X6C^;4~WtT`9lnzO+P z|8aCi7jaAZ9mqXJIR;(5UphBw-j!HNj8hbAkk_V$xS^5s%U6zCs!Hxsp_N|Jbw*z` zr4uAYV(5Y~5;^@@!vZ5 zFD=17T8{m+N`ia}2kCiyOV#+EHsX+E^C#Mhcj*Hhrq6JM_To4C6@U0WqEjG5O>489 zPxH`AZhMfj