aboutsummaryrefslogtreecommitdiffstats
path: root/test/com/jogamp/opencl/CLImageTest.java
blob: dc80b9e104be9daeaf43fae7806754fc421afe6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package com.jogamp.opencl;


import java.awt.image.BufferedImage;
import java.io.IOException;
import java.nio.IntBuffer;
import javax.imageio.ImageIO;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import static java.lang.System.*;
import static com.jogamp.common.nio.Buffers.*;
import static com.jogamp.opencl.CLImageFormat.ChannelOrder.*;
import static com.jogamp.opencl.CLImageFormat.ChannelType.*;

/**
 * Test testing CLImage API.
 * @author Michael Bien
 */
public class CLImageTest {

    private static int[] pixels;

    @BeforeClass
    public static void init() throws IOException {
        BufferedImage bi = ImageIO.read(CLImageTest.class.getResourceAsStream("jogamp.png"));
        pixels = new int[128*128*4];
        bi.getData().getPixels(0, 0, 128, 128, pixels);
    }

    public CLDevice getCompatibleDevice() {

        CLPlatform[] platforms = CLPlatform.listCLPlatforms();
        for (CLPlatform platform : platforms) {
            CLDevice[] devices = platform.listCLDevices();

            for (CLDevice device : devices) {
                if(device.isImageSupportAvailable()) {
                    return device;
                }
            }
        }

        return null;
    }


    @Test
    public void supportedImageFormatsTest() {
        CLDevice device = getCompatibleDevice();
        if(device == null) {
            out.println("WARNING: can not test image api.");
            return;
        }
        CLContext context = CLContext.create(device);

        try{
            CLImageFormat[] formats = context.getSupportedImage2dFormats();
            assertTrue(formats.length > 0);
            out.println("sample image format: "+formats[0]);
//            for (CLImageFormat format : formats) {
//                out.println(format);
//            }
        }finally{
            context.release();
        }

    }
    
    @Test
    public void image2dCopyTest() throws IOException {

        CLDevice device = getCompatibleDevice();
        if(device == null) {
            out.println("WARNING: can not test image api.");
            return;
        }
        CLContext context = CLContext.create(device);

        CLCommandQueue queue = device.createCommandQueue();

        try{

            CLImageFormat format = new CLImageFormat(RGBA, UNSIGNED_INT32);
            
            CLImage2d<IntBuffer> imageA = context.createImage2d(newDirectIntBuffer(pixels), 128, 128, format);
            CLImage2d<IntBuffer> imageB = context.createImage2d(newDirectIntBuffer(pixels.length), 128, 128, format);

            queue.putWriteImage(imageA, false)
                 .putCopyImage(imageA, imageB)
                 .putReadImage(imageB, true);
            
            IntBuffer bufferA = imageA.getBuffer();
            IntBuffer bufferB = imageB.getBuffer();

            while(bufferA.hasRemaining()) {
                assertEquals(bufferA.get(), bufferB.get());
            }

        }finally{
            context.release();
        }

    }

    @Test
    public void image2dKernelCopyTest() throws IOException {

        CLDevice device = getCompatibleDevice();
        if(device == null) {
            out.println("WARNING: can not test image api.");
            return;
        }
        CLContext context = CLContext.create(device);

        String src =
        "constant sampler_t imageSampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; \n" +
        "kernel void image2dCopy(read_only image2d_t input, write_only image2d_t output) { \n" +
        "    int2 coord = (int2)(get_global_id(0), get_global_id(1)); \n" +
        "    uint4 temp = read_imageui(input, imageSampler, coord); \n" +
        "    write_imageui(output, coord, temp); \n" +
        "} \n";

        CLKernel kernel = context.createProgram(src).build().createCLKernel("image2dCopy");

        CLCommandQueue queue = device.createCommandQueue();

        try{

            CLImageFormat format = new CLImageFormat(RGBA, UNSIGNED_INT32);

            CLImage2d<IntBuffer> imageA = context.createImage2d(newDirectIntBuffer(pixels), 128, 128, format);
            CLImage2d<IntBuffer> imageB = context.createImage2d(newDirectIntBuffer(pixels.length), 128, 128, format);

            kernel.putArgs(imageA, imageB);
            queue.putWriteImage(imageA, false)
                 .put2DRangeKernel(kernel, 0, 0, 128, 128, 0, 0)
                 .putReadImage(imageB, true);

            IntBuffer bufferA = imageA.getBuffer();
            IntBuffer bufferB = imageB.getBuffer();

            while(bufferA.hasRemaining()) {
                assertEquals(bufferA.get(), bufferB.get());
            }

        }finally{
            context.release();
        }

    }

}