8007386: On physical machine (video card is Intel Q45) the text is blank

Reviewed-by: prr, jchen
This commit is contained in:
Phil Race 2013-10-01 15:36:53 -07:00
parent b75899e391
commit 4ff41501d1
2 changed files with 43 additions and 5 deletions
jdk/src/solaris
classes/sun/awt
native/sun/java2d/x11

@ -96,6 +96,7 @@ public class X11GraphicsEnvironment
// Now check for XRender system property
boolean xRenderRequested = true;
boolean xRenderIgnoreLinuxVersion = false;
String xProp = System.getProperty("sun.java2d.xrender");
if (xProp != null) {
if (xProp.equals("false") || xProp.equals("f")) {
@ -104,6 +105,10 @@ public class X11GraphicsEnvironment
xRenderRequested = true;
xRenderVerbose = true;
}
if(xProp.equalsIgnoreCase("t") || xProp.equalsIgnoreCase("true")) {
xRenderIgnoreLinuxVersion = true;
}
}
// initialize the X11 display connection
@ -121,7 +126,7 @@ public class X11GraphicsEnvironment
// only attempt to initialize Xrender if it was requested
if (xRenderRequested) {
xRenderAvailable = initXRender(xRenderVerbose);
xRenderAvailable = initXRender(xRenderVerbose, xRenderIgnoreLinuxVersion);
if (xRenderVerbose && !xRenderAvailable) {
System.out.println(
"Could not enable XRender pipeline");
@ -159,7 +164,7 @@ public class X11GraphicsEnvironment
private static boolean xRenderVerbose;
private static boolean xRenderAvailable;
private static native boolean initXRender(boolean verbose);
private static native boolean initXRender(boolean verbose, boolean ignoreLinuxVersion);
public static boolean isXRenderAvailable() {
return xRenderAvailable;
}

@ -31,6 +31,10 @@
#include <X11/extensions/Xrender.h>
#ifdef __linux__
#include <sys/utsname.h>
#endif
/* On Solaris 10 updates 8, 9, the render.h file defines these
* protocol values but does not define the structs in Xrender.h.
* Thus in order to get these always defined on Solaris 10
@ -131,7 +135,7 @@ static
#define MAX_PAYLOAD (262140u - 36u)
#define MAXUINT (0xffffffffu)
static jboolean IsXRenderAvailable(jboolean verbose) {
static jboolean IsXRenderAvailable(jboolean verbose, jboolean ignoreLinuxVersion) {
void *xrenderlib;
@ -253,6 +257,31 @@ static jboolean IsXRenderAvailable(jboolean verbose) {
}
#endif
#ifdef __linux__
/*
* Check for Linux >= 3.5 (Ubuntu 12.04.02 LTS) to avoid hitting
* https://bugs.freedesktop.org/show_bug.cgi?id=48045
*/
struct utsname utsbuf;
if(uname(&utsbuf) >= 0) {
int major, minor, revision;
if(sscanf(utsbuf.release, "%i.%i.%i", &major, &minor, &revision) == 3) {
if(major < 3 || (major == 3 && minor < 5)) {
if(!ignoreLinuxVersion) {
available = JNI_FALSE;
}
else if(verbose) {
printf("WARNING: Linux < 3.5 detected.\n"
"The pipeline will be enabled, but graphical "
"artifacts can occur with old graphic drivers.\n"
"See the release notes for more details.\n");
fflush(stdout);
}
}
}
}
#endif // __linux__
return available;
}
/*
@ -262,7 +291,7 @@ static jboolean IsXRenderAvailable(jboolean verbose) {
*/
JNIEXPORT jboolean JNICALL
Java_sun_awt_X11GraphicsEnvironment_initXRender
(JNIEnv *env, jclass x11ge, jboolean verbose)
(JNIEnv *env, jclass x11ge, jboolean verbose, jboolean ignoreLinuxVersion)
{
#ifndef HEADLESS
static jboolean xrenderAvailable = JNI_FALSE;
@ -277,7 +306,7 @@ Java_sun_awt_X11GraphicsEnvironment_initXRender
}
#endif
AWT_LOCK();
xrenderAvailable = IsXRenderAvailable(verbose);
xrenderAvailable = IsXRenderAvailable(verbose, ignoreLinuxVersion);
AWT_UNLOCK();
firstTime = JNI_FALSE;
}
@ -294,9 +323,11 @@ Java_sun_java2d_xr_XRBackendNative_initIDs(JNIEnv *env, jclass cls) {
XImage* defaultImg;
jfieldID maskImgID;
jlong fmt8;
jlong fmt24;
jlong fmt32;
jfieldID a8ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_A8", "J");
jfieldID rgb24ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_ARGB24", "J");
jfieldID argb32ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_ARGB32", "J");
if (awt_display == (Display *)NULL) {
@ -304,9 +335,11 @@ Java_sun_java2d_xr_XRBackendNative_initIDs(JNIEnv *env, jclass cls) {
}
fmt8 = ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardA8));
fmt24 = ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardRGB24));
fmt32 = ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardARGB32));
(*env)->SetStaticLongField(env, cls, a8ID, fmt8);
(*env)->SetStaticLongField(env, cls, rgb24ID, fmt24);
(*env)->SetStaticLongField(env, cls, argb32ID, fmt32);
maskData = (char *) malloc(32*32);