< prev index next >

modules/graphics/src/main/java/com/sun/javafx/tk/quantum/UploadingPainter.java

Print this page
rev 8191 : RT-38966: [JFXPanel] Scene Antialisaing doesn't work in JFXPanel

*** 46,55 **** --- 46,59 ---- private Pixels pix; private IntBuffer textureBits; // Used for RTTs that are not backed by a SW array 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; UploadingPainter(GlassScene view) { super(view);
*** 58,67 **** --- 62,75 ---- void disposeRTTexture() { if (rttexture != null) { rttexture.dispose(); rttexture = null; } + if (resolveRTT != null) { + resolveRTT.dispose(); + resolveRTT = null; + } } public void setPixelScaleFactor(float scale) { pixScaleFactor = scale; }
*** 112,122 **** int bufWidth = (int)Math.round(viewWidth * scale); int bufHeight = (int)Math.round(viewHeight * scale); if (needsReset) { disposeRTTexture(); ! rttexture = factory.createRTTexture(bufWidth, bufHeight, WrapMode.CLAMP_NOT_NEEDED); if (rttexture == null) { return; } penWidth = viewWidth; penHeight = viewHeight; --- 120,131 ---- int bufWidth = (int)Math.round(viewWidth * scale); int bufHeight = (int)Math.round(viewHeight * scale); if (needsReset) { disposeRTTexture(); ! rttexture = factory.createRTTexture(bufWidth, bufHeight, WrapMode.CLAMP_NOT_NEEDED, ! sceneState.isAntiAliasing()); if (rttexture == null) { return; } penWidth = viewWidth; penHeight = viewHeight;
*** 146,156 **** if (textureBits == null || uploadCount.get() > 0) { textureBits = BufferUtil.newIntBuffer(bufWidth * bufHeight); } if (textureBits != null) { ! if (rttexture.readPixels(textureBits)) { pix = app.createPixels(bufWidth, bufHeight, textureBits, scale); } else { /* device lost */ sceneState.getScene().entireSceneNeedsRepaint(); disposeRTTexture(); --- 155,168 ---- if (textureBits == null || uploadCount.get() > 0) { textureBits = BufferUtil.newIntBuffer(bufWidth * bufHeight); } if (textureBits != null) { ! RTTexture rtt = rttexture.isAntiAliasing() ? ! resolveRenderTarget(g) : rttexture; ! ! if (rtt.readPixels(textureBits)) { pix = app.createPixels(bufWidth, bufHeight, textureBits, scale); } else { /* device lost */ sceneState.getScene().entireSceneNeedsRepaint(); disposeRTTexture();
*** 176,185 **** --- 188,200 ---- th.printStackTrace(System.err); } finally { if (rttexture != null && rttexture.isLocked()) { rttexture.unlock(); } + if (resolveRTT != null && resolveRTT.isLocked()) { + resolveRTT.unlock(); + } Disposer.cleanUp(); sceneState.getScene().setPainting(false);
*** 188,193 **** --- 203,230 ---- } 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; + } }
< prev index next >