Move main thread buffer copy to graphics command list.

This commit is contained in:
Skyth 2024-10-27 20:43:01 +03:00
parent f807feaeb1
commit b3b8d1657a
2 changed files with 27 additions and 8 deletions

View file

@ -2859,6 +2859,8 @@ namespace RT64 {
}
void VulkanCommandList::copyBufferRegion(RenderBufferReference dstBuffer, RenderBufferReference srcBuffer, uint64_t size) {
endActiveRenderPass();
assert(dstBuffer.ref != nullptr);
assert(srcBuffer.ref != nullptr);
@ -2938,6 +2940,8 @@ namespace RT64 {
}
void VulkanCommandList::copyBuffer(const RenderBuffer *dstBuffer, const RenderBuffer *srcBuffer) {
endActiveRenderPass();
assert(dstBuffer != nullptr);
assert(srcBuffer != nullptr);
@ -2951,6 +2955,8 @@ namespace RT64 {
}
void VulkanCommandList::copyTexture(const RenderTexture *dstTexture, const RenderTexture *srcTexture) {
endActiveRenderPass();
assert(dstTexture != nullptr);
assert(srcTexture != nullptr);

View file

@ -1252,7 +1252,7 @@ static void ExecuteCopyCommandList(const T& function)
}
template<typename T>
static void UnlockBufferImpl(GuestBuffer* buffer)
static void UnlockBuffer(GuestBuffer* buffer, bool useCopyQueue)
{
auto uploadBuffer = g_device->createBuffer(RenderBufferDesc::UploadBuffer(buffer->dataSize));
@ -1268,10 +1268,23 @@ static void UnlockBufferImpl(GuestBuffer* buffer)
uploadBuffer->unmap();
if (useCopyQueue)
{
ExecuteCopyCommandList([&]
{
g_copyCommandList->copyBufferRegion(buffer->buffer->at(0), uploadBuffer->at(0), buffer->dataSize);
});
}
else
{
auto& commandList = g_commandLists[g_frame];
commandList->barriers(RenderBarrierStage::COPY, RenderBufferBarrier(buffer->buffer.get(), RenderBufferAccess::WRITE));
commandList->copyBufferRegion(buffer->buffer->at(0), uploadBuffer->at(0), buffer->dataSize);
commandList->barriers(RenderBarrierStage::GRAPHICS, RenderBufferBarrier(buffer->buffer.get(), RenderBufferAccess::READ));
g_tempBuffers[g_frame].emplace_back(std::move(uploadBuffer));
}
}
template<typename T>
@ -1288,19 +1301,19 @@ static void UnlockBuffer(GuestBuffer* buffer)
}
else
{
UnlockBufferImpl<T>(buffer);
UnlockBuffer<T>(buffer, true);
}
}
}
static void ProcUnlockBuffer16(const RenderCommand& cmd)
{
UnlockBufferImpl<uint16_t>(cmd.unlockBuffer.buffer);
UnlockBuffer<uint16_t>(cmd.unlockBuffer.buffer, false);
}
static void ProcUnlockBuffer32(const RenderCommand& cmd)
{
UnlockBufferImpl<uint32_t>(cmd.unlockBuffer.buffer);
UnlockBuffer<uint32_t>(cmd.unlockBuffer.buffer, false);
}
static void UnlockVertexBuffer(GuestBuffer* buffer)