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:
Benson Joeris
2019-06-19 10:01:23 -04:00
committed by Baldur Karlsson
parent 38f0d27901
commit f4e7231fd5
2 changed files with 35 additions and 47 deletions
+20 -33
View File
@@ -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);
+15 -14
View File
@@ -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