91 layout.
offsets.reserve(fields.size());
98 layout.
offsets.push_back(
static_cast<uint32_t
>(end));
102 end = (end + align - 1) / align * align;
103 layout.
offsets.push_back(
static_cast<uint32_t
>(end));
105 widest = std::max(widest, align);
108 layout.
size =
static_cast<uint32_t
>((end + widest - 1) / widest * widest);
114 return std::visit([&](
const auto& held) ->
size_t {
115 if (
out.size() <
sizeof(held)) {
118 std::memcpy(
out.data(), &held,
sizeof(held));
126 template <
typename Component>
127 void store_components(std::span<const double> components, std::byte*
out)
noexcept
129 for (
size_t i = 0; i < components.size(); ++i) {
130 const Component converted = saturate_cast<Component>(components[i]);
131 std::memcpy(
out + i *
sizeof(Component), &converted,
sizeof(Component));
139 std::span<const double> components,
140 std::span<std::byte>
out)
noexcept
152 store_components<float>(components,
out.data());
158 store_components<double>(components,
out.data());
161 store_components<int32_t>(components,
out.data());
164 store_components<uint32_t>(components,
out.data());
167 store_components<uint8_t>(components,
out.data());
170 store_components<uint16_t>(components,
out.data());
std::vector< float > * out
std::variant< float, glm::vec2, glm::vec3, glm::vec4, double, glm::dvec2, glm::dvec3, glm::dvec4, int32_t, uint32_t, uint8_t, uint16_t, glm::mat4 > GpuValue
One value of any GpuDataFormat.
bool pack_gpu_components(GpuDataFormat dst, std::span< const double > components, std::span< std::byte > out) noexcept
Writes scalar components into out as one element of dst.
size_t gpu_data_format_bytes(GpuDataFormat fmt) noexcept
Byte size of one element of a GpuDataFormat.
size_t gpu_data_format_align(GpuDataFormat fmt) noexcept
Base alignment in bytes of one element, following std430 rules.
size_t gpu_data_format_components(GpuDataFormat fmt) noexcept
Number of scalar components in one element of a GpuDataFormat.
GpuBlockLayout gpu_block_layout(std::span< const GpuDataFormat > fields)
Lay out fields in declaration order under std430 rules.
size_t gpu_value_write(const GpuValue &value, std::span< std::byte > out) noexcept
Copies the held value's bytes into out, unconverted.
GpuDataFormat
GPU data formats with explicit precision levels.
@ VEC3_F64
glm::dvec3 (64-bit components)
@ FLOAT64
64-bit double (audio precision)
@ UINT16
uint16_t, R16F raw half-float storage, packed formats
@ VEC2_F64
glm::dvec2 (64-bit components)
@ VEC2_F32
glm::vec2 (32-bit components)
@ VEC4_F32
glm::vec4 (32-bit components)
@ VEC4_F64
glm::dvec4 (64-bit components)
@ FLOAT32
32-bit float (standard GPU)
@ MAT4_F32
glm::mat4 (column-major), not a sampled image format
@ VEC3_F32
glm::vec3 (32-bit components), not a sampled image format
@ UINT8
uint8_t, R8 / RGBA8 texel data
std::vector< uint32_t > offsets
Member offsets and total size of a block of GpuDataFormat fields.