mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-04 09:00:44 +00:00
Remove ImageInfo::imageType for serialization compatibility
This field was recently added to the `ImageInfo` struct, but had not yet been added to the `ImageInfo` serialization. Serializing this field would unnecessarily break capture compatibility. The `imageType` field was added to detect 3D images--depth slices of 3D images are interpreted as array layers when accessed through a 2D image view. This data is (almost) redundant, because 2D images must have `extent.depth==1`, according to the Valid Usage for `VkImageCreateInfo`. The application could create an image with `imageType==VK_IMAGE_TYPE_3D`, but with `extent.depth==1`; we would interpret this as a 2D image, but, since this image would have 1 array layer and 1 depth slice, this doesn't actually cause an issue. Change-Id: I3d53d942cbe8f240845a80f6e12a7cecfdd86967
This commit is contained in:
committed by
Baldur Karlsson
parent
38f0d27901
commit
f4e7231fd5
@@ -37,63 +37,54 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
{
|
||||
SECTION("unsplit")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
CHECK(imgRefs.SubresourceIndex(VK_IMAGE_ASPECT_STENCIL_BIT, 2, 5) == 0);
|
||||
};
|
||||
SECTION("split aspect")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
imgRefs.Split(true, false, false);
|
||||
CHECK(imgRefs.SubresourceIndex(VK_IMAGE_ASPECT_STENCIL_BIT, 2, 5) == 1);
|
||||
};
|
||||
SECTION("split levels")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
imgRefs.Split(false, true, false);
|
||||
CHECK(imgRefs.SubresourceIndex(VK_IMAGE_ASPECT_STENCIL_BIT, 2, 5) == 2);
|
||||
};
|
||||
SECTION("split layers")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
imgRefs.Split(false, false, true);
|
||||
CHECK(imgRefs.SubresourceIndex(VK_IMAGE_ASPECT_STENCIL_BIT, 2, 5) == 5);
|
||||
};
|
||||
SECTION("split aspect and levels")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
imgRefs.Split(true, true, false);
|
||||
CHECK(imgRefs.SubresourceIndex(VK_IMAGE_ASPECT_STENCIL_BIT, 2, 5) == 11 + 2);
|
||||
};
|
||||
SECTION("split aspect and layers")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
imgRefs.Split(true, false, true);
|
||||
CHECK(imgRefs.SubresourceIndex(VK_IMAGE_ASPECT_STENCIL_BIT, 2, 5) == 17 + 5);
|
||||
};
|
||||
SECTION("split levels and layers")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
imgRefs.Split(false, true, true);
|
||||
CHECK(imgRefs.SubresourceIndex(VK_IMAGE_ASPECT_STENCIL_BIT, 2, 5) == 2 * 17 + 5);
|
||||
};
|
||||
SECTION("split aspect and levels and layers")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
imgRefs.Split(true, true, true);
|
||||
CHECK(imgRefs.SubresourceIndex(VK_IMAGE_ASPECT_STENCIL_BIT, 2, 5) == 11 * 17 + 2 * 17 + 5);
|
||||
};
|
||||
SECTION("update unsplit")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImageRange range;
|
||||
imgRefs.Update(range, eFrameRef_Read);
|
||||
std::vector<FrameRefType> expected = {eFrameRef_Read};
|
||||
@@ -101,8 +92,7 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
};
|
||||
SECTION("update split aspect")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImageRange range;
|
||||
range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
imgRefs.Update(range, eFrameRef_Read);
|
||||
@@ -111,8 +101,7 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
};
|
||||
SECTION("update split levels")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImageRange range;
|
||||
range.baseMipLevel = 1;
|
||||
range.levelCount = 3;
|
||||
@@ -125,8 +114,7 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
};
|
||||
SECTION("update split layers")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImageRange range;
|
||||
range.baseArrayLayer = 7;
|
||||
imgRefs.Update(range, eFrameRef_Read);
|
||||
@@ -139,8 +127,7 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
};
|
||||
SECTION("update split aspect then levels")
|
||||
{
|
||||
ImgRefs imgRefs(
|
||||
ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 11, 17, 1));
|
||||
ImageRange range0;
|
||||
range0.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
imgRefs.Update(range0, eFrameRef_Read);
|
||||
@@ -162,7 +149,7 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
}
|
||||
SECTION("update split layers then aspects and levels")
|
||||
{
|
||||
ImgRefs imgRefs(ImageInfo(VK_IMAGE_TYPE_2D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 7, 5, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 1}, 7, 5, 1));
|
||||
ImageRange range0;
|
||||
range0.baseArrayLayer = 1;
|
||||
range0.layerCount = 2;
|
||||
@@ -210,7 +197,7 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
}
|
||||
SECTION("update 3D image default view")
|
||||
{
|
||||
ImgRefs imgRefs(ImageInfo(VK_IMAGE_TYPE_3D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImageRange range;
|
||||
range.layerCount = 1;
|
||||
imgRefs.Update(range, eFrameRef_Read);
|
||||
@@ -219,7 +206,7 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
}
|
||||
SECTION("update 3D image 3D view")
|
||||
{
|
||||
ImgRefs imgRefs(ImageInfo(VK_IMAGE_TYPE_3D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImageRange range;
|
||||
range.layerCount = 1;
|
||||
range.viewType = VK_IMAGE_VIEW_TYPE_3D;
|
||||
@@ -229,7 +216,7 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
}
|
||||
SECTION("update 3D image 2D view")
|
||||
{
|
||||
ImgRefs imgRefs(ImageInfo(VK_IMAGE_TYPE_3D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImageRange range;
|
||||
range.layerCount = 1;
|
||||
range.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||
@@ -240,7 +227,7 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
}
|
||||
SECTION("update 3D image 2D array view")
|
||||
{
|
||||
ImgRefs imgRefs(ImageInfo(VK_IMAGE_TYPE_3D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImageRange range;
|
||||
range.baseArrayLayer = 1;
|
||||
range.layerCount = 2;
|
||||
@@ -252,7 +239,7 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
}
|
||||
SECTION("update 3D image 2D array view full")
|
||||
{
|
||||
ImgRefs imgRefs(ImageInfo(VK_IMAGE_TYPE_3D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImageRange range;
|
||||
range.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
||||
imgRefs.Update(range, eFrameRef_Read);
|
||||
@@ -261,7 +248,7 @@ TEST_CASE("Test ImgRefs type", "[imgrefs]")
|
||||
}
|
||||
SECTION("update 3D image 3D view full")
|
||||
{
|
||||
ImgRefs imgRefs(ImageInfo(VK_IMAGE_TYPE_3D, VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImgRefs imgRefs(ImageInfo(VK_FORMAT_D16_UNORM_S8_UINT, {100, 100, 5}, 11, 1, 1));
|
||||
ImageRange range;
|
||||
range.viewType = VK_IMAGE_VIEW_TYPE_3D;
|
||||
imgRefs.Update(range, eFrameRef_Read);
|
||||
|
||||
@@ -886,12 +886,9 @@ struct ImageInfo
|
||||
int sampleCount = 0;
|
||||
VkExtent3D extent = {0, 0, 0};
|
||||
VkFormat format = VK_FORMAT_UNDEFINED;
|
||||
VkImageType imageType = VK_IMAGE_TYPE_MAX_ENUM;
|
||||
ImageInfo() {}
|
||||
ImageInfo(VkImageType imageType, VkFormat format, VkExtent3D extent, int levelCount,
|
||||
int layerCount, int sampleCount)
|
||||
: imageType(imageType),
|
||||
format(format),
|
||||
ImageInfo(VkFormat format, VkExtent3D extent, int levelCount, int layerCount, int sampleCount)
|
||||
: format(format),
|
||||
extent(extent),
|
||||
levelCount(levelCount),
|
||||
layerCount(layerCount),
|
||||
@@ -903,16 +900,20 @@ struct ImageInfo
|
||||
levelCount(ci.mipLevels),
|
||||
sampleCount((int)ci.samples),
|
||||
extent(ci.extent),
|
||||
format(ci.format),
|
||||
imageType(ci.imageType)
|
||||
format(ci.format)
|
||||
{
|
||||
// The Vulkan spec Valid Usage for `VkImageCreateInfo` specifies that the height and depth of 1D
|
||||
// images, and the depth of 2D images must equal 1. We need to ensure this holds, even if the
|
||||
// application is invalid, since we rely on `depth>1` to detect 3D images and correctly handle
|
||||
// 2D views of 3D images.
|
||||
switch(ci.imageType)
|
||||
{
|
||||
case VK_IMAGE_TYPE_1D: extent.height = extent.depth = 1; break;
|
||||
case VK_IMAGE_TYPE_2D: extent.depth = 1; break;
|
||||
}
|
||||
}
|
||||
ImageInfo(const SwapchainInfo &swapInfo)
|
||||
: layerCount(swapInfo.arraySize),
|
||||
levelCount(1),
|
||||
sampleCount(1),
|
||||
format(swapInfo.format),
|
||||
imageType(VK_IMAGE_TYPE_2D)
|
||||
: layerCount(swapInfo.arraySize), levelCount(1), sampleCount(1), format(swapInfo.format)
|
||||
{
|
||||
extent.width = swapInfo.extent.width;
|
||||
extent.height = swapInfo.extent.height;
|
||||
@@ -1107,7 +1108,7 @@ struct ImgRefs
|
||||
imageInfo(imageInfo),
|
||||
aspectMask(FormatImageAspects(imageInfo.format))
|
||||
{
|
||||
if(imageInfo.imageType == VK_IMAGE_TYPE_3D)
|
||||
if(imageInfo.extent.depth > 1)
|
||||
// Depth slices of 3D views are treated as array layers
|
||||
this->imageInfo.layerCount = imageInfo.extent.depth;
|
||||
}
|
||||
@@ -1139,7 +1140,7 @@ FrameRefType ImgRefs::Update(ImageRange range, FrameRefType refType, Compose com
|
||||
range.extent.width = RDCMIN(range.extent.width, imageInfo.extent.width - range.offset.x);
|
||||
range.extent.height = RDCMIN(range.extent.height, imageInfo.extent.height - range.offset.y);
|
||||
|
||||
if(imageInfo.imageType == VK_IMAGE_TYPE_3D && range.viewType != VK_IMAGE_VIEW_TYPE_2D &&
|
||||
if(imageInfo.extent.depth > 1 && range.viewType != VK_IMAGE_VIEW_TYPE_2D &&
|
||||
range.viewType != VK_IMAGE_VIEW_TYPE_2D_ARRAY)
|
||||
{
|
||||
// The Vulkan spec allows 2D `VkImageView`s of 3D `VkImage`s--the depth slices of the images are
|
||||
|
||||
Reference in New Issue
Block a user