Skip to content

Commit eb55b8e

Browse files
committed
small improvement to xoroshiro64
1 parent e6ec810 commit eb55b8e

2 files changed

Lines changed: 22 additions & 9 deletions

File tree

apps/typegpu-docs/tests/individual-example-tests/uniformity.test.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,21 @@ describe('uniformity test example', () => {
200200
201201
@group(0) @binding(0) var<uniform> configUniform: Config;
202202
203+
fn hash(v: u32) -> u32 {
204+
var x = (v ^ (v >> 17u));
205+
x *= 3982152891u;
206+
x ^= (x >> 11u);
207+
x *= 2890668881u;
208+
x ^= (x >> 15u);
209+
x *= 830770091u;
210+
x ^= (x >> 14u);
211+
return x;
212+
}
213+
203214
var<private> seed: vec2u;
204215
205216
fn seed2(value: vec2f) {
206-
seed = vec2u(value);
217+
seed = vec2u(hash(u32(value.x)), hash(u32(value.y)));
207218
}
208219
209220
fn randSeed2(seed: vec2f) {
@@ -218,12 +229,13 @@ describe('uniformity test example', () => {
218229
return ((x << k) | (x >> (32u - k)));
219230
}
220231
221-
fn next() {
232+
fn next() -> u32 {
222233
let s0 = seed[0i];
223234
var s1 = seed[1i];
224235
s1 ^= s0;
225236
seed[0i] = ((rotl(s0, 26u) ^ s1) ^ (s1 << 9u));
226237
seed[1i] = rotl(s1, 13u);
238+
return (rotl((seed[0i] * 2654435771u), 5u) * 5u);
227239
}
228240
229241
fn u32To01Float(value: u32) -> f32 {
@@ -234,8 +246,7 @@ describe('uniformity test example', () => {
234246
}
235247
236248
fn sample() -> f32 {
237-
next();
238-
let r = seed.x;
249+
let r = next();
239250
return u32To01Float(r);
240251
}
241252

packages/typegpu-noise/src/generator.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,24 +63,26 @@ export const XOROSHIRO64STARSTAR: StatefulGenerator = (() => {
6363
return (x << k) | (x >> (32 - k));
6464
});
6565

66-
const next = tgpu.fn([])(() => {
66+
const next = tgpu.fn(
67+
[],
68+
d.u32,
69+
)(() => {
6770
const s0 = seed.$[0];
6871
let s1 = seed.$[1];
69-
7072
s1 ^= s0;
7173
seed.$[0] = rotl(s0, 26) ^ s1 ^ (s1 << 9);
7274
seed.$[1] = rotl(s1, 13);
75+
return rotl(seed.$[0] * 0x9e3779bb, 5) * 5;
7376
});
7477

7578
return {
7679
seed2: tgpu.fn([d.vec2f])((value) => {
77-
seed.$ = d.vec2u(value);
80+
seed.$ = d.vec2u(hash(d.u32(value.x)), hash(d.u32(value.y)));
7881
}),
7982

8083
sample: randomGeneratorShell(() => {
8184
'use gpu';
82-
next();
83-
const r = seed.$.x;
85+
const r = next();
8486
return u32To01Float(r);
8587
}).$name('sample'),
8688
};

0 commit comments

Comments
 (0)