Login  Register

CL2dImage processing, Only half image is processed

Posted by suleman on Apr 28, 2011; 2:28pm
URL: https://forum.jogamp.org/CL2dImage-processing-Only-half-image-is-processed-tp2874888.html

Hi,

Only half of the image is copied using the following Jocl and OpneCL kernel code.
main program related code lines and OpneCL kernel is shown below.
Thanks a lot.



Main program code (only related code)
-----------------------------------------
....
 //load image
 BufferedImage image = readImage("lena.png");
 assert image.getColorModel().getNumComponents() == 3;

  //Image dimensions
  int imageWidth = image.getWidth();
  int imageHeight = image.getHeight();

  //Output image
  BufferedImage outputImage = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
           
  //Create the memory object for the input- and output image

  int[] pixels = image.getRaster().getPixels(0, 0, imageWidth, imageHeight, (int[])null);

  CLImageFormat format = new CLImageFormat(INTENSITY, UNSIGNED_INT32);
  System.out.println("Pixels length: "+pixels.length);  

  CLImage2d<IntBuffer> imageA = defaultContext.createImage2d(newDirectIntBuffer(pixels), imageWidth, imageHeight, format,READ_ONLY);
  CLImage2d<IntBuffer> imageB = defaultContext.createImage2d(newDirectIntBuffer(pixels.length), imageWidth, imageHeight, format,WRITE_ONLY);

 CLCommandQueue queue = device.createCommandQueue();
 int localWorkSize =  Integer.parseInt(args[0]);
 int globalWorkSize = imageWidth;

//Setup kernel
kernel.putArgs(imageA,imageB); kernel.putArg(globalWorkSize); kernel.putArg(globalWorkSize);
queue.putWriteImage(imageA, false);                                      
queue.put2DRangeKernel(kernel, 0, 0, globalWorkSize, globalWorkSize, localWorkSize, localWorkSize);
queue.putReadImage(imageB,true);      



Kernel Code
----------------------
constant sampler_t imageSampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;

  kernel void gamma(read_only image2d_t inputImg, write_only image2d_t outputImg, int ImageWidth, int ImageHeight)
   {
    int x = get_global_id(0);
        int y = get_global_id(1);

        if((x >= ImageWidth) || (y>= ImageHeight)) {
                return;
        }
        else
        {
                int2 coord = (int2)(x,y);
                uint4 result = read_imageui(inputImg, imageSampler, coord);
                write_imageui(outputImg, coord, result);
        }
   }