mirror of https://github.com/doitsujin/dxvk
123 lines
2.7 KiB
C++
123 lines
2.7 KiB
C++
#pragma once
|
|
|
|
#include "dxvk_buffer.h"
|
|
|
|
namespace dxvk {
|
|
|
|
class DxvkDevice;
|
|
|
|
/**
|
|
* \brief Staging buffer slice
|
|
*
|
|
* Provides the application with a
|
|
* pointer to the mapped buffer.
|
|
*/
|
|
struct DxvkStagingBufferSlice {
|
|
VkBuffer buffer = VK_NULL_HANDLE;
|
|
VkDeviceSize offset = 0;
|
|
void* mapPtr = nullptr;
|
|
};
|
|
|
|
|
|
/**
|
|
* \brief Staging uffer
|
|
*
|
|
* A mapped buffer that can be used for fast data
|
|
* transfer operations from the host to the GPU.
|
|
* Implements a linear sub-allocator for staging
|
|
* buffer slices.
|
|
*/
|
|
class DxvkStagingBuffer : public RcObject {
|
|
|
|
public:
|
|
|
|
DxvkStagingBuffer(
|
|
const Rc<DxvkBuffer>& buffer);
|
|
~DxvkStagingBuffer();
|
|
|
|
/**
|
|
* \brief Buffer size, in bytes
|
|
* \returns Buffer size, in bytes
|
|
*/
|
|
VkDeviceSize size() const;
|
|
|
|
/**
|
|
* \brief Number of bytes still available
|
|
* \returns Number of bytes still available
|
|
*/
|
|
VkDeviceSize freeBytes() const;
|
|
|
|
/**
|
|
* \brief Allocates a staging buffer slice
|
|
*
|
|
* This may fail if the amount of data requested is
|
|
* larger than the amount of data still available.
|
|
* \param [in] size Requested allocation size
|
|
* \param [out] slice Allocated staging buffer slice
|
|
* \returns \c true on success, \c false on failure
|
|
*/
|
|
bool alloc(
|
|
VkDeviceSize size,
|
|
DxvkStagingBufferSlice& slice);
|
|
|
|
/**
|
|
* \brief Resets staging buffer
|
|
*
|
|
* Resets the allocator and thus frees
|
|
* all slices allocated from the buffer.
|
|
*/
|
|
void reset();
|
|
|
|
private:
|
|
|
|
Rc<DxvkBuffer> m_buffer;
|
|
|
|
VkDeviceSize m_bufferSize = 0;
|
|
VkDeviceSize m_bufferOffset = 0;
|
|
|
|
};
|
|
|
|
|
|
/**
|
|
* \brief Staging buffer allocator
|
|
*
|
|
* Convenient allocator for staging buffer slices
|
|
* which creates new staging buffers on demand.
|
|
*/
|
|
class DxvkStagingAlloc {
|
|
|
|
public:
|
|
|
|
DxvkStagingAlloc(DxvkDevice* device);
|
|
~DxvkStagingAlloc();
|
|
|
|
/**
|
|
* \brief Allocates a staging buffer slice
|
|
*
|
|
* This \e may create a new staging buffer
|
|
* if needed. This method should not fail.
|
|
* \param [in] size Required amount of memory
|
|
* \returns Allocated staging buffer slice
|
|
*/
|
|
DxvkStagingBufferSlice alloc(
|
|
VkDeviceSize size);
|
|
|
|
/**
|
|
* \brief Resets staging buffer allocator
|
|
*
|
|
* Returns all buffers to the device so that
|
|
* they can be recycled. Buffers must not be
|
|
* in use when this is called.
|
|
*/
|
|
void reset();
|
|
|
|
private:
|
|
|
|
DxvkDevice* const m_device;
|
|
|
|
std::vector<Rc<DxvkStagingBuffer>> m_stagingBuffers;
|
|
|
|
};
|
|
|
|
}
|