From d10bfc6c1d75deda3a8f142d791250ebf01fb468 Mon Sep 17 00:00:00 2001 From: codex <103840984+codex128@users.noreply.github.com> Date: Thu, 27 Jun 2024 11:03:08 -0400 Subject: [PATCH] added fix for missing defines --- .../framegraph/PassQueueExecutor.java | 12 +------ .../renderer/framegraph/RenderResource.java | 36 ++++++++++--------- .../renderer/framegraph/ResourceList.java | 16 +++++---- .../framegraph/passes/DeferredPass.java | 17 ++++----- .../framegraph/passes/RenderPass.java | 26 +++++++------- .../main/java/com/jme3/shader/DefineList.java | 10 ++++-- .../com/jme3/material/plugins/J3MLoader.java | 2 -- .../renderpath/TestDeferredShading.java | 4 ++- 8 files changed, 62 insertions(+), 61 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/renderer/framegraph/PassQueueExecutor.java b/jme3-core/src/main/java/com/jme3/renderer/framegraph/PassQueueExecutor.java index e96d114ca1..efbb869233 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/framegraph/PassQueueExecutor.java +++ b/jme3-core/src/main/java/com/jme3/renderer/framegraph/PassQueueExecutor.java @@ -88,7 +88,6 @@ private void execute() { continue; } long start = System.currentTimeMillis(); - System.out.println(p+" started at "+start+"ms"); if (index == FrameGraph.RENDER_THREAD) { if (context.isProfilerAvailable()) { context.getProfiler().fgStep(FgStep.Execute, p.getProfilerName()); @@ -99,19 +98,10 @@ private void execute() { } if (frameGraph.isAsync()) { // wait until all input resources are available for use before executing - long startMillis = System.currentTimeMillis(); - while (!p.allInputsAvailable(context)) { - if (interrupted) { - return; - } - if (System.currentTimeMillis()-startMillis >= threadTimeoutMillis) { - throw new TimeoutException("Execution thread "+index+" timed out on pass "+p); - } - } + p.waitForInputs(); } p.executeRender(context); long end = System.currentTimeMillis(); - System.out.println(p+" ended at "+end+" and took "+(end-start)+"ms"); if (index == FrameGraph.RENDER_THREAD) { context.popRenderSettings(); } diff --git a/jme3-core/src/main/java/com/jme3/renderer/framegraph/RenderResource.java b/jme3-core/src/main/java/com/jme3/renderer/framegraph/RenderResource.java index f324676088..189df7b92e 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/framegraph/RenderResource.java +++ b/jme3-core/src/main/java/com/jme3/renderer/framegraph/RenderResource.java @@ -33,6 +33,8 @@ import com.jme3.renderer.framegraph.definitions.ResourceDef; import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.ReentrantLock; /** * Represents an existing or future resource used for rendering. @@ -51,7 +53,7 @@ public class RenderResource { private int refs = 0; private boolean survivesRefCull = false; private boolean undefined = false; - private boolean written = false; + private final AtomicBoolean released = new AtomicBoolean(false); /** * @@ -76,20 +78,13 @@ public void reference(PassIndex index) { lifetime.extendTo(index); refs++; } - /** - * - * @return - */ - public boolean isAvailable() { - return (!lifetime.isAsync() || !written) && !isVirtual(); - } /** * Releases this resource from one user. * * @return true if this resource is used after the release */ public boolean release() { - written = false; + released.compareAndExchange(false, true); return --refs >= 0; } @@ -150,6 +145,14 @@ public void setUndefined() { } undefined = true; } + /** + * Returns true if this resource always survives cull by reference. + * + * @param survivesRefCull + */ + public void setSurvivesRefCull(boolean survivesRefCull) { + this.survivesRefCull = survivesRefCull; + } /** * Gets this resource's producer. @@ -215,14 +218,6 @@ public int getIndex() { public int getNumReferences() { return refs; } - /** - * Returns true if this resource always survives cull by reference. - * - * @param survivesRefCull - */ - public void setSurvivesRefCull(boolean survivesRefCull) { - this.survivesRefCull = survivesRefCull; - } /** * Returns true if this resource is virtual. @@ -279,6 +274,13 @@ public boolean isUndefined() { public boolean isSurvivesRefCull() { return survivesRefCull; } + /** + * + * @return + */ + public boolean isAvailable() { + return released.get(); + } @Override public String toString() { diff --git a/jme3-core/src/main/java/com/jme3/renderer/framegraph/ResourceList.java b/jme3-core/src/main/java/com/jme3/renderer/framegraph/ResourceList.java index ef17ee4dcb..33efe7200f 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/framegraph/ResourceList.java +++ b/jme3-core/src/main/java/com/jme3/renderer/framegraph/ResourceList.java @@ -36,9 +36,9 @@ import com.jme3.renderer.framegraph.definitions.ResourceDef; import com.jme3.texture.FrameBuffer; import com.jme3.texture.Texture; -import com.jme3.util.SafeArrayList; import java.util.ArrayList; import java.util.LinkedList; +import java.util.concurrent.locks.Lock; /** * Manages render resource declarations, references, and releases for a framegraph. @@ -331,18 +331,20 @@ public boolean isVirtual(ResourceTicket ticket, boolean optional) { } /** - * Returns true if the resource at the ticket is available for use. + * Forces the current thread to wait until the resource at the ticket is + * available. *

- * This is used for asynchronous situations. + * A resource becomes available after being released by the declaring pass. * * @param ticket - * @return */ - public boolean isAvailable(ResourceTicket ticket) { + public void wait(ResourceTicket ticket) { if (ResourceTicket.validate(ticket)) { - return locate(ticket).isAvailable(); + RenderResource res = locate(ticket); + while (!res.isAvailable()) { + Thread.onSpinWait(); + } } - return true; } /** diff --git a/jme3-core/src/main/java/com/jme3/renderer/framegraph/passes/DeferredPass.java b/jme3-core/src/main/java/com/jme3/renderer/framegraph/passes/DeferredPass.java index cbc99371c6..cbf64eb129 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/framegraph/passes/DeferredPass.java +++ b/jme3-core/src/main/java/com/jme3/renderer/framegraph/passes/DeferredPass.java @@ -107,6 +107,7 @@ public class DeferredPass extends RenderPass implements TechniqueDefLogic { private final Texture2D[] tileTextures = new Texture2D[2]; private final ColorRGBA ambientColor = new ColorRGBA(); private List probeList; + private TechniqueDef active; public DeferredPass() {} public DeferredPass(boolean tiled) { @@ -134,9 +135,9 @@ protected void initialize(FrameGraph frameGraph) { material = new Material(assetManager, "Common/MatDefs/ShadingCommon/DeferredShading.j3md"); if (defs == null) { defs = new Defines(); - for (TechniqueDef t : material.getMaterialDef().getTechniqueDefs("DeferredPass")) { - defs.config(t); - } +// for (TechniqueDef t : material.getMaterialDef().getTechniqueDefs("DeferredPass")) { +// defs.config(t); +// } } } @Override @@ -163,12 +164,14 @@ protected void execute(FGRenderContext context) { } material.selectTechnique("DeferredPass", context.getRenderManager()); material.getActiveTechnique().getDef().setLogic(this); + active = material.getActiveTechnique().getDef(); + if (active.getDefineNames().length == 0) { + defs.config(active); + } acquireArrayOrElse("LightTextures", lightTextures, null); if (lightTextures[0] == null) { - System.out.println("use light buffers"); context.getScreen().render(context.getRenderManager(), material, resources.acquire(lights)); } else { - System.out.println("use light textures"); for (int i = 1; i <= lightTextures.length; i++) { material.setTexture("LightTex"+i, lightTextures[i-1]); } @@ -188,9 +191,7 @@ protected void cleanup(FrameGraph frameGraph) {} public Shader makeCurrent(AssetManager assetManager, RenderManager renderManager, EnumSet rendererCaps, LightList lights, DefineList defines) { // if the technique def somehow wasn't configured, configure it - if (defines.size() == 0) { - defs.config(material.getActiveTechnique().getDef()); - } + System.out.println("using "+(active == material.getActiveTechnique().getDef())); if (lightTextures[0] == null) { ColorRGBA amb = resources.acquireOrElse(ambient, null); if (amb == null) { diff --git a/jme3-core/src/main/java/com/jme3/renderer/framegraph/passes/RenderPass.java b/jme3-core/src/main/java/com/jme3/renderer/framegraph/passes/RenderPass.java index 0ccd1bcb70..2718964cc7 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/framegraph/passes/RenderPass.java +++ b/jme3-core/src/main/java/com/jme3/renderer/framegraph/passes/RenderPass.java @@ -103,19 +103,6 @@ public void prepareRender(FGRenderContext context) { prepare(context); // set the flag for checking if resources are available } - /** - * - * @param context - * @return - */ - public boolean allInputsAvailable(FGRenderContext context) { - for (ResourceTicket t : inputs) { - if (!resources.isAvailable(t)) { - return false; - } - } - return true; - } /** * Executes the pass. * @@ -299,6 +286,19 @@ protected void referenceOptional(ResourceTicket... tickets) { } } + /** + * Forces this thread to wait until all inputs are available for this pass. + * + * @param context + * @return + */ + public boolean waitForInputs() { + for (ResourceTicket t : inputs) { + resources.wait(t); + } + return true; + } + /** * Acquires a set of resources from a ticket group and stores them in * the array. diff --git a/jme3-core/src/main/java/com/jme3/shader/DefineList.java b/jme3-core/src/main/java/com/jme3/shader/DefineList.java index f981fdd841..b527730564 100644 --- a/jme3-core/src/main/java/com/jme3/shader/DefineList.java +++ b/jme3-core/src/main/java/com/jme3/shader/DefineList.java @@ -43,7 +43,7 @@ public final class DefineList { private final BitSet isSet; - private final int[] values; + private int[] values; public DefineList(int numValues) { if (numValues < 0) { @@ -60,7 +60,13 @@ private DefineList(DefineList original) { } private void rangeCheck(int id) { - assert 0 <= id && id < values.length; + //assert 0 <= id && id < values.length; + assert id >= 0 : "Define id cannot be less than zero."; + if (id > values.length) { + int[] temp = new int[id+1]; + System.arraycopy(values, 0, temp, 0, values.length); + values = temp; + } } public boolean isSet(int id) { diff --git a/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java b/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java index a5afea5e03..08ab7985ae 100644 --- a/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java @@ -51,8 +51,6 @@ import com.jme3.util.blockparser.Statement; import com.jme3.util.clone.Cloner; import jme3tools.shader.Preprocessor; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; diff --git a/jme3-examples/src/main/java/jme3test/renderpath/TestDeferredShading.java b/jme3-examples/src/main/java/jme3test/renderpath/TestDeferredShading.java index e928a71df7..b930a9964d 100644 --- a/jme3-examples/src/main/java/jme3test/renderpath/TestDeferredShading.java +++ b/jme3-examples/src/main/java/jme3test/renderpath/TestDeferredShading.java @@ -33,6 +33,8 @@ public static void main(String[] args) { AppSettings settings = new AppSettings(true); settings.setWidth(768); settings.setHeight(768); + settings.setVSync(false); + settings.setFrameRate(-1); app.setSettings(settings); app.start(); } @@ -83,7 +85,7 @@ public void simpleInitApp() { }; InstancedNode instancedNode = new InstancedNode("sp"); - for (int i = 0;i < 2000;i++) { + for(int i = 0;i < 2000;i++){ PointLight pl = new PointLight(); pl.setColor(colors[i % colors.length]); pl.setPosition(new Vector3f(FastMath.nextRandomFloat(-5.0f, 5.0f), 0.1f, FastMath.nextRandomFloat(-5.0f, 5.0f)));