diff --git a/src/main/java/com/sheepit/client/Client.java b/src/main/java/com/sheepit/client/Client.java index bccfe6f..c77d2e1 100644 --- a/src/main/java/com/sheepit/client/Client.java +++ b/src/main/java/com/sheepit/client/Client.java @@ -324,7 +324,7 @@ import okhttp3.HttpUrl; continue; // go back to ask job } - this.log.debug("Got work to do id: " + this.renderingJob.getId() + " frame: " + this.renderingJob.getFrameNumber()); + this.log.debug("Got work to do id: " + this.renderingJob.getId() + " frame: " + this.renderingJob.getRenderSettings().getFrameNumber()); // As the server allocated a new job to this client, reset the no_job waiting algorithm this.noJobRetryIter = 0; @@ -359,7 +359,7 @@ import okhttp3.HttpUrl; } if (this.renderingJob.isSynchronousUpload()) { // power or compute_method job, need to upload right away - this.gui.status(String.format("Uploading frame (%.2fMB)", (this.renderingJob.getOutputImageSize() / 1024.0 / 1024.0))); + this.gui.status(String.format("Uploading frame (%.2fMB)", (this.renderingJob.getRenderOutput().getFullImageSize() / 1024.0 / 1024.0))); ret = confirmJob(this.renderingJob, step); if (ret != Error.Type.OK) { @@ -369,12 +369,12 @@ import okhttp3.HttpUrl; this.renderingJob = null; } else { - this.gui.status(String.format("Queuing frame for upload (%.2fMB)", (this.renderingJob.getOutputImageSize() / 1024.0 / 1024.0))); + this.gui.status(String.format("Queuing frame for upload (%.2fMB)", (this.renderingJob.getRenderOutput().getFullImageSize() / 1024.0 / 1024.0))); this.jobsToValidate.add(new QueuedJob(step, this.renderingJob)); this.uploadQueueSize++; - this.uploadQueueVolume += this.renderingJob.getOutputImageSize(); + this.uploadQueueVolume += this.renderingJob.getRenderOutput().getFullImageSize(); this.gui.displayUploadQueueStats(uploadQueueSize, uploadQueueVolume); this.renderingJob = null; @@ -430,7 +430,7 @@ import okhttp3.HttpUrl; this.gui.status("Stopping"); if (this.renderingJob.getProcessRender().getProcess() != null) { - this.renderingJob.setAskForRendererKill(true); + this.renderingJob.getRenderState().setAskForRendererKill(true); this.renderingJob.getProcessRender().kill(); } } @@ -568,7 +568,7 @@ import okhttp3.HttpUrl; this.uploadQueueSize--; if (queuedJob.job != null) { - this.uploadQueueVolume -= queuedJob.job.getOutputImageSize(); + this.uploadQueueVolume -= queuedJob.job.getRenderOutput().getFullImageSize(); } this.gui.displayUploadQueueStats(this.uploadQueueSize, this.uploadQueueVolume); @@ -610,7 +610,7 @@ import okhttp3.HttpUrl; logHeader.append("====================================================================================================\n"); if (jobToReset != null) { logHeader.append(String.format("Project ::: %s\n", jobToReset.getName())) - .append(String.format("Project id: %s frame: %s\n", jobToReset.getId(), jobToReset.getFrameNumber())).append(String.format("blender ::: %s\n\n", jobToReset.getBlenderLongVersion())).append(String.format("ERROR Type :: %s\n", error)); + .append(String.format("Project id: %s frame: %s\n", jobToReset.getId(), jobToReset.getRenderSettings().getFrameNumber())).append(String.format("blender ::: %s\n\n", jobToReset.getRenderOutput().getBlenderLongVersion())).append(String.format("ERROR Type :: %s\n", error)); } else { logHeader.append("Project ::: No project allocated.\n") @@ -633,7 +633,7 @@ import okhttp3.HttpUrl; HttpUrl.Builder remoteURL = HttpUrl.parse(this.server.getPage("error")).newBuilder(); remoteURL.addQueryParameter("type", error == null ? "" : Integer.toString(error.getValue())); if (jobToReset != null) { - remoteURL.addQueryParameter("frame", jobToReset.getFrameNumber()); + remoteURL.addQueryParameter("frame", jobToReset.getRenderSettings().getFrameNumber()); remoteURL.addQueryParameter("job", jobToReset.getId()); remoteURL.addQueryParameter("render_time", Integer.toString(jobToReset.getProcessRender().getRenderDuration())); remoteURL.addQueryParameter("memoryused", Long.toString(jobToReset.getProcessRender().getPeakMemoryUsed())); @@ -929,11 +929,11 @@ import okhttp3.HttpUrl; protected Error.Type confirmJob(Job ajob, int checkpoint) { String urlReal = String.format(LOCALE, "%s&rendertime=%d&preptime=%d&memoryused=%s", ajob.getValidationUrl(), ajob.getProcessRender().getRenderDuration(), ajob.getProcessRender().getScenePrepDuration(), ajob.getProcessRender().getPeakMemoryUsed()); - if (ajob.getSpeedSamplesRendered() > 0.0) { - urlReal += String.format(LOCALE, "&speedsamples=%s", ajob.getSpeedSamplesRendered()); + if (ajob.getRenderOutput().getSpeedSamplesRendered() > 0.0) { + urlReal += String.format(LOCALE, "&speedsamples=%s", ajob.getRenderOutput().getSpeedSamplesRendered()); } this.log.debug(checkpoint, "Client::confirmeJob url " + urlReal); - this.log.debug(checkpoint, "path frame " + ajob.getOutputImagePath()); + this.log.debug(checkpoint, "path frame " + ajob.getRenderOutput().getFullImagePath()); this.isValidatingJob = true; int maxTries = 3; @@ -954,7 +954,7 @@ import okhttp3.HttpUrl; timeToSleep *= 2; // exponential backoff } - ret = this.server.HTTPSendFile(urlReal, ajob.getOutputImagePath(), checkpoint, this.gui); + ret = this.server.HTTPSendFile(urlReal, ajob.getRenderOutput().getFullImagePath(), checkpoint, this.gui); switch (ret) { case OK: // no issue, exit the loop @@ -1003,12 +1003,12 @@ import okhttp3.HttpUrl; } // we can remove the frame file - Utils.deleteFile(new File(ajob.getOutputImagePath())); - ajob.setOutputImagePath(null); + Utils.deleteFile(new File(ajob.getRenderOutput().getFullImagePath())); + ajob.getRenderOutput().setFullImagePath(null); - if (ajob.getPreviewImagePath() != null) { - Utils.deleteFile(new File(ajob.getPreviewImagePath())); - ajob.setPreviewImagePath(null); + if (ajob.getRenderOutput().getPreviewImagePath() != null) { + Utils.deleteFile(new File(ajob.getRenderOutput().getPreviewImagePath())); + ajob.getRenderOutput().setPreviewImagePath(null); } return confirmJobReturnCode; diff --git a/src/main/java/com/sheepit/client/Job.java b/src/main/java/com/sheepit/client/Job.java index c0ee127..0177c62 100644 --- a/src/main/java/com/sheepit/client/Job.java +++ b/src/main/java/com/sheepit/client/Job.java @@ -54,38 +54,28 @@ import java.util.TimerTask; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static com.sheepit.client.RenderSettings.UPDATE_METHOD_BY_REMAINING_TIME; +import static com.sheepit.client.RenderSettings.UPDATE_METHOD_BY_TILE; + @Data public class Job { - public static final String UPDATE_METHOD_BY_REMAINING_TIME = "remainingtime"; - public static final String UPDATE_METHOD_BY_TILE = "by_tile"; public static final String POST_LOAD_NOTIFICATION = "POST_LOAD_SCRIPT_loaded"; public static final int SHOW_BASE_ICON = -1; - private String frameNumber; private DownloadItem projectDownload; private DownloadItem rendererDownload; private String id; - private String outputImagePath; - - private String previewImagePath; - private long outputImageSize; - private String path; // path inside of the archive - private String rendererCommand; private String validationUrl; - private String script; - private boolean useGPU; private String name; private char[] password; - private String updateRenderingStatusMethod; - private String blenderShortVersion; - private String blenderLongVersion; + private boolean synchronousUpload; - private float speedSamplesRendered; // only used for powerdetection project - private RenderProcess render; - private boolean askForRendererKill; - private boolean userBlockJob; - private boolean serverBlockJob; - private boolean incompatibleProcessKillJob; + + private RenderSettings renderSettings; + private RenderProcess renderProcess; + private RenderOutput renderOutput; + private RenderState renderState; + private Gui gui; private Configuration configuration; private Log log; @@ -95,10 +85,7 @@ import java.util.regex.Pattern; String update_method_) { configuration = config_; id = id_; - frameNumber = frame_; - path = path_; - useGPU = use_gpu; - rendererCommand = command_; + renderSettings = new RenderSettings(frame_, script_, path_, command_, use_gpu, update_method_); validationUrl = validationUrl_; projectDownload = projectDownload_; rendererDownload = rendererDownload_; @@ -106,24 +93,15 @@ import java.util.regex.Pattern; password = password_.clone(); synchronousUpload = synchronous_upload_; gui = gui_; - outputImagePath = null; - outputImageSize = 0; - script = script_; - updateRenderingStatusMethod = update_method_; - askForRendererKill = false; - userBlockJob = false; - serverBlockJob = false; - incompatibleProcessKillJob = false; log = log_; - render = new RenderProcess(log_); - blenderShortVersion = null; - blenderLongVersion = null; - speedSamplesRendered = 0; + renderProcess = new RenderProcess(log_); + renderState = new RenderState(); + renderOutput = new RenderOutput(); } public void block() { - setAskForRendererKill(true); - setUserBlockJob(true); + renderState.setBlock(); + RenderProcess process = getProcessRender(); if (process != null) { process.kill(); @@ -131,8 +109,7 @@ import java.util.regex.Pattern; } public void incompatibleProcessBlock() { - setAskForRendererKill(true); - setIncompatibleProcessKillJob(true); + renderState.setBlockIncompatibleProcess(); RenderProcess process = getProcessRender(); if (process != null) { process.kill(); @@ -140,14 +117,15 @@ import java.util.regex.Pattern; } public RenderProcess getProcessRender() { - return render; + return renderProcess; } @Override public String toString() { return String .format("Job (numFrame '%s' archiveChunks %s rendererMD5 '%s' ID '%s' pictureFilename '%s' jobPath '%s' gpu %s name '%s' updateRenderingStatusMethod '%s' render %s)", - frameNumber, projectDownload.getMD5(), rendererDownload.getMD5(), id, outputImagePath, path, useGPU, name, updateRenderingStatusMethod, render); + getRenderSettings().getFrameNumber(), projectDownload.getMD5(), rendererDownload.getMD5(), id, getRenderOutput().getFullImagePath(), + getRenderSettings().getPath(), getRenderSettings().isUseGPU(), name, getRenderSettings().getUpdateRenderingStatusMethod(), renderProcess); } public String getPrefixOutputImage() { @@ -167,7 +145,7 @@ import java.util.regex.Pattern; } public String getScenePath() { - return getSceneDirectory() + File.separator + this.path; + return getSceneDirectory() + File.separator + getRenderSettings().getPath(); } public Error.Type render(Observer renderStarted) { @@ -179,7 +157,7 @@ import java.util.regex.Pattern; // The java program handles Ctrl+C but the renderer quits on Ctrl+C. // This script causes the renderer to ignore Ctrl+C. String ignore_signal_script = "import signal\n" + "def hndl(signum, frame):\n" + " pass\n" + "signal.signal(signal.SIGINT, hndl)\n"; - if (isUseGPU() && configuration.getGPUDevice() != null && configuration.getComputeMethod() != ComputeType.CPU) { + if (getRenderSettings().isUseGPU() && configuration.getGPUDevice() != null && configuration.getComputeMethod() != ComputeType.CPU) { core_script = "sheepit_set_compute_device(\"" + configuration.getGPUDevice().getType() + "\", \"GPU\", \"" + configuration.getGPUDevice().getId() + "\")\n"; gui.setComputeMethod("GPU"); @@ -193,7 +171,7 @@ import java.util.regex.Pattern; core_script += ignore_signal_script; File disableViewportScript = null; File script_file = null; - String[] command1 = getRendererCommand().split(" "); + String[] command1 = getRenderSettings().getCommand().split(" "); int size_command = command1.length + 2; // + 2 for script if (configuration.getNbCores() > 0) { // user has specified something @@ -298,7 +276,7 @@ import java.util.regex.Pattern; txt = new FileWriter(file); PrintWriter out = new PrintWriter(txt); - out.write(getScript()); + out.write(getRenderSettings().getScript()); out.write("\n"); out.write("import sys"); out.write("\n"); @@ -335,7 +313,7 @@ import java.util.regex.Pattern; command.add(configuration.getWorkingDirectory().getAbsolutePath() + File.separator + getPrefixOutputImage()); break; case ".f": - command.add(getFrameNumber()); + command.add(getRenderSettings().getFrameNumber()); break; default: command.add(arg); @@ -370,7 +348,7 @@ import java.util.regex.Pattern; if (process != null) { long duration = (new Date().getTime() - process.getStartTime()) / 1000; // in seconds if (configuration.getMaxRenderTime() > 0 && duration > configuration.getMaxRenderTime()) { - setAskForRendererKill(true); + getRenderState().setAskForRendererKill(true); log.debug("Killing render - exceeding allowed process duration"); process.kill(); } @@ -403,13 +381,13 @@ import java.util.regex.Pattern; log.debug(line); // Process lines until the version is loaded (usually first or second line of log) - if (blenderLongVersion == null) { + if (getRenderOutput().getBlenderLongVersion() == null) { Pattern blenderPattern = Pattern.compile("Blender (([0-9]{1,3}\\.[0-9]{0,3}).*)$"); Matcher blendDetectedVersion = blenderPattern.matcher(line); if (blendDetectedVersion.find()) { - blenderLongVersion = blendDetectedVersion.group(1); - blenderShortVersion = blendDetectedVersion.group(2); + getRenderOutput().setBlenderLongVersion(blendDetectedVersion.group(1)); + getRenderOutput().setBlenderShortVersion(blendDetectedVersion.group(2)); } } @@ -476,7 +454,7 @@ import java.util.regex.Pattern; updateSpeedSamplesRendered(line); updateRenderingStatus(line, progress); - Type error = detectError(line); + Type error = getRenderOutput().detectError(line); if (error != Error.Type.OK) { if (script_file != null) { script_file.delete(); @@ -578,7 +556,7 @@ import java.util.regex.Pattern; disableViewportScript.delete(); } // find the picture file - final String filename_without_extension = getPrefixOutputImage() + getFrameNumber(); + final String filename_without_extension = getPrefixOutputImage() + getRenderSettings().getFrameNumber(); FilenameFilter textFilter = new FilenameFilter() { @Override public boolean accept(File dir, String name) { @@ -588,7 +566,7 @@ import java.util.regex.Pattern; File[] files = configuration.getWorkingDirectory().listFiles(textFilter); - if (isAskForRendererKill()) { + if (getRenderState().isAskForRendererKill()) { log.debug("Job::render been asked to end render"); long duration = (new Date().getTime() - process.getStartTime()) / 1000; // in seconds @@ -600,13 +578,13 @@ import java.util.regex.Pattern; if (files.length != 0) { Arrays.stream(files).forEach( file -> new File(file.getAbsolutePath()).delete()); } - if (isServerBlockJob()) { + if (getRenderState().isServerBlock()) { return Error.Type.RENDERER_KILLED_BY_SERVER; } - if (isUserBlockJob()) { + if (getRenderState().isUserBlock()) { return Error.Type.RENDERER_KILLED_BY_USER; } - if (isIncompatibleProcessKillJob()) { + if (getRenderState().isIncompatibleProcessKill()) { return Error.Type.RENDERER_KILLED_BY_USER_INCOMPATIBLE_PROCESS; } return Error.Type.RENDERER_KILLED; @@ -620,7 +598,7 @@ import java.util.regex.Pattern; String basename = ""; try { - basename = getPath().substring(0, getPath().lastIndexOf('.')); + basename = getRenderSettings().getPath().substring(0, getRenderSettings().getPath().lastIndexOf('.')); } catch (Exception e) { e.printStackTrace(); @@ -651,13 +629,13 @@ import java.util.regex.Pattern; String path = files[1].getAbsolutePath(); String extension = path.substring(path.lastIndexOf(".") + 1).toLowerCase(); if ("jpg".equals(extension)) { - setPreviewImagePath(files[1].getAbsolutePath()); + getRenderOutput().setPreviewImagePath(files[1].getAbsolutePath()); } } - setOutputImagePath(files[0].getAbsolutePath()); - this.outputImageSize = new File(getOutputImagePath()).length(); - log.debug(String.format("Job::render pictureFilename: %s, size: %d'", getOutputImagePath(), this.outputImageSize)); + getRenderOutput().setFullImagePath(files[0].getAbsolutePath()); + getRenderOutput().setFullImageSize(new File(getRenderOutput().getFullImagePath()).length()); + log.debug(String.format("Job::render pictureFilename: %s, size: %d'", getRenderOutput().getFullImagePath(), getRenderOutput().getFullImageSize())); } File scene_dir = new File(getSceneDirectory()); @@ -704,7 +682,7 @@ import java.util.regex.Pattern; float duration = Float.parseFloat(matcher.group(2)); if (duration != 0 && amount != 0) { - this.speedSamplesRendered = amount / duration; + this.renderOutput.setSpeedSamplesRendered(amount / duration); } } @@ -713,7 +691,7 @@ import java.util.regex.Pattern; } private void updateRenderingStatus(String line, int progress) { - if (getUpdateRenderingStatusMethod() == null || UPDATE_METHOD_BY_REMAINING_TIME.equals(getUpdateRenderingStatusMethod())) { + if (getRenderSettings().getUpdateRenderingStatusMethod() == null || UPDATE_METHOD_BY_REMAINING_TIME.equals(getRenderSettings().getUpdateRenderingStatusMethod())) { String search_remaining = "remaining:"; int index = line.toLowerCase().indexOf(search_remaining); if (index != -1) { @@ -759,7 +737,7 @@ import java.util.regex.Pattern; } } } - else if (UPDATE_METHOD_BY_TILE.equals(getUpdateRenderingStatusMethod())) { + else if (UPDATE_METHOD_BY_TILE.equals(getRenderSettings().getUpdateRenderingStatusMethod())) { String search = " Tile "; int index = line.lastIndexOf(search); if (index != -1) { @@ -787,277 +765,6 @@ import java.util.regex.Pattern; getProcessRender().update(); } - private Type detectError(String line) { - - if (line.contains("version `GLIBC_2.28' not found")) { - // 07-04 07:43:12 (debug) renderer output - // 07-04 07:43:12 (debug) /tmp///rend.exe: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /tmp///rend.exe) - // 07-04 07:43:12 (debug) /tmp///rend.exe: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /tmp///lib/libboost_filesystem.so.1.80.0) - return Type.OS_NOT_SUPPORTED; - } - else if (line.contains("Color management:")) { - String[] errors = { - " not found", - " is not compatible ", - " Error could not find role", - " Error, could not find role", - "using fallback mode", - " Error, could not find any displays", - " Error, could not find any views", - " Failed to load bundled config" - }; - - for (var error : errors) { - if (line.contains(error)) { - - //30-11 01:16:57 (debug) Blender 4.0.0 (hash 878f71061b8e built 2023-11-14 01:20:37) - //30-11 01:16:57 (debug) Color management: display "sRGB" used by scene not found, setting to default ("Blender"). - //30-11 01:16:57 (debug) Color management: scene view "AgX" not found, setting default "Standard". - //30-11 01:16:57 (debug) Read blend: "C:\Users\tianji\AppData\Local\Temp\farm_3210908783605063546\254263927\Car Scene 3.blend" - //30-11 01:16:57 (debug) Color management: display "sRGB" used by scene not found, setting to default ("Blender"). - //30-11 01:16:57 (debug) Color management: scene view "AgX" not found, setting default "Standard". - //30-11 01:16:57 (debug) Color management: scene look "AgX - Medium High Contrast" not found, setting default "None". - //30-11 01:16:57 (debug) Color management: image colorspace "Linear Rec.709" not found, will use default instead. - return Type.COLOR_MANAGEMENT_ERROR; - } - } - } - else if (line.contains("OpenColorIO Error:")) { - //28-11 12:43:40 (debug) Fra:340 Mem:11.74M (Peak 28.28M) | Time:00:01.69 | Compositing | Tile 1-1 - //28-11 12:43:40 (debug) Fra:340 Mem:11.68M (Peak 28.28M) | Time:00:01.69 | Compositing | De-initializing execution - //28-11 12:43:40 (debug) OpenColorIO Error: The specified file reference 'srgb_inv.spi1d' could not be located. The following attempts were made: 'E:\SheepIt\sheepit\6b752e00cd23e1789e00285310cb6845\3.6\datafiles\colormanagement\luts\srgb_inv.spi1d' : 'E:\SheepIt\sheepit\6b752e00cd23e1789e00285310cb6845\3.6\datafiles\colormanagement\filmic\srgb_inv.spi1d'. - //28-11 12:43:40 (debug) Saved: 'E:\SheepIt\sheepit\1_0340.png' - return Type.COLOR_MANAGEMENT_ERROR; - } - else if (line.contains("CUDA error: Out of memory")) { - // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Mem:470.26M, Peak:470.26M | Scene, RenderLayer | Updating Device | Writing constant memory - // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Mem:470.26M, Peak:470.26M | Scene, RenderLayer | Path Tracing Tile 0/135, Sample 0/200 - // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Mem:470.82M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 1/135, Sample 0/200 - // CUDA error: Out of memory in cuLaunchKernel(cuPathTrace, xblocks , yblocks, 1, xthreads, ythreads, 1, 0, 0, args, 0) - // Refer to the Cycles GPU rendering documentation for possible solutions: - // http://www.blender.org/manual/render/cycles/gpu_rendering.html - // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Remaining:09:26.57 | Mem:470.26M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 1/135, Sample 200/200 - // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Remaining:00:00.06 | Mem:470.50M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 134/135, Sample 0/200 - // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Remaining:00:00.03 | Mem:470.26M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 134/135, Sample 200/200 - // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Remaining:00:00.03 | Mem:470.50M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 135/135, Sample 0/200 - // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Mem:470.26M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 135/135, Sample 200/200 - // Error: CUDA error: Out of memory in cuLaunchKernel(cuPathTrace, xblocks , yblocks, 1, xthreads, ythreads, 1, 0, 0, args, 0) - // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Mem:470.26M, Peak:470.82M | Scene, RenderLayer | Cancel | CUDA error: Out of memory in cuLaunchKernel(cuPathTrace, xblocks , yblocks, 1, xthreads, ythreads, 1, 0, 0, args, 0) - // Fra:151 Mem:405.89M (0.00M, Peak 633.81M) Sce: Scene Ve:0 Fa:0 La:0 - // Saved: /tmp/xx/26885_0151.png Time: 00:04.67 (Saving: 00:00.22) - // Blender quit - return Type.RENDERER_OUT_OF_VIDEO_MEMORY; - } - else if (line.contains("CUDA error at cuCtxCreate: Out of memory")) { - // renderer output - // CUDA error at cuCtxCreate: Out of memory - // Refer to the Cycles GPU rendering documentation for possible solutions: - // http://www.blender.org/manual/render/cycles/gpu_rendering.html - // found bundled python: /tmp/aaaa/bbbb/2.78/python - // read blend: /tmp/aaaa/bbbb/compute-method.blend - // Fra:340 Mem:7.25M (0.00M, Peak 7.25M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Sun - // Fra:340 Mem:7.25M (0.00M, Peak 7.25M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Plane - // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Cube - // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Camera - // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Initializing - // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Loading render kernels (may take a few minutes the first time) - // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Error | CUDA error at cuCtxCreate: Out of memory - // Error: CUDA error at cuCtxCreate: Out of memory - // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Waiting for render to start - // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Cancel | CUDA error at cuCtxCreate: Out of memory - // CUDA error: Invalid value in cuCtxDestroy(cuContext) - // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Sce: Scene Ve:0 Fa:0 La:0 - // Blender quit - // end of rendering - return Type.RENDERER_OUT_OF_VIDEO_MEMORY; - } - else if (line.contains("Error: Out of memory in CUDA") || line.contains("Error: Out of memory in OPTIX")) { - // 15-03 21:13:45 (debug) Fra:27 Mem:8441.68M (Peak 9675.81M) | Time:00:16.27 | Mem:8411.20M, Peak:8411.20M | Scene, View Layer | Loading render kernels (may take a few minutes the first time) - // 15-03 21:13:45 (debug) Out of memory in CUDA queue enqueue (integrator_shade_surface) - // 15-03 21:13:45 (debug) Refer to the Cycles GPU rendering documentation for possible solutions: - // 15-03 21:13:45 (debug) https://docs.blender.org/manual/en/latest/render/cycles/gpu_rendering.html - // 15-03 21:13:45 (debug) Fra:27 Mem:8441.68M (Peak 9675.81M) | Time:00:16.38 | Mem:8411.27M, Peak:8411.27M | Scene, View Layer | Updating Scene - // 15-03 21:13:45 (debug) Fra:27 Mem:8441.68M (Peak 9675.81M) | Time:00:16.38 | Mem:8411.27M, Peak:8411.27M | Scene, View Layer | Updating Shaders - // 15-03 21:13:45 (debug) Fra:27 Mem:8447.08M (Peak 9675.81M) | Time:00:16.63 | Mem:8763.00M, Peak:8763.00M | Scene, View Layer | Out of memory in CUDA queue enqueue (integrator_shade_surface) - // 15-03 21:13:45 (debug) Error: Out of memory in CUDA queue enqueue (integrator_shade_surface) - // 15-03 21:13:46 (debug) Blender quit - return Error.Type.RENDERER_OUT_OF_VIDEO_MEMORY; - } - else if (line.contains("CUDA error: Launch exceeded timeout in") || line.contains("CUDA error: Invalid value in cuTexRefSetAddress(") || line.contains("CUDA error: Launch failed in cuCtxSynchronize()") || line.contains("CUDA error: Illegal address in cuCtxSynchronize()")) { - return Error.Type.GPU_OR_DRIVER_ERROR; - } - else if (line.contains("System is out of GPU memory")) { - // 16-03 18:37:37 (debug) Fra:192 Mem:15826.70M (Peak 15831.18M) | Time:02:21.86 | Mem:6622.87M, Peak:6625.35M | Scene, ViewLayer | Loading denoising kernels (may take a few minutes the first time) - // 16-03 18:37:37 (debug) System is out of GPU memory - // 16-03 18:37:37 (debug) Refer to the Cycles GPU rendering documentation for possible solutions: - // 16-03 18:37:37 (debug) https://docs.blender.org/manual/en/latest/render/cycles/gpu_rendering.html - // 16-03 18:37:37 (debug) System is out of GPU memory - // 16-03 18:37:38 (debug) Fra:192 Mem:15831.01M (Peak 15831.18M) | Time:02:23.11 | Mem:7017.46M, Peak:7017.46M | Scene, ViewLayer | System is out of GPU memory - // 16-03 18:37:38 (debug) Error: System is out of GPU memory - // 16-03 18:37:40 (debug) Blender quit - // 16-03 18:37:40 (debug) end of rendering - return Error.Type.RENDERER_OUT_OF_VIDEO_MEMORY; - } - else if (line.contains("CUDA device supported only with compute capability") || line.contains("OPTIX device supported only with compute capability")) { - // found bundled python: /tmp/xx/2.73/python - // read blend: /tmp/xx/compute-method.blend - // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Sun - // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Plane - // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Cube - // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Camera - // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Initializing - // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Loading render kernels (may take a few minutes the first time) - // CUDA device supported only with compute capability 2.0 or up, found 1.2. - // Refer to the Cycles GPU rendering documentation for possible solutions: - // http://www.blender.org/manual/render/cycles/gpu_rendering.html - // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Error | CUDA device supported only with compute capability 2.0 or up, found 1.2. - // Error: CUDA device supported only with compute capability 2.0 or up, found 1.2. - // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Waiting for render to start - // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Cancel | CUDA device supported only with compute capability 2.0 or up, found 1.2. - // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) Sce: Scene Ve:0 Fa:0 La:0 - // Saved: /tmp/xx/0_0340.png Time: 00:00.12 (Saving: 00:00.03) - // Blender quit - return Type.GPU_NOT_SUPPORTED; - } - else if (line.contains("terminate called after throwing an instance of 'boost::filesystem::filesystem_error'")) { - // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.24 | Mem:1.64M, Peak:1.64M | Scene, RenderLayer | Updating Mesh | Computing attributes - // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.24 | Mem:1.64M, Peak:1.64M | Scene, RenderLayer | Updating Mesh | Copying Attributes to device - // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.24 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Building - // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.24 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Building BVH - // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.24 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Looking in BVH cache - // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.27 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Packing BVH triangles and strands - // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.27 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Packing BVH nodes - // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.27 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Writing BVH cache - // terminate called after throwing an instance of 'boost::filesystem::filesystem_error' - // what(): boost::filesystem::create_directory: Permission denied: "/var/local/cache" - return Error.Type.NOOUTPUTFILE; - } - else if (line.contains("terminate called after throwing an instance of 'std::bad_alloc'")) { - // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Mesh BVH Plane.083 171/2 | Building BVH - // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Mesh BVH Mesh 172/2 | Building BVH - // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Mesh BVH Mesh 172/2 | Packing BVH triangles and strands - // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Mesh BVH Mesh 172/2 | Packing BVH nodes - // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Scene BVH | Building - // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Scene BVH | Building BVH - // terminate called after throwing an instance of 'std::bad_alloc' - // what(): std::bad_alloc - return Error.Type.RENDERER_OUT_OF_MEMORY; - } - else if (line.contains("what(): std::bad_alloc")) { - // Fra:7 Mem:1247.01M (0.00M, Peak 1247.01M) | Time:00:28.84 | Mem:207.63M, Peak:207.63M | Scene, RenderLayer | Updating Scene BVH | Building BVH 93%, duplicates 0%terminate called recursively - // terminate called after throwing an instance of 'St9bad_alloc' - // what(): std::bad_alloc - // scandir: Cannot allocate memory - return Error.Type.RENDERER_OUT_OF_MEMORY; - } - else if (line.contains("Fatal Python error:")) { - // Fatal Python error: Py_Initialize: unable to load the file system codec - // ImportError: No module named 'encodings' - // Current thread 0x0000388c (most recent call first): - return Error.Type.RENDERER_CRASHED_PYTHON_ERROR; - } - else if (line.contains("Calloc returns null")) { - // Fra:1 Mem:976.60M (0.00M, Peak 1000.54M) | Time:00:01.34 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Left - // Calloc returns null: len=7186416 in CDMLoopUV, total 2145859048 - // Calloc returns null: len=7186416 in CDMLoopUV, total 2145859048 - // Malloc returns null: len=3190672 in CDMTexPoly, total 2149293176 - // Writing: /home/user/.sheepit/LEFT packed.crash.txt - return Error.Type.RENDERER_OUT_OF_MEMORY; - } - else if (line.contains("Malloc returns null")) { - // Fra:1 Mem:976.60M (0.00M, Peak 1000.54M) | Time:00:01.34 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Left - // Calloc returns null: len=7186416 in CDMLoopUV, total 2145859048 - // Calloc returns null: len=7186416 in CDMLoopUV, total 2145859048 - // Malloc returns null: len=3190672 in CDMTexPoly, total 2149293176 - // Writing: /home/user/.sheepit/LEFT packed.crash.txt - return Error.Type.RENDERER_OUT_OF_MEMORY; - } - else if (line.contains("Error: run out of memory!")) { - // 09-01 09:26:45 (debug) Fra:4 Mem:8444.44M (Peak 12092.10M) | Time:01:11.45 | Mem:6632.02M, Peak:6632.02M | Scene, ViewLayer | Updating Mesh | Tessellating Plane 1/1 - //09-01 09:27:30 (debug) Error: run out of memory! - //09-01 09:27:30 (debug) Fra:4 Mem:8444.44M (Peak 12092.10M) | Time:01:55.95 | Mem:6632.02M, Peak:6632.02M | Scene, ViewLayer | Sample 0/1024 - //09-01 09:27:30 (debug) Error: Out of memory - //09-01 09:27:30 (debug) Fra:4 Mem:8745.04M (Peak 12092.10M) | Time:01:55.97 | Mem:6632.03M, Peak:6632.03M | Scene, ViewLayer | Out of memory - //09-01 09:27:33 (debug) Blender quit - return Error.Type.RENDERER_OUT_OF_MEMORY; - } - else if (line.contains("CUDA kernel compilation failed") || line.contains("OPTIX kernel compilation failed")) { - // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.02 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Sun.001 - // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.02 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Sun.002 - // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.02 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Initializing - // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.02 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Loading render kernels (may take a few minutes the first time) - // nvcc fatal : Value 'sm_61' is not defined for option 'gpu-architecture' - // CUDA kernel compilation failed, see console for details. - // Refer to the Cycles GPU rendering documentation for possible solutions: - // http://www.blender.org/manual/render/cycles/gpu_rendering.html - // Compiling CUDA kernel ... - // "nvcc" -arch=sm_61 -m64 --cubin "/tmp/cache/c36db40aa5e59f5ea4ff139180353dbc/2.77/scripts/addons/cycles/kernel/kernels/cuda/kernel.cu" -o "/tmp/cache/cycles_kernel_sm61_079195D400571E023CC499D037AB6EE5.cubin" --ptxas-options="-v" --use_fast_math -I"/tmp/cache/c36db40aa5e59f5ea4ff139180353dbc/2.77/scripts/addons/cycles/kernel" -DNVCC -D__KERNEL_CUDA_VERSION__=75 - // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.08 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Error | CUDA kernel compilation failed, see console for details. - // Error: CUDA kernel compilation failed, see console for details. - // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.08 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Waiting for render to start - // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.08 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Cancel | CUDA kernel compilation failed, see console for details. - // Fra:1 Mem:147.74M (0.00M, Peak 378.15M) | Time:00:01.12 | Sce: Scene Ve:0 Fa:0 La:0 - // Saved: '/tmp/cache/8_0001.png' - return Error.Type.GPU_NOT_SUPPORTED; - } - else if (line.contains("Engine 'CYCLES' not available for scene") || line.contains("Engine 'BLENDER_EEVEE' not available for scene") || line.contains("Engine 'BLENDER_WORKBENCH' not available for scene") || line.contains("Engine 'HYDRA_STORM' not available for scene")) { - return Error.Type.ENGINE_NOT_AVAILABLE; - } - else if (line.contains("Warning: Cycles is not enabled!")) { - return Error.Type.ENGINE_NOT_AVAILABLE; - } - else if (line.contains("OpenImageDenoise error: SSE4.1 support is required at minimum") || line.contains("OpenImageDenoiser is not supported on this CPU:") || line.contains("OpenImageDenoise is not supported on this CPU:") || line.contains("No device available to denoise on")) { - //OpenImageDenoiser is Blender pre 4.2 - //OpenImageDenoise after Blender 4.2 - - // denoising capability detection - // Fra:201 Mem:8.89M (Peak 10.09M) | Time:00:00.04 | Mem:0.27M, Peak:0.27M | Scene, View Layer | Updating Device | Writing constant memory - // Fra:201 Mem:8.89M (Peak 10.09M) | Time:00:00.04 | Mem:0.27M, Peak:0.27M | Scene, View Layer | Loading denoising kernels (may take a few minutes the first time) - // Fra:201 Mem:8.89M (Peak 10.09M) | Time:00:00.04 | Mem:0.27M, Peak:0.27M | Scene, View Layer | Sample 0/16 - // Fra:201 Mem:127.55M (Peak 127.55M) | Time:00:00.65 | Remaining:00:09.13 | Mem:118.92M, Peak:118.92M | Scene, View Layer | Sample 1/16 - // E0308 1719 31449 denoiser_oidn.cpp:197] OpenImageDenoise error: SSE4.1 support is required at minimum - // Fra:201 Mem:198.74M (Peak 301.58M) | Time:00:08.74 | Mem:118.92M, Peak:118.92M | Scene, View Layer | Sample 16/16 - // Rendering done - // Fra:201 Mem:198.74M (Peak 301.58M) | Time:00:08.74 | Mem:118.92M, Peak:118.92M | Scene, View Layer | Finished - // Saved: '/tmp/5/sheepit/1541_0201.png' - // Time: 00:09.30 (Saving: 00:00.55) - // Blender quit - return Error.Type.DENOISING_NOT_SUPPORTED; - } - else if (line.contains("Error: File format is not supported")) { - //09-03 23:36:03 (debug) Blender 2.83.19 (hash 86c526d2c733 built 2022-02-02 00:44:40) - //09-03 23:36:03 (debug) found bundled python: C:\Users\Username\Documents\sheepit\sheepit\f1f9e587201b428c9416faf614b677bf\2.83\python - //09-03 23:36:03 (debug) Error: File format is not supported in file 'C:\Users\Username\Documents\sheepit\sheepit\686c6bdbf752790b28c1b21180aa5db5\correndo4.blend' - //09-03 23:36:03 (debug) Blender quit - //09-03 23:36:03 (debug) end of rendering - return Error.Type.RENDERER_CRASHED; - } - else if (line.contains("Unable to open a display") || line.contains("Managed to successfully fallback to surfaceless EGL rendering!") || line.contains("Couldn't open libEGL")) { - //17-03 07:38:47 (debug) Fra:7 Mem:1667.27M (Peak 1762.19M) | Time:06:27.86 | Mem:1184.92M, Peak:1194.58M | Scene, ViewLayer | Sample 187/187 - //17-03 07:38:47 (debug) Fra:7 Mem:1667.27M (Peak 1762.19M) | Time:06:27.86 | Mem:1184.92M, Peak:1194.58M | Scene, ViewLayer | Finished - //17-03 07:38:47 (debug) Unable to open a display - //17-03 07:38:47 (debug) end of rendering - //17-03 07:38:47 (error) Job::render no picture file found (after finished render (filename_without_extension 116372253_0007) - return Error.Type.CURRENTLY_HEADLESS; - } - else if (line.contains("Error: Cannot read file") || line.contains("Error: Failed to read blend file")) { - //14-10 11:03:21 (debug) Blender 3.1.0 (hash c77597cd0e15 built 2022-03-09 00:44:13) - //14-10 11:03:21 (debug) Error: Cannot read file 'C:\SheepIT\sheepit\ef925644a319c5ad604ebc077769bcb8\Passeio Virtual FINAL.blend': No such file or directory - //14-10 11:03:21 (debug) Blender quit - return Error.Type.CANNOT_READ_FILE; - } - else if (line.contains("DETECT_DEVICE_ERROR")) { - //./blender-3.3.2-linux-x64/blender -b -E CYCLES -P /mnt/d/sheep_gpu/set_gpu.py -f 1 - //Blender 3.3.2 (hash bf24652e38a2 built 2022-12-07 01:12:36) - //Read prefs: /home/raimund/.config/blender/3.3/config/userpref.blend - ///run/user/1000/gvfs/ non-existent directory - //DETECT_DEVICE_ERRORR: Couldn't find OPTIX device with id CUDA_NVIDIA GeForce GTX 1080_0000:01:00_OptiX - return Error.Type.DETECT_DEVICE_ERROR; - } - - return Type.OK; - } - private void maybeCleanWorkingDir(Type error) { boolean cleanup = Type.COLOR_MANAGEMENT_ERROR == error || Type.RENDERER_CRASHED_PYTHON_ERROR == error diff --git a/src/main/java/com/sheepit/client/RenderOutput.java b/src/main/java/com/sheepit/client/RenderOutput.java new file mode 100644 index 0000000..88e715d --- /dev/null +++ b/src/main/java/com/sheepit/client/RenderOutput.java @@ -0,0 +1,307 @@ +/* + * Copyright (C) 2024 Laurent CLOUET + * Author Laurent CLOUET + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package com.sheepit.client; + +import lombok.Data; + +/** + * Track the output of the render + * like image, preview, ... + */ +@Data public class RenderOutput { + private String fullImagePath = null; + private String previewImagePath = null; + private long fullImageSize = 0; + private float speedSamplesRendered = 0; // only used for powerdetection project + + private String blenderShortVersion; + private String blenderLongVersion; + + public Error.Type detectError(String line) { + + if (line.contains("version `GLIBC_2.28' not found")) { + // 07-04 07:43:12 (debug) renderer output + // 07-04 07:43:12 (debug) /tmp///rend.exe: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /tmp///rend.exe) + // 07-04 07:43:12 (debug) /tmp///rend.exe: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /tmp///lib/libboost_filesystem.so.1.80.0) + return Error.Type.OS_NOT_SUPPORTED; + } + else if (line.contains("Color management:")) { + String[] errors = { + " not found", + " is not compatible ", + " Error could not find role", + " Error, could not find role", + "using fallback mode", + " Error, could not find any displays", + " Error, could not find any views", + " Failed to load bundled config" + }; + + for (var error : errors) { + if (line.contains(error)) { + + //30-11 01:16:57 (debug) Blender 4.0.0 (hash 878f71061b8e built 2023-11-14 01:20:37) + //30-11 01:16:57 (debug) Color management: display "sRGB" used by scene not found, setting to default ("Blender"). + //30-11 01:16:57 (debug) Color management: scene view "AgX" not found, setting default "Standard". + //30-11 01:16:57 (debug) Read blend: "C:\Users\tianji\AppData\Local\Temp\farm_3210908783605063546\254263927\Car Scene 3.blend" + //30-11 01:16:57 (debug) Color management: display "sRGB" used by scene not found, setting to default ("Blender"). + //30-11 01:16:57 (debug) Color management: scene view "AgX" not found, setting default "Standard". + //30-11 01:16:57 (debug) Color management: scene look "AgX - Medium High Contrast" not found, setting default "None". + //30-11 01:16:57 (debug) Color management: image colorspace "Linear Rec.709" not found, will use default instead. + return Error.Type.COLOR_MANAGEMENT_ERROR; + } + } + } + else if (line.contains("OpenColorIO Error:")) { + //28-11 12:43:40 (debug) Fra:340 Mem:11.74M (Peak 28.28M) | Time:00:01.69 | Compositing | Tile 1-1 + //28-11 12:43:40 (debug) Fra:340 Mem:11.68M (Peak 28.28M) | Time:00:01.69 | Compositing | De-initializing execution + //28-11 12:43:40 (debug) OpenColorIO Error: The specified file reference 'srgb_inv.spi1d' could not be located. The following attempts were made: 'E:\SheepIt\sheepit\6b752e00cd23e1789e00285310cb6845\3.6\datafiles\colormanagement\luts\srgb_inv.spi1d' : 'E:\SheepIt\sheepit\6b752e00cd23e1789e00285310cb6845\3.6\datafiles\colormanagement\filmic\srgb_inv.spi1d'. + //28-11 12:43:40 (debug) Saved: 'E:\SheepIt\sheepit\1_0340.png' + return Error.Type.COLOR_MANAGEMENT_ERROR; + } + else if (line.contains("CUDA error: Out of memory")) { + // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Mem:470.26M, Peak:470.26M | Scene, RenderLayer | Updating Device | Writing constant memory + // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Mem:470.26M, Peak:470.26M | Scene, RenderLayer | Path Tracing Tile 0/135, Sample 0/200 + // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Mem:470.82M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 1/135, Sample 0/200 + // CUDA error: Out of memory in cuLaunchKernel(cuPathTrace, xblocks , yblocks, 1, xthreads, ythreads, 1, 0, 0, args, 0) + // Refer to the Cycles GPU rendering documentation for possible solutions: + // http://www.blender.org/manual/render/cycles/gpu_rendering.html + // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Remaining:09:26.57 | Mem:470.26M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 1/135, Sample 200/200 + // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Remaining:00:00.06 | Mem:470.50M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 134/135, Sample 0/200 + // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Remaining:00:00.03 | Mem:470.26M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 134/135, Sample 200/200 + // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Remaining:00:00.03 | Mem:470.50M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 135/135, Sample 0/200 + // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Mem:470.26M, Peak:470.82M | Scene, RenderLayer | Path Tracing Tile 135/135, Sample 200/200 + // Error: CUDA error: Out of memory in cuLaunchKernel(cuPathTrace, xblocks , yblocks, 1, xthreads, ythreads, 1, 0, 0, args, 0) + // Fra:151 Mem:405.91M (0.00M, Peak 633.81M) | Mem:470.26M, Peak:470.82M | Scene, RenderLayer | Cancel | CUDA error: Out of memory in cuLaunchKernel(cuPathTrace, xblocks , yblocks, 1, xthreads, ythreads, 1, 0, 0, args, 0) + // Fra:151 Mem:405.89M (0.00M, Peak 633.81M) Sce: Scene Ve:0 Fa:0 La:0 + // Saved: /tmp/xx/26885_0151.png Time: 00:04.67 (Saving: 00:00.22) + // Blender quit + return Error.Type.RENDERER_OUT_OF_VIDEO_MEMORY; + } + else if (line.contains("CUDA error at cuCtxCreate: Out of memory")) { + // renderer output + // CUDA error at cuCtxCreate: Out of memory + // Refer to the Cycles GPU rendering documentation for possible solutions: + // http://www.blender.org/manual/render/cycles/gpu_rendering.html + // found bundled python: /tmp/aaaa/bbbb/2.78/python + // read blend: /tmp/aaaa/bbbb/compute-method.blend + // Fra:340 Mem:7.25M (0.00M, Peak 7.25M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Sun + // Fra:340 Mem:7.25M (0.00M, Peak 7.25M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Plane + // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Cube + // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Camera + // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Initializing + // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Loading render kernels (may take a few minutes the first time) + // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Error | CUDA error at cuCtxCreate: Out of memory + // Error: CUDA error at cuCtxCreate: Out of memory + // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Waiting for render to start + // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Cancel | CUDA error at cuCtxCreate: Out of memory + // CUDA error: Invalid value in cuCtxDestroy(cuContext) + // Fra:340 Mem:7.25M (0.00M, Peak 7.26M) | Time:00:00.13 | Sce: Scene Ve:0 Fa:0 La:0 + // Blender quit + // end of rendering + return Error.Type.RENDERER_OUT_OF_VIDEO_MEMORY; + } + else if (line.contains("Error: Out of memory in CUDA") || line.contains("Error: Out of memory in OPTIX")) { + // 15-03 21:13:45 (debug) Fra:27 Mem:8441.68M (Peak 9675.81M) | Time:00:16.27 | Mem:8411.20M, Peak:8411.20M | Scene, View Layer | Loading render kernels (may take a few minutes the first time) + // 15-03 21:13:45 (debug) Out of memory in CUDA queue enqueue (integrator_shade_surface) + // 15-03 21:13:45 (debug) Refer to the Cycles GPU rendering documentation for possible solutions: + // 15-03 21:13:45 (debug) https://docs.blender.org/manual/en/latest/render/cycles/gpu_rendering.html + // 15-03 21:13:45 (debug) Fra:27 Mem:8441.68M (Peak 9675.81M) | Time:00:16.38 | Mem:8411.27M, Peak:8411.27M | Scene, View Layer | Updating Scene + // 15-03 21:13:45 (debug) Fra:27 Mem:8441.68M (Peak 9675.81M) | Time:00:16.38 | Mem:8411.27M, Peak:8411.27M | Scene, View Layer | Updating Shaders + // 15-03 21:13:45 (debug) Fra:27 Mem:8447.08M (Peak 9675.81M) | Time:00:16.63 | Mem:8763.00M, Peak:8763.00M | Scene, View Layer | Out of memory in CUDA queue enqueue (integrator_shade_surface) + // 15-03 21:13:45 (debug) Error: Out of memory in CUDA queue enqueue (integrator_shade_surface) + // 15-03 21:13:46 (debug) Blender quit + return Error.Type.RENDERER_OUT_OF_VIDEO_MEMORY; + } + else if (line.contains("CUDA error: Launch exceeded timeout in") || line.contains("CUDA error: Invalid value in cuTexRefSetAddress(") || line.contains("CUDA error: Launch failed in cuCtxSynchronize()") || line.contains("CUDA error: Illegal address in cuCtxSynchronize()")) { + return Error.Type.GPU_OR_DRIVER_ERROR; + } + else if (line.contains("System is out of GPU memory")) { + // 16-03 18:37:37 (debug) Fra:192 Mem:15826.70M (Peak 15831.18M) | Time:02:21.86 | Mem:6622.87M, Peak:6625.35M | Scene, ViewLayer | Loading denoising kernels (may take a few minutes the first time) + // 16-03 18:37:37 (debug) System is out of GPU memory + // 16-03 18:37:37 (debug) Refer to the Cycles GPU rendering documentation for possible solutions: + // 16-03 18:37:37 (debug) https://docs.blender.org/manual/en/latest/render/cycles/gpu_rendering.html + // 16-03 18:37:37 (debug) System is out of GPU memory + // 16-03 18:37:38 (debug) Fra:192 Mem:15831.01M (Peak 15831.18M) | Time:02:23.11 | Mem:7017.46M, Peak:7017.46M | Scene, ViewLayer | System is out of GPU memory + // 16-03 18:37:38 (debug) Error: System is out of GPU memory + // 16-03 18:37:40 (debug) Blender quit + // 16-03 18:37:40 (debug) end of rendering + return Error.Type.RENDERER_OUT_OF_VIDEO_MEMORY; + } + else if (line.contains("CUDA device supported only with compute capability") || line.contains("OPTIX device supported only with compute capability")) { + // found bundled python: /tmp/xx/2.73/python + // read blend: /tmp/xx/compute-method.blend + // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Sun + // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Plane + // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Cube + // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Camera + // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Initializing + // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Loading render kernels (may take a few minutes the first time) + // CUDA device supported only with compute capability 2.0 or up, found 1.2. + // Refer to the Cycles GPU rendering documentation for possible solutions: + // http://www.blender.org/manual/render/cycles/gpu_rendering.html + // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Error | CUDA device supported only with compute capability 2.0 or up, found 1.2. + // Error: CUDA device supported only with compute capability 2.0 or up, found 1.2. + // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Waiting for render to start + // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Cancel | CUDA device supported only with compute capability 2.0 or up, found 1.2. + // Fra:340 Mem:7.64M (0.00M, Peak 8.23M) Sce: Scene Ve:0 Fa:0 La:0 + // Saved: /tmp/xx/0_0340.png Time: 00:00.12 (Saving: 00:00.03) + // Blender quit + return Error.Type.GPU_NOT_SUPPORTED; + } + else if (line.contains("terminate called after throwing an instance of 'boost::filesystem::filesystem_error'")) { + // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.24 | Mem:1.64M, Peak:1.64M | Scene, RenderLayer | Updating Mesh | Computing attributes + // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.24 | Mem:1.64M, Peak:1.64M | Scene, RenderLayer | Updating Mesh | Copying Attributes to device + // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.24 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Building + // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.24 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Building BVH + // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.24 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Looking in BVH cache + // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.27 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Packing BVH triangles and strands + // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.27 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Packing BVH nodes + // Fra:2103 Mem:29.54M (0.00M, Peak 29.54M) | Time:00:00.27 | Mem:1.97M, Peak:1.97M | Scene, RenderLayer | Updating Scene BVH | Writing BVH cache + // terminate called after throwing an instance of 'boost::filesystem::filesystem_error' + // what(): boost::filesystem::create_directory: Permission denied: "/var/local/cache" + return Error.Type.NOOUTPUTFILE; + } + else if (line.contains("terminate called after throwing an instance of 'std::bad_alloc'")) { + // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Mesh BVH Plane.083 171/2 | Building BVH + // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Mesh BVH Mesh 172/2 | Building BVH + // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Mesh BVH Mesh 172/2 | Packing BVH triangles and strands + // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Mesh BVH Mesh 172/2 | Packing BVH nodes + // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Scene BVH | Building + // Fra:80 Mem:1333.02M (0.00M, Peak 1651.23M) | Mem:780.37M, Peak:780.37M | Scene, RenderLayer | Updating Scene BVH | Building BVH + // terminate called after throwing an instance of 'std::bad_alloc' + // what(): std::bad_alloc + return Error.Type.RENDERER_OUT_OF_MEMORY; + } + else if (line.contains("what(): std::bad_alloc")) { + // Fra:7 Mem:1247.01M (0.00M, Peak 1247.01M) | Time:00:28.84 | Mem:207.63M, Peak:207.63M | Scene, RenderLayer | Updating Scene BVH | Building BVH 93%, duplicates 0%terminate called recursively + // terminate called after throwing an instance of 'St9bad_alloc' + // what(): std::bad_alloc + // scandir: Cannot allocate memory + return Error.Type.RENDERER_OUT_OF_MEMORY; + } + else if (line.contains("Fatal Python error:")) { + // Fatal Python error: Py_Initialize: unable to load the file system codec + // ImportError: No module named 'encodings' + // Current thread 0x0000388c (most recent call first): + return Error.Type.RENDERER_CRASHED_PYTHON_ERROR; + } + else if (line.contains("Calloc returns null")) { + // Fra:1 Mem:976.60M (0.00M, Peak 1000.54M) | Time:00:01.34 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Left + // Calloc returns null: len=7186416 in CDMLoopUV, total 2145859048 + // Calloc returns null: len=7186416 in CDMLoopUV, total 2145859048 + // Malloc returns null: len=3190672 in CDMTexPoly, total 2149293176 + // Writing: /home/user/.sheepit/LEFT packed.crash.txt + return Error.Type.RENDERER_OUT_OF_MEMORY; + } + else if (line.contains("Malloc returns null")) { + // Fra:1 Mem:976.60M (0.00M, Peak 1000.54M) | Time:00:01.34 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Left + // Calloc returns null: len=7186416 in CDMLoopUV, total 2145859048 + // Calloc returns null: len=7186416 in CDMLoopUV, total 2145859048 + // Malloc returns null: len=3190672 in CDMTexPoly, total 2149293176 + // Writing: /home/user/.sheepit/LEFT packed.crash.txt + return Error.Type.RENDERER_OUT_OF_MEMORY; + } + else if (line.contains("Error: run out of memory!")) { + // 09-01 09:26:45 (debug) Fra:4 Mem:8444.44M (Peak 12092.10M) | Time:01:11.45 | Mem:6632.02M, Peak:6632.02M | Scene, ViewLayer | Updating Mesh | Tessellating Plane 1/1 + //09-01 09:27:30 (debug) Error: run out of memory! + //09-01 09:27:30 (debug) Fra:4 Mem:8444.44M (Peak 12092.10M) | Time:01:55.95 | Mem:6632.02M, Peak:6632.02M | Scene, ViewLayer | Sample 0/1024 + //09-01 09:27:30 (debug) Error: Out of memory + //09-01 09:27:30 (debug) Fra:4 Mem:8745.04M (Peak 12092.10M) | Time:01:55.97 | Mem:6632.03M, Peak:6632.03M | Scene, ViewLayer | Out of memory + //09-01 09:27:33 (debug) Blender quit + return Error.Type.RENDERER_OUT_OF_MEMORY; + } + else if (line.contains("CUDA kernel compilation failed") || line.contains("OPTIX kernel compilation failed")) { + // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.02 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Sun.001 + // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.02 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Synchronizing object | Sun.002 + // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.02 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Initializing + // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.02 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Loading render kernels (may take a few minutes the first time) + // nvcc fatal : Value 'sm_61' is not defined for option 'gpu-architecture' + // CUDA kernel compilation failed, see console for details. + // Refer to the Cycles GPU rendering documentation for possible solutions: + // http://www.blender.org/manual/render/cycles/gpu_rendering.html + // Compiling CUDA kernel ... + // "nvcc" -arch=sm_61 -m64 --cubin "/tmp/cache/c36db40aa5e59f5ea4ff139180353dbc/2.77/scripts/addons/cycles/kernel/kernels/cuda/kernel.cu" -o "/tmp/cache/cycles_kernel_sm61_079195D400571E023CC499D037AB6EE5.cubin" --ptxas-options="-v" --use_fast_math -I"/tmp/cache/c36db40aa5e59f5ea4ff139180353dbc/2.77/scripts/addons/cycles/kernel" -DNVCC -D__KERNEL_CUDA_VERSION__=75 + // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.08 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Error | CUDA kernel compilation failed, see console for details. + // Error: CUDA kernel compilation failed, see console for details. + // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.08 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Waiting for render to start + // Fra:1 Mem:200.70M (0.00M, Peak 378.15M) | Time:00:01.08 | Mem:0.00M, Peak:0.00M | Scene, RenderLayer | Cancel | CUDA kernel compilation failed, see console for details. + // Fra:1 Mem:147.74M (0.00M, Peak 378.15M) | Time:00:01.12 | Sce: Scene Ve:0 Fa:0 La:0 + // Saved: '/tmp/cache/8_0001.png' + return Error.Type.GPU_NOT_SUPPORTED; + } + else if (line.contains("Engine 'CYCLES' not available for scene") || line.contains("Engine 'BLENDER_EEVEE' not available for scene") || line.contains("Engine 'BLENDER_WORKBENCH' not available for scene") || line.contains("Engine 'HYDRA_STORM' not available for scene")) { + return Error.Type.ENGINE_NOT_AVAILABLE; + } + else if (line.contains("Warning: Cycles is not enabled!")) { + return Error.Type.ENGINE_NOT_AVAILABLE; + } + else if (line.contains("OpenImageDenoise error: SSE4.1 support is required at minimum") || line.contains("OpenImageDenoiser is not supported on this CPU:") || line.contains("OpenImageDenoise is not supported on this CPU:") || line.contains("No device available to denoise on")) { + //OpenImageDenoiser is Blender pre 4.2 + //OpenImageDenoise after Blender 4.2 + + // denoising capability detection + // Fra:201 Mem:8.89M (Peak 10.09M) | Time:00:00.04 | Mem:0.27M, Peak:0.27M | Scene, View Layer | Updating Device | Writing constant memory + // Fra:201 Mem:8.89M (Peak 10.09M) | Time:00:00.04 | Mem:0.27M, Peak:0.27M | Scene, View Layer | Loading denoising kernels (may take a few minutes the first time) + // Fra:201 Mem:8.89M (Peak 10.09M) | Time:00:00.04 | Mem:0.27M, Peak:0.27M | Scene, View Layer | Sample 0/16 + // Fra:201 Mem:127.55M (Peak 127.55M) | Time:00:00.65 | Remaining:00:09.13 | Mem:118.92M, Peak:118.92M | Scene, View Layer | Sample 1/16 + // E0308 1719 31449 denoiser_oidn.cpp:197] OpenImageDenoise error: SSE4.1 support is required at minimum + // Fra:201 Mem:198.74M (Peak 301.58M) | Time:00:08.74 | Mem:118.92M, Peak:118.92M | Scene, View Layer | Sample 16/16 + // Rendering done + // Fra:201 Mem:198.74M (Peak 301.58M) | Time:00:08.74 | Mem:118.92M, Peak:118.92M | Scene, View Layer | Finished + // Saved: '/tmp/5/sheepit/1541_0201.png' + // Time: 00:09.30 (Saving: 00:00.55) + // Blender quit + return Error.Type.DENOISING_NOT_SUPPORTED; + } + else if (line.contains("Error: File format is not supported")) { + //09-03 23:36:03 (debug) Blender 2.83.19 (hash 86c526d2c733 built 2022-02-02 00:44:40) + //09-03 23:36:03 (debug) found bundled python: C:\Users\Username\Documents\sheepit\sheepit\f1f9e587201b428c9416faf614b677bf\2.83\python + //09-03 23:36:03 (debug) Error: File format is not supported in file 'C:\Users\Username\Documents\sheepit\sheepit\686c6bdbf752790b28c1b21180aa5db5\correndo4.blend' + //09-03 23:36:03 (debug) Blender quit + //09-03 23:36:03 (debug) end of rendering + return Error.Type.RENDERER_CRASHED; + } + else if (line.contains("Unable to open a display") || line.contains("Managed to successfully fallback to surfaceless EGL rendering!") || line.contains("Couldn't open libEGL")) { + //17-03 07:38:47 (debug) Fra:7 Mem:1667.27M (Peak 1762.19M) | Time:06:27.86 | Mem:1184.92M, Peak:1194.58M | Scene, ViewLayer | Sample 187/187 + //17-03 07:38:47 (debug) Fra:7 Mem:1667.27M (Peak 1762.19M) | Time:06:27.86 | Mem:1184.92M, Peak:1194.58M | Scene, ViewLayer | Finished + //17-03 07:38:47 (debug) Unable to open a display + //17-03 07:38:47 (debug) end of rendering + //17-03 07:38:47 (error) Job::render no picture file found (after finished render (filename_without_extension 116372253_0007) + return Error.Type.CURRENTLY_HEADLESS; + } + else if (line.contains("Error: Cannot read file") || line.contains("Error: Failed to read blend file")) { + //14-10 11:03:21 (debug) Blender 3.1.0 (hash c77597cd0e15 built 2022-03-09 00:44:13) + //14-10 11:03:21 (debug) Error: Cannot read file 'C:\SheepIT\sheepit\ef925644a319c5ad604ebc077769bcb8\Passeio Virtual FINAL.blend': No such file or directory + //14-10 11:03:21 (debug) Blender quit + return Error.Type.CANNOT_READ_FILE; + } + else if (line.contains("DETECT_DEVICE_ERROR")) { + //./blender-3.3.2-linux-x64/blender -b -E CYCLES -P /mnt/d/sheep_gpu/set_gpu.py -f 1 + //Blender 3.3.2 (hash bf24652e38a2 built 2022-12-07 01:12:36) + //Read prefs: /home/raimund/.config/blender/3.3/config/userpref.blend + ///run/user/1000/gvfs/ non-existent directory + //DETECT_DEVICE_ERRORR: Couldn't find OPTIX device with id CUDA_NVIDIA GeForce GTX 1080_0000:01:00_OptiX + return Error.Type.DETECT_DEVICE_ERROR; + } + + return Error.Type.OK; + } +} diff --git a/src/main/java/com/sheepit/client/RenderSettings.java b/src/main/java/com/sheepit/client/RenderSettings.java new file mode 100644 index 0000000..a9227b2 --- /dev/null +++ b/src/main/java/com/sheepit/client/RenderSettings.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2024 Laurent CLOUET + * Author Laurent CLOUET + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package com.sheepit.client; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * Settings of a render (command, use gpu,...) + */ +@Data @AllArgsConstructor public class RenderSettings { + public static final String UPDATE_METHOD_BY_REMAINING_TIME = "remainingtime"; + public static final String UPDATE_METHOD_BY_TILE = "by_tile"; + + + private String frameNumber; + private String script; + private String path; // path inside the archive + private String command; + private boolean useGPU; + private String updateRenderingStatusMethod; +} diff --git a/src/main/java/com/sheepit/client/RenderState.java b/src/main/java/com/sheepit/client/RenderState.java new file mode 100644 index 0000000..911a022 --- /dev/null +++ b/src/main/java/com/sheepit/client/RenderState.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2024 Laurent CLOUET + * Author Laurent CLOUET + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; version 2 + * of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package com.sheepit.client; + +import lombok.Data; + +/** + * Track if the render ask been cancel, is finished... + */ +@Data public class RenderState { + private boolean askForRendererKill = false; + private boolean userBlock = false; + private boolean serverBlock = false; + private boolean incompatibleProcessKill = false; + + public void setBlockIncompatibleProcess() { + setAskForRendererKill(true); + setIncompatibleProcessKill(true); + } + + public void setBlock() { + setAskForRendererKill(true); + setUserBlock(true); + } +} diff --git a/src/main/java/com/sheepit/client/Server.java b/src/main/java/com/sheepit/client/Server.java index a6f487d..5640715 100644 --- a/src/main/java/com/sheepit/client/Server.java +++ b/src/main/java/com/sheepit/client/Server.java @@ -132,7 +132,7 @@ public class Server extends Thread { if (this.client != null && this.client.getRenderingJob() != null) { Job job = this.client.getRenderingJob(); - urlBuilder.addQueryParameter("frame", job.getFrameNumber()).addQueryParameter("job", job.getId()); + urlBuilder.addQueryParameter("frame", job.getRenderSettings().getFrameNumber()).addQueryParameter("job", job.getId()); RenderProcess process = job.getProcessRender(); if (process != null) { @@ -153,10 +153,10 @@ public class Server extends Thread { this.log.debug("Server::stayAlive server asked to kill local render process"); // kill the current process, it will generate an error but it's okay if (this.client != null && this.client.getRenderingJob() != null) { - this.client.getRenderingJob().setServerBlockJob(true); + this.client.getRenderingJob().getRenderState().setServerBlock(true); if (this.client.getRenderingJob().getProcessRender().getProcess() != null) { - this.client.getRenderingJob().setAskForRendererKill(true); + this.client.getRenderingJob().getRenderState().setAskForRendererKill(true); this.client.getRenderingJob().getProcessRender().kill(); } } @@ -522,10 +522,10 @@ public class Server extends Thread { LocalDateTime startRequestTime = LocalDateTime.now(); while ((len = is.read(buffer)) != -1) { - if (this.client.getRenderingJob().isServerBlockJob()) { + if (this.client.getRenderingJob().getRenderState().isServerBlock()) { return Error.Type.RENDERER_KILLED_BY_SERVER; } - else if (this.client.getRenderingJob().isUserBlockJob()) { + else if (this.client.getRenderingJob().getRenderState().isUserBlock()) { return Error.Type.RENDERER_KILLED_BY_USER; } diff --git a/src/main/java/com/sheepit/client/standalone/swing/activity/Working.java b/src/main/java/com/sheepit/client/standalone/swing/activity/Working.java index 7fe7409..94319db 100644 --- a/src/main/java/com/sheepit/client/standalone/swing/activity/Working.java +++ b/src/main/java/com/sheepit/client/standalone/swing/activity/Working.java @@ -410,13 +410,13 @@ public class Working implements Activity { else { String path = null; try { - boolean hasPreview = lastJob.getPreviewImagePath() != null; + boolean hasPreview = lastJob.getRenderOutput().getPreviewImagePath() != null; if (hasPreview) { - path = lastJob.getPreviewImagePath(); + path = lastJob.getRenderOutput().getPreviewImagePath(); } else { - path = lastJob.getOutputImagePath(); + path = lastJob.getRenderOutput().getFullImagePath(); } BufferedImage img = ImageIO.read(new File(path));