Files
fs2open.github.com/code/graphics/util/GPUMemoryHeap.h
asarium 9da5cc17a3 Add type safe handle for graphics buffers
This converts the previous plain-int type for a buffer handle to an
instance of our ID class which provides type safety.
2020-10-25 12:16:05 +01:00

62 lines
1.5 KiB
C++

#pragma once
#include "globalincs/pstypes.h"
#include "utils/HeapAllocator.h"
#include "graphics/2d.h"
namespace graphics {
namespace util {
/**
* @brief A custom heap structure that uses a GPU buffer for storing the data
*
* @details This also keeps a client side copy of the data since that is required if the buffer is resized since the
* original data will not be kept in that case.
*/
class GPUMemoryHeap {
std::unique_ptr<::util::HeapAllocator> _allocator;
gr_buffer_handle _bufferHandle;
void* _dataBuffer = nullptr;
size_t _bufferSize = 0;
void resizeBuffer(size_t newSize);
void* bufferPointer(size_t offset);
public:
explicit GPUMemoryHeap(GpuHeap heap_type);
~GPUMemoryHeap();
GPUMemoryHeap(const GPUMemoryHeap&) = delete;
GPUMemoryHeap& operator=(const GPUMemoryHeap&) = delete;
/**
* @brief Store some data in a GPU heap
* @param size The size of the data to store
* @param data The data to store
* @return The offset in bytes from the beginning of the buffer where the stored data begins
*/
size_t allocateGpuData(size_t size, void* data);
/**
* @brief Frees up some GPU data from this heap
* @param offset The offset at which to free the data
*/
void freeGpuData(size_t offset);
/**
* @brief Gets the handle of the used buffer for use in rendering operations
*
* @warning Do no change the contents of this buffer! The contents are managed by this class and may not be changed
* by external code.
*
* @return The graphics code buffer handle.
*/
gr_buffer_handle bufferHandle();
};
}
}