dx12, vulkan: copy allocator doesn't need to map again
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
©Region
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user