< 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 >