From 36640c9bfefdb414547c7575ec8adccf2e86263d Mon Sep 17 00:00:00 2001 From: Maciej Jesionowski Date: Tue, 17 Jan 2017 16:36:33 +0100 Subject: [PATCH] Add render to mipmaps tests This test repeatedly draws into the same image using consecutive mip levels as color and dept/stencil attachments. All mip levels and array layers are exercised. Modified tests: dEQP-VK.pipeline.render_to_image.* New tests: dEQP-VK.pipeline.render_to_image.*.mipmap.* Components: Vulkan Vulkan CTS issue: 487, 535 Change-Id: I7e4b3c6978d069c0accc377e9ab6e9d05e8e3cc6 --- android/cts/master/vk-master.txt | 140 +++++ .../pipeline/vktPipelineRenderToImageTests.cpp | 670 +++++++++++++++++---- external/vulkancts/mustpass/1.0.3/vk-default.txt | 140 +++++ 3 files changed, 840 insertions(+), 110 deletions(-) diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt index 4f1b454..f2e3afe 100644 --- a/android/cts/master/vk-master.txt +++ b/android/cts/master/vk-master.txt @@ -109216,6 +109216,26 @@ dEQP-VK.pipeline.render_to_image.1d.huge.width.r8g8b8a8_unorm_d16_unorm dEQP-VK.pipeline.render_to_image.1d.huge.width.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.1d.huge.width.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.1d.huge.width.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.1d.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.1d.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.1d.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.1d_array.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.1d_array.small.r32_uint dEQP-VK.pipeline.render_to_image.1d_array.small.r16g16_sint @@ -109251,6 +109271,26 @@ dEQP-VK.pipeline.render_to_image.1d_array.huge.width_layers.r8g8b8a8_unorm_d16_u dEQP-VK.pipeline.render_to_image.1d_array.huge.width_layers.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.1d_array.huge.width_layers.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.1d_array.huge.width_layers.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.2d.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.2d.small.r32_uint dEQP-VK.pipeline.render_to_image.2d.small.r16g16_sint @@ -109286,6 +109326,26 @@ dEQP-VK.pipeline.render_to_image.2d.huge.width_height.r8g8b8a8_unorm_d16_unorm dEQP-VK.pipeline.render_to_image.2d.huge.width_height.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.2d.huge.width_height.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.2d.huge.width_height.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.2d.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.2d.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.2d.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.2d_array.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.2d_array.small.r32_uint dEQP-VK.pipeline.render_to_image.2d_array.small.r16g16_sint @@ -109341,6 +109401,26 @@ dEQP-VK.pipeline.render_to_image.2d_array.huge.width_height_layers.r8g8b8a8_unor dEQP-VK.pipeline.render_to_image.2d_array.huge.width_height_layers.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.2d_array.huge.width_height_layers.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.2d_array.huge.width_height_layers.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.3d.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.3d.small.r32_uint dEQP-VK.pipeline.render_to_image.3d.small.r16g16_sint @@ -109396,6 +109476,26 @@ dEQP-VK.pipeline.render_to_image.3d.huge.width_height_depth.r8g8b8a8_unorm_d16_u dEQP-VK.pipeline.render_to_image.3d.huge.width_height_depth.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.3d.huge.width_height_depth.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.3d.huge.width_height_depth.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.3d.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.3d.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.3d.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.cube.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.cube.small.r32_uint dEQP-VK.pipeline.render_to_image.cube.small.r16g16_sint @@ -109421,6 +109521,26 @@ dEQP-VK.pipeline.render_to_image.cube.huge.width_height.r8g8b8a8_unorm_d16_unorm dEQP-VK.pipeline.render_to_image.cube.huge.width_height.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.cube.huge.width_height.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.cube.huge.width_height.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.cube.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.cube.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.cube.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.cube_array.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.cube_array.small.r32_uint dEQP-VK.pipeline.render_to_image.cube_array.small.r16g16_sint @@ -109456,6 +109576,26 @@ dEQP-VK.pipeline.render_to_image.cube_array.huge.width_height_layers.r8g8b8a8_un dEQP-VK.pipeline.render_to_image.cube_array.huge.width_height_layers.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.cube_array.huge.width_height_layers.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.cube_array.huge.width_height_layers.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.framebuffer_attachment.1d_32_64 dEQP-VK.pipeline.framebuffer_attachment.1d_32_48 dEQP-VK.pipeline.framebuffer_attachment.1d_32_39 diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp index e7f254e..63e2070 100644 --- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp +++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineRenderToImageTests.cpp @@ -2,7 +2,7 @@ * Vulkan Conformance Tests * ------------------------ * - * Copyright (c) 2016 The Khronos Group Inc. + * Copyright (c) 2017 The Khronos Group Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -83,7 +83,18 @@ enum Constants MASK_WHD = (1 | 2 | 4 | 0), }; -static const float REFERENCE_DEPTH_VALUE = 1.0f; +static const float REFERENCE_DEPTH_VALUE = 1.0f; +static const Vec4 COLOR_TABLE[] = +{ + Vec4(0.9f, 0.0f, 0.0f, 1.0f), + Vec4(0.6f, 1.0f, 0.0f, 1.0f), + Vec4(0.3f, 0.0f, 1.0f, 1.0f), + Vec4(0.1f, 1.0f, 1.0f, 1.0f), + Vec4(0.8f, 1.0f, 0.0f, 1.0f), + Vec4(0.5f, 0.0f, 1.0f, 1.0f), + Vec4(0.2f, 0.0f, 0.0f, 1.0f), + Vec4(1.0f, 1.0f, 0.0f, 1.0f), +}; struct CaseDef { @@ -115,6 +126,39 @@ inline VkDeviceSize product (const IVec4& v) return ((static_cast(v.x()) * v.y()) * v.z()) * v.w(); } +template +inline T sum (const vector& v) +{ + T total = static_cast(0); + for (typename vector::const_iterator it = v.begin(); it != v.end(); ++it) + total += *it; + return total; +} + +template +int findIndexOfMaxComponent (const tcu::Vector& vec) +{ + int index = 0; + T value = vec[0]; + + for (int i = 1; i < Size; ++i) + { + if (vec[i] > value) + { + index = i; + value = vec[i]; + } + } + + return index; +} + +inline int maxLayersOrDepth (const IVec4& size) +{ + // This is safe because 3D images must have layers (w) = 1 + return deMax32(size.z(), size.w()); +} + // This is very test specific, so be careful if you want to reuse this code. Move makeGraphicsPipeline (const DeviceInterface& vk, const VkDevice device, @@ -331,7 +375,9 @@ Move makeRenderPass (const DeviceInterface& vk, const VkDevice device, const VkFormat colorFormat, const VkFormat depthStencilFormat, - const deUint32 numLayers) + const deUint32 numLayers, + const VkImageLayout initialColorImageLayout = VK_IMAGE_LAYOUT_UNDEFINED, + const VkImageLayout initialDepthStencilImageLayout = VK_IMAGE_LAYOUT_UNDEFINED) { const VkAttachmentDescription colorAttachmentDescription = { @@ -342,7 +388,7 @@ Move makeRenderPass (const DeviceInterface& vk, VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; - VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; + initialColorImageLayout, // VkImageLayout initialLayout; VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; }; vector attachmentDescriptions(numLayers, colorAttachmentDescription); @@ -356,7 +402,7 @@ Move makeRenderPass (const DeviceInterface& vk, VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp storeOp; VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp stencilLoadOp; VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; - VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; + initialDepthStencilImageLayout, // VkImageLayout initialLayout; VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; }; @@ -424,6 +470,7 @@ Move makeImage (const DeviceInterface& vk, VkImageType imageType, const VkFormat format, const IVec3& size, + const deUint32 numMipLevels, const deUint32 numLayers, const VkImageUsageFlags usage) { @@ -435,7 +482,7 @@ Move makeImage (const DeviceInterface& vk, imageType, // VkImageType imageType; format, // VkFormat format; makeExtent3D(size), // VkExtent3D extent; - 1u, // deUint32 mipLevels; + numMipLevels, // deUint32 mipLevels; numLayers, // deUint32 arrayLayers; VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; @@ -480,7 +527,7 @@ std::string getColorFormatStr (const int numComponents, const bool isUint, const } //! A half-viewport quad. Use with TRIANGLE_STRIP topology. -vector genFullQuadVertices (const int subpassCount, const vector& color) +vector genFullQuadVertices (const int subpassCount) { vector vectorData; for (int subpassNdx = 0; subpassNdx < subpassCount; ++subpassNdx) @@ -488,7 +535,7 @@ vector genFullQuadVertices (const int subpassCount, const vector(REFERENCE_COLOR_VALUE) * setColor).cast(); for (int y = 0; y < renderSize.y(); ++y) @@ -638,24 +630,6 @@ void generateExpectedImage (const tcu::PixelBufferAccess& outputImage, const IVe } } -template -int findIndexOfMaxComponent (const tcu::Vector& vec) -{ - int index = 0; - T value = vec[0]; - - for (int i = 1; i < Size; ++i) - { - if (vec[i] > value) - { - index = i; - value = vec[i]; - } - } - - return index; -} - VkDeviceSize getMaxDeviceHeapSize (const InstanceInterface& vki, const VkPhysicalDevice physDevice) { const VkPhysicalDeviceMemoryProperties memoryProperties = getPhysicalDeviceMemoryProperties(vki, physDevice); @@ -766,7 +740,62 @@ VkImageAspectFlags getFormatAspectFlags (const VkFormat format) } } -//! See testAttachmentSize description +void initPrograms (SourceCollections& programCollection, const CaseDef caseDef) +{ + const int numComponents = getNumUsedChannels(mapVkFormat(caseDef.colorFormat).order); + const bool isUint = isUintFormat(caseDef.colorFormat); + const bool isSint = isIntFormat(caseDef.colorFormat); + + // Vertex shader + { + std::ostringstream src; + src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n" + << "\n" + << "layout(location = 0) in vec4 in_position;\n" + << "layout(location = 1) in vec4 in_color;\n" + << "layout(location = 0) out vec4 out_color;\n" + << "\n" + << "out gl_PerVertex {\n" + << " vec4 gl_Position;\n" + << "};\n" + << "\n" + << "void main(void)\n" + << "{\n" + << " gl_Position = in_position;\n" + << " out_color = in_color;\n" + << "}\n"; + + programCollection.glslSources.add("vert") << glu::VertexSource(src.str()); + } + + // Fragment shader + { + std::ostringstream colorValue; + colorValue << REFERENCE_COLOR_VALUE; + const std::string colorFormat = getColorFormatStr(numComponents, isUint, isSint); + const std::string colorInteger = (isUint || isSint ? " * "+colorFormat+"("+colorValue.str()+")" :""); + + std::ostringstream src; + src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n" + << "\n" + << "layout(location = 0) in vec4 in_color;\n" + << "layout(location = 0) out " << colorFormat << " o_color;\n" + << "\n" + << "void main(void)\n" + << "{\n" + << " o_color = " << colorFormat << "(" + << (numComponents == 1 ? "in_color.r" : + numComponents == 2 ? "in_color.rg" : + numComponents == 3 ? "in_color.rgb" : "in_color") + << colorInteger + << ");\n" + << "}\n"; + + programCollection.glslSources.add("frag") << glu::FragmentSource(src.str()); + } +} + +//! See testAttachmentSize() description tcu::TestStatus testWithSizeReduction (Context& context, const CaseDef& caseDef, const int sizeReductionIndex) { const DeviceInterface& vk = context.getDeviceInterface(); @@ -776,13 +805,7 @@ tcu::TestStatus testWithSizeReduction (Context& context, const CaseDef& caseDef, const VkQueue queue = context.getUniversalQueue(); const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); Allocator& allocator = context.getDefaultAllocator(); - const Vec4 color[] = - { - Vec4(0.9f, 0.0f, 0.0f, 1.0f), - Vec4(0.6f, 1.0f, 0.0f, 1.0f), - Vec4(0.3f, 0.0f, 1.0f, 1.0f), - Vec4(0.1f, 0.0f, 1.0f, 1.0f) - }; + // The memory might be too small to allocate a largest possible attachment, so try to account for that. const bool useDepthStencil = (caseDef.depthStencilFormat != VK_FORMAT_UNDEFINED); const VkDeviceSize deviceMemoryBudget = getMaxDeviceHeapSize(vki, physDevice) >> 2; @@ -801,7 +824,7 @@ tcu::TestStatus testWithSizeReduction (Context& context, const CaseDef& caseDef, << tcu::TestLog::Message << "Using an image with size (width, height, depth, layers) = " << imageSize << tcu::TestLog::EndMessage; // "Slices" is either the depth of a 3D image, or the number of layers of an arrayed image - const deInt32 numSlices = (VK_IMAGE_VIEW_TYPE_3D == caseDef.viewType ? imageSize.z() : imageSize.w()); + const deInt32 numSlices = maxLayersOrDepth(imageSize); const VkDeviceSize colorSize = product(imageSize) * tcu::getPixelSize(mapVkFormat(caseDef.colorFormat)); const VkDeviceSize depthStencilSize = (useDepthStencil ? product(imageSize) * tcu::getPixelSize(mapVkFormat(caseDef.depthStencilFormat)) : 0ull); @@ -823,6 +846,11 @@ tcu::TestStatus testWithSizeReduction (Context& context, const CaseDef& caseDef, const Unique colorBuffer (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)); const UniquePtr colorBufferAlloc (bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible)); + { + deMemset(colorBufferAlloc->getHostPtr(), 0, static_cast(colorBufferSize)); + flushMappedMemoryRange(vk, device, colorBufferAlloc->getMemory(), colorBufferAlloc->getOffset(), VK_WHOLE_SIZE); + } + const Unique vertexModule (createShaderModule (vk, device, context.getBinaryCollection().get("vert"), 0u)); const Unique fragmentModule (createShaderModule (vk, device, context.getBinaryCollection().get("frag"), 0u)); const Unique renderPass (makeRenderPass (vk, device, caseDef.colorFormat, caseDef.depthStencilFormat, static_cast(numSlices))); @@ -845,7 +873,7 @@ tcu::TestStatus testWithSizeReduction (Context& context, const CaseDef& caseDef, const VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; colorImage = makeImage(vk, device, getImageCreateFlags(caseDef.viewType), getImageType(caseDef.viewType), caseDef.colorFormat, - imageSize.swizzle(0, 1, 2), imageSize.w(), imageUsage); + imageSize.swizzle(0, 1, 2), 1u, imageSize.w(), imageUsage); colorImageAlloc = bindImage(vk, device, allocator, *colorImage, MemoryRequirement::Any); } @@ -855,13 +883,13 @@ tcu::TestStatus testWithSizeReduction (Context& context, const CaseDef& caseDef, const VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; depthStencilImage = makeImage(vk, device, (VkImageCreateFlags)0, VK_IMAGE_TYPE_2D, caseDef.depthStencilFormat, - IVec3(imageSize.x(), imageSize.y(), 1), numSlices, imageUsage); + IVec3(imageSize.x(), imageSize.y(), 1), 1u, numSlices, imageUsage); depthStencilImageAlloc = bindImage(vk, device, allocator, *depthStencilImage, MemoryRequirement::Any); } // Create a vertex buffer { - const vector vertices = genFullQuadVertices(numSlices, vector(color, color + DE_LENGTH_OF_ARRAY(color))); + const vector vertices = genFullQuadVertices(numSlices); const VkDeviceSize vertexBufferSize = sizeInBytes(vertices); vertexBuffer = makeBuffer(vk, device, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); @@ -905,7 +933,7 @@ tcu::TestStatus testWithSizeReduction (Context& context, const CaseDef& caseDef, framebuffer = makeFramebuffer(vk, device, *renderPass, static_cast(attachmentHandles.size()), &attachmentHandles[0], static_cast(imageSize.x()), static_cast(imageSize.y())); { - const Unique cmdPool (createCommandPool (vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex)); + const Unique cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex)); const Unique cmdBuffer (makeCommandBuffer(vk, device, *cmdPool)); beginCommandBuffer(vk, *cmdBuffer); @@ -1018,14 +1046,14 @@ tcu::TestStatus testWithSizeReduction (Context& context, const CaseDef& caseDef, invalidateMappedMemoryRange(vk, device, colorBufferAlloc->getMemory(), colorBufferAlloc->getOffset(), VK_WHOLE_SIZE); const tcu::TextureFormat format = mapVkFormat(caseDef.colorFormat); - const int checkDepth = deMax32(checkSize.z(), checkSize.w()); - const int depthOffset = deMax32(checkOffset.z(), checkOffset.w()); + const int checkDepth = maxLayersOrDepth(checkSize); + const int depthOffset = maxLayersOrDepth(checkOffset); const tcu::ConstPixelBufferAccess resultImage (format, checkSize.x(), checkSize.y(), checkDepth, colorBufferAlloc->getHostPtr()); tcu::TextureLevel textureLevel (format, checkSize.x(), checkSize.y(), checkDepth); const tcu::PixelBufferAccess expectedImage = textureLevel.getAccess(); bool ok = false; - generateExpectedImage(expectedImage, checkSize.swizzle(0, 1), depthOffset, color, DE_LENGTH_OF_ARRAY(color)); + generateExpectedImage(expectedImage, checkSize.swizzle(0, 1), depthOffset); if (isFloatFormat(caseDef.colorFormat)) ok = tcu::floatThresholdCompare(context.getTestContext().getLog(), "Image Comparison", "", expectedImage, resultImage, tcu::Vec4(0.01f), tcu::COMPARE_LOG_RESULT); @@ -1036,17 +1064,22 @@ tcu::TestStatus testWithSizeReduction (Context& context, const CaseDef& caseDef, } } -//! A test that can exercise very big color and depth/stencil attachment sizes. -//! If the total memory consumed by images is too large, or if the implementation returns OUT_OF_MEMORY error somewhere, -//! the test can be retried with a next increment of size reduction index, making the attachments smaller. -tcu::TestStatus testAttachmentSize (Context& context, const CaseDef caseDef) +void checkImageViewTypeRequirements (Context& context, const VkImageViewType viewType) { - if (caseDef.viewType == VK_IMAGE_VIEW_TYPE_3D && + if (viewType == VK_IMAGE_VIEW_TYPE_3D && !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_maintenance1")) TCU_THROW(NotSupportedError, "Extension VK_KHR_maintenance1 not supported"); - if (caseDef.viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY && !context.getDeviceFeatures().imageCubeArray) + if (viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY && !context.getDeviceFeatures().imageCubeArray) TCU_THROW(NotSupportedError, "Missing feature: imageCubeArray"); +} + +//! A test that can exercise very big color and depth/stencil attachment sizes. +//! If the total memory consumed by images is too large, or if the implementation returns OUT_OF_MEMORY error somewhere, +//! the test can be retried with a next increment of size reduction index, making the attachments smaller. +tcu::TestStatus testAttachmentSize (Context& context, const CaseDef caseDef) +{ + checkImageViewTypeRequirements(context, caseDef.viewType); int sizeReductionIndex = 0; @@ -1067,6 +1100,402 @@ tcu::TestStatus testAttachmentSize (Context& context, const CaseDef caseDef) // Never reached } +vector getMipLevelSizes (IVec4 baseSize) +{ + vector levels; + levels.push_back(baseSize); + + while (baseSize.x() != 1 || baseSize.y() != 1 || baseSize.z() != 1) + { + baseSize.x() = deMax32(baseSize.x() >> 1, 1); + baseSize.y() = deMax32(baseSize.y() >> 1, 1); + baseSize.z() = deMax32(baseSize.z() >> 1, 1); + levels.push_back(baseSize); + } + + return levels; +} + +//! Compute memory consumed by each mip level, including all layers. Sizes include a padding for alignment. +vector getPerMipLevelStorageSize (const vector& mipLevelSizes, const VkDeviceSize pixelSize) +{ + const deInt64 levelAlignment = 16; + vector storageSizes; + + for (vector::const_iterator it = mipLevelSizes.begin(); it != mipLevelSizes.end(); ++it) + storageSizes.push_back(deAlign64(pixelSize * product(*it), levelAlignment)); + + return storageSizes; +} + +void drawToMipLevel (const Context& context, + const CaseDef& caseDef, + const int mipLevel, + const IVec4& mipSize, + const int numSlices, + const VkImage colorImage, + const VkImage depthStencilImage, + const VkBuffer vertexBuffer, + const VkPipelineLayout pipelineLayout, + const VkShaderModule vertexModule, + const VkShaderModule fragmentModule) +{ + const DeviceInterface& vk = context.getDeviceInterface(); + const VkDevice device = context.getDevice(); + const VkQueue queue = context.getUniversalQueue(); + const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); + const VkImageAspectFlags depthStencilAspect = getFormatAspectFlags(caseDef.depthStencilFormat); + const bool useDepth = (depthStencilAspect & VK_IMAGE_ASPECT_DEPTH_BIT) != 0; + const bool useStencil = (depthStencilAspect & VK_IMAGE_ASPECT_STENCIL_BIT) != 0; + const Unique renderPass (makeRenderPass(vk, device, caseDef.colorFormat, caseDef.depthStencilFormat, static_cast(numSlices), + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)); + vector pipelines; + vector colorAttachments; + vector depthStencilAttachments; + vector attachmentHandles; // all attachments (color and d/s) + + // For each image layer or slice (3D), create an attachment and a pipeline + { + VkPipeline basePipeline = DE_NULL; + + // Color attachments are first in the framebuffer + for (int subpassNdx = 0; subpassNdx < numSlices; ++subpassNdx) + { + colorAttachments.push_back(makeSharedPtr(makeImageView( + vk, device, colorImage, getImageViewSliceType(caseDef.viewType), caseDef.colorFormat, + makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, mipLevel, 1u, subpassNdx, 1u)))); + attachmentHandles.push_back(**colorAttachments.back()); + + // We also have to create pipelines for each subpass + pipelines.push_back(makeSharedPtr(makeGraphicsPipeline( + vk, device, basePipeline, pipelineLayout, *renderPass, vertexModule, fragmentModule, mipSize.swizzle(0, 1), VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, + static_cast(subpassNdx), useDepth, useStencil))); + + basePipeline = **pipelines.front(); + } + + // Then D/S attachments, if any + if (useDepth || useStencil) + for (int subpassNdx = 0; subpassNdx < numSlices; ++subpassNdx) + { + depthStencilAttachments.push_back(makeSharedPtr(makeImageView( + vk, device, depthStencilImage, VK_IMAGE_VIEW_TYPE_2D, caseDef.depthStencilFormat, + makeImageSubresourceRange(depthStencilAspect, mipLevel, 1u, subpassNdx, 1u)))); + attachmentHandles.push_back(**depthStencilAttachments.back()); + } + } + + const Unique framebuffer (makeFramebuffer(vk, device, *renderPass, static_cast(attachmentHandles.size()), &attachmentHandles[0], + static_cast(mipSize.x()), static_cast(mipSize.y()))); + + { + const Unique cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex)); + const Unique cmdBuffer (makeCommandBuffer(vk, device, *cmdPool)); + + beginCommandBuffer(vk, *cmdBuffer); + { + vector clearValues (numSlices, getClearValue(caseDef.colorFormat)); + + if (useDepth || useStencil) + clearValues.insert(clearValues.end(), numSlices, makeClearValueDepthStencil(REFERENCE_DEPTH_VALUE, REFERENCE_STENCIL_VALUE)); + + const VkRect2D renderArea = + { + makeOffset2D(0, 0), + makeExtent2D(mipSize.x(), mipSize.y()), + }; + const VkRenderPassBeginInfo renderPassBeginInfo = + { + VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType; + DE_NULL, // const void* pNext; + *renderPass, // VkRenderPass renderPass; + *framebuffer, // VkFramebuffer framebuffer; + renderArea, // VkRect2D renderArea; + static_cast(clearValues.size()), // uint32_t clearValueCount; + &clearValues[0], // const VkClearValue* pClearValues; + }; + const VkDeviceSize vertexBufferOffset = 0ull; + + vk.cmdBeginRenderPass(*cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); + vk.cmdBindVertexBuffers(*cmdBuffer, 0u, 1u, &vertexBuffer, &vertexBufferOffset); + } + + // Draw + for (deUint32 subpassNdx = 0; subpassNdx < static_cast(numSlices); ++subpassNdx) + { + if (subpassNdx != 0) + vk.cmdNextSubpass(*cmdBuffer, VK_SUBPASS_CONTENTS_INLINE); + + vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **pipelines[subpassNdx]); + vk.cmdDraw(*cmdBuffer, 4u, 1u, subpassNdx*4u, 0u); + } + + vk.cmdEndRenderPass(*cmdBuffer); + + VK_CHECK(vk.endCommandBuffer(*cmdBuffer)); + submitCommandsAndWait(vk, device, queue, *cmdBuffer); + } +} + +//! Use image mip levels as attachments +tcu::TestStatus testRenderToMipMaps (Context& context, const CaseDef caseDef) +{ + checkImageViewTypeRequirements(context, caseDef.viewType); + + const DeviceInterface& vk = context.getDeviceInterface(); + const InstanceInterface& vki = context.getInstanceInterface(); + const VkDevice device = context.getDevice(); + const VkPhysicalDevice physDevice = context.getPhysicalDevice(); + const VkQueue queue = context.getUniversalQueue(); + const deUint32 queueFamilyIndex = context.getUniversalQueueFamilyIndex(); + Allocator& allocator = context.getDefaultAllocator(); + + const IVec4 imageSize = caseDef.imageSizeHint; // MAX_SIZE is not used in this test + const deInt32 numSlices = maxLayersOrDepth(imageSize); + const vector mipLevelSizes = getMipLevelSizes(imageSize); + const vector mipLevelStorageSizes = getPerMipLevelStorageSize(mipLevelSizes, tcu::getPixelSize(mapVkFormat(caseDef.colorFormat))); + const int numMipLevels = static_cast(mipLevelSizes.size()); + const bool useDepthStencil = (caseDef.depthStencilFormat != VK_FORMAT_UNDEFINED); + + if (useDepthStencil && !isDepthStencilFormatSupported(vki, physDevice, caseDef.depthStencilFormat)) + TCU_THROW(NotSupportedError, "Unsupported depth/stencil format"); + + // Create a color buffer big enough to hold all layers and mip levels + const VkDeviceSize colorBufferSize = sum(mipLevelStorageSizes); + const Unique colorBuffer (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)); + const UniquePtr colorBufferAlloc (bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible)); + + { + deMemset(colorBufferAlloc->getHostPtr(), 0, static_cast(colorBufferSize)); + flushMappedMemoryRange(vk, device, colorBufferAlloc->getMemory(), colorBufferAlloc->getOffset(), VK_WHOLE_SIZE); + } + + const Unique vertexModule (createShaderModule (vk, device, context.getBinaryCollection().get("vert"), 0u)); + const Unique fragmentModule (createShaderModule (vk, device, context.getBinaryCollection().get("frag"), 0u)); + const Unique pipelineLayout (makePipelineLayout (vk, device)); + + Move colorImage; + MovePtr colorImageAlloc; + Move depthStencilImage; + MovePtr depthStencilImageAlloc; + Move vertexBuffer; + MovePtr vertexBufferAlloc; + + // Create a color image + { + const VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + + colorImage = makeImage(vk, device, getImageCreateFlags(caseDef.viewType), getImageType(caseDef.viewType), caseDef.colorFormat, + imageSize.swizzle(0, 1, 2), numMipLevels, imageSize.w(), imageUsage); + colorImageAlloc = bindImage(vk, device, allocator, *colorImage, MemoryRequirement::Any); + } + + // Create a depth/stencil image (always a 2D image, optionally layered) + if (useDepthStencil) + { + const VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; + + depthStencilImage = makeImage(vk, device, (VkImageCreateFlags)0, VK_IMAGE_TYPE_2D, caseDef.depthStencilFormat, + IVec3(imageSize.x(), imageSize.y(), 1), numMipLevels, numSlices, imageUsage); + depthStencilImageAlloc = bindImage(vk, device, allocator, *depthStencilImage, MemoryRequirement::Any); + } + + // Create a vertex buffer + { + const vector vertices = genFullQuadVertices(numSlices); + const VkDeviceSize vertexBufferSize = sizeInBytes(vertices); + + vertexBuffer = makeBuffer(vk, device, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); + vertexBufferAlloc = bindBuffer(vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible); + deMemcpy(vertexBufferAlloc->getHostPtr(), &vertices[0], static_cast(vertexBufferSize)); + flushMappedMemoryRange(vk, device, vertexBufferAlloc->getMemory(), vertexBufferAlloc->getOffset(), vertexBufferSize); + } + + // Prepare images + { + const Unique cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex)); + const Unique cmdBuffer (makeCommandBuffer(vk, device, *cmdPool)); + + beginCommandBuffer(vk, *cmdBuffer); + + const VkImageMemoryBarrier imageBarriers[] = + { + { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; + DE_NULL, // const void* pNext; + (VkAccessFlags)0, // VkAccessFlags srcAccessMask; + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask; + VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout; + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout; + VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex; + VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex; + *colorImage, // VkImage image; + { // VkImageSubresourceRange subresourceRange; + VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; + 0u, // uint32_t baseMipLevel; + static_cast(numMipLevels), // uint32_t levelCount; + 0u, // uint32_t baseArrayLayer; + static_cast(imageSize.w()), // uint32_t layerCount; + }, + }, + { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; + DE_NULL, // const void* pNext; + (VkAccessFlags)0, // VkAccessFlags srcAccessMask; + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // VkAccessFlags dstAccessMask; + VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout; + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, // VkImageLayout newLayout; + VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex; + VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex; + *depthStencilImage, // VkImage image; + { // VkImageSubresourceRange subresourceRange; + getFormatAspectFlags(caseDef.depthStencilFormat), // VkImageAspectFlags aspectMask; + 0u, // uint32_t baseMipLevel; + static_cast(numMipLevels), // uint32_t levelCount; + 0u, // uint32_t baseArrayLayer; + static_cast(numSlices), // uint32_t layerCount; + }, + } + }; + + const deUint32 numImageBarriers = static_cast(DE_LENGTH_OF_ARRAY(imageBarriers) - (useDepthStencil ? 0 : 1)); + + vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u, + 0u, DE_NULL, 0u, DE_NULL, numImageBarriers, imageBarriers); + + VK_CHECK(vk.endCommandBuffer(*cmdBuffer)); + submitCommandsAndWait(vk, device, queue, *cmdBuffer); + } + + // Draw + for (int mipLevel = 0; mipLevel < numMipLevels; ++mipLevel) + { + const IVec4& mipSize = mipLevelSizes[mipLevel]; + const int levelSlices = maxLayersOrDepth(mipSize); + + drawToMipLevel (context, caseDef, mipLevel, mipSize, levelSlices, *colorImage, *depthStencilImage, *vertexBuffer, *pipelineLayout, + *vertexModule, *fragmentModule); + } + + // Copy results: colorImage -> host visible colorBuffer + { + const Unique cmdPool (createCommandPool(vk, device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, queueFamilyIndex)); + const Unique cmdBuffer (makeCommandBuffer(vk, device, *cmdPool)); + + beginCommandBuffer(vk, *cmdBuffer); + + { + const VkImageMemoryBarrier imageBarriers[] = + { + { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; + DE_NULL, // const void* pNext; + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // VkAccessFlags srcAccessMask; + VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask; + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout oldLayout; + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout; + VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex; + VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex; + *colorImage, // VkImage image; + { // VkImageSubresourceRange subresourceRange; + VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; + 0u, // uint32_t baseMipLevel; + static_cast(numMipLevels), // uint32_t levelCount; + 0u, // uint32_t baseArrayLayer; + static_cast(imageSize.w()), // uint32_t layerCount; + }, + } + }; + + vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, + 0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(imageBarriers), imageBarriers); + } + { + vector regions; + VkDeviceSize levelOffset = 0ull; + VkBufferImageCopy workRegion = + { + 0ull, // VkDeviceSize bufferOffset; + 0u, // uint32_t bufferRowLength; + 0u, // uint32_t bufferImageHeight; + makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, imageSize.w()), // VkImageSubresourceLayers imageSubresource; + makeOffset3D(0, 0, 0), // VkOffset3D imageOffset; + makeExtent3D(0, 0, 0), // VkExtent3D imageExtent; + }; + + for (int mipLevel = 0; mipLevel < numMipLevels; ++mipLevel) + { + workRegion.bufferOffset = levelOffset; + workRegion.imageSubresource.mipLevel = static_cast(mipLevel); + workRegion.imageExtent = makeExtent3D(mipLevelSizes[mipLevel].swizzle(0, 1, 2)); + + regions.push_back(workRegion); + + levelOffset += mipLevelStorageSizes[mipLevel]; + } + + vk.cmdCopyImageToBuffer(*cmdBuffer, *colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *colorBuffer, static_cast(regions.size()), ®ions[0]); + } + { + const VkBufferMemoryBarrier bufferBarriers[] = + { + { + VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType; + DE_NULL, // const void* pNext; + VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask; + VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask; + VK_QUEUE_FAMILY_IGNORED, // uint32_t srcQueueFamilyIndex; + VK_QUEUE_FAMILY_IGNORED, // uint32_t dstQueueFamilyIndex; + *colorBuffer, // VkBuffer buffer; + 0ull, // VkDeviceSize offset; + VK_WHOLE_SIZE, // VkDeviceSize size; + }, + }; + + vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, + 0u, DE_NULL, DE_LENGTH_OF_ARRAY(bufferBarriers), bufferBarriers, 0u, DE_NULL); + } + + VK_CHECK(vk.endCommandBuffer(*cmdBuffer)); + submitCommandsAndWait(vk, device, queue, *cmdBuffer); + } + + // Verify results (per mip level) + { + invalidateMappedMemoryRange(vk, device, colorBufferAlloc->getMemory(), colorBufferAlloc->getOffset(), VK_WHOLE_SIZE); + + const tcu::TextureFormat format = mapVkFormat(caseDef.colorFormat); + + VkDeviceSize levelOffset = 0ull; + bool allOk = true; + + for (int mipLevel = 0; mipLevel < numMipLevels; ++mipLevel) + { + const IVec4& mipSize = mipLevelSizes[mipLevel]; + const void* const pLevelData = static_cast(colorBufferAlloc->getHostPtr()) + levelOffset; + const int levelDepth = maxLayersOrDepth(mipSize); + const tcu::ConstPixelBufferAccess resultImage (format, mipSize.x(), mipSize.y(), levelDepth, pLevelData); + tcu::TextureLevel textureLevel (format, mipSize.x(), mipSize.y(), levelDepth); + const tcu::PixelBufferAccess expectedImage = textureLevel.getAccess(); + const std::string comparisonName = "Mip level " + de::toString(mipLevel); + bool ok = false; + + generateExpectedImage(expectedImage, mipSize.swizzle(0, 1), 0); + + if (isFloatFormat(caseDef.colorFormat)) + ok = tcu::floatThresholdCompare(context.getTestContext().getLog(), "Image Comparison", comparisonName.c_str(), expectedImage, resultImage, tcu::Vec4(0.01f), tcu::COMPARE_LOG_RESULT); + else + ok = tcu::intThresholdCompare(context.getTestContext().getLog(), "Image Comparison", comparisonName.c_str(), expectedImage, resultImage, tcu::UVec4(2), tcu::COMPARE_LOG_RESULT); + + allOk = allOk && ok; // keep testing all levels, even if we know it's a fail overall + levelOffset += mipLevelStorageSizes[mipLevel]; + } + + return allOk ? tcu::TestStatus::pass("Pass") : tcu::TestStatus::fail("Fail"); + } +} + std::string getSizeDescription (const IVec4& size) { std::ostringstream str; @@ -1125,9 +1554,9 @@ inline BVec4 bvecFromMask (deUint32 mask) (mask >> 3) & 1); } -std::vector genSizeCombinations (const IVec4& baselineSize, const deUint32 sizeMask, const VkImageViewType imageViewType) +vector genSizeCombinations (const IVec4& baselineSize, const deUint32 sizeMask, const VkImageViewType imageViewType) { - std::vector sizes; + vector sizes; std::set masks; for (deUint32 i = 0; i < (1u << 4); ++i) @@ -1180,12 +1609,13 @@ void addTestCasesWithFunctions (tcu::TestCaseGroup* group) VK_FORMAT_D32_SFLOAT_S8_UINT, }; - // Generate attachment size cases for all render targets for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(testCase); ++caseNdx) { MovePtr imageGroup(new tcu::TestCaseGroup(group->getTestContext(), getShortImageViewTypeName(testCase[caseNdx].viewType).c_str(), "")); + + // Generate attachment size cases { - const std::vector sizes = genSizeCombinations(testCase[caseNdx].baselineSize, testCase[caseNdx].sizeMask, testCase[caseNdx].viewType); + const vector sizes = genSizeCombinations(testCase[caseNdx].baselineSize, testCase[caseNdx].sizeMask, testCase[caseNdx].viewType); MovePtr smallGroup(new tcu::TestCaseGroup(group->getTestContext(), "small", "")); MovePtr hugeGroup (new tcu::TestCaseGroup(group->getTestContext(), "huge", "")); @@ -1193,7 +1623,7 @@ void addTestCasesWithFunctions (tcu::TestCaseGroup* group) imageGroup->addChild(smallGroup.get()); imageGroup->addChild(hugeGroup.get()); - for (std::vector::const_iterator sizeIter = sizes.begin(); sizeIter != sizes.end(); ++sizeIter) + for (vector::const_iterator sizeIter = sizes.begin(); sizeIter != sizes.end(); ++sizeIter) { // The first size is the baseline size, put it in a dedicated group if (sizeIter == sizes.begin()) @@ -1234,6 +1664,26 @@ void addTestCasesWithFunctions (tcu::TestCaseGroup* group) smallGroup.release(); hugeGroup.release(); } + + // Generate mip map cases + { + MovePtr mipmapGroup(new tcu::TestCaseGroup(group->getTestContext(), "mipmap", "")); + + for (int dsFormatNdx = 0; dsFormatNdx < DE_LENGTH_OF_ARRAY(depthStencilFormat); ++dsFormatNdx) + for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(format); ++formatNdx) + { + const CaseDef caseDef = + { + testCase[caseNdx].viewType, // VkImageViewType imageType; + testCase[caseNdx].baselineSize, // IVec4 imageSizeHint; + format[formatNdx], // VkFormat colorFormat; + depthStencilFormat[dsFormatNdx], // VkFormat depthStencilFormat; + }; + addFunctionCaseWithPrograms(mipmapGroup.get(), getFormatString(format[formatNdx], depthStencilFormat[dsFormatNdx]), "", initPrograms, testRenderToMipMaps, caseDef); + } + imageGroup->addChild(mipmapGroup.release()); + } + group->addChild(imageGroup.release()); } } diff --git a/external/vulkancts/mustpass/1.0.3/vk-default.txt b/external/vulkancts/mustpass/1.0.3/vk-default.txt index 4143668..bd3e314 100644 --- a/external/vulkancts/mustpass/1.0.3/vk-default.txt +++ b/external/vulkancts/mustpass/1.0.3/vk-default.txt @@ -131349,6 +131349,26 @@ dEQP-VK.pipeline.render_to_image.1d.huge.width.r8g8b8a8_unorm_d16_unorm dEQP-VK.pipeline.render_to_image.1d.huge.width.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.1d.huge.width.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.1d.huge.width.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.1d.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.1d.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.1d.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.1d_array.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.1d_array.small.r32_uint dEQP-VK.pipeline.render_to_image.1d_array.small.r16g16_sint @@ -131384,6 +131404,26 @@ dEQP-VK.pipeline.render_to_image.1d_array.huge.width_layers.r8g8b8a8_unorm_d16_u dEQP-VK.pipeline.render_to_image.1d_array.huge.width_layers.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.1d_array.huge.width_layers.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.1d_array.huge.width_layers.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.1d_array.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.2d.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.2d.small.r32_uint dEQP-VK.pipeline.render_to_image.2d.small.r16g16_sint @@ -131419,6 +131459,26 @@ dEQP-VK.pipeline.render_to_image.2d.huge.width_height.r8g8b8a8_unorm_d16_unorm dEQP-VK.pipeline.render_to_image.2d.huge.width_height.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.2d.huge.width_height.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.2d.huge.width_height.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.2d.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.2d.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.2d.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.2d_array.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.2d_array.small.r32_uint dEQP-VK.pipeline.render_to_image.2d_array.small.r16g16_sint @@ -131474,6 +131534,26 @@ dEQP-VK.pipeline.render_to_image.2d_array.huge.width_height_layers.r8g8b8a8_unor dEQP-VK.pipeline.render_to_image.2d_array.huge.width_height_layers.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.2d_array.huge.width_height_layers.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.2d_array.huge.width_height_layers.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.2d_array.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.3d.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.3d.small.r32_uint dEQP-VK.pipeline.render_to_image.3d.small.r16g16_sint @@ -131529,6 +131609,26 @@ dEQP-VK.pipeline.render_to_image.3d.huge.width_height_depth.r8g8b8a8_unorm_d16_u dEQP-VK.pipeline.render_to_image.3d.huge.width_height_depth.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.3d.huge.width_height_depth.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.3d.huge.width_height_depth.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.3d.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.3d.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.3d.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.3d.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.cube.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.cube.small.r32_uint dEQP-VK.pipeline.render_to_image.cube.small.r16g16_sint @@ -131554,6 +131654,26 @@ dEQP-VK.pipeline.render_to_image.cube.huge.width_height.r8g8b8a8_unorm_d16_unorm dEQP-VK.pipeline.render_to_image.cube.huge.width_height.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.cube.huge.width_height.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.cube.huge.width_height.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.cube.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.cube.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.cube.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.render_to_image.cube_array.small.r8g8b8a8_unorm dEQP-VK.pipeline.render_to_image.cube_array.small.r32_uint dEQP-VK.pipeline.render_to_image.cube_array.small.r16g16_sint @@ -131589,6 +131709,26 @@ dEQP-VK.pipeline.render_to_image.cube_array.huge.width_height_layers.r8g8b8a8_un dEQP-VK.pipeline.render_to_image.cube_array.huge.width_height_layers.r8g8b8a8_unorm_s8_uint dEQP-VK.pipeline.render_to_image.cube_array.huge.width_height_layers.r8g8b8a8_unorm_d24_unorm_s8_uint dEQP-VK.pipeline.render_to_image.cube_array.huge.width_height_layers.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r8g8b8a8_unorm +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r16g16_sint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32g32b32a32_sfloat +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r8g8b8a8_unorm_d16_unorm +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32_uint_d16_unorm +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r16g16_sint_d16_unorm +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32g32b32a32_sfloat_d16_unorm +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r8g8b8a8_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32_uint_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r16g16_sint_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32g32b32a32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r8g8b8a8_unorm_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32_uint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r16g16_sint_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32g32b32a32_sfloat_d24_unorm_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r8g8b8a8_unorm_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32_uint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r16g16_sint_d32_sfloat_s8_uint +dEQP-VK.pipeline.render_to_image.cube_array.mipmap.r32g32b32a32_sfloat_d32_sfloat_s8_uint dEQP-VK.pipeline.framebuffer_attachment.1d_32_64 dEQP-VK.pipeline.framebuffer_attachment.1d_32_48 dEQP-VK.pipeline.framebuffer_attachment.1d_32_39 -- 2.7.4