Skip to content

Commit f8e0eeb

Browse files
committed
Fix remapping 3D textures on vulkan, for fetching texture data to save
1 parent c17d4c7 commit f8e0eeb

File tree

1 file changed

+29
-4
lines changed

1 file changed

+29
-4
lines changed

renderdoc/driver/vulkan/vk_replay.cpp

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4350,6 +4350,14 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m
43504350
imCreateInfo.extent.height = RDCMAX(1U, imCreateInfo.extent.height >> mip);
43514351
imCreateInfo.extent.depth = RDCMAX(1U, imCreateInfo.extent.depth >> mip);
43524352

4353+
// convert a 3D texture into a 2D array, so we can render to the slices without needing
4354+
// KHR_maintenance1
4355+
if(imCreateInfo.extent.depth > 1)
4356+
{
4357+
imCreateInfo.arrayLayers = imCreateInfo.extent.depth;
4358+
imCreateInfo.extent.depth = 1;
4359+
}
4360+
43534361
// create render texture similar to readback texture
43544362
vt->CreateImage(Unwrap(dev), &imCreateInfo, NULL, &tmpImage);
43554363

@@ -4425,7 +4433,7 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m
44254433
};
44264434
vt->CreateRenderPass(Unwrap(dev), &rpinfo, NULL, &tmpRP);
44274435

4428-
numFBs = (imCreateInfo.imageType == VK_IMAGE_TYPE_3D ? (imCreateInfo.extent.depth >> mip) : 1);
4436+
numFBs = imCreateInfo.arrayLayers;
44294437
tmpFB = new VkFramebuffer[numFBs];
44304438
tmpView = new VkImageView[numFBs];
44314439

@@ -4437,6 +4445,12 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m
44374445
// if 3d texture, render each slice separately, otherwise render once
44384446
for(uint32_t i = 0; i < numFBs; i++)
44394447
{
4448+
if(numFBs > 1 && (i % GetDebugManager()->m_TexDisplayUBO.GetRingCount()) == 0)
4449+
{
4450+
m_pDriver->SubmitCmds();
4451+
m_pDriver->FlushQ();
4452+
}
4453+
44404454
TextureDisplay texDisplay;
44414455

44424456
texDisplay.Red = texDisplay.Green = texDisplay.Blue = texDisplay.Alpha = true;
@@ -4445,10 +4459,9 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m
44454459
texDisplay.overlay = DebugOverlay::NoOverlay;
44464460
texDisplay.FlipY = false;
44474461
texDisplay.mip = mip;
4448-
texDisplay.sampleIdx =
4449-
imCreateInfo.imageType == VK_IMAGE_TYPE_3D ? 0 : (params.resolve ? ~0U : arrayIdx);
4462+
texDisplay.sampleIdx = imInfo.type == VK_IMAGE_TYPE_3D ? 0 : (params.resolve ? ~0U : arrayIdx);
44504463
texDisplay.CustomShader = ResourceId();
4451-
texDisplay.sliceFace = imCreateInfo.imageType == VK_IMAGE_TYPE_3D ? i : arrayIdx;
4464+
texDisplay.sliceFace = imInfo.type == VK_IMAGE_TYPE_3D ? i : arrayIdx;
44524465
texDisplay.rangemin = params.blackPoint;
44534466
texDisplay.rangemax = params.whitePoint;
44544467
texDisplay.scale = 1.0f;
@@ -4870,6 +4883,18 @@ byte *VulkanReplay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t m
48704883
vt->CmdCopyImageToBuffer(Unwrap(cmd), srcImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
48714884
readbackBuf, 2, copyregion);
48724885
}
4886+
else if(imInfo.type == VK_IMAGE_TYPE_3D && params.remap)
4887+
{
4888+
// copy in each slice from the 2D array we created to render out the 3D texture
4889+
for(uint32_t i = 0; i < imCreateInfo.arrayLayers; i++)
4890+
{
4891+
copyregion[0].imageSubresource.baseArrayLayer = i;
4892+
copyregion[0].bufferOffset =
4893+
i * GetByteSize(imInfo.extent.width, imInfo.extent.height, 1, imCreateInfo.format, mip);
4894+
vt->CmdCopyImageToBuffer(Unwrap(cmd), srcImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4895+
readbackBuf, 1, copyregion);
4896+
}
4897+
}
48734898
else
48744899
{
48754900
// copy from desired subresource in srcImage to buffer

0 commit comments

Comments
 (0)