-
Notifications
You must be signed in to change notification settings - Fork 306
Expand file tree
/
Copy pathUploadManager.java
More file actions
118 lines (89 loc) · 4.06 KB
/
UploadManager.java
File metadata and controls
118 lines (89 loc) · 4.06 KB
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package net.vulkanmod.render.chunk.buffer;
import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
import net.vulkanmod.vulkan.Synchronization;
import net.vulkanmod.vulkan.Vulkan;
import net.vulkanmod.vulkan.device.DeviceManager;
import net.vulkanmod.vulkan.memory.buffer.Buffer;
import net.vulkanmod.vulkan.memory.buffer.StagingBuffer;
import net.vulkanmod.vulkan.queue.CommandPool;
import net.vulkanmod.vulkan.queue.Queue;
import net.vulkanmod.vulkan.queue.TransferQueue;
import org.lwjgl.system.MemoryStack;
import org.lwjgl.vulkan.VkBufferMemoryBarrier;
import org.lwjgl.vulkan.VkCommandBuffer;
import org.lwjgl.vulkan.VkMemoryBarrier;
import java.nio.ByteBuffer;
import static org.lwjgl.vulkan.VK10.*;
public class UploadManager {
public static UploadManager INSTANCE;
public static void createInstance() {
INSTANCE = new UploadManager();
}
Queue queue = DeviceManager.getTransferQueue();
CommandPool.CommandBuffer commandBuffer;
LongOpenHashSet dstBuffers = new LongOpenHashSet();
public void submitUploads() {
if (this.commandBuffer == null)
return;
this.queue.submitCommands(this.commandBuffer);
Synchronization.INSTANCE.addCommandBuffer(this.commandBuffer);
this.commandBuffer = null;
this.dstBuffers.clear();
}
public void recordUpload(Buffer buffer, long dstOffset, long bufferSize, ByteBuffer src) {
StagingBuffer stagingBuffer = Vulkan.getStagingBuffer();
stagingBuffer.copyBuffer((int) bufferSize, src);
beginCommands();
VkCommandBuffer commandBuffer = this.commandBuffer.getHandle();
if (!this.dstBuffers.add(buffer.getId())) {
try (MemoryStack stack = MemoryStack.stackPush()) {
VkMemoryBarrier.Buffer barrier = VkMemoryBarrier.calloc(1, stack);
barrier.sType$Default();
barrier.srcAccessMask(VK_ACCESS_TRANSFER_WRITE_BIT);
barrier.dstAccessMask(VK_ACCESS_TRANSFER_WRITE_BIT);
vkCmdPipelineBarrier(commandBuffer,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
0,
barrier,
null,
null);
}
this.dstBuffers.clear();
}
TransferQueue.uploadBufferCmd(commandBuffer, stagingBuffer.getId(), stagingBuffer.getOffset(), buffer.getId(), dstOffset, bufferSize);
}
public void copyBuffer(Buffer src, Buffer dst) {
copyBuffer(src, 0, dst, 0, src.getBufferSize());
}
public void copyBuffer(Buffer src, long srcOffset, Buffer dst, long dstOffset, long size) {
beginCommands();
VkCommandBuffer commandBuffer = this.commandBuffer.getHandle();
try (MemoryStack stack = MemoryStack.stackPush()) {
VkMemoryBarrier.Buffer barrier = VkMemoryBarrier.calloc(1, stack);
barrier.sType$Default();
VkBufferMemoryBarrier.Buffer bufferMemoryBarriers = VkBufferMemoryBarrier.calloc(1, stack);
VkBufferMemoryBarrier bufferMemoryBarrier = bufferMemoryBarriers.get(0);
bufferMemoryBarrier.sType$Default();
bufferMemoryBarrier.buffer(src.getId());
bufferMemoryBarrier.srcAccessMask(VK_ACCESS_TRANSFER_WRITE_BIT);
bufferMemoryBarrier.dstAccessMask(VK_ACCESS_TRANSFER_READ_BIT);
bufferMemoryBarrier.size(VK_WHOLE_SIZE);
vkCmdPipelineBarrier(commandBuffer,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
0,
barrier,
bufferMemoryBarriers,
null);
}
this.dstBuffers.add(dst.getId());
TransferQueue.uploadBufferCmd(commandBuffer, src.getId(), srcOffset, dst.getId(), dstOffset, size);
}
public void syncUploads() {
submitUploads();
Synchronization.INSTANCE.recycleCmdBuffers();
}
private void beginCommands() {
if (this.commandBuffer == null)
this.commandBuffer = queue.beginCommands();
}
}