Add entry points for GPU
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user