对于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。
答案 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类中。