summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-01-01 01:28:00 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-01-01 01:28:00 +0000
commited0b353acbb104cbb94347adf1b4ea5628c3c221 (patch)
treec1eae288ed44e18fad4bb243f223e96a12676ead /Graphics/GraphicsEngineVulkan
parentImprovements for mesh shader & ray tracing (#180) (diff)
downloadDiligentCore-ed0b353acbb104cbb94347adf1b4ea5628c3c221.tar.gz
DiligentCore-ed0b353acbb104cbb94347adf1b4ea5628c3c221.zip
Implemented initialization of staging textures in D3D12 and Vulkan backends
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/src/TextureVkImpl.cpp32
1 files changed, 30 insertions, 2 deletions
diff --git a/Graphics/GraphicsEngineVulkan/src/TextureVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/TextureVkImpl.cpp
index 8445617b..b83be298 100644
--- a/Graphics/GraphicsEngineVulkan/src/TextureVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/TextureVkImpl.cpp
@@ -60,6 +60,7 @@ TextureVkImpl::TextureVkImpl(IReferenceCounters* pRefCounters,
const auto& FmtAttribs = GetTextureFormatAttribs(m_Desc.Format);
const auto& LogicalDevice = pRenderDeviceVk->GetLogicalDevice();
+ const bool bInitializeTexture = (pInitData != nullptr && pInitData->pSubResources != nullptr && pInitData->NumSubresources > 0);
if (m_Desc.Usage == USAGE_IMMUTABLE || m_Desc.Usage == USAGE_DEFAULT || m_Desc.Usage == USAGE_DYNAMIC)
{
VkImageCreateInfo ImageCI = {};
@@ -178,8 +179,6 @@ TextureVkImpl::TextureVkImpl(IReferenceCounters* pRefCounters,
// and the transition away from this layout is not guaranteed to preserve that data.
ImageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- bool bInitializeTexture = (pInitData != nullptr && pInitData->pSubResources != nullptr && pInitData->NumSubresources > 0);
-
m_VulkanImage = LogicalDevice.CreateImage(ImageCI, m_Desc.Name);
VkMemoryRequirements MemReqs = LogicalDevice.GetImageMemoryRequirements(m_VulkanImage);
@@ -418,6 +417,8 @@ TextureVkImpl::TextureVkImpl(IReferenceCounters* pRefCounters,
VkMemoryPropertyFlags MemProperties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
if (m_Desc.CPUAccessFlags & CPU_ACCESS_READ)
{
+ DEV_CHECK_ERR(!bInitializeTexture, "Readback textures should not be initialized with data");
+
VkStagingBuffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
MemProperties |= VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
SetState(RESOURCE_STATE_COPY_DEST);
@@ -461,6 +462,33 @@ TextureVkImpl::TextureVkImpl(IReferenceCounters* pRefCounters,
CHECK_VK_ERROR_AND_THROW(err, "Failed to bind staging bufer memory");
m_StagingDataAlignedOffset = AlignedStagingMemOffset;
+
+ if (bInitializeTexture)
+ {
+ uint8_t* const pStagingData = GetStagingDataCPUAddress();
+
+ Uint32 subres = 0;
+ for (Uint32 layer = 0; layer < m_Desc.ArraySize; ++layer)
+ {
+ for (Uint32 mip = 0; mip < m_Desc.MipLevels; ++mip)
+ {
+ const auto& SubResData = pInitData->pSubResources[subres++];
+ const auto MipProps = GetMipLevelProperties(m_Desc, mip);
+
+ const auto DstSubresOffset =
+ GetStagingTextureSubresourceOffset(m_Desc, layer, mip, StagingBufferOffsetAlignment);
+
+ CopyTextureSubresource(SubResData,
+ MipProps.StorageHeight / FmtAttribs.BlockHeight, // NumRows
+ MipProps.Depth,
+ MipProps.RowSize,
+ pStagingData + DstSubresOffset,
+ MipProps.RowSize, // DstRowStride
+ MipProps.DepthSliceSize // DstDepthStride
+ );
+ }
+ }
+ }
}
else
{