Я пытался создать контекст OpenCL, привязанный к контексту OpenGL. Мне не удалось найти подходящие значения для параметра properties
, необходимого для метода KHRGLSharing.clGetGLContextInfoKHR
для запроса доступных устройств. Контекст OpenGL создается с помощью GLFW, и окно, с которым я хочу работать, является текущим контекстом (устанавливается с помощью glfwMakeContextCurrent
)
Следующий фрагмент кода показывает, что я придумал до сих пор:
public static List<Long> queryDevicesForPlatform(long platform) {
stack.push(); // MemoryStack defined elsewhere
//Create properties
//Problematic piece of code
long[] properties = switch (Platform.get()) {
//These parameters let the JVM crash when clGetGLContextInfoKHR is called
case LINUX -> new long[]{
CL_CONTEXT_PLATFORM, platform,
CL_GL_CONTEXT_KHR, GLX14.glXGetCurrentContext(),
CL_GLX_DISPLAY_KHR, GLX14.glXGetCurrentDisplay(),
0
};
//Not yet tested
case MACOSX -> new long[]{
CL_CONTEXT_PLATFORM, platform,
CL_CGL_SHAREGROUP_KHR, CGL.CGLGetShareGroup(CGL.CGLGetCurrentContext()),
0
};
//This one works
case WINDOWS -> new long[]{
CL_CONTEXT_PLATFORM, platform,
CL_GL_CONTEXT_KHR, glfwGetCurrentContext(),
CL_WGL_HDC_KHR, wglGetCurrentDC(),
0
};
};
//Copy properties to a buffer
ByteBuffer byteProp = stack.malloc(properties.length * Long.BYTES);
byteProp.asLongBuffer().put(properties);
ByteBuffer bytes = stack.malloc(Long.BYTES);
//JVM crashes here
int error = KHRGLSharing.clGetGLContextInfoKHR(PointerBuffer.create(byteProp),
CL_DEVICES_FOR_GL_CONTEXT_KHR, (ByteBuffer) null, PointerBuffer.create(bytes));
assert error == CL22.CL_SUCCESS: error;
ByteBuffer value = stack.malloc((int) bytes.asLongBuffer().get(0));
error = KHRGLSharing.clGetGLContextInfoKHR(PointerBuffer.create(byteProp), CL_DEVICES_FOR_GL_CONTEXT_KHR, value, null);
assert error == CL22.CL_SUCCESS: error;
LongBuffer devices = value.asLongBuffer();
ArrayList<Long> ret = new ArrayList<>();
while(devices.hasRemaining()) {
ret.add(devices.get());
}
stack.pop();
return ret;
}
Linux: я не знаю, какие значения передавать для CL_CONTEXT_PLATFORM
, CL_GL_CONTEXT_KHR
и CL_GLX_DISPLAY_KHR
. Текущий сбой JVM с SIGSEGV
.
Windows: код работает, но я не уверен, что это правильный способ сделать это.
Apple: У меня нет машины для тестирования, но я был бы признателен, если бы я знал правильные параметры и там.
Драйверы Intel для Linux не поддерживают взаимодействие CL-GL (в нем отсутствует расширение cl_khr_gl_sharing
).
Фрагмент кода должен работать в Linux, если драйвер поддерживает взаимодействие CL-GL.