Any news here Sergey?
> Am 17.02.2015 um 15:01 schrieb Sergey Bylokhov <sergey.bylok...@oracle.com>: > > Hello, > Thanks for the provided info! I am able to reproduce this bug even on > windows: gdi vs ogl. I will take a look at it. > > On 12.02.2015 8:28, DRC wrote: >> On 2/10/15 7:52 AM, Sergey Bylokhov wrote: >>> You can run this test on jdk 8u31 and 8u40 to see a difference: >>> http://cr.openjdk.java.net/~serb/8029253/webrev.04/test/java/awt/image/DrawImage/UnmanagedDrawImagePerformance.java.html >>> >>> >>> And the test from this bug report: >>> https://bugs.openjdk.java.net/browse/JDK-8017247 >> >> After looking at those tests, they are definitely not related to the issue >> I'm seeing here. Although the TurboVNC Viewer (my application) does use >> bilinear interpolation if desktop scaling is enabled, that is not the >> "common" usage case. Normally, it's just going to be drawing a >> BufferedImage with no interpolation, so that at least clarifies that I >> shouldn't be expecting any different behavior with Java 9. The question now >> becomes: how to optimally take advantage of the OpenGL pipeline. As you >> pointed out (and I agree, based on my research) reducing the >> software-to-surface blits is key, although I don't have a firm grasp on how >> to do that. My code is basically just doing the following: >> >> public void paintComponent(Graphics g) { >> Graphics2D g2 = (Graphics2D) g; >> if (scaling enabled) { >> g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, >> RenderingHints.VALUE_INTERPOLATION_BILINEAR); >> g2.drawImage(im.getImage(), 0, 0, scaledWidth, scaledHeight, null); >> } else { >> g2.drawImage(im.getImage(), 0, 0, null); >> } >> g2.dispose(); >> } >> >> public void updateWindow() { >> Rect r = damage; >> if (!r.isEmpty()) { >> if (scaling enabled) { >> blah blah blah (adjust coordinates, mainly) >> paintImmediately(x, y, width, height); >> } else { >> paintImmediately(x, y, width, height); >> } >> damage.clear(); >> } >> } >> >> As VNC rectangles from the server are decoded, the "damage" rectangle gets >> updated to reflect the extent of the "damaged" pixels, and that extent is >> passed into paintImmediately(). In examining the OpenJDK source, however, >> it appears that glDrawPixels() is always called with the full extent of the >> BufferedImage, regardless of whether only a small portion of that image has >> actually changed. If there is something else I can do to help debug this, >> please let me know. I have a working JDK build. I fully admit that I may >> be doing something wrong or suboptimally, but bear in mind that I've spent >> probably over 100 hours on this, so it's not as if I'm a naive n00b here. >> If there's something I'm missing, then trust me that it isn't obvious! >> >> >>> Can you share standalone jar file of this workload? >> >> Here is everything you need to reproduce the issue: >> http://www.turbovnc.org/turbovnc_mac_performance_stuff.tar.gz >> >> Untar, then do >>> cd turbovnc_mac_performance_stuff >>> java -server -d64 -Dsun.java2d.trace=count -cp VncViewer.jar >>> com.turbovnc.vncviewer.ImageDrawTest >> (let it run for 20 seconds or so, then CTRL-C it.) >>> java -server -d64 -jar VncViewer.jar -bench compilation-16.rfb -benchiter 3 >>> -benchwarmup 2 >> (let it run to completion.) >> >> Results from Java 6u51 on my Mac Mini (2009 vintage, 2 GHz Intel Core Duo, >> nVidia GeForce 9400): >> ImageDrawTest: ~100 Mpixels/sec >> (all calls are to sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, >> IntArgbPre)) >> compilation-16: Average 1.392763 s (Decode = 0.198173 s, Blit = 1.005974 s) >> >> Results from Java 8u31 on my Mac Mini: >> ImageDrawTest: ~70 Mpixels/sec >> (Calls are split between >> sun.java2d.opengl.OGLRTTSurfaceToSurfaceBlit::Blit("OpenGL Surface >> (render-to-texture)", AnyAlpha, "OpenGL Surface") and >> sun.java2d.opengl.OGLSwToSurfaceBlit::Blit(IntArgbPre, AnyAlpha, "OpenGL >> Surface")) >> compilation-16: Average 6.216550 s (Decode = 0.194989 s, Blit = 5.534781 s) >> >> Results from Java 8u31 on my Mac Mini without alpha-enabled image >> (-Dturbovnc.forcealpha=false): >> ImageDrawTest: ~18 Mpixels/sec >> (Calls are split between: >> sun.java2d.opengl.OGLRTTSurfaceToSurfaceBlit::Blit("OpenGL Surface >> (render-to-texture)", AnyAlpha, "OpenGL Surface") and >> sun.java2d.opengl.OGLSwToSurfaceBlit::Blit(IntRgb, AnyAlpha, "OpenGL >> Surface")) >> compilation-16: Average 27.153480 s (Decode = 0.200333 s, Blit = 26.523137 >> s) >> >> So, as you can see, using an alpha-enabled image improved the performance >> under Java 7/8 by about 4x, both when drawing large images (ImageDrawTest) >> and when doing smaller image updates (compilation-16.) However, the blitting >> performance under Java 7/8 for small image workloads is still about 5x >> slower than it was under Java 6. Results from a different machine: >> >> Results from Java 6u51 on my Macbook Pro (2011 vintage, 2.4 GHz Intel Core >> i5, Intel HD Graphics 3000): >> ImageDrawTest: ~100 Mpixels/sec >> (all calls to sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntArgbPre)) >> compilation-16: Average 0.592772 s (Decode = 0.113879 s, Blit = 0.351596 s) >> >> Results from Java 8u31 on my Macbook Pro: >> ImageDrawTest: ~66 Mpixels/sec >> (Calls split between >> sun.java2d.opengl.OGLRTTSurfaceToSurfaceBlit::Blit("OpenGL Surface >> (render-to-texture)", AnyAlpha, "OpenGL Surface") and >> sun.java2d.opengl.OGLSwToSurfaceBlit::Blit(IntArgbPre, AnyAlpha, "OpenGL >> Surface")) >> compilation-16: Average 6.806324 s (Decode = 0.188252 s, Blit = 6.457852 s) >> >> Results from Java 8u31 on my Macbook Pro without alpha-enabled image >> (-Dturbovnc.forcealpha=false): >> ImageDrawTest: ~50 Mpixels/sec >> (Calls split between >> sun.java2d.opengl.OGLRTTSurfaceToSurfaceBlit::Blit("OpenGL Surface >> (render-to-texture)", AnyAlpha, "OpenGL Surface") and >> sun.java2d.opengl.OGLSwToSurfaceBlit::Blit(IntRgb, AnyAlpha, "OpenGL >> Surface")) >> compilation-16: Average 10.272508 s (Decode = 0.147805 s, Blit = 9.955666 >> s) >> >> Using an ARGB_PRE BufferedImage didn't help out nearly as much on this >> machine, and whereas the large image performance looks similar to that of >> the Mac Mini, the small image blitting performance still suffers by nearly a >> factor of 20 (although it is improved-- before the use of ARGB_PRE images, >> it was about a factor of 30 slower.) >> >> The architecture of this solution makes the use of VolatileImages >> impractical-- basically, I have to decode the VNC rectangles in real time as >> they arrive, so if the VolatileImage were to go away, I would have no way of >> rebuilding it. > > > -- > Best regards, Sergey. >