Skip to content

Commit d0340ab

Browse files
committed
figure out uniform details
1 parent a00411b commit d0340ab

File tree

21 files changed

+347
-160
lines changed

21 files changed

+347
-160
lines changed

jme3-examples/src/main/java/jme3test/vulkan/VulkanHelperTest.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -223,17 +223,12 @@ public void simpleInitApp() {
223223
// the cpu cannot directly access fast gpu memory. The solution is to
224224
// copy cpu-side data to a mutual staging buffer, then have the gpu copy
225225
// that data to faster memory. Hence, why we use a StageableBuffer here.
226-
vertexBuffer = new StageableBuffer(device, MemorySize.floats(vertexData.capacity()),
226+
vertexBuffer = new StaticBuffer(device, transferPool, MemorySize.floats(vertexData.capacity()),
227227
new BufferUsageFlags().vertexBuffer(), new MemoryFlags().deviceLocal(), false);
228-
vertexBuffer.copy(stack, vertexData); // copy data to staging buffer
229-
vertexBuffer.transfer(transferPool);
230-
vertexBuffer.freeStagingBuffer();
231-
// index buffer
232-
indexBuffer = new StageableBuffer(device, MemorySize.ints(indexData.capacity()),
228+
vertexBuffer.copy(stack, vertexData);
229+
indexBuffer = new StaticBuffer(device, transferPool, MemorySize.ints(indexData.capacity()),
233230
new BufferUsageFlags().indexBuffer(), new MemoryFlags().deviceLocal(), false);
234231
indexBuffer.copy(stack, indexData);
235-
indexBuffer.transfer(transferPool);
236-
indexBuffer.freeStagingBuffer();
237232
}
238233

239234
// material color texture
@@ -297,7 +292,7 @@ private ImageView createDepthAttachment(CommandPool pool) {
297292
CommandBuffer commands = pool.allocateOneTimeCommandBuffer();
298293
commands.begin();
299294
image.transitionLayout(commands, Image.Layout.Undefined, Image.Layout.DepthStencilAttachmentOptimal);
300-
commands.endAndSubmit(new SyncGroup());
295+
commands.endAndSubmit(SyncGroup.ASYNC);
301296
commands.getPool().getQueue().waitIdle();
302297
return view;
303298
}

jme3-lwjgl3/src/main/java/com/jme3/vulkan/buffers/GpuBuffer.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.lwjgl.system.MemoryStack;
1212
import org.lwjgl.system.MemoryUtil;
1313
import org.lwjgl.system.Struct;
14+
import org.lwjgl.system.StructBuffer;
1415
import org.lwjgl.vulkan.VkBufferCopy;
1516
import org.lwjgl.vulkan.VkBufferCreateInfo;
1617
import org.lwjgl.vulkan.VkMemoryRequirements;
@@ -106,8 +107,8 @@ public LongBuffer mapLongs(MemoryStack stack, int offset, int size, int flags) {
106107
return map(stack, offset, size * Long.BYTES, flags).getLongBuffer(0, size);
107108
}
108109

109-
public <T extends Struct<T>> T mapStruct(MemoryStack stack, int offset, int size, int flags, LongFunction<T> factory) {
110-
return factory.apply(map(stack, offset, size, flags).get(0));
110+
public <T> T mapObject(MemoryStack stack, int offset, int size, int flags, Function<PointerBuffer, T> factory) {
111+
return factory.apply(map(stack, offset, size, flags));
111112
}
112113

113114
public void copy(MemoryStack stack, ByteBuffer buffer) {
@@ -153,6 +154,13 @@ public void copy(MemoryStack stack, Struct<?> struct) {
153154
unmap();
154155
}
155156

157+
public void copy(MemoryStack stack, StructBuffer<?, ?> buffer) {
158+
verifyBufferSize(buffer.limit(), buffer.sizeof());
159+
int size = buffer.limit() * buffer.sizeof();
160+
MemoryUtil.memCopy(MemoryUtil.memByteBuffer(buffer.address(), size), mapBytes(stack, 0, size, 0));
161+
unmap();
162+
}
163+
156164
public void unmap() {
157165
memory.unmap();
158166
}
@@ -172,4 +180,8 @@ public MemorySize size() {
172180
return size;
173181
}
174182

183+
public LogicalDevice<?> getDevice() {
184+
return device;
185+
}
186+
175187
}

jme3-lwjgl3/src/main/java/com/jme3/vulkan/buffers/StageableBuffer.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class StageableBuffer extends GpuBuffer {
1818
public StageableBuffer(LogicalDevice device, MemorySize size,
1919
BufferUsageFlags usage, MemoryFlags mem, boolean concurrent) {
2020
super(device, size, usage.transferDst(), mem, concurrent);
21-
stage = new GpuBuffer(device, size, new BufferUsageFlags().transferSrc(),
21+
this.stage = new GpuBuffer(device, size, new BufferUsageFlags().transferSrc(),
2222
new MemoryFlags().hostVisible().hostCoherent(), concurrent);
2323
}
2424

@@ -38,25 +38,24 @@ public void freeMemory() {
3838
stage.freeMemory();
3939
}
4040

41-
public void unmap(SyncGroup sync) {
42-
stage.unmap();
43-
}
44-
4541
public void transfer(CommandPool transferPool) {
46-
transfer(transferPool, new SyncGroup());
47-
transferPool.getQueue().waitIdle();
42+
transfer(transferPool, SyncGroup.ASYNC);
4843
}
4944

5045
public void transfer(CommandPool transferPool, SyncGroup sync) {
5146
if (stage.getNativeReference().isDestroyed()) {
5247
throw new IllegalStateException("Staging buffer has already been freed.");
5348
}
54-
CommandBuffer commands = transferPool.allocateOneTimeCommandBuffer();
55-
commands.begin();
49+
CommandBuffer cmd = transferPool.allocateOneTimeCommandBuffer();
50+
cmd.begin();
51+
transfer(cmd);
52+
cmd.endAndSubmit(sync);
53+
}
54+
55+
public void transfer(CommandBuffer cmd) {
5656
try (MemoryStack stack = MemoryStack.stackPush()) {
57-
recordCopy(stack, commands, stage, 0, 0, size().getBytes());
57+
recordCopy(stack, cmd, stage, 0, 0, size().getBytes());
5858
}
59-
commands.endAndSubmit(sync);
6059
}
6160

6261
public void freeStagingBuffer() {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.jme3.vulkan.buffers;
2+
3+
import com.jme3.vulkan.commands.CommandPool;
4+
import com.jme3.vulkan.devices.LogicalDevice;
5+
import com.jme3.vulkan.flags.BufferUsageFlags;
6+
import com.jme3.vulkan.flags.MemoryFlags;
7+
import com.jme3.vulkan.sync.Fence;
8+
import com.jme3.vulkan.sync.SyncGroup;
9+
import com.jme3.vulkan.sync.TaskQueue;
10+
11+
import java.util.concurrent.*;
12+
13+
public class StaticBuffer extends StageableBuffer {
14+
15+
private final CommandPool transferPool;
16+
17+
public StaticBuffer(LogicalDevice device, CommandPool transferPool, MemorySize size, BufferUsageFlags usage, MemoryFlags mem, boolean concurrent) {
18+
super(device, size, usage, mem, concurrent);
19+
this.transferPool = transferPool;
20+
}
21+
22+
@Override
23+
public void unmap() {
24+
super.unmap();
25+
SyncGroup sync = new SyncGroup(new Fence(getDevice(), false));
26+
transfer(transferPool, sync);
27+
sync.getFence().block(5000);
28+
freeStagingBuffer();
29+
}
30+
31+
public void unmapAsync(TaskQueue queue, SyncGroup sync) {
32+
if (!sync.containsFence()) {
33+
throw new IllegalArgumentException("SyncGroup must contain a fence.");
34+
}
35+
transfer(transferPool, sync);
36+
queue.submit(new FutureTask<>(() -> {
37+
sync.getFence().block(5000);
38+
freeStagingBuffer();
39+
}, true));
40+
}
41+
42+
}

jme3-lwjgl3/src/main/java/com/jme3/vulkan/descriptors/DescriptorSet.java

Lines changed: 25 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,57 @@
11
package com.jme3.vulkan.descriptors;
22

3+
import com.jme3.util.natives.Native;
4+
import com.jme3.vulkan.VulkanObject;
35
import com.jme3.vulkan.devices.LogicalDevice;
46
import org.lwjgl.system.MemoryStack;
57
import org.lwjgl.vulkan.VkWriteDescriptorSet;
68

79
import static org.lwjgl.vulkan.VK10.*;
810

9-
public class DescriptorSet {
11+
public class DescriptorSet extends VulkanObject<Long> {
1012

1113
private final LogicalDevice<?> device;
1214
private final DescriptorPool pool;
1315
private final DescriptorSetLayout layout;
14-
private final long id;
1516

1617
public DescriptorSet(LogicalDevice<?> device, DescriptorPool pool, DescriptorSetLayout layout, long id) {
1718
this.device = device;
1819
this.pool = pool;
1920
this.layout = layout;
20-
this.id = id;
21+
this.object = id;
22+
ref = Native.get().register(this);
23+
pool.getNativeReference().addDependent(ref);
2124
}
2225

23-
public void update(boolean force, DescriptorSetWriter... writers) {
24-
try (MemoryStack stack = MemoryStack.stackPush()) {
25-
int updating = countWritersToUpdate(force, writers);
26-
if (updating > 0) {
27-
VkWriteDescriptorSet.Buffer write = VkWriteDescriptorSet.calloc(updating, stack);
28-
for (DescriptorSetWriter w : writers) {
29-
if (force || w.isUpdateNeeded()) {
30-
w.populateWrite(stack, write.get()
31-
.sType(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET)
32-
.dstSet(id));
33-
}
34-
}
35-
write.flip();
36-
vkUpdateDescriptorSets(device.getNativeObject(), write, null);
26+
@Override
27+
public Runnable createNativeDestroyer() {
28+
return () -> {
29+
try (MemoryStack stack = MemoryStack.stackPush()) {
30+
vkFreeDescriptorSets(device.getNativeObject(),
31+
pool.getNativeObject(), stack.longs(object));
3732
}
38-
}
33+
};
3934
}
4035

41-
private int countWritersToUpdate(boolean force, DescriptorSetWriter... writers) {
42-
if (force) {
43-
return writers.length;
44-
}
45-
int updating = 0;
46-
for (DescriptorSetWriter w : writers) {
47-
if (w.isUpdateNeeded()) {
48-
updating++;
49-
}
36+
public void write(DescriptorSetWriter... writers) {
37+
try (MemoryStack stack = MemoryStack.stackPush()) {
38+
VkWriteDescriptorSet.Buffer write = VkWriteDescriptorSet.calloc(writers.length, stack);
39+
populateWriteBuffer(stack, write, writers);
40+
write.flip();
41+
vkUpdateDescriptorSets(device.getNativeObject(), write, null);
5042
}
51-
return updating;
5243
}
5344

54-
public void free() {
55-
if (pool.getNativeReference().isDestroyed()) {
56-
return;
57-
}
58-
try (MemoryStack stack = MemoryStack.stackPush()) {
59-
vkFreeDescriptorSets(device.getNativeObject(), pool.getNativeObject(), stack.longs(id));
45+
public void populateWriteBuffer(MemoryStack stack, VkWriteDescriptorSet.Buffer buffer, DescriptorSetWriter... writers) {
46+
for (DescriptorSetWriter w : writers) {
47+
w.populateWrite(stack, buffer.get()
48+
.sType(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET)
49+
.dstSet(object));
6050
}
6151
}
6252

6353
public long getId() {
64-
return id;
54+
return object;
6555
}
6656

6757
public LogicalDevice<?> getDevice() {

jme3-lwjgl3/src/main/java/com/jme3/vulkan/descriptors/DescriptorSetWriter.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,4 @@ public interface DescriptorSetWriter {
77

88
void populateWrite(MemoryStack stack, VkWriteDescriptorSet write);
99

10-
default boolean isUpdateNeeded() {
11-
return true;
12-
}
13-
1410
}

jme3-lwjgl3/src/main/java/com/jme3/vulkan/devices/ComputeDevice.java

Lines changed: 0 additions & 9 deletions
This file was deleted.

jme3-lwjgl3/src/main/java/com/jme3/vulkan/devices/GeneralPhysicalDevice.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212

1313
import static org.lwjgl.vulkan.VK10.*;
1414

15-
public class GeneralPhysicalDevice extends AbstractPhysicalDevice
16-
implements GraphicalDevice, PresentDevice, ComputeDevice {
15+
public class GeneralPhysicalDevice extends AbstractPhysicalDevice implements GraphicalDevice, PresentDevice {
1716

1817
private final Surface surface;
1918
private Integer graphicsIndex, presentIndex;
@@ -82,6 +81,11 @@ public Queue getCompute() {
8281
return graphics;
8382
}
8483

84+
@Override
85+
public Queue getDataTransfer() {
86+
return graphics;
87+
}
88+
8589
public boolean allQueuesAvailable() {
8690
return graphicsIndex != null && presentIndex != null;
8791
}

jme3-lwjgl3/src/main/java/com/jme3/vulkan/devices/PhysicalDevice.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.jme3.vulkan.devices;
22

3+
import com.jme3.vulkan.commands.Queue;
34
import com.jme3.vulkan.surface.Surface;
45
import com.jme3.vulkan.VulkanInstance;
56
import com.jme3.vulkan.images.Image;
@@ -34,4 +35,8 @@ public interface PhysicalDevice {
3435

3536
boolean querySwapchainSupport(Surface surface);
3637

38+
Queue getCompute();
39+
40+
Queue getDataTransfer();
41+
3742
}

jme3-lwjgl3/src/main/java/com/jme3/vulkan/images/VulkanImageLoader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ Image.Tiling.Optimal, new ImageUsageFlags().transferDst().sampled(),
175175
image.getNativeObject(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, region);
176176
image.transitionLayout(commands, Image.Layout.TransferDstOptimal, Image.Layout.ShaderReadOnlyOptimal);
177177
commands.end();
178-
commands.submit(new SyncGroup());
178+
commands.submit(SyncGroup.ASYNC);
179179
transferPool.getQueue().waitIdle();
180180
return image;
181181
}

0 commit comments

Comments
 (0)