Hi I'm trying to share a GLTexture with OpenCL (I have LWJGL debug mode on), I'm following this:
https://software.intel.com/en-us/articles/opencl-and-opengl-interoperability-tutorial (Method 1: Texture Sharing via clCreateFromGLTexture) I added the JVM log file
This line crashes the JVM:
long mem = CL10GL.clCreateFromGLTexture2D(context, flags, GL11.GL_TEXTURE_2D, 0, texture, errorBuffer);
It's the same with this:
long mem = CL12GL.clCreateFromGLTexture(context, flags, GL11.GL_TEXTURE_2D, 0, texture, errorBuffer);
This is the console output:
11:39:48 PM: Executing external task 'debug -Plwjgl.debug=true'...
:debugSetup UP-TO-DATE
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
23:39:48.958 [main] INFO c.b.m.Hatch - 3.0.0b SNAPSHOT
[LWJGL] Version: 3.0.0b SNAPSHOT
[LWJGL] OS: Windows 8.1 v6.3
[LWJGL] JRE: 1.8.0_31 amd64
[LWJGL] JVM: Java HotSpot(TM) 64-Bit Server VM v25.31-b07 by Oracle Corporation
[LWJGL] Loaded library from org.lwjgl.librarypath: lwjgl
[LWJGL] MemoryUtil accessor: MemoryAccessorUnsafe
[LWJGL] Loaded native library: D:\Development\Projects\gamy\Java\JGame\natives\jemalloc.dll
[LWJGL] MemoryUtil allocator: JEmallocAllocator
[LWJGL] Loaded native library: D:\Development\Projects\gamy\Java\JGame\natives\glfw.dll
23:39:49.021 [main] INFO c.b.m.u.OpenGLHandler - Using display: DELL S2340L(Hdmi) 1920x1080 R8 G8 B8 Hz60
[LWJGL] Loaded native library: C:\Windows\system32\opengl32.dll
[LWJGL] Failed to locate address for GL function glNamedBufferPageCommitmentARB
[LWJGL] Failed to locate address for GL function glVertexWeighthNV
[LWJGL] Failed to locate address for GL function glVertexWeighthvNV
[LWJGL] Failed to locate address for GL function wglCopyImageSubDataNV
[LWJGL] [GL] WGL_NV_copy_image was reported as available but an entry point is missing.
[LWJGL] Loaded native library: C:\Windows\system32\OpenCL.dll
23:39:50.235 [main] INFO c.b.m.u.OpenCLHandler - There are 1 OpenCL platforms available
23:39:50.237 [main] INFO c.b.m.u.OpenCLHandler - Sharing is caring ^^
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffcc13e814e, pid=13988, tid=8876
#
# JRE version: Java(TM) SE Runtime Environment (8.0_31-b13) (build 1.8.0_31-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.31-b07 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C [nvopencl.dll+0x814e]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\Development\Projects\gamy\Java\JGame\hs_err_pid13988.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
:run FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':run'.
> Process 'command 'C:\Program Files\Java\jdk1.8.0_31\bin\java.exe'' finished with non-zero exit value -805306369
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 8.819 secs
Process 'command 'C:\Program Files\Java\jdk1.8.0_31\bin\java.exe'' finished with non-zero exit value -805306369
11:39:57 PM: External task execution finished 'debug -Plwjgl.debug=true'.
this is what I'm using to generate the texture:
public int genTexture(final int width, final int height) {
int textureId = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureId);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, width, height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer)null);
return textureId;
}
This is how I'm initializing OpenCL (prints the sharing is caring message):
public void init() {
logger.info("There are {} OpenCL platforms available", CLPlatform.getPlatforms().size());
platform = CLPlatform.getPlatforms(new Filter<CLPlatform>() {
@Override
public boolean accept(CLPlatform object) {
return object.getCapabilities().cl_khr_gl_sharing;
}
}).get(GameData.getSetting("clPlatform", 0));
ArrayList<CLDevice> devices = (ArrayList<CLDevice>) platform.getDevices(CL10.CL_DEVICE_TYPE_GPU);
if (devices.size() < 1) {
devices = (ArrayList<CLDevice>) platform.getDevices(CL10.CL_DEVICE_TYPE_DEFAULT);
if (devices.size() < 1) {
devices = (ArrayList<CLDevice>) platform.getDevices(CL10.CL_DEVICE_TYPE_ALL);
}
}
int dev = GameData.getSetting("clDevice", -1);
if (dev > 0) {
device = devices.get(dev);
if(device != null) {
if (supportsSharing()) {
logger.info("Sharing is caring ^^");
} else {
logger.info("We're just a little shellfish");
}
}
} else {
for (int i = 0; i < devices.size(); i++) {
if (devices.get(i).getCapabilities().cl_khr_gl_sharing || devices.get(i).getCapabilities().cl_APPLE_gl_sharing) {
logger.info("Sharing is caring ^^");
device = devices.get(i);
break;
}
}
}
if(device == null) {
devices.get(0);
}
PointerBuffer buffer = BufferUtils.createPointerBuffer(3);
buffer.put(CL10.CL_CONTEXT_PLATFORM).put(platform).put(0).flip();
context = CL10.clCreateContext(buffer, device.address(), CREATE_CONTEXT_CALLBACK, MemoryUtil.NULL, errorBuffer);
CLUtil.checkCLError(errorBuffer.get(0));
queue = CL10.clCreateCommandQueue(context, device.address(), CL10.CL_QUEUE_PROFILING_ENABLE, errorBuffer);
CLUtil.checkCLError(errorBuffer.get(0));
}