#ifndef PROC_NODES_GPU_BUFFER_MANAGER_H
#define PROC_NODES_GPU_BUFFER_MANAGER_H
#include <godot_cpp/classes/rendering_device.hpp>
#include <godot_cpp/variant/packed_byte_array.hpp>
#include <godot_cpp/variant/packed_float32_array.hpp>
#include <godot_cpp/variant/packed_int32_array.hpp>
#include <godot_cpp/variant/packed_vector3_array.hpp>
#include <godot_cpp/variant/rid.hpp>
#include <godot_cpp/templates/vector.hpp>
namespace godot {
class GpuBufferManager {
RenderingDevice *rd = nullptr;
Vector<RID> allocated_buffers;
public:
void init(RenderingDevice *p_rd) { rd = p_rd; }
RenderingDevice *get_rd() const { return rd; }
// Upload CPU -> GPU storage buffers
RID upload_vec3_buffer(const PackedVector3Array &p_data); // vec3 -> vec4 padded (16 bytes/element)
RID upload_float_buffer(const PackedFloat32Array &p_data);
RID upload_int_buffer(const PackedInt32Array &p_data);
RID upload_raw_buffer(const PackedByteArray &p_data);
// Create empty output buffer
RID create_output_buffer(uint32_t p_size_bytes);
// Download GPU -> CPU
PackedVector3Array download_vec3_buffer(RID p_buffer, int p_count);
PackedFloat32Array download_float_buffer(RID p_buffer, int p_count);
// Uniform buffer (for node parameters)
RID create_uniform_buffer(const PackedByteArray &p_data);
// Cleanup
void free_buffer(RID p_buffer);
void free_all(); // Free all tracked buffers
~GpuBufferManager();
};
} // namespace godot
#endif // PROC_NODES_GPU_BUFFER_MANAGER_H