mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-08 20:28:32 +09:00
[Fix] (ci): harden Android trace replay CI
This commit is contained in:
@@ -4,7 +4,9 @@
|
||||
#include <android/native_window_jni.h>
|
||||
#include <jni.h>
|
||||
|
||||
#include <exception>
|
||||
#include <string>
|
||||
#include <sys/stat.h>
|
||||
|
||||
extern "C" void mobilegl_trace_set_native_window(ANativeWindow *window);
|
||||
extern "C" void mobilegl_trace_set_requested_size(int width, int height);
|
||||
@@ -46,6 +48,35 @@ jobject MakeResult(JNIEnv* env, const mobilegl_trace::Result& result) {
|
||||
return object;
|
||||
}
|
||||
|
||||
void EnsureDirectory(const std::string& path) {
|
||||
if (!path.empty()) {
|
||||
mkdir(path.c_str(), 0775);
|
||||
}
|
||||
}
|
||||
|
||||
mobilegl_trace::Result MakeFailureResult(const mobilegl_trace::Request& request,
|
||||
int statusCode,
|
||||
const std::string& message) {
|
||||
mobilegl_trace::Result result;
|
||||
result.statusCode = statusCode;
|
||||
result.message = message;
|
||||
if (!request.outputDir.empty()) {
|
||||
EnsureDirectory(request.outputDir);
|
||||
result.resultPath = request.outputDir + "/result.json";
|
||||
result.actualPath = request.outputDir + "/actual.png";
|
||||
}
|
||||
result.diffPath = request.diffPath;
|
||||
return result;
|
||||
}
|
||||
|
||||
class ScopedTraceReplayState {
|
||||
public:
|
||||
~ScopedTraceReplayState() {
|
||||
mobilegl_trace_set_native_window(nullptr);
|
||||
mobilegl_trace_set_requested_size(0, 0);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
extern "C" JNIEXPORT jobject JNICALL
|
||||
@@ -89,6 +120,7 @@ Java_top_mobilegl_plugin_trace_TraceReplayActivity_nativeRunTraceReplay(JNIEnv*
|
||||
request.cropHeight = cropHeight;
|
||||
request.fuzzPercent = fuzzPercent;
|
||||
|
||||
ScopedTraceReplayState replayState;
|
||||
mobilegl_trace_set_requested_size(request.width, request.height);
|
||||
const bool needsNativeWindow = request.backend == "DirectVulkan";
|
||||
ANativeWindow *window = needsNativeWindow && surface != nullptr ? ANativeWindow_fromSurface(env, surface) : nullptr;
|
||||
@@ -97,9 +129,19 @@ Java_top_mobilegl_plugin_trace_TraceReplayActivity_nativeRunTraceReplay(JNIEnv*
|
||||
ANativeWindow_release(window);
|
||||
}
|
||||
|
||||
mobilegl_trace::Result result = mobilegl_trace::RunTraceReplay(request);
|
||||
mobilegl_trace_set_native_window(nullptr);
|
||||
mobilegl_trace_set_requested_size(0, 0);
|
||||
mobilegl_trace::Result result;
|
||||
try {
|
||||
result = mobilegl_trace::RunTraceReplay(request);
|
||||
} catch (const std::exception& exception) {
|
||||
result = MakeFailureResult(request,
|
||||
mobilegl_trace::STATUS_RETRACE_FAILED,
|
||||
"trace replay failed with unhandled native exception: " +
|
||||
std::string(exception.what()));
|
||||
} catch (...) {
|
||||
result = MakeFailureResult(request,
|
||||
mobilegl_trace::STATUS_RETRACE_FAILED,
|
||||
"trace replay failed with unknown native exception");
|
||||
}
|
||||
if (!result.resultPath.empty()) {
|
||||
mobilegl_trace::WriteResultJson(request, result);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user