Add entry points for GPU

This commit is contained in:
2026-06-27 18:25:41 -04:00
parent 6671475c75
commit 44b71c2692
11 changed files with 202 additions and 104 deletions
+45 -7
View File
@@ -12,16 +12,17 @@
//!
//! This algorithm is also known as the ["chaos game"](https://en.wikipedia.org/wiki/Chaos_game),
//! and it forms the basic system for producing images.
use crate::transform::Transform;
use crate::variation::Variation;
use glam::{Vec2, vec2};
use rand::distr::{Distribution, StandardUniform};
use rand::{Rng, RngExt};
use rand::Rng;
use rand::distributions::{Distribution, Standard};
use spirv_std::glam::{Vec2, vec2};
struct BiUnit;
impl Distribution<f32> for BiUnit {
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> f32 {
rng.sample::<f32, _>(StandardUniform) * 2.0 - 1.0
rng.sample::<f32, _>(Standard) * 2.0 - 1.0
}
}
@@ -40,11 +41,11 @@ pub fn step_chaos_game<R: Rng>(
weights: &[f32],
variations: &[Variation],
) -> (Vec2, u32) {
let mut choice_weight = rng.sample::<f32, _>(StandardUniform);
let mut choice_weight = rng.sample::<f32, _>(Standard);
let mut transform_index: u32 = 0;
for weight in weights {
choice_weight -= weight;
for i in 0..weights.len() {
choice_weight -= weights[i];
if choice_weight <= 0.0 {
break;
}
@@ -105,3 +106,40 @@ impl<'a, R: Rng> Iterator for ChaosGame<'a, R> {
Some(next_point)
}
}
pub mod entry {
use crate::chaos_game::ChaosGame;
use crate::transform::Transform;
use crate::variation::Variation;
use glam::Vec2;
use rand_xoshiro::Xoshiro256StarStar;
use spirv_std::spirv;
fn xoshiro_from_state(rng_state: [u8; 32]) -> Xoshiro256StarStar {
let mut rng_state_actual = [1u64, 2u64, 3u64, 4u64];
unsafe { core::mem::transmute(rng_state_actual) }
}
#[spirv(compute(entry_point_name = "main_chaos_game", threads(1)))]
pub extern "C" fn main_chaos_game(
#[spirv(spec_constant(id = 1, default = 20))] iteration_discard: u32,
#[spirv(storage_buffer, descriptor_set = 0, binding = 0)] rng_seed: &[u8],
#[spirv(storage_buffer, descriptor_set = 0, binding = 1)] transforms: &[Transform],
#[spirv(storage_buffer, descriptor_set = 0, binding = 2)] weights: &[f32],
#[spirv(storage_buffer, descriptor_set = 0, binding = 3)] variations: &[Variation],
#[spirv(storage_buffer, descriptor_set = 1, binding = 0)] output: &mut [Vec2],
) {
let rng_seed_actual = [0u8; 32];
let mut rng = xoshiro_from_state(rng_seed_actual);
let mut chaos_game = ChaosGame::new(&mut rng, transforms, weights, variations);
for _ in 0..iteration_discard {
chaos_game.next().unwrap();
}
for i in 0..output.len() {
output[i] = chaos_game.next().unwrap();
}
}
}