提交 e26b7a57 编写于 作者: S serb

8146238: [macosx] Java2D Queue Flusher crash on OSX after switching between user accounts

Reviewed-by: prr, avu
上级 05aca2da
/* /*
* Copyright (c) 2011, 2013, 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -48,8 +48,9 @@ public abstract class CGLSurfaceData extends OGLSurfaceData { ...@@ -48,8 +48,9 @@ public abstract class CGLSurfaceData extends OGLSurfaceData {
native void validate(int xoff, int yoff, int width, int height, boolean isOpaque); native void validate(int xoff, int yoff, int width, int height, boolean isOpaque);
private native void initOps(long pConfigInfo, long pPeerData, long layerPtr, private native void initOps(OGLGraphicsConfig gc, long pConfigInfo,
int xoff, int yoff, boolean isOpaque); long pPeerData, long layerPtr, int xoff,
int yoff, boolean isOpaque);
protected native boolean initPbuffer(long pData, long pConfigInfo, protected native boolean initPbuffer(long pData, long pConfigInfo,
boolean isOpaque, int width, int height); boolean isOpaque, int width, int height);
...@@ -77,7 +78,7 @@ public abstract class CGLSurfaceData extends OGLSurfaceData { ...@@ -77,7 +78,7 @@ public abstract class CGLSurfaceData extends OGLSurfaceData {
pPeerData = pView.getAWTView(); pPeerData = pView.getAWTView();
isOpaque = pView.isOpaque(); isOpaque = pView.isOpaque();
} }
initOps(pConfigInfo, pPeerData, 0, 0, 0, isOpaque); initOps(gc, pConfigInfo, pPeerData, 0, 0, 0, isOpaque);
} }
protected CGLSurfaceData(CGLLayer layer, CGLGraphicsConfig gc, protected CGLSurfaceData(CGLLayer layer, CGLGraphicsConfig gc,
...@@ -93,7 +94,7 @@ public abstract class CGLSurfaceData extends OGLSurfaceData { ...@@ -93,7 +94,7 @@ public abstract class CGLSurfaceData extends OGLSurfaceData {
layerPtr = layer.getPointer(); layerPtr = layer.getPointer();
isOpaque = layer.isOpaque(); isOpaque = layer.isOpaque();
} }
initOps(pConfigInfo, 0, layerPtr, 0, 0, isOpaque); initOps(gc, pConfigInfo, 0, layerPtr, 0, 0, isOpaque);
} }
@Override //SurfaceData @Override //SurfaceData
......
...@@ -144,31 +144,6 @@ JNF_COCOA_ENTER(env); ...@@ -144,31 +144,6 @@ JNF_COCOA_ENTER(env);
JNF_COCOA_EXIT(env); JNF_COCOA_EXIT(env);
} }
/**
* 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 * Makes the given GraphicsConfig's context current to its associated
* "scratch" surface. If there is a problem making the context current, * "scratch" surface. If there is a problem making the context current,
...@@ -411,7 +386,7 @@ extern DisposeFunc OGLSD_Dispose; ...@@ -411,7 +386,7 @@ extern DisposeFunc OGLSD_Dispose;
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_sun_java2d_opengl_CGLSurfaceData_initOps Java_sun_java2d_opengl_CGLSurfaceData_initOps
(JNIEnv *env, jobject cglsd, (JNIEnv *env, jobject cglsd, jobject gc,
jlong pConfigInfo, jlong pPeerData, jlong layerPtr, jlong pConfigInfo, jlong pPeerData, jlong layerPtr,
jint xoff, jint yoff, jboolean isOpaque) jint xoff, jint yoff, jboolean isOpaque)
{ {
...@@ -419,8 +394,22 @@ Java_sun_java2d_opengl_CGLSurfaceData_initOps ...@@ -419,8 +394,22 @@ Java_sun_java2d_opengl_CGLSurfaceData_initOps
J2dTraceLn1(J2D_TRACE_INFO, " pPeerData=%p", jlong_to_ptr(pPeerData)); J2dTraceLn1(J2D_TRACE_INFO, " pPeerData=%p", jlong_to_ptr(pPeerData));
J2dTraceLn2(J2D_TRACE_INFO, " xoff=%d, yoff=%d", (int)xoff, (int)yoff); 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 *) OGLSDOps *oglsdo = (OGLSDOps *)
SurfaceData_InitOps(env, cglsd, sizeof(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)); CGLSDOps *cglsdo = (CGLSDOps *)malloc(sizeof(CGLSDOps));
if (cglsdo == NULL) { if (cglsdo == NULL) {
JNU_ThrowOutOfMemoryError(env, "creating native cgl ops"); JNU_ThrowOutOfMemoryError(env, "creating native cgl ops");
......
...@@ -27,6 +27,7 @@ package sun.java2d.opengl; ...@@ -27,6 +27,7 @@ package sun.java2d.opengl;
import java.awt.AlphaComposite; import java.awt.AlphaComposite;
import java.awt.Composite; import java.awt.Composite;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment; import java.awt.GraphicsEnvironment;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.Transparency; import java.awt.Transparency;
...@@ -598,16 +599,16 @@ public abstract class OGLSurfaceData extends SurfaceData ...@@ -598,16 +599,16 @@ public abstract class OGLSurfaceData extends SurfaceData
* (referenced by the pData parameter). This method is invoked from * (referenced by the pData parameter). This method is invoked from
* the native Dispose() method from the Disposer thread when the * the native Dispose() method from the Disposer thread when the
* Java-level OGLSurfaceData object is about to go away. Note that we * Java-level OGLSurfaceData object is about to go away. Note that we
* also pass a reference to the native GLX/WGLGraphicsConfigInfo * also pass a reference to the OGLGraphicsConfig
* (pConfigInfo) for the purposes of making a context current. * 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(); OGLRenderQueue rq = OGLRenderQueue.getInstance();
rq.lock(); rq.lock();
try { try {
// make sure we have a current context before // make sure we have a current context before
// disposing the native resources (e.g. texture object) // disposing the native resources (e.g. texture object)
OGLContext.setScratchSurface(pConfigInfo); OGLContext.setScratchSurface(gc);
RenderBuffer buf = rq.getBuffer(); RenderBuffer buf = rq.getBuffer();
rq.ensureCapacityAndAlignment(12, 4); rq.ensureCapacityAndAlignment(12, 4);
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
* The following methods are implemented in the windowing system (i.e. GLX * The following methods are implemented in the windowing system (i.e. GLX
* and WGL) source files. * and WGL) source files.
*/ */
extern jlong OGLSD_GetNativeConfigInfo(OGLSDOps *oglsdo);
extern jboolean OGLSD_InitOGLWindow(JNIEnv *env, OGLSDOps *oglsdo); extern jboolean OGLSD_InitOGLWindow(JNIEnv *env, OGLSDOps *oglsdo);
extern void OGLSD_DestroyOGLSurface(JNIEnv *env, OGLSDOps *oglsdo); extern void OGLSD_DestroyOGLSurface(JNIEnv *env, OGLSDOps *oglsdo);
...@@ -593,11 +592,14 @@ void ...@@ -593,11 +592,14 @@ void
OGLSD_Dispose(JNIEnv *env, SurfaceDataOps *ops) OGLSD_Dispose(JNIEnv *env, SurfaceDataOps *ops)
{ {
OGLSDOps *oglsdo = (OGLSDOps *)ops; OGLSDOps *oglsdo = (OGLSDOps *)ops;
jlong pConfigInfo = OGLSD_GetNativeConfigInfo(oglsdo); jobject graphicsConfig = oglsdo->graphicsConfig;
JNU_CallStaticMethodByName(env, NULL, "sun/java2d/opengl/OGLSurfaceData", JNU_CallStaticMethodByName(env, NULL, "sun/java2d/opengl/OGLSurfaceData",
"dispose", "(JJ)V", "dispose",
ptr_to_jlong(ops), pConfigInfo); "(JLsun/java2d/opengl/OGLGraphicsConfig;)V",
ptr_to_jlong(ops), graphicsConfig);
(*env)->DeleteGlobalRef(env, graphicsConfig);
oglsdo->graphicsConfig = NULL;
} }
/** /**
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -85,6 +85,9 @@ typedef struct { ...@@ -85,6 +85,9 @@ typedef struct {
* Pointer to native-specific (GLX, WGL, etc.) SurfaceData info, such as the * Pointer to native-specific (GLX, WGL, etc.) SurfaceData info, such as the
* native Drawable handle and GraphicsConfig data. * native Drawable handle and GraphicsConfig data.
* *
* jobject graphicsConfig;;
* Strong reference to the OGLGraphicsConfig used by this OGLSurfaceData.
*
* jint drawableType; * jint drawableType;
* The surface type; can be any one of the surface type constants defined * The surface type; can be any one of the surface type constants defined
* below (OGLSD_WINDOW, OGLSD_TEXTURE, etc). * below (OGLSD_WINDOW, OGLSD_TEXTURE, etc).
...@@ -162,6 +165,7 @@ typedef struct { ...@@ -162,6 +165,7 @@ typedef struct {
struct _OGLSDOps { struct _OGLSDOps {
SurfaceDataOps sdOps; SurfaceDataOps sdOps;
void *privOps; void *privOps;
jobject graphicsConfig;
jint drawableType; jint drawableType;
GLenum activeBuffer; GLenum activeBuffer;
jboolean isOpaque; jboolean isOpaque;
......
...@@ -41,7 +41,8 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { ...@@ -41,7 +41,8 @@ public abstract class GLXSurfaceData extends OGLSurfaceData {
protected X11ComponentPeer peer; protected X11ComponentPeer peer;
private GLXGraphicsConfig graphicsConfig; private GLXGraphicsConfig graphicsConfig;
private native void initOps(X11ComponentPeer peer, long aData); private native void initOps(OGLGraphicsConfig gc, X11ComponentPeer peer,
long aData);
protected native boolean initPbuffer(long pData, long pConfigInfo, protected native boolean initPbuffer(long pData, long pConfigInfo,
boolean isOpaque, boolean isOpaque,
int width, int height); int width, int height);
...@@ -52,7 +53,7 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { ...@@ -52,7 +53,7 @@ public abstract class GLXSurfaceData extends OGLSurfaceData {
super(gc, cm, type); super(gc, cm, type);
this.peer = peer; this.peer = peer;
this.graphicsConfig = gc; this.graphicsConfig = gc;
initOps(peer, graphicsConfig.getAData()); initOps(gc, peer, graphicsConfig.getAData());
} }
public GraphicsConfiguration getDeviceConfiguration() { public GraphicsConfiguration getDeviceConfiguration() {
......
/* /*
* Copyright (c) 2003, 2013, 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -54,23 +54,32 @@ jboolean surfaceCreationFailed = JNI_FALSE; ...@@ -54,23 +54,32 @@ jboolean surfaceCreationFailed = JNI_FALSE;
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_sun_java2d_opengl_GLXSurfaceData_initOps(JNIEnv *env, jobject glxsd, Java_sun_java2d_opengl_GLXSurfaceData_initOps(JNIEnv *env, jobject glxsd,
jobject gc,
jobject peer, jlong aData) jobject peer, jlong aData)
{ {
#ifndef HEADLESS #ifndef HEADLESS
GLXSDOps *glxsdo = (GLXSDOps *)malloc(sizeof(GLXSDOps)); gc = (*env)->NewGlobalRef(env, gc);
if (gc == NULL) {
if (glxsdo == NULL) { JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed.");
JNU_ThrowOutOfMemoryError(env, "creating native GLX ops");
return; return;
} }
OGLSDOps *oglsdo = (OGLSDOps *)SurfaceData_InitOps(env, glxsd, OGLSDOps *oglsdo = (OGLSDOps *)SurfaceData_InitOps(env, glxsd,
sizeof(OGLSDOps)); sizeof(OGLSDOps));
if (oglsdo == NULL) { if (oglsdo == NULL) {
free(glxsdo); (*env)->DeleteGlobalRef(env, gc);
JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed."); JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed.");
return; 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"); J2dTraceLn(J2D_TRACE_INFO, "GLXSurfaceData_initOps");
...@@ -164,39 +173,6 @@ GLXSD_MakeCurrentToScratch(JNIEnv *env, OGLContext *oglc) ...@@ -164,39 +173,6 @@ GLXSD_MakeCurrentToScratch(JNIEnv *env, OGLContext *oglc)
return JNI_TRUE; return JNI_TRUE;
} }
/**
* 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 * Makes the given GraphicsConfig's context current to its associated
* "scratch" surface. If there is a problem making the context current, * "scratch" surface. If there is a problem making the context current,
......
...@@ -41,8 +41,8 @@ public abstract class WGLSurfaceData extends OGLSurfaceData { ...@@ -41,8 +41,8 @@ public abstract class WGLSurfaceData extends OGLSurfaceData {
protected WComponentPeer peer; protected WComponentPeer peer;
private WGLGraphicsConfig graphicsConfig; private WGLGraphicsConfig graphicsConfig;
private native void initOps(long pConfigInfo, WComponentPeer peer, private native void initOps(OGLGraphicsConfig gc, long pConfigInfo,
long hwnd); WComponentPeer peer, long hwnd);
protected native boolean initPbuffer(long pData, long pConfigInfo, protected native boolean initPbuffer(long pData, long pConfigInfo,
boolean isOpaque, boolean isOpaque,
int width, int height); int width, int height);
...@@ -57,7 +57,7 @@ public abstract class WGLSurfaceData extends OGLSurfaceData { ...@@ -57,7 +57,7 @@ public abstract class WGLSurfaceData extends OGLSurfaceData {
long pConfigInfo = gc.getNativeConfigInfo(); long pConfigInfo = gc.getNativeConfigInfo();
long hwnd = peer != null ? peer.getHWnd() : 0L; long hwnd = peer != null ? peer.getHWnd() : 0L;
initOps(pConfigInfo, peer, hwnd); initOps(gc, pConfigInfo, peer, hwnd);
} }
public GraphicsConfiguration getDeviceConfiguration() { public GraphicsConfiguration getDeviceConfiguration() {
......
/* /*
* Copyright (c) 2004, 2013, 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -58,12 +58,29 @@ extern void ...@@ -58,12 +58,29 @@ extern void
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_sun_java2d_opengl_WGLSurfaceData_initOps(JNIEnv *env, jobject wglsd, Java_sun_java2d_opengl_WGLSurfaceData_initOps(JNIEnv *env, jobject wglsd,
jlong pConfigInfo, jobject gc, jlong pConfigInfo,
jobject peer, jlong hwnd) jobject peer, jlong hwnd)
{ {
OGLSDOps *oglsdo = (OGLSDOps *)SurfaceData_InitOps(env, wglsd, OGLSDOps *oglsdo;
WGLSDOps *wglsdo;
gc = (*env)->NewGlobalRef(env, gc);
if (gc == NULL) {
JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed.");
return;
}
oglsdo = (OGLSDOps *)SurfaceData_InitOps(env, wglsd,
sizeof(OGLSDOps)); sizeof(OGLSDOps));
WGLSDOps *wglsdo = (WGLSDOps *)malloc(sizeof(WGLSDOps)); 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;
wglsdo = (WGLSDOps *)malloc(sizeof(WGLSDOps));
J2dTraceLn(J2D_TRACE_INFO, "WGLSurfaceData_initOps"); J2dTraceLn(J2D_TRACE_INFO, "WGLSurfaceData_initOps");
...@@ -159,33 +176,6 @@ WGLSD_MakeCurrentToScratch(JNIEnv *env, OGLContext *oglc) ...@@ -159,33 +176,6 @@ WGLSD_MakeCurrentToScratch(JNIEnv *env, OGLContext *oglc)
return JNI_TRUE; return JNI_TRUE;
} }
/**
* 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 * Makes the given GraphicsConfig's context current to its associated
* "scratch" surface. If there is a problem making the context current, * "scratch" surface. If there is a problem making the context current,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册