vyre 0.4.0

GPU compute intermediate representation with a standard operation library
Documentation
struct UrlPercentEncodeParams {
    input_len: u32,
    output_capacity: u32,
    reserved0: u32,
    reserved1: u32,
}

@group(0) @binding(0) var<uniform> params: UrlPercentEncodeParams;
@group(0) @binding(1) var<storage, read> input_words: array<u32>;
@group(0) @binding(2) var<storage, read_write> output_words: array<u32>;
@group(0) @binding(3) var<storage, read_write> status: array<u32>;

fn encode_url_percent_unreserved(byte: u32) -> bool {
    return (byte >= 65u && byte <= 90u) ||
        (byte >= 97u && byte <= 122u) ||
        (byte >= 48u && byte <= 57u) ||
        byte == 45u || byte == 46u || byte == 95u || byte == 126u;
}

@compute @workgroup_size(1, 1, 1)
fn encode_url_percent_encode(@builtin(global_invocation_id) id: vec3<u32>) {
    if (id.x != 0u) {
        return;
    }
    status[0] = 0u;
    status[1] = 0u;
    var input = 0u;
    var out = 0u;
    loop {
        if (input >= params.input_len) {
            break;
        }
        let byte = vyre_packed_byte(&input_words, input);
        if (encode_url_percent_unreserved(byte)) {
            if (out + 1u > params.output_capacity) {
                status[0] = 5u;
                return;
            }
            vyre_store_packed_byte(&output_words, out, byte);
            out = out + 1u;
        } else {
            if (out + 3u > params.output_capacity) {
                status[0] = 5u;
                return;
            }
            vyre_store_packed_byte(&output_words, out, 37u);
            vyre_store_packed_byte(&output_words, out + 1u, vyre_hex_upper(byte >> 4u));
            vyre_store_packed_byte(&output_words, out + 2u, vyre_hex_upper(byte));
            out = out + 3u;
        }
        input = input + 1u;
    }
    status[1] = out;
}