summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2020-08-23 04:09:19 +0000
committerassiduous <assiduous@diligentgraphics.com>2020-08-23 04:09:19 +0000
commitecd121c0335f62b921a66c570b10410120801227 (patch)
tree87430b25cbcd83e5e63d6265ba6e41362c7e2573 /Graphics/GraphicsEngineVulkan
parentAdded USAGE_UNIFIED usage type (API 240066) (diff)
downloadDiligentCore-ecd121c0335f62b921a66c570b10410120801227.tar.gz
DiligentCore-ecd121c0335f62b921a66c570b10410120801227.zip
Implemented mapping of unified buffers in Vulkan backend
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/include/BufferVkImpl.hpp4
-rw-r--r--Graphics/GraphicsEngineVulkan/src/BufferVkImpl.cpp7
-rw-r--r--Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp11
3 files changed, 10 insertions, 12 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/BufferVkImpl.hpp b/Graphics/GraphicsEngineVulkan/include/BufferVkImpl.hpp
index a54fe6bc..8d1c187d 100644
--- a/Graphics/GraphicsEngineVulkan/include/BufferVkImpl.hpp
+++ b/Graphics/GraphicsEngineVulkan/include/BufferVkImpl.hpp
@@ -111,9 +111,9 @@ public:
return (GetAccessFlags() & AccessFlags) == AccessFlags;
}
- void* GetStagingCPUAddress()
+ void* GetCPUAddress()
{
- VERIFY_EXPR(m_Desc.Usage == USAGE_STAGING);
+ VERIFY_EXPR(m_Desc.Usage == USAGE_STAGING || m_Desc.Usage == USAGE_UNIFIED);
return reinterpret_cast<Uint8*>(m_MemoryAllocation.Page->GetCPUMemory()) + m_BufferMemoryAlignedOffset;
}
diff --git a/Graphics/GraphicsEngineVulkan/src/BufferVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/BufferVkImpl.cpp
index 9ff268dd..3e3419b6 100644
--- a/Graphics/GraphicsEngineVulkan/src/BufferVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/BufferVkImpl.cpp
@@ -248,12 +248,9 @@ BufferVkImpl::BufferVkImpl(IReferenceCounters* pRefCounters,
if ((MemoryPropFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)
{
// Memory is directly accessible by CPU
- auto AlignedMemOffset = Align(VkDeviceSize{m_MemoryAllocation.UnalignedOffset}, MemReqs.alignment);
- VERIFY_EXPR(m_MemoryAllocation.Size >= MemReqs.size + (AlignedMemOffset - m_MemoryAllocation.UnalignedOffset));
-
auto* pData = reinterpret_cast<uint8_t*>(m_MemoryAllocation.Page->GetCPUMemory());
VERIFY_EXPR(pData != nullptr);
- memcpy(pData + AlignedMemOffset, pBuffData->pData, pBuffData->DataSize);
+ memcpy(pData + m_BufferMemoryAlignedOffset, pBuffData->pData, pBuffData->DataSize);
if ((MemoryPropFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0)
{
@@ -263,7 +260,7 @@ BufferVkImpl::BufferVkImpl(IReferenceCounters* pRefCounters,
FlushRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
FlushRange.pNext = nullptr;
FlushRange.memory = m_MemoryAllocation.Page->GetVkMemory();
- FlushRange.offset = AlignedMemOffset;
+ FlushRange.offset = m_BufferMemoryAlignedOffset;
FlushRange.size = MemReqs.size;
LogicalDevice.FlushMappedMemoryRanges(1, &FlushRange);
}
diff --git a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
index 619ec23c..2221b6b9 100644
--- a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
@@ -1417,7 +1417,8 @@ void DeviceContextVkImpl::MapBuffer(IBuffer* pBuffer, MAP_TYPE MapType, MAP_FLAG
if (MapType == MAP_READ)
{
- DEV_CHECK_ERR(BuffDesc.Usage == USAGE_STAGING, "Buffer must be created as USAGE_STAGING to be mapped for reading");
+ DEV_CHECK_ERR(BuffDesc.Usage == USAGE_STAGING || BuffDesc.Usage == USAGE_UNIFIED,
+ "Buffer must be created as USAGE_STAGING or USAGE_UNIFIED to be mapped for reading");
if ((MapFlags & MAP_FLAG_DO_NOT_WAIT) == 0)
{
@@ -1426,13 +1427,13 @@ void DeviceContextVkImpl::MapBuffer(IBuffer* pBuffer, MAP_TYPE MapType, MAP_FLAG
"access and use MAP_FLAG_DO_NOT_WAIT flag.");
}
- pMappedData = pBufferVk->GetStagingCPUAddress();
+ pMappedData = pBufferVk->GetCPUAddress();
}
else if (MapType == MAP_WRITE)
{
- if (BuffDesc.Usage == USAGE_STAGING)
+ if (BuffDesc.Usage == USAGE_STAGING || BuffDesc.Usage == USAGE_UNIFIED)
{
- pMappedData = pBufferVk->GetStagingCPUAddress();
+ pMappedData = pBufferVk->GetCPUAddress();
}
else if (BuffDesc.Usage == USAGE_DYNAMIC)
{
@@ -1472,7 +1473,7 @@ void DeviceContextVkImpl::MapBuffer(IBuffer* pBuffer, MAP_TYPE MapType, MAP_FLAG
}
else
{
- LOG_ERROR("Only USAGE_DYNAMIC and USAGE_STAGING Vk buffers can be mapped for writing");
+ LOG_ERROR("Only USAGE_DYNAMIC, USAGE_STAGING and USAGE_UNIFIED Vulkan buffers can be mapped for writing");
}
}
else if (MapType == MAP_READ_WRITE)