diff --git a/UnleashedRecomp/gpu/rhi/rt64_vulkan.cpp b/UnleashedRecomp/gpu/rhi/rt64_vulkan.cpp index ff884fe..7dbcc63 100644 --- a/UnleashedRecomp/gpu/rhi/rt64_vulkan.cpp +++ b/UnleashedRecomp/gpu/rhi/rt64_vulkan.cpp @@ -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); diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index 1bcf204..1c35277 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -1252,7 +1252,7 @@ static void ExecuteCopyCommandList(const T& function) } template -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(); - ExecuteCopyCommandList([&] - { - g_copyCommandList->copyBufferRegion(buffer->buffer->at(0), uploadBuffer->at(0), buffer->dataSize); - }); + 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 @@ -1288,19 +1301,19 @@ static void UnlockBuffer(GuestBuffer* buffer) } else { - UnlockBufferImpl(buffer); + UnlockBuffer(buffer, true); } } } static void ProcUnlockBuffer16(const RenderCommand& cmd) { - UnlockBufferImpl(cmd.unlockBuffer.buffer); + UnlockBuffer(cmd.unlockBuffer.buffer, false); } static void ProcUnlockBuffer32(const RenderCommand& cmd) { - UnlockBufferImpl(cmd.unlockBuffer.buffer); + UnlockBuffer(cmd.unlockBuffer.buffer, false); } static void UnlockVertexBuffer(GuestBuffer* buffer)