mirror of
https://github.com/hedge-dev/UnleashedRecomp.git
synced 2025-10-30 07:11:05 +00:00
Move main thread buffer copy to graphics command list.
This commit is contained in:
parent
f807feaeb1
commit
b3b8d1657a
2 changed files with 27 additions and 8 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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,11 +1268,24 @@ 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>
|
||||
static void UnlockBuffer(GuestBuffer* buffer)
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue