JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreateWindow(JNIEnv *env, jclass clazz, jlong display, jint screen, jobject peer_info_handle, jobject mode, jint window_mode, jint x, jint y, jboolean undecorated, jlong parent_handle, jboolean resizable) { Display *disp = (Display *)(intptr_t)display; X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); GLXFBConfig *fb_config = NULL; if (peer_info->glx13) { fb_config = getFBConfigFromPeerInfo(env, peer_info); if (fb_config == NULL) return 0; } jclass cls_displayMode = (*env)->GetObjectClass(env, mode); jfieldID fid_width = (*env)->GetFieldID(env, cls_displayMode, "width", "I"); jfieldID fid_height = (*env)->GetFieldID(env, cls_displayMode, "height", "I"); int width = (*env)->GetIntField(env, mode, fid_width); int height = (*env)->GetIntField(env, mode, fid_height); Window win = createWindow(env, disp, screen, window_mode, peer_info, x, y, width, height, undecorated, parent_handle, resizable); if ((*env)->ExceptionOccurred(env)) { return 0; } if (peer_info->glx13) { glx_window = lwjgl_glXCreateWindow(disp, *fb_config, win, NULL); XFree(fb_config); } if (!checkXError(env, disp)) { lwjgl_glXDestroyWindow(disp, glx_window); destroyWindow(env, disp, win); } return win; }
static void createContextGLX13(JNIEnv *env, X11PeerInfo *peer_info, X11Context *context_info, jobject attribs, GLXContext shared_context) { GLXFBConfig *config = getFBConfigFromPeerInfo(env, peer_info); if (config == NULL) return; GLXContext context; if (attribs) { const int *attrib_list = (const int *)(*env)->GetDirectBufferAddress(env, attribs); context = lwjgl_glXCreateContextAttribsARB(peer_info->display, *config, shared_context, True, attrib_list); } else { int render_type; if (lwjgl_glXGetFBConfigAttrib(peer_info->display, *config, GLX_RENDER_TYPE, &render_type) != 0) { throwException(env, "Could not get GLX_RENDER_TYPE attribute"); return; } int context_render_type = (render_type & GLX_RGBA_FLOAT_BIT) != 0 ? GLX_RGBA_FLOAT_TYPE : GLX_RGBA_TYPE; context = lwjgl_glXCreateNewContext(peer_info->display, *config, context_render_type, shared_context, True); } XFree(config); if (!checkContext(env, peer_info->display, context)) return; context_info->context = context; }