如何创建CL GL互操作上下文?

时间:2018-03-26 03:32:05

标签: java opengl opencl lwjgl jocl

对于openGL我使用lwjgl而对于openCL我使用jocl。

我的显卡rx550。

os win10pro。

这是我的GL Init方法,我先运行它。

static long window;

static void initGL(){
    if(glfwInit()!=true){
        System.err.println("INIT_GLFW_FAILED");
        System.exit(1);
    }

    window=glfwCreateWindow( w, h, "test", 0, 0);
    glfwShowWindow(window);
    glfwMakeContextCurrent(window);
    GL.createCapabilities();

    glViewport(0, 0, w, h);
    glOrtho(0, w, h, 0, -1, 1);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_TEXTURE_3D);

}

这是我的CL init方法,我先运行它。

static void initCL(){
    CL.setExceptionsEnabled(true);

    int numPlatformsArray[] = new int[1];
    clGetPlatformIDs(0, null, numPlatformsArray);
    numPlatforms=numPlatformsArray[0];

    cl_platform_id platforms[] = new cl_platform_id[numPlatforms];
    clGetPlatformIDs(platforms.length, platforms, null);
    cl_platform_id platform = platforms[platformIndex];

    int numDevicesArray[] = new int[1];
    clGetDeviceIDs(platform, deviceType, 0, null, numDevicesArray);
    numDevices = numDevicesArray[0];

    cl_device_id devices[] = new cl_device_id[numDevices];
    clGetDeviceIDs(platform, deviceType, numDevices, devices, null);
    device = devices[deviceIndex];


    cl_context_properties contextProperties = new cl_context_properties();
    contextProperties.addProperty(CL_GL_CONTEXT_KHR, 
    glfwGetCurrentContext());//wglGetCurrentContext()
    contextProperties.addProperty(CL_WGL_HDC_KHR, wglGetCurrentDC());
    contextProperties.addProperty(CL_CONTEXT_PLATFORM, platform);

    context = clCreateContextFromType(contextProperties, CL_DEVICE_TYPE_GPU, 
    null, null, null);

    commandQueue = clCreateCommandQueue(context, device, 0, null);

    mprogram = clCreateProgramWithSource(context,1, new String[]{ program }, null, null);

    clBuildProgram(mprogram, numDevices, devices, null, null, null);

    mkernel = clCreateKernel(mprogram, "sampleKernel", null);

    System.out.println("CLinit done");
}

在这部分他说CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR。

context = clCreateContextFromType(contextProperties, CL_DEVICE_TYPE_GPU, null, null, null);

我尝试将glfwGetCurrentContext()更改为wglGetCurrentContext()和窗口,但他又说了一遍。

但如果我删除这一行

contextProperties.addProperty(CL_WGL_HDC_KHR, wglGetCurrentDC());

他跑得很好,但是如果我试着把texture3d

clCreateFromGLTexture3D(context, CL_MEM_READ_ONLY, GL_TEXTURE_3D, 0, GL_TEXTURE_3D, null);

他说CL_INVALID_CONTEXT。

1 个答案:

答案 0 :(得分:0)

由于您正在使用GLFW进行窗口/ WGL上下文创建,因此您应确保使用GLFW的本机包装器来处理您的WGL上下文:

http://www.glfw.org/docs/latest/group__native.html

尝试设置

contextProperties.addProperty(CL_WGL_HDC_KHR, wglGetCurrentDC());

contextProperties.addProperty(CL_WGL_HDC_KHR, glfwGetWGLContext(window));

还要确保在使用时上下文始终是最新的。

glfwGetWGLContext位于GLFWNativeWGL类中。