Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 57 additions & 7 deletions examples/Gpu/ArrayToBuffer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */

#include <halp/audio.hpp>
#include <halp/buffer.hpp>
#include <halp/controls.hpp>
#include <halp/meta.hpp>
#include <halp/texture.hpp>

namespace uo
{
Expand All @@ -20,22 +20,72 @@ struct ArrayToBuffer
halp_meta(author, "ossia score")
halp_meta(uuid, "3127c11b-61d3-4d5e-a896-8b56e628dfbc")

enum Type
{
Float32,
Float64,
SInt32,
UInt32,
SInt16,
UInt16,
SInt8,
UInt8,
};

using input_value_type = float;

struct
{
halp::val_port<"Input", std::vector<float>> main;
halp::val_port<"Input", std::vector<input_value_type>> main;
halp::enum_t<Type, "Type"> type;
} inputs;

struct
{
halp::buffer_output<"Output"> main;
halp::cpu_buffer_output<"Output"> main;
} outputs;

template <typename T>
void process()
{
if constexpr(std::is_same_v<T, input_value_type>)
{
// Direct reuse of the buffer
outputs.main.buffer.raw_data = (unsigned char*)inputs.main.value.data();
outputs.main.buffer.byte_size = inputs.main.value.size() * sizeof(float);
outputs.main.buffer.byte_offset = 0;
outputs.main.buffer.changed = true;
}
else
{
// Allocation and copy :'(
auto span = outputs.main.create<T>(inputs.main.value.size());
std::copy_n(inputs.main.value.data(), inputs.main.value.size(), span.data());
outputs.main.buffer.changed = true;
}
}

void operator()() noexcept
{
const int num_elements = inputs.main.value.size();
outputs.main.create<float>(num_elements);
memcpy(outputs.main.buffer.bytes, inputs.main.value.data(), outputs.main.buffer.bytesize);
outputs.main.upload();
switch(inputs.type)
{
case Type::Float32:
return process<float>();
case Type::Float64:
return process<double>();
case Type::SInt32:
return process<int32_t>();
case Type::UInt32:
return process<uint32_t>();
case Type::SInt16:
return process<int16_t>();
case Type::UInt16:
return process<uint16_t>();
case Type::SInt8:
return process<int8_t>();
case Type::UInt8:
return process<uint8_t>();
}
}
};
}
48 changes: 41 additions & 7 deletions examples/Gpu/BufferToArray.hpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
#pragma once

/* SPDX-License-Identifier: GPL-3.0-or-later */

#include <halp/audio.hpp>
#include <halp/buffer.hpp>
#include <halp/controls.hpp>
#include <halp/meta.hpp>
#include <halp/texture.hpp>

namespace uo
{
Expand All @@ -19,23 +18,58 @@ struct BufferToArray
halp_meta(manual_url, "https://ossia.io/score-docs/processes/buffer_to_array.html")
halp_meta(author, "ossia score")
halp_meta(uuid, "5274a895-8232-4e79-bc7a-50c27274bd10")
enum Type
{
Float32,
Float64,
SInt32,
UInt32,
SInt16,
UInt16,
SInt8,
UInt8,
};

struct
{
halp::buffer_input<"Input"> main;
halp::cpu_buffer_input<"Input"> main;
halp::enum_t<Type, "Type"> type;
} inputs;

struct
{
halp::val_port<"Output", std::vector<float>> main;
} outputs;

template <typename T>
void process()
{
auto sz = inputs.main.buffer.byte_size;
auto elements = sz / sizeof(T);
auto ptr = (T*)inputs.main.buffer.raw_data;
outputs.main.value.assign(ptr, ptr + elements);
}

void operator()() noexcept
{
auto sz = inputs.main.buffer.bytesize;
if((sz % sizeof(float)) == 0) {
outputs.main.value.resize(sz / sizeof(float));
memcpy(outputs.main.value.data(), inputs.main.buffer.bytes, sz);
switch(inputs.type)
{
case Type::Float32:
return process<float>();
case Type::Float64:
return process<double>();
case Type::SInt32:
return process<int32_t>();
case Type::UInt32:
return process<uint32_t>();
case Type::SInt16:
return process<int16_t>();
case Type::UInt16:
return process<uint16_t>();
case Type::SInt8:
return process<int8_t>();
case Type::UInt8:
return process<uint8_t>();
}
}
};
Expand Down
Loading
Loading