mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-03-10 11:11:51 +00:00
Add some more pipeline barriers hoping it will make any difference to Nvidia drivers crashing on a worker thread (yay, nvidia!)
This commit is contained in:
parent
8517c9713a
commit
3f28a7e5e4
1 changed files with 26 additions and 16 deletions
|
@ -100,10 +100,6 @@ void VkRaytrace::CreateVulkanObjects()
|
||||||
CreateVertexAndIndexBuffers();
|
CreateVertexAndIndexBuffers();
|
||||||
CreateBottomLevelAccelerationStructure();
|
CreateBottomLevelAccelerationStructure();
|
||||||
CreateTopLevelAccelerationStructure();
|
CreateTopLevelAccelerationStructure();
|
||||||
|
|
||||||
PipelineBarrier finishbuildbarrier;
|
|
||||||
finishbuildbarrier.addMemory(VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, VK_ACCESS_SHADER_READ_BIT);
|
|
||||||
finishbuildbarrier.execute(GetVulkanFrameBuffer()->GetTransferCommands(), VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VkRaytrace::CreateVertexAndIndexBuffers()
|
void VkRaytrace::CreateVertexAndIndexBuffers()
|
||||||
|
@ -116,6 +112,16 @@ void VkRaytrace::CreateVertexAndIndexBuffers()
|
||||||
size_t vertexoffset = 0;
|
size_t vertexoffset = 0;
|
||||||
size_t indexoffset = vertexoffset + vertexbuffersize;
|
size_t indexoffset = vertexoffset + vertexbuffersize;
|
||||||
|
|
||||||
|
BufferBuilder tbuilder;
|
||||||
|
tbuilder.setUsage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY);
|
||||||
|
tbuilder.setSize(transferbuffersize);
|
||||||
|
transferBuffer = tbuilder.create(GetVulkanFrameBuffer()->device);
|
||||||
|
transferBuffer->SetDebugName("transferBuffer");
|
||||||
|
uint8_t* data = (uint8_t*)transferBuffer->Map(0, transferbuffersize);
|
||||||
|
memcpy(data + vertexoffset, Mesh->MeshVertices.Data(), vertexbuffersize);
|
||||||
|
memcpy(data + indexoffset, Mesh->MeshElements.Data(), indexbuffersize);
|
||||||
|
transferBuffer->Unmap();
|
||||||
|
|
||||||
BufferBuilder vbuilder;
|
BufferBuilder vbuilder;
|
||||||
vbuilder.setUsage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
|
vbuilder.setUsage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
|
||||||
vbuilder.setSize(vertexbuffersize);
|
vbuilder.setSize(vertexbuffersize);
|
||||||
|
@ -128,22 +134,13 @@ void VkRaytrace::CreateVertexAndIndexBuffers()
|
||||||
indexBuffer = ibuilder.create(GetVulkanFrameBuffer()->device);
|
indexBuffer = ibuilder.create(GetVulkanFrameBuffer()->device);
|
||||||
indexBuffer->SetDebugName("indexBuffer");
|
indexBuffer->SetDebugName("indexBuffer");
|
||||||
|
|
||||||
BufferBuilder tbuilder;
|
|
||||||
tbuilder.setUsage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY);
|
|
||||||
tbuilder.setSize(transferbuffersize);
|
|
||||||
transferBuffer = tbuilder.create(GetVulkanFrameBuffer()->device);
|
|
||||||
transferBuffer->SetDebugName("transferBuffer");
|
|
||||||
uint8_t* data = (uint8_t*)transferBuffer->Map(0, transferbuffersize);
|
|
||||||
memcpy(data + vertexoffset, Mesh->MeshVertices.Data(), vertexbuffersize);
|
|
||||||
memcpy(data + indexoffset, Mesh->MeshElements.Data(), indexbuffersize);
|
|
||||||
transferBuffer->Unmap();
|
|
||||||
|
|
||||||
GetVulkanFrameBuffer()->GetTransferCommands()->copyBuffer(transferBuffer.get(), vertexBuffer.get(), vertexoffset);
|
GetVulkanFrameBuffer()->GetTransferCommands()->copyBuffer(transferBuffer.get(), vertexBuffer.get(), vertexoffset);
|
||||||
GetVulkanFrameBuffer()->GetTransferCommands()->copyBuffer(transferBuffer.get(), indexBuffer.get(), indexoffset);
|
GetVulkanFrameBuffer()->GetTransferCommands()->copyBuffer(transferBuffer.get(), indexBuffer.get(), indexoffset);
|
||||||
|
|
||||||
|
// Finish transfer before using it for building
|
||||||
VkMemoryBarrier barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER };
|
VkMemoryBarrier barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER };
|
||||||
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||||
barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR;
|
barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
|
||||||
GetVulkanFrameBuffer()->GetTransferCommands()->pipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, 0, 1, &barrier, 0, nullptr, 0, nullptr);
|
GetVulkanFrameBuffer()->GetTransferCommands()->pipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, 0, 1, &barrier, 0, nullptr, 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,6 +197,7 @@ void VkRaytrace::CreateBottomLevelAccelerationStructure()
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
throw std::runtime_error("vkCreateAccelerationStructureKHR failed");
|
throw std::runtime_error("vkCreateAccelerationStructureKHR failed");
|
||||||
blAccelStruct = std::make_unique<VulkanAccelerationStructure>(GetVulkanFrameBuffer()->device, blAccelStructHandle);
|
blAccelStruct = std::make_unique<VulkanAccelerationStructure>(GetVulkanFrameBuffer()->device, blAccelStructHandle);
|
||||||
|
blAccelStruct->SetDebugName("blAccelStruct");
|
||||||
|
|
||||||
BufferBuilder sbuilder;
|
BufferBuilder sbuilder;
|
||||||
sbuilder.setUsage(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
|
sbuilder.setUsage(VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
|
||||||
|
@ -215,6 +213,12 @@ void VkRaytrace::CreateBottomLevelAccelerationStructure()
|
||||||
buildInfo.scratchData.deviceAddress = scratchAddress;
|
buildInfo.scratchData.deviceAddress = scratchAddress;
|
||||||
VkAccelerationStructureBuildRangeInfoKHR* rangeInfos[] = { &rangeInfo };
|
VkAccelerationStructureBuildRangeInfoKHR* rangeInfos[] = { &rangeInfo };
|
||||||
GetVulkanFrameBuffer()->GetTransferCommands()->buildAccelerationStructures(1, &buildInfo, rangeInfos);
|
GetVulkanFrameBuffer()->GetTransferCommands()->buildAccelerationStructures(1, &buildInfo, rangeInfos);
|
||||||
|
|
||||||
|
// Finish building before using it as input to a toplevel accel structure
|
||||||
|
VkMemoryBarrier barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER };
|
||||||
|
barrier.srcAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR;
|
||||||
|
barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR;
|
||||||
|
GetVulkanFrameBuffer()->GetTransferCommands()->pipelineBarrier(VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, 0, 1, &barrier, 0, nullptr, 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VkRaytrace::CreateTopLevelAccelerationStructure()
|
void VkRaytrace::CreateTopLevelAccelerationStructure()
|
||||||
|
@ -250,9 +254,10 @@ void VkRaytrace::CreateTopLevelAccelerationStructure()
|
||||||
|
|
||||||
GetVulkanFrameBuffer()->GetTransferCommands()->copyBuffer(tlTransferBuffer.get(), tlInstanceBuffer.get());
|
GetVulkanFrameBuffer()->GetTransferCommands()->copyBuffer(tlTransferBuffer.get(), tlInstanceBuffer.get());
|
||||||
|
|
||||||
|
// Finish transfering before using it as input
|
||||||
VkMemoryBarrier barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER };
|
VkMemoryBarrier barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER };
|
||||||
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||||
barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR;
|
barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR;
|
||||||
GetVulkanFrameBuffer()->GetTransferCommands()->pipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, 0, 1, &barrier, 0, nullptr, 0, nullptr);
|
GetVulkanFrameBuffer()->GetTransferCommands()->pipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, 0, 1, &barrier, 0, nullptr, 0, nullptr);
|
||||||
|
|
||||||
VkBufferDeviceAddressInfo info = { VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO };
|
VkBufferDeviceAddressInfo info = { VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO };
|
||||||
|
@ -313,4 +318,9 @@ void VkRaytrace::CreateTopLevelAccelerationStructure()
|
||||||
|
|
||||||
VkAccelerationStructureBuildRangeInfoKHR* rangeInfos[] = { &rangeInfo };
|
VkAccelerationStructureBuildRangeInfoKHR* rangeInfos[] = { &rangeInfo };
|
||||||
GetVulkanFrameBuffer()->GetTransferCommands()->buildAccelerationStructures(1, &buildInfo, rangeInfos);
|
GetVulkanFrameBuffer()->GetTransferCommands()->buildAccelerationStructures(1, &buildInfo, rangeInfos);
|
||||||
|
|
||||||
|
// Finish building the accel struct before using as input in a fragment shader
|
||||||
|
PipelineBarrier finishbuildbarrier;
|
||||||
|
finishbuildbarrier.addMemory(VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, VK_ACCESS_SHADER_READ_BIT);
|
||||||
|
finishbuildbarrier.execute(GetVulkanFrameBuffer()->GetTransferCommands(), VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue