11 #include "VKTextureTransfer.h"
13 #include <QtCore/QThreadPool>
17 #include "VKBackend.h"
21 namespace gpu {
namespace vk {
24 struct LessPairSecond {
25 bool operator()(
const T& a,
const T& b) {
return a.second < b.second; }
29 using QueuePair = std::pair<TextureWeakPointer, float>;
33 using WorkQueue = std::priority_queue<QueuePair, std::vector<QueuePair>, LessPairSecond<QueuePair>>;
54 using Pointer = std::shared_ptr<TransferJob>;
55 using Queue = std::queue<Pointer>;
56 using Lambda = std::function<void(
const TexturePointer&)>;
58 Texture::PixelsPointer _mipData;
59 size_t _transferOffset{ 0 };
60 size_t _transferSize{ 0 };
61 uint16_t _sourceMip{ 0 };
62 bool _bufferingRequired{
true };
63 Lambda _transferLambda{ [](
const TexturePointer&) {} };
64 Lambda _bufferingLambda{ [](
const TexturePointer&) {} };
67 TransferJob(uint16_t sourceMip,
const std::function<
void()>& transferLambda);
68 TransferJob(
const Texture& texture, uint16_t sourceMip, uint16_t targetMip, uint8_t face, uint32_t lines = 0, uint32_t lineOffset = 0);
70 const uint16_t& sourceMip()
const {
return _sourceMip; }
71 const size_t& size()
const {
return _transferSize; }
72 bool bufferingRequired()
const {
return _bufferingRequired; }
73 void buffer(
const TexturePointer& texture) { _bufferingLambda(texture); }
74 void transfer(
const TexturePointer& texture) { _transferLambda(texture); }
77 using TransferJobPointer = std::shared_ptr<TransferJob>;
78 using TransferQueue = std::queue<TransferJobPointer>;
81 using TransferMap = std::map<TextureWeakPointer, TransferQueue, std::owner_less<TextureWeakPointer>>;
83 class VKTextureTransferEngine {
85 using Pointer = std::shared_ptr<VKTextureTransferEngine>;
87 virtual ~VKTextureTransferEngine() =
default;
96 bool allowCreate()
const {
return _frameTexturesCreated < MAX_RESOURCE_TEXTURES_PER_FRAME; }
99 void addMemoryManagedTexture(
const TexturePointer& texturePointer);
102 class TextureBufferThread :
public QThread {
104 TextureBufferThread(VKTextureTransferEngine& parent) : _parent(parent) {}
109 VKTextureTransferEngine& _parent;
114 std::vector<TexturePointer> getAllTextures();
115 void resetFrameTextureCreated() { _frameTexturesCreated = 0; }
117 using ActiveTransferJob = std::pair<TexturePointer, TransferJobPointer>;
118 using ActiveTransferQueue = std::list<ActiveTransferJob>;
120 void populateActiveBufferQueue();
121 bool processActiveBufferQueue();
122 void processTransferQueues();
123 void populateTransferQueue(
const TexturePointer& texturePointer);
125 void updateMemoryPressure();
127 void processDemotes(
size_t relief,
const std::vector<TexturePointer>& strongTextures);
128 void processPromotes();
131 static const size_t MAX_RESOURCE_TEXTURES_PER_FRAME{ 2 };
132 size_t _frameTexturesCreated{ 0 };
133 std::list<TextureWeakPointer> _registeredTextures;
135 std::atomic<bool> _shutdown{
false };
139 WorkQueue _promoteQueue;
143 ActiveTransferQueue _activeBufferQueue;
146 ActiveTransferQueue _activeTransferQueue;
151 TextureBufferThread* _transferThread{
nullptr };
153 std::atomic<size_t> _queuedBufferSize{ 0 };
156 TransferMap _pendingTransfersMap;
161 class VKVariableAllocationSupport {
162 friend class VKBackend;
165 VKVariableAllocationSupport();
166 virtual ~VKVariableAllocationSupport() ;
167 virtual void populateTransferQueue(TransferQueue& pendingTransfers) = 0;
169 void sanityCheck()
const;
170 uint16 populatedMip()
const {
return _populatedMip; }
171 bool canPromote()
const {
return _allocatedMip > _minAllocatedMip; }
172 bool canDemote()
const {
return _allocatedMip < _maxAllocatedMip; }
173 bool hasPendingTransfers()
const {
return _populatedMip > _allocatedMip; }
175 virtual size_t promote() = 0;
176 virtual size_t demote() = 0;
178 static const uvec3 MAX_TRANSFER_DIMENSIONS;
179 static const uvec3 INITIAL_MIP_TRANSFER_DIMENSIONS;
180 static const size_t MAX_TRANSFER_SIZE;
181 static const size_t MAX_BUFFER_SIZE;
188 void incrementPopulatedSize(Size delta)
const;
189 void decrementPopulatedSize(Size delta)
const;
190 mutable Size _populatedSize { 0 };
195 uint16 _allocatedMip { 0 };
198 uint16 _populatedMip { 0 };
201 uint16 _maxAllocatedMip { 0 };
204 uint16 _minAllocatedMip { 0 };
Definition: VKTextureTransfer.h:52