diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 40c5b4c..1a39c63 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ jobs: mvn -B jpackage:jpackage@win $version= mvn help:evaluate -Dexpression="project.version" -q -DforceStdout echo "VERSION=$version" >> $env:GITHUB_ENV - echo "GPU VERSION - This is potentially unstable on Mac/Linux!! Please report any issues. If you hear nothing, but you see the program interface, then please let me know." > CHANGELOG + echo "See [/CHANGELOG.md](https://github.com/jameshball/osci-render/blob/master/CHANGELOG.md) for changes to this version.\nGPU VERSION - This is potentially unstable on Mac/Linux!! Please report any issues. If you hear nothing, but you see the program interface, then please let me know." > CHANGELOG mv "target/lib/osci-render-$version.jar" "target/lib/osci-render-win-$version.jar" ls target/lib/ - name: Release diff --git a/CHANGELOG.md b/CHANGELOG.md index 46de787..26b1aa4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +- 1.22.2 + - Revert to CPU execution if an exception occurs when trying to use GPU + + - 1.22.1 - Gracefully handle disconnects from both Blender and osci-render to prevent restarts! diff --git a/pom.xml b/pom.xml index 9f63348..fb4eaf0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ sh.ball osci-render - 1.22.1 + 1.22.2 osci-render diff --git a/src/main/java/sh/ball/engine/CameraDrawKernel.java b/src/main/java/sh/ball/engine/CameraDrawKernel.java index 3fe0b4e..ac7d86c 100644 --- a/src/main/java/sh/ball/engine/CameraDrawKernel.java +++ b/src/main/java/sh/ball/engine/CameraDrawKernel.java @@ -33,6 +33,7 @@ public class CameraDrawKernel extends Kernel { private float focalLength; private int hideEdges = 0; private int usingObjectSet = 0; + private boolean failedGpu = false; public CameraDrawKernel() {} @@ -99,7 +100,7 @@ public class CameraDrawKernel extends Kernel { this.hideEdges = 0; - return executeKernel(true); + return executeCpu(); } public List draw(Camera camera, WorldObject object) { @@ -129,17 +130,42 @@ public class CameraDrawKernel extends Kernel { this.hideEdges = object.edgesHidden() ? 1 : 0; - return executeKernel(false); + return executeGpu(); } - private List executeKernel(boolean cpu) { - cpu |= vertices.length / 3 < MIN_GPU_VERTICES; + private List postProcessVertices() { + List lines = new ArrayList<>(); - if (cpu) { - for (int i = 0; i < vertices.length / 3; i++) { - processVertex(i); + for (int i = 0; i < vertices.length / 3; i++) { + int nextOffset = 0; + if (i < vertices.length / 3 - 1) { + nextOffset = 2 * i + 2; } - } else { + if (!Float.isNaN(vertexResult[2 * i]) && !Float.isNaN(vertexResult[nextOffset])) { + lines.add(new Line( + new Vector2(vertexResult[2 * i], vertexResult[2 * i + 1]), + new Vector2(vertexResult[nextOffset], vertexResult[nextOffset + 1]) + )); + } + } + + return lines; + } + + private List executeCpu() { + for (int i = 0; i < vertices.length / 3; i++) { + processVertex(i); + } + + return postProcessVertices(); + } + + private List executeGpu() { + if (failedGpu || vertices.length / 3 < MIN_GPU_VERTICES) { + return executeCpu(); + } + + try { int maxGroupSize = 256; try { maxGroupSize = getKernelMaxWorkGroupSize(getTargetDevice()); @@ -148,24 +174,12 @@ public class CameraDrawKernel extends Kernel { } execute(Range.create(roundUp(vertices.length / 3, maxGroupSize), maxGroupSize)); + } catch (Exception e) { + e.printStackTrace(); + failedGpu = true; } - List linesList = new ArrayList<>(); - - for (int i = 0; i < vertices.length / 3; i++) { - int nextOffset = 0; - if (i < vertices.length / 3 - 1) { - nextOffset = 2 * i + 2; - } - if (!Float.isNaN(vertexResult[2 * i]) && !Float.isNaN(vertexResult[nextOffset])) { - linesList.add(new Line( - new Vector2(vertexResult[2 * i], vertexResult[2 * i + 1]), - new Vector2(vertexResult[nextOffset], vertexResult[nextOffset + 1]) - )); - } - } - - return linesList; + return postProcessVertices(); } int roundUp(int round, int multiple) {