summaryrefslogtreecommitdiff
path: root/pcr/reicast-git/ta-hash-logs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'pcr/reicast-git/ta-hash-logs.patch')
-rw-r--r--pcr/reicast-git/ta-hash-logs.patch120
1 files changed, 120 insertions, 0 deletions
diff --git a/pcr/reicast-git/ta-hash-logs.patch b/pcr/reicast-git/ta-hash-logs.patch
new file mode 100644
index 000000000..1d120852f
--- /dev/null
+++ b/pcr/reicast-git/ta-hash-logs.patch
@@ -0,0 +1,120 @@
+diff -Nur a/core/hw/pvr/Renderer_if.cpp b/core/hw/pvr/Renderer_if.cpp
+--- a/core/hw/pvr/Renderer_if.cpp 2015-10-06 21:43:53.028336301 -0300
++++ b/core/hw/pvr/Renderer_if.cpp 2015-10-06 21:49:25.016725724 -0300
+@@ -5,10 +5,16 @@
+
+ #include "deps/zlib/zlib.h"
+
++#include "deps/crypto/md5.h"
++
+ #if FEAT_HAS_NIXPROF
+ #include "profiler/profiler.h"
+ #endif
+
++#define FRAME_MD5 0x1
++FILE* fLogFrames;
++FILE* fCheckFrames;
++
+ /*
+
+ rendv3 ideas
+@@ -291,6 +297,48 @@
+
+ if (ctx)
+ {
++ if (fLogFrames || fCheckFrames) {
++ MD5Context md5;
++ u8 digest[16];
++
++ MD5Init(&md5);
++ MD5Update(&md5, ctx->tad.thd_root, ctx->tad.End() - ctx->tad.thd_root);
++ MD5Final(digest, &md5);
++
++ if (fLogFrames) {
++ fputc(FRAME_MD5, fLogFrames);
++ fwrite(digest, 1, 16, fLogFrames);
++ fflush(fLogFrames);
++ }
++
++ if (fCheckFrames) {
++ u8 v;
++ u8 digest2[16];
++ int ch = fgetc(fCheckFrames);
++
++ if (ch == EOF) {
++ printf("Testing: TA Hash log matches, exiting\n");
++ exit(1);
++ }
++
++ verify(ch == FRAME_MD5);
++
++ fread(digest2, 1, 16, fCheckFrames);
++
++ verify(memcmp(digest, digest2, 16) == 0);
++
++
++ }
++
++ /*
++ u8* dig = digest;
++ printf("FRAME: %02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\n",
++ digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7],
++ digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15]
++ );
++ */
++ }
++
+ if (!ctx->rend.Overrun)
+ {
+ //printf("REP: %.2f ms\n",render_end_pending_cycles/200000.0);
+@@ -366,6 +414,13 @@
+
+ bool rend_init()
+ {
++ if (fLogFrames = fopen(settings.pvr.HashLogFile.c_str(), "wb")) {
++ printf("Saving frame hashes to: '%s'\n", settings.pvr.HashLogFile.c_str());
++ }
++
++ if (fCheckFrames = fopen(settings.pvr.HashCheckFile.c_str(), "rb")) {
++ printf("Comparing frame hashes against: '%s'\n", settings.pvr.HashCheckFile.c_str());
++ }
+
+ #ifdef NO_REND
+ renderer = rend_norend();
+@@ -435,6 +490,11 @@
+
+ void rend_term()
+ {
++ if (fCheckFrames)
++ fclose(fCheckFrames);
++
++ if (fLogFrames)
++ fclose(fLogFrames);
+ }
+
+ void rend_vblank()
+diff -Nur a/core/nullDC.cpp b/core/nullDC.cpp
+--- a/core/nullDC.cpp 2015-10-06 21:43:53.043336408 -0300
++++ b/core/nullDC.cpp 2015-10-06 21:49:25.017725731 -0300
+@@ -260,6 +260,8 @@
+ #endif
+
+ settings.bios.UseReios = cfgLoadInt("config", "bios.UseReios", 0);
++ settings.pvr.HashLogFile = cfgLoadStr("testing", "ta.HashLogFile", "");
++ settings.pvr.HashCheckFile = cfgLoadStr("testing", "ta.HashCheckFile", "");
+
+ #if (HOST_OS != OS_LINUX || defined(_ANDROID) || defined(TARGET_PANDORA))
+ settings.aica.BufferSize=2048;
+diff -Nur a/core/types.h b/core/types.h
+--- a/core/types.h 2015-10-06 21:43:53.048336444 -0300
++++ b/core/types.h 2015-10-06 21:49:25.017725731 -0300
+@@ -696,6 +696,9 @@
+
+ u32 MaxThreads;
+ u32 SynchronousRendering;
++
++ string HashLogFile;
++ string HashCheckFile;
+ } pvr;
+
+ struct {