mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-09 20:58:31 +09:00
[Fix, Test] (DirectVulkan, SelfTest, MG_IntegrationTest, TraceReplay): snapshot sampler/image feedback and add Program 203 diagnostics
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -223,7 +223,8 @@ target_include_directories(glretrace_common PUBLIC
|
||||
"${APITRACE_GENERATED_DIR}"
|
||||
"${APITRACE_ROOT}/dispatch"
|
||||
"${APITRACE_ROOT}/helpers"
|
||||
"${APITRACE_ROOT}/retrace")
|
||||
"${APITRACE_ROOT}/retrace"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/../../../../../tools/trace_replay")
|
||||
target_compile_definitions(glretrace_common PRIVATE
|
||||
main=mobilegl_apitrace_main)
|
||||
target_redirect_exit(glretrace_common)
|
||||
@@ -231,14 +232,16 @@ target_link_libraries(glretrace_common PUBLIC retrace_common glhelpers glproc)
|
||||
|
||||
add_library(trace_replay_runner SHARED
|
||||
trace_replay_core.cpp
|
||||
trace_replay_jni.cpp)
|
||||
trace_replay_jni.cpp
|
||||
"${CMAKE_CURRENT_LIST_DIR}/../../../../../tools/trace_replay/apitrace_fbo_dump.cpp")
|
||||
|
||||
target_compile_features(trace_replay_runner PRIVATE cxx_std_17)
|
||||
target_compile_definitions(trace_replay_runner PRIVATE
|
||||
MOBILEGL_APITRACE_RETRACE_MAIN=mobilegl_apitrace_main)
|
||||
|
||||
target_include_directories(trace_replay_runner PRIVATE
|
||||
"${APITRACE_ROOT}/lib/image")
|
||||
"${APITRACE_ROOT}/lib/image"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/../../../../../tools/trace_replay")
|
||||
|
||||
target_link_libraries(trace_replay_runner
|
||||
glretrace_common
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#include "apitrace_fbo_dump.hpp"
|
||||
#include "glws.hpp"
|
||||
#include "retrace.hpp"
|
||||
|
||||
@@ -375,6 +376,7 @@ bool makeCurrentInternal(Drawable *drawable, Drawable *readable, Context *contex
|
||||
}
|
||||
gCurrentDrawable = drawable;
|
||||
gCurrentContext = eglContext;
|
||||
mobilegl_trace_dump::InstallIfRequested();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -176,6 +176,18 @@ bool LoadMobileGL(const Request& request, std::string& error) {
|
||||
}
|
||||
setenv("MOBILEGL_TRACE_DUMP_FBO_ATTACHMENTS", dumpPoints.c_str(), 1);
|
||||
}
|
||||
if (request.texture2dDumps.empty()) {
|
||||
unsetenv("MOBILEGL_TRACE_DUMP_TEXTURE_2D");
|
||||
} else {
|
||||
std::string dumpPoints;
|
||||
for (const std::string& dumpPoint : request.texture2dDumps) {
|
||||
if (!dumpPoints.empty()) {
|
||||
dumpPoints += ';';
|
||||
}
|
||||
dumpPoints += dumpPoint;
|
||||
}
|
||||
setenv("MOBILEGL_TRACE_DUMP_TEXTURE_2D", dumpPoints.c_str(), 1);
|
||||
}
|
||||
|
||||
void* handle = dlopen(request.mobileGlLibrary.c_str(), RTLD_NOW | RTLD_GLOBAL);
|
||||
if (handle == nullptr) {
|
||||
@@ -383,6 +395,13 @@ std::string SnapshotCallSet(const Request& request) {
|
||||
callSet += "," + call;
|
||||
}
|
||||
}
|
||||
for (const std::string& dumpPoint : request.texture2dDumps) {
|
||||
const std::size_t separator = dumpPoint.find(',');
|
||||
const std::string call = dumpPoint.substr(0, separator);
|
||||
if (!call.empty() && call != std::to_string(request.targetCall)) {
|
||||
callSet += "," + call;
|
||||
}
|
||||
}
|
||||
return callSet;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,9 @@ struct Request {
|
||||
// Framebuffer-attachment dump points, each `CALL:DIR[:FBO,FBO,...]`. Debug-only; the
|
||||
// replay behaves exactly as before when this is empty.
|
||||
std::vector<std::string> fboAttachmentDumps;
|
||||
// Named GL_TEXTURE_2D dump points, each `CALL,TEXTURE,LEVEL,DIR`. Debug-only; the replay
|
||||
// behaves exactly as before when this is empty.
|
||||
std::vector<std::string> texture2dDumps;
|
||||
int targetFrame = -1;
|
||||
long long targetCall = -1;
|
||||
int width = 0;
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
#include <exception>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <sys/stat.h>
|
||||
|
||||
extern "C" void mobilegl_trace_set_native_window(ANativeWindow *window);
|
||||
@@ -25,6 +26,23 @@ std::string ToString(JNIEnv* env, jstring value) {
|
||||
return out;
|
||||
}
|
||||
|
||||
std::vector<std::string> SplitSemicolonList(const std::string& value) {
|
||||
std::vector<std::string> values;
|
||||
std::size_t begin = 0;
|
||||
while (begin < value.size()) {
|
||||
const std::size_t end = value.find(';', begin);
|
||||
const std::string entry = value.substr(begin, end - begin);
|
||||
if (!entry.empty()) {
|
||||
values.push_back(entry);
|
||||
}
|
||||
if (end == std::string::npos) {
|
||||
break;
|
||||
}
|
||||
begin = end + 1;
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
jobject MakeResult(JNIEnv* env, const mobilegl_trace::Result& result) {
|
||||
jclass clazz = env->FindClass("top/mobilegl/plugin/trace/TraceReplayActivity$TraceReplayResult");
|
||||
if (clazz == nullptr) {
|
||||
@@ -103,7 +121,8 @@ Java_top_mobilegl_plugin_trace_TraceReplayActivity_nativeRunTraceReplay(JNIEnv*
|
||||
jboolean usePbuffer,
|
||||
jboolean avoidAngleLlvmpipeSamplerMipmapMinFilter,
|
||||
jboolean avoidAngleLlvmpipeExplicitLodBias,
|
||||
jboolean coherentAsFlush) {
|
||||
jboolean coherentAsFlush,
|
||||
jstring texture2dDumps) {
|
||||
mobilegl_trace::Request request;
|
||||
request.tracePath = ToString(env, tracePath);
|
||||
request.goldenPath = ToString(env, goldenPath);
|
||||
@@ -115,6 +134,7 @@ Java_top_mobilegl_plugin_trace_TraceReplayActivity_nativeRunTraceReplay(JNIEnv*
|
||||
request.diffPath = ToString(env, diffPath);
|
||||
request.backend = ToString(env, backend);
|
||||
request.angleVariant = ToString(env, angleVariant);
|
||||
request.texture2dDumps = SplitSemicolonList(ToString(env, texture2dDumps));
|
||||
request.targetFrame = targetFrame;
|
||||
request.targetCall = targetCall;
|
||||
request.width = width;
|
||||
|
||||
+10
-4
@@ -115,7 +115,8 @@ public final class TraceReplayActivity extends Activity {
|
||||
request.usePbuffer,
|
||||
request.avoidAngleLlvmpipeSamplerMipmapMinFilter,
|
||||
request.avoidAngleLlvmpipeExplicitLodBias,
|
||||
request.coherentAsFlush
|
||||
request.coherentAsFlush,
|
||||
request.texture2dDumps
|
||||
);
|
||||
Log.i(TAG, result.toString());
|
||||
TraceReplayResult finalResult = result;
|
||||
@@ -147,7 +148,8 @@ public final class TraceReplayActivity extends Activity {
|
||||
boolean usePbuffer,
|
||||
boolean avoidAngleLlvmpipeSamplerMipmapMinFilter,
|
||||
boolean avoidAngleLlvmpipeExplicitLodBias,
|
||||
boolean coherentAsFlush
|
||||
boolean coherentAsFlush,
|
||||
String texture2dDumps
|
||||
);
|
||||
|
||||
private static final class TraceReplayRequest {
|
||||
@@ -172,6 +174,7 @@ public final class TraceReplayActivity extends Activity {
|
||||
final boolean avoidAngleLlvmpipeSamplerMipmapMinFilter;
|
||||
final boolean avoidAngleLlvmpipeExplicitLodBias;
|
||||
final boolean coherentAsFlush;
|
||||
final String texture2dDumps;
|
||||
|
||||
private TraceReplayRequest(
|
||||
String tracePath,
|
||||
@@ -194,7 +197,8 @@ public final class TraceReplayActivity extends Activity {
|
||||
boolean usePbuffer,
|
||||
boolean avoidAngleLlvmpipeSamplerMipmapMinFilter,
|
||||
boolean avoidAngleLlvmpipeExplicitLodBias,
|
||||
boolean coherentAsFlush
|
||||
boolean coherentAsFlush,
|
||||
String texture2dDumps
|
||||
) {
|
||||
this.tracePath = tracePath;
|
||||
this.goldenPath = goldenPath;
|
||||
@@ -217,6 +221,7 @@ public final class TraceReplayActivity extends Activity {
|
||||
this.avoidAngleLlvmpipeSamplerMipmapMinFilter = avoidAngleLlvmpipeSamplerMipmapMinFilter;
|
||||
this.avoidAngleLlvmpipeExplicitLodBias = avoidAngleLlvmpipeExplicitLodBias;
|
||||
this.coherentAsFlush = coherentAsFlush;
|
||||
this.texture2dDumps = texture2dDumps;
|
||||
}
|
||||
|
||||
static TraceReplayRequest from(Intent intent, File filesDir, String defaultBackend) {
|
||||
@@ -243,7 +248,8 @@ public final class TraceReplayActivity extends Activity {
|
||||
intent.getBooleanExtra("use_pbuffer", false),
|
||||
intent.getBooleanExtra("avoid_angle_llvmpipe_sampler_mipmap_min_filter", false),
|
||||
intent.getBooleanExtra("avoid_angle_llvmpipe_explicit_lod_bias", false),
|
||||
intent.getBooleanExtra("coherent_as_flush", false)
|
||||
intent.getBooleanExtra("coherent_as_flush", false),
|
||||
readString(intent, "texture_2d_dumps", "")
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ Usage:
|
||||
[--avoid-angle-llvmpipe-sampler-mipmap-min-filter] \
|
||||
[--avoid-angle-llvmpipe-explicit-lod-bias] \
|
||||
[--coherent-as-flush] \
|
||||
[--dump-texture-2d CALL,TEXTURE,LEVEL,DIR] \
|
||||
--timeout-seconds N
|
||||
|
||||
Set MOBILEGL_USE_ANGLE=1 to run DirectGLES replay with packaged ANGLE
|
||||
@@ -104,6 +105,7 @@ use_pbuffer=0
|
||||
avoid_angle_llvmpipe_sampler_mipmap_min_filter=0
|
||||
avoid_angle_llvmpipe_explicit_lod_bias=0
|
||||
coherent_as_flush=0
|
||||
texture_2d_dumps=""
|
||||
timeout_seconds=""
|
||||
|
||||
while [ "$#" -gt 0 ]; do
|
||||
@@ -144,6 +146,7 @@ while [ "$#" -gt 0 ]; do
|
||||
shift 1
|
||||
;;
|
||||
--coherent-as-flush) coherent_as_flush=1; shift 1 ;;
|
||||
--dump-texture-2d) texture_2d_dumps="$(next_arg "$@")"; shift 2 ;;
|
||||
--timeout-seconds) timeout_seconds="$(next_arg "$@")"; shift 2 ;;
|
||||
-h|--help) usage; exit 0 ;;
|
||||
*) die "unknown argument: $1" ;;
|
||||
@@ -262,6 +265,27 @@ copy_app_artifact() {
|
||||
fi
|
||||
}
|
||||
|
||||
copy_texture_2d_dumps() {
|
||||
[ -n "${texture_2d_dumps}" ] || return
|
||||
saved_ifs="${IFS}"
|
||||
IFS=';'
|
||||
set -- ${texture_2d_dumps}
|
||||
IFS="${saved_ifs}"
|
||||
for dump_point in "$@"; do
|
||||
dump_dir="${dump_point#*,}"
|
||||
dump_dir="${dump_dir#*,}"
|
||||
dump_dir="${dump_dir#*,}"
|
||||
[ -n "${dump_dir}" ] || continue
|
||||
dump_name="$(basename "${dump_dir}")"
|
||||
destination_dir="${result_dir}/${dump_name}"
|
||||
mkdir -p "${destination_dir}"
|
||||
if ! adb_device_path exec-out run-as "${package_name}" tar -C "${dump_dir}" -cf - . | tar -xf - -C "${destination_dir}"; then
|
||||
echo "trace-replay-ci.sh: warning: failed to copy texture dump ${dump_dir}" >&2
|
||||
rm -rf "${destination_dir}"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
prepare_fixture() {
|
||||
fixture_dir="${fixture_root}/${safe_case}"
|
||||
rm -rf "${fixture_dir}"
|
||||
@@ -339,6 +363,9 @@ run_retrace() {
|
||||
if [ "${coherent_as_flush}" -eq 1 ]; then
|
||||
set -- "$@" --ez coherent_as_flush true
|
||||
fi
|
||||
if [ -n "${texture_2d_dumps}" ]; then
|
||||
set -- "$@" --es texture_2d_dumps "${texture_2d_dumps}"
|
||||
fi
|
||||
set -- "$@" \
|
||||
--es output_dir "${app_dir}/output" \
|
||||
--es diff_path "${app_dir}/output/${safe_case}-diff.png" \
|
||||
@@ -399,6 +426,7 @@ run_retrace() {
|
||||
copy_app_artifact "${app_dir}/output/${safe_case}-diff.png" "${result_dir}/${safe_case}-${backend}-diff.png"
|
||||
copy_app_artifact "${app_dir}/output/retrace.log" "${result_dir}/retrace.log"
|
||||
copy_app_artifact "${app_dir}/output/mobilegl.log" "${result_dir}/mobilegl.log"
|
||||
copy_texture_2d_dumps
|
||||
|
||||
# A replay that wrote result.json but did not pass used to print nothing but
|
||||
# the JSON, which for a non-zero statusCode says only "retrace failed with
|
||||
|
||||
Reference in New Issue
Block a user