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