OverviewFilesCommitsIssuesDocsReleasesPeers

proc-nodes / src / gpu / gpu_buffer_manager.h

48 lines · c ref:
#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