Buffer update fixes for metal
This commit is contained in:
@@ -85,16 +85,34 @@ namespace AZ
|
||||
|
||||
uint64_t AsyncUploadQueue::QueueUpload(const RHI::BufferStreamRequest& uploadRequest)
|
||||
{
|
||||
uint64_t queueValue = m_uploadFence.Increment();
|
||||
|
||||
const MemoryView& memoryView = static_cast<Buffer&>(*uploadRequest.m_buffer).GetMemoryView();
|
||||
RHI::Ptr<Memory> buffer = memoryView.GetMemory();
|
||||
|
||||
Buffer& destBuffer = static_cast<Buffer&>(*uploadRequest.m_buffer);
|
||||
const MemoryView& destMemoryView = destBuffer.GetMemoryView();
|
||||
MTLStorageMode mtlStorageMode = destBuffer.GetMemoryView().GetStorageMode();
|
||||
RHI::BufferPool& bufferPool = static_cast<RHI::BufferPool&>(*destBuffer.GetPool());
|
||||
/*
|
||||
if(mtlStorageMode == MTLStorageModeShared || mtlStorageMode == GetCPUGPUMemoryMode())
|
||||
{
|
||||
RHI::BufferMapRequest mapRequest;
|
||||
mapRequest.m_buffer = uploadRequest.m_buffer;
|
||||
mapRequest.m_byteCount = uploadRequest.m_byteCount;
|
||||
mapRequest.m_byteOffset = uploadRequest.m_byteOffset;
|
||||
RHI::BufferMapResponse mapResponse;
|
||||
bufferPool.MapBuffer(mapRequest, mapResponse);
|
||||
::memcpy(mapResponse.m_data, uploadRequest.m_sourceData, uploadRequest.m_byteCount);
|
||||
bufferPool.UnmapBuffer(*uploadRequest.m_buffer);
|
||||
if (uploadRequest.m_fenceToSignal)
|
||||
{
|
||||
uploadRequest.m_fenceToSignal->SignalOnCpu();
|
||||
}
|
||||
return m_uploadFence.GetPendingValue();
|
||||
}
|
||||
*/
|
||||
Fence* fenceToSignal = nullptr;
|
||||
uint64_t fenceToSignalValue = 0;
|
||||
|
||||
size_t byteCount = uploadRequest.m_byteCount;
|
||||
size_t byteOffset = memoryView.GetOffset() + uploadRequest.m_byteOffset;
|
||||
size_t byteOffset = destMemoryView.GetOffset() + uploadRequest.m_byteOffset;
|
||||
uint64_t queueValue = m_uploadFence.Increment();
|
||||
|
||||
const uint8_t* sourceData = reinterpret_cast<const uint8_t*>(uploadRequest.m_sourceData);
|
||||
|
||||
if (uploadRequest.m_fenceToSignal)
|
||||
@@ -125,11 +143,11 @@ namespace AZ
|
||||
}
|
||||
|
||||
id<MTLBlitCommandEncoder> blitEncoder = [framePacket->m_mtlCommandBuffer blitCommandEncoder];
|
||||
[blitEncoder copyFromBuffer:framePacket->m_stagingResource
|
||||
sourceOffset:0
|
||||
toBuffer:buffer->GetGpuAddress<id<MTLBuffer>>()
|
||||
destinationOffset:byteOffset + pendingByteOffset
|
||||
size:bytesToCopy];
|
||||
[blitEncoder copyFromBuffer: framePacket->m_stagingResource
|
||||
sourceOffset: 0
|
||||
toBuffer: destMemoryView.GetGpuAddress<id<MTLBuffer>>()
|
||||
destinationOffset: byteOffset + pendingByteOffset
|
||||
size: bytesToCopy];
|
||||
[blitEncoder endEncoding];
|
||||
blitEncoder = nil;
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace AZ
|
||||
buffer->m_pendingResolves++;
|
||||
|
||||
uploadRequest.m_attachmentBuffer = buffer;
|
||||
uploadRequest.m_byteOffset = request.m_byteOffset;
|
||||
uploadRequest.m_byteOffset = request.m_byteOffset;;//buffer->GetMemoryView().GetOffset() + request.m_byteOffset;
|
||||
uploadRequest.m_stagingBuffer = stagingBuffer;
|
||||
uploadRequest.m_byteSize = request.m_byteCount;
|
||||
|
||||
@@ -64,9 +64,12 @@ namespace AZ
|
||||
AZ_Assert(stagingBuffer, "Staging Buffer is null.");
|
||||
AZ_Assert(destBuffer, "Attachment Buffer is null.");
|
||||
|
||||
//Inform the GPU that the CPU has modified the staging buffer.
|
||||
//Platform::SynchronizeBufferOnCPU(stagingBuffer->GetMemoryView().GetGpuAddress<id<MTLBuffer>>(), stagingBuffer->GetMemoryView().GetOffset(), stagingBuffer->GetMemoryView().GetSize());
|
||||
|
||||
RHI::CopyBufferDescriptor copyDescriptor;
|
||||
copyDescriptor.m_sourceBuffer = stagingBuffer;
|
||||
copyDescriptor.m_sourceOffset = 0;
|
||||
copyDescriptor.m_sourceOffset = 0;//stagingBuffer->GetMemoryView().GetOffset();
|
||||
copyDescriptor.m_destinationBuffer = destBuffer;
|
||||
copyDescriptor.m_destinationOffset = static_cast<uint32_t>(packet.m_byteOffset);
|
||||
copyDescriptor.m_size = static_cast<uint32_t>(packet.m_byteSize);
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace AZ
|
||||
if (memoryView.IsValid())
|
||||
{
|
||||
heapMemoryUsage.m_residentInBytes += m_descriptor.m_pageSizeInBytes;
|
||||
memoryView.SetName("BufferPage");
|
||||
//memoryView.SetName(AZStd::string::format("BufferPage_%s", AZ::Uuid::CreateRandom().ToString<AZStd::string>().c_str()));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user