# HG changeset patch # User Andrew John Hughes # Date 1483486744 0 # Node ID 37bb57406a6199a3479f237451f13cb39ffd9293 # Parent 8a9d0b89f4bbcea76cefd6462f13114f6fc0753c PR3276: Backport latest XRender patches 2017-01-03 Andrew John Hughes PR3276: Backport latest XRender patches * Makefile.am: (ICEDTEA_PATCHES): Add new XRender fixes. * NEWS: Updated. * patches/openjdk/6974985-pr3276-java2demo_exceptions.patch, * patches/openjdk/6985593-pr3276-maskblit_crash.patch, * patches/openjdk/8159495-pr3276-xrender_index_offsets.patch: Backported XRender fixes from OpenJDK 7. diff -r 8a9d0b89f4bb -r 37bb57406a61 ChangeLog --- a/ChangeLog Tue Jan 03 21:46:23 2017 +0000 +++ b/ChangeLog Tue Jan 03 23:39:04 2017 +0000 @@ -1,3 +1,14 @@ +2017-01-03 Andrew John Hughes + + PR3276: Backport latest XRender patches + * Makefile.am: + (ICEDTEA_PATCHES): Add new XRender fixes. + * NEWS: Updated. + * patches/openjdk/6974985-pr3276-java2demo_exceptions.patch, + * patches/openjdk/6985593-pr3276-maskblit_crash.patch, + * patches/openjdk/8159495-pr3276-xrender_index_offsets.patch: + Backported XRender fixes from OpenJDK 7. + 2017-01-03 Andrew John Hughes PR3275: Update generated files after OpenJDK 6 diff -r 8a9d0b89f4bb -r 37bb57406a61 Makefile.am --- a/Makefile.am Tue Jan 03 21:46:23 2017 +0000 +++ b/Makefile.am Tue Jan 03 23:39:04 2017 +0000 @@ -653,7 +653,10 @@ patches/openjdk/6961633-xrender-02.patch \ patches/openjdk/7018387-xrender_gc_leak.patch \ patches/openjdk/7150134-pr2662-xrender_drawline_oom.patch \ - patches/openjdk/7105461-pr2662-xrender_jtables.patch + patches/openjdk/7105461-pr2662-xrender_jtables.patch \ + patches/openjdk/6974985-pr3276-java2demo_exceptions.patch \ + patches/openjdk/6985593-pr3276-maskblit_crash.patch \ + patches/openjdk/8159495-pr3276-xrender_index_offsets.patch endif if ENABLE_SYSTEMTAP diff -r 8a9d0b89f4bb -r 37bb57406a61 NEWS --- a/NEWS Tue Jan 03 21:46:23 2017 +0000 +++ b/NEWS Tue Jan 03 23:39:04 2017 +0000 @@ -24,7 +24,7 @@ - S8157753: Audio replay enhancement - S8158302: Handle contextual glyph substitutions - S8158993, CVE-2016-5568: Service Menu services - - S8159495: Fix index offsets + - S8159495, PR3276: Fix index offsets - S8159503: Amend Annotation Actions - S8159511: Stack map validation - S8159515: Improve indy validation @@ -170,7 +170,7 @@ - S8078628, PR3152: Zero build fails with pre-compiled headers disabled - S8080628: No mnemonics on Open and Save buttons in JFileChooser - S8083601: jdk8u60 l10n resource file translation update 2 - - S8140530: Creating a VolatileImage with size 0,0 results in no longer working g2d.drawString + - S8140530, PR3276: Creating a VolatileImage with size 0,0 results in no longer working g2d.drawString - S8142926: OutputAnalyzer's shouldXXX() calls return this - S8143134: L10n resource file translation update - S8147077: IllegalArgumentException thrown by api/java_awt/Component/FlipBufferStrategy/indexTGF_General @@ -191,6 +191,9 @@ - S8171415: Remove Java 7 features from testlibrary - S8171954: Add stubs for sun.security.tools.KeyTool and sun.security.tools.JarSigner - S8172159: Remove @Override annotation on interfaces added by b41 updates +* Backports + - S6974985, PR3276: Java2Demo threw exceptions when xrender enabled in OEL5.5 + - S6985593, PR3276: Crash in Java_sun_java2d_loops_MaskBlit_MaskBlit on oel5.5-x64 * Bug fixes - PR3174: systemtap: type definition 'symbolOopDesc' not found - PR3175: invalid zip timestamp handling leads to error updating JAR files diff -r 8a9d0b89f4bb -r 37bb57406a61 patches/openjdk/6974985-pr3276-java2demo_exceptions.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/openjdk/6974985-pr3276-java2demo_exceptions.patch Tue Jan 03 23:39:04 2017 +0000 @@ -0,0 +1,107 @@ +# HG changeset patch +# User ceisserer +# Date 1299019793 28800 +# Tue Mar 01 14:49:53 2011 -0800 +# Node ID bbbf427a9007d55bb07aa4b2174b7c8069968a51 +# Parent 196d6e80272154fe6f5855092be9cc176a366e59 +6974985, PR3276: Java2Demo threw exceptions when xrender enabled in OEL5.5 +Reviewed-by: prr + +diff --git a/make/sun/awt/mapfile-mawt-vers b/make/sun/awt/mapfile-mawt-vers +--- openjdk/jdk/make/sun/awt/mapfile-mawt-vers ++++ openjdk/jdk/make/sun/awt/mapfile-mawt-vers +@@ -424,6 +424,7 @@ + Java_sun_java2d_xr_XRSurfaceData_initXRPicture; + Java_sun_java2d_xr_XRSurfaceData_initIDs; + Java_sun_java2d_xr_XRSurfaceData_XRInitSurface; ++ Java_sun_java2d_xr_XRSurfaceData_freeXSDOPicture; + Java_sun_java2d_xr_XRBackendNative_initIDs; + Java_sun_java2d_xr_XIDGenerator_bufferXIDs; + Java_sun_java2d_xr_XRBackendNative_freeGC; +diff --git a/make/sun/xawt/mapfile-vers b/make/sun/xawt/mapfile-vers +--- openjdk/jdk/make/sun/xawt/mapfile-vers ++++ openjdk/jdk/make/sun/xawt/mapfile-vers +@@ -374,6 +374,7 @@ + Java_sun_java2d_xr_XRSurfaceData_initXRPicture; + Java_sun_java2d_xr_XRSurfaceData_initIDs; + Java_sun_java2d_xr_XRSurfaceData_XRInitSurface; ++ Java_sun_java2d_xr_XRSurfaceData_freeXSDOPicture; + Java_sun_java2d_xr_XRBackendNative_initIDs; + Java_sun_java2d_xr_XRBackendNative_freeGC; + Java_sun_java2d_xr_XRBackendNative_createGC; +diff --git a/src/solaris/classes/sun/java2d/xr/XRSurfaceData.java b/src/solaris/classes/sun/java2d/xr/XRSurfaceData.java +--- openjdk/jdk/src/solaris/classes/sun/java2d/xr/XRSurfaceData.java ++++ openjdk/jdk/src/solaris/classes/sun/java2d/xr/XRSurfaceData.java +@@ -55,6 +55,8 @@ + + native void initXRPicture(long xsdo, int pictForm); + ++ native void freeXSDOPicture(long xsdo); ++ + public static final String DESC_BYTE_A8_X11 = "Byte A8 Pixmap"; + public static final String DESC_INT_RGB_X11 = "Integer RGB Pixmap"; + public static final String DESC_INT_ARGB_X11 = "Integer ARGB-Pre Pixmap"; +@@ -531,6 +533,17 @@ + public Object getDestination() { + return peer.getTarget(); + } ++ ++ public void invalidate() { ++ try { ++ SunToolkit.awtLock(); ++ freeXSDOPicture(getNativeOps()); ++ }finally { ++ SunToolkit.awtUnlock(); ++ } ++ ++ super.invalidate(); ++ } + } + + public static class XRInternalSurfaceData extends XRSurfaceData { +diff --git a/src/solaris/native/sun/java2d/x11/X11SurfaceData.c b/src/solaris/native/sun/java2d/x11/X11SurfaceData.c +--- openjdk/jdk/src/solaris/native/sun/java2d/x11/X11SurfaceData.c ++++ openjdk/jdk/src/solaris/native/sun/java2d/x11/X11SurfaceData.c +@@ -375,6 +375,12 @@ + AWT_LOCK(); + + xsdo->invalid = JNI_TRUE; ++ ++ if (xsdo->xrPic != None) { ++ XRenderFreePicture(awt_display, xsdo->xrPic); ++ xsdo->xrPic = None; ++ } ++ + if (xsdo->isPixmap == JNI_TRUE && xsdo->drawable != 0) { + #ifdef MITSHM + if (xsdo->shmPMData.shmSegInfo != NULL) { +diff --git a/src/solaris/native/sun/java2d/x11/XRSurfaceData.c b/src/solaris/native/sun/java2d/x11/XRSurfaceData.c +--- openjdk/jdk/src/solaris/native/sun/java2d/x11/XRSurfaceData.c ++++ openjdk/jdk/src/solaris/native/sun/java2d/x11/XRSurfaceData.c +@@ -114,3 +114,26 @@ + XShared_initSurface(env, xsdo, depth, width, height, drawable); + #endif /* !HEADLESS */ + } ++ ++ ++ ++JNIEXPORT void JNICALL ++Java_sun_java2d_xr_XRSurfaceData_freeXSDOPicture(JNIEnv *env, jobject xsd, ++ jlong pXSData) ++{ ++#ifndef HEADLESS ++ X11SDOps *xsdo; ++ ++ J2dTraceLn(J2D_TRACE_INFO, "in XRSurfaceData_freeXSDOPicture"); ++ ++ xsdo = X11SurfaceData_GetOps(env, xsd); ++ if (xsdo == NULL) { ++ return; ++ } ++ ++ if(xsdo->xrPic != None) { ++ XRenderFreePicture(awt_display, xsdo->xrPic); ++ xsdo->xrPic = None; ++ } ++#endif /* !HEADLESS */ ++} diff -r 8a9d0b89f4bb -r 37bb57406a61 patches/openjdk/6985593-pr3276-maskblit_crash.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/openjdk/6985593-pr3276-maskblit_crash.patch Tue Jan 03 23:39:04 2017 +0000 @@ -0,0 +1,121 @@ +# HG changeset patch +# User bae +# Date 1301226704 -14400 +# Sun Mar 27 15:51:44 2011 +0400 +# Node ID 0f7256505703b1ac1264dc01c20224da0a3212a3 +# Parent 8ab1b6226eede869b3a53e92a6ff673659772cf5 +6985593, PR3276: Crash in Java_sun_java2d_loops_MaskBlit_MaskBlit on oel5.5-x64 +Reviewed-by: ceisserer, jgodinez, prr + +diff --git a/src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java b/src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java +--- openjdk/jdk/src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java ++++ openjdk/jdk/src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java +@@ -143,7 +143,8 @@ + + Blit swToSurfaceBlit = Blit.getFromCache(src.getSurfaceType(), CompositeType.SrcNoEa, vImgSurfaceType); + XRSurfaceData vImgSurface = (XRSurfaceData) vImg.getDestSurface(); +- swToSurfaceBlit.Blit(src, vImgSurface, null, null, sx, sy, 0, 0, w, h); ++ swToSurfaceBlit.Blit(src, vImgSurface, AlphaComposite.Src, null, ++ sx, sy, 0, 0, w, h); + + return vImgSurface; + } +diff --git a/test/sun/java2d/XRenderBlitsTest.java b/test/sun/java2d/XRenderBlitsTest.java +new file mode 100644 +--- /dev/null ++++ openjdk/jdk/test/sun/java2d/XRenderBlitsTest.java +@@ -0,0 +1,94 @@ ++/* ++ * Copyright (c) 2011, 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 ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++* @test ++* @bug 6985593 ++* @summary Test verifies that rendering standard images to screen does ++* not caiuse a crash in case of XRender. ++* @run main/othervm -Dsun.java2d.xrender=True XRenderBlitsTest ++*/ ++ ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Frame; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.image.BufferedImage; ++import java.util.ArrayList; ++import java.util.concurrent.CountDownLatch; ++ ++public class XRenderBlitsTest { ++ ++ private static final int w = 10; ++ private static final int h = 10; ++ ++ public static void main(String[] args) { ++ final CountDownLatch done = new CountDownLatch(1); ++ ++ final ArrayList images = new ArrayList(); ++ ++ int type = BufferedImage.TYPE_INT_RGB; ++ do { ++ BufferedImage img = new BufferedImage(w, h, type++); ++ Graphics2D g2d = img.createGraphics(); ++ g2d.setColor(Color.pink); ++ g2d.fillRect(0, 0, w, h); ++ g2d.dispose(); ++ ++ images.add(img); ++ } while (type <= BufferedImage.TYPE_BYTE_INDEXED); ++ ++ Frame f = new Frame("Draw images"); ++ Component c = new Component() { ++ ++ @Override ++ public Dimension getPreferredSize() { ++ return new Dimension(w * images.size(), h); ++ } ++ ++ @Override ++ public void paint(Graphics g) { ++ int x = 0; ++ for (BufferedImage img : images) { ++ System.out.println("Draw image " + img.getType()); ++ g.drawImage(img, x, 0, this); ++ x += w; ++ } ++ done.countDown(); ++ } ++ }; ++ f.add("Center", c); ++ f.pack(); ++ f.setVisible(true); ++ ++ // now wait for test results ++ try { ++ done.await(); ++ } catch (InterruptedException e) { ++ } ++ System.out.println("Test passed"); ++ f.dispose(); ++ } ++} diff -r 8a9d0b89f4bb -r 37bb57406a61 patches/openjdk/8159495-pr3276-xrender_index_offsets.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/openjdk/8159495-pr3276-xrender_index_offsets.patch Tue Jan 03 23:39:04 2017 +0000 @@ -0,0 +1,41 @@ +# HG changeset patch +# User aivanov +# Date 1468330300 -10800 +# Tue Jul 12 16:31:40 2016 +0300 +# Node ID bcd7f2459237d7edc725cf88cede673c906f9733 +# Parent 70bc733187569edf04e2d8480bdb01cb43ff4c36 +8159495, PR3276: Fix index offsets +8140530, PR3276: Creating a VolatileImage with size 0,0 results in no longer working g2d.drawString +Reviewed-by: prr, psadhukhan + +diff --git a/src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java b/src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java +--- openjdk/jdk/src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java ++++ openjdk/jdk/src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java +@@ -134,6 +134,9 @@ + vImg = (SunVolatileImage) dst.getGraphicsConfig().createCompatibleVolatileImage(w, h, src.getTransparency()); + vImg.setAccelerationPriority(1.0f); + ++ if (!(vImg.getDestSurface() instanceof XRSurfaceData)) { ++ throw new InvalidPipeException("Could not create XRSurfaceData"); ++ } + if (src.getTransparency() == SurfaceData.OPAQUE) { + rgbTmpPM = new WeakReference(vImg); + } else { +diff --git a/src/solaris/classes/sun/java2d/xr/XRSurfaceDataProxy.java b/src/solaris/classes/sun/java2d/xr/XRSurfaceDataProxy.java +--- openjdk/jdk/src/solaris/classes/sun/java2d/xr/XRSurfaceDataProxy.java ++++ openjdk/jdk/src/solaris/classes/sun/java2d/xr/XRSurfaceDataProxy.java +@@ -59,8 +59,12 @@ + public SurfaceData validateSurfaceData(SurfaceData srcData, + SurfaceData cachedData, int w, int h) { + if (cachedData == null) { +- cachedData = XRSurfaceData.createData(xrgc, w, h, xrgc +- .getColorModel(), null, 0, getTransparency()); ++ try { ++ cachedData = XRSurfaceData.createData(xrgc, w, h, ++ xrgc.getColorModel(), null, 0, ++ getTransparency()); ++ } catch (OutOfMemoryError oome) { ++ } + } + return cachedData; + }