From 4ff41501d152a237e0719c53ac70bf4796f31ba5 Mon Sep 17 00:00:00 2001 From: Phil Race <prr@openjdk.org> Date: Tue, 1 Oct 2013 15:36:53 -0700 Subject: [PATCH] 8007386: On physical machine (video card is Intel Q45) the text is blank Reviewed-by: prr, jchen --- .../sun/awt/X11GraphicsEnvironment.java | 9 ++++- .../native/sun/java2d/x11/XRBackendNative.c | 39 +++++++++++++++++-- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/jdk/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java b/jdk/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java index 4e1c816fd18..47449f25c91 100644 --- a/jdk/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java +++ b/jdk/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java @@ -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; } diff --git a/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c b/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c index cbcf0c357e3..c015abb8b07 100644 --- a/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c +++ b/jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c @@ -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);