Advertisement
Guest User

Untitled

a guest
Aug 11th, 2014
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.07 KB | None | 0 0
  1. package particles;
  2.  
  3. import java.nio.FloatBuffer;
  4. import java.nio.IntBuffer;
  5. import java.util.List;
  6.  
  7. import org.lwjgl.BufferUtils;
  8. import org.lwjgl.PointerBuffer;
  9. import org.lwjgl.opencl.CL;
  10. import org.lwjgl.opencl.CL10;
  11. import org.lwjgl.opencl.CL10GL;
  12. import org.lwjgl.opencl.CLCommandQueue;
  13. import org.lwjgl.opencl.CLContext;
  14. import org.lwjgl.opencl.CLDevice;
  15. import org.lwjgl.opencl.CLKernel;
  16. import org.lwjgl.opencl.CLMem;
  17. import org.lwjgl.opencl.CLPlatform;
  18. import org.lwjgl.opencl.CLProgram;
  19. import org.lwjgl.opencl.Util;
  20. import org.lwjgl.opengl.Display;
  21. import org.lwjgl.opengl.Drawable;
  22.  
  23. import com.jme3.app.SimpleApplication;
  24. import com.jme3.material.Material;
  25. import com.jme3.math.ColorRGBA;
  26. import com.jme3.math.Vector3f;
  27. import com.jme3.renderer.RenderManager;
  28. import com.jme3.renderer.ViewPort;
  29. import com.jme3.scene.Geometry;
  30. import com.jme3.scene.Mesh;
  31. import com.jme3.scene.Spatial.CullHint;
  32. import com.jme3.scene.VertexBuffer;
  33. import com.jme3.scene.VertexBuffer.Type;
  34. import com.jme3.scene.control.AbstractControl;
  35.  
  36. public class JMEOpenCLTest extends SimpleApplication{  
  37.     private VertexBuffer verticesBuff;
  38.    
  39.     public static void main(String[] _a){
  40.         new JMEOpenCLTest().start();
  41.     }
  42.    
  43.     @Override
  44.     public void simpleInitApp() {
  45.         flyCam.setMoveSpeed(100f);
  46.        
  47.         Vector3f [] vertices = new Vector3f[3];
  48.         vertices[0] = new Vector3f(0,0,0);
  49.         vertices[1] = new Vector3f(3,0,0);
  50.         vertices[2] = new Vector3f(0,3,0);
  51.  
  52.         int [] indexes = { 2,0,1};
  53.        
  54.         Mesh mesh=new Mesh();
  55.         mesh.setBuffer(Type.Position,3,com.jme3.util.BufferUtils.createFloatBuffer(vertices));
  56.         mesh.setBuffer(Type.Index,3,com.jme3.util.BufferUtils.createIntBuffer(indexes));
  57.         mesh.updateBound();
  58.  
  59.         Geometry geom=new Geometry();
  60.         geom.setMesh(mesh);
  61.         geom.setCullHint(CullHint.Never);
  62.  
  63.         Material mat=new Material(assetManager,"Common/MatDefs/Misc/Unshaded.j3md");
  64.         mat.setColor("Color",ColorRGBA.Green);
  65.         geom.setMaterial(mat);
  66.         geom.setCullHint(CullHint.Never);
  67.        
  68.         rootNode.attachChild(geom);
  69.         geom.addControl(new CLCode());
  70.  
  71.    
  72.         // Vertices Buffer
  73.         verticesBuff=mesh.getBuffer(Type.Position);
  74.  
  75.     }
  76.    
  77.    
  78.    
  79.     private class CLCode extends AbstractControl{
  80.         private CLKernel kernel;
  81.         private CLCommandQueue queue;
  82.         private PointerBuffer workers;
  83.         private CLMem verticesBuffCL;
  84.  
  85.         @Override
  86.         protected void controlUpdate(float tpf) {
  87.             if(kernel==null) kernelSetup();
  88.             else{
  89.                 CL10GL.clEnqueueAcquireGLObjects(queue,verticesBuffCL,null,null);
  90.                         CL10.clEnqueueNDRangeKernel(queue,kernel,1,null,workers,null,null,null);
  91.                 CL10GL.clEnqueueReleaseGLObjects(queue,verticesBuffCL,null,null);
  92.                 CL10.clEnqueueReadBuffer(queue, clresult, CL10.CL_TRUE, 0, result, null, null);  
  93.                
  94.                 CL10.clFinish(queue);
  95.                 System.out.println();
  96.                 System.out.println();
  97.  
  98.                 for(int i=0;i<result.capacity();i++){
  99.                     System.out.println(result.get(i));
  100.                 }
  101.             }
  102.         }
  103.         CLMem clresult;
  104.         FloatBuffer result;
  105.         private void kernelSetup(){
  106.             try{
  107.                 if(verticesBuff.getId()==-1)return;
  108.                
  109.                 System.out.println("VerticesBuffer ID: "+verticesBuff.getId());
  110.                
  111.                 String source=
  112.                         "kernel void test(global float *position,int size,global float* result) {"
  113.                                 +"unsigned int id = get_global_id(0);"
  114.                                 +"if(id<size){"
  115.                                     +"int idv=3*id;"
  116.                                     +"position[idv+1]+=0.0001f;"
  117.                                     +"result[idv]=position[idv];"
  118.                                     +"result[idv+1]=position[idv+1];"
  119.                                     +"result[idv+2]=position[idv+2];"
  120.                                 +"}"
  121.                         +"}";
  122.                        
  123.                 CL.create();
  124.                 Drawable drawable=Display.getDrawable();
  125.                 CLPlatform platform=CLPlatform.getPlatforms().get(0);
  126.                 List<CLDevice> devices=platform.getDevices(CL10.CL_DEVICE_TYPE_GPU);
  127.                
  128.                 IntBuffer errorBuff=BufferUtils.createIntBuffer(1);
  129.        
  130.                 CLContext context=CLContext.create(platform,devices,null,drawable,null);
  131.                 queue=CL10.clCreateCommandQueue(context,devices.get(0),CL10.CL_QUEUE_PROFILING_ENABLE,errorBuff);
  132.                 Util.checkCLError(errorBuff.get(0));
  133.  
  134.                 result=BufferUtils.createFloatBuffer(3*3);
  135.                 clresult = CL10.clCreateBuffer(context, CL10.CL_MEM_WRITE_ONLY | CL10.CL_MEM_COPY_HOST_PTR, result, errorBuff);
  136.                
  137.                 verticesBuffCL=CL10GL.clCreateFromGLBuffer(context,CL10.CL_MEM_READ_WRITE,
  138.                         // Buffer ID
  139.                         verticesBuff.getId()
  140.                 ,null);  
  141.                
  142.                
  143.                 Util.checkCLError(errorBuff.get(0));
  144.                
  145.                 for(CLDevice d:devices)System.out.println(d);
  146.                
  147.                 CLProgram program=CL10.clCreateProgramWithSource(context,source,null);
  148.                 Util.checkCLError(CL10.clBuildProgram(program,devices.get(0),"",null));
  149.        
  150.                 kernel=CL10.clCreateKernel(program,"test",null);
  151.                 kernel.setArg(0,verticesBuffCL);
  152.                 kernel.setArg(1,3);
  153.                 kernel.setArg(2,clresult);
  154.  
  155.                 workers=BufferUtils.createPointerBuffer(1);
  156.                 workers.put(0,3);
  157.        
  158.             }catch(Exception e){
  159.                 e.printStackTrace();
  160.             }
  161.         }
  162.        
  163.         @Override
  164.         protected void controlRender(RenderManager rm, ViewPort vp) {}
  165.     }
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement