diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2021-01-01 01:28:00 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2021-01-01 01:28:00 +0000 |
| commit | ed0b353acbb104cbb94347adf1b4ea5628c3c221 (patch) | |
| tree | c1eae288ed44e18fad4bb243f223e96a12676ead /Graphics/GraphicsEngineVulkan | |
| parent | Improvements for mesh shader & ray tracing (#180) (diff) | |
| download | DiligentCore-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.cpp | 32 |
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 { |
