Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Debug node #3051

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.terasology.rendering.assets.material.Material;
import org.terasology.rendering.cameras.Camera;
import org.terasology.rendering.cameras.SubmersibleCamera;
import org.terasology.rendering.dag.nodes.DebugNode;
import org.terasology.rendering.world.viewDistance.ViewDistance;
import org.terasology.rendering.world.WorldRenderer;
import org.terasology.world.WorldProvider;
Expand Down Expand Up @@ -187,6 +188,11 @@ public RenderingStage getCurrentRenderStage() {
return null;
}

@Override
public DebugNode getDebugNode() {
return null;
}

@Override
public String getMetrics() {
return "";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -623,4 +623,13 @@ public void recompileShaders() {
WorldRendererImpl worldRendererImpl = (WorldRendererImpl)worldRenderer;
worldRendererImpl.recompileShaders();
}

/**
* Debugging command for DAG.
*/
@Command(shortDescription = "Debugging command for DAG.", requiredPermission = PermissionManager.NO_PERMISSION)
public void dagDebug(@CommandParam("fboUri") final String fboUri) {
WorldRendererImpl worldRendererImpl = (WorldRendererImpl)worldRenderer;
worldRendererImpl.getDebugNode().setFbo(fboUri);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.terasology.context.Context;
import org.terasology.monitoring.PerformanceMonitor;
import org.terasology.rendering.dag.ConditionDependentNode;
import org.terasology.rendering.dag.StateChange;
import org.terasology.rendering.dag.stateChanges.EnableMaterial;
import org.terasology.rendering.dag.stateChanges.SetInputTextureFromFbo;
import org.terasology.rendering.opengl.FBO;
Expand All @@ -34,19 +35,25 @@
import static org.terasology.rendering.world.WorldRenderer.RenderingStage.LEFT_EYE;
import static org.terasology.rendering.world.WorldRenderer.RenderingStage.MONO;

public class CopyImageToScreenNode extends ConditionDependentNode {
public class CopyFboColorAttachmentToScreenNode extends ConditionDependentNode {
private static final ResourceUrn DEFAULT_TEXTURED_MATERIAL_URN = new ResourceUrn("engine:prog.defaultTextured");

public CopyImageToScreenNode(Context context) {
private WorldRenderer worldRenderer;
private DisplayResolutionDependentFBOs displayResolutionDependentFBOs;

private StateChange bindFbo;

public CopyFboColorAttachmentToScreenNode(Context context) {
super(context);

WorldRenderer worldRenderer = context.get(WorldRenderer.class);
worldRenderer = context.get(WorldRenderer.class);
requiresCondition(() -> worldRenderer.getCurrentRenderStage() == MONO || worldRenderer.getCurrentRenderStage() == LEFT_EYE);

addDesiredStateChange(new EnableMaterial(DEFAULT_TEXTURED_MATERIAL_URN));

addDesiredStateChange(new SetInputTextureFromFbo(0, FINAL_BUFFER, ColorTexture,
context.get(DisplayResolutionDependentFBOs.class), DEFAULT_TEXTURED_MATERIAL_URN, "texture"));
displayResolutionDependentFBOs =context.get(DisplayResolutionDependentFBOs.class);
bindFbo = new SetInputTextureFromFbo(0, FINAL_BUFFER, ColorTexture, displayResolutionDependentFBOs, DEFAULT_TEXTURED_MATERIAL_URN, "texture");
addDesiredStateChange(bindFbo);
}

@Override
Expand All @@ -59,4 +66,11 @@ public void process() {
renderFullscreenQuad();
PerformanceMonitor.endActivity();
}

public void setFbo(FBO fbo) {
removeDesiredStateChange(bindFbo);
bindFbo = new SetInputTextureFromFbo(0, fbo, ColorTexture, displayResolutionDependentFBOs, DEFAULT_TEXTURED_MATERIAL_URN, "texture");
addDesiredStateChange(bindFbo);
worldRenderer.requestTaskListRefresh();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Copyright 2017 MovingBlocks
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.terasology.rendering.dag.nodes;

import org.terasology.context.Context;
import org.terasology.engine.SimpleUri;
import org.terasology.monitoring.PerformanceMonitor;
import org.terasology.rendering.dag.AbstractNode;
import org.terasology.rendering.opengl.FBO;
import org.terasology.rendering.opengl.SwappableFBO;
import org.terasology.rendering.opengl.fbms.DisplayResolutionDependentFBOs;

public class DebugNode extends AbstractNode {
private DisplayResolutionDependentFBOs displayResolutionDependentFBOs;
private FBO lastUpdatedGBuffer;
private FBO staleGBuffer;

private CopyFboColorAttachmentToScreenNode outputNode;

public DebugNode(Context context) {
displayResolutionDependentFBOs = context.get(DisplayResolutionDependentFBOs.class);
SwappableFBO gBufferPair = displayResolutionDependentFBOs.getGBufferPair();

lastUpdatedGBuffer = gBufferPair.getLastUpdatedFbo();
staleGBuffer = gBufferPair.getStaleFbo();

}

@Override
public void process() {
PerformanceMonitor.startActivity("rendering/debugNode");
PerformanceMonitor.endActivity();
}

public void setOutputNode(CopyFboColorAttachmentToScreenNode outputNode) {
this.outputNode = outputNode;
}

public void setFbo(String fboUri) {
FBO fbo;

switch (fboUri) {
case "engine:fbo.gBuffer":
case "engine:fbo.lastUpdatedGBuffer":
fbo = lastUpdatedGBuffer;
break;
case "engine:fbo.staleGBuffer":
fbo = staleGBuffer;
break;
default:
// TODO: We should probably do some more error checking here.
fbo = displayResolutionDependentFBOs.get(new SimpleUri(fboUri));
if (fbo == null) {
fbo = lastUpdatedGBuffer;
}
break;
}

outputNode.setFbo(fbo);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import org.terasology.rendering.assets.material.Material;
import org.terasology.rendering.cameras.Camera;
import org.terasology.rendering.cameras.SubmersibleCamera;
import org.terasology.rendering.dag.nodes.CopyFboColorAttachmentToScreenNode;
import org.terasology.rendering.dag.nodes.DebugNode;
import org.terasology.rendering.world.viewDistance.ViewDistance;

/**
Expand Down Expand Up @@ -218,4 +220,7 @@ enum RenderingStage {
*/
// TODO: transform this to return an object or a map. Consumers would then take care of formatting.
String getMetrics();

// TODO: Remove this method
DebugNode getDebugNode();
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@
import org.terasology.rendering.dag.nodes.BlurredAmbientOcclusionNode;
import org.terasology.rendering.dag.nodes.BufferClearingNode;
import org.terasology.rendering.dag.nodes.CopyImageToHMDNode;
import org.terasology.rendering.dag.nodes.CopyImageToScreenNode;
import org.terasology.rendering.dag.nodes.CopyFboColorAttachmentToScreenNode;
import org.terasology.rendering.dag.nodes.DebugNode;
import org.terasology.rendering.dag.nodes.DeferredMainLightNode;
import org.terasology.rendering.dag.nodes.DeferredPointLightsNode;
import org.terasology.rendering.dag.nodes.DownSamplerForExposureNode;
Expand Down Expand Up @@ -152,6 +153,11 @@ public final class WorldRendererImpl implements WorldRenderer {
private DisplayResolutionDependentFBOs displayResolutionDependentFBOs;
private ShadowMapResolutionDependentFBOs shadowMapResolutionDependentFBOs;

// TODO: These Nodes are stored to allow inter-Node communication.
// These should be removed as soon as possible (potentially with DAG).
private DebugNode debugNode;
private CopyFboColorAttachmentToScreenNode copyFboColorAttachmentToScreenNode;

/**
* Instantiates a WorldRenderer implementation.
*
Expand Down Expand Up @@ -249,8 +255,12 @@ private void initRenderGraph() {

addPostProcessingNodes(renderGraph);

addDebuggingNodes(renderGraph);

addCopyOutputNodes(renderGraph);

linkDebuggingAndOutputNodes();

renderTaskListGenerator = new RenderTaskListGenerator();
List<Node> orderedNodes = renderGraph.getNodesInTopologicalOrder();
renderPipelineTaskList = renderTaskListGenerator.generateFrom(orderedNodes);
Expand Down Expand Up @@ -447,12 +457,21 @@ private void addPostProcessingNodes(RenderGraph renderGraph) {
renderGraph.addNode(finalPostProcessingNode, "finalPostProcessingNode");
}

private void addDebuggingNodes(RenderGraph renderGraph) {
debugNode = new DebugNode(context);
renderGraph.addNode(debugNode, "debugNode");
}

private void addCopyOutputNodes(RenderGraph renderGraph) {
Node copyToVRFrameBufferNode = new CopyImageToHMDNode(context);
renderGraph.addNode(copyToVRFrameBufferNode, "copyToVRFrameBufferNode");
Node copyImageToHMDNode = new CopyImageToHMDNode(context);
renderGraph.addNode(copyImageToHMDNode, "copyImageToHMDNode");

Node copyImageToScreenNode = new CopyImageToScreenNode(context);
renderGraph.addNode(copyImageToScreenNode, "copyImageToScreenNode");
copyFboColorAttachmentToScreenNode = new CopyFboColorAttachmentToScreenNode(context);
renderGraph.addNode(copyFboColorAttachmentToScreenNode, "copyFboColorAttachmentToScreenNode");
}

private void linkDebuggingAndOutputNodes() {
debugNode.setOutputNode(copyFboColorAttachmentToScreenNode);
}

@Override
Expand Down Expand Up @@ -677,4 +696,9 @@ public RenderingStage getCurrentRenderStage() {
public void recompileShaders() {
shaderManager.recompileAllShaders();
}

@Override
public DebugNode getDebugNode() {
return debugNode;
}
}