==> tests/image.c <==1/* Golden data from the Rust (mesh-ref pathtrace.rs): a 64 x 48 image of the default scene, 2 spp,
2 * 3 passes, both tone maps: every tile's digests and the PPM's bytes. */
3#include "mesh/ref/pathtrace.h"
4
5#include "pathtrace/digest.h"
6
7#include <stdio.h>
8#include <stdlib.h>
9
10#include "pathtrace/default_scene.h"
11
12int main(void) {
13 static uint32_t small[552];
14 for (int i = 0; i < 552; i++) small[i] = pt_default_scene[i];
15 const uint32_t sets[4][2] = {{PT_H_WIDTH, 64}, {PT_H_HEIGHT, 48}, {PT_H_SPP, 2}, {PT_H_PASSES, 3}};
16 for (int i = 0; i < 4; i++) pt_set_param(small, 552, pt_set_arg(sets[i][0], sets[i][1]));
17 int failures = 0;
18 if (pt_validate(small, 552) != 0) failures++;
19 const uint64_t want_tiles[2] = {0xc15abb728fdfd66full, 0x07d063bfcf961fe3ull};
20 const uint64_t want_ppm[2] = {0x3b1c7084e9ca9e10ull, 0x3bbdf238a8f583eeull};
21 for (uint32_t op = 0; op < 2; op++) {
22 uint32_t n = pt_tiles(small), ts[4];
23 for (uint32_t t = 0; t < n; t++) ts[t] = t;
24 mesh_pt_tile tl[4];
25 if (n != 4 || !mesh_pt_tiles(small, ts, n, 3, op, tl)) return 1;
26 uint32_t rgb[4 * PT_TILE_PIX];
27 uint64_t h = PT_FNV_OFFSET;
28 for (uint32_t t = 0; t < n; t++) {
29 for (uint32_t i = 0; i < PT_TILE_PIX; i++) rgb[t * PT_TILE_PIX + i] = tl[t].rgb[i];
30 h = (h ^ tl[t].acc_digest) * PT_FNV_PRIME;
31 h = (h ^ tl[t].rgb_digest) * PT_FNV_PRIME;
32 for (uint32_t p = 0; p < 3; p++) h = (h ^ tl[t].part_digests[p]) * PT_FNV_PRIME;
33 h = (h ^ pt_fnv_words(tl[t].acc, 3 * PT_TILE_PIX)) * PT_FNV_PRIME;
34 mesh_pt_tile_free(&tl[t]);
35 }
36 static uint8_t raster[64 * 48 * 3];
37 mesh_pt_raster(small, rgb, raster);
38 size_t len;
39 uint8_t *ppm = mesh_pt_ppm(64, 48, raster, &len);
40 uint64_t hp = PT_FNV_OFFSET;
41 for (size_t i = 0; i < len; i++) hp = (hp ^ ppm[i]) * PT_FNV_PRIME;
42 free(ppm);
43 if (h != want_tiles[op] || len != 9229 || hp != want_ppm[op]) {
44 fprintf(stderr, "op %u: tiles %#018llx ppm %zu bytes %#018llx\n", op, (unsigned long long)h, len,
45 (unsigned long long)hp);
46 failures++;
47 }
48 }
49 return failures != 0;
50}