Skip to content

Commit

Permalink
Fixing a missing close in descriptor update builder
Browse files Browse the repository at this point in the history
  • Loading branch information
bobcao3 committed May 23, 2024
1 parent 36dd2f7 commit 0a379b0
Show file tree
Hide file tree
Showing 10 changed files with 296 additions and 104 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import me.cortex.vulkanite.lib.cmd.VCommandPool;
import me.cortex.vulkanite.lib.descriptors.DescriptorSetLayoutBuilder;
import me.cortex.vulkanite.lib.descriptors.VDescriptorSetLayout;
import me.cortex.vulkanite.lib.memory.AccelerationStructurePool;
import me.cortex.vulkanite.lib.memory.PoolLinearAllocator;
import me.cortex.vulkanite.lib.memory.VAccelerationStructure;
import me.cortex.vulkanite.lib.memory.VBuffer;
Expand Down Expand Up @@ -66,11 +67,14 @@ public int getAsyncQueue() {
return asyncQueue;
}

private final AccelerationStructurePool accelerationStructurePool;

public AccelerationBlasBuilder(VContext context, int asyncQueue, Consumer<BLASBatchResult> resultConsumer) {
this.queryPool = VQueryPool.create(context.device, 10000, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR);
this.context = context;
this.asyncQueue = asyncQueue;
this.resultConsumer = resultConsumer;
this.accelerationStructurePool = new AccelerationStructurePool(context);

var decodeShader = VShader.compileLoad(context, """
#version 460
Expand Down Expand Up @@ -345,8 +349,7 @@ private void run() {

// Dont need a memory barrier cause submit ensures cache flushing already
for (int idx = 0; idx < compactedSizes.length; idx++) {
var compact_as = context.memory.createAcceleration(compactedSizes[idx], 256,
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR, VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR);
var compact_as = accelerationStructurePool.createAcceleration(compactedSizes[idx], VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR);
var fat_as = accelerationStructures.get(idx);

vkCmdCopyAccelerationStructureKHR(cmdRef.get().buffer(), VkCopyAccelerationStructureInfoKHR.calloc(stack).sType$Default()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public void updateTick() {
}

public VRef<VAccelerationStructure> buildTLAS(int queueId, VCmdBuff cmd) {
blasExecutions.forEach(exec -> ctx.cmd.queueWaitForExeuction(queueId, blasBuilder.getAsyncQueue(), exec));
ctx.cmd.queueWaitForExecutions(queueId, blasBuilder.getAsyncQueue(), blasExecutions);
blasExecutions.clear();
return tlasManager.buildTLAS(cmd);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public VRef<VAccelerationStructure> buildTLAS(VCmdBuff cmd) {
// this is done for performance reasons when updating (adding/removing) sections

VkAccelerationStructureGeometryKHR geometry = VkAccelerationStructureGeometryKHR.calloc(stack);
int instances = 0;
int instances = buildDataManager.sectionCount();

Pair<VRef<VAccelerationStructure>, VRef<VBuffer>> entityBuild;
if (entityData != null) {
Expand All @@ -90,46 +90,33 @@ public VRef<VAccelerationStructure> buildTLAS(VCmdBuff cmd) {
entityBuild = null;
}

{
// TODO: need to sync with respect to updates from gpu memory updates from
// TLASBuildDataManager
// OR SOMETHING CAUSE WITH MULTIPLE FRAMES GOING AT ONCE the gpu state of
// TLASBuildDataManager needs to be synced with
// the current build phase, and the gpu side needs to be updated accoringly and
// synced correctly

cmd.encodeMemoryBarrier();

VkAccelerationStructureInstanceKHR extra = null;
if (entityBuild != null) {
extra = VkAccelerationStructureInstanceKHR.calloc(stack);
extra.mask(~0)
.instanceCustomIndex(0)
.instanceShaderBindingTableRecordOffset(1)
.accelerationStructureReference(entityBuild.getLeft().get().deviceAddress);
extra.transform().matrix(new Matrix4x3f().getTransposed(stack.mallocFloat(12)));
buildDataManager.descUpdateJobs.add(new TLASSectionManager.DescUpdateJob(0,0, entityBuild.getRight(), List.of(0L)));
instances++;
}
buildDataManager.setGeometryUpdateMemory(geometry, extra);
instances += buildDataManager.sectionCount();

cmd.encodeMemoryBarrier();
VkAccelerationStructureInstanceKHR extra = null;
if (entityBuild != null) {
extra = VkAccelerationStructureInstanceKHR.calloc(stack);
extra.mask(~0)
.instanceCustomIndex(0)
.instanceShaderBindingTableRecordOffset(1)
.accelerationStructureReference(entityBuild.getLeft().get().deviceAddress);
extra.transform().matrix(new Matrix4x3f().getTransposed(stack.mallocFloat(12)));
buildDataManager.descUpdateJobs.add(new TLASSectionManager.DescUpdateJob(0, 0, entityBuild.getRight(), List.of(0L)));
instances++;
}

var instanceBuffer = buildDataManager.getInstanceBuffer(extra);

geometry.sType$Default()
.geometryType(VK_GEOMETRY_TYPE_INSTANCES_KHR)
.flags(0);

int[] instanceCounts = new int[]{instances};
{
geometry.sType$Default()
.geometryType(VK_GEOMETRY_TYPE_INSTANCES_KHR)
.flags(0);

geometry.geometry()
.instances()
.sType$Default()
.arrayOfPointers(false);
}
geometry.geometry()
.instances()
.sType$Default()
.arrayOfPointers(false);

geometry.geometry()
.instances()
.data()
.deviceAddress(instanceBuffer.get().deviceAddress());


// TLAS always rebuild & PREFER_FAST_TRACE according to Nvidia
Expand All @@ -145,12 +132,13 @@ public VRef<VAccelerationStructure> buildTLAS(VCmdBuff cmd) {
.calloc(stack)
.sType$Default();

int[] instanceCounts = new int[]{instances};
vkGetAccelerationStructureBuildSizesKHR(
context.device,
VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR,
buildInfo.get(0), // The reason its a buffer is cause of pain and that
// vkCmdBuildAccelerationStructuresKHR requires a buffer of
// VkAccelerationStructureBuildGeometryInfoKHR
// vkCmdBuildAccelerationStructuresKHR requires a buffer of
// VkAccelerationStructureBuildGeometryInfoKHR
stack.ints(instanceCounts),
buildSizesInfo);

Expand Down Expand Up @@ -178,10 +166,14 @@ public VRef<VAccelerationStructure> buildTLAS(VCmdBuff cmd) {
}
buildRanges.rewind();

cmd.encodeMemoryBarrier();

vkCmdBuildAccelerationStructuresKHR(cmd.buffer(),
buildInfo,
stack.pointers(buildRanges));
cmd.addBufferRef(instanceBuffer);
cmd.addBufferRef(scratchBuffer);
instanceBuffer.close();
scratchBuffer.close();

cmd.encodeMemoryBarrier();
Expand Down Expand Up @@ -215,7 +207,7 @@ public TLASGeometryManager() {

// TODO: make the instances buffer, gpu permenent then stream updates instead of
// uploading per frame
public VRef<VBuffer> setGeometryUpdateMemory(VkAccelerationStructureGeometryKHR struct, VkAccelerationStructureInstanceKHR addin) {
public VRef<VBuffer> getInstanceBuffer(VkAccelerationStructureInstanceKHR addin) {
long size = (long) VkAccelerationStructureInstanceKHR.SIZEOF * count;
long newSize = size + (addin==null?0:VkAccelerationStructureInstanceKHR.SIZEOF);
if (newSize == 0) {
Expand All @@ -239,11 +231,6 @@ public VRef<VBuffer> setGeometryUpdateMemory(VkAccelerationStructureGeometryKHR
data.get().unmap();
data.get().flush();

struct.geometry()
.instances()
.data()
.deviceAddress(data.get().deviceAddress());

return data;
}

Expand Down Expand Up @@ -355,15 +342,7 @@ public void resizeBindlessSet(int newSize) {
+ " with capacity " + newCapacity);

if (geometryBufferDescSet != null) {
try (var stack = stackPush()) {
var setCopy = VkCopyDescriptorSet.calloc(1, stack);
setCopy.get(0)
.sType$Default()
.srcSet(geometryBufferDescSet.get().set)
.dstSet(newGeometryBufferDescSet.get().set)
.descriptorCount(setCapacity);
vkUpdateDescriptorSets(context.device, null, setCopy);
}
newGeometryBufferDescSet.get().copyFrom(context, geometryBufferDescSet, setCapacity);
geometryBufferDescSet.close();
}

Expand All @@ -374,27 +353,24 @@ public void resizeBindlessSet(int newSize) {
}

@Override
public VRef<VBuffer> setGeometryUpdateMemory(VkAccelerationStructureGeometryKHR struct, VkAccelerationStructureInstanceKHR addin) {
var instanceBuf = super.setGeometryUpdateMemory(struct, addin);
public VRef<VBuffer> getInstanceBuffer(VkAccelerationStructureInstanceKHR addin) {
resizeBindlessSet(arena.maxIndex);

if (descUpdateJobs.isEmpty()) {
return null;
}

var dub = new DescriptorUpdateBuilder(context, descUpdateJobs.size());
dub.set(geometryBufferDescSet);
while (!descUpdateJobs.isEmpty()) {
var job = descUpdateJobs.poll();
dub.buffer(job.binding, job.dstArrayElement, job.geometryBuffer, job.geometryBufferOffsets);
if (!descUpdateJobs.isEmpty()) {
var dub = new DescriptorUpdateBuilder(context, descUpdateJobs.size());
dub.set(geometryBufferDescSet);
while (!descUpdateJobs.isEmpty()) {
var job = descUpdateJobs.poll();
dub.buffer(job.binding, job.dstArrayElement, job.geometryBuffer, job.geometryBufferOffsets);
}
dub.apply();
}
dub.apply();

// Since we have residency tracking through the descriptor set,
// we can free the buffers immediately
collect();

return instanceBuf;
return super.getInstanceBuffer(addin);
}

// TODO: mixinto RenderSection and add a reference to a holder for us, its much
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,9 +243,6 @@ private void buildEntities() {
public void renderPostShadows(List<VRef<VGImage>> vgOutImgs, Camera camera, ShaderStorageBuffer[] ssbos, MixinCelestialUniforms celestialUniforms) {
ctx.cmd.newFrame();

VRegistry.INSTANCE.threadLocalCollect();
System.out.println(VRegistry.INSTANCE.dumpStats());

buildEntities();

PBRTextureManager.notifyPBRTexturesChanged();
Expand All @@ -262,6 +259,7 @@ public void renderPostShadows(List<VRef<VGImage>> vgOutImgs, Camera camera, Shad
var tlas = accelerationManager.buildTLAS(0, cmd);

if (tlas == null) {
VRegistry.INSTANCE.threadLocalCollect();
glFinish();
return;
}
Expand Down Expand Up @@ -428,6 +426,9 @@ public void renderPostShadows(List<VRef<VGImage>> vgOutImgs, Camera camera, Shad
vref_out.close();
in.close();
out.close();

VRegistry.INSTANCE.threadLocalCollect();
System.out.println(VRegistry.INSTANCE.dumpStats());
}

public void destory() {
Expand Down
Loading

0 comments on commit 0a379b0

Please sign in to comment.