dx12, vulkan: copy allocator doesn't need to map again

This commit is contained in:
Turanszki Janos
2021-09-06 11:05:52 +02:00
parent 88da51d3e8
commit 0674f736ed
5 changed files with 9 additions and 23 deletions
+4 -9
View File
@@ -1554,11 +1554,6 @@ using namespace DX12_Internal;
uploaddesc.Usage = USAGE_UPLOAD;
bool upload_success = device->CreateBuffer(&uploaddesc, nullptr, &cmd.uploadbuffer);
assert(upload_success);
cmd.upload_resource = to_internal(&cmd.uploadbuffer)->resource.Get();
CD3DX12_RANGE readRange(0, 0);
HRESULT hr = cmd.upload_resource->Map(0, &readRange, &cmd.data);
assert(SUCCEEDED(hr));
}
// begin command list in valid state:
@@ -2885,12 +2880,12 @@ using namespace DX12_Internal;
{
auto cmd = copyAllocator.allocate(pDesc->ByteWidth);
memcpy(cmd.data, pInitialData->pSysMem, pDesc->ByteWidth);
memcpy(cmd.uploadbuffer.mapped_data, pInitialData->pSysMem, pDesc->ByteWidth);
cmd.commandList->CopyBufferRegion(
internal_state->resource.Get(),
0,
cmd.upload_resource,
to_internal(&cmd.uploadbuffer)->resource.Get(),
0,
pDesc->ByteWidth
);
@@ -3080,7 +3075,7 @@ using namespace DX12_Internal;
if (rowSizesInBytes[i] > (SIZE_T)-1)
continue;
D3D12_MEMCPY_DEST DestData = {};
DestData.pData = (void*)((UINT64)cmd.data + layouts[i].Offset);
DestData.pData = (void*)((UINT64)cmd.uploadbuffer.mapped_data + layouts[i].Offset);
DestData.RowPitch = (SIZE_T)layouts[i].Footprint.RowPitch;
DestData.SlicePitch = (SIZE_T)layouts[i].Footprint.RowPitch * (SIZE_T)numRows[i];
MemcpySubresource(&DestData, &data[i], (SIZE_T)rowSizesInBytes[i], numRows[i], layouts[i].Footprint.Depth);
@@ -3089,7 +3084,7 @@ using namespace DX12_Internal;
for (UINT i = 0; i < dataCount; ++i)
{
CD3DX12_TEXTURE_COPY_LOCATION Dst(internal_state->resource.Get(), i);
CD3DX12_TEXTURE_COPY_LOCATION Src(cmd.upload_resource, layouts[i]);
CD3DX12_TEXTURE_COPY_LOCATION Src(to_internal(&cmd.uploadbuffer)->resource.Get(), layouts[i]);
cmd.commandList->CopyTextureRegion(
&Dst,
0,
-2
View File
@@ -88,8 +88,6 @@ namespace wiGraphics
Microsoft::WRL::ComPtr<ID3D12GraphicsCommandList> commandList;
Microsoft::WRL::ComPtr<ID3D12Fence> fence;
GPUBuffer uploadbuffer;
void* data = nullptr;
ID3D12Resource* upload_resource = nullptr;
};
std::vector<CopyCMD> freelist;
+4 -9
View File
@@ -1053,11 +1053,6 @@ using namespace Vulkan_Internal;
uploaddesc.Usage = USAGE_UPLOAD;
bool upload_success = device->CreateBuffer(&uploaddesc, nullptr, &cmd.uploadbuffer);
assert(upload_success);
VmaAllocation upload_allocation = to_internal(&cmd.uploadbuffer)->allocation;
cmd.data = upload_allocation->GetMappedData();
assert(cmd.data != nullptr);
cmd.upload_resource = to_internal(&cmd.uploadbuffer)->resource;
}
// begin command list in valid state:
@@ -3038,7 +3033,7 @@ using namespace Vulkan_Internal;
{
auto cmd = copyAllocator.allocate(pDesc->ByteWidth);
memcpy(cmd.data, pInitialData->pSysMem, pBuffer->desc.ByteWidth);
memcpy(cmd.uploadbuffer.mapped_data, pInitialData->pSysMem, pBuffer->desc.ByteWidth);
{
auto& frame = GetFrameResources();
@@ -3070,7 +3065,7 @@ using namespace Vulkan_Internal;
vkCmdCopyBuffer(
cmd.commandBuffer,
cmd.upload_resource,
to_internal(&cmd.uploadbuffer)->resource,
internal_state->resource,
1,
&copyRegion
@@ -3318,7 +3313,7 @@ using namespace Vulkan_Internal;
{
cpysize /= 4;
}
uint8_t* cpyaddr = (uint8_t*)cmd.data + cpyoffset;
uint8_t* cpyaddr = (uint8_t*)cmd.uploadbuffer.mapped_data + cpyoffset;
memcpy(cpyaddr, subresourceData.pSysMem, cpysize);
VkBufferImageCopy copyRegion = {};
@@ -3373,7 +3368,7 @@ using namespace Vulkan_Internal;
1, &barrier
);
vkCmdCopyBufferToImage(cmd.commandBuffer, cmd.upload_resource, internal_state->resource, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (uint32_t)copyRegions.size(), copyRegions.data());
vkCmdCopyBufferToImage(cmd.commandBuffer, to_internal(&cmd.uploadbuffer)->resource, internal_state->resource, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (uint32_t)copyRegions.size(), copyRegions.data());
copyAllocator.submit(cmd);
-2
View File
@@ -161,8 +161,6 @@ namespace wiGraphics
VkCommandBuffer commandBuffer = VK_NULL_HANDLE;
uint64_t target = 0;
GPUBuffer uploadbuffer;
void* data = nullptr;
VkBuffer upload_resource = VK_NULL_HANDLE;
};
std::vector<CopyCMD> freelist; // available
std::vector<CopyCMD> worklist; // in progress
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wiVersion
// minor features, major updates, breaking compatibility changes
const int minor = 57;
// minor bug fixes, alterations, refactors, updates
const int revision = 2;
const int revision = 3;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);