# HG changeset patch # User vadim # Date 1413839011 -14400 # Tue Oct 21 01:03:31 2014 +0400 # Node ID 109c7fe6d8490bf878c65ba6a33453605ba5f0ae # Parent 4470eb64c30277b553a63e40e8b78788ff5c1f8a RT-38966: [JFXPanel] Scene Antialisaing doesn't work in JFXPanel diff --git a/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/UploadingPainter.java b/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/UploadingPainter.java --- a/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/UploadingPainter.java +++ b/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/UploadingPainter.java @@ -48,6 +48,10 @@ private IntBuffer pixBits; // Users for RTTs that are backed by a SW array private final AtomicInteger uploadCount = new AtomicInteger(0); private RTTexture rttexture; + // resolveRTT is a temporary render target to "resolve" a msaa render buffer + // into a normal color render target. + // REMIND: resolveRTT could be a single shared scratch rtt + private RTTexture resolveRTT = null; private volatile float pixScaleFactor = 1.0f; @@ -60,6 +64,10 @@ rttexture.dispose(); rttexture = null; } + if (resolveRTT != null) { + resolveRTT.dispose(); + resolveRTT = null; + } } public void setPixelScaleFactor(float scale) { @@ -114,7 +122,8 @@ if (needsReset) { disposeRTTexture(); - rttexture = factory.createRTTexture(bufWidth, bufHeight, WrapMode.CLAMP_NOT_NEEDED); + rttexture = factory.createRTTexture(bufWidth, bufHeight, WrapMode.CLAMP_NOT_NEEDED, + sceneState.isAntiAliasing()); if (rttexture == null) { return; } @@ -148,7 +157,10 @@ } if (textureBits != null) { - if (rttexture.readPixels(textureBits)) { + RTTexture rtt = rttexture.isAntiAliasing() ? + resolveRenderTarget(g) : rttexture; + + if (rtt.readPixels(textureBits)) { pix = app.createPixels(bufWidth, bufHeight, textureBits, scale); } else { /* device lost */ @@ -178,6 +190,9 @@ if (rttexture != null && rttexture.isLocked()) { rttexture.unlock(); } + if (resolveRTT != null && resolveRTT.isLocked()) { + resolveRTT.unlock(); + } Disposer.cleanUp(); @@ -190,4 +205,26 @@ renderLock.unlock(); } } + + private RTTexture resolveRenderTarget(Graphics g) { + int width = rttexture.getContentWidth(); + int height = rttexture.getContentHeight(); + if (resolveRTT != null && + (resolveRTT.getContentWidth() != width || + (resolveRTT.getContentHeight() != height))) + { + // If msaa rtt is not the same size than resolve buffer, then dispose + resolveRTT.dispose(); + resolveRTT = null; + } + if (resolveRTT == null || resolveRTT.isSurfaceLost()) { + resolveRTT = g.getResourceFactory().createRTTexture( + width, height, + WrapMode.CLAMP_NOT_NEEDED, false); + } else { + resolveRTT.lock(); + } + g.blit(rttexture, resolveRTT, 0, 0, width, height, 0, 0, width, height); + return resolveRTT; + } }