mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-09 13:01:29 -10:00
This converts the previous plain-int type for a buffer handle to an instance of our ID class which provides type safety.
62 lines
1.5 KiB
C++
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();
|
|
};
|
|
|
|
}
|
|
}
|
|
|