skip to content
==> 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}