--- old/src/java.desktop/macosx/classes/sun/java2d/opengl/CGLSurfaceData.java 2019-08-12 02:23:10.000000000 -0700 +++ new/src/java.desktop/macosx/classes/sun/java2d/opengl/CGLSurfaceData.java 2019-08-12 02:23:09.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,8 +48,9 @@ native void validate(int xoff, int yoff, int width, int height, boolean isOpaque); - private native void initOps(long pConfigInfo, long pPeerData, long layerPtr, - int xoff, int yoff, boolean isOpaque); + private native void initOps(OGLGraphicsConfig gc, long pConfigInfo, + long pPeerData, long layerPtr, int xoff, + int yoff, boolean isOpaque); protected CGLSurfaceData(CGLGraphicsConfig gc, ColorModel cm, int type, int width, int height) { @@ -74,7 +75,7 @@ pPeerData = pView.getAWTView(); isOpaque = pView.isOpaque(); } - initOps(pConfigInfo, pPeerData, 0, 0, 0, isOpaque); + initOps(gc, pConfigInfo, pPeerData, 0, 0, 0, isOpaque); } protected CGLSurfaceData(CGLLayer layer, CGLGraphicsConfig gc, @@ -90,7 +91,7 @@ layerPtr = layer.getPointer(); isOpaque = layer.isOpaque(); } - initOps(pConfigInfo, 0, layerPtr, 0, 0, isOpaque); + initOps(gc, pConfigInfo, 0, layerPtr, 0, 0, isOpaque); } @Override //SurfaceData --- old/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLSurfaceData.m 2019-08-12 02:23:10.000000000 -0700 +++ new/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLSurfaceData.m 2019-08-12 02:23:10.000000000 -0700 @@ -131,31 +131,6 @@ } /** - * Returns a pointer (as a jlong) to the native CGLGraphicsConfigInfo - * associated with the given OGLSDOps. This method can be called from - * shared code to retrieve the native GraphicsConfig data in a platform- - * independent manner. - */ -jlong -OGLSD_GetNativeConfigInfo(OGLSDOps *oglsdo) -{ - J2dTraceLn(J2D_TRACE_INFO, "OGLSD_GetNativeConfigInfo"); - - if (oglsdo == NULL) { - J2dRlsTraceLn(J2D_TRACE_ERROR, "OGLSD_GetNativeConfigInfo: ops are null"); - return 0L; - } - - CGLSDOps *cglsdo = (CGLSDOps *)oglsdo->privOps; - if (cglsdo == NULL) { - J2dRlsTraceLn(J2D_TRACE_ERROR, "OGLSD_GetNativeConfigInfo: cgl ops are null"); - return 0L; - } - - return ptr_to_jlong(cglsdo->configInfo); -} - -/** * Makes the given GraphicsConfig's context current to its associated * "scratch" surface. If there is a problem making the context current, * this method will return NULL; otherwise, returns a pointer to the @@ -359,7 +334,7 @@ JNIEXPORT void JNICALL Java_sun_java2d_opengl_CGLSurfaceData_initOps - (JNIEnv *env, jobject cglsd, + (JNIEnv *env, jobject cglsd, jobject gc, jlong pConfigInfo, jlong pPeerData, jlong layerPtr, jint xoff, jint yoff, jboolean isOpaque) { @@ -367,8 +342,22 @@ J2dTraceLn1(J2D_TRACE_INFO, " pPeerData=%p", jlong_to_ptr(pPeerData)); J2dTraceLn2(J2D_TRACE_INFO, " xoff=%d, yoff=%d", (int)xoff, (int)yoff); + gc = (*env)->NewGlobalRef(env, gc); + if (gc == NULL) { + JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed."); + return; + } + OGLSDOps *oglsdo = (OGLSDOps *) SurfaceData_InitOps(env, cglsd, sizeof(OGLSDOps)); + if (oglsdo == NULL) { + (*env)->DeleteGlobalRef(env, gc); + JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed."); + return; + } + // later the graphicsConfig will be used for deallocation of oglsdo + oglsdo->graphicsConfig = gc; + CGLSDOps *cglsdo = (CGLSDOps *)malloc(sizeof(CGLSDOps)); if (cglsdo == NULL) { JNU_ThrowOutOfMemoryError(env, "creating native cgl ops"); --- old/src/java.desktop/share/classes/sun/java2d/opengl/OGLSurfaceData.java 2019-08-12 02:23:11.000000000 -0700 +++ new/src/java.desktop/share/classes/sun/java2d/opengl/OGLSurfaceData.java 2019-08-12 02:23:11.000000000 -0700 @@ -27,6 +27,7 @@ import java.awt.AlphaComposite; import java.awt.Composite; +import java.awt.GraphicsConfiguration; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Transparency; @@ -578,16 +579,16 @@ * (referenced by the pData parameter). This method is invoked from * the native Dispose() method from the Disposer thread when the * Java-level OGLSurfaceData object is about to go away. Note that we - * also pass a reference to the native GLX/WGLGraphicsConfigInfo - * (pConfigInfo) for the purposes of making a context current. + * also pass a reference to the OGLGraphicsConfig + * for the purposes of making a context current. */ - static void dispose(long pData, long pConfigInfo) { + static void dispose(long pData, OGLGraphicsConfig gc) { OGLRenderQueue rq = OGLRenderQueue.getInstance(); rq.lock(); try { // make sure we have a current context before // disposing the native resources (e.g. texture object) - OGLContext.setScratchSurface(pConfigInfo); + OGLContext.setScratchSurface(gc); RenderBuffer buf = rq.getBuffer(); rq.ensureCapacityAndAlignment(12, 4); --- old/src/java.desktop/share/native/common/java2d/opengl/OGLSurfaceData.c 2019-08-12 02:23:12.000000000 -0700 +++ new/src/java.desktop/share/native/common/java2d/opengl/OGLSurfaceData.c 2019-08-12 02:23:12.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,6 @@ * The following methods are implemented in the windowing system (i.e. GLX * and WGL) source files. */ -extern jlong OGLSD_GetNativeConfigInfo(OGLSDOps *oglsdo); extern jboolean OGLSD_InitOGLWindow(JNIEnv *env, OGLSDOps *oglsdo); extern void OGLSD_DestroyOGLSurface(JNIEnv *env, OGLSDOps *oglsdo); @@ -593,11 +592,14 @@ OGLSD_Dispose(JNIEnv *env, SurfaceDataOps *ops) { OGLSDOps *oglsdo = (OGLSDOps *)ops; - jlong pConfigInfo = OGLSD_GetNativeConfigInfo(oglsdo); + jobject graphicsConfig = oglsdo->graphicsConfig; JNU_CallStaticMethodByName(env, NULL, "sun/java2d/opengl/OGLSurfaceData", - "dispose", "(JJ)V", - ptr_to_jlong(ops), pConfigInfo); + "dispose", + "(JLsun/java2d/opengl/OGLGraphicsConfig;)V", + ptr_to_jlong(ops), graphicsConfig); + (*env)->DeleteGlobalRef(env, graphicsConfig); + oglsdo->graphicsConfig = NULL; } /** --- old/src/java.desktop/share/native/common/java2d/opengl/OGLSurfaceData.h 2019-08-12 02:23:13.000000000 -0700 +++ new/src/java.desktop/share/native/common/java2d/opengl/OGLSurfaceData.h 2019-08-12 02:23:13.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -85,6 +85,9 @@ * Pointer to native-specific (GLX, WGL, etc.) SurfaceData info, such as the * native Drawable handle and GraphicsConfig data. * + * jobject graphicsConfig;; + * Strong reference to the OGLGraphicsConfig used by this OGLSurfaceData. + * * jint drawableType; * The surface type; can be any one of the surface type constants defined * below (OGLSD_WINDOW, OGLSD_TEXTURE, etc). @@ -162,6 +165,7 @@ struct _OGLSDOps { SurfaceDataOps sdOps; void *privOps; + jobject graphicsConfig; jint drawableType; GLenum activeBuffer; jboolean isOpaque; --- old/src/java.desktop/unix/classes/sun/java2d/opengl/GLXSurfaceData.java 2019-08-12 02:23:14.000000000 -0700 +++ new/src/java.desktop/unix/classes/sun/java2d/opengl/GLXSurfaceData.java 2019-08-12 02:23:14.000000000 -0700 @@ -40,7 +40,8 @@ protected X11ComponentPeer peer; private GLXGraphicsConfig graphicsConfig; - private native void initOps(X11ComponentPeer peer, long aData); + private native void initOps(OGLGraphicsConfig gc, X11ComponentPeer peer, + long aData); protected GLXSurfaceData(X11ComponentPeer peer, GLXGraphicsConfig gc, ColorModel cm, int type) @@ -48,7 +49,7 @@ super(gc, cm, type); this.peer = peer; this.graphicsConfig = gc; - initOps(peer, graphicsConfig.getAData()); + initOps(gc, peer, graphicsConfig.getAData()); } public GraphicsConfiguration getDeviceConfiguration() { --- old/src/java.desktop/unix/native/common/java2d/opengl/GLXSurfaceData.c 2019-08-12 02:23:15.000000000 -0700 +++ new/src/java.desktop/unix/native/common/java2d/opengl/GLXSurfaceData.c 2019-08-12 02:23:14.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,23 +54,32 @@ JNIEXPORT void JNICALL Java_sun_java2d_opengl_GLXSurfaceData_initOps(JNIEnv *env, jobject glxsd, + jobject gc, jobject peer, jlong aData) { #ifndef HEADLESS - GLXSDOps *glxsdo = (GLXSDOps *)malloc(sizeof(GLXSDOps)); - - if (glxsdo == NULL) { - JNU_ThrowOutOfMemoryError(env, "creating native GLX ops"); + gc = (*env)->NewGlobalRef(env, gc); + if (gc == NULL) { + JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed."); return; } OGLSDOps *oglsdo = (OGLSDOps *)SurfaceData_InitOps(env, glxsd, sizeof(OGLSDOps)); if (oglsdo == NULL) { - free(glxsdo); + (*env)->DeleteGlobalRef(env, gc); JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed."); return; } + // later the graphicsConfig will be used for deallocation of oglsdo + oglsdo->graphicsConfig = gc; + + GLXSDOps *glxsdo = (GLXSDOps *)malloc(sizeof(GLXSDOps)); + + if (glxsdo == NULL) { + JNU_ThrowOutOfMemoryError(env, "creating native GLX ops"); + return; + } J2dTraceLn(J2D_TRACE_INFO, "GLXSurfaceData_initOps"); @@ -153,39 +162,6 @@ } /** - * Returns a pointer (as a jlong) to the native GLXGraphicsConfigInfo - * associated with the given OGLSDOps. This method can be called from - * shared code to retrieve the native GraphicsConfig data in a platform- - * independent manner. - */ -jlong -OGLSD_GetNativeConfigInfo(OGLSDOps *oglsdo) -{ - GLXSDOps *glxsdo; - - if (oglsdo == NULL) { - J2dRlsTraceLn(J2D_TRACE_ERROR, - "OGLSD_GetNativeConfigInfo: ops are null"); - return 0L; - } - - glxsdo = (GLXSDOps *)oglsdo->privOps; - if (glxsdo == NULL) { - J2dRlsTraceLn(J2D_TRACE_ERROR, - "OGLSD_GetNativeConfigInfo: glx ops are null"); - return 0L; - } - - if (glxsdo->configData == NULL) { - J2dRlsTraceLn(J2D_TRACE_ERROR, - "OGLSD_GetNativeConfigInfo: config data is null"); - return 0L; - } - - return ptr_to_jlong(glxsdo->configData->glxInfo); -} - -/** * Makes the given GraphicsConfig's context current to its associated * "scratch" surface. If there is a problem making the context current, * this method will return NULL; otherwise, returns a pointer to the --- old/src/java.desktop/windows/classes/sun/java2d/opengl/WGLSurfaceData.java 2019-08-12 02:23:15.000000000 -0700 +++ new/src/java.desktop/windows/classes/sun/java2d/opengl/WGLSurfaceData.java 2019-08-12 02:23:15.000000000 -0700 @@ -46,8 +46,8 @@ protected double scaleX = 1; protected double scaleY = 1; - private native void initOps(long pConfigInfo, WComponentPeer peer, - long hwnd); + private native void initOps(OGLGraphicsConfig gc, long pConfigInfo, + WComponentPeer peer, long hwnd); protected WGLSurfaceData(WComponentPeer peer, WGLGraphicsConfig gc, ColorModel cm, int type) @@ -62,7 +62,7 @@ long pConfigInfo = gc.getNativeConfigInfo(); long hwnd = peer != null ? peer.getHWnd() : 0L; - initOps(pConfigInfo, peer, hwnd); + initOps(gc, pConfigInfo, peer, hwnd); } @Override --- old/src/java.desktop/windows/native/libawt/java2d/opengl/WGLSurfaceData.c 2019-08-12 02:23:16.000000000 -0700 +++ new/src/java.desktop/windows/native/libawt/java2d/opengl/WGLSurfaceData.c 2019-08-12 02:23:16.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,11 +58,25 @@ JNIEXPORT void JNICALL Java_sun_java2d_opengl_WGLSurfaceData_initOps(JNIEnv *env, jobject wglsd, - jlong pConfigInfo, + jobject gc, jlong pConfigInfo, jobject peer, jlong hwnd) { + gc = (*env)->NewGlobalRef(env, gc); + if (gc == NULL) { + JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed."); + return; + } + OGLSDOps *oglsdo = (OGLSDOps *)SurfaceData_InitOps(env, wglsd, sizeof(OGLSDOps)); + if (oglsdo == NULL) { + (*env)->DeleteGlobalRef(env, gc); + JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed."); + return; + } + // later the graphicsConfig will be used for deallocation of oglsdo + oglsdo->graphicsConfig = gc; + WGLSDOps *wglsdo = (WGLSDOps *)malloc(sizeof(WGLSDOps)); J2dTraceLn(J2D_TRACE_INFO, "WGLSurfaceData_initOps"); @@ -145,33 +159,6 @@ } /** - * Returns a pointer (as a jlong) to the native WGLGraphicsConfigInfo - * associated with the given OGLSDOps. This method can be called from - * shared code to retrieve the native GraphicsConfig data in a platform- - * independent manner. - */ -jlong -OGLSD_GetNativeConfigInfo(OGLSDOps *oglsdo) -{ - WGLSDOps *wglsdo; - - if (oglsdo == NULL) { - J2dRlsTraceLn(J2D_TRACE_ERROR, - "OGLSD_GetNativeConfigInfo: ops are null"); - return 0L; - } - - wglsdo = (WGLSDOps *)oglsdo->privOps; - if (wglsdo == NULL) { - J2dRlsTraceLn(J2D_TRACE_ERROR, - "OGLSD_GetNativeConfigInfo: wgl ops are null"); - return 0L; - } - - return ptr_to_jlong(wglsdo->configInfo); -} - -/** * Makes the given GraphicsConfig's context current to its associated * "scratch" surface. If there is a problem making the context current, * this method will return NULL; otherwise, returns a pointer to the