blob: 8eccd4f5d5c3d0be8c530cefa5d723fc0bd0724d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#pragma once
#include <queue>
#include "dxvk_buffer.h"
namespace dxvk {
class DxvkDevice;
/**
* \brief Staging data allocator
*
* Allocates buffer slices for resource uploads,
* while trying to keep the number of allocations
* but also the amount of allocated memory low.
*/
class DxvkStagingDataAlloc {
constexpr static VkDeviceSize MaxBufferSize = 1 << 25; // 32 MiB
constexpr static uint32_t MaxBufferCount = 2;
public:
DxvkStagingDataAlloc(const Rc<DxvkDevice>& device);
~DxvkStagingDataAlloc();
/**
* \brief Alloctaes a staging buffer slice
*
* \param [in] align Alignment of the allocation
* \param [in] size Size of the allocation
* \returns Staging buffer slice
*/
DxvkBufferSlice alloc(VkDeviceSize align, VkDeviceSize size);
/**
* \brief Deletes all staging buffers
*
* Destroys allocated buffers and
* releases all buffer memory.
*/
void trim();
private:
Rc<DxvkDevice> m_device;
Rc<DxvkBuffer> m_buffer;
VkDeviceSize m_offset = 0;
std::queue<Rc<DxvkBuffer>> m_buffers;
Rc<DxvkBuffer> createBuffer(VkDeviceSize size);
};
}
|