diff --git a/renderdoc/driver/vulkan/imgrefs_tests.cpp b/renderdoc/driver/vulkan/imgrefs_tests.cpp index 393aac50c..b081506d4 100644 --- a/renderdoc/driver/vulkan/imgrefs_tests.cpp +++ b/renderdoc/driver/vulkan/imgrefs_tests.cpp @@ -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 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); diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 2839911e7..561d790de 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -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