Merge aosp/upstream-vulkan-cts-1.0-dev into aosp/master am: 1a6d3c9ee7 am: 1d692218d3
authorPyry Haulos <phaulos@google.com>
Thu, 15 Sep 2016 23:38:35 +0000 (23:38 +0000)
committerandroid-build-merger <android-build-merger@google.com>
Thu, 15 Sep 2016 23:38:35 +0000 (23:38 +0000)
am: 927151c175

Change-Id: I20e9d3ac41b67b4731098a64a2be30f1311ec3ad

71 files changed:
Android.mk
android/cts/master/vk-master.txt
android/cts/nyc/src/vk-master.txt
android/cts/nyc/vk-master.txt
external/vulkancts/framework/vulkan/vkBasicTypes.inl
external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl
external/vulkancts/framework/vulkan/vkConcreteInstanceInterface.inl
external/vulkancts/framework/vulkan/vkDefs.hpp
external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl
external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl
external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl
external/vulkancts/framework/vulkan/vkImageUtil.cpp
external/vulkancts/framework/vulkan/vkImageUtil.hpp
external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl
external/vulkancts/framework/vulkan/vkInitInstanceFunctionPointers.inl
external/vulkancts/framework/vulkan/vkInstanceDriverImpl.inl
external/vulkancts/framework/vulkan/vkInstanceFunctionPointers.inl
external/vulkancts/framework/vulkan/vkNullDriverImpl.inl
external/vulkancts/framework/vulkan/vkStrUtil.inl
external/vulkancts/framework/vulkan/vkStrUtilImpl.inl
external/vulkancts/framework/vulkan/vkStructTypes.inl
external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl
external/vulkancts/framework/vulkan/vkVirtualInstanceInterface.inl
external/vulkancts/gen_framework.py
external/vulkancts/modules/vulkan/CMakeLists.txt
external/vulkancts/modules/vulkan/api/vktApiBufferViewCreateTests.cpp
external/vulkancts/modules/vulkan/api/vktApiCopiesAndBlittingTests.cpp
external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp
external/vulkancts/modules/vulkan/fragment_ops/CMakeLists.txt
external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsEarlyFragmentTests.cpp [moved from external/vulkancts/modules/vulkan/pipeline/vktPipelineEarlyFragmentTests.cpp with 90% similarity]
external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsEarlyFragmentTests.hpp [moved from external/vulkancts/modules/vulkan/pipeline/vktPipelineEarlyFragmentTests.hpp with 83% similarity]
external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsMakeUtil.cpp
external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsMakeUtil.hpp
external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorMultiViewportTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorMultiViewportTests.hpp [moved from external/vulkancts/modules/vulkan/texture_filtering/vktTextureFilteringTests.cpp with 60% similarity]
external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorTests.cpp
external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsTests.cpp
external/vulkancts/modules/vulkan/image/CMakeLists.txt
external/vulkancts/modules/vulkan/image/vktImageLoadStoreTests.cpp
external/vulkancts/modules/vulkan/image/vktImageLoadStoreUtil.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/image/vktImageLoadStoreUtil.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/image/vktImageTests.cpp
external/vulkancts/modules/vulkan/image/vktImageTestsUtil.cpp
external/vulkancts/modules/vulkan/image/vktImageTestsUtil.hpp
external/vulkancts/modules/vulkan/image/vktImageTexture.cpp
external/vulkancts/modules/vulkan/image/vktImageTexture.hpp
external/vulkancts/modules/vulkan/pipeline/CMakeLists.txt
external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp
external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.hpp
external/vulkancts/modules/vulkan/pipeline/vktPipelineTests.cpp
external/vulkancts/modules/vulkan/texture/CMakeLists.txt [new file with mode: 0644]
external/vulkancts/modules/vulkan/texture/vktSampleVerifier.cpp [moved from external/vulkancts/modules/vulkan/texture_filtering/vktSampleVerifier.cpp with 99% similarity]
external/vulkancts/modules/vulkan/texture/vktSampleVerifier.hpp [moved from external/vulkancts/modules/vulkan/texture_filtering/vktSampleVerifier.hpp with 99% similarity]
external/vulkancts/modules/vulkan/texture/vktSampleVerifierUtil.cpp [moved from external/vulkancts/modules/vulkan/texture_filtering/vktSampleVerifierUtil.cpp with 99% similarity]
external/vulkancts/modules/vulkan/texture/vktSampleVerifierUtil.hpp [moved from external/vulkancts/modules/vulkan/texture_filtering/vktSampleVerifierUtil.hpp with 99% similarity]
external/vulkancts/modules/vulkan/texture/vktTextureFilteringExplicitLodTests.cpp [moved from external/vulkancts/modules/vulkan/texture_filtering/vktTextureFilteringExplicitLodTests.cpp with 99% similarity]
external/vulkancts/modules/vulkan/texture/vktTextureFilteringExplicitLodTests.hpp [moved from external/vulkancts/modules/vulkan/texture_filtering/vktTextureFilteringExplicitLodTests.hpp with 95% similarity]
external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.hpp [moved from external/vulkancts/modules/vulkan/texture_filtering/vktTextureFilteringTests.hpp with 76% similarity]
external/vulkancts/modules/vulkan/texture/vktTextureMipmapTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/texture/vktTextureMipmapTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/texture/vktTextureTests.cpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/texture/vktTextureTests.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/texture_filtering/CMakeLists.txt [deleted file]
external/vulkancts/modules/vulkan/vktTestPackage.cpp
external/vulkancts/mustpass/1.0.1/src/excluded-tests.txt
external/vulkancts/mustpass/1.0.1/vk-default.txt

index 7f0700c..b0c8ea6 100644 (file)
@@ -754,11 +754,15 @@ LOCAL_SRC_FILES := \
        external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.cpp \
        external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTests.cpp \
        external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateVPTests.cpp \
+       external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsEarlyFragmentTests.cpp \
        external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsMakeUtil.cpp \
+       external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorMultiViewportTests.cpp \
        external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorTests.cpp \
        external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsTests.cpp \
        external/vulkancts/modules/vulkan/image/vktImageAtomicOperationTests.cpp \
        external/vulkancts/modules/vulkan/image/vktImageLoadStoreTests.cpp \
+       external/vulkancts/modules/vulkan/image/vktImageLoadStoreUtil.cpp \
+       external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.cpp \
        external/vulkancts/modules/vulkan/image/vktImageQualifiersTests.cpp \
        external/vulkancts/modules/vulkan/image/vktImageSizeTests.cpp \
        external/vulkancts/modules/vulkan/image/vktImageTests.cpp \
@@ -772,7 +776,6 @@ LOCAL_SRC_FILES := \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineCacheTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineClearUtil.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineDepthTests.cpp \
-       external/vulkancts/modules/vulkan/pipeline/vktPipelineEarlyFragmentTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineImageSamplingInstance.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineImageTests.cpp \
        external/vulkancts/modules/vulkan/pipeline/vktPipelineImageUtil.cpp \
@@ -861,10 +864,13 @@ LOCAL_SRC_FILES := \
        external/vulkancts/modules/vulkan/tessellation/vktTessellationUserDefinedIO.cpp \
        external/vulkancts/modules/vulkan/tessellation/vktTessellationUtil.cpp \
        external/vulkancts/modules/vulkan/tessellation/vktTessellationWindingTests.cpp \
-       external/vulkancts/modules/vulkan/texture_filtering/vktSampleVerifier.cpp \
-       external/vulkancts/modules/vulkan/texture_filtering/vktSampleVerifierUtil.cpp \
-       external/vulkancts/modules/vulkan/texture_filtering/vktTextureFilteringTests.cpp \
-       external/vulkancts/modules/vulkan/texture_filtering/vktTextureFilteringExplicitLodTests.cpp \
+       external/vulkancts/modules/vulkan/texture/vktSampleVerifier.cpp \
+       external/vulkancts/modules/vulkan/texture/vktSampleVerifierUtil.cpp \
+       external/vulkancts/modules/vulkan/texture/vktTextureFilteringExplicitLodTests.cpp \
+       external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp \
+       external/vulkancts/modules/vulkan/texture/vktTextureMipmapTests.cpp \
+       external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.cpp \
+       external/vulkancts/modules/vulkan/texture/vktTextureTests.cpp \
        external/vulkancts/modules/vulkan/ubo/vktRandomUniformBlockCase.cpp \
        external/vulkancts/modules/vulkan/ubo/vktUniformBlockCase.cpp \
        external/vulkancts/modules/vulkan/ubo/vktUniformBlockTests.cpp \
@@ -939,7 +945,7 @@ LOCAL_C_INCLUDES := \
        $(deqp_dir)/external/vulkancts/modules/vulkan/ssbo \
        $(deqp_dir)/external/vulkancts/modules/vulkan/synchronization \
        $(deqp_dir)/external/vulkancts/modules/vulkan/tessellation \
-       $(deqp_dir)/external/vulkancts/modules/vulkan/texture_filtering \
+       $(deqp_dir)/external/vulkancts/modules/vulkan/texture \
        $(deqp_dir)/external/vulkancts/modules/vulkan/ubo \
        $(deqp_dir)/external/vulkancts/modules/vulkan/wsi
 
index 30b8fb4..2c8ffbf 100644 (file)
@@ -18123,6 +18123,18 @@ dEQP-VK.api.copy_and_blit.resolve_image.with_regions_8_bit
 dEQP-VK.api.copy_and_blit.resolve_image.with_regions_16_bit
 dEQP-VK.api.copy_and_blit.resolve_image.with_regions_32_bit
 dEQP-VK.api.copy_and_blit.resolve_image.with_regions_64_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_2_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_4_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_8_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_16_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_32_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_64_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_2_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_4_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_8_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_16_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_32_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_64_bit
 dEQP-VK.api.image_clearing.clear_color_image.1d_r4g4_unorm_pack8
 dEQP-VK.api.image_clearing.clear_color_image.1d_r4g4b4a4_unorm_pack16
 dEQP-VK.api.image_clearing.clear_color_image.1d_b4g4r4a4_unorm_pack16
@@ -73956,14 +73968,6 @@ dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_clear_depth_stencil_im
 dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_resolve_image_method
 dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_copy_query_pool_results_method
 dEQP-VK.pipeline.timestamp.misc_tests.timestamp_only
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_depth
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_stencil
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_depth
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_stencil
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_depth_no_attachment
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_stencil_no_attachment
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_depth_no_attachment
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_stencil_no_attachment
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_fragment_stage
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_geometry_stage_fragment_stage
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_tessellation_control_stage_tessellation_evaluation_stage_fragment_stage
@@ -102708,6 +102712,240 @@ dEQP-VK.image.load_store.buffer.r8g8b8a8_sint
 dEQP-VK.image.load_store.buffer.r32_sint
 dEQP-VK.image.load_store.buffer.r8g8b8a8_unorm
 dEQP-VK.image.load_store.buffer.r8g8b8a8_snorm
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_2
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_4
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_8
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_16
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_32
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_64
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_2
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_4
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_8
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_16
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_32
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_64
 dEQP-VK.image.format_reinterpret.1d.r32g32b32a32_sfloat_r32g32b32a32_uint
 dEQP-VK.image.format_reinterpret.1d.r32g32b32a32_sfloat_r32g32b32a32_sint
 dEQP-VK.image.format_reinterpret.1d.r16g16b16a16_sfloat_r16g16b16a16_uint
@@ -115752,196 +115990,6 @@ dEQP-VK.clipping.user_defined.clip_cull_distance_dynamic_index.vert_tess_geom.5_
 dEQP-VK.clipping.user_defined.clip_cull_distance_dynamic_index.vert_tess_geom.6_2
 dEQP-VK.clipping.user_defined.clip_cull_distance_dynamic_index.vert_tess_geom.7_1
 dEQP-VK.clipping.user_defined.clip_cull_distance_dynamic_index.vert_tess_geom.8
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_nearest_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_nearest_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_nearest_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_nearest_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_nearest_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_nearest_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_nearest_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_nearest_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_linear_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_linear_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_linear_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_linear_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_linear_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_linear_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_linear_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x2_linear_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_nearest_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_nearest_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_nearest_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_nearest_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_nearest_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_nearest_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_nearest_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_nearest_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_linear_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_linear_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_linear_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_linear_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_linear_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_linear_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_linear_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.2x3_linear_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_nearest_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_nearest_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_nearest_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_nearest_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_nearest_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_nearest_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_nearest_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_nearest_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_linear_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_linear_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_linear_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_linear_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_linear_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_linear_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_linear_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.3x7_linear_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_nearest_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_nearest_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_nearest_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_nearest_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_nearest_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_nearest_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_nearest_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_nearest_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_linear_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_linear_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_linear_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_linear_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_linear_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_linear_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_linear_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.4x8_linear_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_nearest_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_nearest_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_nearest_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_nearest_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_nearest_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_nearest_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_nearest_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_nearest_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_linear_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_linear_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_linear_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_linear_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_linear_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_linear_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_linear_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.31x55_linear_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_nearest_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_nearest_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_nearest_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_nearest_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_nearest_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_nearest_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_nearest_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_nearest_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_linear_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_linear_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_linear_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_linear_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_linear_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_linear_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_linear_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x32_linear_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_nearest_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_nearest_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_nearest_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_nearest_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_nearest_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_nearest_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_nearest_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_nearest_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_linear_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_linear_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_linear_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_linear_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_linear_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_linear_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_linear_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.32x64_linear_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_nearest_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_nearest_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_nearest_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_nearest_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_nearest_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_nearest_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_nearest_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_nearest_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_linear_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_linear_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_linear_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_linear_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_linear_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_linear_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_linear_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.57x35_linear_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_nearest_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_nearest_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_nearest_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_nearest_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_nearest_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_nearest_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_nearest_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_nearest_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_linear_nearest_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_linear_nearest_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_linear_nearest_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_linear_nearest_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_linear_linear_mipmap_nearest_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_linear_linear_mipmap_nearest_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_linear_linear_mipmap_linear_repeat
-dEQP-VK.texture_filtering.explicit_lod.2d.sizes.128x128_linear_linear_mipmap_linear_clamp
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.b4g4r4a4_unorm_pack16_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.b4g4r4a4_unorm_pack16_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r5g6b5_unorm_pack16_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r5g6b5_unorm_pack16_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.a1r5g5b5_unorm_pack16_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.a1r5g5b5_unorm_pack16_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8_unorm_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8_unorm_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8_snorm_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8_snorm_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8g8_unorm_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8g8_unorm_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8g8_snorm_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8g8_snorm_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8g8b8a8_unorm_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8g8b8a8_unorm_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8g8b8a8_snorm_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r8g8b8a8_snorm_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.b8g8r8a8_unorm_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.b8g8r8a8_unorm_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.a8b8g8r8_unorm_pack32_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.a8b8g8r8_unorm_pack32_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.a8b8g8r8_snorm_pack32_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.a8b8g8r8_snorm_pack32_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.a2b10g10r10_unorm_pack32_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.a2b10g10r10_unorm_pack32_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r16_sfloat_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r16_sfloat_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r16g16_sfloat_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r16g16_sfloat_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r16g16b16a16_sfloat_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r16g16b16a16_sfloat_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r32_sfloat_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r32_sfloat_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r32g32_sfloat_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r32g32_sfloat_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r32g32b32a32_sfloat_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.formats.r32g32b32a32_sfloat_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.derivatives.nearest_nearest_mipmap_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.derivatives.nearest_nearest_mipmap_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.derivatives.nearest_linear_mipmap_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.derivatives.nearest_linear_mipmap_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.derivatives.linear_nearest_mipmap_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.derivatives.linear_nearest_mipmap_linear
-dEQP-VK.texture_filtering.explicit_lod.2d.derivatives.linear_linear_mipmap_nearest
-dEQP-VK.texture_filtering.explicit_lod.2d.derivatives.linear_linear_mipmap_linear
 dEQP-VK.fragment_operations.scissor.points.inside
 dEQP-VK.fragment_operations.scissor.points.partially_inside
 dEQP-VK.fragment_operations.scissor.points.outside
@@ -115953,3 +116001,3221 @@ dEQP-VK.fragment_operations.scissor.triangles.inside
 dEQP-VK.fragment_operations.scissor.triangles.partially_inside
 dEQP-VK.fragment_operations.scissor.triangles.outside
 dEQP-VK.fragment_operations.scissor.triangles.crossing
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_1
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_2
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_3
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_4
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_5
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_6
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_7
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_8
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_9
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_10
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_11
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_12
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_13
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_14
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_15
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_16
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_depth
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_stencil
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_depth
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_stencil
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_depth_no_attachment
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_stencil_no_attachment
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_depth_no_attachment
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_stencil_no_attachment
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_nearest
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_linear
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_nearest
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_linear
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_nearest
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_linear
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_linear
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_nearest
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_linear
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_linear
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_nearest
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_linear
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_nearest
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_linear
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.4x8_nearest
+dEQP-VK.texture.filtering.2d.sizes.4x8_linear
+dEQP-VK.texture.filtering.2d.sizes.4x8_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.4x8_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.4x8_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.4x8_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.32x64_nearest
+dEQP-VK.texture.filtering.2d.sizes.32x64_linear
+dEQP-VK.texture.filtering.2d.sizes.32x64_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.32x64_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.32x64_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.32x64_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.128x128_nearest
+dEQP-VK.texture.filtering.2d.sizes.128x128_linear
+dEQP-VK.texture.filtering.2d.sizes.128x128_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.128x128_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.128x128_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.128x128_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.3x7_nearest
+dEQP-VK.texture.filtering.2d.sizes.3x7_linear
+dEQP-VK.texture.filtering.2d.sizes.3x7_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.3x7_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.3x7_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.3x7_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.31x55_nearest
+dEQP-VK.texture.filtering.2d.sizes.31x55_linear
+dEQP-VK.texture.filtering.2d.sizes.31x55_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.31x55_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.31x55_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.31x55_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.127x99_nearest
+dEQP-VK.texture.filtering.2d.sizes.127x99_linear
+dEQP-VK.texture.filtering.2d.sizes.127x99_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.127x99_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.127x99_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.127x99_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_nearest
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_linear
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_nearest
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_linear
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_nearest
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_linear
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_linear
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_nearest
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_linear
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_linear
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_nearest
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_linear
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_nearest
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_linear
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.8x8_nearest
+dEQP-VK.texture.filtering.cube.sizes.8x8_linear
+dEQP-VK.texture.filtering.cube.sizes.8x8_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.8x8_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.8x8_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.8x8_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.64x64_nearest
+dEQP-VK.texture.filtering.cube.sizes.64x64_linear
+dEQP-VK.texture.filtering.cube.sizes.64x64_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.64x64_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.64x64_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.64x64_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.128x128_nearest
+dEQP-VK.texture.filtering.cube.sizes.128x128_linear
+dEQP-VK.texture.filtering.cube.sizes.128x128_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.128x128_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.128x128_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.128x128_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.7x7_nearest
+dEQP-VK.texture.filtering.cube.sizes.7x7_linear
+dEQP-VK.texture.filtering.cube.sizes.7x7_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.7x7_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.7x7_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.7x7_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.63x63_nearest
+dEQP-VK.texture.filtering.cube.sizes.63x63_linear
+dEQP-VK.texture.filtering.cube.sizes.63x63_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.63x63_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.63x63_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.63x63_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.no_edges_visible.nearest
+dEQP-VK.texture.filtering.cube.no_edges_visible.linear
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_linear
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_nearest
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_linear
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_nearest
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_linear
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_linear
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_linear
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_linear
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_linear
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_linear
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_linear
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_nearest
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_linear
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_nearest
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_linear
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_nearest
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_linear
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_linear
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_nearest
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_linear
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_linear
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_nearest
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_linear
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_nearest
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_linear
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_nearest
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_linear
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_nearest
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_linear
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_nearest
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_linear
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_nearest
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_linear
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_nearest
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_linear
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_clamp
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_clamp_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_clamp_non_square
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_repeat
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_repeat_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_repeat_non_square
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_mirror
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_mirror_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_mirror_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_clamp
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_clamp_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_clamp_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_repeat
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_repeat_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_repeat_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_mirror
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_mirror_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_mirror_non_square
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_clamp
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_clamp_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_clamp_non_square
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_repeat
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_repeat_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_repeat_non_square
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_mirror
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_mirror_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_mirror_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_clamp
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_clamp_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_clamp_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_repeat
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_repeat_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_repeat_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_mirror
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_mirror_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_mirror_non_square
+dEQP-VK.texture.mipmap.2d.affine.nearest_nearest_clamp
+dEQP-VK.texture.mipmap.2d.affine.nearest_nearest_repeat
+dEQP-VK.texture.mipmap.2d.affine.nearest_nearest_mirror
+dEQP-VK.texture.mipmap.2d.affine.linear_nearest_clamp
+dEQP-VK.texture.mipmap.2d.affine.linear_nearest_repeat
+dEQP-VK.texture.mipmap.2d.affine.linear_nearest_mirror
+dEQP-VK.texture.mipmap.2d.affine.nearest_linear_clamp
+dEQP-VK.texture.mipmap.2d.affine.nearest_linear_repeat
+dEQP-VK.texture.mipmap.2d.affine.nearest_linear_mirror
+dEQP-VK.texture.mipmap.2d.affine.linear_linear_clamp
+dEQP-VK.texture.mipmap.2d.affine.linear_linear_repeat
+dEQP-VK.texture.mipmap.2d.affine.linear_linear_mirror
+dEQP-VK.texture.mipmap.2d.projected.nearest_nearest_clamp
+dEQP-VK.texture.mipmap.2d.projected.nearest_nearest_repeat
+dEQP-VK.texture.mipmap.2d.projected.nearest_nearest_mirror
+dEQP-VK.texture.mipmap.2d.projected.linear_nearest_clamp
+dEQP-VK.texture.mipmap.2d.projected.linear_nearest_repeat
+dEQP-VK.texture.mipmap.2d.projected.linear_nearest_mirror
+dEQP-VK.texture.mipmap.2d.projected.nearest_linear_clamp
+dEQP-VK.texture.mipmap.2d.projected.nearest_linear_repeat
+dEQP-VK.texture.mipmap.2d.projected.nearest_linear_mirror
+dEQP-VK.texture.mipmap.2d.projected.linear_linear_clamp
+dEQP-VK.texture.mipmap.2d.projected.linear_linear_repeat
+dEQP-VK.texture.mipmap.2d.projected.linear_linear_mirror
+dEQP-VK.texture.mipmap.2d.bias.nearest_nearest
+dEQP-VK.texture.mipmap.2d.bias.linear_nearest
+dEQP-VK.texture.mipmap.2d.bias.nearest_linear
+dEQP-VK.texture.mipmap.2d.bias.linear_linear
+dEQP-VK.texture.mipmap.2d.min_lod.nearest_nearest
+dEQP-VK.texture.mipmap.2d.min_lod.linear_nearest
+dEQP-VK.texture.mipmap.2d.min_lod.nearest_linear
+dEQP-VK.texture.mipmap.2d.min_lod.linear_linear
+dEQP-VK.texture.mipmap.2d.max_lod.nearest_nearest
+dEQP-VK.texture.mipmap.2d.max_lod.linear_nearest
+dEQP-VK.texture.mipmap.2d.max_lod.nearest_linear
+dEQP-VK.texture.mipmap.2d.max_lod.linear_linear
+dEQP-VK.texture.mipmap.2d.base_level.nearest_nearest
+dEQP-VK.texture.mipmap.2d.base_level.linear_nearest
+dEQP-VK.texture.mipmap.2d.base_level.nearest_linear
+dEQP-VK.texture.mipmap.2d.base_level.linear_linear
+dEQP-VK.texture.mipmap.2d.max_level.nearest_nearest
+dEQP-VK.texture.mipmap.2d.max_level.linear_nearest
+dEQP-VK.texture.mipmap.2d.max_level.nearest_linear
+dEQP-VK.texture.mipmap.2d.max_level.linear_linear
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.min_lod.nearest_nearest
+dEQP-VK.texture.mipmap.cubemap.min_lod.linear_nearest
+dEQP-VK.texture.mipmap.cubemap.min_lod.nearest_linear
+dEQP-VK.texture.mipmap.cubemap.min_lod.linear_linear
+dEQP-VK.texture.mipmap.cubemap.max_lod.nearest_nearest
+dEQP-VK.texture.mipmap.cubemap.max_lod.linear_nearest
+dEQP-VK.texture.mipmap.cubemap.max_lod.nearest_linear
+dEQP-VK.texture.mipmap.cubemap.max_lod.linear_linear
+dEQP-VK.texture.mipmap.cubemap.base_level.nearest_nearest
+dEQP-VK.texture.mipmap.cubemap.base_level.linear_nearest
+dEQP-VK.texture.mipmap.cubemap.base_level.nearest_linear
+dEQP-VK.texture.mipmap.cubemap.base_level.linear_linear
+dEQP-VK.texture.mipmap.cubemap.max_level.nearest_nearest
+dEQP-VK.texture.mipmap.cubemap.max_level.linear_nearest
+dEQP-VK.texture.mipmap.cubemap.max_level.nearest_linear
+dEQP-VK.texture.mipmap.cubemap.max_level.linear_linear
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_clamp
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_clamp_npot
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_repeat
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_repeat_npot
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_mirror
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_mirror_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_clamp
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_clamp_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_repeat
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_repeat_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_mirror
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_mirror_npot
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_clamp
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_clamp_npot
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_repeat
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_repeat_npot
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_mirror
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_mirror_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_clamp
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_clamp_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_repeat
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_repeat_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_mirror
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_mirror_npot
+dEQP-VK.texture.mipmap.3d.affine.nearest_nearest_clamp
+dEQP-VK.texture.mipmap.3d.affine.nearest_nearest_repeat
+dEQP-VK.texture.mipmap.3d.affine.nearest_nearest_mirror
+dEQP-VK.texture.mipmap.3d.affine.linear_nearest_clamp
+dEQP-VK.texture.mipmap.3d.affine.linear_nearest_repeat
+dEQP-VK.texture.mipmap.3d.affine.linear_nearest_mirror
+dEQP-VK.texture.mipmap.3d.affine.nearest_linear_clamp
+dEQP-VK.texture.mipmap.3d.affine.nearest_linear_repeat
+dEQP-VK.texture.mipmap.3d.affine.nearest_linear_mirror
+dEQP-VK.texture.mipmap.3d.affine.linear_linear_clamp
+dEQP-VK.texture.mipmap.3d.affine.linear_linear_repeat
+dEQP-VK.texture.mipmap.3d.affine.linear_linear_mirror
+dEQP-VK.texture.mipmap.3d.projected.nearest_nearest_clamp
+dEQP-VK.texture.mipmap.3d.projected.nearest_nearest_repeat
+dEQP-VK.texture.mipmap.3d.projected.nearest_nearest_mirror
+dEQP-VK.texture.mipmap.3d.projected.linear_nearest_clamp
+dEQP-VK.texture.mipmap.3d.projected.linear_nearest_repeat
+dEQP-VK.texture.mipmap.3d.projected.linear_nearest_mirror
+dEQP-VK.texture.mipmap.3d.projected.nearest_linear_clamp
+dEQP-VK.texture.mipmap.3d.projected.nearest_linear_repeat
+dEQP-VK.texture.mipmap.3d.projected.nearest_linear_mirror
+dEQP-VK.texture.mipmap.3d.projected.linear_linear_clamp
+dEQP-VK.texture.mipmap.3d.projected.linear_linear_repeat
+dEQP-VK.texture.mipmap.3d.projected.linear_linear_mirror
+dEQP-VK.texture.mipmap.3d.bias.nearest_nearest
+dEQP-VK.texture.mipmap.3d.bias.linear_nearest
+dEQP-VK.texture.mipmap.3d.bias.nearest_linear
+dEQP-VK.texture.mipmap.3d.bias.linear_linear
+dEQP-VK.texture.mipmap.3d.min_lod.nearest_nearest
+dEQP-VK.texture.mipmap.3d.min_lod.linear_nearest
+dEQP-VK.texture.mipmap.3d.min_lod.nearest_linear
+dEQP-VK.texture.mipmap.3d.min_lod.linear_linear
+dEQP-VK.texture.mipmap.3d.max_lod.nearest_nearest
+dEQP-VK.texture.mipmap.3d.max_lod.linear_nearest
+dEQP-VK.texture.mipmap.3d.max_lod.nearest_linear
+dEQP-VK.texture.mipmap.3d.max_lod.linear_linear
+dEQP-VK.texture.mipmap.3d.base_level.nearest_nearest
+dEQP-VK.texture.mipmap.3d.base_level.linear_nearest
+dEQP-VK.texture.mipmap.3d.base_level.nearest_linear
+dEQP-VK.texture.mipmap.3d.base_level.linear_linear
+dEQP-VK.texture.mipmap.3d.max_level.nearest_nearest
+dEQP-VK.texture.mipmap.3d.max_level.linear_nearest
+dEQP-VK.texture.mipmap.3d.max_level.nearest_linear
+dEQP-VK.texture.mipmap.3d.max_level.linear_linear
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_nearest_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_nearest_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_nearest_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_nearest_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_nearest_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_nearest_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_nearest_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_nearest_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_linear_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_linear_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_linear_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_linear_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_linear_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_linear_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_linear_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x2_linear_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_nearest_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_nearest_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_nearest_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_nearest_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_nearest_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_nearest_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_nearest_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_nearest_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_linear_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_linear_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_linear_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_linear_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_linear_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_linear_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_linear_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.2x3_linear_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_nearest_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_nearest_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_nearest_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_nearest_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_nearest_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_nearest_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_nearest_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_nearest_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_linear_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_linear_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_linear_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_linear_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_linear_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_linear_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_linear_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.3x7_linear_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_nearest_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_nearest_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_nearest_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_nearest_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_nearest_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_nearest_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_nearest_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_nearest_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_linear_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_linear_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_linear_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_linear_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_linear_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_linear_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_linear_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.4x8_linear_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_nearest_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_nearest_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_nearest_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_nearest_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_nearest_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_nearest_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_nearest_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_nearest_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_linear_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_linear_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_linear_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_linear_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_linear_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_linear_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_linear_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.31x55_linear_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_nearest_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_nearest_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_nearest_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_nearest_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_nearest_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_nearest_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_nearest_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_nearest_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_linear_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_linear_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_linear_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_linear_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_linear_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_linear_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_linear_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x32_linear_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_nearest_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_nearest_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_nearest_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_nearest_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_nearest_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_nearest_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_nearest_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_nearest_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_linear_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_linear_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_linear_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_linear_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_linear_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_linear_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_linear_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.32x64_linear_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_nearest_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_nearest_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_nearest_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_nearest_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_nearest_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_nearest_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_nearest_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_nearest_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_linear_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_linear_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_linear_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_linear_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_linear_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_linear_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_linear_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.57x35_linear_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_nearest_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_nearest_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_nearest_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_nearest_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_nearest_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_nearest_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_nearest_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_nearest_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_linear_nearest_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_linear_nearest_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_linear_nearest_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_linear_nearest_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_linear_linear_mipmap_nearest_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_linear_linear_mipmap_nearest_clamp
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_linear_linear_mipmap_linear_repeat
+dEQP-VK.texture.explicit_lod.2d.sizes.128x128_linear_linear_mipmap_linear_clamp
+dEQP-VK.texture.explicit_lod.2d.formats.b4g4r4a4_unorm_pack16_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.b4g4r4a4_unorm_pack16_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r5g6b5_unorm_pack16_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r5g6b5_unorm_pack16_linear
+dEQP-VK.texture.explicit_lod.2d.formats.a1r5g5b5_unorm_pack16_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.a1r5g5b5_unorm_pack16_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r8_unorm_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r8_unorm_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r8_snorm_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r8_snorm_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r8g8_unorm_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r8g8_unorm_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r8g8_snorm_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r8g8_snorm_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r8g8b8a8_unorm_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r8g8b8a8_unorm_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r8g8b8a8_snorm_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r8g8b8a8_snorm_linear
+dEQP-VK.texture.explicit_lod.2d.formats.b8g8r8a8_unorm_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.b8g8r8a8_unorm_linear
+dEQP-VK.texture.explicit_lod.2d.formats.a8b8g8r8_unorm_pack32_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.a8b8g8r8_unorm_pack32_linear
+dEQP-VK.texture.explicit_lod.2d.formats.a8b8g8r8_snorm_pack32_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.a8b8g8r8_snorm_pack32_linear
+dEQP-VK.texture.explicit_lod.2d.formats.a2b10g10r10_unorm_pack32_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.a2b10g10r10_unorm_pack32_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r16_sfloat_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r16_sfloat_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r16g16_sfloat_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r16g16_sfloat_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r16g16b16a16_sfloat_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r16g16b16a16_sfloat_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r32_sfloat_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r32_sfloat_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r32g32_sfloat_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r32g32_sfloat_linear
+dEQP-VK.texture.explicit_lod.2d.formats.r32g32b32a32_sfloat_nearest
+dEQP-VK.texture.explicit_lod.2d.formats.r32g32b32a32_sfloat_linear
+dEQP-VK.texture.explicit_lod.2d.derivatives.nearest_nearest_mipmap_nearest
+dEQP-VK.texture.explicit_lod.2d.derivatives.nearest_nearest_mipmap_linear
+dEQP-VK.texture.explicit_lod.2d.derivatives.nearest_linear_mipmap_nearest
+dEQP-VK.texture.explicit_lod.2d.derivatives.nearest_linear_mipmap_linear
+dEQP-VK.texture.explicit_lod.2d.derivatives.linear_nearest_mipmap_nearest
+dEQP-VK.texture.explicit_lod.2d.derivatives.linear_nearest_mipmap_linear
+dEQP-VK.texture.explicit_lod.2d.derivatives.linear_linear_mipmap_nearest
+dEQP-VK.texture.explicit_lod.2d.derivatives.linear_linear_mipmap_linear
index 29c9ad1..c0adf79 100644 (file)
@@ -55664,14 +55664,6 @@ dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_clear_depth_stencil_im
 dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_resolve_image_method
 dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_copy_query_pool_results_method
 dEQP-VK.pipeline.timestamp.misc_tests.timestamp_only
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_depth
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_stencil
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_depth
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_stencil
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_depth_no_attachment
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_stencil_no_attachment
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_depth_no_attachment
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_stencil_no_attachment
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_fragment_stage
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_geometry_stage_fragment_stage
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_tessellation_control_stage_tessellation_evaluation_stage_fragment_stage
@@ -81463,3 +81455,11 @@ dEQP-VK.sparse_resources.buffer_sparse_memory_aliasing.buffer_size_2_16
 dEQP-VK.sparse_resources.buffer_sparse_memory_aliasing.buffer_size_2_17
 dEQP-VK.sparse_resources.buffer_sparse_memory_aliasing.buffer_size_2_20
 dEQP-VK.sparse_resources.buffer_sparse_memory_aliasing.buffer_size_2_24
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_depth
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_stencil
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_depth
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_stencil
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_depth_no_attachment
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_stencil_no_attachment
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_depth_no_attachment
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_stencil_no_attachment
index 5e1f8f8..049c171 100644 (file)
@@ -56716,14 +56716,6 @@ dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_clear_depth_stencil_im
 dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_resolve_image_method
 dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_copy_query_pool_results_method
 dEQP-VK.pipeline.timestamp.misc_tests.timestamp_only
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_depth
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_stencil
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_depth
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_stencil
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_depth_no_attachment
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_stencil_no_attachment
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_depth_no_attachment
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_stencil_no_attachment
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_fragment_stage
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_geometry_stage_fragment_stage
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_tessellation_control_stage_tessellation_evaluation_stage_fragment_stage
@@ -81463,3 +81455,11 @@ dEQP-VK.sparse_resources.buffer_sparse_memory_aliasing.buffer_size_2_16
 dEQP-VK.sparse_resources.buffer_sparse_memory_aliasing.buffer_size_2_17
 dEQP-VK.sparse_resources.buffer_sparse_memory_aliasing.buffer_size_2_20
 dEQP-VK.sparse_resources.buffer_sparse_memory_aliasing.buffer_size_2_24
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_depth
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_stencil
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_depth
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_stencil
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_depth_no_attachment
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_stencil_no_attachment
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_depth_no_attachment
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_stencil_no_attachment
index e422870..fb8c3bb 100644 (file)
@@ -150,6 +150,11 @@ enum VkStructureType
        VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV                             = 1000026000,
        VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV                    = 1000026001,
        VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV                  = 1000026002,
+       VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV                                  = 1000056000,
+       VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV                                                = 1000056001,
+       VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV                                    = 1000057000,
+       VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV                                    = 1000057001,
+       VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV                             = 1000058000,
 };
 
 enum VkSystemAllocationScope
@@ -357,8 +362,14 @@ enum VkFormat
        VK_FORMAT_ASTC_12x10_SRGB_BLOCK                 = 182,
        VK_FORMAT_ASTC_12x12_UNORM_BLOCK                = 183,
        VK_FORMAT_ASTC_12x12_SRGB_BLOCK                 = 184,
-
-       VK_FORMAT_LAST
+       VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG   = 1000054000,
+       VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG   = 1000054001,
+       VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG   = 1000054002,
+       VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG   = 1000054003,
+       VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG    = 1000054004,
+       VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG    = 1000054005,
+       VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG    = 1000054006,
+       VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG    = 1000054007,
 };
 
 enum VkImageType
@@ -1100,6 +1111,23 @@ enum VkDebugReportFlagBitsEXT
 };
 typedef deUint32 VkDebugReportFlagsEXT;
 
+enum VkExternalMemoryHandleTypeFlagBitsNV
+{
+       VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV              = 0x00000001,
+       VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV  = 0x00000002,
+       VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV               = 0x00000004,
+       VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_KMT_BIT_NV   = 0x00000008,
+};
+typedef deUint32 VkExternalMemoryHandleTypeFlagsNV;
+
+enum VkExternalMemoryFeatureFlagBitsNV
+{
+       VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV        = 0x00000001,
+       VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV            = 0x00000002,
+       VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV            = 0x00000004,
+};
+typedef deUint32 VkExternalMemoryFeatureFlagsNV;
+
 typedef deUint32 VkInstanceCreateFlags;
 
 typedef deUint32 VkDeviceCreateFlags;
@@ -1174,16 +1202,18 @@ typedef deUint32 VkAndroidSurfaceCreateFlagsKHR;
 
 typedef deUint32 VkWin32SurfaceCreateFlagsKHR;
 
-VK_DEFINE_PLATFORM_TYPE(XlibDisplayPtr,                        void*);
-VK_DEFINE_PLATFORM_TYPE(XlibWindow,                            deUintptr);
-VK_DEFINE_PLATFORM_TYPE(XlibVisualID,                  deUint32);
-VK_DEFINE_PLATFORM_TYPE(XcbConnectionPtr,              void*);
-VK_DEFINE_PLATFORM_TYPE(XcbWindow,                             deUintptr);
-VK_DEFINE_PLATFORM_TYPE(XcbVisualid,                   deUint32);
-VK_DEFINE_PLATFORM_TYPE(WaylandDisplayPtr,             void*);
-VK_DEFINE_PLATFORM_TYPE(WaylandSurfacePtr,             void*);
-VK_DEFINE_PLATFORM_TYPE(MirConnectionPtr,              void*);
-VK_DEFINE_PLATFORM_TYPE(MirSurfacePtr,                 void*);
-VK_DEFINE_PLATFORM_TYPE(AndroidNativeWindowPtr,        void*);
-VK_DEFINE_PLATFORM_TYPE(Win32InstanceHandle,   void*);
-VK_DEFINE_PLATFORM_TYPE(Win32WindowHandle,             void*);
+VK_DEFINE_PLATFORM_TYPE(XlibDisplayPtr,                                void*);
+VK_DEFINE_PLATFORM_TYPE(XlibWindow,                                    deUintptr);
+VK_DEFINE_PLATFORM_TYPE(XlibVisualID,                          deUint32);
+VK_DEFINE_PLATFORM_TYPE(XcbConnectionPtr,                      void*);
+VK_DEFINE_PLATFORM_TYPE(XcbWindow,                                     deUintptr);
+VK_DEFINE_PLATFORM_TYPE(XcbVisualid,                           deUint32);
+VK_DEFINE_PLATFORM_TYPE(WaylandDisplayPtr,                     void*);
+VK_DEFINE_PLATFORM_TYPE(WaylandSurfacePtr,                     void*);
+VK_DEFINE_PLATFORM_TYPE(MirConnectionPtr,                      void*);
+VK_DEFINE_PLATFORM_TYPE(MirSurfacePtr,                         void*);
+VK_DEFINE_PLATFORM_TYPE(AndroidNativeWindowPtr,                void*);
+VK_DEFINE_PLATFORM_TYPE(Win32InstanceHandle,           void*);
+VK_DEFINE_PLATFORM_TYPE(Win32WindowHandle,                     void*);
+VK_DEFINE_PLATFORM_TYPE(Win32Handle,                           void*);
+VK_DEFINE_PLATFORM_TYPE(Win32SecurityAttributesPtr,    const void*);
index 5fb2867..37824b9 100644 (file)
@@ -132,3 +132,6 @@ virtual VkResult    debugMarkerSetObjectNameEXT                     (VkDevice device, VkDebugMarkerOb
 virtual void           cmdDebugMarkerBeginEXT                          (VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const;
 virtual void           cmdDebugMarkerEndEXT                            (VkCommandBuffer commandBuffer) const;
 virtual void           cmdDebugMarkerInsertEXT                         (VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const;
+virtual void           cmdDrawIndirectCountAMD                         (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const;
+virtual void           cmdDrawIndexedIndirectCountAMD          (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const;
+virtual VkResult       getMemoryWin32HandleNV                          (VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle) const;
index 6391d3f..8b51df2 100644 (file)
@@ -1,42 +1,43 @@
 /* WARNING: This is auto-generated file. Do not modify, since changes will
  * be lost! Modify the generating script instead.
  */
-virtual void                           destroyInstance                                                                 (VkInstance instance, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult                       enumeratePhysicalDevices                                                (VkInstance instance, deUint32* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices) const;
-virtual void                           getPhysicalDeviceFeatures                                               (VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures) const;
-virtual void                           getPhysicalDeviceFormatProperties                               (VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties) const;
-virtual VkResult                       getPhysicalDeviceImageFormatProperties                  (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties) const;
-virtual void                           getPhysicalDeviceProperties                                             (VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties) const;
-virtual void                           getPhysicalDeviceQueueFamilyProperties                  (VkPhysicalDevice physicalDevice, deUint32* pQueueFamilyPropertyCount, VkQueueFamilyProperties* pQueueFamilyProperties) const;
-virtual void                           getPhysicalDeviceMemoryProperties                               (VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties) const;
-virtual PFN_vkVoidFunction     getDeviceProcAddr                                                               (VkDevice device, const char* pName) const;
-virtual VkResult                       createDevice                                                                    (VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice) const;
-virtual VkResult                       enumerateDeviceExtensionProperties                              (VkPhysicalDevice physicalDevice, const char* pLayerName, deUint32* pPropertyCount, VkExtensionProperties* pProperties) const;
-virtual VkResult                       enumerateDeviceLayerProperties                                  (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkLayerProperties* pProperties) const;
-virtual void                           getPhysicalDeviceSparseImageFormatProperties    (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, deUint32* pPropertyCount, VkSparseImageFormatProperties* pProperties) const;
-virtual void                           destroySurfaceKHR                                                               (VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator) const;
-virtual VkResult                       getPhysicalDeviceSurfaceSupportKHR                              (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported) const;
-virtual VkResult                       getPhysicalDeviceSurfaceCapabilitiesKHR                 (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities) const;
-virtual VkResult                       getPhysicalDeviceSurfaceFormatsKHR                              (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats) const;
-virtual VkResult                       getPhysicalDeviceSurfacePresentModesKHR                 (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pPresentModeCount, VkPresentModeKHR* pPresentModes) const;
-virtual VkResult                       getPhysicalDeviceDisplayPropertiesKHR                   (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPropertiesKHR* pProperties) const;
-virtual VkResult                       getPhysicalDeviceDisplayPlanePropertiesKHR              (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPlanePropertiesKHR* pProperties) const;
-virtual VkResult                       getDisplayPlaneSupportedDisplaysKHR                             (VkPhysicalDevice physicalDevice, deUint32 planeIndex, deUint32* pDisplayCount, VkDisplayKHR* pDisplays) const;
-virtual VkResult                       getDisplayModePropertiesKHR                                             (VkPhysicalDevice physicalDevice, VkDisplayKHR display, deUint32* pPropertyCount, VkDisplayModePropertiesKHR* pProperties) const;
-virtual VkResult                       createDisplayModeKHR                                                    (VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode) const;
-virtual VkResult                       getDisplayPlaneCapabilitiesKHR                                  (VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, deUint32 planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities) const;
-virtual VkResult                       createDisplayPlaneSurfaceKHR                                    (VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
-virtual VkResult                       createXlibSurfaceKHR                                                    (VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
-virtual VkBool32                       getPhysicalDeviceXlibPresentationSupportKHR             (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XlibDisplayPtr dpy, pt::XlibVisualID visualID) const;
-virtual VkResult                       createXcbSurfaceKHR                                                             (VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
-virtual VkBool32                       getPhysicalDeviceXcbPresentationSupportKHR              (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XcbConnectionPtr connection, pt::XcbVisualid visual_id) const;
-virtual VkResult                       createWaylandSurfaceKHR                                                 (VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
-virtual VkBool32                       getPhysicalDeviceWaylandPresentationSupportKHR  (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::WaylandDisplayPtr display) const;
-virtual VkResult                       createMirSurfaceKHR                                                             (VkInstance instance, const VkMirSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
-virtual VkBool32                       getPhysicalDeviceMirPresentationSupportKHR              (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::MirConnectionPtr connection) const;
-virtual VkResult                       createAndroidSurfaceKHR                                                 (VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
-virtual VkResult                       createWin32SurfaceKHR                                                   (VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
-virtual VkBool32                       getPhysicalDeviceWin32PresentationSupportKHR    (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex) const;
-virtual VkResult                       createDebugReportCallbackEXT                                    (VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback) const;
-virtual void                           destroyDebugReportCallbackEXT                                   (VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator) const;
-virtual void                           debugReportMessageEXT                                                   (VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const;
+virtual void                           destroyInstance                                                                         (VkInstance instance, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult                       enumeratePhysicalDevices                                                        (VkInstance instance, deUint32* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices) const;
+virtual void                           getPhysicalDeviceFeatures                                                       (VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures) const;
+virtual void                           getPhysicalDeviceFormatProperties                                       (VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties) const;
+virtual VkResult                       getPhysicalDeviceImageFormatProperties                          (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties) const;
+virtual void                           getPhysicalDeviceProperties                                                     (VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties) const;
+virtual void                           getPhysicalDeviceQueueFamilyProperties                          (VkPhysicalDevice physicalDevice, deUint32* pQueueFamilyPropertyCount, VkQueueFamilyProperties* pQueueFamilyProperties) const;
+virtual void                           getPhysicalDeviceMemoryProperties                                       (VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties) const;
+virtual PFN_vkVoidFunction     getDeviceProcAddr                                                                       (VkDevice device, const char* pName) const;
+virtual VkResult                       createDevice                                                                            (VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice) const;
+virtual VkResult                       enumerateDeviceExtensionProperties                                      (VkPhysicalDevice physicalDevice, const char* pLayerName, deUint32* pPropertyCount, VkExtensionProperties* pProperties) const;
+virtual VkResult                       enumerateDeviceLayerProperties                                          (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkLayerProperties* pProperties) const;
+virtual void                           getPhysicalDeviceSparseImageFormatProperties            (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, deUint32* pPropertyCount, VkSparseImageFormatProperties* pProperties) const;
+virtual void                           destroySurfaceKHR                                                                       (VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator) const;
+virtual VkResult                       getPhysicalDeviceSurfaceSupportKHR                                      (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported) const;
+virtual VkResult                       getPhysicalDeviceSurfaceCapabilitiesKHR                         (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities) const;
+virtual VkResult                       getPhysicalDeviceSurfaceFormatsKHR                                      (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats) const;
+virtual VkResult                       getPhysicalDeviceSurfacePresentModesKHR                         (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pPresentModeCount, VkPresentModeKHR* pPresentModes) const;
+virtual VkResult                       getPhysicalDeviceDisplayPropertiesKHR                           (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPropertiesKHR* pProperties) const;
+virtual VkResult                       getPhysicalDeviceDisplayPlanePropertiesKHR                      (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPlanePropertiesKHR* pProperties) const;
+virtual VkResult                       getDisplayPlaneSupportedDisplaysKHR                                     (VkPhysicalDevice physicalDevice, deUint32 planeIndex, deUint32* pDisplayCount, VkDisplayKHR* pDisplays) const;
+virtual VkResult                       getDisplayModePropertiesKHR                                                     (VkPhysicalDevice physicalDevice, VkDisplayKHR display, deUint32* pPropertyCount, VkDisplayModePropertiesKHR* pProperties) const;
+virtual VkResult                       createDisplayModeKHR                                                            (VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode) const;
+virtual VkResult                       getDisplayPlaneCapabilitiesKHR                                          (VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, deUint32 planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities) const;
+virtual VkResult                       createDisplayPlaneSurfaceKHR                                            (VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
+virtual VkResult                       createXlibSurfaceKHR                                                            (VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
+virtual VkBool32                       getPhysicalDeviceXlibPresentationSupportKHR                     (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XlibDisplayPtr dpy, pt::XlibVisualID visualID) const;
+virtual VkResult                       createXcbSurfaceKHR                                                                     (VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
+virtual VkBool32                       getPhysicalDeviceXcbPresentationSupportKHR                      (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XcbConnectionPtr connection, pt::XcbVisualid visual_id) const;
+virtual VkResult                       createWaylandSurfaceKHR                                                         (VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
+virtual VkBool32                       getPhysicalDeviceWaylandPresentationSupportKHR          (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::WaylandDisplayPtr display) const;
+virtual VkResult                       createMirSurfaceKHR                                                                     (VkInstance instance, const VkMirSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
+virtual VkBool32                       getPhysicalDeviceMirPresentationSupportKHR                      (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::MirConnectionPtr connection) const;
+virtual VkResult                       createAndroidSurfaceKHR                                                         (VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
+virtual VkResult                       createWin32SurfaceKHR                                                           (VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const;
+virtual VkBool32                       getPhysicalDeviceWin32PresentationSupportKHR            (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex) const;
+virtual VkResult                       createDebugReportCallbackEXT                                            (VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback) const;
+virtual void                           destroyDebugReportCallbackEXT                                           (VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator) const;
+virtual void                           debugReportMessageEXT                                                           (VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const;
+virtual VkResult                       getPhysicalDeviceExternalImageFormatPropertiesNV        (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties) const;
index 60a8295..cb46b0e 100644 (file)
@@ -93,6 +93,8 @@ private:
 
 #include "vkBasicTypes.inl"
 
+#define VK_CORE_FORMAT_LAST            ((vk::VkFormat)(vk::VK_FORMAT_ASTC_12x12_SRGB_BLOCK+1))
+
 namespace wsi
 {
 
index 30df516..6b2cecf 100644 (file)
@@ -656,3 +656,18 @@ void DeviceDriver::cmdDebugMarkerInsertEXT (VkCommandBuffer commandBuffer, VkDeb
 {
        m_vk.cmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
 }
+
+void DeviceDriver::cmdDrawIndirectCountAMD (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const
+{
+       m_vk.cmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+}
+
+void DeviceDriver::cmdDrawIndexedIndirectCountAMD (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const
+{
+       m_vk.cmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+}
+
+VkResult DeviceDriver::getMemoryWin32HandleNV (VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle) const
+{
+       return m_vk.getMemoryWin32HandleNV(device, memory, handleType, pHandle);
+}
index 5b0aa9e..f9646c9 100644 (file)
@@ -132,3 +132,6 @@ DebugMarkerSetObjectNameEXTFunc                     debugMarkerSetObjectNameEXT;
 CmdDebugMarkerBeginEXTFunc                             cmdDebugMarkerBeginEXT;
 CmdDebugMarkerEndEXTFunc                               cmdDebugMarkerEndEXT;
 CmdDebugMarkerInsertEXTFunc                            cmdDebugMarkerInsertEXT;
+CmdDrawIndirectCountAMDFunc                            cmdDrawIndirectCountAMD;
+CmdDrawIndexedIndirectCountAMDFunc             cmdDrawIndexedIndirectCountAMD;
+GetMemoryWin32HandleNVFunc                             getMemoryWin32HandleNV;
index ef4c55b..cc2064e 100644 (file)
@@ -175,3 +175,7 @@ typedef VKAPI_ATTR VkResult                         (VKAPI_CALL* DebugMarkerSetObjectNameEXTFunc)
 typedef VKAPI_ATTR void                                        (VKAPI_CALL* CmdDebugMarkerBeginEXTFunc)                                                        (VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo);
 typedef VKAPI_ATTR void                                        (VKAPI_CALL* CmdDebugMarkerEndEXTFunc)                                                          (VkCommandBuffer commandBuffer);
 typedef VKAPI_ATTR void                                        (VKAPI_CALL* CmdDebugMarkerInsertEXTFunc)                                                       (VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo);
+typedef VKAPI_ATTR void                                        (VKAPI_CALL* CmdDrawIndirectCountAMDFunc)                                                       (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride);
+typedef VKAPI_ATTR void                                        (VKAPI_CALL* CmdDrawIndexedIndirectCountAMDFunc)                                        (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride);
+typedef VKAPI_ATTR VkResult                            (VKAPI_CALL* GetPhysicalDeviceExternalImageFormatPropertiesNVFunc)      (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties);
+typedef VKAPI_ATTR VkResult                            (VKAPI_CALL* GetMemoryWin32HandleNVFunc)                                                        (VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle);
index c115775..d415f3d 100644 (file)
@@ -83,7 +83,7 @@ bool isSrgbFormat (VkFormat format)
 bool isCompressedFormat (VkFormat format)
 {
        // update this mapping if VkFormat changes
-       DE_STATIC_ASSERT(VK_FORMAT_LAST == 185);
+       DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
 
        switch (format)
        {
@@ -141,6 +141,14 @@ bool isCompressedFormat (VkFormat format)
                case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
                case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
                case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
+               case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
+               case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
+               case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
+               case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
+               case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
+               case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
+               case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
+               case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
                        return true;
 
                default:
@@ -157,7 +165,7 @@ VkFormat mapTextureFormat (const tcu::TextureFormat& format)
 #define FMT_CASE(ORDER, TYPE) PACK_FMT(tcu::TextureFormat::ORDER, tcu::TextureFormat::TYPE)
 
        // update this mapping if VkFormat changes
-       DE_STATIC_ASSERT(VK_FORMAT_LAST == 185);
+       DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
 
        switch (PACK_FMT(format.order, format.type))
        {
@@ -289,7 +297,7 @@ tcu::TextureFormat mapVkFormat (VkFormat format)
        using tcu::TextureFormat;
 
        // update this mapping if VkFormat changes
-       DE_STATIC_ASSERT(VK_FORMAT_LAST == 185);
+       DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
 
        switch (format)
        {
@@ -455,7 +463,7 @@ tcu::TextureFormat mapVkFormat (VkFormat format)
 tcu::CompressedTexFormat mapVkCompressedFormat (VkFormat format)
 {
        // update this mapping if VkFormat changes
-       DE_STATIC_ASSERT(VK_FORMAT_LAST == 185);
+       DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
 
        switch (format)
        {
@@ -507,7 +515,7 @@ tcu::CompressedTexFormat mapVkCompressedFormat (VkFormat format)
 static bool isScaledFormat (VkFormat format)
 {
        // update this mapping if VkFormat changes
-       DE_STATIC_ASSERT(VK_FORMAT_LAST == 185);
+       DE_STATIC_ASSERT(VK_CORE_FORMAT_LAST == 185);
 
        switch (format)
        {
@@ -593,7 +601,7 @@ static bool fullTextureFormatRoundTripSupported (VkFormat format)
 
 void imageUtilSelfTest (void)
 {
-       for (int formatNdx = 0; formatNdx < VK_FORMAT_LAST; formatNdx++)
+       for (int formatNdx = 0; formatNdx < VK_CORE_FORMAT_LAST; formatNdx++)
        {
                const VkFormat  format  = (VkFormat)formatNdx;
 
@@ -726,7 +734,7 @@ static VkBorderColor mapBorderColor (tcu::TextureChannelClass channelClass, cons
        return VK_BORDER_COLOR_LAST;
 }
 
-VkSamplerCreateInfo mapSampler (const tcu::Sampler& sampler, const tcu::TextureFormat& format)
+VkSamplerCreateInfo mapSampler (const tcu::Sampler& sampler, const tcu::TextureFormat& format, float minLod, float maxLod)
 {
        const bool                                      compareEnabled  = (sampler.compare != tcu::Sampler::COMPAREMODE_NONE);
        const VkCompareOp                       compareOp               = (compareEnabled) ? (mapCompareMode(sampler.compare)) : (VK_COMPARE_OP_ALWAYS);
@@ -749,8 +757,8 @@ VkSamplerCreateInfo mapSampler (const tcu::Sampler& sampler, const tcu::TextureF
                1.0f,                                                                                                           // maxAnisotropy
                (VkBool32)(compareEnabled ? VK_TRUE : VK_FALSE),                        // compareEnable
                compareOp,                                                                                                      // compareOp
-               0.0f,                                                                                                           // minLod
-               (isMipmapEnabled ? 1000.0f : 0.25f),                                            // maxLod
+               (isMipmapEnabled ? minLod : 0.0f),                                                      // minLod
+               (isMipmapEnabled ? maxLod : 0.25f),                                                     // maxLod
                borderColor,                                                                                            // borderColor
                (VkBool32)(sampler.normalizedCoords ? VK_FALSE : VK_TRUE),      // unnormalizedCoords
        };
index b2f02ec..52b7ea5 100644 (file)
@@ -59,7 +59,7 @@ VkSamplerMipmapMode                   mapMipmapMode                           (tcu::Sampler::FilterMode filterMode);
 VkSamplerAddressMode           mapWrapMode                                     (tcu::Sampler::WrapMode wrapMode);
 VkCompareOp                                    mapCompareMode                          (tcu::Sampler::CompareMode mode);
 VkFormat                                       mapTextureFormat                        (const tcu::TextureFormat& format);
-VkSamplerCreateInfo                    mapSampler                                      (const tcu::Sampler& sampler, const tcu::TextureFormat& format);
+VkSamplerCreateInfo                    mapSampler                                      (const tcu::Sampler& sampler, const tcu::TextureFormat& format, float minLod = 0.0f, float maxLod = 1000.0f);
 
 void                                           imageUtilSelfTest                       (void);
 
index 167fa16..b1dfc69 100644 (file)
@@ -132,3 +132,6 @@ m_vk.debugMarkerSetObjectNameEXT            = (DebugMarkerSetObjectNameEXTFunc)                     GET_PROC
 m_vk.cmdDebugMarkerBeginEXT                            = (CmdDebugMarkerBeginEXTFunc)                          GET_PROC_ADDR("vkCmdDebugMarkerBeginEXT");
 m_vk.cmdDebugMarkerEndEXT                              = (CmdDebugMarkerEndEXTFunc)                            GET_PROC_ADDR("vkCmdDebugMarkerEndEXT");
 m_vk.cmdDebugMarkerInsertEXT                   = (CmdDebugMarkerInsertEXTFunc)                         GET_PROC_ADDR("vkCmdDebugMarkerInsertEXT");
+m_vk.cmdDrawIndirectCountAMD                   = (CmdDrawIndirectCountAMDFunc)                         GET_PROC_ADDR("vkCmdDrawIndirectCountAMD");
+m_vk.cmdDrawIndexedIndirectCountAMD            = (CmdDrawIndexedIndirectCountAMDFunc)          GET_PROC_ADDR("vkCmdDrawIndexedIndirectCountAMD");
+m_vk.getMemoryWin32HandleNV                            = (GetMemoryWin32HandleNVFunc)                          GET_PROC_ADDR("vkGetMemoryWin32HandleNV");
index 01aff27..b744aeb 100644 (file)
@@ -1,42 +1,43 @@
 /* WARNING: This is auto-generated file. Do not modify, since changes will
  * be lost! Modify the generating script instead.
  */
-m_vk.destroyInstance                                                           = (DestroyInstanceFunc)                                                                 GET_PROC_ADDR("vkDestroyInstance");
-m_vk.enumeratePhysicalDevices                                          = (EnumeratePhysicalDevicesFunc)                                                GET_PROC_ADDR("vkEnumeratePhysicalDevices");
-m_vk.getPhysicalDeviceFeatures                                         = (GetPhysicalDeviceFeaturesFunc)                                               GET_PROC_ADDR("vkGetPhysicalDeviceFeatures");
-m_vk.getPhysicalDeviceFormatProperties                         = (GetPhysicalDeviceFormatPropertiesFunc)                               GET_PROC_ADDR("vkGetPhysicalDeviceFormatProperties");
-m_vk.getPhysicalDeviceImageFormatProperties                    = (GetPhysicalDeviceImageFormatPropertiesFunc)                  GET_PROC_ADDR("vkGetPhysicalDeviceImageFormatProperties");
-m_vk.getPhysicalDeviceProperties                                       = (GetPhysicalDevicePropertiesFunc)                                             GET_PROC_ADDR("vkGetPhysicalDeviceProperties");
-m_vk.getPhysicalDeviceQueueFamilyProperties                    = (GetPhysicalDeviceQueueFamilyPropertiesFunc)                  GET_PROC_ADDR("vkGetPhysicalDeviceQueueFamilyProperties");
-m_vk.getPhysicalDeviceMemoryProperties                         = (GetPhysicalDeviceMemoryPropertiesFunc)                               GET_PROC_ADDR("vkGetPhysicalDeviceMemoryProperties");
-m_vk.getDeviceProcAddr                                                         = (GetDeviceProcAddrFunc)                                                               GET_PROC_ADDR("vkGetDeviceProcAddr");
-m_vk.createDevice                                                                      = (CreateDeviceFunc)                                                                    GET_PROC_ADDR("vkCreateDevice");
-m_vk.enumerateDeviceExtensionProperties                                = (EnumerateDeviceExtensionPropertiesFunc)                              GET_PROC_ADDR("vkEnumerateDeviceExtensionProperties");
-m_vk.enumerateDeviceLayerProperties                                    = (EnumerateDeviceLayerPropertiesFunc)                                  GET_PROC_ADDR("vkEnumerateDeviceLayerProperties");
-m_vk.getPhysicalDeviceSparseImageFormatProperties      = (GetPhysicalDeviceSparseImageFormatPropertiesFunc)    GET_PROC_ADDR("vkGetPhysicalDeviceSparseImageFormatProperties");
-m_vk.destroySurfaceKHR                                                         = (DestroySurfaceKHRFunc)                                                               GET_PROC_ADDR("vkDestroySurfaceKHR");
-m_vk.getPhysicalDeviceSurfaceSupportKHR                                = (GetPhysicalDeviceSurfaceSupportKHRFunc)                              GET_PROC_ADDR("vkGetPhysicalDeviceSurfaceSupportKHR");
-m_vk.getPhysicalDeviceSurfaceCapabilitiesKHR           = (GetPhysicalDeviceSurfaceCapabilitiesKHRFunc)                 GET_PROC_ADDR("vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
-m_vk.getPhysicalDeviceSurfaceFormatsKHR                                = (GetPhysicalDeviceSurfaceFormatsKHRFunc)                              GET_PROC_ADDR("vkGetPhysicalDeviceSurfaceFormatsKHR");
-m_vk.getPhysicalDeviceSurfacePresentModesKHR           = (GetPhysicalDeviceSurfacePresentModesKHRFunc)                 GET_PROC_ADDR("vkGetPhysicalDeviceSurfacePresentModesKHR");
-m_vk.getPhysicalDeviceDisplayPropertiesKHR                     = (GetPhysicalDeviceDisplayPropertiesKHRFunc)                   GET_PROC_ADDR("vkGetPhysicalDeviceDisplayPropertiesKHR");
-m_vk.getPhysicalDeviceDisplayPlanePropertiesKHR                = (GetPhysicalDeviceDisplayPlanePropertiesKHRFunc)              GET_PROC_ADDR("vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
-m_vk.getDisplayPlaneSupportedDisplaysKHR                       = (GetDisplayPlaneSupportedDisplaysKHRFunc)                             GET_PROC_ADDR("vkGetDisplayPlaneSupportedDisplaysKHR");
-m_vk.getDisplayModePropertiesKHR                                       = (GetDisplayModePropertiesKHRFunc)                                             GET_PROC_ADDR("vkGetDisplayModePropertiesKHR");
-m_vk.createDisplayModeKHR                                                      = (CreateDisplayModeKHRFunc)                                                    GET_PROC_ADDR("vkCreateDisplayModeKHR");
-m_vk.getDisplayPlaneCapabilitiesKHR                                    = (GetDisplayPlaneCapabilitiesKHRFunc)                                  GET_PROC_ADDR("vkGetDisplayPlaneCapabilitiesKHR");
-m_vk.createDisplayPlaneSurfaceKHR                                      = (CreateDisplayPlaneSurfaceKHRFunc)                                    GET_PROC_ADDR("vkCreateDisplayPlaneSurfaceKHR");
-m_vk.createXlibSurfaceKHR                                                      = (CreateXlibSurfaceKHRFunc)                                                    GET_PROC_ADDR("vkCreateXlibSurfaceKHR");
-m_vk.getPhysicalDeviceXlibPresentationSupportKHR       = (GetPhysicalDeviceXlibPresentationSupportKHRFunc)             GET_PROC_ADDR("vkGetPhysicalDeviceXlibPresentationSupportKHR");
-m_vk.createXcbSurfaceKHR                                                       = (CreateXcbSurfaceKHRFunc)                                                             GET_PROC_ADDR("vkCreateXcbSurfaceKHR");
-m_vk.getPhysicalDeviceXcbPresentationSupportKHR                = (GetPhysicalDeviceXcbPresentationSupportKHRFunc)              GET_PROC_ADDR("vkGetPhysicalDeviceXcbPresentationSupportKHR");
-m_vk.createWaylandSurfaceKHR                                           = (CreateWaylandSurfaceKHRFunc)                                                 GET_PROC_ADDR("vkCreateWaylandSurfaceKHR");
-m_vk.getPhysicalDeviceWaylandPresentationSupportKHR    = (GetPhysicalDeviceWaylandPresentationSupportKHRFunc)  GET_PROC_ADDR("vkGetPhysicalDeviceWaylandPresentationSupportKHR");
-m_vk.createMirSurfaceKHR                                                       = (CreateMirSurfaceKHRFunc)                                                             GET_PROC_ADDR("vkCreateMirSurfaceKHR");
-m_vk.getPhysicalDeviceMirPresentationSupportKHR                = (GetPhysicalDeviceMirPresentationSupportKHRFunc)              GET_PROC_ADDR("vkGetPhysicalDeviceMirPresentationSupportKHR");
-m_vk.createAndroidSurfaceKHR                                           = (CreateAndroidSurfaceKHRFunc)                                                 GET_PROC_ADDR("vkCreateAndroidSurfaceKHR");
-m_vk.createWin32SurfaceKHR                                                     = (CreateWin32SurfaceKHRFunc)                                                   GET_PROC_ADDR("vkCreateWin32SurfaceKHR");
-m_vk.getPhysicalDeviceWin32PresentationSupportKHR      = (GetPhysicalDeviceWin32PresentationSupportKHRFunc)    GET_PROC_ADDR("vkGetPhysicalDeviceWin32PresentationSupportKHR");
-m_vk.createDebugReportCallbackEXT                                      = (CreateDebugReportCallbackEXTFunc)                                    GET_PROC_ADDR("vkCreateDebugReportCallbackEXT");
-m_vk.destroyDebugReportCallbackEXT                                     = (DestroyDebugReportCallbackEXTFunc)                                   GET_PROC_ADDR("vkDestroyDebugReportCallbackEXT");
-m_vk.debugReportMessageEXT                                                     = (DebugReportMessageEXTFunc)                                                   GET_PROC_ADDR("vkDebugReportMessageEXT");
+m_vk.destroyInstance                                                                   = (DestroyInstanceFunc)                                                                         GET_PROC_ADDR("vkDestroyInstance");
+m_vk.enumeratePhysicalDevices                                                  = (EnumeratePhysicalDevicesFunc)                                                        GET_PROC_ADDR("vkEnumeratePhysicalDevices");
+m_vk.getPhysicalDeviceFeatures                                                 = (GetPhysicalDeviceFeaturesFunc)                                                       GET_PROC_ADDR("vkGetPhysicalDeviceFeatures");
+m_vk.getPhysicalDeviceFormatProperties                                 = (GetPhysicalDeviceFormatPropertiesFunc)                                       GET_PROC_ADDR("vkGetPhysicalDeviceFormatProperties");
+m_vk.getPhysicalDeviceImageFormatProperties                            = (GetPhysicalDeviceImageFormatPropertiesFunc)                          GET_PROC_ADDR("vkGetPhysicalDeviceImageFormatProperties");
+m_vk.getPhysicalDeviceProperties                                               = (GetPhysicalDevicePropertiesFunc)                                                     GET_PROC_ADDR("vkGetPhysicalDeviceProperties");
+m_vk.getPhysicalDeviceQueueFamilyProperties                            = (GetPhysicalDeviceQueueFamilyPropertiesFunc)                          GET_PROC_ADDR("vkGetPhysicalDeviceQueueFamilyProperties");
+m_vk.getPhysicalDeviceMemoryProperties                                 = (GetPhysicalDeviceMemoryPropertiesFunc)                                       GET_PROC_ADDR("vkGetPhysicalDeviceMemoryProperties");
+m_vk.getDeviceProcAddr                                                                 = (GetDeviceProcAddrFunc)                                                                       GET_PROC_ADDR("vkGetDeviceProcAddr");
+m_vk.createDevice                                                                              = (CreateDeviceFunc)                                                                            GET_PROC_ADDR("vkCreateDevice");
+m_vk.enumerateDeviceExtensionProperties                                        = (EnumerateDeviceExtensionPropertiesFunc)                                      GET_PROC_ADDR("vkEnumerateDeviceExtensionProperties");
+m_vk.enumerateDeviceLayerProperties                                            = (EnumerateDeviceLayerPropertiesFunc)                                          GET_PROC_ADDR("vkEnumerateDeviceLayerProperties");
+m_vk.getPhysicalDeviceSparseImageFormatProperties              = (GetPhysicalDeviceSparseImageFormatPropertiesFunc)            GET_PROC_ADDR("vkGetPhysicalDeviceSparseImageFormatProperties");
+m_vk.destroySurfaceKHR                                                                 = (DestroySurfaceKHRFunc)                                                                       GET_PROC_ADDR("vkDestroySurfaceKHR");
+m_vk.getPhysicalDeviceSurfaceSupportKHR                                        = (GetPhysicalDeviceSurfaceSupportKHRFunc)                                      GET_PROC_ADDR("vkGetPhysicalDeviceSurfaceSupportKHR");
+m_vk.getPhysicalDeviceSurfaceCapabilitiesKHR                   = (GetPhysicalDeviceSurfaceCapabilitiesKHRFunc)                         GET_PROC_ADDR("vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
+m_vk.getPhysicalDeviceSurfaceFormatsKHR                                        = (GetPhysicalDeviceSurfaceFormatsKHRFunc)                                      GET_PROC_ADDR("vkGetPhysicalDeviceSurfaceFormatsKHR");
+m_vk.getPhysicalDeviceSurfacePresentModesKHR                   = (GetPhysicalDeviceSurfacePresentModesKHRFunc)                         GET_PROC_ADDR("vkGetPhysicalDeviceSurfacePresentModesKHR");
+m_vk.getPhysicalDeviceDisplayPropertiesKHR                             = (GetPhysicalDeviceDisplayPropertiesKHRFunc)                           GET_PROC_ADDR("vkGetPhysicalDeviceDisplayPropertiesKHR");
+m_vk.getPhysicalDeviceDisplayPlanePropertiesKHR                        = (GetPhysicalDeviceDisplayPlanePropertiesKHRFunc)                      GET_PROC_ADDR("vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
+m_vk.getDisplayPlaneSupportedDisplaysKHR                               = (GetDisplayPlaneSupportedDisplaysKHRFunc)                                     GET_PROC_ADDR("vkGetDisplayPlaneSupportedDisplaysKHR");
+m_vk.getDisplayModePropertiesKHR                                               = (GetDisplayModePropertiesKHRFunc)                                                     GET_PROC_ADDR("vkGetDisplayModePropertiesKHR");
+m_vk.createDisplayModeKHR                                                              = (CreateDisplayModeKHRFunc)                                                            GET_PROC_ADDR("vkCreateDisplayModeKHR");
+m_vk.getDisplayPlaneCapabilitiesKHR                                            = (GetDisplayPlaneCapabilitiesKHRFunc)                                          GET_PROC_ADDR("vkGetDisplayPlaneCapabilitiesKHR");
+m_vk.createDisplayPlaneSurfaceKHR                                              = (CreateDisplayPlaneSurfaceKHRFunc)                                            GET_PROC_ADDR("vkCreateDisplayPlaneSurfaceKHR");
+m_vk.createXlibSurfaceKHR                                                              = (CreateXlibSurfaceKHRFunc)                                                            GET_PROC_ADDR("vkCreateXlibSurfaceKHR");
+m_vk.getPhysicalDeviceXlibPresentationSupportKHR               = (GetPhysicalDeviceXlibPresentationSupportKHRFunc)                     GET_PROC_ADDR("vkGetPhysicalDeviceXlibPresentationSupportKHR");
+m_vk.createXcbSurfaceKHR                                                               = (CreateXcbSurfaceKHRFunc)                                                                     GET_PROC_ADDR("vkCreateXcbSurfaceKHR");
+m_vk.getPhysicalDeviceXcbPresentationSupportKHR                        = (GetPhysicalDeviceXcbPresentationSupportKHRFunc)                      GET_PROC_ADDR("vkGetPhysicalDeviceXcbPresentationSupportKHR");
+m_vk.createWaylandSurfaceKHR                                                   = (CreateWaylandSurfaceKHRFunc)                                                         GET_PROC_ADDR("vkCreateWaylandSurfaceKHR");
+m_vk.getPhysicalDeviceWaylandPresentationSupportKHR            = (GetPhysicalDeviceWaylandPresentationSupportKHRFunc)          GET_PROC_ADDR("vkGetPhysicalDeviceWaylandPresentationSupportKHR");
+m_vk.createMirSurfaceKHR                                                               = (CreateMirSurfaceKHRFunc)                                                                     GET_PROC_ADDR("vkCreateMirSurfaceKHR");
+m_vk.getPhysicalDeviceMirPresentationSupportKHR                        = (GetPhysicalDeviceMirPresentationSupportKHRFunc)                      GET_PROC_ADDR("vkGetPhysicalDeviceMirPresentationSupportKHR");
+m_vk.createAndroidSurfaceKHR                                                   = (CreateAndroidSurfaceKHRFunc)                                                         GET_PROC_ADDR("vkCreateAndroidSurfaceKHR");
+m_vk.createWin32SurfaceKHR                                                             = (CreateWin32SurfaceKHRFunc)                                                           GET_PROC_ADDR("vkCreateWin32SurfaceKHR");
+m_vk.getPhysicalDeviceWin32PresentationSupportKHR              = (GetPhysicalDeviceWin32PresentationSupportKHRFunc)            GET_PROC_ADDR("vkGetPhysicalDeviceWin32PresentationSupportKHR");
+m_vk.createDebugReportCallbackEXT                                              = (CreateDebugReportCallbackEXTFunc)                                            GET_PROC_ADDR("vkCreateDebugReportCallbackEXT");
+m_vk.destroyDebugReportCallbackEXT                                             = (DestroyDebugReportCallbackEXTFunc)                                           GET_PROC_ADDR("vkDestroyDebugReportCallbackEXT");
+m_vk.debugReportMessageEXT                                                             = (DebugReportMessageEXTFunc)                                                           GET_PROC_ADDR("vkDebugReportMessageEXT");
+m_vk.getPhysicalDeviceExternalImageFormatPropertiesNV  = (GetPhysicalDeviceExternalImageFormatPropertiesNVFunc)        GET_PROC_ADDR("vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
index f0b6d5b..764a2d6 100644 (file)
@@ -196,3 +196,8 @@ void InstanceDriver::debugReportMessageEXT (VkInstance instance, VkDebugReportFl
 {
        m_vk.debugReportMessageEXT(instance, flags, objectType, object, location, messageCode, pLayerPrefix, pMessage);
 }
+
+VkResult InstanceDriver::getPhysicalDeviceExternalImageFormatPropertiesNV (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties) const
+{
+       return m_vk.getPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
+}
index 2a6be31..4ae3bd3 100644 (file)
@@ -1,42 +1,43 @@
 /* WARNING: This is auto-generated file. Do not modify, since changes will
  * be lost! Modify the generating script instead.
  */
-DestroyInstanceFunc                                                                    destroyInstance;
-EnumeratePhysicalDevicesFunc                                           enumeratePhysicalDevices;
-GetPhysicalDeviceFeaturesFunc                                          getPhysicalDeviceFeatures;
-GetPhysicalDeviceFormatPropertiesFunc                          getPhysicalDeviceFormatProperties;
-GetPhysicalDeviceImageFormatPropertiesFunc                     getPhysicalDeviceImageFormatProperties;
-GetPhysicalDevicePropertiesFunc                                                getPhysicalDeviceProperties;
-GetPhysicalDeviceQueueFamilyPropertiesFunc                     getPhysicalDeviceQueueFamilyProperties;
-GetPhysicalDeviceMemoryPropertiesFunc                          getPhysicalDeviceMemoryProperties;
-GetDeviceProcAddrFunc                                                          getDeviceProcAddr;
-CreateDeviceFunc                                                                       createDevice;
-EnumerateDeviceExtensionPropertiesFunc                         enumerateDeviceExtensionProperties;
-EnumerateDeviceLayerPropertiesFunc                                     enumerateDeviceLayerProperties;
-GetPhysicalDeviceSparseImageFormatPropertiesFunc       getPhysicalDeviceSparseImageFormatProperties;
-DestroySurfaceKHRFunc                                                          destroySurfaceKHR;
-GetPhysicalDeviceSurfaceSupportKHRFunc                         getPhysicalDeviceSurfaceSupportKHR;
-GetPhysicalDeviceSurfaceCapabilitiesKHRFunc                    getPhysicalDeviceSurfaceCapabilitiesKHR;
-GetPhysicalDeviceSurfaceFormatsKHRFunc                         getPhysicalDeviceSurfaceFormatsKHR;
-GetPhysicalDeviceSurfacePresentModesKHRFunc                    getPhysicalDeviceSurfacePresentModesKHR;
-GetPhysicalDeviceDisplayPropertiesKHRFunc                      getPhysicalDeviceDisplayPropertiesKHR;
-GetPhysicalDeviceDisplayPlanePropertiesKHRFunc         getPhysicalDeviceDisplayPlanePropertiesKHR;
-GetDisplayPlaneSupportedDisplaysKHRFunc                                getDisplayPlaneSupportedDisplaysKHR;
-GetDisplayModePropertiesKHRFunc                                                getDisplayModePropertiesKHR;
-CreateDisplayModeKHRFunc                                                       createDisplayModeKHR;
-GetDisplayPlaneCapabilitiesKHRFunc                                     getDisplayPlaneCapabilitiesKHR;
-CreateDisplayPlaneSurfaceKHRFunc                                       createDisplayPlaneSurfaceKHR;
-CreateXlibSurfaceKHRFunc                                                       createXlibSurfaceKHR;
-GetPhysicalDeviceXlibPresentationSupportKHRFunc                getPhysicalDeviceXlibPresentationSupportKHR;
-CreateXcbSurfaceKHRFunc                                                                createXcbSurfaceKHR;
-GetPhysicalDeviceXcbPresentationSupportKHRFunc         getPhysicalDeviceXcbPresentationSupportKHR;
-CreateWaylandSurfaceKHRFunc                                                    createWaylandSurfaceKHR;
-GetPhysicalDeviceWaylandPresentationSupportKHRFunc     getPhysicalDeviceWaylandPresentationSupportKHR;
-CreateMirSurfaceKHRFunc                                                                createMirSurfaceKHR;
-GetPhysicalDeviceMirPresentationSupportKHRFunc         getPhysicalDeviceMirPresentationSupportKHR;
-CreateAndroidSurfaceKHRFunc                                                    createAndroidSurfaceKHR;
-CreateWin32SurfaceKHRFunc                                                      createWin32SurfaceKHR;
-GetPhysicalDeviceWin32PresentationSupportKHRFunc       getPhysicalDeviceWin32PresentationSupportKHR;
-CreateDebugReportCallbackEXTFunc                                       createDebugReportCallbackEXT;
-DestroyDebugReportCallbackEXTFunc                                      destroyDebugReportCallbackEXT;
-DebugReportMessageEXTFunc                                                      debugReportMessageEXT;
+DestroyInstanceFunc                                                                            destroyInstance;
+EnumeratePhysicalDevicesFunc                                                   enumeratePhysicalDevices;
+GetPhysicalDeviceFeaturesFunc                                                  getPhysicalDeviceFeatures;
+GetPhysicalDeviceFormatPropertiesFunc                                  getPhysicalDeviceFormatProperties;
+GetPhysicalDeviceImageFormatPropertiesFunc                             getPhysicalDeviceImageFormatProperties;
+GetPhysicalDevicePropertiesFunc                                                        getPhysicalDeviceProperties;
+GetPhysicalDeviceQueueFamilyPropertiesFunc                             getPhysicalDeviceQueueFamilyProperties;
+GetPhysicalDeviceMemoryPropertiesFunc                                  getPhysicalDeviceMemoryProperties;
+GetDeviceProcAddrFunc                                                                  getDeviceProcAddr;
+CreateDeviceFunc                                                                               createDevice;
+EnumerateDeviceExtensionPropertiesFunc                                 enumerateDeviceExtensionProperties;
+EnumerateDeviceLayerPropertiesFunc                                             enumerateDeviceLayerProperties;
+GetPhysicalDeviceSparseImageFormatPropertiesFunc               getPhysicalDeviceSparseImageFormatProperties;
+DestroySurfaceKHRFunc                                                                  destroySurfaceKHR;
+GetPhysicalDeviceSurfaceSupportKHRFunc                                 getPhysicalDeviceSurfaceSupportKHR;
+GetPhysicalDeviceSurfaceCapabilitiesKHRFunc                            getPhysicalDeviceSurfaceCapabilitiesKHR;
+GetPhysicalDeviceSurfaceFormatsKHRFunc                                 getPhysicalDeviceSurfaceFormatsKHR;
+GetPhysicalDeviceSurfacePresentModesKHRFunc                            getPhysicalDeviceSurfacePresentModesKHR;
+GetPhysicalDeviceDisplayPropertiesKHRFunc                              getPhysicalDeviceDisplayPropertiesKHR;
+GetPhysicalDeviceDisplayPlanePropertiesKHRFunc                 getPhysicalDeviceDisplayPlanePropertiesKHR;
+GetDisplayPlaneSupportedDisplaysKHRFunc                                        getDisplayPlaneSupportedDisplaysKHR;
+GetDisplayModePropertiesKHRFunc                                                        getDisplayModePropertiesKHR;
+CreateDisplayModeKHRFunc                                                               createDisplayModeKHR;
+GetDisplayPlaneCapabilitiesKHRFunc                                             getDisplayPlaneCapabilitiesKHR;
+CreateDisplayPlaneSurfaceKHRFunc                                               createDisplayPlaneSurfaceKHR;
+CreateXlibSurfaceKHRFunc                                                               createXlibSurfaceKHR;
+GetPhysicalDeviceXlibPresentationSupportKHRFunc                        getPhysicalDeviceXlibPresentationSupportKHR;
+CreateXcbSurfaceKHRFunc                                                                        createXcbSurfaceKHR;
+GetPhysicalDeviceXcbPresentationSupportKHRFunc                 getPhysicalDeviceXcbPresentationSupportKHR;
+CreateWaylandSurfaceKHRFunc                                                            createWaylandSurfaceKHR;
+GetPhysicalDeviceWaylandPresentationSupportKHRFunc             getPhysicalDeviceWaylandPresentationSupportKHR;
+CreateMirSurfaceKHRFunc                                                                        createMirSurfaceKHR;
+GetPhysicalDeviceMirPresentationSupportKHRFunc                 getPhysicalDeviceMirPresentationSupportKHR;
+CreateAndroidSurfaceKHRFunc                                                            createAndroidSurfaceKHR;
+CreateWin32SurfaceKHRFunc                                                              createWin32SurfaceKHR;
+GetPhysicalDeviceWin32PresentationSupportKHRFunc               getPhysicalDeviceWin32PresentationSupportKHR;
+CreateDebugReportCallbackEXTFunc                                               createDebugReportCallbackEXT;
+DestroyDebugReportCallbackEXTFunc                                              destroyDebugReportCallbackEXT;
+DebugReportMessageEXTFunc                                                              debugReportMessageEXT;
+GetPhysicalDeviceExternalImageFormatPropertiesNVFunc   getPhysicalDeviceExternalImageFormatPropertiesNV;
index 88252b5..da315e6 100644 (file)
@@ -1147,6 +1147,50 @@ VKAPI_ATTR void VKAPI_CALL cmdDebugMarkerInsertEXT (VkCommandBuffer commandBuffe
        DE_UNREF(pMarkerInfo);
 }
 
+VKAPI_ATTR void VKAPI_CALL cmdDrawIndirectCountAMD (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride)
+{
+       DE_UNREF(commandBuffer);
+       DE_UNREF(buffer);
+       DE_UNREF(offset);
+       DE_UNREF(countBuffer);
+       DE_UNREF(countBufferOffset);
+       DE_UNREF(maxDrawCount);
+       DE_UNREF(stride);
+}
+
+VKAPI_ATTR void VKAPI_CALL cmdDrawIndexedIndirectCountAMD (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride)
+{
+       DE_UNREF(commandBuffer);
+       DE_UNREF(buffer);
+       DE_UNREF(offset);
+       DE_UNREF(countBuffer);
+       DE_UNREF(countBufferOffset);
+       DE_UNREF(maxDrawCount);
+       DE_UNREF(stride);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDeviceExternalImageFormatPropertiesNV (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties)
+{
+       DE_UNREF(physicalDevice);
+       DE_UNREF(format);
+       DE_UNREF(type);
+       DE_UNREF(tiling);
+       DE_UNREF(usage);
+       DE_UNREF(flags);
+       DE_UNREF(externalHandleType);
+       DE_UNREF(pExternalImageFormatProperties);
+       return VK_SUCCESS;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL getMemoryWin32HandleNV (VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle)
+{
+       DE_UNREF(device);
+       DE_UNREF(memory);
+       DE_UNREF(handleType);
+       DE_UNREF(pHandle);
+       return VK_SUCCESS;
+}
+
 static const tcu::StaticFunctionLibrary::Entry s_platformFunctions[] =
 {
        VK_NULL_FUNC_ENTRY(vkCreateInstance,                                            createInstance),
@@ -1196,6 +1240,7 @@ static const tcu::StaticFunctionLibrary::Entry s_instanceFunctions[] =
        VK_NULL_FUNC_ENTRY(vkCreateDebugReportCallbackEXT,                                              createDebugReportCallbackEXT),
        VK_NULL_FUNC_ENTRY(vkDestroyDebugReportCallbackEXT,                                             destroyDebugReportCallbackEXT),
        VK_NULL_FUNC_ENTRY(vkDebugReportMessageEXT,                                                             debugReportMessageEXT),
+       VK_NULL_FUNC_ENTRY(vkGetPhysicalDeviceExternalImageFormatPropertiesNV,  getPhysicalDeviceExternalImageFormatPropertiesNV),
 };
 
 static const tcu::StaticFunctionLibrary::Entry s_deviceFunctions[] =
@@ -1331,5 +1376,8 @@ static const tcu::StaticFunctionLibrary::Entry s_deviceFunctions[] =
        VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerBeginEXT,                    cmdDebugMarkerBeginEXT),
        VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerEndEXT,                              cmdDebugMarkerEndEXT),
        VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerInsertEXT,                   cmdDebugMarkerInsertEXT),
+       VK_NULL_FUNC_ENTRY(vkCmdDrawIndirectCountAMD,                   cmdDrawIndirectCountAMD),
+       VK_NULL_FUNC_ENTRY(vkCmdDrawIndexedIndirectCountAMD,    cmdDrawIndexedIndirectCountAMD),
+       VK_NULL_FUNC_ENTRY(vkGetMemoryWin32HandleNV,                    getMemoryWin32HandleNV),
 };
 
index 4daa658..a555916 100644 (file)
@@ -158,6 +158,8 @@ tcu::Format::Bitfield<32>   getSurfaceTransformFlagsKHRStr                          (VkSurfaceTransformF
 tcu::Format::Bitfield<32>      getCompositeAlphaFlagsKHRStr                            (VkCompositeAlphaFlagsKHR value);
 tcu::Format::Bitfield<32>      getDisplayPlaneAlphaFlagsKHRStr                         (VkDisplayPlaneAlphaFlagsKHR value);
 tcu::Format::Bitfield<32>      getDebugReportFlagsEXTStr                                       (VkDebugReportFlagsEXT value);
+tcu::Format::Bitfield<32>      getExternalMemoryHandleTypeFlagsNVStr           (VkExternalMemoryHandleTypeFlagsNV value);
+tcu::Format::Bitfield<32>      getExternalMemoryFeatureFlagsNVStr                      (VkExternalMemoryFeatureFlagsNV value);
 tcu::Format::Bitfield<32>      getInstanceCreateFlagsStr                                       (VkInstanceCreateFlags value);
 tcu::Format::Bitfield<32>      getDeviceCreateFlagsStr                                         (VkDeviceCreateFlags value);
 tcu::Format::Bitfield<32>      getDeviceQueueCreateFlagsStr                            (VkDeviceQueueCreateFlags value);
@@ -329,3 +331,9 @@ std::ostream&       operator<<      (std::ostream& s, const VkDebugMarkerMarkerInfoEXT& val
 std::ostream&  operator<<      (std::ostream& s, const VkDedicatedAllocationImageCreateInfoNV& value);
 std::ostream&  operator<<      (std::ostream& s, const VkDedicatedAllocationBufferCreateInfoNV& value);
 std::ostream&  operator<<      (std::ostream& s, const VkDedicatedAllocationMemoryAllocateInfoNV& value);
+std::ostream&  operator<<      (std::ostream& s, const VkExternalImageFormatPropertiesNV& value);
+std::ostream&  operator<<      (std::ostream& s, const VkExternalMemoryImageCreateInfoNV& value);
+std::ostream&  operator<<      (std::ostream& s, const VkExportMemoryAllocateInfoNV& value);
+std::ostream&  operator<<      (std::ostream& s, const VkImportMemoryWin32HandleInfoNV& value);
+std::ostream&  operator<<      (std::ostream& s, const VkExportMemoryWin32HandleInfoNV& value);
+std::ostream&  operator<<      (std::ostream& s, const VkWin32KeyedMutexAcquireReleaseInfoNV& value);
index 9ecc101..c09f99a 100644 (file)
@@ -34,19 +34,21 @@ template<> const char*      getTypeName<VkDebugReportCallbackEXT>   (void) { return "Vk
 
 namespace pt
 {
-std::ostream& operator<< (std::ostream& s, XlibDisplayPtr                      v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, XlibWindow                          v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, XlibVisualID                                v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, XcbConnectionPtr                    v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, XcbWindow                           v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, XcbVisualid                         v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, WaylandDisplayPtr           v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, WaylandSurfacePtr           v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, MirConnectionPtr                    v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, MirSurfacePtr                       v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, AndroidNativeWindowPtr      v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, Win32InstanceHandle         v) { return s << tcu::toHex(v.internal); }
-std::ostream& operator<< (std::ostream& s, Win32WindowHandle           v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, XlibDisplayPtr                              v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, XlibWindow                                  v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, XlibVisualID                                        v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, XcbConnectionPtr                            v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, XcbWindow                                   v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, XcbVisualid                                 v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, WaylandDisplayPtr                   v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, WaylandSurfacePtr                   v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, MirConnectionPtr                            v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, MirSurfacePtr                               v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, AndroidNativeWindowPtr              v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, Win32InstanceHandle                 v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, Win32WindowHandle                   v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, Win32Handle                                 v) { return s << tcu::toHex(v.internal); }
+std::ostream& operator<< (std::ostream& s, Win32SecurityAttributesPtr  v) { return s << tcu::toHex(v.internal); }
 }
 
 const char* getPipelineCacheHeaderVersionName (VkPipelineCacheHeaderVersion value)
@@ -163,6 +165,11 @@ const char* getStructureTypeName (VkStructureType value)
                case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:                               return "VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV";
                case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:                              return "VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV";
                case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:                    return "VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV";
+               case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:                                    return "VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV";
+               case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:                                                  return "VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV";
+               case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:                                              return "VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV";
+               case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:                                              return "VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV";
+               case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:                               return "VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV";
                default:                                                                                                                                                return DE_NULL;
        }
 }
@@ -378,6 +385,14 @@ const char* getFormatName (VkFormat value)
                case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:           return "VK_FORMAT_ASTC_12x10_SRGB_BLOCK";
                case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:          return "VK_FORMAT_ASTC_12x12_UNORM_BLOCK";
                case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:           return "VK_FORMAT_ASTC_12x12_SRGB_BLOCK";
+               case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:     return "VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG";
+               case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:     return "VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG";
+               case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:     return "VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG";
+               case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:     return "VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG";
+               case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:      return "VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG";
+               case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:      return "VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG";
+               case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:      return "VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG";
+               case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:      return "VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG";
                default:                                                                        return DE_NULL;
        }
 }
@@ -1295,6 +1310,29 @@ tcu::Format::Bitfield<32> getDebugReportFlagsEXTStr (VkDebugReportFlagsEXT value
        return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
 }
 
+tcu::Format::Bitfield<32> getExternalMemoryHandleTypeFlagsNVStr (VkExternalMemoryHandleTypeFlagsNV value)
+{
+       static const tcu::Format::BitDesc s_desc[] =
+       {
+               tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV,                "VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV"),
+               tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV,    "VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV"),
+               tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV,                 "VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV"),
+               tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_KMT_BIT_NV,             "VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_KMT_BIT_NV"),
+       };
+       return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
+tcu::Format::Bitfield<32> getExternalMemoryFeatureFlagsNVStr (VkExternalMemoryFeatureFlagsNV value)
+{
+       static const tcu::Format::BitDesc s_desc[] =
+       {
+               tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV,  "VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV"),
+               tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV,              "VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV"),
+               tcu::Format::BitDesc(VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV,              "VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV"),
+       };
+       return tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));
+}
+
 tcu::Format::Bitfield<32> getInstanceCreateFlagsStr (VkInstanceCreateFlags value)
 {
        return tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);
@@ -3306,3 +3344,72 @@ std::ostream& operator<< (std::ostream& s, const VkDedicatedAllocationMemoryAllo
        s << '}';
        return s;
 }
+
+std::ostream& operator<< (std::ostream& s, const VkExternalImageFormatPropertiesNV& value)
+{
+       s << "VkExternalImageFormatPropertiesNV = {\n";
+       s << "\timageFormatProperties = " << value.imageFormatProperties << '\n';
+       s << "\texternalMemoryFeatures = " << getExternalMemoryFeatureFlagsNVStr(value.externalMemoryFeatures) << '\n';
+       s << "\texportFromImportedHandleTypes = " << getExternalMemoryHandleTypeFlagsNVStr(value.exportFromImportedHandleTypes) << '\n';
+       s << "\tcompatibleHandleTypes = " << getExternalMemoryHandleTypeFlagsNVStr(value.compatibleHandleTypes) << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkExternalMemoryImageCreateInfoNV& value)
+{
+       s << "VkExternalMemoryImageCreateInfoNV = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\thandleTypes = " << getExternalMemoryHandleTypeFlagsNVStr(value.handleTypes) << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkExportMemoryAllocateInfoNV& value)
+{
+       s << "VkExportMemoryAllocateInfoNV = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\thandleTypes = " << getExternalMemoryHandleTypeFlagsNVStr(value.handleTypes) << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkImportMemoryWin32HandleInfoNV& value)
+{
+       s << "VkImportMemoryWin32HandleInfoNV = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\thandleType = " << getExternalMemoryHandleTypeFlagsNVStr(value.handleType) << '\n';
+       s << "\thandle = " << value.handle << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkExportMemoryWin32HandleInfoNV& value)
+{
+       s << "VkExportMemoryWin32HandleInfoNV = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\tpAttributes = " << value.pAttributes << '\n';
+       s << "\tdwAccess = " << value.dwAccess << '\n';
+       s << '}';
+       return s;
+}
+
+std::ostream& operator<< (std::ostream& s, const VkWin32KeyedMutexAcquireReleaseInfoNV& value)
+{
+       s << "VkWin32KeyedMutexAcquireReleaseInfoNV = {\n";
+       s << "\tsType = " << value.sType << '\n';
+       s << "\tpNext = " << value.pNext << '\n';
+       s << "\tacquireCount = " << value.acquireCount << '\n';
+       s << "\tpAcquireSyncs = " << value.pAcquireSyncs << '\n';
+       s << "\tpAcquireKeys = " << value.pAcquireKeys << '\n';
+       s << "\tpAcquireTimeoutMilliseconds = " << value.pAcquireTimeoutMilliseconds << '\n';
+       s << "\treleaseCount = " << value.releaseCount << '\n';
+       s << "\tpReleaseSyncs = " << value.pReleaseSyncs << '\n';
+       s << "\tpReleaseKeys = " << value.pReleaseKeys << '\n';
+       s << '}';
+       return s;
+}
index 0e75b9a..2078df9 100644 (file)
@@ -1429,3 +1429,54 @@ struct VkDedicatedAllocationMemoryAllocateInfoNV
        VkBuffer                buffer;
 };
 
+struct VkExternalImageFormatPropertiesNV
+{
+       VkImageFormatProperties                         imageFormatProperties;
+       VkExternalMemoryFeatureFlagsNV          externalMemoryFeatures;
+       VkExternalMemoryHandleTypeFlagsNV       exportFromImportedHandleTypes;
+       VkExternalMemoryHandleTypeFlagsNV       compatibleHandleTypes;
+};
+
+struct VkExternalMemoryImageCreateInfoNV
+{
+       VkStructureType                                         sType;
+       const void*                                                     pNext;
+       VkExternalMemoryHandleTypeFlagsNV       handleTypes;
+};
+
+struct VkExportMemoryAllocateInfoNV
+{
+       VkStructureType                                         sType;
+       const void*                                                     pNext;
+       VkExternalMemoryHandleTypeFlagsNV       handleTypes;
+};
+
+struct VkImportMemoryWin32HandleInfoNV
+{
+       VkStructureType                                         sType;
+       const void*                                                     pNext;
+       VkExternalMemoryHandleTypeFlagsNV       handleType;
+       pt::Win32Handle                                         handle;
+};
+
+struct VkExportMemoryWin32HandleInfoNV
+{
+       VkStructureType                                 sType;
+       const void*                                             pNext;
+       pt::Win32SecurityAttributesPtr  pAttributes;
+       deUint32                                                dwAccess;
+};
+
+struct VkWin32KeyedMutexAcquireReleaseInfoNV
+{
+       VkStructureType                 sType;
+       const void*                             pNext;
+       deUint32                                acquireCount;
+       const VkDeviceMemory*   pAcquireSyncs;
+       const deUint64*                 pAcquireKeys;
+       const deUint32*                 pAcquireTimeoutMilliseconds;
+       deUint32                                releaseCount;
+       const VkDeviceMemory*   pReleaseSyncs;
+       const deUint64*                 pReleaseKeys;
+};
+
index deb9a9b..88c016a 100644 (file)
@@ -132,3 +132,6 @@ virtual VkResult    debugMarkerSetObjectNameEXT                     (VkDevice device, VkDebugMarkerOb
 virtual void           cmdDebugMarkerBeginEXT                          (VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const = 0;
 virtual void           cmdDebugMarkerEndEXT                            (VkCommandBuffer commandBuffer) const = 0;
 virtual void           cmdDebugMarkerInsertEXT                         (VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const = 0;
+virtual void           cmdDrawIndirectCountAMD                         (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0;
+virtual void           cmdDrawIndexedIndirectCountAMD          (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0;
+virtual VkResult       getMemoryWin32HandleNV                          (VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle) const = 0;
index 8fd7262..692ea7a 100644 (file)
@@ -1,42 +1,43 @@
 /* WARNING: This is auto-generated file. Do not modify, since changes will
  * be lost! Modify the generating script instead.
  */
-virtual void                           destroyInstance                                                                 (VkInstance instance, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult                       enumeratePhysicalDevices                                                (VkInstance instance, deUint32* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices) const = 0;
-virtual void                           getPhysicalDeviceFeatures                                               (VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures) const = 0;
-virtual void                           getPhysicalDeviceFormatProperties                               (VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties) const = 0;
-virtual VkResult                       getPhysicalDeviceImageFormatProperties                  (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties) const = 0;
-virtual void                           getPhysicalDeviceProperties                                             (VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties) const = 0;
-virtual void                           getPhysicalDeviceQueueFamilyProperties                  (VkPhysicalDevice physicalDevice, deUint32* pQueueFamilyPropertyCount, VkQueueFamilyProperties* pQueueFamilyProperties) const = 0;
-virtual void                           getPhysicalDeviceMemoryProperties                               (VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties) const = 0;
-virtual PFN_vkVoidFunction     getDeviceProcAddr                                                               (VkDevice device, const char* pName) const = 0;
-virtual VkResult                       createDevice                                                                    (VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice) const = 0;
-virtual VkResult                       enumerateDeviceExtensionProperties                              (VkPhysicalDevice physicalDevice, const char* pLayerName, deUint32* pPropertyCount, VkExtensionProperties* pProperties) const = 0;
-virtual VkResult                       enumerateDeviceLayerProperties                                  (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkLayerProperties* pProperties) const = 0;
-virtual void                           getPhysicalDeviceSparseImageFormatProperties    (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, deUint32* pPropertyCount, VkSparseImageFormatProperties* pProperties) const = 0;
-virtual void                           destroySurfaceKHR                                                               (VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual VkResult                       getPhysicalDeviceSurfaceSupportKHR                              (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported) const = 0;
-virtual VkResult                       getPhysicalDeviceSurfaceCapabilitiesKHR                 (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities) const = 0;
-virtual VkResult                       getPhysicalDeviceSurfaceFormatsKHR                              (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats) const = 0;
-virtual VkResult                       getPhysicalDeviceSurfacePresentModesKHR                 (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pPresentModeCount, VkPresentModeKHR* pPresentModes) const = 0;
-virtual VkResult                       getPhysicalDeviceDisplayPropertiesKHR                   (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPropertiesKHR* pProperties) const = 0;
-virtual VkResult                       getPhysicalDeviceDisplayPlanePropertiesKHR              (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPlanePropertiesKHR* pProperties) const = 0;
-virtual VkResult                       getDisplayPlaneSupportedDisplaysKHR                             (VkPhysicalDevice physicalDevice, deUint32 planeIndex, deUint32* pDisplayCount, VkDisplayKHR* pDisplays) const = 0;
-virtual VkResult                       getDisplayModePropertiesKHR                                             (VkPhysicalDevice physicalDevice, VkDisplayKHR display, deUint32* pPropertyCount, VkDisplayModePropertiesKHR* pProperties) const = 0;
-virtual VkResult                       createDisplayModeKHR                                                    (VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode) const = 0;
-virtual VkResult                       getDisplayPlaneCapabilitiesKHR                                  (VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, deUint32 planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities) const = 0;
-virtual VkResult                       createDisplayPlaneSurfaceKHR                                    (VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
-virtual VkResult                       createXlibSurfaceKHR                                                    (VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
-virtual VkBool32                       getPhysicalDeviceXlibPresentationSupportKHR             (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XlibDisplayPtr dpy, pt::XlibVisualID visualID) const = 0;
-virtual VkResult                       createXcbSurfaceKHR                                                             (VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
-virtual VkBool32                       getPhysicalDeviceXcbPresentationSupportKHR              (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XcbConnectionPtr connection, pt::XcbVisualid visual_id) const = 0;
-virtual VkResult                       createWaylandSurfaceKHR                                                 (VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
-virtual VkBool32                       getPhysicalDeviceWaylandPresentationSupportKHR  (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::WaylandDisplayPtr display) const = 0;
-virtual VkResult                       createMirSurfaceKHR                                                             (VkInstance instance, const VkMirSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
-virtual VkBool32                       getPhysicalDeviceMirPresentationSupportKHR              (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::MirConnectionPtr connection) const = 0;
-virtual VkResult                       createAndroidSurfaceKHR                                                 (VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
-virtual VkResult                       createWin32SurfaceKHR                                                   (VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
-virtual VkBool32                       getPhysicalDeviceWin32PresentationSupportKHR    (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex) const = 0;
-virtual VkResult                       createDebugReportCallbackEXT                                    (VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback) const = 0;
-virtual void                           destroyDebugReportCallbackEXT                                   (VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator) const = 0;
-virtual void                           debugReportMessageEXT                                                   (VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const = 0;
+virtual void                           destroyInstance                                                                         (VkInstance instance, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult                       enumeratePhysicalDevices                                                        (VkInstance instance, deUint32* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices) const = 0;
+virtual void                           getPhysicalDeviceFeatures                                                       (VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures) const = 0;
+virtual void                           getPhysicalDeviceFormatProperties                                       (VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties) const = 0;
+virtual VkResult                       getPhysicalDeviceImageFormatProperties                          (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties) const = 0;
+virtual void                           getPhysicalDeviceProperties                                                     (VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties) const = 0;
+virtual void                           getPhysicalDeviceQueueFamilyProperties                          (VkPhysicalDevice physicalDevice, deUint32* pQueueFamilyPropertyCount, VkQueueFamilyProperties* pQueueFamilyProperties) const = 0;
+virtual void                           getPhysicalDeviceMemoryProperties                                       (VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties) const = 0;
+virtual PFN_vkVoidFunction     getDeviceProcAddr                                                                       (VkDevice device, const char* pName) const = 0;
+virtual VkResult                       createDevice                                                                            (VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice) const = 0;
+virtual VkResult                       enumerateDeviceExtensionProperties                                      (VkPhysicalDevice physicalDevice, const char* pLayerName, deUint32* pPropertyCount, VkExtensionProperties* pProperties) const = 0;
+virtual VkResult                       enumerateDeviceLayerProperties                                          (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkLayerProperties* pProperties) const = 0;
+virtual void                           getPhysicalDeviceSparseImageFormatProperties            (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, deUint32* pPropertyCount, VkSparseImageFormatProperties* pProperties) const = 0;
+virtual void                           destroySurfaceKHR                                                                       (VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual VkResult                       getPhysicalDeviceSurfaceSupportKHR                                      (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported) const = 0;
+virtual VkResult                       getPhysicalDeviceSurfaceCapabilitiesKHR                         (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities) const = 0;
+virtual VkResult                       getPhysicalDeviceSurfaceFormatsKHR                                      (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats) const = 0;
+virtual VkResult                       getPhysicalDeviceSurfacePresentModesKHR                         (VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, deUint32* pPresentModeCount, VkPresentModeKHR* pPresentModes) const = 0;
+virtual VkResult                       getPhysicalDeviceDisplayPropertiesKHR                           (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPropertiesKHR* pProperties) const = 0;
+virtual VkResult                       getPhysicalDeviceDisplayPlanePropertiesKHR                      (VkPhysicalDevice physicalDevice, deUint32* pPropertyCount, VkDisplayPlanePropertiesKHR* pProperties) const = 0;
+virtual VkResult                       getDisplayPlaneSupportedDisplaysKHR                                     (VkPhysicalDevice physicalDevice, deUint32 planeIndex, deUint32* pDisplayCount, VkDisplayKHR* pDisplays) const = 0;
+virtual VkResult                       getDisplayModePropertiesKHR                                                     (VkPhysicalDevice physicalDevice, VkDisplayKHR display, deUint32* pPropertyCount, VkDisplayModePropertiesKHR* pProperties) const = 0;
+virtual VkResult                       createDisplayModeKHR                                                            (VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode) const = 0;
+virtual VkResult                       getDisplayPlaneCapabilitiesKHR                                          (VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, deUint32 planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities) const = 0;
+virtual VkResult                       createDisplayPlaneSurfaceKHR                                            (VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
+virtual VkResult                       createXlibSurfaceKHR                                                            (VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
+virtual VkBool32                       getPhysicalDeviceXlibPresentationSupportKHR                     (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XlibDisplayPtr dpy, pt::XlibVisualID visualID) const = 0;
+virtual VkResult                       createXcbSurfaceKHR                                                                     (VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
+virtual VkBool32                       getPhysicalDeviceXcbPresentationSupportKHR                      (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::XcbConnectionPtr connection, pt::XcbVisualid visual_id) const = 0;
+virtual VkResult                       createWaylandSurfaceKHR                                                         (VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
+virtual VkBool32                       getPhysicalDeviceWaylandPresentationSupportKHR          (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::WaylandDisplayPtr display) const = 0;
+virtual VkResult                       createMirSurfaceKHR                                                                     (VkInstance instance, const VkMirSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
+virtual VkBool32                       getPhysicalDeviceMirPresentationSupportKHR                      (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex, pt::MirConnectionPtr connection) const = 0;
+virtual VkResult                       createAndroidSurfaceKHR                                                         (VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
+virtual VkResult                       createWin32SurfaceKHR                                                           (VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const = 0;
+virtual VkBool32                       getPhysicalDeviceWin32PresentationSupportKHR            (VkPhysicalDevice physicalDevice, deUint32 queueFamilyIndex) const = 0;
+virtual VkResult                       createDebugReportCallbackEXT                                            (VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback) const = 0;
+virtual void                           destroyDebugReportCallbackEXT                                           (VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator) const = 0;
+virtual void                           debugReportMessageEXT                                                           (VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, deUint64 object, deUintptr location, deInt32 messageCode, const char* pLayerPrefix, const char* pMessage) const = 0;
+virtual VkResult                       getPhysicalDeviceExternalImageFormatPropertiesNV        (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties) const = 0;
index b3cbd33..da0a2be 100644 (file)
@@ -102,6 +102,9 @@ INSTANCE_FUNCTIONS  = [
        "vkCreateDebugReportCallbackEXT",
        "vkDestroyDebugReportCallbackEXT",
        "vkDebugReportMessageEXT",
+
+       # VK_NV_external_memory_capabilities
+       "vkGetPhysicalDeviceExternalImageFormatPropertiesNV"
 ]
 
 DEFINITIONS                    = [
@@ -122,31 +125,51 @@ DEFINITIONS                       = [
 
 PLATFORM_TYPES         = [
        # VK_KHR_xlib_surface
-       ("Display*",                    "XlibDisplayPtr",                       "void*"),
-       ("Window",                              "XlibWindow",                           "deUintptr",),
-       ("VisualID",                    "XlibVisualID",                         "deUint32"),
+       ("Display*",                                    "XlibDisplayPtr",                               "void*"),
+       ("Window",                                              "XlibWindow",                                   "deUintptr",),
+       ("VisualID",                                    "XlibVisualID",                                 "deUint32"),
 
        # VK_KHR_xcb_surface
-       ("xcb_connection_t*",   "XcbConnectionPtr",                     "void*"),
-       ("xcb_window_t",                "XcbWindow",                            "deUintptr"),
-       ("xcb_visualid_t",              "XcbVisualid",                          "deUint32"),
+       ("xcb_connection_t*",                   "XcbConnectionPtr",                             "void*"),
+       ("xcb_window_t",                                "XcbWindow",                                    "deUintptr"),
+       ("xcb_visualid_t",                              "XcbVisualid",                                  "deUint32"),
 
        # VK_KHR_wayland_surface
-       ("struct wl_display*",  "WaylandDisplayPtr",            "void*"),
-       ("struct wl_surface*",  "WaylandSurfacePtr",            "void*"),
+       ("struct wl_display*",                  "WaylandDisplayPtr",                    "void*"),
+       ("struct wl_surface*",                  "WaylandSurfacePtr",                    "void*"),
 
        # VK_KHR_mir_surface
-       ("MirConnection*",              "MirConnectionPtr",                     "void*"),
-       ("MirSurface*",                 "MirSurfacePtr",                        "void*"),
+       ("MirConnection*",                              "MirConnectionPtr",                             "void*"),
+       ("MirSurface*",                                 "MirSurfacePtr",                                "void*"),
 
        # VK_KHR_android_surface
-       ("ANativeWindow*",              "AndroidNativeWindowPtr",       "void*"),
+       ("ANativeWindow*",                              "AndroidNativeWindowPtr",               "void*"),
 
        # VK_KHR_win32_surface
-       ("HINSTANCE",                   "Win32InstanceHandle",          "void*"),
-       ("HWND",                                "Win32WindowHandle",            "void*")
+       ("HINSTANCE",                                   "Win32InstanceHandle",                  "void*"),
+       ("HWND",                                                "Win32WindowHandle",                    "void*"),
+       ("HANDLE",                                              "Win32Handle",                                  "void*"),
+       ("const SECURITY_ATTRIBUTES*",  "Win32SecurityAttributesPtr",   "const void*"),
 ]
 PLATFORM_TYPE_NAMESPACE        = "pt"
+TYPE_SUBSTITUTIONS             = [
+       ("uint8_t",             "deUint8"),
+       ("uint16_t",    "deUint16"),
+       ("uint32_t",    "deUint32"),
+       ("uint64_t",    "deUint64"),
+       ("int8_t",              "deInt8"),
+       ("int16_t",             "deInt16"),
+       ("int32_t",             "deInt32"),
+       ("int64_t",             "deInt64"),
+       ("bool32_t",    "deUint32"),
+       ("size_t",              "deUintptr"),
+
+       # Platform-specific
+       ("DWORD",               "deUint32"),
+       ("HANDLE*",             PLATFORM_TYPE_NAMESPACE + "::" + "Win32Handle*")
+]
+
+EXTENSION_POSTFIXES            = ["KHR", "EXT", "NV"]
 
 class Handle:
        TYPE_DISP               = 0
@@ -236,20 +259,7 @@ def fixupType (type):
                if type == platformType:
                        return PLATFORM_TYPE_NAMESPACE + "::" + substitute
 
-       replacements = [
-                       ("uint8_t",             "deUint8"),
-                       ("uint16_t",    "deUint16"),
-                       ("uint32_t",    "deUint32"),
-                       ("uint64_t",    "deUint64"),
-                       ("int8_t",              "deInt8"),
-                       ("int16_t",             "deInt16"),
-                       ("int32_t",             "deInt32"),
-                       ("int64_t",             "deInt64"),
-                       ("bool32_t",    "deUint32"),
-                       ("size_t",              "deUintptr"),
-               ]
-
-       for src, dst in replacements:
+       for src, dst in TYPE_SUBSTITUTIONS:
                type = type.replace(src, dst)
 
        return type
@@ -272,7 +282,7 @@ def endsWith (str, postfix):
        return str[-len(postfix):] == postfix
 
 def splitNameExtPostfix (name):
-       knownExtPostfixes = ["KHR", "EXT"]
+       knownExtPostfixes = EXTENSION_POSTFIXES
        for postfix in knownExtPostfixes:
                if endsWith(name, postfix):
                        return (name[:-len(postfix)], postfix)
index 2c3beab..4261e43 100644 (file)
@@ -6,7 +6,6 @@ add_subdirectory(binding_model)
 add_subdirectory(spirv_assembly)
 add_subdirectory(shaderrender)
 add_subdirectory(shaderexecutor)
-add_subdirectory(texture_filtering)
 add_subdirectory(memory)
 add_subdirectory(ubo)
 add_subdirectory(dynamic_state)
@@ -22,6 +21,7 @@ add_subdirectory(rasterization)
 add_subdirectory(synchronization)
 add_subdirectory(clipping)
 add_subdirectory(fragment_ops)
+add_subdirectory(texture)
 
 include_directories(
        api
@@ -30,7 +30,6 @@ include_directories(
        spirv_assembly
        shaderrender
        shaderexecutor
-       texture_filtering
        memory
        ubo
        dynamic_state
@@ -46,6 +45,7 @@ include_directories(
        synchronization
        clipping
        fragment_ops
+       texture
        )
 
 set(DEQP_VK_COMMON_SRCS
@@ -75,7 +75,6 @@ set(DEQP_VK_COMMON_LIBS
        deqp-vk-spirv-assembly
        deqp-vk-shaderrender
        deqp-vk-shaderexecutor
-       deqp-vk-texture-filtering
        deqp-vk-memory
        deqp-vk-ubo
        deqp-vk-dynamic-state
@@ -91,6 +90,7 @@ set(DEQP_VK_COMMON_LIBS
        deqp-vk-synchronization
        deqp-vk-clipping
        deqp-vk-fragment-ops
+       deqp-vk-texture
        )
 
 add_library(deqp-vk-common STATIC ${DEQP_VK_COMMON_SRCS})
index 53fa95b..b579893 100644 (file)
@@ -213,7 +213,7 @@ tcu::TestStatus BufferViewTestInstance::iterate (void)
        de::MovePtr<tcu::TestCaseGroup> bufferViewTests (new tcu::TestCaseGroup(testCtx, "create", "BufferView Construction Tests"));
 
        const VkDeviceSize range = VK_WHOLE_SIZE;
-       for (deUint32 format = VK_FORMAT_UNDEFINED + 1; format < VK_FORMAT_LAST; format++)
+       for (deUint32 format = VK_FORMAT_UNDEFINED + 1; format < VK_CORE_FORMAT_LAST; format++)
        {
                std::ostringstream      testName;
                std::ostringstream      testDescription;
index 9521a5f..9ba66ce 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "deStringUtil.hpp"
 #include "deUniquePtr.hpp"
+#include "deMath.h"
 
 #include "tcuImageCompare.hpp"
 #include "tcuTexture.hpp"
@@ -73,22 +74,27 @@ union CopyRegion
        VkImageResolve          imageResolve;
 };
 
+struct ImageParms
+{
+       VkImageType             imageType;
+       VkFormat                format;
+       VkExtent3D              extent;
+};
+
 struct TestParams
 {
-       union Data
+       union
        {
-               struct Buffer
+               struct
                {
                        VkDeviceSize    size;
-               }       buffer;
-               struct Image
-               {
-                       VkFormat                format;
-                       VkExtent3D              extent;
-               }       image;
-       }       src, dst;
+               } buffer;
+
+               ImageParms      image;
+       } src, dst;
 
        std::vector<CopyRegion> regions;
+
        union
        {
                VkFilter                                filter;
@@ -96,6 +102,22 @@ struct TestParams
        };
 };
 
+inline deUint32 getArraySize(const ImageParms& parms)
+{
+       return (parms.imageType == VK_IMAGE_TYPE_2D) ? parms.extent.depth : 1u;
+}
+
+inline VkExtent3D getExtent3D(const ImageParms& parms)
+{
+       const VkExtent3D                extent                                  =
+       {
+               parms.extent.width,
+               parms.extent.height,
+               (parms.imageType == VK_IMAGE_TYPE_2D) ? 1u : parms.extent.depth
+       };
+       return extent;
+}
+
 class CopiesAndBlittingTestInstance : public vkt::TestInstance
 {
 public:
@@ -127,7 +149,7 @@ protected:
        void                                                            generateBuffer                                          (tcu::PixelBufferAccess buffer, int width, int height, int depth = 1, FillMode = FILL_MODE_GRADIENT);
        virtual void                                            generateExpectedResult                          (void);
        void                                                            uploadBuffer                                            (tcu::ConstPixelBufferAccess bufferAccess, const Allocation& bufferAlloc);
-       void                                                            uploadImage                                                     (tcu::ConstPixelBufferAccess imageAccess, const VkImage& image);
+       void                                                            uploadImage                                                     (tcu::ConstPixelBufferAccess imageAccess, const VkImage& image, const ImageParms& parms);
        virtual tcu::TestStatus                         checkTestResult                                         (tcu::ConstPixelBufferAccess result);
        virtual void                                            copyRegionToTextureLevel                        (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region) = 0;
        deUint32                                                        calculateSize                                           (tcu::ConstPixelBufferAccess src) const
@@ -140,8 +162,11 @@ protected:
                                                                                                                                                         vk::VkQueue                            queue,
                                                                                                                                                         vk::Allocator&                         allocator,
                                                                                                                                                         vk::VkImage                            image,
-                                                                                                                                                        vk::VkFormat                           format,
-                                                                                                                                                        const VkExtent3D                       imageSize);
+                                                                                                                                                        const ImageParms&                      imageParms);
+       void                                                            submitCommandsAndWait                           (const DeviceInterface&         vk,
+                                                                                                                                                       const VkDevice                          device,
+                                                                                                                                                       const VkQueue                           queue,
+                                                                                                                                                       const VkCommandBuffer&          cmdBuffer);
 };
 
 CopiesAndBlittingTestInstance::CopiesAndBlittingTestInstance (Context& context, TestParams testParams)
@@ -158,7 +183,7 @@ CopiesAndBlittingTestInstance::CopiesAndBlittingTestInstance (Context& context,
                {
                        VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,             // VkStructureType              sType;
                        DE_NULL,                                                                                // const void*                  pNext;
-                       VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,                   // VkCmdPoolCreateFlags flags;
+                       VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,// VkCmdPoolCreateFlags flags;
                        queueFamilyIndex,                                                               // deUint32                             queueFamilyIndex;
                };
 
@@ -249,7 +274,7 @@ void CopiesAndBlittingTestInstance::uploadBuffer (tcu::ConstPixelBufferAccess bu
        flushMappedMemoryRange(vk, vkDevice, bufferAlloc.getMemory(), bufferAlloc.getOffset(), bufferSize);
 }
 
-void CopiesAndBlittingTestInstance::uploadImage (tcu::ConstPixelBufferAccess imageAccess, const VkImage& image)
+void CopiesAndBlittingTestInstance::uploadImage (tcu::ConstPixelBufferAccess imageAccess, const VkImage& image, const ImageParms& parms)
 {
        const DeviceInterface&          vk                                      = m_context.getDeviceInterface();
        const VkDevice                          vkDevice                        = m_context.getDevice();
@@ -260,7 +285,8 @@ void CopiesAndBlittingTestInstance::uploadImage (tcu::ConstPixelBufferAccess ima
        Move<VkBuffer>                          buffer;
        const deUint32                          bufferSize                      = calculateSize(imageAccess);
        de::MovePtr<Allocation>         bufferAlloc;
-       Move<VkCommandBuffer>           cmdBuffer;
+       const deUint32                          arraySize                       = getArraySize(parms);
+       const VkExtent3D                        imageExtent                     = getExtent3D(parms);
 
        // Create source buffer
        {
@@ -281,20 +307,6 @@ void CopiesAndBlittingTestInstance::uploadImage (tcu::ConstPixelBufferAccess ima
                VK_CHECK(vk.bindBufferMemory(vkDevice, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
        }
 
-       // Create command buffer
-       {
-               const VkCommandBufferAllocateInfo       cmdBufferAllocateInfo   =
-               {
-                       VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType                      sType;
-                       DE_NULL,                                                                                // const void*                          pNext;
-                       *m_cmdPool,                                                                             // VkCommandPool                        commandPool;
-                       VK_COMMAND_BUFFER_LEVEL_PRIMARY,                                // VkCommandBufferLevel         level;
-                       1u,                                                                                             // deUint32                                     bufferCount;
-               };
-
-               cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo);
-       }
-
        // Barriers for copying buffer to image
        const VkBufferMemoryBarrier                             preBufferBarrier                =
        {
@@ -322,11 +334,11 @@ void CopiesAndBlittingTestInstance::uploadImage (tcu::ConstPixelBufferAccess ima
                VK_QUEUE_FAMILY_IGNORED,                                                // deUint32                                     dstQueueFamilyIndex;
                image,                                                                                  // VkImage                                      image;
                {                                                                                               // VkImageSubresourceRange      subresourceRange;
-                       aspect,                                                                 // VkImageAspectFlags   aspect;
-                       0u,                                                                             // deUint32                             baseMipLevel;
-                       1u,                                                                             // deUint32                             mipLevels;
-                       0u,                                                                             // deUint32                             baseArraySlice;
-                       1u,                                                                             // deUint32                             arraySize;
+                       aspect,                 // VkImageAspectFlags   aspect;
+                       0u,                             // deUint32                             baseMipLevel;
+                       1u,                             // deUint32                             mipLevels;
+                       0u,                             // deUint32                             baseArraySlice;
+                       arraySize,              // deUint32                             arraySize;
                }
        };
 
@@ -342,15 +354,14 @@ void CopiesAndBlittingTestInstance::uploadImage (tcu::ConstPixelBufferAccess ima
                VK_QUEUE_FAMILY_IGNORED,                                                // deUint32                                     dstQueueFamilyIndex;
                image,                                                                                  // VkImage                                      image;
                {                                                                                               // VkImageSubresourceRange      subresourceRange;
-                       aspect,                                                                 // VkImageAspectFlags   aspect;
-                       0u,                                                                             // deUint32                             baseMipLevel;
-                       1u,                                                                             // deUint32                             mipLevels;
-                       0u,                                                                             // deUint32                             baseArraySlice;
-                       1u,                                                                             // deUint32                             arraySize;
+                       aspect,                                         // VkImageAspectFlags   aspect;
+                       0u,                                                     // deUint32                             baseMipLevel;
+                       1u,                                                     // deUint32                             mipLevels;
+                       0u,                                                     // deUint32                             baseArraySlice;
+                       arraySize,                                      // deUint32                             arraySize;
                }
        };
 
-       const VkExtent3D                        imageExtent                     = { (deUint32)imageAccess.getWidth(), (deUint32)imageAccess.getHeight(), 1u };
        const deUint32                          regionCount                     = tcu::isCombinedDepthStencilType(imageAccess.getFormat().type) ? 2u : 1u;
        const VkImageAspectFlags        firstRegionAspect       = aspect & VK_IMAGE_ASPECT_DEPTH_BIT ? VkImageAspectFlags(VK_IMAGE_ASPECT_DEPTH_BIT) : aspect;
        const VkBufferImageCopy         copyRegion[]            =
@@ -361,12 +372,12 @@ void CopiesAndBlittingTestInstance::uploadImage (tcu::ConstPixelBufferAccess ima
                        (deUint32)imageAccess.getHeight(),                              // deUint32                                     bufferImageHeight;
                        {                                                                                               // VkImageSubresourceLayers     imageSubresource;
                                firstRegionAspect,                                                      // VkImageAspectFlags   aspect;
-                               0u,                                                                                     // deUint32                             mipLevel;
-                               0u,                                                                                     // deUint32                             baseArrayLayer;
-                               1u,                                                                                     // deUint32                             layerCount;
+                               0u,                                                             // deUint32                             mipLevel;
+                               0u,                                                             // deUint32                             baseArrayLayer;
+                               arraySize,                                              // deUint32                             layerCount;
                        },
-                       { 0, 0, 0 },                                                                    // VkOffset3D                           imageOffset;
-                       imageExtent                                                                             // VkExtent3D                           imageExtent;
+                       { 0, 0, 0 },                                            // VkOffset3D                           imageOffset;
+                       imageExtent                                                     // VkExtent3D                           imageExtent;
                },
                {
                        0u,                                                                                             // VkDeviceSize                         bufferOffset;
@@ -374,12 +385,12 @@ void CopiesAndBlittingTestInstance::uploadImage (tcu::ConstPixelBufferAccess ima
                        (deUint32)imageAccess.getHeight(),                              // deUint32                                     bufferImageHeight;
                        {                                                                                               // VkImageSubresourceLayers     imageSubresource;
                                VK_IMAGE_ASPECT_STENCIL_BIT,                            // VkImageAspectFlags   aspect;
-                               0u,                                                                                     // deUint32                             mipLevel;
-                               0u,                                                                                     // deUint32                             baseArrayLayer;
-                               1u,                                                                                     // deUint32                             layerCount;
+                               0u,                                                             // deUint32                             mipLevel;
+                               0u,                                                             // deUint32                             baseArrayLayer;
+                               arraySize,                                              // deUint32                             layerCount;
                        },
-                       { 0, 0, 0 },                                                                    // VkOffset3D                           imageOffset;
-                       imageExtent                                                                             // VkExtent3D                           imageExtent;
+                       { 0, 0, 0 },                                            // VkOffset3D                           imageOffset;
+                       imageExtent                                                     // VkExtent3D                           imageExtent;
                },
        };
 
@@ -396,28 +407,13 @@ void CopiesAndBlittingTestInstance::uploadImage (tcu::ConstPixelBufferAccess ima
                (const VkCommandBufferInheritanceInfo*)DE_NULL,
        };
 
-       VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
-       vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &preBufferBarrier, 1, &preImageBarrier);
-       vk.cmdCopyBufferToImage(*cmdBuffer, *buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, regionCount, copyRegion);
-       vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &postImageBarrier);
-       VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
-
-       const VkSubmitInfo                                              submitInfo                              =
-       {
-               VK_STRUCTURE_TYPE_SUBMIT_INFO,  // VkStructureType                      sType;
-               DE_NULL,                                                // const void*                          pNext;
-               0u,                                                             // deUint32                                     waitSemaphoreCount;
-               DE_NULL,                                                // const VkSemaphore*           pWaitSemaphores;
-               (const VkPipelineStageFlags*)DE_NULL,
-               1u,                                                             // deUint32                                     commandBufferCount;
-               &cmdBuffer.get(),                               // const VkCommandBuffer*       pCommandBuffers;
-               0u,                                                             // deUint32                                     signalSemaphoreCount;
-               DE_NULL                                                 // const VkSemaphore*           pSignalSemaphores;
-       };
+       VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
+       vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &preBufferBarrier, 1, &preImageBarrier);
+       vk.cmdCopyBufferToImage(*m_cmdBuffer, *buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, regionCount, copyRegion);
+       vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &postImageBarrier);
+       VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
 
-       VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
-       VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
-       VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
+       submitCommandsAndWait (vk, vkDevice, queue, *m_cmdBuffer);
 }
 
 tcu::TestStatus CopiesAndBlittingTestInstance::checkTestResult (tcu::ConstPixelBufferAccess result)
@@ -468,16 +464,14 @@ de::MovePtr<tcu::TextureLevel> CopiesAndBlittingTestInstance::readImage   (const v
                                                                                                                                                 vk::VkQueue                            queue,
                                                                                                                                                 vk::Allocator&                         allocator,
                                                                                                                                                 vk::VkImage                            image,
-                                                                                                                                                vk::VkFormat                           format,
-                                                                                                                                                const VkExtent3D                       imageSize)
+                                                                                                                                                const ImageParms&                      imageParms)
 {
        Move<VkBuffer>                                  buffer;
        de::MovePtr<Allocation>                 bufferAlloc;
-       Move<VkCommandBuffer>                   cmdBuffer;
        const deUint32                                  queueFamilyIndex        = m_context.getUniversalQueueFamilyIndex();
-       const tcu::TextureFormat                tcuFormat                       = mapVkFormat(format);
-       const VkDeviceSize                              pixelDataSize           = imageSize.width * imageSize.height * imageSize.depth * tcu::getPixelSize(tcuFormat);
-       de::MovePtr<tcu::TextureLevel>  resultLevel                     (new tcu::TextureLevel(tcuFormat, imageSize.width, imageSize.height, imageSize.depth));
+       const tcu::TextureFormat                tcuFormat                       = mapVkFormat(imageParms.format);
+       const VkDeviceSize                              pixelDataSize           = imageParms.extent.width * imageParms.extent.height * imageParms.extent.depth * tcu::getPixelSize(tcuFormat);
+       de::MovePtr<tcu::TextureLevel>  resultLevel                     (new tcu::TextureLevel(tcuFormat,imageParms.extent.width, imageParms.extent.height, imageParms.extent.depth));
 
        // Create destination buffer
        {
@@ -496,20 +490,9 @@ de::MovePtr<tcu::TextureLevel> CopiesAndBlittingTestInstance::readImage    (const v
                buffer          = createBuffer(vk, device, &bufferParams);
                bufferAlloc     = allocator.allocate(getBufferMemoryRequirements(vk, device, *buffer), MemoryRequirement::HostVisible);
                VK_CHECK(vk.bindBufferMemory(device, *buffer, bufferAlloc->getMemory(), bufferAlloc->getOffset()));
-       }
-
-       // Create command pool and buffer
-       {
-               const VkCommandBufferAllocateInfo       cmdBufferAllocateInfo   =
-               {
-                       VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType                      sType;
-                       DE_NULL,                                                                                // const void*                          pNext;
-                       *m_cmdPool,                                                                             // VkCommandPool                        commandPool;
-                       VK_COMMAND_BUFFER_LEVEL_PRIMARY,                                // VkCommandBufferLevel         level;
-                       1u                                                                                              // deUint32                                     bufferCount;
-               };
 
-               cmdBuffer       = allocateCommandBuffer(vk, device, &cmdBufferAllocateInfo);
+               deMemset(bufferAlloc->getHostPtr(), 0, static_cast<size_t>(pixelDataSize));
+               flushMappedMemoryRange(vk, device, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize);
        }
 
        // Barriers for copying image to buffer
@@ -526,11 +509,11 @@ de::MovePtr<tcu::TextureLevel> CopiesAndBlittingTestInstance::readImage   (const v
                VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     dstQueueFamilyIndex;
                image,                                                                          // VkImage                                      image;
                {                                                                                       // VkImageSubresourceRange      subresourceRange;
-                       aspect,                                         // VkImageAspectFlags   aspectMask;
-                       0u,                                                     // deUint32                             baseMipLevel;
-                       1u,                                                     // deUint32                             mipLevels;
-                       0u,                                                     // deUint32                             baseArraySlice;
-                       1u                                                      // deUint32                             arraySize;
+                       aspect,                                 // VkImageAspectFlags   aspectMask;
+                       0u,                                             // deUint32                             baseMipLevel;
+                       1u,                                             // deUint32                             mipLevels;
+                       0u,                                             // deUint32                             baseArraySlice;
+                       getArraySize(imageParms)// deUint32                             arraySize;
                }
        };
 
@@ -554,29 +537,29 @@ de::MovePtr<tcu::TextureLevel> CopiesAndBlittingTestInstance::readImage   (const v
        {
                {
                        0u,                                                                                             // VkDeviceSize                         bufferOffset;
-                       (deUint32)imageSize.width,                                              // deUint32                                     bufferRowLength;
-                       (deUint32)imageSize.height,                                             // deUint32                                     bufferImageHeight;
+                       (deUint32)imageParms.extent.width,                              // deUint32                                     bufferRowLength;
+                       (deUint32)imageParms.extent.height,                             // deUint32                                     bufferImageHeight;
                        {                                                                                               // VkImageSubresourceLayers     imageSubresource;
-                               firstRegionAspect,                                                      // VkImageAspectFlags           aspect;
-                               0u,                                                                                     // deUint32                                     mipLevel;
-                               0u,                                                                                     // deUint32                                     baseArrayLayer;
-                               1u,                                                                                     // deUint32                                     layerCount;
+                               firstRegionAspect,                      // VkImageAspectFlags           aspect;
+                               0u,                                                     // deUint32                                     mipLevel;
+                               0u,                                                     // deUint32                                     baseArrayLayer;
+                               getArraySize(imageParms),       // deUint32                                     layerCount;
                        },
                        { 0, 0, 0 },                                                                    // VkOffset3D                           imageOffset;
-                       imageSize                                                                               // VkExtent3D                           imageExtent;
+                       getExtent3D(imageParms)                                                 // VkExtent3D                           imageExtent;
                },
                {
                        0u,                                                                                             // VkDeviceSize                         bufferOffset;
-                       (deUint32)imageSize.width,                                              // deUint32                                     bufferRowLength;
-                       (deUint32)imageSize.height,                                             // deUint32                                     bufferImageHeight;
+                       (deUint32)imageParms.extent.width,                              // deUint32                                     bufferRowLength;
+                       (deUint32)imageParms.extent.height,                             // deUint32                                     bufferImageHeight;
                        {                                                                                               // VkImageSubresourceLayers     imageSubresource;
-                               VK_IMAGE_ASPECT_STENCIL_BIT,                            // VkImageAspectFlags           aspect;
-                               0u,                                                                                     // deUint32                                     mipLevel;
-                               0u,                                                                                     // deUint32                                     baseArrayLayer;
-                               1u,                                                                                     // deUint32                                     layerCount;
+                               VK_IMAGE_ASPECT_STENCIL_BIT,    // VkImageAspectFlags           aspect;
+                               0u,                                                             // deUint32                                     mipLevel;
+                               0u,                                                             // deUint32                                     baseArrayLayer;
+                               getArraySize(imageParms),               // deUint32                                     layerCount;
                        },
-                       { 0, 0, 0 },                                                                    // VkOffset3D                           imageOffset;
-                       imageSize                                                                               // VkExtent3D                           imageExtent;
+                       { 0, 0, 0 },                                            // VkOffset3D                           imageOffset;
+                       getExtent3D(imageParms)                         // VkExtent3D                           imageExtent;
                },
        };
 
@@ -588,12 +571,23 @@ de::MovePtr<tcu::TextureLevel> CopiesAndBlittingTestInstance::readImage   (const v
                (const VkCommandBufferInheritanceInfo*)DE_NULL,
        };
 
-       VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
-       vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &imageBarrier);
-       vk.cmdCopyImageToBuffer(*cmdBuffer, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, regionCount, copyRegion);
-       vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
-       VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
+       VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
+       vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &imageBarrier);
+       vk.cmdCopyImageToBuffer(*m_cmdBuffer, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *buffer, regionCount, copyRegion);
+       vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
+       VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
+
+       submitCommandsAndWait (vk, device, queue, *m_cmdBuffer);
+
+       // Read buffer data
+       invalidateMappedMemoryRange(vk, device, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize);
+       tcu::copy(*resultLevel, tcu::ConstPixelBufferAccess(resultLevel->getFormat(), resultLevel->getSize(), bufferAlloc->getHostPtr()));
+
+       return resultLevel;
+}
 
+void CopiesAndBlittingTestInstance::submitCommandsAndWait (const DeviceInterface& vk, const VkDevice device, const VkQueue queue, const VkCommandBuffer& cmdBuffer)
+{
        const VkSubmitInfo                                              submitInfo                              =
        {
                VK_STRUCTURE_TYPE_SUBMIT_INFO,  // VkStructureType                      sType;
@@ -602,20 +596,14 @@ de::MovePtr<tcu::TextureLevel> CopiesAndBlittingTestInstance::readImage   (const v
                DE_NULL,                                                // const VkSemaphore*           pWaitSemaphores;
                (const VkPipelineStageFlags*)DE_NULL,
                1u,                                                             // deUint32                                     commandBufferCount;
-               &cmdBuffer.get(),                               // const VkCommandBuffer*       pCommandBuffers;
+               &cmdBuffer,                                             // const VkCommandBuffer*       pCommandBuffers;
                0u,                                                             // deUint32                                     signalSemaphoreCount;
                DE_NULL                                                 // const VkSemaphore*           pSignalSemaphores;
        };
 
        VK_CHECK(vk.resetFences(device, 1, &m_fence.get()));
        VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
-       VK_CHECK(vk.waitForFences(device, 1, &m_fence.get(), 0, ~(0ull) /* infinity */));
-
-       // Read buffer data
-       invalidateMappedMemoryRange(vk, device, bufferAlloc->getMemory(), bufferAlloc->getOffset(), pixelDataSize);
-       tcu::copy(*resultLevel, tcu::ConstPixelBufferAccess(resultLevel->getFormat(), resultLevel->getSize(), bufferAlloc->getHostPtr()));
-
-       return resultLevel;
+       VK_CHECK(vk.waitForFences(device, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
 }
 
 // Copy from image to image.
@@ -733,8 +721,8 @@ tcu::TestStatus CopyImageToImage::iterate (void)
        generateBuffer(m_destinationTextureLevel->getAccess(), m_params.dst.image.extent.width, m_params.dst.image.extent.height, m_params.dst.image.extent.depth, FILL_MODE_GRADIENT);
        generateExpectedResult();
 
-       uploadImage(m_sourceTextureLevel->getAccess(), m_source.get());
-       uploadImage(m_destinationTextureLevel->getAccess(), m_destination.get());
+       uploadImage(m_sourceTextureLevel->getAccess(), m_source.get(), m_params.src.image);
+       uploadImage(m_destinationTextureLevel->getAccess(), m_destination.get(), m_params.dst.image);
 
        const DeviceInterface&          vk                                      = m_context.getDeviceInterface();
        const VkDevice                          vkDevice                        = m_context.getDevice();
@@ -800,24 +788,9 @@ tcu::TestStatus CopyImageToImage::iterate (void)
        vk.cmdCopyImage(*m_cmdBuffer, m_source.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, m_destination.get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (deUint32)m_params.regions.size(), imageCopies.data());
        VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
 
-       const VkSubmitInfo                              submitInfo                      =
-       {
-               VK_STRUCTURE_TYPE_SUBMIT_INFO,  // VkStructureType                      sType;
-               DE_NULL,                                                // const void*                          pNext;
-               0u,                                                             // deUint32                                     waitSemaphoreCount;
-               DE_NULL,                                                // const VkSemaphore*           pWaitSemaphores;
-               (const VkPipelineStageFlags*)DE_NULL,
-               1u,                                                             // deUint32                                     commandBufferCount;
-               &m_cmdBuffer.get(),                             // const VkCommandBuffer*       pCommandBuffers;
-               0u,                                                             // deUint32                                     signalSemaphoreCount;
-               DE_NULL                                                 // const VkSemaphore*           pSignalSemaphores;
-       };
-
-       VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
-       VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
-       VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
+       submitCommandsAndWait (vk, vkDevice, queue, *m_cmdBuffer);
 
-       de::MovePtr<tcu::TextureLevel>  resultTextureLevel      = readImage(vk, vkDevice, queue, memAlloc, *m_destination, m_params.dst.image.format, m_params.dst.image.extent);
+       de::MovePtr<tcu::TextureLevel>  resultTextureLevel      = readImage(vk, vkDevice, queue, memAlloc, *m_destination, m_params.dst.image);
 
        return checkTestResult(resultTextureLevel->getAccess());
 }
@@ -1145,7 +1118,7 @@ tcu::TestStatus CopyImageToBuffer::iterate (void)
 
        generateExpectedResult();
 
-       uploadImage(m_sourceTextureLevel->getAccess(), *m_source);
+       uploadImage(m_sourceTextureLevel->getAccess(), *m_source, m_params.src.image);
        uploadBuffer(m_destinationTextureLevel->getAccess(), *m_destinationBufferAlloc);
 
        const DeviceInterface&          vk                      = m_context.getDeviceInterface();
@@ -1205,22 +1178,7 @@ tcu::TestStatus CopyImageToBuffer::iterate (void)
        vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
        VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
 
-       const VkSubmitInfo                              submitInfo                      =
-       {
-               VK_STRUCTURE_TYPE_SUBMIT_INFO,  // VkStructureType                      sType;
-               DE_NULL,                                                // const void*                          pNext;
-               0u,                                                             // deUint32                                     waitSemaphoreCount;
-               DE_NULL,                                                // const VkSemaphore*           pWaitSemaphores;
-               (const VkPipelineStageFlags*)DE_NULL,
-               1u,                                                             // deUint32                                     commandBufferCount;
-               &m_cmdBuffer.get(),                             // const VkCommandBuffer*       pCommandBuffers;
-               0u,                                                             // deUint32                                     signalSemaphoreCount;
-               DE_NULL                                                 // const VkSemaphore*           pSignalSemaphores;
-       };
-
-       VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
-       VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
-       VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
+       submitCommandsAndWait (vk, vkDevice, queue, *m_cmdBuffer);
 
        // Read buffer data
        de::MovePtr<tcu::TextureLevel>  resultLevel             (new tcu::TextureLevel(m_textureFormat, (int)m_params.dst.buffer.size, 1));
@@ -1368,7 +1326,7 @@ tcu::TestStatus CopyBufferToImage::iterate (void)
        generateExpectedResult();
 
        uploadBuffer(m_sourceTextureLevel->getAccess(), *m_sourceBufferAlloc);
-       uploadImage(m_destinationTextureLevel->getAccess(), *m_destination);
+       uploadImage(m_destinationTextureLevel->getAccess(), *m_destination, m_params.dst.image);
 
        const DeviceInterface&          vk                      = m_context.getDeviceInterface();
        const VkDevice                          vkDevice        = m_context.getDevice();
@@ -1413,24 +1371,9 @@ tcu::TestStatus CopyBufferToImage::iterate (void)
        vk.cmdCopyBufferToImage(*m_cmdBuffer, m_source.get(), m_destination.get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (deUint32)m_params.regions.size(), bufferImageCopies.data());
        VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
 
-       const VkSubmitInfo                              submitInfo                      =
-       {
-               VK_STRUCTURE_TYPE_SUBMIT_INFO,  // VkStructureType                      sType;
-               DE_NULL,                                                // const void*                          pNext;
-               0u,                                                             // deUint32                                     waitSemaphoreCount;
-               DE_NULL,                                                // const VkSemaphore*           pWaitSemaphores;
-               (const VkPipelineStageFlags*)DE_NULL,
-               1u,                                                             // deUint32                                     commandBufferCount;
-               &m_cmdBuffer.get(),                             // const VkCommandBuffer*       pCommandBuffers;
-               0u,                                                             // deUint32                                     signalSemaphoreCount;
-               DE_NULL                                                 // const VkSemaphore*           pSignalSemaphores;
-       };
-
-       VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
-       VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
-       VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
+       submitCommandsAndWait (vk, vkDevice, queue, *m_cmdBuffer);
 
-       de::MovePtr<tcu::TextureLevel>  resultLevel     = readImage(vk, vkDevice, queue, memAlloc, *m_destination, m_params.dst.image.format, m_params.dst.image.extent);
+       de::MovePtr<tcu::TextureLevel>  resultLevel     = readImage(vk, vkDevice, queue, memAlloc, *m_destination, m_params.dst.image);
 
        return checkTestResult(resultLevel->getAccess());
 }
@@ -1626,8 +1569,8 @@ tcu::TestStatus BlittingImages::iterate (void)
        generateBuffer(m_destinationTextureLevel->getAccess(), m_params.dst.image.extent.width, m_params.dst.image.extent.height, m_params.dst.image.extent.depth, FILL_MODE_WHITE);
        generateExpectedResult();
 
-       uploadImage(m_sourceTextureLevel->getAccess(), m_source.get());
-       uploadImage(m_destinationTextureLevel->getAccess(), m_destination.get());
+       uploadImage(m_sourceTextureLevel->getAccess(), m_source.get(), m_params.src.image);
+       uploadImage(m_destinationTextureLevel->getAccess(), m_destination.get(), m_params.dst.image);
 
        const DeviceInterface&          vk                                      = m_context.getDeviceInterface();
        const VkDevice                          vkDevice                        = m_context.getDevice();
@@ -1693,24 +1636,9 @@ tcu::TestStatus BlittingImages::iterate (void)
        vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &dstImageBarrier);
        VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
 
-       const VkSubmitInfo                              submitInfo                      =
-       {
-               VK_STRUCTURE_TYPE_SUBMIT_INFO,  // VkStructureType                      sType;
-               DE_NULL,                                                // const void*                          pNext;
-               0u,                                                             // deUint32                                     waitSemaphoreCount;
-               DE_NULL,                                                // const VkSemaphore*           pWaitSemaphores;
-               (const VkPipelineStageFlags*)DE_NULL,
-               1u,                                                             // deUint32                                     commandBufferCount;
-               &m_cmdBuffer.get(),                             // const VkCommandBuffer*       pCommandBuffers;
-               0u,                                                             // deUint32                                     signalSemaphoreCount;
-               DE_NULL                                                 // const VkSemaphore*           pSignalSemaphores;
-       };
-
-       VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
-       VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
-       VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
+       submitCommandsAndWait (vk, vkDevice, queue, *m_cmdBuffer);
 
-       de::MovePtr<tcu::TextureLevel> resultTextureLevel = readImage(vk, vkDevice, queue, memAlloc, *m_destination, m_params.dst.image.format, m_params.dst.image.extent);
+       de::MovePtr<tcu::TextureLevel> resultTextureLevel = readImage(vk, vkDevice, queue, memAlloc, *m_destination, m_params.dst.image);
 
        return checkTestResult(resultTextureLevel->getAccess());
 }
@@ -1968,14 +1896,17 @@ private:
 
 // Resolve image to image.
 
+enum ResolveImageToImageOptions{NO_OPTIONAL_OPERATION, COPY_MS_IMAGE_TO_MS_IMAGE, COPY_MS_IMAGE_TO_ARRAY_MS_IMAGE};
 class ResolveImageToImage : public CopiesAndBlittingTestInstance
 {
 public:
-                                                                                               ResolveImageToImage                     (Context&       context,
-                                                                                                                                                        TestParams params);
+                                                                                               ResolveImageToImage                     (Context&                                                       context,
+                                                                                                                                                        TestParams                                                     params,
+                                                                                                                                                        const ResolveImageToImageOptions       options);
        virtual tcu::TestStatus                                         iterate                                         (void);
 protected:
        virtual tcu::TestStatus                                         checkTestResult                         (tcu::ConstPixelBufferAccess result);
+       void                                                                            copyMSImageToMSImage            (void);
 private:
        Move<VkImage>                                                           m_multisampledImage;
        de::MovePtr<Allocation>                                         m_multisampledImageAlloc;
@@ -1983,11 +1914,19 @@ private:
        Move<VkImage>                                                           m_destination;
        de::MovePtr<Allocation>                                         m_destinationImageAlloc;
 
-       virtual void                                                            copyRegionToTextureLevel        (tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region);
+       Move<VkImage>                                                           m_multisampledCopyImage;
+       de::MovePtr<Allocation>                                         m_multisampledCopyImageAlloc;
+
+       const ResolveImageToImageOptions                         m_options;
+
+       virtual void                                                            copyRegionToTextureLevel        (tcu::ConstPixelBufferAccess    src,
+                                                                                                                                                        tcu::PixelBufferAccess                 dst,
+                                                                                                                                                        CopyRegion                                             region);
 };
 
-ResolveImageToImage::ResolveImageToImage (Context& context, TestParams params)
-       : CopiesAndBlittingTestInstance(context, params)
+ResolveImageToImage::ResolveImageToImage (Context& context, TestParams params, const ResolveImageToImageOptions options)
+       : CopiesAndBlittingTestInstance (context, params)
+       , m_options                                             (options)
 {
        const VkSampleCountFlagBits     rasterizationSamples    = m_params.samples;
 
@@ -2000,37 +1939,28 @@ ResolveImageToImage::ResolveImageToImage (Context& context, TestParams params)
        Allocator&                                      memAlloc                                = m_context.getDefaultAllocator();
 
        const VkComponentMapping        componentMappingRGBA    = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
-
-       Move<VkImageView>                       sourceAttachmentView;
-
        Move<VkRenderPass>                      renderPass;
-       Move<VkFramebuffer>                     framebuffer;
 
-       Move<VkShaderModule>            vertexShaderModule;
-       Move<VkShaderModule>            fragmentShaderModule;
+       Move<VkShaderModule>            vertexShaderModule              = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("vert"), 0);
+       Move<VkShaderModule>            fragmentShaderModule    = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("frag"), 0);
+       std::vector<tcu::Vec4>          vertices;
 
        Move<VkBuffer>                          vertexBuffer;
-       std::vector<tcu::Vec4>          vertices;
        de::MovePtr<Allocation>         vertexBufferAlloc;
 
        Move<VkPipelineLayout>          pipelineLayout;
        Move<VkPipeline>                        graphicsPipeline;
 
-       Move<VkCommandPool>                     cmdPool;
-       Move<VkCommandBuffer>           cmdBuffer;
-
-       Move<VkFence>                           fence;
-
        VkImageFormatProperties properties;
        if ((context.getInstanceInterface().getPhysicalDeviceImageFormatProperties (context.getPhysicalDevice(),
                                                                                                                                                                m_params.src.image.format,
-                                                                                                                                                               VK_IMAGE_TYPE_2D,
+                                                                                                                                                               m_params.src.image.imageType,
                                                                                                                                                                VK_IMAGE_TILING_OPTIMAL,
                                                                                                                                                                VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
                                                                                                                                                                &properties) == VK_ERROR_FORMAT_NOT_SUPPORTED) ||
                (context.getInstanceInterface().getPhysicalDeviceImageFormatProperties (context.getPhysicalDevice(),
                                                                                                                                                                m_params.dst.image.format,
-                                                                                                                                                               VK_IMAGE_TYPE_2D,
+                                                                                                                                                               m_params.dst.image.imageType,
                                                                                                                                                                VK_IMAGE_TILING_OPTIMAL,
                                                                                                                                                                VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
                                                                                                                                                                &properties) == VK_ERROR_FORMAT_NOT_SUPPORTED))
@@ -2040,30 +1970,57 @@ ResolveImageToImage::ResolveImageToImage (Context& context, TestParams params)
 
        // Create color image.
        {
-               const VkImageCreateInfo colorImageParams        =
+               VkImageCreateInfo       colorImageParams        =
                {
-                       VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,                                                                            // VkStructureType                      sType;
-                       DE_NULL,                                                                                                                                        // const void*                          pNext;
-                       0u,                                                                                                                                                     // VkImageCreateFlags           flags;
-                       VK_IMAGE_TYPE_2D,                                                                                                                       // VkImageType                          imageType;
-                       m_params.src.image.format,                                                                                                      // VkFormat                                     format;
-                       m_params.src.image.extent,                                                                                                      // VkExtent3D                           extent;
-                       1u,                                                                                                                                                     // deUint32                                     mipLevels;
-                       1u,                                                                                                                                                     // deUint32                                     arrayLayers;
-                       rasterizationSamples,                                                                                                           // VkSampleCountFlagBits        samples;
-                       VK_IMAGE_TILING_OPTIMAL,                                                                                                        // VkImageTiling                        tiling;
-                       VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,          // VkImageUsageFlags            usage;
-                       VK_SHARING_MODE_EXCLUSIVE,                                                                                                      // VkSharingMode                        sharingMode;
-                       1u,                                                                                                                                                     // deUint32                                     queueFamilyIndexCount;
-                       &queueFamilyIndex,                                                                                                                      // const deUint32*                      pQueueFamilyIndices;
-                       VK_IMAGE_LAYOUT_UNDEFINED,                                                                                                      // VkImageLayout                        initialLayout;
+                       VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,                                                                    // VkStructureType                      sType;
+                       DE_NULL,                                                                                                                                // const void*                          pNext;
+                       0u,                                                                                                                                             // VkImageCreateFlags           flags;
+                       m_params.src.image.imageType,                                                                                   // VkImageType                          imageType;
+                       m_params.src.image.format,                                                                                              // VkFormat                                     format;
+                       getExtent3D(m_params.src.image),                                                                                // VkExtent3D                           extent;
+                       1u,                                                                                                                                             // deUint32                                     mipLevels;
+                       getArraySize(m_params.src.image),                                                                               // deUint32                                     arrayLayers;
+                       rasterizationSamples,                                                                                                   // VkSampleCountFlagBits        samples;
+                       VK_IMAGE_TILING_OPTIMAL,                                                                                                // VkImageTiling                        tiling;
+                       VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,  // VkImageUsageFlags            usage;
+                       VK_SHARING_MODE_EXCLUSIVE,                                                                                              // VkSharingMode                        sharingMode;
+                       1u,                                                                                                                                             // deUint32                                     queueFamilyIndexCount;
+                       &queueFamilyIndex,                                                                                                              // const deUint32*                      pQueueFamilyIndices;
+                       VK_IMAGE_LAYOUT_UNDEFINED,                                                                                              // VkImageLayout                        initialLayout;
                };
 
-               m_multisampledImage                     = createImage(vk, vkDevice, &colorImageParams);
+               m_multisampledImage                             = createImage(vk, vkDevice, &colorImageParams);
 
                // Allocate and bind color image memory.
                m_multisampledImageAlloc                = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_multisampledImage), MemoryRequirement::Any);
                VK_CHECK(vk.bindImageMemory(vkDevice, *m_multisampledImage, m_multisampledImageAlloc->getMemory(), m_multisampledImageAlloc->getOffset()));
+
+               switch (m_options)
+               {
+                       case COPY_MS_IMAGE_TO_MS_IMAGE:
+                       {
+                               colorImageParams.usage                  = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+                               m_multisampledCopyImage                 = createImage(vk, vkDevice, &colorImageParams);
+                               // Allocate and bind color image memory.
+                               m_multisampledCopyImageAlloc    = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_multisampledCopyImage), MemoryRequirement::Any);
+                               VK_CHECK(vk.bindImageMemory(vkDevice, *m_multisampledCopyImage, m_multisampledCopyImageAlloc->getMemory(), m_multisampledCopyImageAlloc->getOffset()));
+                               break;
+                       }
+
+                       case COPY_MS_IMAGE_TO_ARRAY_MS_IMAGE:
+                       {
+                               colorImageParams.usage                  = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+                               colorImageParams.arrayLayers    = getArraySize(m_params.dst.image);
+                               m_multisampledCopyImage                 = createImage(vk, vkDevice, &colorImageParams);
+                               // Allocate and bind color image memory.
+                               m_multisampledCopyImageAlloc    = memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *m_multisampledCopyImage), MemoryRequirement::Any);
+                               VK_CHECK(vk.bindImageMemory(vkDevice, *m_multisampledCopyImage, m_multisampledCopyImageAlloc->getMemory(), m_multisampledCopyImageAlloc->getOffset()));
+                               break;
+                       }
+
+                       default :
+                               break;
+               }
        }
 
        // Create destination image.
@@ -2073,11 +2030,11 @@ ResolveImageToImage::ResolveImageToImage (Context& context, TestParams params)
                        VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,    // VkStructureType              sType;
                        DE_NULL,                                                                // const void*                  pNext;
                        0u,                                                                             // VkImageCreateFlags   flags;
-                       VK_IMAGE_TYPE_2D,                                               // VkImageType                  imageType;
+                       m_params.dst.image.imageType,                   // VkImageType                  imageType;
                        m_params.dst.image.format,                              // VkFormat                             format;
-                       m_params.dst.image.extent,                              // VkExtent3D                   extent;
+                       getExtent3D(m_params.dst.image),                // VkExtent3D                   extent;
                        1u,                                                                             // deUint32                             mipLevels;
-                       1u,                                                                             // deUint32                             arraySize;
+                       getArraySize(m_params.dst.image),               // deUint32                             arraySize;
                        VK_SAMPLE_COUNT_1_BIT,                                  // deUint32                             samples;
                        VK_IMAGE_TILING_OPTIMAL,                                // VkImageTiling                tiling;
                        VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
@@ -2093,24 +2050,28 @@ ResolveImageToImage::ResolveImageToImage (Context& context, TestParams params)
                VK_CHECK(vk.bindImageMemory(vkDevice, *m_destination, m_destinationImageAlloc->getMemory(), m_destinationImageAlloc->getOffset()));
        }
 
-       // Create color attachment view.
+       // Barriers for copying image to buffer
+       VkImageMemoryBarrier            srcImageBarrier         =
        {
-               const VkImageViewCreateInfo     colorAttachmentViewParams       =
-               {
-                       VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,               // VkStructureType                      sType;
-                       DE_NULL,                                                                                // const void*                          pNext;
-                       0u,                                                                                             // VkImageViewCreateFlags       flags;
-                       *m_multisampledImage,                                                   // VkImage                                      image;
-                       VK_IMAGE_VIEW_TYPE_2D,                                                  // VkImageViewType                      viewType;
-                       m_params.src.image.format,                                              // VkFormat                                     format;
-                       componentMappingRGBA,                                                   // VkComponentMapping           components;
-                       { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }   // VkImageSubresourceRange      subresourceRange;
-               };
-
-               sourceAttachmentView    = createImageView(vk, vkDevice, &colorAttachmentViewParams);
-       }
+               VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,         // VkStructureType                      sType;
+               DE_NULL,                                                                        // const void*                          pNext;
+               0u,                                                                                     // 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,                                        // deUint32                                     srcQueueFamilyIndex;
+               VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     dstQueueFamilyIndex;
+               m_multisampledImage.get(),                                      // VkImage                                      image;
+               {                                                                                       // VkImageSubresourceRange      subresourceRange;
+                       VK_IMAGE_ASPECT_COLOR_BIT,                      // VkImageAspectFlags   aspectMask;
+                       0u,                                                                     // deUint32                             baseMipLevel;
+                       1u,                                                                     // deUint32                             mipLevels;
+                       0u,                                                                     // deUint32                             baseArraySlice;
+                       getArraySize(m_params.src.image)        // deUint32                             arraySize;
+               }
+       };
 
-       // Create render pass.
+               // Create render pass.
        {
                const VkAttachmentDescription   attachmentDescriptions[1]       =
                {
@@ -2163,29 +2124,6 @@ ResolveImageToImage::ResolveImageToImage (Context& context, TestParams params)
                renderPass      = createRenderPass(vk, vkDevice, &renderPassParams);
        }
 
-       // Create framebuffer
-       {
-               const VkImageView                               attachments[1]          =
-               {
-                       *sourceAttachmentView,
-               };
-
-               const VkFramebufferCreateInfo   framebufferParams       =
-               {
-                       VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,                      // VkStructureType                              sType;
-                       DE_NULL,                                                                                        // const void*                                  pNext;
-                       0u,                                                                                                     // VkFramebufferCreateFlags             flags;
-                       *renderPass,                                                                            // VkRenderPass                                 renderPass;
-                       1u,                                                                                                     // deUint32                                             attachmentCount;
-                       attachments,                                                                            // const VkImageView*                   pAttachments;
-                       m_params.src.image.extent.width,                                        // deUint32                                             width;
-                       m_params.src.image.extent.height,                                       // deUint32                                             height;
-                       1u                                                                                                      // deUint32                                             layers;
-               };
-
-               framebuffer     = createFramebuffer(vk, vkDevice, &framebufferParams);
-       }
-
        // Create pipeline layout
        {
                const VkPipelineLayoutCreateInfo        pipelineLayoutParams    =
@@ -2202,197 +2140,18 @@ ResolveImageToImage::ResolveImageToImage (Context& context, TestParams params)
                pipelineLayout  = createPipelineLayout(vk, vkDevice, &pipelineLayoutParams);
        }
 
-       // Create shaders
-       {
-               vertexShaderModule              = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("vert"), 0);
-               fragmentShaderModule    = createShaderModule(vk, vkDevice, m_context.getBinaryCollection().get("frag"), 0);
-       }
-
-       // Create pipeline
        {
-               const VkPipelineShaderStageCreateInfo                   shaderStageParams[2]                            =
-               {
-                       {
-                               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,            // VkStructureType                                              sType;
-                               DE_NULL,                                                                                                        // const void*                                                  pNext;
-                               0u,                                                                                                                     // VkPipelineShaderStageCreateFlags             flags;
-                               VK_SHADER_STAGE_VERTEX_BIT,                                                                     // VkShaderStageFlagBits                                stage;
-                               *vertexShaderModule,                                                                            // VkShaderModule                                               module;
-                               "main",                                                                                                         // const char*                                                  pName;
-                               DE_NULL                                                                                                         // const VkSpecializationInfo*                  pSpecializationInfo;
-                       },
-                       {
-                               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,            // VkStructureType                                              sType;
-                               DE_NULL,                                                                                                        // const void*                                                  pNext;
-                               0u,                                                                                                                     // VkPipelineShaderStageCreateFlags             flags;
-                               VK_SHADER_STAGE_FRAGMENT_BIT,                                                           // VkShaderStageFlagBits                                stage;
-                               *fragmentShaderModule,                                                                          // VkShaderModule                                               module;
-                               "main",                                                                                                         // const char*                                                  pName;
-                               DE_NULL                                                                                                         // const VkSpecializationInfo*                  pSpecializationInfo;
-                       }
-               };
-
-               const VkVertexInputBindingDescription                   vertexInputBindingDescription           =
-               {
-                       0u,                                                                     // deUint32                             binding;
-                       sizeof(tcu::Vec4),                                      // deUint32                             stride;
-                       VK_VERTEX_INPUT_RATE_VERTEX                     // VkVertexInputRate    inputRate;
-               };
-
-               const VkVertexInputAttributeDescription                 vertexInputAttributeDescriptions[1]     =
-               {
-                       {
-                               0u,                                                                     // deUint32     location;
-                               0u,                                                                     // deUint32     binding;
-                               VK_FORMAT_R32G32B32A32_SFLOAT,          // VkFormat     format;
-                               0u                                                                      // deUint32     offset;
-                       }
-               };
-
-               const VkPipelineVertexInputStateCreateInfo              vertexInputStateParams                          =
-               {
-                       VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,              // VkStructureType                                                      sType;
-                       DE_NULL,                                                                                                                // const void*                                                          pNext;
-                       0u,                                                                                                                             // VkPipelineVertexInputStateCreateFlags        flags;
-                       1u,                                                                                                                             // deUint32                                                                     vertexBindingDescriptionCount;
-                       &vertexInputBindingDescription,                                                                 // const VkVertexInputBindingDescription*       pVertexBindingDescriptions;
-                       1u,                                                                                                                             // deUint32                                                                     vertexAttributeDescriptionCount;
-                       vertexInputAttributeDescriptions                                                                // const VkVertexInputAttributeDescription*     pVertexAttributeDescriptions;
-               };
-
-               const VkPipelineInputAssemblyStateCreateInfo    inputAssemblyStateParams                        =
-               {
-                       VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,    // VkStructureType                                                      sType;
-                       DE_NULL,                                                                                                                // const void*                                                          pNext;
-                       0u,                                                                                                                             // VkPipelineInputAssemblyStateCreateFlags      flags;
-                       VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,                                                    // VkPrimitiveTopology                                          topology;
-                       false                                                                                                                   // VkBool32                                                                     primitiveRestartEnable;
-               };
-
-               const VkViewport        viewport        =
-               {
-                       0.0f,                                                                           // float        x;
-                       0.0f,                                                                           // float        y;
-                       (float)m_params.src.image.extent.width,         // float        width;
-                       (float)m_params.src.image.extent.height,        // float        height;
-                       0.0f,                                                                           // float        minDepth;
-                       1.0f                                                                            // float        maxDepth;
-               };
-
-               const VkRect2D          scissor         =
-               {
-                       { 0, 0 },                                                                                                                               // VkOffset2D   offset;
-                       { m_params.src.image.extent.width, m_params.src.image.extent.height }   // VkExtent2D   extent;
-               };
-
-               const VkPipelineViewportStateCreateInfo                 viewportStateParams             =
-               {
-                       VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,                  // VkStructureType                                              sType;
-                       DE_NULL,                                                                                                                // const void*                                                  pNext;
-                       0u,                                                                                                                             // VkPipelineViewportStateCreateFlags   flags;
-                       1u,                                                                                                                             // deUint32                                                             viewportCount;
-                       &viewport,                                                                                                              // const VkViewport*                                    pViewports;
-                       1u,                                                                                                                             // deUint32                                                             scissorCount;
-                       &scissor                                                                                                                // const VkRect2D*                                              pScissors;
-               };
-
-               const VkPipelineRasterizationStateCreateInfo    rasterStateParams               =
-               {
-                       VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,             // VkStructureType                                                      sType;
-                       DE_NULL,                                                                                                                // const void*                                                          pNext;
-                       0u,                                                                                                                             // VkPipelineRasterizationStateCreateFlags      flags;
-                       false,                                                                                                                  // VkBool32                                                                     depthClampEnable;
-                       false,                                                                                                                  // VkBool32                                                                     rasterizerDiscardEnable;
-                       VK_POLYGON_MODE_FILL,                                                                                   // VkPolygonMode                                                        polygonMode;
-                       VK_CULL_MODE_NONE,                                                                                              // VkCullModeFlags                                                      cullMode;
-                       VK_FRONT_FACE_COUNTER_CLOCKWISE,                                                                // VkFrontFace                                                          frontFace;
-                       VK_FALSE,                                                                                                               // VkBool32                                                                     depthBiasEnable;
-                       0.0f,                                                                                                                   // float                                                                        depthBiasConstantFactor;
-                       0.0f,                                                                                                                   // float                                                                        depthBiasClamp;
-                       0.0f,                                                                                                                   // float                                                                        depthBiasSlopeFactor;
-                       1.0f                                                                                                                    // float                                                                        lineWidth;
-               };
-
-               const VkPipelineMultisampleStateCreateInfo      multisampleStateParams          =
-               {
-                       VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,               // VkStructureType                                                      sType;
-                       DE_NULL,                                                                                                                // const void*                                                          pNext;
-                       0u,                                                                                                                             // VkPipelineMultisampleStateCreateFlags        flags;
-                       rasterizationSamples,                                                                                   // VkSampleCountFlagBits                                        rasterizationSamples;
-                       VK_FALSE,                                                                                                               // VkBool32                                                                     sampleShadingEnable;
-                       0.0f,                                                                                                                   // float                                                                        minSampleShading;
-                       DE_NULL,                                                                                                                // const VkSampleMask*                                          pSampleMask;
-                       VK_FALSE,                                                                                                               // VkBool32                                                                     alphaToCoverageEnable;
-                       VK_FALSE                                                                                                                // VkBool32                                                                     alphaToOneEnable;
-               };
-
-               const VkPipelineColorBlendAttachmentState       colorBlendAttachmentState       =
-               {
-                       false,                                                                                                          // VkBool32                     blendEnable;
-                       VK_BLEND_FACTOR_ONE,                                                                            // VkBlend                      srcBlendColor;
-                       VK_BLEND_FACTOR_ZERO,                                                                           // VkBlend                      destBlendColor;
-                       VK_BLEND_OP_ADD,                                                                                        // VkBlendOp            blendOpColor;
-                       VK_BLEND_FACTOR_ONE,                                                                            // VkBlend                      srcBlendAlpha;
-                       VK_BLEND_FACTOR_ZERO,                                                                           // VkBlend                      destBlendAlpha;
-                       VK_BLEND_OP_ADD,                                                                                        // VkBlendOp            blendOpAlpha;
-                       (VK_COLOR_COMPONENT_R_BIT |
-                        VK_COLOR_COMPONENT_G_BIT |
-                        VK_COLOR_COMPONENT_B_BIT |
-                        VK_COLOR_COMPONENT_A_BIT)                                                                      // VkChannelFlags       channelWriteMask;
-               };
-
-               const VkPipelineColorBlendStateCreateInfo       colorBlendStateParams   =
-               {
-                       VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,       // VkStructureType                                                              sType;
-                       DE_NULL,                                                                                                        // const void*                                                                  pNext;
-                       0u,                                                                                                                     // VkPipelineColorBlendStateCreateFlags                 flags;
-                       false,                                                                                                          // VkBool32                                                                             logicOpEnable;
-                       VK_LOGIC_OP_COPY,                                                                                       // VkLogicOp                                                                    logicOp;
-                       1u,                                                                                                                     // deUint32                                                                             attachmentCount;
-                       &colorBlendAttachmentState,                                                                     // const VkPipelineColorBlendAttachmentState*   pAttachments;
-                       { 0.0f, 0.0f, 0.0f, 0.0f }                                                                      // float                                                                                blendConstants[4];
-               };
-
-               const VkGraphicsPipelineCreateInfo                      graphicsPipelineParams  =
-               {
-                       VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,        // VkStructureType                                                                      sType;
-                       DE_NULL,                                                                                        // const void*                                                                          pNext;
-                       0u,                                                                                                     // VkPipelineCreateFlags                                                        flags;
-                       2u,                                                                                                     // deUint32                                                                                     stageCount;
-                       shaderStageParams,                                                                      // const VkPipelineShaderStageCreateInfo*                       pStages;
-                       &vertexInputStateParams,                                                        // const VkPipelineVertexInputStateCreateInfo*          pVertexInputState;
-                       &inputAssemblyStateParams,                                                      // const VkPipelineInputAssemblyStateCreateInfo*        pInputAssemblyState;
-                       DE_NULL,                                                                                        // const VkPipelineTessellationStateCreateInfo*         pTessellationState;
-                       &viewportStateParams,                                                           // const VkPipelineViewportStateCreateInfo*                     pViewportState;
-                       &rasterStateParams,                                                                     // const VkPipelineRasterizationStateCreateInfo*        pRasterizationState;
-                       &multisampleStateParams,                                                        // const VkPipelineMultisampleStateCreateInfo*          pMultisampleState;
-                       DE_NULL,                                                                                        // const VkPipelineDepthStencilStateCreateInfo*         pDepthStencilState;
-                       &colorBlendStateParams,                                                         // const VkPipelineColorBlendStateCreateInfo*           pColorBlendState;
-                       DE_NULL,                                                                                        // const VkPipelineDynamicStateCreateInfo*                      pDynamicState;
-                       *pipelineLayout,                                                                        // VkPipelineLayout                                                                     layout;
-                       *renderPass,                                                                            // VkRenderPass                                                                         renderPass;
-                       0u,                                                                                                     // deUint32                                                                                     subpass;
-                       0u,                                                                                                     // VkPipeline                                                                           basePipelineHandle;
-                       0u                                                                                                      // deInt32                                                                                      basePipelineIndex;
-               };
-
-               graphicsPipeline        = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
+               const tcu::Vec4 a       (-1.0, -1.0, 0.0, 1.0);
+               const tcu::Vec4 b       (1.0, -1.0, 0.0, 1.0);
+               const tcu::Vec4 c       (1.0, 1.0, 0.0, 1.0);
+               // Add triangle.
+               vertices.push_back(a);
+               vertices.push_back(c);
+               vertices.push_back(b);
        }
 
        // Create vertex buffer.
        {
-               // Create upper half triangle.
-               {
-                       const tcu::Vec4 a       (-1.0, -1.0, 0.0, 1.0);
-                       const tcu::Vec4 b       (1.0, -1.0, 0.0, 1.0);
-                       const tcu::Vec4 c       (1.0, 1.0, 0.0, 1.0);
-
-                       // Add triangle.
-                       vertices.push_back(a);
-                       vertices.push_back(c);
-                       vertices.push_back(b);
-               }
-
                const VkDeviceSize                      vertexDataSize          = vertices.size() * sizeof(tcu::Vec4);
                const VkBufferCreateInfo        vertexBufferParams      =
                {
@@ -2416,128 +2175,268 @@ ResolveImageToImage::ResolveImageToImage (Context& context, TestParams params)
                flushMappedMemoryRange(vk, vkDevice, vertexBufferAlloc->getMemory(), vertexBufferAlloc->getOffset(), vertexDataSize);
        }
 
-       // Create command pool
        {
-               const VkCommandPoolCreateInfo cmdPoolParams =
-               {
-                       VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,             // VkStructureType                              sType;
-                       DE_NULL,                                                                                // const void*                                  pNext;
-                       VK_COMMAND_POOL_CREATE_TRANSIENT_BIT,                   // VkCommandPoolCreateFlags             flags;
-                       queueFamilyIndex,                                                               // deUint32                                             queueFamilyIndex;
-               };
-
-               cmdPool = createCommandPool(vk, vkDevice, &cmdPoolParams);
-       }
+               Move<VkFramebuffer>             framebuffer;
+               Move<VkImageView>               sourceAttachmentView;
+               const VkExtent3D                extent3D = getExtent3D(m_params.src.image);
 
-       // Create command buffer
-       {
-               const VkCommandBufferAllocateInfo cmdBufferAllocateInfo =
+               // Create color attachment view.
                {
-                       VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // VkStructureType                      sType;
-                       DE_NULL,                                                                                // const void*                          pNext;
-                       *cmdPool,                                                                               // VkCommandPool                        commandPool;
-                       VK_COMMAND_BUFFER_LEVEL_PRIMARY,                                // VkCommandBufferLevel level;
-                       1u                                                                                              // deUint32                             bufferCount;
-               };
+                       const VkImageViewCreateInfo     colorAttachmentViewParams       =
+                       {
+                               VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,                               // VkStructureType                      sType;
+                               DE_NULL,                                                                                                // const void*                          pNext;
+                               0u,                                                                                                             // VkImageViewCreateFlags       flags;
+                               *m_multisampledImage,                                                                   // VkImage                                      image;
+                               VK_IMAGE_VIEW_TYPE_2D,                                                                  // VkImageViewType                      viewType;
+                               m_params.src.image.format,                                                              // VkFormat                                     format;
+                               componentMappingRGBA,                                                                   // VkComponentMapping           components;
+                               { VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u }   // VkImageSubresourceRange      subresourceRange;
+                       };
+                       sourceAttachmentView    = createImageView(vk, vkDevice, &colorAttachmentViewParams);
+               }
 
-               const VkCommandBufferBeginInfo cmdBufferBeginInfo =
+               // Create framebuffer
                {
-                       VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,    // VkStructureType                                      sType;
-                       DE_NULL,                                                                                // const void*                                          pNext;
-                       0u,                                                                                             // VkCommandBufferUsageFlags            flags;
-                       (const VkCommandBufferInheritanceInfo*)DE_NULL,
-               };
+                       const VkImageView                               attachments[1]          =
+                       {
+                               *sourceAttachmentView,
+                       };
 
-               const VkClearValue clearValue = makeClearValueColorF32(0.0f, 0.0f, 1.0f, 1.0f);
+                       const VkFramebufferCreateInfo   framebufferParams       =
+                       {
+                               VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,      // VkStructureType                              sType;
+                               DE_NULL,                                                                        // const void*                                  pNext;
+                               0u,                                                                                     // VkFramebufferCreateFlags             flags;
+                               *renderPass,                                                            // VkRenderPass                                 renderPass;
+                               1u,                                                                                     // deUint32                                             attachmentCount;
+                               attachments,                                                            // const VkImageView*                   pAttachments;
+                               extent3D.width,                                                         // deUint32                                             width;
+                               extent3D.height,                                                        // deUint32                                             height;
+                               1u                                                                                      // deUint32                                             layers;
+                       };
 
-               const VkClearValue clearValues[1] =
-               {
-                       clearValue
-               };
+                       framebuffer     = createFramebuffer(vk, vkDevice, &framebufferParams);
+               }
 
-               const VkRenderPassBeginInfo renderPassBeginInfo =
+               // Create pipeline
                {
-                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,                               // VkStructureType              sType;
-                       DE_NULL,                                                                                                // const void*                  pNext;
-                       *renderPass,                                                                                    // VkRenderPass                 renderPass;
-                       *framebuffer,                                                                                   // VkFramebuffer                framebuffer;
+                       const VkPipelineShaderStageCreateInfo                   shaderStageParams[2]                            =
                        {
-                               { 0, 0 },
-                               { m_params.src.image.extent.width, m_params.src.image.extent.height }
-                       },                                                                                                              // VkRect2D                             renderArea;
-                       1u,                                                                                                             // deUint32                             clearValueCount;
-                       clearValues                                                                                             // const VkClearValue*  pClearValues;
-               };
+                               {
+                                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,            // VkStructureType                                              sType;
+                                       DE_NULL,                                                                                                        // const void*                                                  pNext;
+                                       0u,                                                                                                                     // VkPipelineShaderStageCreateFlags             flags;
+                                       VK_SHADER_STAGE_VERTEX_BIT,                                                                     // VkShaderStageFlagBits                                stage;
+                                       *vertexShaderModule,                                                                            // VkShaderModule                                               module;
+                                       "main",                                                                                                         // const char*                                                  pName;
+                                       DE_NULL                                                                                                         // const VkSpecializationInfo*                  pSpecializationInfo;
+                               },
+                               {
+                                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,            // VkStructureType                                              sType;
+                                       DE_NULL,                                                                                                        // const void*                                                  pNext;
+                                       0u,                                                                                                                     // VkPipelineShaderStageCreateFlags             flags;
+                                       VK_SHADER_STAGE_FRAGMENT_BIT,                                                           // VkShaderStageFlagBits                                stage;
+                                       *fragmentShaderModule,                                                                          // VkShaderModule                                               module;
+                                       "main",                                                                                                         // const char*                                                  pName;
+                                       DE_NULL                                                                                                         // const VkSpecializationInfo*                  pSpecializationInfo;
+                               }
+                       };
 
-               // Barriers for copying image to buffer
-               const VkImageMemoryBarrier              srcImageBarrier         =
-               {
-                       VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,         // VkStructureType                      sType;
-                       DE_NULL,                                                                        // const void*                          pNext;
-                       0u,                                                                                     // 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,                                        // deUint32                                     srcQueueFamilyIndex;
-                       VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     dstQueueFamilyIndex;
-                       m_multisampledImage.get(),                                      // VkImage                                      image;
-                       {                                                                                       // VkImageSubresourceRange      subresourceRange;
-                               VK_IMAGE_ASPECT_COLOR_BIT,              // VkImageAspectFlags   aspectMask;
-                               0u,                                                             // deUint32                             baseMipLevel;
-                               1u,                                                             // deUint32                             mipLevels;
-                               0u,                                                             // deUint32                             baseArraySlice;
-                               1u                                                              // deUint32                             arraySize;
-                       }
-               };
+                       const VkVertexInputBindingDescription                   vertexInputBindingDescription           =
+                       {
+                               0u,                                                                     // deUint32                             binding;
+                               sizeof(tcu::Vec4),                                      // deUint32                             stride;
+                               VK_VERTEX_INPUT_RATE_VERTEX                     // VkVertexInputRate    inputRate;
+                       };
+
+                       const VkVertexInputAttributeDescription                 vertexInputAttributeDescriptions[1]     =
+                       {
+                               {
+                                       0u,                                                                     // deUint32     location;
+                                       0u,                                                                     // deUint32     binding;
+                                       VK_FORMAT_R32G32B32A32_SFLOAT,          // VkFormat     format;
+                                       0u                                                                      // deUint32     offset;
+                               }
+                       };
 
-               cmdBuffer = allocateCommandBuffer(vk, vkDevice, &cmdBufferAllocateInfo);
+                       const VkPipelineVertexInputStateCreateInfo              vertexInputStateParams                          =
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,              // VkStructureType                                                      sType;
+                               DE_NULL,                                                                                                                // const void*                                                          pNext;
+                               0u,                                                                                                                             // VkPipelineVertexInputStateCreateFlags        flags;
+                               1u,                                                                                                                             // deUint32                                                                     vertexBindingDescriptionCount;
+                               &vertexInputBindingDescription,                                                                 // const VkVertexInputBindingDescription*       pVertexBindingDescriptions;
+                               1u,                                                                                                                             // deUint32                                                                     vertexAttributeDescriptionCount;
+                               vertexInputAttributeDescriptions                                                                // const VkVertexInputAttributeDescription*     pVertexAttributeDescriptions;
+                       };
 
-               VK_CHECK(vk.beginCommandBuffer(*cmdBuffer, &cmdBufferBeginInfo));
-               vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &srcImageBarrier);
-               vk.cmdBeginRenderPass(*cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+                       const VkPipelineInputAssemblyStateCreateInfo    inputAssemblyStateParams                        =
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,    // VkStructureType                                                      sType;
+                               DE_NULL,                                                                                                                // const void*                                                          pNext;
+                               0u,                                                                                                                             // VkPipelineInputAssemblyStateCreateFlags      flags;
+                               VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,                                                    // VkPrimitiveTopology                                          topology;
+                               false                                                                                                                   // VkBool32                                                                     primitiveRestartEnable;
+                       };
 
-               const VkDeviceSize      vertexBufferOffset      = 0u;
+                       const VkViewport        viewport        =
+                       {
+                               0.0f,                                                   // float        x;
+                               0.0f,                                                   // float        y;
+                               (float)extent3D.width,  // float        width;
+                               (float)extent3D.height, // float        height;
+                               0.0f,                                                   // float        minDepth;
+                               1.0f                                                    // float        maxDepth;
+                       };
 
-               vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *graphicsPipeline);
-               vk.cmdBindVertexBuffers(*cmdBuffer, 0, 1, &vertexBuffer.get(), &vertexBufferOffset);
-               vk.cmdDraw(*cmdBuffer, (deUint32)vertices.size(), 1, 0, 0);
+                       const VkRect2D          scissor         =
+                       {
+                               { 0, 0 },                                                                               // VkOffset2D   offset;
+                               { extent3D.width, extent3D.height }     // VkExtent2D   extent;
+                       };
 
-               vk.cmdEndRenderPass(*cmdBuffer);
+                       const VkPipelineViewportStateCreateInfo                 viewportStateParams             =
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,                  // VkStructureType                                              sType;
+                               DE_NULL,                                                                                                                // const void*                                                  pNext;
+                               0u,                                                                                                                             // VkPipelineViewportStateCreateFlags   flags;
+                               1u,                                                                                                                             // deUint32                                                             viewportCount;
+                               &viewport,                                                                                                              // const VkViewport*                                    pViewports;
+                               1u,                                                                                                                             // deUint32                                                             scissorCount;
+                               &scissor                                                                                                                // const VkRect2D*                                              pScissors;
+                       };
 
-               VK_CHECK(vk.endCommandBuffer(*cmdBuffer));
-       }
+                       const VkPipelineRasterizationStateCreateInfo    rasterStateParams               =
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,             // VkStructureType                                                      sType;
+                               DE_NULL,                                                                                                                // const void*                                                          pNext;
+                               0u,                                                                                                                             // VkPipelineRasterizationStateCreateFlags      flags;
+                               false,                                                                                                                  // VkBool32                                                                     depthClampEnable;
+                               false,                                                                                                                  // VkBool32                                                                     rasterizerDiscardEnable;
+                               VK_POLYGON_MODE_FILL,                                                                                   // VkPolygonMode                                                        polygonMode;
+                               VK_CULL_MODE_NONE,                                                                                              // VkCullModeFlags                                                      cullMode;
+                               VK_FRONT_FACE_COUNTER_CLOCKWISE,                                                                // VkFrontFace                                                          frontFace;
+                               VK_FALSE,                                                                                                               // VkBool32                                                                     depthBiasEnable;
+                               0.0f,                                                                                                                   // float                                                                        depthBiasConstantFactor;
+                               0.0f,                                                                                                                   // float                                                                        depthBiasClamp;
+                               0.0f,                                                                                                                   // float                                                                        depthBiasSlopeFactor;
+                               1.0f                                                                                                                    // float                                                                        lineWidth;
+                       };
 
-       // Create fence
-       {
-               const VkFenceCreateInfo fenceParams =
-               {
-                       VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,    // VkStructureType              sType;
-                       DE_NULL,                                                                // const void*                  pNext;
-                       0u                                                                              // VkFenceCreateFlags   flags;
-               };
+                       const VkPipelineMultisampleStateCreateInfo      multisampleStateParams          =
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,               // VkStructureType                                                      sType;
+                               DE_NULL,                                                                                                                // const void*                                                          pNext;
+                               0u,                                                                                                                             // VkPipelineMultisampleStateCreateFlags        flags;
+                               rasterizationSamples,                                                                                   // VkSampleCountFlagBits                                        rasterizationSamples;
+                               VK_FALSE,                                                                                                               // VkBool32                                                                     sampleShadingEnable;
+                               0.0f,                                                                                                                   // float                                                                        minSampleShading;
+                               DE_NULL,                                                                                                                // const VkSampleMask*                                          pSampleMask;
+                               VK_FALSE,                                                                                                               // VkBool32                                                                     alphaToCoverageEnable;
+                               VK_FALSE                                                                                                                // VkBool32                                                                     alphaToOneEnable;
+                       };
 
-               fence = createFence(vk, vkDevice, &fenceParams);
-       }
+                       const VkPipelineColorBlendAttachmentState       colorBlendAttachmentState       =
+                       {
+                               false,                                                                                                          // VkBool32                     blendEnable;
+                               VK_BLEND_FACTOR_ONE,                                                                            // VkBlend                      srcBlendColor;
+                               VK_BLEND_FACTOR_ZERO,                                                                           // VkBlend                      destBlendColor;
+                               VK_BLEND_OP_ADD,                                                                                        // VkBlendOp            blendOpColor;
+                               VK_BLEND_FACTOR_ONE,                                                                            // VkBlend                      srcBlendAlpha;
+                               VK_BLEND_FACTOR_ZERO,                                                                           // VkBlend                      destBlendAlpha;
+                               VK_BLEND_OP_ADD,                                                                                        // VkBlendOp            blendOpAlpha;
+                               (VK_COLOR_COMPONENT_R_BIT |
+                                VK_COLOR_COMPONENT_G_BIT |
+                                VK_COLOR_COMPONENT_B_BIT |
+                                VK_COLOR_COMPONENT_A_BIT)                                                                      // VkChannelFlags       channelWriteMask;
+                       };
 
-       // Queue submit.
-       {
-               const VkQueue                           queue           = m_context.getUniversalQueue();
-               const VkSubmitInfo                      submitInfo      =
+                       const VkPipelineColorBlendStateCreateInfo       colorBlendStateParams   =
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,       // VkStructureType                                                              sType;
+                               DE_NULL,                                                                                                        // const void*                                                                  pNext;
+                               0u,                                                                                                                     // VkPipelineColorBlendStateCreateFlags                 flags;
+                               false,                                                                                                          // VkBool32                                                                             logicOpEnable;
+                               VK_LOGIC_OP_COPY,                                                                                       // VkLogicOp                                                                    logicOp;
+                               1u,                                                                                                                     // deUint32                                                                             attachmentCount;
+                               &colorBlendAttachmentState,                                                                     // const VkPipelineColorBlendAttachmentState*   pAttachments;
+                               { 0.0f, 0.0f, 0.0f, 0.0f }                                                                      // float                                                                                blendConstants[4];
+                       };
+
+                       const VkGraphicsPipelineCreateInfo                      graphicsPipelineParams  =
+                       {
+                               VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,        // VkStructureType                                                                      sType;
+                               DE_NULL,                                                                                        // const void*                                                                          pNext;
+                               0u,                                                                                                     // VkPipelineCreateFlags                                                        flags;
+                               2u,                                                                                                     // deUint32                                                                                     stageCount;
+                               shaderStageParams,                                                                      // const VkPipelineShaderStageCreateInfo*                       pStages;
+                               &vertexInputStateParams,                                                        // const VkPipelineVertexInputStateCreateInfo*          pVertexInputState;
+                               &inputAssemblyStateParams,                                                      // const VkPipelineInputAssemblyStateCreateInfo*        pInputAssemblyState;
+                               DE_NULL,                                                                                        // const VkPipelineTessellationStateCreateInfo*         pTessellationState;
+                               &viewportStateParams,                                                           // const VkPipelineViewportStateCreateInfo*                     pViewportState;
+                               &rasterStateParams,                                                                     // const VkPipelineRasterizationStateCreateInfo*        pRasterizationState;
+                               &multisampleStateParams,                                                        // const VkPipelineMultisampleStateCreateInfo*          pMultisampleState;
+                               DE_NULL,                                                                                        // const VkPipelineDepthStencilStateCreateInfo*         pDepthStencilState;
+                               &colorBlendStateParams,                                                         // const VkPipelineColorBlendStateCreateInfo*           pColorBlendState;
+                               DE_NULL,                                                                                        // const VkPipelineDynamicStateCreateInfo*                      pDynamicState;
+                               *pipelineLayout,                                                                        // VkPipelineLayout                                                                     layout;
+                               *renderPass,                                                                            // VkRenderPass                                                                         renderPass;
+                               0u,                                                                                                     // deUint32                                                                                     subpass;
+                               0u,                                                                                                     // VkPipeline                                                                           basePipelineHandle;
+                               0u                                                                                                      // deInt32                                                                                      basePipelineIndex;
+                       };
+
+                       graphicsPipeline        = createGraphicsPipeline(vk, vkDevice, DE_NULL, &graphicsPipelineParams);
+               }
+
+               // Create command buffer
                {
-                       VK_STRUCTURE_TYPE_SUBMIT_INFO,
-                       DE_NULL,
-                       0u,
-                       (const VkSemaphore*)DE_NULL,
-                       (const VkPipelineStageFlags*)DE_NULL,
-                       1u,
-                       &cmdBuffer.get(),
-                       0u,
-                       (const VkSemaphore*)DE_NULL,
-               };
+                       const VkCommandBufferBeginInfo cmdBufferBeginInfo =
+                       {
+                               VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,    // VkStructureType                                      sType;
+                               DE_NULL,                                                                                // const void*                                          pNext;
+                               0u,                                                                                             // VkCommandBufferUsageFlags            flags;
+                               (const VkCommandBufferInheritanceInfo*)DE_NULL,
+                       };
+
+                       const VkClearValue clearValues[1] =
+                       {
+                               makeClearValueColorF32(0.0f, 0.0f, 1.0f, 1.0f),
+                       };
 
-               VK_CHECK(vk.resetFences(vkDevice, 1, &fence.get()));
-               VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *fence));
-               VK_CHECK(vk.waitForFences(vkDevice, 1, &fence.get(), true, ~(0ull) /* infinity */));
+                       const VkRenderPassBeginInfo renderPassBeginInfo =
+                       {
+                               VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,                               // VkStructureType              sType;
+                               DE_NULL,                                                                                                // const void*                  pNext;
+                               *renderPass,                                                                                    // VkRenderPass                 renderPass;
+                               *framebuffer,                                                                                   // VkFramebuffer                framebuffer;
+                               {
+                                       { 0, 0 },
+                                       { extent3D.width, extent3D.height }
+                               },                                                                                                              // VkRect2D                             renderArea;
+                               1u,                                                                                                             // deUint32                             clearValueCount;
+                               clearValues                                                                                             // const VkClearValue*  pClearValues;
+                       };
+
+                       VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
+                       vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &srcImageBarrier);
+                       vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+                       const VkDeviceSize      vertexBufferOffset      = 0u;
+
+                       vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *graphicsPipeline);
+                       vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer.get(), &vertexBufferOffset);
+                               vk.cmdDraw(*m_cmdBuffer, (deUint32)vertices.size(), 1, 0, 0);
+
+                       vk.cmdEndRenderPass(*m_cmdBuffer);
+                       VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
+               }
+
+               // Queue submit.
+               {
+                       const VkQueue   queue   = m_context.getUniversalQueue();
+                       submitCommandsAndWait (vk, vkDevice, queue, *m_cmdBuffer);
+               }
        }
 }
 
@@ -2546,19 +2445,31 @@ tcu::TestStatus ResolveImageToImage::iterate (void)
        const tcu::TextureFormat                srcTcuFormat            = mapVkFormat(m_params.src.image.format);
        const tcu::TextureFormat                dstTcuFormat            = mapVkFormat(m_params.dst.image.format);
 
-       m_sourceTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(srcTcuFormat,
-                                                                                                                                                               m_params.src.image.extent.width,
-                                                                                                                                                               m_params.src.image.extent.height,
-                                                                                                                                                               m_params.src.image.extent.depth));
-       generateBuffer(m_sourceTextureLevel->getAccess(), m_params.src.image.extent.width, m_params.src.image.extent.height, m_params.src.image.extent.depth, FILL_MODE_MULTISAMPLE);
-       m_destinationTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(dstTcuFormat,
-                                                                                                                                                                        (int)m_params.dst.image.extent.width,
-                                                                                                                                                                        (int)m_params.dst.image.extent.height,
-                                                                                                                                                                        (int)m_params.dst.image.extent.depth));
-       generateBuffer(m_destinationTextureLevel->getAccess(), m_params.dst.image.extent.width, m_params.dst.image.extent.height, m_params.dst.image.extent.depth);
-       generateExpectedResult();
+       // upload the destination image
+               m_destinationTextureLevel       = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(dstTcuFormat,
+                                                                                                                                                               (int)m_params.dst.image.extent.width,
+                                                                                                                                                               (int)m_params.dst.image.extent.height,
+                                                                                                                                                               (int)m_params.dst.image.extent.depth));
+               generateBuffer(m_destinationTextureLevel->getAccess(), m_params.dst.image.extent.width, m_params.dst.image.extent.height, m_params.dst.image.extent.depth);
+               uploadImage(m_destinationTextureLevel->getAccess(), m_destination.get(), m_params.dst.image);
+
+               m_sourceTextureLevel = de::MovePtr<tcu::TextureLevel>(new tcu::TextureLevel(srcTcuFormat,
+                                                                                                                                               (int)m_params.src.image.extent.width,
+                                                                                                                                               (int)m_params.src.image.extent.height,
+                                                                                                                                               (int)m_params.dst.image.extent.depth));
 
-       uploadImage(m_destinationTextureLevel->getAccess(), m_destination.get());
+               generateBuffer(m_sourceTextureLevel->getAccess(), m_params.src.image.extent.width, m_params.src.image.extent.height, m_params.dst.image.extent.depth, FILL_MODE_MULTISAMPLE);
+               generateExpectedResult();
+
+       switch (m_options)
+       {
+               case COPY_MS_IMAGE_TO_MS_IMAGE:
+               case COPY_MS_IMAGE_TO_ARRAY_MS_IMAGE:
+                       copyMSImageToMSImage();
+                       break;
+               default:
+                       break;
+       }
 
        const DeviceInterface&                  vk                                      = m_context.getDeviceInterface();
        const VkDevice                                  vkDevice                        = m_context.getDevice();
@@ -2575,7 +2486,7 @@ tcu::TestStatus ResolveImageToImage::iterate (void)
                {
                        VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,         // VkStructureType                      sType;
                        DE_NULL,                                                                        // const void*                          pNext;
-                       0u,                                                                                     // VkAccessFlags                        srcAccessMask;
+                       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;
@@ -2583,11 +2494,11 @@ tcu::TestStatus ResolveImageToImage::iterate (void)
                        VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     dstQueueFamilyIndex;
                        m_multisampledImage.get(),                                      // VkImage                                      image;
                        {                                                                                       // VkImageSubresourceRange      subresourceRange;
-                               getAspectFlags(srcTcuFormat),   // VkImageAspectFlags   aspectMask;
-                               0u,                                                             // deUint32                             baseMipLevel;
-                               1u,                                                             // deUint32                             mipLevels;
-                               0u,                                                             // deUint32                             baseArraySlice;
-                               1u                                                              // deUint32                             arraySize;
+                               getAspectFlags(srcTcuFormat),           // VkImageAspectFlags   aspectMask;
+                               0u,                                                                     // deUint32                             baseMipLevel;
+                               1u,                                                                     // deUint32                             mipLevels;
+                               0u,                                                                     // deUint32                             baseArraySlice;
+                               getArraySize(m_params.dst.image)        // deUint32                             arraySize;
                        }
                },
                // destination image
@@ -2602,11 +2513,11 @@ tcu::TestStatus ResolveImageToImage::iterate (void)
                        VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     dstQueueFamilyIndex;
                        m_destination.get(),                                            // VkImage                                      image;
                        {                                                                                       // VkImageSubresourceRange      subresourceRange;
-                               getAspectFlags(dstTcuFormat),   // VkImageAspectFlags   aspectMask;
-                               0u,                                                             // deUint32                             baseMipLevel;
-                               1u,                                                             // deUint32                             mipLevels;
-                               0u,                                                             // deUint32                             baseArraySlice;
-                               1u                                                              // deUint32                             arraySize;
+                               getAspectFlags(dstTcuFormat),           // VkImageAspectFlags   aspectMask;
+                               0u,                                                                     // deUint32                             baseMipLevel;
+                               1u,                                                                     // deUint32                             mipLevels;
+                               0u,                                                                     // deUint32                             baseArraySlice;
+                               getArraySize(m_params.dst.image)        // deUint32                             arraySize;
                        }
                },
        };
@@ -2622,13 +2533,13 @@ tcu::TestStatus ResolveImageToImage::iterate (void)
                VK_QUEUE_FAMILY_IGNORED,                                // deUint32                                     srcQueueFamilyIndex;
                VK_QUEUE_FAMILY_IGNORED,                                // deUint32                                     dstQueueFamilyIndex;
                m_destination.get(),                                    // VkImage                                      image;
-               {                                                                               // VkImageSubresourceRange      subresourceRange;
-                       getAspectFlags(dstTcuFormat),           // VkImageAspectFlags           aspectMask;
-                       0u,                                                                     // deUint32                                     baseMipLevel;
-                       1u,                                                                     // deUint32                                     mipLevels;
-                       0u,                                                                     // deUint32                                     baseArraySlice;
-                       1u                                                                      // deUint32                                     arraySize;
-               }
+                       {                                                                       // VkImageSubresourceRange      subresourceRange;
+                               getAspectFlags(dstTcuFormat),   // VkImageAspectFlags           aspectMask;
+                               0u,                                                             // deUint32                                     baseMipLevel;
+                               1u,                                                             // deUint32                                     mipLevels;
+                               0u,                                                             // deUint32                                     baseArraySlice;
+                               getArraySize(m_params.dst.image)// deUint32                                     arraySize;
+                       }
        };
 
        const VkCommandBufferBeginInfo  cmdBufferBeginInfo      =
@@ -2645,26 +2556,16 @@ tcu::TestStatus ResolveImageToImage::iterate (void)
        vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1, &postImageBarrier);
        VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
 
-       const VkSubmitInfo                              submitInfo                      =
-       {
-               VK_STRUCTURE_TYPE_SUBMIT_INFO,  // VkStructureType                      sType;
-               DE_NULL,                                                // const void*                          pNext;
-               0u,                                                             // deUint32                                     waitSemaphoreCount;
-               DE_NULL,                                                // const VkSemaphore*           pWaitSemaphores;
-               (const VkPipelineStageFlags*)DE_NULL,
-               1u,                                                             // deUint32                                     commandBufferCount;
-               &m_cmdBuffer.get(),                             // const VkCommandBuffer*       pCommandBuffers;
-               0u,                                                             // deUint32                                     signalSemaphoreCount;
-               DE_NULL                                                 // const VkSemaphore*           pSignalSemaphores;
-       };
-
-       VK_CHECK(vk.resetFences(vkDevice, 1, &m_fence.get()));
-       VK_CHECK(vk.queueSubmit(queue, 1, &submitInfo, *m_fence));
-       VK_CHECK(vk.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
+       submitCommandsAndWait (vk, vkDevice, queue, *m_cmdBuffer);
 
-       de::MovePtr<tcu::TextureLevel>  resultTextureLevel      = readImage(vk, vkDevice, queue, memAlloc, *m_destination, m_params.dst.image.format, m_params.dst.image.extent);
+       // check the result of resolving image
+       {
+               de::MovePtr<tcu::TextureLevel>  resultTextureLevel      = readImage(vk, vkDevice, queue, memAlloc, *m_destination, m_params.dst.image);
 
-       return checkTestResult(resultTextureLevel->getAccess());
+               if (QP_TEST_RESULT_PASS != checkTestResult(resultTextureLevel->getAccess()).getCode())
+                       return tcu::TestStatus::fail("CopiesAndBlitting test");
+       }
+       return tcu::TestStatus::pass("CopiesAndBlitting test");
 }
 
 tcu::TestStatus ResolveImageToImage::checkTestResult (tcu::ConstPixelBufferAccess result)
@@ -2672,44 +2573,173 @@ tcu::TestStatus ResolveImageToImage::checkTestResult (tcu::ConstPixelBufferAcces
        const tcu::ConstPixelBufferAccess       expected                = m_expectedTextureLevel->getAccess();
        const float                                                     fuzzyThreshold  = 0.01f;
 
-       if (!tcu::fuzzyCompare(m_context.getTestContext().getLog(), "Compare", "Result comparsion", expected, result, fuzzyThreshold, tcu::COMPARE_LOG_RESULT))
-               return tcu::TestStatus::fail("CopiesAndBlitting test");
+       for (int arrayLayerNdx = 0; arrayLayerNdx < (int)getArraySize(m_params.dst.image); ++arrayLayerNdx)
+       {
+               const tcu::ConstPixelBufferAccess       expectedSub     = getSubregion (expected, 0, 0, arrayLayerNdx, expected.getWidth(), expected.getHeight(), 1u);
+               const tcu::ConstPixelBufferAccess       resultSub       = getSubregion (result, 0, 0, arrayLayerNdx, result.getWidth(), result.getHeight(), 1u);
+               if (!tcu::fuzzyCompare(m_context.getTestContext().getLog(), "Compare", "Result comparsion", expectedSub, resultSub, fuzzyThreshold, tcu::COMPARE_LOG_RESULT))
+                       return tcu::TestStatus::fail("CopiesAndBlitting test");
+       }
 
        return tcu::TestStatus::pass("CopiesAndBlitting test");
 }
 
 void ResolveImageToImage::copyRegionToTextureLevel(tcu::ConstPixelBufferAccess src, tcu::PixelBufferAccess dst, CopyRegion region)
 {
-       VkOffset3D srcOffset    = region.imageCopy.srcOffset;
-       VkOffset3D dstOffset    = region.imageCopy.dstOffset;
-       VkExtent3D extent               = region.imageCopy.extent;
+       VkOffset3D srcOffset    = region.imageResolve.srcOffset;
+                       srcOffset.z             = region.imageResolve.srcSubresource.baseArrayLayer;
+       VkOffset3D dstOffset    = region.imageResolve.dstOffset;
+                       dstOffset.z             = region.imageResolve.dstSubresource.baseArrayLayer;
+       VkExtent3D extent               = region.imageResolve.extent;
 
-       const tcu::ConstPixelBufferAccess       srcSubRegion            = tcu::getSubregion(src, srcOffset.x, srcOffset.y, extent.width, extent.height);
+       const tcu::ConstPixelBufferAccess       srcSubRegion            = getSubregion (src, srcOffset.x, srcOffset.y, srcOffset.z, extent.width, extent.height, extent.depth);
        // CopyImage acts like a memcpy. Replace the destination format with the srcformat to use a memcpy.
        const tcu::PixelBufferAccess            dstWithSrcFormat        (srcSubRegion.getFormat(), dst.getSize(), dst.getDataPtr());
-       const tcu::PixelBufferAccess            dstSubRegion            = tcu::getSubregion(dstWithSrcFormat, dstOffset.x, dstOffset.y, extent.width, extent.height);
+       const tcu::PixelBufferAccess            dstSubRegion            = getSubregion (dstWithSrcFormat, dstOffset.x, dstOffset.y, dstOffset.z, extent.width, extent.height, extent.depth);
 
        tcu::copy(dstSubRegion, srcSubRegion);
 }
 
+void ResolveImageToImage::copyMSImageToMSImage (void)
+{
+       const DeviceInterface&                  vk                                      = m_context.getDeviceInterface();
+       const VkDevice                                  vkDevice                        = m_context.getDevice();
+       const VkQueue                                   queue                           = m_context.getUniversalQueue();
+       const tcu::TextureFormat                srcTcuFormat            = mapVkFormat(m_params.src.image.format);
+       std::vector<VkImageCopy>                imageCopies;
+
+       for (deUint32 layerNdx = 0; layerNdx < getArraySize(m_params.dst.image); ++layerNdx)
+       {
+               const VkImageSubresourceLayers  sourceSubresourceLayers =
+               {
+                       getAspectFlags(srcTcuFormat),   // VkImageAspectFlags   aspectMask;
+                       0u,                                                             // uint32_t                             mipLevel;
+                       0u,                                                             // uint32_t                             baseArrayLayer;
+                       1u                                                              // uint32_t                             layerCount;
+               };
+
+               const VkImageSubresourceLayers  destinationSubresourceLayers    =
+               {
+                       getAspectFlags(srcTcuFormat),   // VkImageAspectFlags   aspectMask;//getAspectFlags(dstTcuFormat)
+                       0u,                                                             // uint32_t                             mipLevel;
+                       layerNdx,                                               // uint32_t                             baseArrayLayer;
+                       1u                                                              // uint32_t                             layerCount;
+               };
+
+               const VkImageCopy                               imageCopy       =
+               {
+                       sourceSubresourceLayers,                        // VkImageSubresourceLayers     srcSubresource;
+                       {0, 0, 0},                                                      // VkOffset3D                           srcOffset;
+                       destinationSubresourceLayers,           // VkImageSubresourceLayers     dstSubresource;
+                       {0, 0, 0},                                                      // VkOffset3D                           dstOffset;
+                        getExtent3D(m_params.src.image),       // VkExtent3D                           extent;
+               };
+               imageCopies.push_back(imageCopy);
+       }
+
+       const VkImageMemoryBarrier              imageBarriers[]         =
+       {
+               //// source image
+               {
+                       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,                                        // deUint32                                     srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     dstQueueFamilyIndex;
+                       m_multisampledImage.get(),                                      // VkImage                                      image;
+                       {                                                                                       // VkImageSubresourceRange      subresourceRange;
+                               getAspectFlags(srcTcuFormat),           // VkImageAspectFlags   aspectMask;
+                               0u,                                                                     // deUint32                             baseMipLevel;
+                               1u,                                                                     // deUint32                             mipLevels;
+                               0u,                                                                     // deUint32                             baseArraySlice;
+                               getArraySize(m_params.src.image)        // deUint32                             arraySize;
+                       }
+               },
+               // destination image
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,         // VkStructureType                      sType;
+                       DE_NULL,                                                                        // const void*                          pNext;
+                       0,                                                                                      // VkAccessFlags                        srcAccessMask;
+                       VK_ACCESS_TRANSFER_WRITE_BIT,                           // VkAccessFlags                        dstAccessMask;
+                       VK_IMAGE_LAYOUT_UNDEFINED,                                      // VkImageLayout                        oldLayout;
+                       VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,           // VkImageLayout                        newLayout;
+                       VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     dstQueueFamilyIndex;
+                       m_multisampledCopyImage.get(),                          // VkImage                                      image;
+                       {                                                                                       // VkImageSubresourceRange      subresourceRange;
+                               getAspectFlags(srcTcuFormat),           // VkImageAspectFlags   aspectMask;
+                               0u,                                                                     // deUint32                             baseMipLevel;
+                               1u,                                                                     // deUint32                             mipLevels;
+                               0u,                                                                     // deUint32                             baseArraySlice;
+                               getArraySize(m_params.dst.image)        // deUint32                             arraySize;
+                       }
+               },
+       };
+
+       const VkImageMemoryBarrier      postImageBarriers               =
+       // source image
+       {
+               VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,         // VkStructureType                      sType;
+               DE_NULL,                                                                        // const void*                          pNext;
+               VK_ACCESS_TRANSFER_WRITE_BIT,                           // VkAccessFlags                        srcAccessMask;
+               VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,           // VkAccessFlags                        dstAccessMask;
+               VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,           // VkImageLayout                        oldLayout;
+               VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,       // VkImageLayout                        newLayout;
+               VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     srcQueueFamilyIndex;
+               VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     dstQueueFamilyIndex;
+               m_multisampledCopyImage.get(),                          // VkImage                                      image;
+               {                                                                                       // VkImageSubresourceRange      subresourceRange;
+                       getAspectFlags(srcTcuFormat),           // VkImageAspectFlags   aspectMask;
+                       0u,                                                                     // deUint32                             baseMipLevel;
+                       1u,                                                                     // deUint32                             mipLevels;
+                       0u,                                                                     // deUint32                             baseArraySlice;
+                       getArraySize(m_params.dst.image)        // deUint32                             arraySize;
+               }
+       };
+
+       const VkCommandBufferBeginInfo  cmdBufferBeginInfo      =
+       {
+               VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,                    // VkStructureType                                      sType;
+               DE_NULL,                                                                                                // const void*                                          pNext;
+               VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,                    // VkCommandBufferUsageFlags            flags;
+               (const VkCommandBufferInheritanceInfo*)DE_NULL,
+       };
+
+       VK_CHECK(vk.beginCommandBuffer(*m_cmdBuffer, &cmdBufferBeginInfo));
+       vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, DE_LENGTH_OF_ARRAY(imageBarriers), imageBarriers);
+       vk.cmdCopyImage(*m_cmdBuffer, m_multisampledImage.get(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, m_multisampledCopyImage.get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (deUint32)imageCopies.size(), imageCopies.data());
+       vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 0, (const VkBufferMemoryBarrier*)DE_NULL, 1u, &postImageBarriers);
+       VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
+
+       submitCommandsAndWait (vk, vkDevice, queue, *m_cmdBuffer);
+
+       m_multisampledImage = m_multisampledCopyImage;
+}
+
 class ResolveImageToImageTestCase : public vkt::TestCase
 {
 public:
-                                                       ResolveImageToImageTestCase     (tcu::TestContext&              testCtx,
-                                                                                                                const std::string&             name,
-                                                                                                                const std::string&             description,
-                                                                                                                const TestParams               params)
+                                                       ResolveImageToImageTestCase     (tcu::TestContext&                                      testCtx,
+                                                                                                                const std::string&                                     name,
+                                                                                                                const std::string&                                     description,
+                                                                                                                const TestParams                                       params,
+                                                                                                                const ResolveImageToImageOptions       options = NO_OPTIONAL_OPERATION)
                                                                : vkt::TestCase (testCtx, name, description)
                                                                , m_params              (params)
+                                                               , m_options             (options)
                                                        {}
        virtual void                    initPrograms                            (SourceCollections&             programCollection) const;
 
        virtual TestInstance*   createInstance                          (Context&                               context) const
                                                        {
-                                                               return new ResolveImageToImage(context, m_params);
+                                                               return new ResolveImageToImage(context, m_params, m_options);
                                                        }
 private:
-       TestParams                              m_params;
+       TestParams                                                      m_params;
+       const ResolveImageToImageOptions        m_options;
 };
 
 void ResolveImageToImageTestCase::initPrograms (SourceCollections& programCollection) const
@@ -2722,7 +2752,6 @@ void ResolveImageToImageTestCase::initPrograms (SourceCollections& programCollec
                "       gl_Position = a_position;\n"
                "}\n");
 
-
        programCollection.glslSources.add("frag") << glu::FragmentSource(
                "#version 310 es\n"
                "layout (location = 0) out highp vec4 o_color;\n"
@@ -2757,7 +2786,7 @@ void addCopyImageTestsAllFormats (tcu::TestCaseGroup*     testCaseGroup,
                VK_FORMAT_R8_SINT,
                VK_FORMAT_R8_SRGB,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
        };
        const VkFormat  compatibleFormats16Bit[]                =
        {
@@ -2783,7 +2812,7 @@ void addCopyImageTestsAllFormats (tcu::TestCaseGroup*     testCaseGroup,
                VK_FORMAT_R16_SINT,
                VK_FORMAT_R16_SFLOAT,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
         };
        const VkFormat  compatibleFormats24Bit[]                =
        {
@@ -2802,7 +2831,7 @@ void addCopyImageTestsAllFormats (tcu::TestCaseGroup*     testCaseGroup,
                VK_FORMAT_B8G8R8_SINT,
                VK_FORMAT_B8G8R8_SRGB,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
         };
        const VkFormat  compatibleFormats32Bit[]                =
        {
@@ -2850,7 +2879,7 @@ void addCopyImageTestsAllFormats (tcu::TestCaseGroup*     testCaseGroup,
                VK_FORMAT_R32_SINT,
                VK_FORMAT_R32_SFLOAT,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
         };
        const VkFormat  compatibleFormats48Bit[]                =
        {
@@ -2862,7 +2891,7 @@ void addCopyImageTestsAllFormats (tcu::TestCaseGroup*     testCaseGroup,
                VK_FORMAT_R16G16B16_SINT,
                VK_FORMAT_R16G16B16_SFLOAT,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
         };
        const VkFormat  compatibleFormats64Bit[]                =
        {
@@ -2880,7 +2909,7 @@ void addCopyImageTestsAllFormats (tcu::TestCaseGroup*     testCaseGroup,
                VK_FORMAT_R64_SINT,
                VK_FORMAT_R64_SFLOAT,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
         };
        const VkFormat  compatibleFormats96Bit[]                =
        {
@@ -2888,7 +2917,7 @@ void addCopyImageTestsAllFormats (tcu::TestCaseGroup*     testCaseGroup,
                VK_FORMAT_R32G32B32_SINT,
                VK_FORMAT_R32G32B32_SFLOAT,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
         };
        const VkFormat  compatibleFormats128Bit[]               =
        {
@@ -2899,7 +2928,7 @@ void addCopyImageTestsAllFormats (tcu::TestCaseGroup*     testCaseGroup,
                VK_FORMAT_R64G64_SINT,
                VK_FORMAT_R64G64_SFLOAT,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
         };
        const VkFormat  compatibleFormats192Bit[]               =
        {
@@ -2907,7 +2936,7 @@ void addCopyImageTestsAllFormats (tcu::TestCaseGroup*     testCaseGroup,
                VK_FORMAT_R64G64B64_SINT,
                VK_FORMAT_R64G64B64_SFLOAT,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
         };
        const VkFormat  compatibleFormats256Bit[]               =
        {
@@ -2915,7 +2944,7 @@ void addCopyImageTestsAllFormats (tcu::TestCaseGroup*     testCaseGroup,
                VK_FORMAT_R64G64B64A64_SINT,
                VK_FORMAT_R64G64B64A64_SFLOAT,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
        };
 
        const VkFormat* colorImageFormatsToTest[]               =
@@ -2936,10 +2965,10 @@ void addCopyImageTestsAllFormats (tcu::TestCaseGroup*   testCaseGroup,
        for (size_t compatibleFormatsIndex = 0; compatibleFormatsIndex < numOfColorImageFormatsToTest; ++compatibleFormatsIndex)
        {
                const VkFormat* compatibleFormats       = colorImageFormatsToTest[compatibleFormatsIndex];
-               for (size_t srcFormatIndex = 0; compatibleFormats[srcFormatIndex] != VK_FORMAT_LAST; ++srcFormatIndex)
+               for (size_t srcFormatIndex = 0; compatibleFormats[srcFormatIndex] != VK_FORMAT_UNDEFINED; ++srcFormatIndex)
                {
                        params.src.image.format = compatibleFormats[srcFormatIndex];
-                       for (size_t dstFormatIndex = 0; compatibleFormats[dstFormatIndex] != VK_FORMAT_LAST; ++dstFormatIndex)
+                       for (size_t dstFormatIndex = 0; compatibleFormats[dstFormatIndex] != VK_FORMAT_UNDEFINED; ++dstFormatIndex)
                        {
                                params.dst.image.format = compatibleFormats[dstFormatIndex];
                                std::ostringstream      testName;
@@ -2982,7 +3011,7 @@ void addBlittingTestsAllFormats (tcu::TestCaseGroup*      testCaseGroup,
                VK_FORMAT_R64G64B64_UINT,
                VK_FORMAT_R64G64B64A64_UINT,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
        };
        const VkFormat  compatibleFormatsSInts[]                        =
        {
@@ -3008,7 +3037,7 @@ void addBlittingTestsAllFormats (tcu::TestCaseGroup*      testCaseGroup,
                VK_FORMAT_R64G64B64_SINT,
                VK_FORMAT_R64G64B64A64_SINT,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
        };
        const VkFormat  compatibleFormatsFloats[]                       =
        {
@@ -3119,7 +3148,7 @@ void addBlittingTestsAllFormats (tcu::TestCaseGroup*      testCaseGroup,
 //             VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
 //             VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
        };
        const VkFormat  compatibleFormatsSrgb[]                         =
        {
@@ -3153,7 +3182,7 @@ void addBlittingTestsAllFormats (tcu::TestCaseGroup*      testCaseGroup,
 //             VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
 //             VK_FORMAT_ASTC_12x12_SRGB_BLOCK,
 
-               VK_FORMAT_LAST
+               VK_FORMAT_UNDEFINED
        };
 
        const struct {
@@ -3172,10 +3201,10 @@ void addBlittingTestsAllFormats (tcu::TestCaseGroup*    testCaseGroup,
        {
                const VkFormat* compatibleFormats       = colorImageFormatsToTest[compatibleFormatsIndex].compatibleFormats;
                const bool              onlyNearest                     = colorImageFormatsToTest[compatibleFormatsIndex].onlyNearest;
-               for (size_t srcFormatIndex = 0; compatibleFormats[srcFormatIndex] != VK_FORMAT_LAST; ++srcFormatIndex)
+               for (size_t srcFormatIndex = 0; compatibleFormats[srcFormatIndex] != VK_FORMAT_UNDEFINED; ++srcFormatIndex)
                {
                        params.src.image.format = compatibleFormats[srcFormatIndex];
-                       for (size_t dstFormatIndex = 0; compatibleFormats[dstFormatIndex] != VK_FORMAT_LAST; ++dstFormatIndex)
+                       for (size_t dstFormatIndex = 0; compatibleFormats[dstFormatIndex] != VK_FORMAT_UNDEFINED; ++dstFormatIndex)
                        {
                                params.dst.image.format = compatibleFormats[dstFormatIndex];
                                std::ostringstream      testName;
@@ -3233,10 +3262,11 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
        // Copy image to image testcases.
        {
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UINT;
-               params.src.image.extent = defaultExtent;
-               params.dst.image.format = VK_FORMAT_R8G8B8A8_UINT;
-               params.dst.image.extent = defaultExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UINT;
+               params.src.image.extent         = defaultExtent;
+               params.dst.image.format         = VK_FORMAT_R8G8B8A8_UINT;
+               params.dst.image.extent         = defaultExtent;
 
                {
                        const VkImageCopy                               testCopy        =
@@ -3259,10 +3289,12 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
 
        {
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UINT;
-               params.src.image.extent = defaultExtent;
-               params.dst.image.format = VK_FORMAT_R32_UINT;
-               params.dst.image.extent = defaultExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UINT;
+               params.src.image.extent         = defaultExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.format         = VK_FORMAT_R32_UINT;
+               params.dst.image.extent         = defaultExtent;
 
                {
                        const VkImageCopy                               testCopy        =
@@ -3285,10 +3317,12 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
 
        {
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UINT;
-               params.src.image.extent = defaultExtent;
-               params.dst.image.format = VK_FORMAT_R8G8B8A8_UINT;
-               params.dst.image.extent = defaultExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UINT;
+               params.src.image.extent         = defaultExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.format         = VK_FORMAT_R8G8B8A8_UINT;
+               params.dst.image.extent         = defaultExtent;
 
                {
                        const VkImageCopy                               testCopy        =
@@ -3311,10 +3345,12 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
 
        {
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_D32_SFLOAT;
-               params.src.image.extent = defaultExtent;
-               params.dst.image.format = VK_FORMAT_D32_SFLOAT;
-               params.dst.image.extent = defaultExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_D32_SFLOAT;
+               params.src.image.extent         = defaultExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.format         = VK_FORMAT_D32_SFLOAT;
+               params.dst.image.extent         = defaultExtent;
 
                {
                        const VkImageSubresourceLayers  sourceLayer =
@@ -3344,10 +3380,12 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
 
        {
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_S8_UINT;
-               params.src.image.extent = defaultExtent;
-               params.dst.image.format = VK_FORMAT_S8_UINT;
-               params.dst.image.extent = defaultExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_S8_UINT;
+               params.src.image.extent         = defaultExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.format         = VK_FORMAT_S8_UINT;
+               params.dst.image.extent         = defaultExtent;
 
                {
                        const VkImageSubresourceLayers  sourceLayer =
@@ -3377,8 +3415,10 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
 
        {
                TestParams                      params;
-               params.src.image.extent = defaultExtent;
-               params.dst.image.extent = defaultExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.extent         = defaultExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.extent         = defaultExtent;
 
                for (deInt32 i = 0; i < defaultSize; i += defaultFourthSize)
                {
@@ -3405,9 +3445,10 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
        // Copy image to buffer testcases.
        {
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UINT;
-               params.src.image.extent = defaultExtent;
-               params.dst.buffer.size  = defaultSize * defaultSize;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UINT;
+               params.src.image.extent         = defaultExtent;
+               params.dst.buffer.size          = defaultSize * defaultSize;
 
                const VkBufferImageCopy                 bufferImageCopy =
                {
@@ -3429,9 +3470,10 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
        // Copy buffer to image testcases.
        {
                TestParams                      params;
-               params.src.buffer.size  = defaultSize * defaultSize;
-               params.dst.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.dst.image.extent = defaultExtent;
+               params.src.buffer.size          = defaultSize * defaultSize;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.format         = VK_FORMAT_R8G8B8A8_UINT;
+               params.dst.image.extent         = defaultExtent;
 
                const VkBufferImageCopy                 bufferImageCopy =
                {
@@ -3519,9 +3561,11 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                const std::string       testName        ("whole");
 
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.src.image.extent = defaultExtent;
-               params.dst.image.extent = defaultExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.src.image.extent         = defaultExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.extent         = defaultExtent;
 
                {
                        const VkImageBlit                               imageBlit       =
@@ -3582,9 +3626,11 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                const std::string       testName        ("scaling_whole1");
 
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.src.image.extent = defaultExtent;
-               params.dst.image.extent = defaultHalfExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.src.image.extent         = defaultExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.extent         = defaultHalfExtent;
 
                {
                        const VkImageBlit                               imageBlit       =
@@ -3645,9 +3691,11 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                const std::string       testName        ("scaling_whole2");
 
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.src.image.extent = defaultHalfExtent;
-               params.dst.image.extent = defaultExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.src.image.extent         = defaultHalfExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.extent         = defaultExtent;
 
                {
                        const VkImageBlit                               imageBlit       =
@@ -3708,9 +3756,11 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                const std::string       testName        ("scaling_and_offset");
 
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.src.image.extent = defaultExtent;
-               params.dst.image.extent = defaultExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.src.image.extent         = defaultExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.extent         = defaultExtent;
 
                {
                        const VkImageBlit                               imageBlit       =
@@ -3740,7 +3790,6 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                        params.dst.image.format = VK_FORMAT_R8G8B8A8_UNORM;
                        blitImgSimpleTests->addChild(new BlittingTestCase(testCtx, testName + "_nearest", description, params));
 
-
                        params.dst.image.format = VK_FORMAT_R32_SFLOAT;
                        const std::string       descriptionOfRGBAToR32  (description + " and different formats (R8G8B8A8 -> R32)");
                        blitImgSimpleTests->addChild(new BlittingTestCase(testCtx, testName + getFormatCaseName(params.dst.image.format) + "_nearest", descriptionOfRGBAToR32, params));
@@ -3772,9 +3821,11 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                const std::string       testName        ("without_scaling_partial");
 
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.src.image.extent = defaultExtent;
-               params.dst.image.extent = defaultExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.src.image.extent         = defaultExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.extent         = defaultExtent;
 
                {
                        CopyRegion      region;
@@ -3806,7 +3857,6 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                        params.dst.image.format = VK_FORMAT_R8G8B8A8_UNORM;
                        blitImgSimpleTests->addChild(new BlittingTestCase(testCtx, testName + "_nearest", description, params));
 
-
                        params.dst.image.format = VK_FORMAT_R32_SFLOAT;
                        const std::string       descriptionOfRGBAToR32  (description + " and different formats (R8G8B8A8 -> R32)");
                        blitImgSimpleTests->addChild(new BlittingTestCase(testCtx, testName + getFormatCaseName(params.dst.image.format) + "_nearest", descriptionOfRGBAToR32, params));
@@ -3840,8 +3890,10 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                // Test Color formats.
                {
                        TestParams      params;
-                       params.src.image.extent = defaultExtent;
-                       params.dst.image.extent = defaultExtent;
+                       params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+                       params.src.image.extent         = defaultExtent;
+                       params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+                       params.dst.image.extent         = defaultExtent;
 
                        CopyRegion      region;
                        for (int i = 0, j = 1; (i + defaultFourthSize / j < defaultSize) && (defaultFourthSize > j); i += defaultFourthSize / j++)
@@ -3903,10 +3955,12 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                        {
                                TestParams params;
 
-                               params.src.image.extent = defaultExtent;
-                               params.dst.image.extent = defaultExtent;
-                               params.src.image.format = compatibleDepthAndStencilFormats[compatibleFormatsIndex];
-                               params.dst.image.format = params.src.image.format;
+                               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+                               params.src.image.extent         = defaultExtent;
+                               params.dst.image.extent         = defaultExtent;
+                               params.src.image.format         = compatibleDepthAndStencilFormats[compatibleFormatsIndex];
+                               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+                               params.dst.image.format         = params.src.image.format;
                                std::ostringstream      oss;
                                oss << testName << "_" << getFormatCaseName(params.src.image.format) << "_" << getFormatCaseName(params.dst.image.format);
 
@@ -3987,7 +4041,6 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
        blittingImageTests->addChild(blitImgSimpleTests.release());
        blittingImageTests->addChild(blitImgAllFormatsTests.release());
 
-
        // Resolve image to image testcases.
        const VkSampleCountFlagBits     samples[]               =
        {
@@ -4005,10 +4058,12 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                const std::string       testName        ("whole");
 
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.src.image.extent = resolveExtent;
-               params.dst.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.dst.image.extent = resolveExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.src.image.extent         = resolveExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.dst.image.extent         = resolveExtent;
 
                {
                        const VkImageSubresourceLayers  sourceLayer     =
@@ -4046,10 +4101,12 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                const std::string       testName        ("partial");
 
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.src.image.extent = resolveExtent;
-               params.dst.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.dst.image.extent = resolveExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.src.image.extent         = resolveExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.dst.image.extent         = resolveExtent;
 
                {
                        const VkImageSubresourceLayers  sourceLayer     =
@@ -4087,10 +4144,12 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                const std::string       testName        ("with_regions");
 
                TestParams                      params;
-               params.src.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.src.image.extent = resolveExtent;
-               params.dst.image.format = VK_FORMAT_R8G8B8A8_UNORM;
-               params.dst.image.extent = resolveExtent;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.src.image.extent         = resolveExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.dst.image.extent         = resolveExtent;
 
                {
                        const VkImageSubresourceLayers  sourceLayer     =
@@ -4127,6 +4186,96 @@ tcu::TestCaseGroup* createCopiesAndBlittingTests (tcu::TestContext& testCtx)
                }
        }
 
+       {
+               const std::string       description     ("Resolve from image to image");
+               const std::string       testName        ("whole_copy_before_resolving");
+
+               TestParams                      params;
+               params.src.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.src.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.src.image.extent         = defaultExtent;
+               params.dst.image.imageType      = VK_IMAGE_TYPE_2D;
+               params.dst.image.format         = VK_FORMAT_R8G8B8A8_UNORM;
+               params.dst.image.extent         = defaultExtent;
+
+               {
+                       const VkImageSubresourceLayers  sourceLayer     =
+                       {
+                               VK_IMAGE_ASPECT_COLOR_BIT,      // VkImageAspectFlags   aspectMask;
+                               0u,                                                     // uint32_t                             mipLevel;
+                               0u,                                                     // uint32_t                             baseArrayLayer;
+                               1u                                                      // uint32_t                             layerCount;
+                       };
+
+                       const VkImageResolve                    testResolve     =
+                       {
+                               sourceLayer,            // VkImageSubresourceLayers     srcSubresource;
+                               {0, 0, 0},                      // VkOffset3D                           srcOffset;
+                               sourceLayer,            // VkImageSubresourceLayers     dstSubresource;
+                               {0, 0, 0},                      // VkOffset3D                           dstOffset;
+                               defaultExtent,          // VkExtent3D                           extent;
+                       };
+
+                       CopyRegion      imageResolve;
+                       imageResolve.imageResolve       = testResolve;
+                       params.regions.push_back(imageResolve);
+               }
+
+               for (int samplesIndex = 0; samplesIndex < DE_LENGTH_OF_ARRAY(samples); ++samplesIndex)
+               {
+                       params.samples = samples[samplesIndex];
+                       std::ostringstream caseName;
+                       caseName << testName << "_" << getSampleCountCaseName(samples[samplesIndex]);
+                       resolveImageTests->addChild(new ResolveImageToImageTestCase(testCtx, caseName.str(), description, params, COPY_MS_IMAGE_TO_MS_IMAGE));
+               }
+       }
+
+       {
+               const std::string       description     ("Resolve from image to image");
+               const std::string       testName        ("whole_array_image");
+
+               TestParams                      params;
+               params.src.image.imageType              = VK_IMAGE_TYPE_2D;
+               params.src.image.format                 = VK_FORMAT_R8G8B8A8_UNORM;
+               params.src.image.extent                 = defaultExtent;
+               params.dst.image.imageType              = VK_IMAGE_TYPE_2D;
+               params.dst.image.format                 = VK_FORMAT_R8G8B8A8_UNORM;
+               params.dst.image.extent                 = defaultExtent;
+               params.dst.image.extent.depth   = 5u;
+
+               for (deUint32 layerNdx=0; layerNdx < params.dst.image.extent.depth; ++layerNdx)
+               {
+                       const VkImageSubresourceLayers  sourceLayer     =
+                       {
+                               VK_IMAGE_ASPECT_COLOR_BIT,              // VkImageAspectFlags   aspectMask;
+                               0u,                                                             // uint32_t                             mipLevel;
+                               layerNdx,                                               // uint32_t                             baseArrayLayer;
+                               1u                                                              // uint32_t                             layerCount;
+                       };
+
+                       const VkImageResolve                    testResolve     =
+                       {
+                               sourceLayer,            // VkImageSubresourceLayers     srcSubresource;
+                               {0, 0, 0},                      // VkOffset3D                           srcOffset;
+                               sourceLayer,            // VkImageSubresourceLayers     dstSubresource;
+                               {0, 0, 0},                      // VkOffset3D                           dstOffset;
+                               defaultExtent,          // VkExtent3D                           extent;
+                       };
+
+                       CopyRegion      imageResolve;
+                       imageResolve.imageResolve       = testResolve;
+                       params.regions.push_back(imageResolve);
+               }
+
+               for (int samplesIndex = 0; samplesIndex < DE_LENGTH_OF_ARRAY(samples); ++samplesIndex)
+               {
+                       params.samples = samples[samplesIndex];
+                       std::ostringstream caseName;
+                       caseName << testName << "_" << getSampleCountCaseName(samples[samplesIndex]);
+                       resolveImageTests->addChild(new ResolveImageToImageTestCase(testCtx, caseName.str(), description, params, COPY_MS_IMAGE_TO_ARRAY_MS_IMAGE));
+               }
+       }
+
        copiesAndBlittingTests->addChild(imageToImageTests.release());
        copiesAndBlittingTests->addChild(imageToBufferTests.release());
        copiesAndBlittingTests->addChild(bufferToImageTests.release());
index c521d4e..f18304e 100644 (file)
@@ -1619,7 +1619,7 @@ void createFormatTests (tcu::TestCaseGroup* testGroup)
 {
        DE_STATIC_ASSERT(VK_FORMAT_UNDEFINED == 0);
 
-       for (deUint32 formatNdx = VK_FORMAT_UNDEFINED+1; formatNdx < VK_FORMAT_LAST; ++formatNdx)
+       for (deUint32 formatNdx = VK_FORMAT_UNDEFINED+1; formatNdx < VK_CORE_FORMAT_LAST; ++formatNdx)
        {
                const VkFormat          format                  = (VkFormat)formatNdx;
                const char* const       enumName                = getFormatName(format);
@@ -1770,7 +1770,7 @@ struct ImageFormatPropertyCase
        {}
 
        ImageFormatPropertyCase (void)
-               : format        (VK_FORMAT_LAST)
+               : format        (VK_FORMAT_UNDEFINED)
                , imageType     (VK_IMAGE_TYPE_LAST)
                , tiling        (VK_IMAGE_TILING_LAST)
        {}
@@ -1923,9 +1923,9 @@ tcu::TestStatus imageFormatProperties (Context& context, ImageFormatPropertyCase
 
 void createImageFormatTypeTilingTests (tcu::TestCaseGroup* testGroup, ImageFormatPropertyCase params)
 {
-       DE_ASSERT(params.format == VK_FORMAT_LAST);
+       DE_ASSERT(params.format == VK_FORMAT_UNDEFINED);
 
-       for (deUint32 formatNdx = VK_FORMAT_UNDEFINED+1; formatNdx < VK_FORMAT_LAST; ++formatNdx)
+       for (deUint32 formatNdx = VK_FORMAT_UNDEFINED+1; formatNdx < VK_CORE_FORMAT_LAST; ++formatNdx)
        {
                const VkFormat          format                  = (VkFormat)formatNdx;
                const char* const       enumName                = getFormatName(format);
@@ -1941,15 +1941,15 @@ void createImageFormatTypeTests (tcu::TestCaseGroup* testGroup, ImageFormatPrope
 {
        DE_ASSERT(params.tiling == VK_IMAGE_TILING_LAST);
 
-       testGroup->addChild(createTestGroup(testGroup->getTestContext(), "optimal",     "",     createImageFormatTypeTilingTests, ImageFormatPropertyCase(VK_FORMAT_LAST, params.imageType, VK_IMAGE_TILING_OPTIMAL)));
-       testGroup->addChild(createTestGroup(testGroup->getTestContext(), "linear",      "",     createImageFormatTypeTilingTests, ImageFormatPropertyCase(VK_FORMAT_LAST, params.imageType, VK_IMAGE_TILING_LINEAR)));
+       testGroup->addChild(createTestGroup(testGroup->getTestContext(), "optimal",     "",     createImageFormatTypeTilingTests, ImageFormatPropertyCase(VK_FORMAT_UNDEFINED, params.imageType, VK_IMAGE_TILING_OPTIMAL)));
+       testGroup->addChild(createTestGroup(testGroup->getTestContext(), "linear",      "",     createImageFormatTypeTilingTests, ImageFormatPropertyCase(VK_FORMAT_UNDEFINED, params.imageType, VK_IMAGE_TILING_LINEAR)));
 }
 
 void createImageFormatTests (tcu::TestCaseGroup* testGroup)
 {
-       testGroup->addChild(createTestGroup(testGroup->getTestContext(), "1d", "", createImageFormatTypeTests, ImageFormatPropertyCase(VK_FORMAT_LAST, VK_IMAGE_TYPE_1D, VK_IMAGE_TILING_LAST)));
-       testGroup->addChild(createTestGroup(testGroup->getTestContext(), "2d", "", createImageFormatTypeTests, ImageFormatPropertyCase(VK_FORMAT_LAST, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_LAST)));
-       testGroup->addChild(createTestGroup(testGroup->getTestContext(), "3d", "", createImageFormatTypeTests, ImageFormatPropertyCase(VK_FORMAT_LAST, VK_IMAGE_TYPE_3D, VK_IMAGE_TILING_LAST)));
+       testGroup->addChild(createTestGroup(testGroup->getTestContext(), "1d", "", createImageFormatTypeTests, ImageFormatPropertyCase(VK_FORMAT_UNDEFINED, VK_IMAGE_TYPE_1D, VK_IMAGE_TILING_LAST)));
+       testGroup->addChild(createTestGroup(testGroup->getTestContext(), "2d", "", createImageFormatTypeTests, ImageFormatPropertyCase(VK_FORMAT_UNDEFINED, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_LAST)));
+       testGroup->addChild(createTestGroup(testGroup->getTestContext(), "3d", "", createImageFormatTypeTests, ImageFormatPropertyCase(VK_FORMAT_UNDEFINED, VK_IMAGE_TYPE_3D, VK_IMAGE_TILING_LAST)));
 }
 
 } // anonymous
index 304c5c7..7bc9fb0 100644 (file)
@@ -1,12 +1,16 @@
 include_directories(..)
 
 set(DEQP_VK_FRAGMENT_OPS_SRCS
-       vktFragmentOperationsTests.cpp
-       vktFragmentOperationsTests.hpp
-       vktFragmentOperationsScissorTests.cpp
-       vktFragmentOperationsScissorTests.hpp
+       vktFragmentOperationsEarlyFragmentTests.cpp
+       vktFragmentOperationsEarlyFragmentTests.hpp
        vktFragmentOperationsMakeUtil.cpp
        vktFragmentOperationsMakeUtil.hpp
+       vktFragmentOperationsScissorMultiViewportTests.cpp
+       vktFragmentOperationsScissorMultiViewportTests.hpp
+       vktFragmentOperationsScissorTests.cpp
+       vktFragmentOperationsScissorTests.hpp
+       vktFragmentOperationsTests.cpp
+       vktFragmentOperationsTests.hpp
        )
 
 set(DEQP_VK_FRAGMENT_OPS_LIBS
@@ -22,8 +22,8 @@
  * \brief Early fragment tests
  *//*--------------------------------------------------------------------*/
 
-#include "vktPipelineEarlyFragmentTests.hpp"
-#include "vktPipelineMakeUtil.hpp"
+#include "vktFragmentOperationsEarlyFragmentTests.hpp"
+#include "vktFragmentOperationsMakeUtil.hpp"
 #include "vktTestCaseUtil.hpp"
 
 #include "vkDefs.hpp"
 
 #include <string>
 
-using namespace vk;
-
 namespace vkt
 {
-namespace pipeline
+namespace FragmentOperations
 {
 namespace
 {
+using namespace vk;
+using de::UniquePtr;
 
 //! Basic 2D image.
 inline VkImageCreateInfo makeImageCreateInfo (const tcu::IVec2& size, const VkFormat format, const VkImageUsageFlags usage)
@@ -586,11 +586,12 @@ tcu::TestStatus EarlyFragmentTestInstance::iterate (void)
 
        // Color attachment
 
-       const tcu::IVec2                          renderSize                    = tcu::IVec2(32, 32);
-       const VkFormat                            colorFormat                   = VK_FORMAT_R8G8B8A8_UNORM;
-       const VkImageSubresourceRange colorSubresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
-       const Image                                       colorImage                    (vk, device, allocator, makeImageCreateInfo(renderSize, colorFormat, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT), MemoryRequirement::Any);
-       const Unique<VkImageView>         colorImageView                (makeImageView(vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresourceRange));
+       const tcu::IVec2                                renderSize                      = tcu::IVec2(32, 32);
+       const VkFormat                                  colorFormat                     = VK_FORMAT_R8G8B8A8_UNORM;
+       const VkImageSubresourceRange   colorSubresourceRange = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+       const Unique<VkImage>                   colorImage                      (makeImage(vk, device, makeImageCreateInfo(renderSize, colorFormat, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT)));
+       const UniquePtr<Allocation>             colorImageAlloc         (bindImage(vk, device, allocator, *colorImage, MemoryRequirement::Any));
+       const Unique<VkImageView>               colorImageView          (makeImageView(vk, device, *colorImage, VK_IMAGE_VIEW_TYPE_2D, colorFormat, colorSubresourceRange));
 
        // Test attachment (depth or stencil)
        static const VkFormat stencilFormats[] =
@@ -610,21 +611,22 @@ tcu::TestStatus EarlyFragmentTestInstance::iterate (void)
        if (m_useTestAttachment)
                m_context.getTestContext().getLog() << tcu::TestLog::Message << "Using depth/stencil format " << getFormatName(testFormat) << tcu::TestLog::EndMessage;
 
-       const VkImageSubresourceRange testSubresourceRange        = makeImageSubresourceRange(getImageAspectFlags(testFormat), 0u, 1u, 0u, 1u);
-       const Image                                       testImage                               (vk, device, allocator, makeImageCreateInfo(renderSize, testFormat, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT), MemoryRequirement::Any);
-       const Unique<VkImageView>         testImageView                   (makeImageView(vk, device, *testImage, VK_IMAGE_VIEW_TYPE_2D, testFormat, testSubresourceRange));
-       const VkImageView                         attachmentImages[]      = { *colorImageView, *testImageView };
-       const deUint32                            numUsedAttachmentImages = (m_useTestAttachment ? 2u : 1u);
+       const VkImageSubresourceRange   testSubresourceRange    = makeImageSubresourceRange(getImageAspectFlags(testFormat), 0u, 1u, 0u, 1u);
+       const Unique<VkImage>                   testImage                               (makeImage(vk, device, makeImageCreateInfo(renderSize, testFormat, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)));
+       const UniquePtr<Allocation>             testImageAlloc                  (bindImage(vk, device, allocator, *testImage, MemoryRequirement::Any));
+       const Unique<VkImageView>               testImageView                   (makeImageView(vk, device, *testImage, VK_IMAGE_VIEW_TYPE_2D, testFormat, testSubresourceRange));
+       const VkImageView                               attachmentImages[]              = { *colorImageView, *testImageView };
+       const deUint32                                  numUsedAttachmentImages = (m_useTestAttachment ? 2u : 1u);
 
        // Vertex buffer
 
-       const deUint32     numVertices                   = 6;
-       const VkDeviceSize vertexBufferSizeBytes = sizeof(tcu::Vec4) * numVertices;
-       const Buffer       vertexBuffer                  (vk, device, allocator, makeBufferCreateInfo(vertexBufferSizeBytes, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT), MemoryRequirement::HostVisible);
+       const deUint32                                  numVertices                             = 6;
+       const VkDeviceSize                              vertexBufferSizeBytes   = sizeof(tcu::Vec4) * numVertices;
+       const Unique<VkBuffer>                  vertexBuffer                    (makeBuffer(vk, device, makeBufferCreateInfo(vertexBufferSizeBytes, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)));
+       const UniquePtr<Allocation>             vertexBufferAlloc               (bindBuffer(vk, device, allocator, *vertexBuffer, MemoryRequirement::HostVisible));
 
        {
-               const Allocation& alloc = vertexBuffer.getAllocation();
-               tcu::Vec4* const pVertices = reinterpret_cast<tcu::Vec4*>(alloc.getHostPtr());
+               tcu::Vec4* const pVertices = reinterpret_cast<tcu::Vec4*>(vertexBufferAlloc->getHostPtr());
 
                pVertices[0] = tcu::Vec4( 1.0f, -1.0f,  0.5f,  1.0f);
                pVertices[1] = tcu::Vec4(-1.0f, -1.0f,  0.0f,  1.0f);
@@ -634,27 +636,28 @@ tcu::TestStatus EarlyFragmentTestInstance::iterate (void)
                pVertices[4] = tcu::Vec4( 1.0f,  1.0f,  1.0f,  1.0f);
                pVertices[5] = tcu::Vec4( 1.0f, -1.0f,  0.5f,  1.0f);
 
-               flushMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), vertexBufferSizeBytes);
+               flushMappedMemoryRange(vk, device, vertexBufferAlloc->getMemory(), vertexBufferAlloc->getOffset(), vertexBufferSizeBytes);
                // No barrier needed, flushed memory is automatically visible
        }
 
        // Result buffer
 
-       const VkDeviceSize resultBufferSizeBytes = sizeof(deUint32);
-       const Buffer resultBuffer(vk, device, allocator, makeBufferCreateInfo(resultBufferSizeBytes, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT), MemoryRequirement::HostVisible);
+       const VkDeviceSize                              resultBufferSizeBytes   = sizeof(deUint32);
+       const Unique<VkBuffer>                  resultBuffer                    (makeBuffer(vk, device, makeBufferCreateInfo(resultBufferSizeBytes, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)));
+       const UniquePtr<Allocation>             resultBufferAlloc               (bindBuffer(vk, device, allocator, *resultBuffer, MemoryRequirement::HostVisible));
 
        {
-               const Allocation& alloc = resultBuffer.getAllocation();
-               deUint32* const pData = static_cast<deUint32*>(alloc.getHostPtr());
+               deUint32* const pData = static_cast<deUint32*>(resultBufferAlloc->getHostPtr());
 
                *pData = 0;
-               flushMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), resultBufferSizeBytes);
+               flushMappedMemoryRange(vk, device, resultBufferAlloc->getMemory(), resultBufferAlloc->getOffset(), resultBufferSizeBytes);
        }
 
        // Render result buffer (to retrieve color attachment contents)
 
-       const VkDeviceSize colorBufferSizeBytes = tcu::getPixelSize(mapVkFormat(colorFormat)) * renderSize.x() * renderSize.y();
-       const Buffer       colorBuffer                  (vk, device, allocator, makeBufferCreateInfo(colorBufferSizeBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT), MemoryRequirement::HostVisible);
+       const VkDeviceSize                              colorBufferSizeBytes    = tcu::getPixelSize(mapVkFormat(colorFormat)) * renderSize.x() * renderSize.y();
+       const Unique<VkBuffer>                  colorBuffer                             (makeBuffer(vk, device, makeBufferCreateInfo(colorBufferSizeBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+       const UniquePtr<Allocation>             colorBufferAlloc                (bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
 
        // Descriptors
 
@@ -758,10 +761,9 @@ tcu::TestStatus EarlyFragmentTestInstance::iterate (void)
 
        // Log result image
        {
-               const Allocation& alloc = colorBuffer.getAllocation();
-               invalidateMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), colorBufferSizeBytes);
+               invalidateMappedMemoryRange(vk, device, colorBufferAlloc->getMemory(), colorBufferAlloc->getOffset(), colorBufferSizeBytes);
 
-               const tcu::ConstPixelBufferAccess imagePixelAccess(mapVkFormat(colorFormat), renderSize.x(), renderSize.y(), 1, alloc.getHostPtr());
+               const tcu::ConstPixelBufferAccess imagePixelAccess(mapVkFormat(colorFormat), renderSize.x(), renderSize.y(), 1, colorBufferAlloc->getHostPtr());
 
                tcu::TestLog& log = m_context.getTestContext().getLog();
                log << tcu::TestLog::Image("color0", "Rendered image", imagePixelAccess);
@@ -769,10 +771,9 @@ tcu::TestStatus EarlyFragmentTestInstance::iterate (void)
 
        // Verify results
        {
-               const Allocation& alloc = resultBuffer.getAllocation();
-               invalidateMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), resultBufferSizeBytes);
+               invalidateMappedMemoryRange(vk, device, resultBufferAlloc->getMemory(), resultBufferAlloc->getOffset(), resultBufferSizeBytes);
 
-               const int  actualCounter           = *static_cast<deInt32*>(alloc.getHostPtr());
+               const int  actualCounter           = *static_cast<deInt32*>(resultBufferAlloc->getHostPtr());
                const bool expectPartialResult = (m_useEarlyTests && m_useTestAttachment);
                const int  expectedCounter         = expectPartialResult ? renderSize.x() * renderSize.y() / 2 : renderSize.x() * renderSize.y();
                const int  tolerance               = expectPartialResult ? de::max(renderSize.x(), renderSize.y()) * 3  : 0;
@@ -835,5 +836,5 @@ tcu::TestCaseGroup* createEarlyFragmentTests (tcu::TestContext& testCtx)
        return testGroup.release();
 }
 
-} // pipeline
+} // FragmentOperations
 } // vkt
@@ -1,5 +1,5 @@
-#ifndef _VKTPIPELINEEARLYFRAGMENTTESTS_HPP
-#define _VKTPIPELINEEARLYFRAGMENTTESTS_HPP
+#ifndef _VKTFRAGMENTOPERATIONSEARLYFRAGMENTTESTS_HPP
+#define _VKTFRAGMENTOPERATIONSEARLYFRAGMENTTESTS_HPP
 /*------------------------------------------------------------------------
  * Vulkan Conformance Tests
  * ------------------------
 
 namespace vkt
 {
-namespace pipeline
+namespace FragmentOperations
 {
 
 tcu::TestCaseGroup* createEarlyFragmentTests (tcu::TestContext& testCtx);
 
-} // pipeline
+} // FragmentOperations
 } // vkt
 
-#endif // _VKTPIPELINEEARLYFRAGMENTTESTS_HPP
+#endif // _VKTFRAGMENTOPERATIONSEARLYFRAGMENTTESTS_HPP
index 27405eb..465b999 100644 (file)
@@ -24,7 +24,6 @@
 #include "vktFragmentOperationsMakeUtil.hpp"
 #include "vkTypeUtil.hpp"
 #include "vkPrograms.hpp"
-#include "vkRefUtil.hpp"
 #include "vkQueryUtil.hpp"
 #include <vector>
 
index b907e5b..b06dbe1 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "vkDefs.hpp"
 #include "vkRef.hpp"
+#include "vkRefUtil.hpp"
 #include "vkMemUtil.hpp"
 #include "deUniquePtr.hpp"
 #include "tcuVector.hpp"
@@ -50,6 +51,16 @@ de::MovePtr<vk::Allocation>          bindBuffer                              (const vk::DeviceInterface& vk, const
 void                                                   beginCommandBuffer              (const vk::DeviceInterface& vk, const vk::VkCommandBuffer commandBuffer);
 void                                                   submitCommandsAndWait   (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkQueue queue, const vk::VkCommandBuffer commandBuffer);
 
+inline vk::Move<vk::VkBuffer> makeBuffer (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkBufferCreateInfo& createInfo)
+{
+       return createBuffer(vk, device, &createInfo);
+}
+
+inline vk::Move<vk::VkImage> makeImage (const vk::DeviceInterface& vk, const vk::VkDevice device, const vk::VkImageCreateInfo& createInfo)
+{
+       return createImage(vk, device, &createInfo);
+}
+
 } // FragmentOperations
 } // vkt
 
diff --git a/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorMultiViewportTests.cpp b/external/vulkancts/modules/vulkan/fragment_ops/vktFragmentOperationsScissorMultiViewportTests.cpp
new file mode 100644 (file)
index 0000000..69314c9
--- /dev/null
@@ -0,0 +1,773 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Scissor multi viewport tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktFragmentOperationsScissorMultiViewportTests.hpp"
+#include "vktTestCaseUtil.hpp"
+#include "vktFragmentOperationsMakeUtil.hpp"
+
+#include "vkDefs.hpp"
+#include "vkRefUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include "vkMemUtil.hpp"
+#include "vkPrograms.hpp"
+#include "vkImageUtil.hpp"
+#include "vkQueryUtil.hpp"
+
+#include "tcuTestLog.hpp"
+#include "tcuVector.hpp"
+#include "tcuImageCompare.hpp"
+#include "tcuTextureUtil.hpp"
+
+#include "deUniquePtr.hpp"
+#include "deMath.h"
+
+namespace vkt
+{
+namespace FragmentOperations
+{
+using namespace vk;
+using de::UniquePtr;
+using de::MovePtr;
+using tcu::Vec4;
+using tcu::Vec2;
+using tcu::IVec2;
+using tcu::IVec4;
+
+namespace
+{
+
+enum Constants
+{
+       MIN_MAX_VIEWPORTS = 16,         //!< Minimum number of viewports for an implementation supporting multiViewport.
+};
+
+template<typename T>
+inline VkDeviceSize sizeInBytes(const std::vector<T>& vec)
+{
+       return vec.size() * sizeof(vec[0]);
+}
+
+VkImageCreateInfo makeImageCreateInfo (const VkFormat format, const IVec2& size, VkImageUsageFlags usage)
+{
+       const VkImageCreateInfo imageParams =
+       {
+               VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,                    // VkStructureType                      sType;
+               DE_NULL,                                                                                // const void*                          pNext;
+               (VkImageCreateFlags)0,                                                  // VkImageCreateFlags           flags;
+               VK_IMAGE_TYPE_2D,                                                               // VkImageType                          imageType;
+               format,                                                                                 // VkFormat                                     format;
+               makeExtent3D(size.x(), size.y(), 1),                    // VkExtent3D                           extent;
+               1u,                                                                                             // deUint32                                     mipLevels;
+               1u,                                                                                             // deUint32                                     arrayLayers;
+               VK_SAMPLE_COUNT_1_BIT,                                                  // VkSampleCountFlagBits        samples;
+               VK_IMAGE_TILING_OPTIMAL,                                                // VkImageTiling                        tiling;
+               usage,                                                                                  // VkImageUsageFlags            usage;
+               VK_SHARING_MODE_EXCLUSIVE,                                              // VkSharingMode                        sharingMode;
+               0u,                                                                                             // deUint32                                     queueFamilyIndexCount;
+               DE_NULL,                                                                                // const deUint32*                      pQueueFamilyIndices;
+               VK_IMAGE_LAYOUT_UNDEFINED,                                              // VkImageLayout                        initialLayout;
+       };
+       return imageParams;
+}
+
+//! A single-attachment, single-subpass render pass.
+Move<VkRenderPass> makeRenderPass (const DeviceInterface&      vk,
+                                                                  const VkDevice                       device,
+                                                                  const VkFormat                       colorFormat)
+{
+       const VkAttachmentDescription colorAttachmentDescription =
+       {
+               (VkAttachmentDescriptionFlags)0,                                        // VkAttachmentDescriptionFlags         flags;
+               colorFormat,                                                                            // VkFormat                                                     format;
+               VK_SAMPLE_COUNT_1_BIT,                                                          // VkSampleCountFlagBits                        samples;
+               VK_ATTACHMENT_LOAD_OP_CLEAR,                                            // VkAttachmentLoadOp                           loadOp;
+               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;
+               VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,                       // VkImageLayout                                        finalLayout;
+       };
+
+       const VkAttachmentReference colorAttachmentRef =
+       {
+               0u,                                                                                                     // deUint32                     attachment;
+               VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL                        // VkImageLayout        layout;
+       };
+
+       const VkSubpassDescription subpassDescription =
+       {
+               (VkSubpassDescriptionFlags)0,                                           // VkSubpassDescriptionFlags            flags;
+               VK_PIPELINE_BIND_POINT_GRAPHICS,                                        // VkPipelineBindPoint                          pipelineBindPoint;
+               0u,                                                                                                     // deUint32                                                     inputAttachmentCount;
+               DE_NULL,                                                                                        // const VkAttachmentReference*         pInputAttachments;
+               1u,                                                                                                     // deUint32                                                     colorAttachmentCount;
+               &colorAttachmentRef,                                                            // const VkAttachmentReference*         pColorAttachments;
+               DE_NULL,                                                                                        // const VkAttachmentReference*         pResolveAttachments;
+               DE_NULL,                                                                                        // const VkAttachmentReference*         pDepthStencilAttachment;
+               0u,                                                                                                     // deUint32                                                     preserveAttachmentCount;
+               DE_NULL                                                                                         // const deUint32*                                      pPreserveAttachments;
+       };
+
+       const VkRenderPassCreateInfo renderPassInfo =
+       {
+               VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,                      // VkStructureType                                      sType;
+               DE_NULL,                                                                                        // const void*                                          pNext;
+               (VkRenderPassCreateFlags)0,                                                     // VkRenderPassCreateFlags                      flags;
+               1u,                                                                                                     // deUint32                                                     attachmentCount;
+               &colorAttachmentDescription,                                            // const VkAttachmentDescription*       pAttachments;
+               1u,                                                                                                     // deUint32                                                     subpassCount;
+               &subpassDescription,                                                            // const VkSubpassDescription*          pSubpasses;
+               0u,                                                                                                     // deUint32                                                     dependencyCount;
+               DE_NULL                                                                                         // const VkSubpassDependency*           pDependencies;
+       };
+
+       return createRenderPass(vk, device, &renderPassInfo);
+}
+
+Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface&          vk,
+                                                                          const VkDevice                               device,
+                                                                          const VkPipelineLayout               pipelineLayout,
+                                                                          const VkRenderPass                   renderPass,
+                                                                          const VkShaderModule                 vertexModule,
+                                                                          const VkShaderModule                 geometryModule,
+                                                                          const VkShaderModule                 fragmentModule,
+                                                                          const IVec2                                  renderSize,
+                                                                          const int                                    numViewports,
+                                                                          const std::vector<IVec4>             scissors)
+{
+       const VkVertexInputBindingDescription vertexInputBindingDescription =
+       {
+               0u,                                                             // uint32_t                             binding;
+               sizeof(Vec4),                                   // uint32_t                             stride;
+               VK_VERTEX_INPUT_RATE_VERTEX,    // VkVertexInputRate    inputRate;
+       };
+
+       const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[] =
+       {
+               {
+                       0u,                                                                     // uint32_t                     location;
+                       0u,                                                                     // uint32_t                     binding;
+                       VK_FORMAT_R32G32B32A32_SFLOAT,          // VkFormat                     format;
+                       0u,                                                                     // uint32_t                     offset;
+               },
+       };
+
+       const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,              // VkStructureType                             sType;
+               DE_NULL,                                                                                                                // const void*                                 pNext;
+               (VkPipelineVertexInputStateCreateFlags)0,                                               // VkPipelineVertexInputStateCreateFlags       flags;
+               1u,                                                                                                                             // uint32_t                                    vertexBindingDescriptionCount;
+               &vertexInputBindingDescription,                                                                 // const VkVertexInputBindingDescription*      pVertexBindingDescriptions;
+               DE_LENGTH_OF_ARRAY(vertexInputAttributeDescriptions),                   // uint32_t                                    vertexAttributeDescriptionCount;
+               vertexInputAttributeDescriptions,                                                               // const VkVertexInputAttributeDescription*    pVertexAttributeDescriptions;
+       };
+
+       const VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,    // VkStructureType                             sType;
+               DE_NULL,                                                                                                                // const void*                                 pNext;
+               (VkPipelineInputAssemblyStateCreateFlags)0,                                             // VkPipelineInputAssemblyStateCreateFlags     flags;
+               VK_PRIMITIVE_TOPOLOGY_POINT_LIST,                                                               // VkPrimitiveTopology                         topology;
+               VK_FALSE,                                                                                                               // VkBool32                                    primitiveRestartEnable;
+       };
+
+       const VkViewport defaultViewport = makeViewport(
+               0.0f, 0.0f,
+               static_cast<float>(renderSize.x()), static_cast<float>(renderSize.y()),
+               0.0f, 1.0f);
+       const std::vector<VkViewport> viewports(numViewports, defaultViewport);
+
+       DE_ASSERT(numViewports == static_cast<int>(scissors.size()));
+
+       std::vector<VkRect2D> rectScissors;
+       rectScissors.reserve(numViewports);
+
+       for (std::vector<IVec4>::const_iterator it = scissors.begin(); it != scissors.end(); ++it)
+       {
+               const VkRect2D rect =
+               {
+                       makeOffset2D(it->x(), it->y()),
+                       makeExtent2D(static_cast<deUint32>(it->z()), static_cast<deUint32>(it->w())),
+               };
+               rectScissors.push_back(rect);
+       }
+
+       const VkPipelineViewportStateCreateInfo pipelineViewportStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,                  // VkStructureType                             sType;
+               DE_NULL,                                                                                                                // const void*                                 pNext;
+               (VkPipelineViewportStateCreateFlags)0,                                                  // VkPipelineViewportStateCreateFlags          flags;
+               static_cast<deUint32>(numViewports),                                                    // uint32_t                                    viewportCount;
+               &viewports[0],                                                                                                  // const VkViewport*                           pViewports;
+               static_cast<deUint32>(numViewports),                                                    // uint32_t                                    scissorCount;
+               &rectScissors[0],                                                                                               // const VkRect2D*                             pScissors;
+       };
+
+       const VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,             // VkStructureType                          sType;
+               DE_NULL,                                                                                                                // const void*                              pNext;
+               (VkPipelineRasterizationStateCreateFlags)0,                                             // VkPipelineRasterizationStateCreateFlags  flags;
+               VK_FALSE,                                                                                                               // VkBool32                                 depthClampEnable;
+               VK_FALSE,                                                                                                               // VkBool32                                 rasterizerDiscardEnable;
+               VK_POLYGON_MODE_FILL,                                                                                   // VkPolygonMode                                                        polygonMode;
+               VK_CULL_MODE_NONE,                                                                                              // VkCullModeFlags                                                      cullMode;
+               VK_FRONT_FACE_COUNTER_CLOCKWISE,                                                                // VkFrontFace                                                          frontFace;
+               VK_FALSE,                                                                                                               // VkBool32                                                                     depthBiasEnable;
+               0.0f,                                                                                                                   // float                                                                        depthBiasConstantFactor;
+               0.0f,                                                                                                                   // float                                                                        depthBiasClamp;
+               0.0f,                                                                                                                   // float                                                                        depthBiasSlopeFactor;
+               1.0f,                                                                                                                   // float                                                                        lineWidth;
+       };
+
+       const VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,               // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                                // const void*                                                          pNext;
+               (VkPipelineMultisampleStateCreateFlags)0,                                               // VkPipelineMultisampleStateCreateFlags        flags;
+               VK_SAMPLE_COUNT_1_BIT,                                                                                  // VkSampleCountFlagBits                                        rasterizationSamples;
+               VK_FALSE,                                                                                                               // VkBool32                                                                     sampleShadingEnable;
+               0.0f,                                                                                                                   // float                                                                        minSampleShading;
+               DE_NULL,                                                                                                                // const VkSampleMask*                                          pSampleMask;
+               VK_FALSE,                                                                                                               // VkBool32                                                                     alphaToCoverageEnable;
+               VK_FALSE                                                                                                                // VkBool32                                                                     alphaToOneEnable;
+       };
+
+       const VkStencilOpState stencilOpState = makeStencilOpState(
+               VK_STENCIL_OP_KEEP,                             // stencil fail
+               VK_STENCIL_OP_KEEP,                             // depth & stencil pass
+               VK_STENCIL_OP_KEEP,                             // depth only fail
+               VK_COMPARE_OP_ALWAYS,                   // compare op
+               0u,                                                             // compare mask
+               0u,                                                             // write mask
+               0u);                                                    // reference
+
+       VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,             // VkStructureType                                                      sType;
+               DE_NULL,                                                                                                                // const void*                                                          pNext;
+               (VkPipelineDepthStencilStateCreateFlags)0,                                              // VkPipelineDepthStencilStateCreateFlags       flags;
+               VK_FALSE,                                                                                                               // VkBool32                                                                     depthTestEnable;
+               VK_FALSE,                                                                                                               // VkBool32                                                                     depthWriteEnable;
+               VK_COMPARE_OP_LESS,                                                                                             // VkCompareOp                                                          depthCompareOp;
+               VK_FALSE,                                                                                                               // VkBool32                                                                     depthBoundsTestEnable;
+               VK_FALSE,                                                                                                               // VkBool32                                                                     stencilTestEnable;
+               stencilOpState,                                                                                                 // VkStencilOpState                                                     front;
+               stencilOpState,                                                                                                 // VkStencilOpState                                                     back;
+               0.0f,                                                                                                                   // float                                                                        minDepthBounds;
+               1.0f,                                                                                                                   // float                                                                        maxDepthBounds;
+       };
+
+       const VkColorComponentFlags                                     colorComponentsAll                                      = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+       const VkPipelineColorBlendAttachmentState       pipelineColorBlendAttachmentState       =
+       {
+               VK_FALSE,                                               // VkBool32                                     blendEnable;
+               VK_BLEND_FACTOR_ONE,                    // VkBlendFactor                        srcColorBlendFactor;
+               VK_BLEND_FACTOR_ZERO,                   // VkBlendFactor                        dstColorBlendFactor;
+               VK_BLEND_OP_ADD,                                // VkBlendOp                            colorBlendOp;
+               VK_BLEND_FACTOR_ONE,                    // VkBlendFactor                        srcAlphaBlendFactor;
+               VK_BLEND_FACTOR_ZERO,                   // VkBlendFactor                        dstAlphaBlendFactor;
+               VK_BLEND_OP_ADD,                                // VkBlendOp                            alphaBlendOp;
+               colorComponentsAll,                             // VkColorComponentFlags        colorWriteMask;
+       };
+
+       const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo =
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,               // VkStructureType                                                              sType;
+               DE_NULL,                                                                                                                // const void*                                                                  pNext;
+               (VkPipelineColorBlendStateCreateFlags)0,                                                // VkPipelineColorBlendStateCreateFlags                 flags;
+               VK_FALSE,                                                                                                               // VkBool32                                                                             logicOpEnable;
+               VK_LOGIC_OP_COPY,                                                                                               // VkLogicOp                                                                    logicOp;
+               1u,                                                                                                                             // deUint32                                                                             attachmentCount;
+               &pipelineColorBlendAttachmentState,                                                             // const VkPipelineColorBlendAttachmentState*   pAttachments;
+               { 0.0f, 0.0f, 0.0f, 0.0f },                                                                             // float                                                                                blendConstants[4];
+       };
+
+       const VkPipelineShaderStageCreateInfo pShaderStages[] =
+       {
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,            // VkStructureType                                              sType;
+                       DE_NULL,                                                                                                        // const void*                                                  pNext;
+                       (VkPipelineShaderStageCreateFlags)0,                                            // VkPipelineShaderStageCreateFlags             flags;
+                       VK_SHADER_STAGE_VERTEX_BIT,                                                                     // VkShaderStageFlagBits                                stage;
+                       vertexModule,                                                                                           // VkShaderModule                                               module;
+                       "main",                                                                                                         // const char*                                                  pName;
+                       DE_NULL,                                                                                                        // const VkSpecializationInfo*                  pSpecializationInfo;
+               },
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,            // VkStructureType                                              sType;
+                       DE_NULL,                                                                                                        // const void*                                                  pNext;
+                       (VkPipelineShaderStageCreateFlags)0,                                            // VkPipelineShaderStageCreateFlags             flags;
+                       VK_SHADER_STAGE_GEOMETRY_BIT,                                                           // VkShaderStageFlagBits                                stage;
+                       geometryModule,                                                                                         // VkShaderModule                                               module;
+                       "main",                                                                                                         // const char*                                                  pName;
+                       DE_NULL,                                                                                                        // const VkSpecializationInfo*                  pSpecializationInfo;
+               },
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,            // VkStructureType                                              sType;
+                       DE_NULL,                                                                                                        // const void*                                                  pNext;
+                       (VkPipelineShaderStageCreateFlags)0,                                            // VkPipelineShaderStageCreateFlags             flags;
+                       VK_SHADER_STAGE_FRAGMENT_BIT,                                                           // VkShaderStageFlagBits                                stage;
+                       fragmentModule,                                                                                         // VkShaderModule                                               module;
+                       "main",                                                                                                         // const char*                                                  pName;
+                       DE_NULL,                                                                                                        // const VkSpecializationInfo*                  pSpecializationInfo;
+               },
+       };
+
+       const VkGraphicsPipelineCreateInfo graphicsPipelineInfo =
+       {
+               VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,        // VkStructureType                                                                      sType;
+               DE_NULL,                                                                                        // const void*                                                                          pNext;
+               (VkPipelineCreateFlags)0,                                                       // VkPipelineCreateFlags                                                        flags;
+               DE_LENGTH_OF_ARRAY(pShaderStages),                                      // deUint32                                                                                     stageCount;
+               pShaderStages,                                                                          // const VkPipelineShaderStageCreateInfo*                       pStages;
+               &vertexInputStateInfo,                                                          // const VkPipelineVertexInputStateCreateInfo*          pVertexInputState;
+               &pipelineInputAssemblyStateInfo,                                        // const VkPipelineInputAssemblyStateCreateInfo*        pInputAssemblyState;
+               DE_NULL,                                                                                        // const VkPipelineTessellationStateCreateInfo*         pTessellationState;
+               &pipelineViewportStateInfo,                                                     // const VkPipelineViewportStateCreateInfo*                     pViewportState;
+               &pipelineRasterizationStateInfo,                                        // const VkPipelineRasterizationStateCreateInfo*        pRasterizationState;
+               &pipelineMultisampleStateInfo,                                          // const VkPipelineMultisampleStateCreateInfo*          pMultisampleState;
+               &pipelineDepthStencilStateInfo,                                         // const VkPipelineDepthStencilStateCreateInfo*         pDepthStencilState;
+               &pipelineColorBlendStateInfo,                                           // const VkPipelineColorBlendStateCreateInfo*           pColorBlendState;
+               DE_NULL,                                                                                        // const VkPipelineDynamicStateCreateInfo*                      pDynamicState;
+               pipelineLayout,                                                                         // VkPipelineLayout                                                                     layout;
+               renderPass,                                                                                     // VkRenderPass                                                                         renderPass;
+               0u,                                                                                                     // deUint32                                                                                     subpass;
+               DE_NULL,                                                                                        // VkPipeline                                                                           basePipelineHandle;
+               0,                                                                                                      // deInt32                                                                                      basePipelineIndex;
+       };
+
+       return createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineInfo);
+}
+
+void zeroBuffer (const DeviceInterface& vk, const VkDevice device, const Allocation& alloc, const VkDeviceSize size)
+{
+       deMemset(alloc.getHostPtr(), 0, static_cast<std::size_t>(size));
+       flushMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), size);
+}
+
+void requireFeatureMultiViewport (const InstanceInterface& vki, const VkPhysicalDevice physDevice)
+{
+       const VkPhysicalDeviceFeatures  features        = getPhysicalDeviceFeatures(vki, physDevice);
+       const VkPhysicalDeviceLimits    limits          = getPhysicalDeviceProperties(vki, physDevice).limits;
+
+       if (!features.multiViewport)
+               TCU_THROW(NotSupportedError, "Required feature is not supported: multiViewport");
+
+       if (limits.maxViewports < MIN_MAX_VIEWPORTS)
+               TCU_THROW(NotSupportedError, "Implementation doesn't support minimum required number of viewports");
+}
+
+std::vector<IVec4> generateScissors (const int numScissors, const IVec2& renderSize)
+{
+       // Scissor rects will be arranged in a grid-like fashion.
+
+       const int numCols               = deCeilFloatToInt32(deFloatSqrt(static_cast<float>(numScissors)));
+       const int numRows               = deCeilFloatToInt32(static_cast<float>(numScissors) / static_cast<float>(numCols));
+       const int rectWidth             = renderSize.x() / numCols;
+       const int rectHeight    = renderSize.y() / numRows;
+
+       std::vector<IVec4> scissors;
+       scissors.reserve(numScissors);
+
+       int x = 0;
+       int y = 0;
+
+       for (int scissorNdx = 0; scissorNdx < numScissors; ++scissorNdx)
+       {
+               const bool nextRow = (scissorNdx != 0) && (scissorNdx % numCols == 0);
+               if (nextRow)
+               {
+                       x  = 0;
+                       y += rectHeight;
+               }
+
+               scissors.push_back(IVec4(x, y, rectWidth, rectHeight));
+
+               x += rectWidth;
+       }
+
+       return scissors;
+}
+
+std::vector<Vec4> generateColors (const int numColors)
+{
+       const Vec4 colors[] =
+       {
+               Vec4(0.18f, 0.42f, 0.17f, 1.0f),
+               Vec4(0.29f, 0.62f, 0.28f, 1.0f),
+               Vec4(0.59f, 0.84f, 0.44f, 1.0f),
+               Vec4(0.96f, 0.95f, 0.72f, 1.0f),
+               Vec4(0.94f, 0.55f, 0.39f, 1.0f),
+               Vec4(0.82f, 0.19f, 0.12f, 1.0f),
+               Vec4(0.46f, 0.15f, 0.26f, 1.0f),
+               Vec4(0.24f, 0.14f, 0.24f, 1.0f),
+               Vec4(0.49f, 0.31f, 0.26f, 1.0f),
+               Vec4(0.78f, 0.52f, 0.33f, 1.0f),
+               Vec4(0.94f, 0.82f, 0.31f, 1.0f),
+               Vec4(0.98f, 0.65f, 0.30f, 1.0f),
+               Vec4(0.22f, 0.65f, 0.53f, 1.0f),
+               Vec4(0.67f, 0.81f, 0.91f, 1.0f),
+               Vec4(0.43f, 0.44f, 0.75f, 1.0f),
+               Vec4(0.26f, 0.24f, 0.48f, 1.0f),
+       };
+
+       DE_ASSERT(numColors <= DE_LENGTH_OF_ARRAY(colors));
+
+       return std::vector<Vec4>(colors, colors + numColors);
+}
+
+//! Renders a colorful grid of rectangles.
+tcu::TextureLevel generateReferenceImage (const tcu::TextureFormat     format,
+                                                                                 const IVec2&                          renderSize,
+                                                                                 const Vec4&                           clearColor,
+                                                                                 const std::vector<IVec4>&     scissors,
+                                                                                 const std::vector<Vec4>&      scissorColors)
+{
+       DE_ASSERT(scissors.size() == scissorColors.size());
+
+       tcu::TextureLevel image(format, renderSize.x(), renderSize.y());
+       tcu::clear(image.getAccess(), clearColor);
+
+       for (std::size_t i = 0; i < scissors.size(); ++i)
+       {
+               tcu::clear(
+                       tcu::getSubregion(image.getAccess(), scissors[i].x(), scissors[i].y(), scissors[i].z(), scissors[i].w()),
+                       scissorColors[i]);
+       }
+
+       return image;
+}
+
+void initPrograms (SourceCollections& programCollection, const int numViewports)
+{
+       DE_UNREF(numViewports);
+
+       // Vertex shader
+       {
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "layout(location = 0) in  vec4 in_color;\n"
+                       << "layout(location = 0) out vec4 out_color;\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       << "    out_color = in_color;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("vert") << glu::VertexSource(src.str());
+       }
+
+       // Geometry shader
+       {
+               // Each input point generates a fullscreen quad.
+
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "layout(points) in;\n"
+                       << "layout(triangle_strip, max_vertices=4) out;\n"
+                       << "\n"
+                       << "out gl_PerVertex {\n"
+                       << "    vec4 gl_Position;\n"
+                       << "};\n"
+                       << "\n"
+                       << "layout(location = 0) in  vec4 in_color[];\n"
+                       << "layout(location = 0) out vec4 out_color;\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       << "    gl_ViewportIndex = gl_PrimitiveIDIn;\n"
+                       << "    gl_Position      = vec4(-1.0, -1.0, 0.0, 1.0);\n"
+                       << "    out_color        = in_color[0];\n"
+                       << "    EmitVertex();"
+                       << "\n"
+                       << "    gl_ViewportIndex = gl_PrimitiveIDIn;\n"
+                       << "    gl_Position      = vec4(-1.0, 1.0, 0.0, 1.0);\n"
+                       << "    out_color        = in_color[0];\n"
+                       << "    EmitVertex();"
+                       << "\n"
+                       << "    gl_ViewportIndex = gl_PrimitiveIDIn;\n"
+                       << "    gl_Position      = vec4(1.0, -1.0, 0.0, 1.0);\n"
+                       << "    out_color        = in_color[0];\n"
+                       << "    EmitVertex();"
+                       << "\n"
+                       << "    gl_ViewportIndex = gl_PrimitiveIDIn;\n"
+                       << "    gl_Position      = vec4(1.0, 1.0, 0.0, 1.0);\n"
+                       << "    out_color        = in_color[0];\n"
+                       << "    EmitVertex();"
+                       << "}\n";
+
+               programCollection.glslSources.add("geom") << glu::GeometrySource(src.str());
+       }
+
+       // Fragment shader
+       {
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "layout(location = 0) in  vec4 in_color;\n"
+                       << "layout(location = 0) out vec4 out_color;\n"
+                       << "\n"
+                       << "void main(void)\n"
+                       << "{\n"
+                       << "    out_color = in_color;\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("frag") << glu::FragmentSource(src.str());
+       }
+}
+
+class ScissorRenderer
+{
+public:
+       ScissorRenderer (Context&                                       context,
+                                        const IVec2&                           renderSize,
+                                        const int                                      numViewports,
+                                        const std::vector<IVec4>&      scissors,
+                                        const VkFormat                         colorFormat,
+                                        const Vec4&                            clearColor,
+                                        const std::vector<Vec4>&       vertices)
+               : m_renderSize                          (renderSize)
+               , m_colorFormat                         (colorFormat)
+               , m_colorSubresourceRange       (makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u))
+               , m_clearColor                          (clearColor)
+               , m_numViewports                        (numViewports)
+               , m_vertexBufferSize            (sizeInBytes(vertices))
+       {
+               const DeviceInterface&          vk                                      = context.getDeviceInterface();
+               const VkDevice                          device                          = context.getDevice();
+               const deUint32                          queueFamilyIndex        = context.getUniversalQueueFamilyIndex();
+               Allocator&                                      allocator                       = context.getDefaultAllocator();
+
+               m_colorImage            = makeImage                             (vk, device, makeImageCreateInfo(m_colorFormat, m_renderSize, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT));
+               m_colorImageAlloc       = bindImage                             (vk, device, allocator, *m_colorImage, MemoryRequirement::Any);
+               m_colorAttachment       = makeImageView                 (vk, device, *m_colorImage, VK_IMAGE_VIEW_TYPE_2D, m_colorFormat, m_colorSubresourceRange);
+
+               m_vertexBuffer          = makeBuffer                    (vk, device, makeBufferCreateInfo(m_vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
+               m_vertexBufferAlloc     = bindBuffer                    (vk, device, allocator, *m_vertexBuffer, MemoryRequirement::HostVisible);
+
+               {
+                       deMemcpy(m_vertexBufferAlloc->getHostPtr(), &vertices[0], static_cast<std::size_t>(m_vertexBufferSize));
+                       flushMappedMemoryRange(vk, device, m_vertexBufferAlloc->getMemory(), m_vertexBufferAlloc->getOffset(), m_vertexBufferSize);
+               }
+
+               m_vertexModule          = createShaderModule    (vk, device, context.getBinaryCollection().get("vert"), 0u);
+               m_geometryModule        = createShaderModule    (vk, device, context.getBinaryCollection().get("geom"), 0u);
+               m_fragmentModule        = createShaderModule    (vk, device, context.getBinaryCollection().get("frag"), 0u);
+               m_renderPass            = makeRenderPass                (vk, device, m_colorFormat);
+               m_framebuffer           = makeFramebuffer               (vk, device, *m_renderPass, 1u, &m_colorAttachment.get(),
+                                                                                                        static_cast<deUint32>(m_renderSize.x()),  static_cast<deUint32>(m_renderSize.y()));
+               m_pipelineLayout        = makePipelineLayout    (vk, device);
+               m_pipeline                      = makeGraphicsPipeline  (vk, device, *m_pipelineLayout, *m_renderPass, *m_vertexModule, *m_geometryModule, *m_fragmentModule,
+                                                                                                        m_renderSize, m_numViewports, scissors);
+               m_cmdPool                       = makeCommandPool               (vk, device, queueFamilyIndex);
+               m_cmdBuffer                     = makeCommandBuffer             (vk, device, *m_cmdPool);
+       }
+
+       void draw (Context& context, const VkBuffer colorBuffer) const
+       {
+               const DeviceInterface&          vk                      = context.getDeviceInterface();
+               const VkDevice                          device          = context.getDevice();
+               const VkQueue                           queue           = context.getUniversalQueue();
+
+               beginCommandBuffer(vk, *m_cmdBuffer);
+
+               const VkClearValue                      clearValue      = makeClearValueColor(m_clearColor);
+               const VkRect2D                          renderArea      =
+               {
+                       makeOffset2D(0, 0),
+                       makeExtent2D(m_renderSize.x(), m_renderSize.y()),
+               };
+               const VkRenderPassBeginInfo renderPassBeginInfo =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,               // VkStructureType         sType;
+                       DE_NULL,                                                                                // const void*             pNext;
+                       *m_renderPass,                                                                  // VkRenderPass            renderPass;
+                       *m_framebuffer,                                                                 // VkFramebuffer           framebuffer;
+                       renderArea,                                                                             // VkRect2D                renderArea;
+                       1u,                                                                                             // uint32_t                clearValueCount;
+                       &clearValue,                                                                    // const VkClearValue*     pClearValues;
+               };
+               vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+
+               vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+               {
+                       const VkDeviceSize vertexBufferOffset = 0ull;
+                       vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &m_vertexBuffer.get(), &vertexBufferOffset);
+               }
+               vk.cmdDraw(*m_cmdBuffer, static_cast<deUint32>(m_numViewports), 1u, 0u, 0u);    // one vertex per viewport
+               vk.cmdEndRenderPass(*m_cmdBuffer);
+
+               // Prepare color image for copy
+               {
+                       const VkImageMemoryBarrier barriers[] =
+                       {
+                               {
+                                       VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,                                         // VkStructureType                      sType;
+                                       DE_NULL,                                                                                                        // const void*                          pNext;
+                                       VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                                           // VkAccessFlags                        outputMask;
+                                       VK_ACCESS_TRANSFER_READ_BIT,                                                            // VkAccessFlags                        inputMask;
+                                       VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,                                       // VkImageLayout                        oldLayout;
+                                       VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,                                           // VkImageLayout                        newLayout;
+                                       VK_QUEUE_FAMILY_IGNORED,                                                                        // deUint32                                     srcQueueFamilyIndex;
+                                       VK_QUEUE_FAMILY_IGNORED,                                                                        // deUint32                                     destQueueFamilyIndex;
+                                       *m_colorImage,                                                                                          // VkImage                                      image;
+                                       m_colorSubresourceRange,                                                                        // VkImageSubresourceRange      subresourceRange;
+                               },
+                       };
+
+                       vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u,
+                               0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(barriers), barriers);
+               }
+               // Color image -> host buffer
+               {
+                       const VkBufferImageCopy region =
+                       {
+                               0ull,                                                                                                                                           // VkDeviceSize                bufferOffset;
+                               0u,                                                                                                                                                     // uint32_t                    bufferRowLength;
+                               0u,                                                                                                                                                     // uint32_t                    bufferImageHeight;
+                               makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u),                      // VkImageSubresourceLayers    imageSubresource;
+                               makeOffset3D(0, 0, 0),                                                                                                          // VkOffset3D                  imageOffset;
+                               makeExtent3D(m_renderSize.x(), m_renderSize.y(), 1u),                                           // VkExtent3D                  imageExtent;
+                       };
+
+                       vk.cmdCopyImageToBuffer(*m_cmdBuffer, *m_colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, colorBuffer, 1u, &region);
+               }
+               // Buffer write barrier
+               {
+                       const VkBufferMemoryBarrier barriers[] =
+                       {
+                               {
+                                       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(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u,
+                               0u, DE_NULL, DE_LENGTH_OF_ARRAY(barriers), barriers, DE_NULL, 0u);
+               }
+
+               VK_CHECK(vk.endCommandBuffer(*m_cmdBuffer));
+               submitCommandsAndWait(vk, device, queue, *m_cmdBuffer);
+       }
+
+private:
+       const IVec2                                             m_renderSize;
+       const VkFormat                                  m_colorFormat;
+       const VkImageSubresourceRange   m_colorSubresourceRange;
+       const Vec4                                              m_clearColor;
+       const int                                               m_numViewports;
+       const VkDeviceSize                              m_vertexBufferSize;
+
+       Move<VkImage>                                   m_colorImage;
+       MovePtr<Allocation>                             m_colorImageAlloc;
+       Move<VkImageView>                               m_colorAttachment;
+       Move<VkBuffer>                                  m_vertexBuffer;
+       MovePtr<Allocation>                             m_vertexBufferAlloc;
+       Move<VkShaderModule>                    m_vertexModule;
+       Move<VkShaderModule>                    m_geometryModule;
+       Move<VkShaderModule>                    m_fragmentModule;
+       Move<VkRenderPass>                              m_renderPass;
+       Move<VkFramebuffer>                             m_framebuffer;
+       Move<VkPipelineLayout>                  m_pipelineLayout;
+       Move<VkPipeline>                                m_pipeline;
+       Move<VkCommandPool>                             m_cmdPool;
+       Move<VkCommandBuffer>                   m_cmdBuffer;
+
+       // "deleted"
+                                               ScissorRenderer (const ScissorRenderer&);
+       ScissorRenderer&        operator=               (const ScissorRenderer&);
+};
+
+tcu::TestStatus test (Context& context, const int numViewports)
+{
+       requireFeatureMultiViewport(context.getInstanceInterface(), context.getPhysicalDevice());
+
+       const DeviceInterface&                  vk                                      = context.getDeviceInterface();
+       const VkDevice                                  device                          = context.getDevice();
+       Allocator&                                              allocator                       = context.getDefaultAllocator();
+
+       const IVec2                                             renderSize                      (128, 128);
+       const VkFormat                                  colorFormat                     = VK_FORMAT_R8G8B8A8_UNORM;
+       const Vec4                                              clearColor                      (0.5f, 0.5f, 0.5f, 1.0f);
+       const std::vector<Vec4>                 vertexColors            = generateColors(numViewports);
+       const std::vector<IVec4>                scissors                        = generateScissors(numViewports, renderSize);
+
+       const VkDeviceSize                              colorBufferSize         = renderSize.x() * renderSize.y() * tcu::getPixelSize(mapVkFormat(colorFormat));
+       const Unique<VkBuffer>                  colorBuffer                     (makeBuffer(vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
+       const UniquePtr<Allocation>             colorBufferAlloc        (bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible));
+
+       zeroBuffer(vk, device, *colorBufferAlloc, colorBufferSize);
+
+       {
+               context.getTestContext().getLog()
+                       << tcu::TestLog::Message << "Rendering a colorful grid of " << numViewports << " rectangle(s)." << tcu::TestLog::EndMessage
+                       << tcu::TestLog::Message << "Not covered area will be filled with a gray color." << tcu::TestLog::EndMessage;
+       }
+
+       // Draw
+       {
+               const ScissorRenderer renderer (context, renderSize, numViewports, scissors, colorFormat, clearColor, vertexColors);
+               renderer.draw(context, *colorBuffer);
+       }
+
+       // Log image
+       {
+               invalidateMappedMemoryRange(vk, device, colorBufferAlloc->getMemory(), 0ull, colorBufferSize);
+
+               const tcu::ConstPixelBufferAccess       resultImage             (mapVkFormat(colorFormat), renderSize.x(), renderSize.y(), 1u, colorBufferAlloc->getHostPtr());
+               const tcu::TextureLevel                         referenceImage  = generateReferenceImage(mapVkFormat(colorFormat), renderSize, clearColor, scissors, vertexColors);
+
+               // Images should now match.
+               if (!tcu::floatThresholdCompare(context.getTestContext().getLog(), "color", "Image compare", referenceImage.getAccess(), resultImage, Vec4(0.02f), tcu::COMPARE_LOG_RESULT))
+                       return tcu::TestStatus::fail("Rendered image is not correct");
+       }
+
+       return tcu::TestStatus::pass("OK");
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createScissorMultiViewportTests    (tcu::TestContext& testCtx)
+{
+       MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "multi_viewport", ""));
+
+       for (int numViewports = 1; numViewports <= MIN_MAX_VIEWPORTS; ++numViewports)
+               addFunctionCaseWithPrograms(group.get(), "scissor_" + de::toString(numViewports), "", initPrograms, test, numViewports);
+
+       return group.release();
+}
+
+} // FragmentOperations
+} // vkt
@@ -1,8 +1,11 @@
-/*-------------------------------------------------------------------------
+#ifndef _VKTFRAGMENTOPERATIONSSCISSORMULTIVIEWPORTTESTS_HPP
+#define _VKTFRAGMENTOPERATIONSSCISSORMULTIVIEWPORTTESTS_HPP
+/*------------------------------------------------------------------------
  * Vulkan Conformance Tests
  * ------------------------
  *
- * Copyright (c) 2016 Google Inc.
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2014 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  *
  *//*!
  * \file
- * \brief Texture filtering tests
+ * \brief Scissor multi viewport tests
  *//*--------------------------------------------------------------------*/
 
-#include "vktTextureFilteringTests.hpp"
-
-#include "vktTextureFilteringExplicitLodTests.hpp"
-#include "deUniquePtr.hpp"
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
 
 namespace vkt
 {
-namespace texture_filtering
-{
-
-tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx)
+namespace FragmentOperations
 {
-       de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(testCtx, "texture_filtering", "Texture filtering verification tests"));
 
-       group->addChild(createExplicitLodTests(testCtx));
+tcu::TestCaseGroup*            createScissorMultiViewportTests (tcu::TestContext& testCtx);
 
-       return group.release();
-}
-
-} // texture_filtering
+} // FragmentOperations
 } // vkt
+
+#endif // _VKTFRAGMENTOPERATIONSSCISSORMULTIVIEWPORTTESTS_HPP
index cd645c2..15fc68c 100644 (file)
@@ -23,7 +23,9 @@
  *//*--------------------------------------------------------------------*/
 
 #include "vktFragmentOperationsScissorTests.hpp"
+#include "vktFragmentOperationsScissorMultiViewportTests.hpp"
 #include "vktTestCaseUtil.hpp"
+#include "vktTestGroupUtil.hpp"
 #include "vktFragmentOperationsMakeUtil.hpp"
 
 #include "vkDefs.hpp"
@@ -85,7 +87,7 @@ inline VkDeviceSize sizeInBytes(const std::vector<T>& vec)
        return vec.size() * sizeof(vec[0]);
 }
 
-Move<VkImage> makeImage (const DeviceInterface& vk, const VkDevice device, const VkFormat format, const IVec2& size, VkImageUsageFlags usage)
+VkImageCreateInfo makeImageCreateInfo (const VkFormat format, const IVec2& size, VkImageUsageFlags usage)
 {
        const VkImageCreateInfo imageParams =
        {
@@ -105,13 +107,7 @@ Move<VkImage> makeImage (const DeviceInterface& vk, const VkDevice device, const
                DE_NULL,                                                                                // const deUint32*                      pQueueFamilyIndices;
                VK_IMAGE_LAYOUT_UNDEFINED,                                              // VkImageLayout                        initialLayout;
        };
-       return createImage(vk, device, &imageParams);
-}
-
-inline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkDeviceSize bufferSize, const VkBufferUsageFlags usage)
-{
-       const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage);
-       return createBuffer(vk, device, &bufferCreateInfo);
+       return imageParams;
 }
 
 //! A single-attachment, single-subpass render pass.
@@ -297,9 +293,8 @@ Move<VkPipeline> makeGraphicsPipeline (const DeviceInterface&               vk,
                1.0f,                                                                                                                   // float                                                                        maxDepthBounds;
        };
 
-       const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
-       // Number of blend attachments must equal the number of color attachments during any subpass.
-       const VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState =
+       const VkColorComponentFlags                                     colorComponentsAll                                      = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+       const VkPipelineColorBlendAttachmentState       pipelineColorBlendAttachmentState       =
        {
                VK_FALSE,                                               // VkBool32                                     blendEnable;
                VK_BLEND_FACTOR_ONE,                    // VkBlendFactor                        srcColorBlendFactor;
@@ -546,11 +541,11 @@ public:
                const deUint32                          queueFamilyIndex        = context.getUniversalQueueFamilyIndex();
                Allocator&                                      allocator                       = context.getDefaultAllocator();
 
-               m_colorImage                    = makeImage(vk, device, m_colorFormat, m_renderSize, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+               m_colorImage                    = makeImage(vk, device, makeImageCreateInfo(m_colorFormat, m_renderSize, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT));
                m_colorImageAlloc               = bindImage(vk, device, allocator, *m_colorImage, MemoryRequirement::Any);
                m_colorAttachment               = makeImageView(vk, device, *m_colorImage, VK_IMAGE_VIEW_TYPE_2D, m_colorFormat, m_colorSubresourceRange);
 
-               m_vertexBuffer                  = makeBuffer(vk, device, m_vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+               m_vertexBuffer                  = makeBuffer(vk, device, makeBufferCreateInfo(m_vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT));
                m_vertexBufferAlloc             = bindBuffer(vk, device, allocator, *m_vertexBuffer, MemoryRequirement::HostVisible);
 
                {
@@ -622,7 +617,7 @@ public:
                                        VK_QUEUE_FAMILY_IGNORED,                                                                        // deUint32                                     srcQueueFamilyIndex;
                                        VK_QUEUE_FAMILY_IGNORED,                                                                        // deUint32                                     destQueueFamilyIndex;
                                        *m_colorImage,                                                                                          // VkImage                                      image;
-                                       m_colorSubresourceRange,                                                                                // VkImageSubresourceRange      subresourceRange;
+                                       m_colorSubresourceRange,                                                                        // VkImageSubresourceRange      subresourceRange;
                                },
                        };
 
@@ -638,7 +633,7 @@ public:
                                0u,                                                                                                                                                     // uint32_t                    bufferImageHeight;
                                makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u),                      // VkImageSubresourceLayers    imageSubresource;
                                makeOffset3D(0, 0, 0),                                                                                                          // VkOffset3D                  imageOffset;
-                               makeExtent3D(m_renderSize.x(), m_renderSize.y(), 1u),                                                   // VkExtent3D                  imageExtent;
+                               makeExtent3D(m_renderSize.x(), m_renderSize.y(), 1u),                                           // VkExtent3D                  imageExtent;
                        };
 
                        vk.cmdCopyImageToBuffer(*m_cmdBuffer, *m_colorImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, colorBuffer, 1u, &region);
@@ -709,10 +704,10 @@ tcu::TestStatus test (Context& context, const CaseDef caseDef)
        const Vec4                                              clearColor                                      (0.5f, 0.5f, 1.0f, 1.0f);
 
        const VkDeviceSize                              colorBufferSize                         = renderSize.x() * renderSize.y() * tcu::getPixelSize(mapVkFormat(colorFormat));
-       const Unique<VkBuffer>                  colorBufferFull                         (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
+       const Unique<VkBuffer>                  colorBufferFull                         (makeBuffer(vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
        const UniquePtr<Allocation>             colorBufferFullAlloc            (bindBuffer(vk, device, allocator, *colorBufferFull, MemoryRequirement::HostVisible));
 
-       const Unique<VkBuffer>                  colorBufferScissored            (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT));
+       const Unique<VkBuffer>                  colorBufferScissored            (makeBuffer(vk, device, makeBufferCreateInfo(colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)));
        const UniquePtr<Allocation>             colorBufferScissoredAlloc       (bindBuffer(vk, device, allocator, *colorBufferScissored, MemoryRequirement::HostVisible));
 
        zeroBuffer(vk, device, *colorBufferFullAlloc, colorBufferSize);
@@ -745,13 +740,11 @@ tcu::TestStatus test (Context& context, const CaseDef caseDef)
        return tcu::TestStatus::pass("OK");
 }
 
-} // anonymous
-
 //! \note The ES 2.0 scissoring tests included color/depth/stencil clear cases, but these operations are not affected by scissor test in Vulkan.
 //!       Scissor is part of the pipeline state and pipeline only affects the drawing commands.
-tcu::TestCaseGroup* createScissorTests (tcu::TestContext& testCtx)
+void createTestsInGroup (tcu::TestCaseGroup* scissorGroup)
 {
-       MovePtr<tcu::TestCaseGroup> scissorGroup(new tcu::TestCaseGroup(testCtx, "scissor", "Scissor tests"));
+       tcu::TestContext& testCtx = scissorGroup->getTestContext();
 
        struct TestSpec
        {
@@ -819,7 +812,17 @@ tcu::TestCaseGroup* createScissorTests (tcu::TestContext& testCtx)
                scissorGroup->addChild(primitiveGroup.release());
        }
 
-       return scissorGroup.release();
+       // Mulit-viewport scissor
+       {
+               scissorGroup->addChild(createScissorMultiViewportTests(testCtx));
+       }
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createScissorTests (tcu::TestContext& testCtx)
+{
+       return createTestGroup(testCtx, "scissor", "Scissor tests", createTestsInGroup);
 }
 
 } // FragmentOperations
index f14678a..b70ee7f 100644 (file)
@@ -24,6 +24,7 @@
 #include "vktFragmentOperationsTests.hpp"
 #include "vktTestGroupUtil.hpp"
 #include "vktFragmentOperationsScissorTests.hpp"
+#include "vktFragmentOperationsEarlyFragmentTests.hpp"
 
 namespace vkt
 {
@@ -36,7 +37,8 @@ void addFragmentOperationsTests (tcu::TestCaseGroup* fragmentOperationsTestsGrou
 {
        tcu::TestContext& testCtx = fragmentOperationsTestsGroup->getTestContext();
 
-       fragmentOperationsTestsGroup->addChild(createScissorTests(testCtx));
+       fragmentOperationsTestsGroup->addChild(createScissorTests               (testCtx));
+       fragmentOperationsTestsGroup->addChild(createEarlyFragmentTests (testCtx));
 }
 
 } // anonymous
index e47e1fd..cafca7c 100644 (file)
@@ -15,6 +15,10 @@ set(DEQP_VK_IMAGE_SRCS
        vktImageSizeTests.hpp
        vktImageTexture.cpp
        vktImageTexture.hpp
+       vktImageMultisampleLoadStoreTests.cpp
+       vktImageMultisampleLoadStoreTests.hpp
+       vktImageLoadStoreUtil.cpp
+       vktImageLoadStoreUtil.hpp
        )
 
 set(DEQP_VK_IMAGE_LIBS
index b5c57af..ba27a7c 100644 (file)
@@ -25,6 +25,7 @@
 #include "vktImageLoadStoreTests.hpp"
 #include "vktTestCaseUtil.hpp"
 #include "vktImageTestsUtil.hpp"
+#include "vktImageLoadStoreUtil.hpp"
 #include "vktImageTexture.hpp"
 
 #include "vkDefs.hpp"
@@ -58,93 +59,11 @@ namespace image
 namespace
 {
 
-typedef de::SharedPtr<Unique<VkDescriptorSet> >        SharedVkDescriptorSet;
-typedef de::SharedPtr<Unique<VkImageView> >            SharedVkImageView;
-
-template<typename T>
-inline de::SharedPtr<Unique<T> > makeVkSharedPtr (Move<T> vkMove)
-{
-       return de::SharedPtr<Unique<T> >(new Unique<T>(vkMove));
-}
-
-inline VkImageCreateInfo makeImageCreateInfo (const Texture& texture, const VkFormat format, const VkImageUsageFlags usage, const VkImageCreateFlags flags)
-{
-       const VkImageCreateInfo imageParams =
-       {
-               VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,                                                                                                            // VkStructureType                      sType;
-               DE_NULL,                                                                                                                                                                        // const void*                          pNext;
-               (isCube(texture) ? (VkImageCreateFlags)VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0u) | flags,       // VkImageCreateFlags           flags;
-               mapImageType(texture.type()),                                                                                                                           // VkImageType                          imageType;
-               format,                                                                                                                                                                         // VkFormat                                     format;
-               makeExtent3D(texture.layerSize()),                                                                                                                      // VkExtent3D                           extent;
-               1u,                                                                                                                                                                                     // deUint32                                     mipLevels;
-               (deUint32)texture.numLayers(),                                                                                                                          // deUint32                                     arrayLayers;
-               VK_SAMPLE_COUNT_1_BIT,                                                                                                                                          // VkSampleCountFlagBits        samples;
-               VK_IMAGE_TILING_OPTIMAL,                                                                                                                                        // VkImageTiling                        tiling;
-               usage,                                                                                                                                                                          // VkImageUsageFlags            usage;
-               VK_SHARING_MODE_EXCLUSIVE,                                                                                                                                      // VkSharingMode                        sharingMode;
-               0u,                                                                                                                                                                                     // deUint32                                     queueFamilyIndexCount;
-               DE_NULL,                                                                                                                                                                        // const deUint32*                      pQueueFamilyIndices;
-               VK_IMAGE_LAYOUT_UNDEFINED,                                                                                                                                      // VkImageLayout                        initialLayout;
-       };
-       return imageParams;
-}
-
 inline VkBufferImageCopy makeBufferImageCopy (const Texture& texture)
 {
        return image::makeBufferImageCopy(makeExtent3D(texture.layerSize()), texture.numLayers());
 }
 
-ImageType getImageTypeForSingleLayer (const ImageType imageType)
-{
-       switch (imageType)
-       {
-               case IMAGE_TYPE_1D:
-               case IMAGE_TYPE_1D_ARRAY:
-                       return IMAGE_TYPE_1D;
-
-               case IMAGE_TYPE_2D:
-               case IMAGE_TYPE_2D_ARRAY:
-               case IMAGE_TYPE_CUBE:
-               case IMAGE_TYPE_CUBE_ARRAY:
-                       // A single layer for cube is a 2d face
-                       return IMAGE_TYPE_2D;
-
-               case IMAGE_TYPE_3D:
-                       return IMAGE_TYPE_3D;
-
-               case IMAGE_TYPE_BUFFER:
-                       return IMAGE_TYPE_BUFFER;
-
-               default:
-                       DE_FATAL("Internal test error");
-                       return IMAGE_TYPE_LAST;
-       }
-}
-
-float computeStoreColorScale (const VkFormat format, const tcu::IVec3 imageSize)
-{
-       const int maxImageDimension = de::max(imageSize.x(), de::max(imageSize.y(), imageSize.z()));
-       const float div = static_cast<float>(maxImageDimension - 1);
-
-       if (isUnormFormat(format))
-               return 1.0f / div;
-       else if (isSnormFormat(format))
-               return 2.0f / div;
-       else
-               return 1.0f;
-}
-
-inline float computeStoreColorBias (const VkFormat format)
-{
-       return isSnormFormat(format) ? -1.0f : 0.0f;
-}
-
-inline bool isIntegerFormat (const VkFormat format)
-{
-       return isIntFormat(format) || isUintFormat(format);
-}
-
 tcu::ConstPixelBufferAccess getLayerOrSlice (const Texture& texture, const tcu::ConstPixelBufferAccess access, const int layer)
 {
        switch (texture.type())
@@ -171,15 +90,6 @@ tcu::ConstPixelBufferAccess getLayerOrSlice (const Texture& texture, const tcu::
        }
 }
 
-std::string getFormatCaseName (const VkFormat format)
-{
-       const std::string fullName = getFormatName(format);
-
-       DE_ASSERT(de::beginsWith(fullName, "VK_FORMAT_"));
-
-       return de::toLower(fullName.substr(10));
-}
-
 //! \return true if all layers match in both pixel buffers
 bool comparePixelBuffers (tcu::TestLog&                                                log,
                                                  const Texture&                                        texture,
@@ -340,15 +250,6 @@ void flipHorizontally (const tcu::PixelBufferAccess access)
                }
 }
 
-#if defined(DE_DEBUG)
-inline bool colorScaleAndBiasAreValid (const VkFormat format, const float colorScale, const float colorBias)
-{
-       // Only normalized (fixed-point) formats may have scale/bias
-       const bool integerOrFloatFormat = isIntFormat(format) || isUintFormat(format) || isFloatFormat(format);
-       return !integerOrFloatFormat || (colorScale == 1.0f && colorBias == 0.0f);
-}
-#endif
-
 inline bool formatsAreCompatible (const VkFormat format0, const VkFormat format1)
 {
        return format0 == format1 || mapVkFormat(format0).getPixelSize() == mapVkFormat(format1).getPixelSize();
@@ -405,18 +306,6 @@ void commandCopyImageToBuffer (Context&                                    context,
        vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &copyBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
 }
 
-//! Minimum chunk size is determined by the offset alignment requirements.
-VkDeviceSize getOptimalUniformBufferChunkSize (Context& context, VkDeviceSize minimumRequiredChunkSizeBytes)
-{
-       const VkPhysicalDeviceProperties properties = getPhysicalDeviceProperties(context.getInstanceInterface(), context.getPhysicalDevice());
-       const VkDeviceSize alignment = properties.limits.minUniformBufferOffsetAlignment;
-
-       if (minimumRequiredChunkSizeBytes > alignment)
-               return alignment + (minimumRequiredChunkSizeBytes / alignment) * alignment;
-       else
-               return alignment;
-}
-
 class StoreTest : public TestCase
 {
 public:
@@ -486,7 +375,7 @@ void StoreTest::initPrograms (SourceCollections& programCollection) const
        src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
                << "\n"
                << "layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
-               << "layout (binding = 0, " << formatQualifierStr << ") writeonly uniform highp " << imageTypeStr << " u_image;\n";
+               << "layout (binding = 0, " << formatQualifierStr << ") writeonly uniform " << imageTypeStr << " u_image;\n";
 
        if (m_singleLayerBind)
                src << "layout (binding = 1) readonly uniform Constants {\n"
@@ -673,7 +562,7 @@ ImageStoreTestInstance::ImageStoreTestInstance (Context&            context,
                                                                                                const VkFormat  format,
                                                                                                const bool              singleLayerBind)
        : StoreTestInstance                                     (context, texture, format, singleLayerBind)
-       , m_constantsBufferChunkSizeBytes       (getOptimalUniformBufferChunkSize(context, sizeof(deUint32)))
+       , m_constantsBufferChunkSizeBytes       (getOptimalUniformBufferChunkSize(context.getInstanceInterface(), context.getPhysicalDevice(), sizeof(deUint32)))
        , m_allDescriptorSets                           (texture.numLayers())
        , m_allImageViews                                       (texture.numLayers())
 {
@@ -925,8 +814,8 @@ void LoadStoreTest::initPrograms (SourceCollections& programCollection) const
        src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_440) << "\n"
                << "\n"
                << "layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n"
-               << "layout (binding = 0, " << formatQualifierStr << ") " << maybeRestrictStr << "readonly uniform highp " << imageTypeStr << " u_image0;\n"
-               << "layout (binding = 1, " << formatQualifierStr << ") " << maybeRestrictStr << "writeonly uniform highp " << imageTypeStr << " u_image1;\n"
+               << "layout (binding = 0, " << formatQualifierStr << ") " << maybeRestrictStr << "readonly uniform " << imageTypeStr << " u_image0;\n"
+               << "layout (binding = 1, " << formatQualifierStr << ") " << maybeRestrictStr << "writeonly uniform " << imageTypeStr << " u_image1;\n"
                << "\n"
                << "void main (void)\n"
                << "{\n"
@@ -1286,9 +1175,6 @@ TestInstance* LoadStoreTest::createInstance (Context& context) const
                return new ImageLoadStoreTestInstance(context, m_texture, m_format, m_imageFormat, m_singleLayerBind);
 }
 
-// TODO Which image/format combinations should be supported? Spec says it should be queried with vkGetPhysicalDeviceImageFormatProperties.
-//      What about buffer/format? (texel storage buffer) (use vkGetPhysicalDeviceFormatProperties ?)
-
 static const Texture s_textures[] =
 {
        Texture(IMAGE_TYPE_1D,                  tcu::IVec3(64,  1,      1),     1),
@@ -1346,10 +1232,10 @@ tcu::TestCaseGroup* createImageStoreTests (tcu::TestContext& testCtx)
 
                for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_formats); ++formatNdx)
                {
-                       groupByImageViewType->addChild(new StoreTest(testCtx, getFormatCaseName(s_formats[formatNdx]), "", texture, s_formats[formatNdx]));
+                       groupByImageViewType->addChild(new StoreTest(testCtx, getFormatShortString(s_formats[formatNdx]), "", texture, s_formats[formatNdx]));
 
                        if (isLayered)
-                               groupByImageViewType->addChild(new StoreTest(testCtx, getFormatCaseName(s_formats[formatNdx]) + "_single_layer", "",
+                               groupByImageViewType->addChild(new StoreTest(testCtx, getFormatShortString(s_formats[formatNdx]) + "_single_layer", "",
                                                                                                texture, s_formats[formatNdx], StoreTest::FLAG_SINGLE_LAYER_BIND));
                }
                testGroup->addChild(groupByImageViewType.release());
@@ -1370,11 +1256,11 @@ tcu::TestCaseGroup* createImageLoadStoreTests (tcu::TestContext& testCtx)
 
                for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_formats); ++formatNdx)
                {
-                       groupByImageViewType->addChild(new LoadStoreTest(testCtx, getFormatCaseName(s_formats[formatNdx]), "",
+                       groupByImageViewType->addChild(new LoadStoreTest(testCtx, getFormatShortString(s_formats[formatNdx]), "",
                                                                                        texture, s_formats[formatNdx], s_formats[formatNdx]));
 
                        if (isLayered)
-                               groupByImageViewType->addChild(new LoadStoreTest(testCtx, getFormatCaseName(s_formats[formatNdx]) + "_single_layer", "",
+                               groupByImageViewType->addChild(new LoadStoreTest(testCtx, getFormatShortString(s_formats[formatNdx]) + "_single_layer", "",
                                                                                                texture, s_formats[formatNdx], s_formats[formatNdx], LoadStoreTest::FLAG_SINGLE_LAYER_BIND));
                }
                testGroup->addChild(groupByImageViewType.release());
@@ -1395,9 +1281,7 @@ tcu::TestCaseGroup* createImageFormatReinterpretTests (tcu::TestContext& testCtx
                for (int imageFormatNdx = 0; imageFormatNdx < DE_LENGTH_OF_ARRAY(s_formats); ++imageFormatNdx)
                for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_formats); ++formatNdx)
                {
-                       //TODO Are all conversions valid or do we have to limit (or expand) somehow? Is it stated anywhere in the spec?
-
-                       const std::string caseName = getFormatCaseName(s_formats[imageFormatNdx]) + "_" + getFormatCaseName(s_formats[formatNdx]);
+                       const std::string caseName = getFormatShortString(s_formats[imageFormatNdx]) + "_" + getFormatShortString(s_formats[formatNdx]);
                        if (imageFormatNdx != formatNdx && formatsAreCompatible(s_formats[imageFormatNdx], s_formats[formatNdx]))
                                groupByImageViewType->addChild(new LoadStoreTest(testCtx, caseName, "", texture, s_formats[formatNdx], s_formats[imageFormatNdx]));
                }
diff --git a/external/vulkancts/modules/vulkan/image/vktImageLoadStoreUtil.cpp b/external/vulkancts/modules/vulkan/image/vktImageLoadStoreUtil.cpp
new file mode 100644 (file)
index 0000000..4d5a027
--- /dev/null
@@ -0,0 +1,114 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Image load/store utilities
+ *//*--------------------------------------------------------------------*/
+
+#include "vktImageLoadStoreUtil.hpp"
+#include "vkQueryUtil.hpp"
+
+using namespace vk;
+
+namespace vkt
+{
+namespace image
+{
+
+float computeStoreColorScale (const vk::VkFormat format, const tcu::IVec3 imageSize)
+{
+       const int maxImageDimension = de::max(imageSize.x(), de::max(imageSize.y(), imageSize.z()));
+       const float div = static_cast<float>(maxImageDimension - 1);
+
+       if (isUnormFormat(format))
+               return 1.0f / div;
+       else if (isSnormFormat(format))
+               return 2.0f / div;
+       else
+               return 1.0f;
+}
+
+ImageType getImageTypeForSingleLayer (const ImageType imageType)
+{
+       switch (imageType)
+       {
+               case IMAGE_TYPE_1D:
+               case IMAGE_TYPE_1D_ARRAY:
+                       return IMAGE_TYPE_1D;
+
+               case IMAGE_TYPE_2D:
+               case IMAGE_TYPE_2D_ARRAY:
+               case IMAGE_TYPE_CUBE:
+               case IMAGE_TYPE_CUBE_ARRAY:
+                       // A single layer for cube is a 2d face
+                       return IMAGE_TYPE_2D;
+
+               case IMAGE_TYPE_3D:
+                       return IMAGE_TYPE_3D;
+
+               case IMAGE_TYPE_BUFFER:
+                       return IMAGE_TYPE_BUFFER;
+
+               default:
+                       DE_FATAL("Internal test error");
+                       return IMAGE_TYPE_LAST;
+       }
+}
+
+VkImageCreateInfo makeImageCreateInfo (const Texture& texture, const VkFormat format, const VkImageUsageFlags usage, const VkImageCreateFlags flags)
+{
+       const VkSampleCountFlagBits samples = static_cast<VkSampleCountFlagBits>(texture.numSamples()); // integer and bit mask are aligned, so we can cast like this
+
+       const VkImageCreateInfo imageParams =
+       {
+               VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,                                                                                                            // VkStructureType                      sType;
+               DE_NULL,                                                                                                                                                                        // const void*                          pNext;
+               (isCube(texture) ? (VkImageCreateFlags)VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0u) | flags,       // VkImageCreateFlags           flags;
+               mapImageType(texture.type()),                                                                                                                           // VkImageType                          imageType;
+               format,                                                                                                                                                                         // VkFormat                                     format;
+               makeExtent3D(texture.layerSize()),                                                                                                                      // VkExtent3D                           extent;
+               1u,                                                                                                                                                                                     // deUint32                                     mipLevels;
+               (deUint32)texture.numLayers(),                                                                                                                          // deUint32                                     arrayLayers;
+               samples,                                                                                                                                                                        // VkSampleCountFlagBits        samples;
+               VK_IMAGE_TILING_OPTIMAL,                                                                                                                                        // VkImageTiling                        tiling;
+               usage,                                                                                                                                                                          // VkImageUsageFlags            usage;
+               VK_SHARING_MODE_EXCLUSIVE,                                                                                                                                      // VkSharingMode                        sharingMode;
+               0u,                                                                                                                                                                                     // deUint32                                     queueFamilyIndexCount;
+               DE_NULL,                                                                                                                                                                        // const deUint32*                      pQueueFamilyIndices;
+               VK_IMAGE_LAYOUT_UNDEFINED,                                                                                                                                      // VkImageLayout                        initialLayout;
+       };
+       return imageParams;
+}
+
+
+//! Minimum chunk size is determined by the offset alignment requirements.
+VkDeviceSize getOptimalUniformBufferChunkSize (const InstanceInterface& vki, const VkPhysicalDevice physDevice, VkDeviceSize minimumRequiredChunkSizeBytes)
+{
+       const VkPhysicalDeviceProperties properties = getPhysicalDeviceProperties(vki, physDevice);
+       const VkDeviceSize alignment = properties.limits.minUniformBufferOffsetAlignment;
+
+       if (minimumRequiredChunkSizeBytes > alignment)
+               return alignment + (minimumRequiredChunkSizeBytes / alignment) * alignment;
+       else
+               return alignment;
+}
+
+} // image
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/image/vktImageLoadStoreUtil.hpp b/external/vulkancts/modules/vulkan/image/vktImageLoadStoreUtil.hpp
new file mode 100644 (file)
index 0000000..a25a00d
--- /dev/null
@@ -0,0 +1,73 @@
+#ifndef _VKTIMAGELOADSTOREUTIL_HPP
+#define _VKTIMAGELOADSTOREUTIL_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Image load/store utilities
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vkDefs.hpp"
+#include "vkImageUtil.hpp"
+#include "vktImageTestsUtil.hpp"
+#include "vktImageTexture.hpp"
+#include "tcuVector.hpp"
+#include "deSharedPtr.hpp"
+
+namespace vkt
+{
+namespace image
+{
+
+typedef de::SharedPtr<vk::Unique<vk::VkDescriptorSet> >        SharedVkDescriptorSet;
+typedef de::SharedPtr<vk::Unique<vk::VkImageView> >            SharedVkImageView;
+
+template<typename T>
+inline de::SharedPtr<vk::Unique<T> > makeVkSharedPtr (vk::Move<T> vkMove)
+{
+       return de::SharedPtr<vk::Unique<T> >(new vk::Unique<T>(vkMove));
+}
+
+inline float computeStoreColorBias (const vk::VkFormat format)
+{
+       return isSnormFormat(format) ? -1.0f : 0.0f;
+}
+
+inline bool isIntegerFormat (const vk::VkFormat format)
+{
+       return isIntFormat(format) || isUintFormat(format);
+}
+
+inline bool colorScaleAndBiasAreValid (const vk::VkFormat format, const float colorScale, const float colorBias)
+{
+       // Only normalized (fixed-point) formats may have scale/bias
+       const bool integerOrFloatFormat = isIntFormat(format) || isUintFormat(format) || isFloatFormat(format);
+       return !integerOrFloatFormat || (colorScale == 1.0f && colorBias == 0.0f);
+}
+
+float                                  computeStoreColorScale                          (const vk::VkFormat format, const tcu::IVec3 imageSize);
+ImageType                              getImageTypeForSingleLayer                      (const ImageType imageType);
+vk::VkImageCreateInfo  makeImageCreateInfo                                     (const Texture& texture, const vk::VkFormat format, const vk::VkImageUsageFlags usage, const vk::VkImageCreateFlags flags);
+vk::VkDeviceSize               getOptimalUniformBufferChunkSize        (const vk::InstanceInterface& vki, const vk::VkPhysicalDevice physDevice, vk::VkDeviceSize minimumRequiredChunkSizeBytes);
+
+} // image
+} // vkt
+
+#endif // _VKTIMAGELOADSTOREUTIL_HPP
diff --git a/external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.cpp b/external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.cpp
new file mode 100644 (file)
index 0000000..6f8bdac
--- /dev/null
@@ -0,0 +1,541 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Multisampled image load/store Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "vktImageMultisampleLoadStoreTests.hpp"
+#include "vktTestCaseUtil.hpp"
+#include "vktImageTestsUtil.hpp"
+#include "vktImageLoadStoreUtil.hpp"
+#include "vktImageTexture.hpp"
+
+#include "vkDefs.hpp"
+#include "vkRef.hpp"
+#include "vkRefUtil.hpp"
+#include "vkPlatform.hpp"
+#include "vkPrograms.hpp"
+#include "vkMemUtil.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkImageUtil.hpp"
+
+#include "deUniquePtr.hpp"
+
+#include "tcuTextureUtil.hpp"
+
+#include <string>
+#include <vector>
+
+namespace vkt
+{
+namespace image
+{
+namespace
+{
+using namespace vk;
+using de::MovePtr;
+using de::UniquePtr;
+using tcu::IVec3;
+
+static const VkFormat CHECKSUM_IMAGE_FORMAT = VK_FORMAT_R32_SINT;
+
+struct CaseDef
+{
+       Texture                                 texture;
+       VkFormat                                format;
+       VkSampleCountFlagBits   numSamples;
+       bool                                    singleLayerBind;
+};
+
+//  Multisampled storage image test.
+//
+//  Pass 1: Write a slightly different color pattern per-sample to the whole image.
+//  Pass 2: Read samples of the same image and check if color values are in the expected range.
+//          Write back results as a checksum image and verify them on the host.
+//  Each checksum image pixel should contain an integer equal to the number of samples.
+
+void initPrograms (SourceCollections& programCollection, const  CaseDef caseDef)
+{
+       const int                       dimension                       = (caseDef.singleLayerBind ? caseDef.texture.layerDimension() : caseDef.texture.dimension());
+       const std::string       texelCoordStr           = (dimension == 1 ? "gx" : dimension == 2 ? "ivec2(gx, gy)" : dimension == 3 ? "ivec3(gx, gy, gz)" : "");
+
+       const ImageType         usedImageType           = (caseDef.singleLayerBind ? getImageTypeForSingleLayer(caseDef.texture.type()) : caseDef.texture.type());
+       const std::string       formatQualifierStr      = getShaderImageFormatQualifier(mapVkFormat(caseDef.format));
+       const std::string       msImageTypeStr          = getShaderImageType(mapVkFormat(caseDef.format), usedImageType, (caseDef.texture.numSamples() > 1));
+
+       const std::string       xMax                            = de::toString(caseDef.texture.size().x() - 1);
+       const std::string       yMax                            = de::toString(caseDef.texture.size().y() - 1);
+       const std::string       signednessPrefix        = isUintFormat(caseDef.format) ? "u" : isIntFormat(caseDef.format) ? "i" : "";
+       const std::string       gvec4Expr                       = signednessPrefix + "vec4";
+       const int                       numColorComponents      = tcu::getNumUsedChannels(mapVkFormat(caseDef.format).order);
+
+       const float                     storeColorScale         = computeStoreColorScale(caseDef.format, caseDef.texture.size());
+       const float                     storeColorBias          = computeStoreColorBias(caseDef.format);
+       DE_ASSERT(colorScaleAndBiasAreValid(caseDef.format, storeColorScale, storeColorBias));
+
+       const std::string       colorScaleExpr          = (storeColorScale == 1.0f ? "" : "*" + de::toString(storeColorScale))
+                                                                                       + (storeColorBias == 0.0f ? "" : " + float(" + de::toString(storeColorBias) + ")");
+       const std::string       colorExpr                       =
+               gvec4Expr + "("
+               +                           "gx^gy^gz^(sampleNdx >> 5)^(sampleNdx & 31), "              // we "split" sampleNdx to keep this value in [0, 31] range for numSamples = 64 case
+               + (numColorComponents > 1 ? "(" + xMax + "-gx)^gy^gz, "              : "0, ")
+               + (numColorComponents > 2 ? "gx^(" + yMax + "-gy)^gz, "              : "0, ")
+               + (numColorComponents > 3 ? "(" + xMax + "-gx)^(" + yMax + "-gy)^gz" : "1")
+               + ")" + colorScaleExpr;
+
+       // Store shader
+       {
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "layout(local_size_x = 1) in;\n"
+                       << "layout(set = 0, binding = 1, " << formatQualifierStr << ") writeonly uniform " << msImageTypeStr << " u_msImage;\n";
+
+               if (caseDef.singleLayerBind)
+                       src << "layout(set = 0, binding = 0) readonly uniform Constants {\n"
+                               << "    int u_layerNdx;\n"
+                               << "};\n";
+
+               src << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "    int gx = int(gl_GlobalInvocationID.x);\n"
+                       << "    int gy = int(gl_GlobalInvocationID.y);\n"
+                       << "    int gz = " << (caseDef.singleLayerBind ? "u_layerNdx" : "int(gl_GlobalInvocationID.z)") << ";\n"
+                       << "\n"
+                       << "    for (int sampleNdx = 0; sampleNdx < " << caseDef.texture.numSamples() <<"; ++sampleNdx) {\n"
+                       << "        imageStore(u_msImage, " << texelCoordStr << ", sampleNdx, " << colorExpr << ");\n"
+                       << "    }\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp_store") << glu::ComputeSource(src.str());
+       }
+
+       // Load shader
+       {
+               const tcu::TextureFormat        checksumFormat                  = mapVkFormat(CHECKSUM_IMAGE_FORMAT);
+               const std::string                       checksumImageTypeStr    = getShaderImageType(checksumFormat, usedImageType);
+               const bool                                      useExactCompare                 = isIntegerFormat(caseDef.format);
+
+               std::ostringstream src;
+               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n"
+                       << "\n"
+                       << "layout(local_size_x = 1) in;\n"
+                       << "layout(set = 0, binding = 1, " << formatQualifierStr << ") readonly  uniform " << msImageTypeStr << " u_msImage;\n"
+                       << "layout(set = 0, binding = 2, " << getShaderImageFormatQualifier(checksumFormat) << ") writeonly uniform " << checksumImageTypeStr << " u_checksumImage;\n";
+
+               if (caseDef.singleLayerBind)
+                       src << "layout(set = 0, binding = 0) readonly uniform Constants {\n"
+                               << "    int u_layerNdx;\n"
+                               << "};\n";
+
+               src << "\n"
+                       << "void main (void)\n"
+                       << "{\n"
+                       << "    int gx = int(gl_GlobalInvocationID.x);\n"
+                       << "    int gy = int(gl_GlobalInvocationID.y);\n"
+                       << "    int gz = " << (caseDef.singleLayerBind ? "u_layerNdx" : "int(gl_GlobalInvocationID.z)") << ";\n"
+                       << "\n"
+                       << "    int checksum = 0;\n"
+                       << "    for (int sampleNdx = 0; sampleNdx < " << caseDef.texture.numSamples() <<"; ++sampleNdx) {\n"
+                       << "        " << gvec4Expr << " color = imageLoad(u_msImage, " << texelCoordStr << ", sampleNdx);\n";
+
+               if (useExactCompare)
+                       src << "        if (color == " << colorExpr << ")\n"
+                               << "            ++checksum;\n";
+               else
+                       src << "        " << gvec4Expr << " diff  = abs(abs(color) - abs(" << colorExpr << "));\n"
+                               << "        if (all(lessThan(diff, " << gvec4Expr << "(0.02))))\n"
+                               << "            ++checksum;\n";
+
+               src << "    }\n"
+                       << "\n"
+                       << "    imageStore(u_checksumImage, " << texelCoordStr << ", ivec4(checksum));\n"
+                       << "}\n";
+
+               programCollection.glslSources.add("comp_load") << glu::ComputeSource(src.str());
+       }
+}
+
+void checkRequirements (const InstanceInterface& vki, const VkPhysicalDevice physDevice, const CaseDef& caseDef)
+{
+       VkPhysicalDeviceFeatures        features;
+       vki.getPhysicalDeviceFeatures(physDevice, &features);
+
+       if (!features.shaderStorageImageMultisample)
+               TCU_THROW(NotSupportedError, "Multisampled storage images are not supported");
+
+       VkImageFormatProperties         imageFormatProperties;
+       const VkResult                          imageFormatResult               = vki.getPhysicalDeviceImageFormatProperties(
+               physDevice, caseDef.format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_STORAGE_BIT, (VkImageCreateFlags)0, &imageFormatProperties);
+
+       if (imageFormatResult == VK_ERROR_FORMAT_NOT_SUPPORTED)
+               TCU_THROW(NotSupportedError, "Format is not supported");
+
+       if ((imageFormatProperties.sampleCounts & caseDef.numSamples) != caseDef.numSamples)
+               TCU_THROW(NotSupportedError, "Requested sample count is not supported");
+}
+
+//! Helper function to deal with per-layer resources.
+void insertImageViews (const DeviceInterface& vk, const VkDevice device, const CaseDef& caseDef, const VkFormat format, const VkImage image, std::vector<SharedVkImageView>* const pOutImageViews)
+{
+       if (caseDef.singleLayerBind)
+       {
+               pOutImageViews->clear();
+               pOutImageViews->resize(caseDef.texture.numLayers());
+               for (int layerNdx = 0; layerNdx < caseDef.texture.numLayers(); ++layerNdx)
+               {
+                       (*pOutImageViews)[layerNdx] = makeVkSharedPtr(makeImageView(
+                               vk, device, image, mapImageViewType(getImageTypeForSingleLayer(caseDef.texture.type())), format,
+                               makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, layerNdx, 1u)));
+               }
+       }
+       else // bind all layers at once
+       {
+               pOutImageViews->clear();
+               pOutImageViews->resize(1);
+               (*pOutImageViews)[0] = makeVkSharedPtr(makeImageView(
+                       vk, device, image, mapImageViewType(caseDef.texture.type()), format,
+                       makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, caseDef.texture.numLayers())));
+       }
+}
+
+//! Helper function to deal with per-layer resources.
+void insertDescriptorSets (const DeviceInterface& vk, const VkDevice device, const CaseDef& caseDef, const VkDescriptorPool descriptorPool, const VkDescriptorSetLayout descriptorSetLayout, std::vector<SharedVkDescriptorSet>* const pOutDescriptorSets)
+{
+       if (caseDef.singleLayerBind)
+       {
+               pOutDescriptorSets->clear();
+               pOutDescriptorSets->resize(caseDef.texture.numLayers());
+               for (int layerNdx = 0; layerNdx < caseDef.texture.numLayers(); ++layerNdx)
+                       (*pOutDescriptorSets)[layerNdx] = makeVkSharedPtr(makeDescriptorSet(vk, device, descriptorPool, descriptorSetLayout));
+       }
+       else // bind all layers at once
+       {
+               pOutDescriptorSets->clear();
+               pOutDescriptorSets->resize(1);
+               (*pOutDescriptorSets)[0] = makeVkSharedPtr(makeDescriptorSet(vk, device, descriptorPool, descriptorSetLayout));
+       }
+}
+
+tcu::TestStatus test (Context& context, const CaseDef caseDef)
+{
+       const InstanceInterface&        vki                                     = context.getInstanceInterface();
+       const VkPhysicalDevice          physDevice                      = context.getPhysicalDevice();
+       const DeviceInterface&          vk                                      = context.getDeviceInterface();
+       const VkDevice                          device                          = context.getDevice();
+       const VkQueue                           queue                           = context.getUniversalQueue();
+       const deUint32                          queueFamilyIndex        = context.getUniversalQueueFamilyIndex();
+       Allocator&                                      allocator                       = context.getDefaultAllocator();
+
+       checkRequirements(vki, physDevice, caseDef);
+
+       // Images
+
+       const UniquePtr<Image> msImage(new Image(
+               vk, device, allocator, makeImageCreateInfo(caseDef.texture, caseDef.format, VK_IMAGE_USAGE_STORAGE_BIT, 0u), MemoryRequirement::Any));
+
+       const UniquePtr<Image> checksumImage(new Image(
+               vk, device, allocator,
+               makeImageCreateInfo(Texture(caseDef.texture, 1), CHECKSUM_IMAGE_FORMAT, VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0u),
+               MemoryRequirement::Any));
+
+       // Buffer used to pass constants to the shader.
+
+       const int                       numLayers                                       = caseDef.texture.numLayers();
+       const VkDeviceSize      bufferChunkSize                         = getOptimalUniformBufferChunkSize(vki, physDevice, sizeof(deInt32));
+       const VkDeviceSize      constantsBufferSizeBytes        = numLayers * bufferChunkSize;
+       UniquePtr<Buffer>       constantsBuffer                         (new Buffer(vk, device, allocator, makeBufferCreateInfo(constantsBufferSizeBytes, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT),
+                                                                                                        MemoryRequirement::HostVisible));
+
+       {
+               const Allocation&       alloc   = constantsBuffer->getAllocation();
+               deUint8* const          basePtr = static_cast<deUint8*>(alloc.getHostPtr());
+
+               deMemset(alloc.getHostPtr(), 0, static_cast<size_t>(constantsBufferSizeBytes));
+
+               for (int layerNdx = 0; layerNdx < numLayers; ++layerNdx)
+               {
+                       deInt32* const valuePtr = reinterpret_cast<deInt32*>(basePtr + layerNdx * bufferChunkSize);
+                       *valuePtr = layerNdx;
+               }
+
+               flushMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), constantsBufferSizeBytes);
+       }
+
+       const VkDeviceSize      resultBufferSizeBytes   = getImageSizeBytes(caseDef.texture.size(), CHECKSUM_IMAGE_FORMAT);
+       UniquePtr<Buffer>       resultBuffer                    (new Buffer(vk, device, allocator, makeBufferCreateInfo(resultBufferSizeBytes, VK_BUFFER_USAGE_TRANSFER_DST_BIT),
+                                                                                                MemoryRequirement::HostVisible));
+
+       {
+               const Allocation& alloc = resultBuffer->getAllocation();
+               deMemset(alloc.getHostPtr(), 0, static_cast<size_t>(resultBufferSizeBytes));
+               flushMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), resultBufferSizeBytes);
+       }
+
+       // Descriptors
+
+       Unique<VkDescriptorSetLayout> descriptorSetLayout(DescriptorSetLayoutBuilder()
+               .addSingleBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT)
+               .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
+               .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
+               .build(vk, device));
+
+       Unique<VkDescriptorPool> descriptorPool(DescriptorPoolBuilder()
+               .addType(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, numLayers)
+               .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, numLayers)
+               .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, numLayers)
+               .build(vk, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, numLayers));
+
+       std::vector<SharedVkDescriptorSet>      allDescriptorSets;
+       std::vector<SharedVkImageView>          allMultisampledImageViews;
+       std::vector<SharedVkImageView>          allChecksumImageViews;
+
+       insertDescriptorSets(vk, device, caseDef, *descriptorPool, *descriptorSetLayout, &allDescriptorSets);
+       insertImageViews        (vk, device, caseDef, caseDef.format, **msImage, &allMultisampledImageViews);
+       insertImageViews        (vk, device, caseDef, CHECKSUM_IMAGE_FORMAT, **checksumImage, &allChecksumImageViews);
+
+       // Prepare commands
+
+       const Unique<VkPipelineLayout>  pipelineLayout  (makePipelineLayout     (vk, device, *descriptorSetLayout));
+       const Unique<VkCommandPool>             cmdPool                 (makeCommandPool        (vk, device, queueFamilyIndex));
+       const Unique<VkCommandBuffer>   cmdBuffer               (makeCommandBuffer      (vk, device, *cmdPool));
+
+       const tcu::IVec3                                workSize                                = (caseDef.singleLayerBind ? caseDef.texture.layerSize() : caseDef.texture.size());
+       const int                                               loopNumLayers                   = (caseDef.singleLayerBind ? numLayers : 1);
+       const VkImageSubresourceRange   subresourceAllLayers    = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, caseDef.texture.numLayers());
+
+       // Pass 1: Write MS image
+       {
+               const Unique<VkShaderModule>    shaderModule    (createShaderModule     (vk, device, context.getBinaryCollection().get("comp_store"), 0));
+               const Unique<VkPipeline>                pipeline                (makeComputePipeline(vk, device, *pipelineLayout, *shaderModule));
+
+               beginCommandBuffer(vk, *cmdBuffer);
+               vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
+
+               {
+                       const VkImageMemoryBarrier barriers[] =
+                       {
+                               makeImageMemoryBarrier((VkAccessFlags)0, VK_ACCESS_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, **msImage, subresourceAllLayers),
+                               makeImageMemoryBarrier((VkAccessFlags)0, VK_ACCESS_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, **checksumImage, subresourceAllLayers),
+                       };
+
+                       vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (VkDependencyFlags)0,
+                               0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(barriers), barriers);
+               }
+
+               for (int layerNdx = 0; layerNdx < loopNumLayers; ++layerNdx)
+               {
+                       const VkDescriptorSet                   descriptorSet                                   = **allDescriptorSets[layerNdx];
+                       const VkDescriptorImageInfo             descriptorMultiImageInfo                = makeDescriptorImageInfo(DE_NULL, **allMultisampledImageViews[layerNdx], VK_IMAGE_LAYOUT_GENERAL);
+                       const VkDescriptorBufferInfo    descriptorConstantsBufferInfo   = makeDescriptorBufferInfo(constantsBuffer->get(), layerNdx*bufferChunkSize, bufferChunkSize);
+
+                       DescriptorSetUpdateBuilder()
+                               .writeSingle(descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &descriptorConstantsBufferInfo)
+                               .writeSingle(descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorMultiImageInfo)
+                               .update(vk, device);
+
+                       vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u, &descriptorSet, 0u, DE_NULL);
+                       vk.cmdDispatch(*cmdBuffer, workSize.x(), workSize.y(), workSize.z());
+               }
+
+               endCommandBuffer(vk, *cmdBuffer);
+               submitCommandsAndWait(vk, device, queue, *cmdBuffer);
+       }
+
+       // Pass 2: "Resolve" MS image in compute shader
+       {
+               const Unique<VkShaderModule>    shaderModule    (createShaderModule     (vk, device, context.getBinaryCollection().get("comp_load"), 0));
+               const Unique<VkPipeline>                pipeline                (makeComputePipeline(vk, device, *pipelineLayout, *shaderModule));
+
+               beginCommandBuffer(vk, *cmdBuffer);
+               vk.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
+
+               {
+                       const VkImageMemoryBarrier barriers[] =
+                       {
+                               makeImageMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL, **msImage, subresourceAllLayers),
+                       };
+
+                       vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (VkDependencyFlags)0,
+                               0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(barriers), barriers);
+               }
+
+               for (int layerNdx = 0; layerNdx < loopNumLayers; ++layerNdx)
+               {
+                       const VkDescriptorSet                   descriptorSet                                   = **allDescriptorSets[layerNdx];
+                       const VkDescriptorImageInfo             descriptorMultiImageInfo                = makeDescriptorImageInfo(DE_NULL, **allMultisampledImageViews[layerNdx], VK_IMAGE_LAYOUT_GENERAL);
+                       const VkDescriptorImageInfo             descriptorChecksumImageInfo             = makeDescriptorImageInfo(DE_NULL, **allChecksumImageViews[layerNdx], VK_IMAGE_LAYOUT_GENERAL);
+                       const VkDescriptorBufferInfo    descriptorConstantsBufferInfo   = makeDescriptorBufferInfo(constantsBuffer->get(), layerNdx*bufferChunkSize, bufferChunkSize);
+
+                       DescriptorSetUpdateBuilder()
+                               .writeSingle(descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &descriptorConstantsBufferInfo)
+                               .writeSingle(descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorMultiImageInfo)
+                               .writeSingle(descriptorSet, DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &descriptorChecksumImageInfo)
+                               .update(vk, device);
+
+                       vk.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *pipelineLayout, 0u, 1u, &descriptorSet, 0u, DE_NULL);
+                       vk.cmdDispatch(*cmdBuffer, workSize.x(), workSize.y(), workSize.z());
+               }
+
+               endCommandBuffer(vk, *cmdBuffer);
+               submitCommandsAndWait(vk, device, queue, *cmdBuffer);
+       }
+
+       // Retrieve result
+       {
+               beginCommandBuffer(vk, *cmdBuffer);
+
+               {
+                       const VkImageMemoryBarrier barriers[] =
+                       {
+                               makeImageMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, **checksumImage, subresourceAllLayers),
+                       };
+                       vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, (VkDependencyFlags)0,
+                               0u, DE_NULL, 0u, DE_NULL, DE_LENGTH_OF_ARRAY(barriers), barriers);
+               }
+               {
+                       const VkBufferImageCopy copyRegion = makeBufferImageCopy(makeExtent3D(caseDef.texture.layerSize()), caseDef.texture.numLayers());
+                       vk.cmdCopyImageToBuffer(*cmdBuffer, **checksumImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, **resultBuffer, 1u, &copyRegion);
+               }
+               {
+                       const VkBufferMemoryBarrier barriers[] =
+                       {
+                               makeBufferMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT, **resultBuffer, 0ull, resultBufferSizeBytes),
+                       };
+                       vk.cmdPipelineBarrier(*cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0,
+                               0u, DE_NULL, DE_LENGTH_OF_ARRAY(barriers), barriers, 0u, DE_NULL);
+               }
+
+               endCommandBuffer(vk, *cmdBuffer);
+               submitCommandsAndWait(vk, device, queue, *cmdBuffer);
+       }
+
+       // Verify
+       {
+               const Allocation& alloc = resultBuffer->getAllocation();
+               invalidateMappedMemoryRange(vk, device, alloc.getMemory(), alloc.getOffset(), resultBufferSizeBytes);
+
+               const IVec3             imageSize                       = caseDef.texture.size();
+               const deInt32*  pDataPtr                        = static_cast<deInt32*>(alloc.getHostPtr());
+               const deInt32   expectedChecksum        = caseDef.texture.numSamples();
+
+               for (int layer = 0; layer < imageSize.z(); ++layer)
+               for (int y = 0; y < imageSize.y(); ++y)
+               for (int x = 0; x < imageSize.x(); ++x)
+               {
+                       if (*pDataPtr != expectedChecksum)
+                       {
+                               context.getTestContext().getLog()
+                                       << tcu::TestLog::Message << "Some sample colors were incorrect at (x, y, layer) = (" << x << ", " << y << ", " << layer << ")"  << tcu::TestLog::EndMessage
+                                       << tcu::TestLog::Message << "Checksum value is " << *pDataPtr << " but expected " << expectedChecksum << tcu::TestLog::EndMessage;
+
+                               return tcu::TestStatus::fail("Some sample colors were incorrect");
+                       }
+                       ++pDataPtr;
+               }
+
+               return tcu::TestStatus::pass("OK");
+       }
+}
+
+} // anonymous ns
+
+tcu::TestCaseGroup* createImageMultisampleLoadStoreTests (tcu::TestContext& testCtx)
+{
+       const Texture textures[] =
+       {
+               // \note Shader code is tweaked to work with image size of 32, take a look if this needs to be modified.
+               Texture(IMAGE_TYPE_2D,                  tcu::IVec3(32,  32,     1),             1),
+               Texture(IMAGE_TYPE_2D_ARRAY,    tcu::IVec3(32,  32,     1),             4),
+       };
+
+       static const VkFormat formats[] =
+       {
+               VK_FORMAT_R32G32B32A32_SFLOAT,
+               VK_FORMAT_R16G16B16A16_SFLOAT,
+               VK_FORMAT_R32_SFLOAT,
+
+               VK_FORMAT_R32G32B32A32_UINT,
+               VK_FORMAT_R16G16B16A16_UINT,
+               VK_FORMAT_R8G8B8A8_UINT,
+               VK_FORMAT_R32_UINT,
+
+               VK_FORMAT_R32G32B32A32_SINT,
+               VK_FORMAT_R16G16B16A16_SINT,
+               VK_FORMAT_R8G8B8A8_SINT,
+               VK_FORMAT_R32_SINT,
+
+               VK_FORMAT_R8G8B8A8_UNORM,
+
+               VK_FORMAT_R8G8B8A8_SNORM,
+       };
+
+       static const VkSampleCountFlagBits samples[] =
+       {
+               VK_SAMPLE_COUNT_2_BIT,
+               VK_SAMPLE_COUNT_4_BIT,
+               VK_SAMPLE_COUNT_8_BIT,
+               VK_SAMPLE_COUNT_16_BIT,
+               VK_SAMPLE_COUNT_32_BIT,
+               VK_SAMPLE_COUNT_64_BIT,
+       };
+
+       MovePtr<tcu::TestCaseGroup> testGroup(new tcu::TestCaseGroup(testCtx, "load_store_multisample", "Multisampled image store and load"));
+
+       for (int baseTextureNdx = 0; baseTextureNdx < DE_LENGTH_OF_ARRAY(textures); ++baseTextureNdx)
+       {
+               const Texture&                          baseTexture                     = textures[baseTextureNdx];
+               MovePtr<tcu::TestCaseGroup>     imageViewGroup          (new tcu::TestCaseGroup(testCtx, getImageTypeName(baseTexture.type()).c_str(), ""));
+               const int                                       numLayerBindModes       = (baseTexture.numLayers() == 1 ? 1 : 2);
+
+               for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); ++formatNdx)
+               for (int layerBindMode = 0; layerBindMode < numLayerBindModes; ++layerBindMode)
+               {
+                       const bool                                      singleLayerBind = (layerBindMode != 0);
+                       const std::string                       formatGroupName = getFormatShortString(formats[formatNdx]) + (singleLayerBind ? "_single_layer" : "");
+                       MovePtr<tcu::TestCaseGroup>     formatGroup             (new tcu::TestCaseGroup(testCtx, formatGroupName.c_str(), ""));
+
+                       for (int samplesNdx = 0; samplesNdx < DE_LENGTH_OF_ARRAY(samples); ++samplesNdx)
+                       {
+                               const std::string       samplesCaseName = "samples_" + de::toString(samples[samplesNdx]);
+
+                               const CaseDef           caseDef =
+                               {
+                                       Texture(baseTexture, samples[samplesNdx]),
+                                       formats[formatNdx],
+                                       samples[samplesNdx],
+                                       singleLayerBind,
+                               };
+
+                               addFunctionCaseWithPrograms(formatGroup.get(), samplesCaseName, "", initPrograms, test, caseDef);
+                       }
+                       imageViewGroup->addChild(formatGroup.release());
+               }
+               testGroup->addChild(imageViewGroup.release());
+       }
+
+       return testGroup.release();
+}
+
+} // image
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.hpp b/external/vulkancts/modules/vulkan/image/vktImageMultisampleLoadStoreTests.hpp
new file mode 100644 (file)
index 0000000..daddd05
--- /dev/null
@@ -0,0 +1,39 @@
+#ifndef _VKTIMAGEMULTISAMPLELOADSTORETESTS_HPP
+#define _VKTIMAGEMULTISAMPLELOADSTORETESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Multisampled image load/store Tests
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace image
+{
+
+tcu::TestCaseGroup*            createImageMultisampleLoadStoreTests            (tcu::TestContext& testCtx);
+
+} // image
+} // vkt
+
+#endif // _VKTIMAGEMULTISAMPLELOADSTORETESTS_HPP
index ef6d83f..d83f6d1 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "vktImageTests.hpp"
 #include "vktImageLoadStoreTests.hpp"
+#include "vktImageMultisampleLoadStoreTests.hpp"
 #include "vktImageQualifiersTests.hpp"
 #include "vktImageSizeTests.hpp"
 #include "vktTestGroupUtil.hpp"
@@ -42,6 +43,7 @@ void createChildren (tcu::TestCaseGroup* imageTests)
 
        imageTests->addChild(createImageStoreTests(testCtx));
        imageTests->addChild(createImageLoadStoreTests(testCtx));
+       imageTests->addChild(createImageMultisampleLoadStoreTests(testCtx));
        imageTests->addChild(createImageFormatReinterpretTests(testCtx));
        imageTests->addChild(createImageQualifiersTests(testCtx));
        imageTests->addChild(createImageSizeTests(testCtx));
index b847e19..437b830 100644 (file)
@@ -500,25 +500,39 @@ std::string getImageTypeName (const ImageType imageType)
        }
 }
 
-std::string getShaderImageType (const tcu::TextureFormat& format, const ImageType imageType)
+std::string getShaderImageType (const tcu::TextureFormat& format, const ImageType imageType, const bool multisample)
 {
        std::string formatPart = tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER ? "u" :
                                                         tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER   ? "i" : "";
 
        std::string imageTypePart;
-       switch (imageType)
+       if (multisample)
        {
-               case IMAGE_TYPE_1D:                     imageTypePart = "1D";                   break;
-               case IMAGE_TYPE_1D_ARRAY:       imageTypePart = "1DArray";              break;
-               case IMAGE_TYPE_2D:                     imageTypePart = "2D";                   break;
-               case IMAGE_TYPE_2D_ARRAY:       imageTypePart = "2DArray";              break;
-               case IMAGE_TYPE_3D:                     imageTypePart = "3D";                   break;
-               case IMAGE_TYPE_CUBE:           imageTypePart = "Cube";                 break;
-               case IMAGE_TYPE_CUBE_ARRAY:     imageTypePart = "CubeArray";    break;
-               case IMAGE_TYPE_BUFFER:         imageTypePart = "Buffer";               break;
-
-               default:
-                       DE_ASSERT(false);
+               switch (imageType)
+               {
+                       case IMAGE_TYPE_2D:                     imageTypePart = "2DMS";                 break;
+                       case IMAGE_TYPE_2D_ARRAY:       imageTypePart = "2DMSArray";    break;
+
+                       default:
+                               DE_ASSERT(false);
+               }
+       }
+       else
+       {
+               switch (imageType)
+               {
+                       case IMAGE_TYPE_1D:                     imageTypePart = "1D";                   break;
+                       case IMAGE_TYPE_1D_ARRAY:       imageTypePart = "1DArray";              break;
+                       case IMAGE_TYPE_2D:                     imageTypePart = "2D";                   break;
+                       case IMAGE_TYPE_2D_ARRAY:       imageTypePart = "2DArray";              break;
+                       case IMAGE_TYPE_3D:                     imageTypePart = "3D";                   break;
+                       case IMAGE_TYPE_CUBE:           imageTypePart = "Cube";                 break;
+                       case IMAGE_TYPE_CUBE_ARRAY:     imageTypePart = "CubeArray";    break;
+                       case IMAGE_TYPE_BUFFER:         imageTypePart = "Buffer";               break;
+
+                       default:
+                               DE_ASSERT(false);
+               }
        }
 
        return formatPart + "image" + imageTypePart;
@@ -568,5 +582,14 @@ std::string getShaderImageFormatQualifier (const tcu::TextureFormat& format)
        return std::string() + orderPart + typePart;
 }
 
+std::string getFormatShortString (const VkFormat format)
+{
+       const std::string fullName = getFormatName(format);
+
+       DE_ASSERT(de::beginsWith(fullName, "VK_FORMAT_"));
+
+       return de::toLower(fullName.substr(10));
+}
+
 } // image
 } // vkt
index afe8a31..039dca0 100644 (file)
@@ -53,7 +53,7 @@ enum ImageType
 vk::VkImageType                        mapImageType                                    (const ImageType imageType);
 vk::VkImageViewType            mapImageViewType                                (const ImageType imageType);
 std::string                            getImageTypeName                                (const ImageType imageType);
-std::string                            getShaderImageType                              (const tcu::TextureFormat& format, const ImageType imageType);
+std::string                            getShaderImageType                              (const tcu::TextureFormat& format, const ImageType imageType, const bool multisample = false);
 std::string                            getShaderImageFormatQualifier   (const tcu::TextureFormat& format);
 
 class Buffer
@@ -176,6 +176,8 @@ inline vk::VkDeviceSize getImageSizeBytes (const tcu::IVec3& imageSize, const vk
        return tcu::getPixelSize(vk::mapVkFormat(format)) * imageSize.x() * imageSize.y() * imageSize.z();
 }
 
+std::string    getFormatShortString    (const vk::VkFormat format);
+
 } // image
 } // vkt
 
index ce58f00..68d11a0 100644 (file)
@@ -28,23 +28,24 @@ namespace vkt
 namespace image
 {
 
-Texture::Texture (const ImageType type_, const tcu::IVec3& layerSize_, const int layers)
-       : m_layerSize   (layerSize_)
-       , m_type                (type_)
-       , m_numLayers   (layers)
+void Texture::checkInvariants (void) const
 {
+       DE_ASSERT((m_numSamples == 1)  || (m_numSamples == 2)  || (m_numSamples == 4) || (m_numSamples == 8) ||
+                         (m_numSamples == 16) || (m_numSamples == 32) || (m_numSamples == 64));
        DE_ASSERT(m_numLayers >= 1);
        DE_ASSERT(m_layerSize.x() >= 1 && m_layerSize.y() >= 1 && m_layerSize.z() >= 1);
 
-       switch (type_)
+       switch (m_type)
        {
                case IMAGE_TYPE_1D:
                case IMAGE_TYPE_BUFFER:
                        DE_ASSERT(m_numLayers == 1);
+                       DE_ASSERT(m_numSamples == 1);
                        DE_ASSERT(m_layerSize.y() == 1 && m_layerSize.z() == 1);
                        break;
 
                case IMAGE_TYPE_1D_ARRAY:
+                       DE_ASSERT(m_numSamples == 1);
                        DE_ASSERT(m_layerSize.y() == 1 && m_layerSize.z() == 1);
                        break;
 
@@ -58,16 +59,19 @@ Texture::Texture (const ImageType type_, const tcu::IVec3& layerSize_, const int
                        break;
 
                case IMAGE_TYPE_CUBE:
+                       DE_ASSERT(m_numSamples == 1);
                        DE_ASSERT(m_numLayers == 6);
                        DE_ASSERT(m_layerSize.z() == 1);
                        break;
 
                case IMAGE_TYPE_CUBE_ARRAY:
+                       DE_ASSERT(m_numSamples == 1);
                        DE_ASSERT(m_numLayers >= 6 && m_numLayers % 6 == 0);
                        DE_ASSERT(m_layerSize.z() == 1);
                        break;
 
                case IMAGE_TYPE_3D:
+                       DE_ASSERT(m_numSamples == 1);
                        DE_ASSERT(m_numLayers == 1);
                        break;
 
@@ -77,6 +81,24 @@ Texture::Texture (const ImageType type_, const tcu::IVec3& layerSize_, const int
        }
 }
 
+Texture::Texture (const ImageType imageType, const tcu::IVec3& imageLayerSize, const int layers, const int samples)
+       : m_layerSize   (imageLayerSize)
+       , m_type                (imageType)
+       , m_numLayers   (layers)
+       , m_numSamples  (samples)
+{
+       checkInvariants();
+}
+
+Texture::Texture (const Texture& other, const int samples)
+       : m_layerSize   (other.m_layerSize)
+       , m_type                (other.m_type)
+       , m_numLayers   (other.m_numLayers)
+       , m_numSamples  (samples)
+{
+       checkInvariants();
+}
+
 tcu::IVec3 Texture::size (void) const
 {
        switch (m_type)
index 18c32ab..8edae9f 100644 (file)
@@ -35,20 +35,25 @@ namespace image
 class Texture
 {
 public:
-                                               Texture                 (const ImageType type, const tcu::IVec3& layerSize, const int layers);
+                                               Texture                 (const ImageType imageType, const tcu::IVec3& imageLayerSize, const int layers, const int samples = 1);
+                                               Texture                 (const Texture& other, const int samples);
 
        ImageType                       type                    (void) const { return m_type; }                 //!< Texture type
        tcu::IVec3                      layerSize               (void) const { return m_layerSize; }    //!< Size of a single layer
        int                                     numLayers               (void) const { return m_numLayers; }    //!< Number of array layers (for array and cube types)
+       int                                     numSamples              (void) const { return m_numSamples; }   //!< Number of samples per texel (multisampled texture)
 
        tcu::IVec3                      size                    (void) const;   //!< Size including number of layers in additional dimension (e.g. z in 2d texture)
        int                                     dimension               (void) const;   //!< Coordinate dimension used for addressing (e.g. 3 (x,y,z) for 2d array)
        int                                     layerDimension  (void) const;   //!< Coordinate dimension used for addressing a single layer (e.g. 2 (x,y) for 2d array)
 
 private:
+       void                            checkInvariants (void) const;
+
        const tcu::IVec3        m_layerSize;
        const ImageType         m_type;
        const int                       m_numLayers;
+       const int                       m_numSamples;
 };
 
 inline bool isCube (const Texture& texture)
index 5cd9f48..4963575 100644 (file)
@@ -50,8 +50,6 @@ set(DEQP_VK_PIPELINE_SRCS
        vktPipelineTimestampTests.hpp
        vktPipelineVertexUtil.cpp
        vktPipelineVertexUtil.hpp
-       vktPipelineEarlyFragmentTests.cpp
-       vktPipelineEarlyFragmentTests.hpp
        vktPipelineCacheTests.cpp
        vktPipelineCacheTests.hpp
        vktPipelineMakeUtil.cpp
index 2636258..c9720f2 100644 (file)
@@ -321,6 +321,27 @@ de::MovePtr<tcu::TextureLevel> readColorAttachment (const vk::DeviceInterface&     v
        return resultLevel;
 }
 
+namespace
+{
+
+VkImageAspectFlags getImageAspectFlags (const tcu::TextureFormat textureFormat)
+{
+       VkImageAspectFlags imageAspectFlags = 0;
+
+       if (tcu::hasDepthComponent(textureFormat.order))
+               imageAspectFlags |= VK_IMAGE_ASPECT_DEPTH_BIT;
+
+       if (tcu::hasStencilComponent(textureFormat.order))
+               imageAspectFlags |= VK_IMAGE_ASPECT_STENCIL_BIT;
+
+       if (imageAspectFlags == 0)
+               imageAspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
+
+       return imageAspectFlags;
+}
+
+} // anonymous
+
 void uploadTestTexture (const DeviceInterface&                 vk,
                                                VkDevice                                                device,
                                                VkQueue                                                 queue,
@@ -335,7 +356,7 @@ void uploadTestTexture (const DeviceInterface&                      vk,
        Move<VkCommandPool>                             cmdPool;
        Move<VkCommandBuffer>                   cmdBuffer;
        Move<VkFence>                                   fence;
-       std::vector<deUint32>                   levelDataSizes;
+       const VkImageAspectFlags                imageAspectFlags        = getImageAspectFlags(srcTexture.getTextureFormat());
 
        // Calculate buffer size
        bufferSize =  (srcTexture.isCompressed())? srcTexture.getCompressedSize(): srcTexture.getSize();
@@ -421,11 +442,11 @@ void uploadTestTexture (const DeviceInterface&                    vk,
                VK_QUEUE_FAMILY_IGNORED,                                                // deUint32                                     dstQueueFamilyIndex;
                destImage,                                                                              // VkImage                                      image;
                {                                                                                               // VkImageSubresourceRange      subresourceRange;
-                       VK_IMAGE_ASPECT_COLOR_BIT,                              // VkImageAspect        aspect;
-                       0u,                                                                             // deUint32                     baseMipLevel;
-                       (deUint32)srcTexture.getNumLevels(),    // deUint32                     mipLevels;
-                       0u,                                                                             // deUint32                     baseArraySlice;
-                       (deUint32)srcTexture.getArraySize(),    // deUint32                     arraySize;
+                       imageAspectFlags,                                               // VkImageAspectFlags   aspectMask;
+                       0u,                                                                             // deUint32                             baseMipLevel;
+                       (deUint32)srcTexture.getNumLevels(),    // deUint32                             mipLevels;
+                       0u,                                                                             // deUint32                             baseArraySlice;
+                       (deUint32)srcTexture.getArraySize(),    // deUint32                             arraySize;
                }
        };
 
@@ -441,11 +462,11 @@ void uploadTestTexture (const DeviceInterface&                    vk,
                VK_QUEUE_FAMILY_IGNORED,                                                // deUint32                                     dstQueueFamilyIndex;
                destImage,                                                                              // VkImage                                      image;
                {                                                                                               // VkImageSubresourceRange      subresourceRange;
-                       VK_IMAGE_ASPECT_COLOR_BIT,                              // VkImageAspect        aspect;
-                       0u,                                                                             // deUint32                     baseMipLevel;
-                       (deUint32)srcTexture.getNumLevels(),    // deUint32                     mipLevels;
-                       0u,                                                                             // deUint32                     baseArraySlice;
-                       (deUint32)srcTexture.getArraySize(),    // deUint32                     arraySize;
+                       imageAspectFlags,                                               // VkImageAspectFlags   aspectMask;
+                       0u,                                                                             // deUint32                             baseMipLevel;
+                       (deUint32)srcTexture.getNumLevels(),    // deUint32                             mipLevels;
+                       0u,                                                                             // deUint32                             baseArraySlice;
+                       (deUint32)srcTexture.getArraySize(),    // deUint32                             arraySize;
                }
        };
 
@@ -488,7 +509,6 @@ void uploadTestTexture (const DeviceInterface&                      vk,
        VK_CHECK(vk.waitForFences(device, 1, &fence.get(), true, ~(0ull) /* infinity */));
 }
 
-
 // Utilities for test textures
 
 template<typename TcuTextureType>
@@ -509,7 +529,6 @@ std::vector<tcu::PixelBufferAccess> getLevelsVector (const TcuTextureType& textu
        return levels;
 }
 
-
 // TestTexture
 
 TestTexture::TestTexture (const tcu::TextureFormat& format, int width, int height, int depth)
@@ -606,7 +625,7 @@ std::vector<VkBufferImageCopy> TestTexture::getBufferCopyRegions (void) const
 {
        std::vector<deUint32>                   offsetMultiples;
        std::vector<VkBufferImageCopy>  regions;
-       deUint32                                                layerDataOffset = 0;
+       deUint32                                                layerDataOffset = 0;
 
        offsetMultiples.push_back(4);
 
@@ -648,6 +667,18 @@ std::vector<VkBufferImageCopy> TestTexture::getBufferCopyRegions (void) const
        }
        else
        {
+               std::vector<VkImageAspectFlags> imageAspects;
+               tcu::TextureFormat                              textureFormat   = getTextureFormat();
+
+               if (tcu::hasDepthComponent(textureFormat.order))
+                       imageAspects.push_back(VK_IMAGE_ASPECT_DEPTH_BIT);
+
+               if (tcu::hasStencilComponent(textureFormat.order))
+                       imageAspects.push_back(VK_IMAGE_ASPECT_STENCIL_BIT);
+
+               if (imageAspects.empty())
+                       imageAspects.push_back(VK_IMAGE_ASPECT_COLOR_BIT);
+
                offsetMultiples.push_back(getLevel(0, 0).getFormat().getPixelSize());
 
                for (int levelNdx = 0; levelNdx < getNumLevels(); levelNdx++)
@@ -658,26 +689,29 @@ std::vector<VkBufferImageCopy> TestTexture::getBufferCopyRegions (void) const
 
                                layerDataOffset = getNextMultiple(offsetMultiples, layerDataOffset);
 
-                               const VkBufferImageCopy layerRegion =
+                               for (size_t aspectIndex = 0; aspectIndex < imageAspects.size(); ++aspectIndex)
                                {
-                                       layerDataOffset,                                                // VkDeviceSize                         bufferOffset;
-                                       (deUint32)level.getWidth(),                             // deUint32                                     bufferRowLength;
-                                       (deUint32)level.getHeight(),                    // deUint32                                     bufferImageHeight;
-                                       {                                                                               // VkImageSubresourceLayers     imageSubresource;
-                                               VK_IMAGE_ASPECT_COLOR_BIT,
-                                               (deUint32)levelNdx,
-                                               (deUint32)layerNdx,
-                                               1u
-                                       },
-                                       { 0u, 0u, 0u },                                                 // VkOffset3D                   imageOffset;
-                                       {                                                                               // VkExtent3D                   imageExtent;
-                                               (deUint32)level.getWidth(),
-                                               (deUint32)level.getHeight(),
-                                               (deUint32)level.getDepth()
-                                       }
-                               };
-
-                               regions.push_back(layerRegion);
+                                       const VkBufferImageCopy layerRegion =
+                                       {
+                                               layerDataOffset,                                                // VkDeviceSize                         bufferOffset;
+                                               (deUint32)level.getWidth(),                             // deUint32                                     bufferRowLength;
+                                               (deUint32)level.getHeight(),                    // deUint32                                     bufferImageHeight;
+                                               {                                                                               // VkImageSubresourceLayers     imageSubresource;
+                                                       imageAspects[aspectIndex],
+                                                       (deUint32)levelNdx,
+                                                       (deUint32)layerNdx,
+                                                       1u
+                                               },
+                                               { 0u, 0u, 0u },                                                 // VkOffset3D                   imageOffset;
+                                               {                                                                               // VkExtent3D                   imageExtent;
+                                                       (deUint32)level.getWidth(),
+                                                       (deUint32)level.getHeight(),
+                                                       (deUint32)level.getDepth()
+                                               }
+                                       };
+
+                                       regions.push_back(layerRegion);
+                               }
                                layerDataOffset += level.getWidth() * level.getHeight() * level.getDepth() * level.getFormat().getPixelSize();
                        }
                }
@@ -757,8 +791,10 @@ void TestTexture::populateCompressedLevels (tcu::CompressedTexFormat format, con
                else
                {
                        // Generate random compressed data
-                       for (int byteNdx = 0; byteNdx < compressedLevel->getDataSize(); byteNdx++)
-                               compressedData[byteNdx] = 0xFF & random.getUint32();
+                       // Random initial values cause assertion during the decompression in case of COMPRESSEDTEXFORMAT_ETC1_RGB8 format
+                       if (format != tcu::COMPRESSEDTEXFORMAT_ETC1_RGB8)
+                               for (int byteNdx = 0; byteNdx < compressedLevel->getDataSize(); byteNdx++)
+                                       compressedData[byteNdx] = 0xFF & random.getUint32();
                }
 
                m_compressedLevels.push_back(compressedLevel);
@@ -820,6 +856,10 @@ const tcu::Texture1D& TestTexture1D::getTexture (void) const
        return m_texture;
 }
 
+tcu::Texture1D& TestTexture1D::getTexture (void)
+{
+       return m_texture;
+}
 
 // TestTexture1DArray
 
@@ -877,12 +917,16 @@ const tcu::Texture1DArray& TestTexture1DArray::getTexture (void) const
        return m_texture;
 }
 
+tcu::Texture1DArray& TestTexture1DArray::getTexture (void)
+{
+       return m_texture;
+}
+
 int TestTexture1DArray::getArraySize (void) const
 {
        return m_texture.getNumLayers();
 }
 
-
 // TestTexture2D
 
 TestTexture2D::TestTexture2D (const tcu::TextureFormat& format, int width, int height)
@@ -929,6 +973,10 @@ const tcu::Texture2D& TestTexture2D::getTexture (void) const
        return m_texture;
 }
 
+tcu::Texture2D& TestTexture2D::getTexture (void)
+{
+       return m_texture;
+}
 
 // TestTexture2DArray
 
@@ -986,6 +1034,11 @@ const tcu::Texture2DArray& TestTexture2DArray::getTexture (void) const
        return m_texture;
 }
 
+tcu::Texture2DArray& TestTexture2DArray::getTexture (void)
+{
+       return m_texture;
+}
+
 int TestTexture2DArray::getArraySize (void) const
 {
        return m_texture.getNumLayers();
@@ -1038,6 +1091,10 @@ const tcu::Texture3D& TestTexture3D::getTexture (void) const
        return m_texture;
 }
 
+tcu::Texture3D& TestTexture3D::getTexture (void)
+{
+       return m_texture;
+}
 
 // TestTextureCube
 
@@ -1092,14 +1149,14 @@ int TestTextureCube::getNumLevels (void) const
        return m_texture.getNumLevels();
 }
 
-tcu::PixelBufferAccess TestTextureCube::getLevel (int level, int face)
+tcu::PixelBufferAccess TestTextureCube::getLevel (int level, int layer)
 {
-       return m_texture.getLevelFace(level, (tcu::CubeFace)face);
+       return m_texture.getLevelFace(level, tcuFaceMapping[layer]);
 }
 
-const tcu::ConstPixelBufferAccess TestTextureCube::getLevel (int level, int face) const
+const tcu::ConstPixelBufferAccess TestTextureCube::getLevel (int level, int layer) const
 {
-       return m_texture.getLevelFace(level, (tcu::CubeFace)face);
+       return m_texture.getLevelFace(level, tcuFaceMapping[layer]);
 }
 
 int TestTextureCube::getArraySize (void) const
@@ -1112,6 +1169,11 @@ const tcu::TextureCube& TestTextureCube::getTexture (void) const
        return m_texture;
 }
 
+tcu::TextureCube& TestTextureCube::getTexture (void)
+{
+       return m_texture;
+}
+
 // TestTextureCubeArray
 
 TestTextureCubeArray::TestTextureCubeArray (const tcu::TextureFormat& format, int size, int arraySize)
@@ -1175,5 +1237,10 @@ const tcu::TextureCubeArray& TestTextureCubeArray::getTexture (void) const
        return m_texture;
 }
 
+tcu::TextureCubeArray& TestTextureCubeArray::getTexture (void)
+{
+       return m_texture;
+}
+
 } // pipeline
 } // vkt
index c52c380..5d9fc66 100644 (file)
@@ -112,6 +112,9 @@ public:
        virtual std::vector<vk::VkBufferImageCopy>      getBufferCopyRegions            (void) const;
        virtual void                                                            write                                           (deUint8* destPtr) const;
 
+       virtual const tcu::TextureFormat&                       getTextureFormat                        (void) const = 0;
+       virtual tcu::UVec3                                                      getTextureDimension                     (void) const = 0;
+
 protected:
        void                                                                            populateLevels                          (const std::vector<tcu::PixelBufferAccess>& levels);
        void                                                                            populateCompressedLevels        (tcu::CompressedTexFormat format, const std::vector<tcu::PixelBufferAccess>& decompressedLevels);
@@ -128,14 +131,17 @@ private:
        tcu::Texture1D                                                          m_texture;
 
 public:
-                                                                                               TestTexture1D   (const tcu::TextureFormat& format, int width);
-                                                                                               TestTexture1D   (const tcu::CompressedTexFormat& format, int width);
-       virtual                                                                         ~TestTexture1D  (void);
+                                                                                               TestTexture1D           (const tcu::TextureFormat& format, int width);
+                                                                                               TestTexture1D           (const tcu::CompressedTexFormat& format, int width);
+       virtual                                                                         ~TestTexture1D          (void);
 
        virtual int getNumLevels (void) const;
-       virtual tcu::PixelBufferAccess                          getLevel                (int level, int layer);
-       virtual const tcu::ConstPixelBufferAccess       getLevel                (int level, int layer) const;
-       virtual const tcu::Texture1D&                           getTexture              (void) const;
+       virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
+       virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
+       virtual const tcu::Texture1D&                           getTexture                      (void) const;
+       virtual tcu::Texture1D&                                         getTexture                      (void);
+       virtual const tcu::TextureFormat&                       getTextureFormat        (void) const { return m_texture.getFormat(); }
+       virtual tcu::UVec3                                                      getTextureDimension     (void) const { return tcu::UVec3(m_texture.getWidth(), 1, 1); }
 };
 
 class TestTexture1DArray : public TestTexture
@@ -152,7 +158,10 @@ public:
        virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
        virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
        virtual const tcu::Texture1DArray&                      getTexture                      (void) const;
+       virtual tcu::Texture1DArray&                            getTexture                      (void);
        virtual int                                                                     getArraySize            (void) const;
+       virtual const tcu::TextureFormat&                       getTextureFormat        (void) const { return m_texture.getFormat(); }
+       virtual tcu::UVec3                                                      getTextureDimension     (void) const { return tcu::UVec3(m_texture.getWidth(), 1, 1); }
 };
 
 class TestTexture2D : public TestTexture
@@ -169,6 +178,9 @@ public:
        virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
        virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
        virtual const tcu::Texture2D&                           getTexture                      (void) const;
+       virtual tcu::Texture2D&                                         getTexture                      (void);
+       virtual const tcu::TextureFormat&                       getTextureFormat        (void) const { return m_texture.getFormat(); }
+       virtual tcu::UVec3                                                      getTextureDimension     (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), 1); }
 };
 
 class TestTexture2DArray : public TestTexture
@@ -185,7 +197,10 @@ public:
        virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
        virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
        virtual const tcu::Texture2DArray&                      getTexture                      (void) const;
+       virtual tcu::Texture2DArray&                            getTexture                      (void);
        virtual int                                                                     getArraySize            (void) const;
+       virtual const tcu::TextureFormat&                       getTextureFormat        (void) const { return m_texture.getFormat(); }
+       virtual tcu::UVec3                                                      getTextureDimension     (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), 1); }
 };
 
 class TestTexture3D : public TestTexture
@@ -202,6 +217,9 @@ public:
        virtual tcu::PixelBufferAccess                          getLevel                        (int level, int layer);
        virtual const tcu::ConstPixelBufferAccess       getLevel                        (int level, int layer) const;
        virtual const tcu::Texture3D&                           getTexture                      (void) const;
+       virtual tcu::Texture3D&                                         getTexture                      (void);
+       virtual const tcu::TextureFormat&                       getTextureFormat        (void) const { return m_texture.getFormat(); }
+       virtual tcu::UVec3                                                      getTextureDimension     (void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), m_texture.getDepth()); }
 };
 
 class TestTextureCube : public TestTexture
@@ -219,6 +237,9 @@ public:
        virtual const tcu::ConstPixelBufferAccess       getLevel                                (int level, int layer) const;
        virtual int                                                                     getArraySize                    (void) const;
        virtual const tcu::TextureCube&                         getTexture                              (void) const;
+       virtual tcu::TextureCube&                                       getTexture                              (void);
+       virtual const tcu::TextureFormat&                       getTextureFormat                (void) const { return m_texture.getFormat(); }
+       virtual tcu::UVec3                                                      getTextureDimension             (void) const { return tcu::UVec3(m_texture.getSize(), m_texture.getSize(), 1); }
 };
 
 class TestTextureCubeArray: public TestTexture
@@ -236,6 +257,9 @@ public:
        virtual const tcu::ConstPixelBufferAccess       getLevel                                (int level, int layer) const;
        virtual int                                                                     getArraySize                    (void) const;
        virtual const tcu::TextureCubeArray&            getTexture                              (void) const;
+       virtual tcu::TextureCubeArray&                          getTexture                              (void);
+       virtual const tcu::TextureFormat&                       getTextureFormat                (void) const { return m_texture.getFormat(); }
+       virtual tcu::UVec3                                                      getTextureDimension             (void) const { return tcu::UVec3(m_texture.getSize(), m_texture.getSize(), 1); }
 };
 
 } // pipeline
index f103944..7d25fef 100644 (file)
@@ -36,7 +36,6 @@
 #include "vktPipelineMultisampleInterpolationTests.hpp"
 #include "vktPipelineVertexInputTests.hpp"
 #include "vktPipelineTimestampTests.hpp"
-#include "vktPipelineEarlyFragmentTests.hpp"
 #include "vktPipelineCacheTests.hpp"
 #include "vktTestGroupUtil.hpp"
 
@@ -65,7 +64,6 @@ void createChildren (tcu::TestCaseGroup* pipelineTests)
        pipelineTests->addChild(createVertexInputTests                          (testCtx));
        pipelineTests->addChild(createInputAssemblyTests                        (testCtx));
        pipelineTests->addChild(createTimestampTests                            (testCtx));
-       pipelineTests->addChild(createEarlyFragmentTests                        (testCtx));
        pipelineTests->addChild(createCacheTests                                        (testCtx));
 }
 
diff --git a/external/vulkancts/modules/vulkan/texture/CMakeLists.txt b/external/vulkancts/modules/vulkan/texture/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4416395
--- /dev/null
@@ -0,0 +1,33 @@
+# dEQP-VK.texture
+
+include_directories(
+       ..
+       ../shaderexecutor
+       )
+
+set(DEQP_VK_TEXTURE_SRCS
+       vktSampleVerifier.cpp
+       vktSampleVerifier.hpp
+       vktSampleVerifierUtil.cpp
+       vktSampleVerifierUtil.hpp
+       vktTextureTests.cpp
+       vktTextureTests.hpp
+       vktTextureTestUtil.cpp
+       vktTextureTestUtil.hpp
+       vktTextureFilteringExplicitLodTests.cpp
+       vktTextureFilteringExplicitLodTests.hpp
+       vktTextureFilteringTests.cpp
+       vktTextureFilteringTests.hpp
+       vktTextureMipmapTests.cpp
+       vktTextureMipmapTests.hpp
+       )
+
+set(DEQP_VK_TEXTURE_LIBS
+       deqp-vk-common
+       deqp-vk-shaderexecutor
+       tcutil
+       vkutil
+       )
+
+add_library(deqp-vk-texture STATIC ${DEQP_VK_TEXTURE_SRCS})
+target_link_libraries(deqp-vk-texture ${DEQP_VK_TEXTURE_LIBS})
@@ -34,7 +34,7 @@
 
 namespace vkt
 {
-namespace texture_filtering
+namespace texture
 {
 
 using namespace vk;
@@ -942,5 +942,5 @@ bool SampleVerifier::verifySample (const SampleArguments&   args,
        return verifySampleImpl(args, result, nullStream);
 }
 
-} // texture_filtering
+} // texture
 } // vkt
@@ -37,7 +37,7 @@
 
 namespace vkt
 {
-namespace texture_filtering
+namespace texture
 {
 
 struct SampleArguments
@@ -241,7 +241,7 @@ private:
        const std::vector<tcu::ConstPixelBufferAccess>& m_pba;
 };
 
-} // texture_filtering
+} // texture
 } // vkt
 
 #endif // _VKTSAMPLEVERIFIER_HPP
@@ -33,7 +33,7 @@
 
 namespace vkt
 {
-namespace texture_filtering
+namespace texture
 {
 namespace util
 {
@@ -948,5 +948,5 @@ void convertFormat (const void*             pixelPtr,
 }
 
 } // util
-} // texture_filtering
+} // texture
 } // vkt
@@ -32,7 +32,7 @@
 
 namespace vkt
 {
-namespace texture_filtering
+namespace texture
 {
 namespace util
 {
@@ -173,7 +173,7 @@ tcu::Vector<float, Size> abs (const tcu::Vector<float, Size>& v)
 }
 
 } // util
-} // texture_filtering
+} // texture
 } // vkt
 
 #endif // _VKTSAMPLEVERIFIERUTIL_HPP
@@ -53,7 +53,7 @@
 
 namespace vkt
 {
-namespace texture_filtering
+namespace texture
 {
 
 using namespace tcu;
@@ -1523,5 +1523,5 @@ TestCaseGroup* createExplicitLodTests (TestContext& testCtx)
        return tests.release();
 }
 
-} // texture_filtering
+} // texture
 } // vkt
 
 namespace vkt
 {
-namespace texture_filtering
+namespace texture
 {
 
 tcu::TestCaseGroup* createExplicitLodTests (tcu::TestContext& testCtx);
 
-} // texture_filtering
+} // texture
 } // vkt
 
 #endif // _VKTTEXTUREFILTERINGEXPLICITLODTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureFilteringTests.cpp
new file mode 100644 (file)
index 0000000..7d1e94f
--- /dev/null
@@ -0,0 +1,1420 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Texture filtering tests.
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuVectorUtil.hpp"
+#include "tcuTexVerifierUtil.hpp"
+#include "vkImageUtil.hpp"
+#include "vkMemUtil.hpp"
+#include "vkPrograms.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkRefUtil.hpp"
+#include "vktTestCase.hpp"
+#include "vktTestCaseUtil.hpp"
+#include "vktTestGroupUtil.hpp"
+#include "vktTextureFilteringTests.hpp"
+#include "vktTextureTestUtil.hpp"
+#include <string>
+#include <vector>
+
+using namespace vk;
+
+namespace vkt
+{
+namespace texture
+{
+
+namespace
+{
+
+using std::vector;
+using std::string;
+using tcu::TestLog;
+using tcu::Sampler;
+
+using namespace texture::util;
+using namespace glu::TextureTestUtil;
+
+enum
+{
+       TEXCUBE_VIEWPORT_SIZE           = 28,
+
+       TEX2D_VIEWPORT_WIDTH            = 64,
+       TEX2D_VIEWPORT_HEIGHT           = 64,
+
+       TEX3D_VIEWPORT_WIDTH            = 64,
+       TEX3D_VIEWPORT_HEIGHT           = 64,
+};
+
+class Texture2DFilteringTestInstance : public TestInstance
+{
+public:
+       typedef Texture2DTestCaseParameters     ParameterType;
+
+                                                                               Texture2DFilteringTestInstance          (Context& context, const ParameterType& testParameters);
+                                                                               ~Texture2DFilteringTestInstance         (void);
+
+       virtual tcu::TestStatus                         iterate                                                         (void);
+private:
+                                                                               Texture2DFilteringTestInstance          (const Texture2DFilteringTestInstance& other);
+       Texture2DFilteringTestInstance&         operator=                                                       (const Texture2DFilteringTestInstance& other);
+
+       struct FilterCase
+       {
+               int                                             textureIndex;
+
+               tcu::Vec2                               minCoord;
+               tcu::Vec2                               maxCoord;
+
+               FilterCase (void)
+                       : textureIndex(-1)
+               {
+               }
+
+               FilterCase (int tex_, const tcu::Vec2& minCoord_, const tcu::Vec2& maxCoord_)
+                       : textureIndex  (tex_)
+                       , minCoord              (minCoord_)
+                       , maxCoord              (maxCoord_)
+               {
+               }
+       };
+
+       const ParameterType                     m_testParameters;
+       vector<TestTexture2DSp>         m_textures;
+       vector<FilterCase>                      m_cases;
+       TextureRenderer                         m_renderer;
+       int                                                     m_caseNdx;
+};
+
+Texture2DFilteringTestInstance::Texture2DFilteringTestInstance (Context& context, const ParameterType& testParameters)
+       : TestInstance                  (context)
+       , m_testParameters              (testParameters)
+       , m_renderer                    (context, testParameters.sampleCount, TEX2D_VIEWPORT_WIDTH, TEX2D_VIEWPORT_HEIGHT)
+       , m_caseNdx                             (0)
+{
+       const bool                                              mipmaps         = true;
+       const int                                               numLevels       = mipmaps ? deLog2Floor32(de::max(m_testParameters.width, m_testParameters.height))+1 : 1;
+       const tcu::TextureFormatInfo    fmtInfo         = tcu::getTextureFormatInfo(vk::mapVkFormat(m_testParameters.format));
+       const tcu::Vec4                                 cBias           = fmtInfo.valueMin;
+       const tcu::Vec4                                 cScale          = fmtInfo.valueMax-fmtInfo.valueMin;
+
+       // Create 2 textures.
+       m_textures.reserve(2);
+       for (int ndx = 0; ndx < 2; ndx++)
+               m_textures.push_back(TestTexture2DSp(new pipeline::TestTexture2D(vk::mapVkFormat(m_testParameters.format), m_testParameters.width, m_testParameters.height)));
+
+       // Fill first gradient texture.
+       for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+       {
+               const tcu::Vec4 gMin = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)*cScale + cBias;
+               const tcu::Vec4 gMax = tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f)*cScale + cBias;
+
+               tcu::fillWithComponentGradients(m_textures[0]->getLevel(levelNdx, 0), gMin, gMax);
+       }
+
+       // Fill second with grid texture.
+       for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+       {
+               const deUint32  step    = 0x00ffffff / numLevels;
+               const deUint32  rgb             = step*levelNdx;
+               const deUint32  colorA  = 0xff000000 | rgb;
+               const deUint32  colorB  = 0xff000000 | ~rgb;
+
+               tcu::fillWithGrid(m_textures[1]->getLevel(levelNdx, 0), 4, tcu::RGBA(colorA).toVec()*cScale + cBias, tcu::RGBA(colorB).toVec()*cScale + cBias);
+       }
+
+       // Upload.
+       for (vector<TestTexture2DSp>::iterator i = m_textures.begin(); i != m_textures.end(); i++)
+       {
+               m_renderer.add2DTexture(*i);
+       }
+
+       // Compute cases.
+       {
+               const struct
+               {
+                       const int               texNdx;
+                       const float             lodX;
+                       const float             lodY;
+                       const float             oX;
+                       const float             oY;
+               } cases[] =
+               {
+                       { 0,    1.6f,   2.9f,   -1.0f,  -2.7f   },
+                       { 0,    -2.0f,  -1.35f, -0.2f,  0.7f    },
+                       { 1,    0.14f,  0.275f, -1.5f,  -1.1f   },
+                       { 1,    -0.92f, -2.64f, 0.4f,   -0.1f   },
+               };
+
+               for (int caseNdx = 0; caseNdx < DE_LENGTH_OF_ARRAY(cases); caseNdx++)
+               {
+                       const int       texNdx  = de::clamp(cases[caseNdx].texNdx, 0, (int)m_textures.size()-1);
+                       const float     lodX    = cases[caseNdx].lodX;
+                       const float     lodY    = cases[caseNdx].lodY;
+                       const float     oX              = cases[caseNdx].oX;
+                       const float     oY              = cases[caseNdx].oY;
+                       const float     sX              = deFloatExp2(lodX) * float(m_renderer.getRenderWidth()) / float(m_textures[texNdx]->getTexture().getWidth());
+                       const float     sY              = deFloatExp2(lodY) * float(m_renderer.getRenderHeight()) / float(m_textures[texNdx]->getTexture().getHeight());
+
+                       m_cases.push_back(FilterCase(texNdx, tcu::Vec2(oX, oY), tcu::Vec2(oX+sX, oY+sY)));
+               }
+       }
+}
+
+Texture2DFilteringTestInstance::~Texture2DFilteringTestInstance (void)
+{
+}
+
+tcu::TestStatus Texture2DFilteringTestInstance::iterate (void)
+{
+       tcu::TestLog&                                   log                     = m_context.getTestContext().getLog();
+
+       const pipeline::TestTexture2D&  texture         = m_renderer.get2DTexture(m_cases[m_caseNdx].textureIndex);
+       const tcu::TextureFormat                texFmt          = texture.getTextureFormat();
+       const tcu::TextureFormatInfo    fmtInfo         = tcu::getTextureFormatInfo(texFmt);
+       const FilterCase&                               curCase         = m_cases[m_caseNdx];
+       ReferenceParams                                 refParams       (TEXTURETYPE_2D);
+       tcu::Surface                                    rendered        (m_renderer.getRenderWidth(), m_renderer.getRenderHeight());
+       vector<float>                                   texCoord;
+
+       // Setup params for reference.
+
+       refParams.sampler               = util::createSampler(m_testParameters.wrapS, m_testParameters.wrapT, m_testParameters.minFilter, m_testParameters.magFilter);
+       refParams.samplerType   = getSamplerType(texFmt);
+       refParams.lodMode               = LODMODE_EXACT;
+       refParams.colorBias             = fmtInfo.lookupBias;
+       refParams.colorScale    = fmtInfo.lookupScale;
+
+       // Compute texture coordinates.
+       log << TestLog::Message << "Texture coordinates: " << curCase.minCoord << " -> " << curCase.maxCoord << TestLog::EndMessage;
+       computeQuadTexCoord2D(texCoord, curCase.minCoord, curCase.maxCoord);
+
+       m_renderer.renderQuad(rendered, curCase.textureIndex, &texCoord[0], refParams);
+
+       {
+               const bool                              isNearestOnly   = m_testParameters.minFilter == Sampler::NEAREST && m_testParameters.magFilter == Sampler::NEAREST;
+               const tcu::IVec4                formatBitDepth  = getTextureFormatBitDepth(vk::mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+               const tcu::PixelFormat  pixelFormat             (formatBitDepth[0], formatBitDepth[1], formatBitDepth[2], formatBitDepth[3]);
+               const tcu::IVec4                colorBits               = max(getBitsVec(pixelFormat) - (isNearestOnly ? 1 : 2), tcu::IVec4(0)); // 1 inaccurate bit if nearest only, 2 otherwise
+               tcu::LodPrecision               lodPrecision;
+               tcu::LookupPrecision    lookupPrecision;
+
+               lodPrecision.derivateBits               = 18;
+               lodPrecision.lodBits                    = 6;
+               lookupPrecision.colorThreshold  = tcu::computeFixedPointThreshold(colorBits) / refParams.colorScale;
+               lookupPrecision.coordBits               = tcu::IVec3(20,20,0);
+               lookupPrecision.uvwBits                 = tcu::IVec3(7,7,0);
+               lookupPrecision.colorMask               = getCompareMask(pixelFormat);
+
+               const bool isHighQuality = verifyTextureResult(m_context.getTestContext(), rendered.getAccess(), (tcu::Texture2DView)texture.getTexture(),
+                                                                                                          &texCoord[0], refParams, lookupPrecision, lodPrecision, pixelFormat);
+
+               if (!isHighQuality)
+               {
+                       // Evaluate against lower precision requirements.
+                       lodPrecision.lodBits    = 4;
+                       lookupPrecision.uvwBits = tcu::IVec3(4,4,0);
+
+                       log << TestLog::Message << "Warning: Verification against high precision requirements failed, trying with lower requirements." << TestLog::EndMessage;
+
+                       const bool isOk = verifyTextureResult(m_context.getTestContext(), rendered.getAccess(), (tcu::Texture2DView)texture.getTexture(),
+                                                                                                 &texCoord[0], refParams, lookupPrecision, lodPrecision, pixelFormat);
+
+                       if (!isOk)
+                       {
+                               log << TestLog::Message << "ERROR: Verification against low precision requirements failed, failing test case." << TestLog::EndMessage;
+                               return tcu::TestStatus::fail("Image verification failed");
+                       }
+               }
+       }
+
+       m_caseNdx += 1;
+       return m_caseNdx < (int)m_cases.size() ? tcu::TestStatus::incomplete() : tcu::TestStatus::pass("Pass");
+}
+
+struct TextureCubeFilteringTestCaseParameters : public TextureCubeTestCaseParameters
+{
+       bool    onlySampleFaceInterior;
+};
+
+class TextureCubeFilteringTestInstance : public TestInstance
+{
+public:
+       typedef TextureCubeFilteringTestCaseParameters  ParameterType;
+
+                                                                                                       TextureCubeFilteringTestInstance        (Context& context, const ParameterType& testParameters);
+                                                                                                       ~TextureCubeFilteringTestInstance       (void);
+
+       virtual tcu::TestStatus                                                 iterate                                                         (void);
+
+private:
+                                                                                                       TextureCubeFilteringTestInstance        (const TextureCubeFilteringTestInstance& other);
+       TextureCubeFilteringTestInstance&                               operator=                                                       (const TextureCubeFilteringTestInstance& other);
+
+       struct FilterCase
+       {
+               int                                             textureIndex;
+               tcu::Vec2                               bottomLeft;
+               tcu::Vec2                               topRight;
+
+               FilterCase (void)
+                       : textureIndex(-1)
+               {
+               }
+
+               FilterCase (int tex_, const tcu::Vec2& bottomLeft_, const tcu::Vec2& topRight_)
+                       : textureIndex  (tex_)
+                       , bottomLeft    (bottomLeft_)
+                       , topRight              (topRight_)
+               {
+               }
+       };
+
+       const ParameterType                     m_testParameters;
+       vector<TestTextureCubeSp>       m_textures;
+       vector<FilterCase>                      m_cases;
+       TextureRenderer                         m_renderer;
+       int                                                     m_caseNdx;
+};
+
+TextureCubeFilteringTestInstance::TextureCubeFilteringTestInstance (Context& context, const ParameterType& testParameters)
+       : TestInstance                  (context)
+       , m_testParameters              (testParameters)
+       , m_renderer                    (context, testParameters.sampleCount, TEXCUBE_VIEWPORT_SIZE, TEXCUBE_VIEWPORT_SIZE)
+       , m_caseNdx                             (0)
+{
+       const int                                               numLevels       = deLog2Floor32(m_testParameters.size)+1;
+       const tcu::TextureFormatInfo    fmtInfo         = tcu::getTextureFormatInfo(vk::mapVkFormat(m_testParameters.format));
+       const tcu::Vec4                                 cBias           = fmtInfo.valueMin;
+       const tcu::Vec4                                 cScale          = fmtInfo.valueMax-fmtInfo.valueMin;
+
+       m_textures.reserve(2);
+       for (int ndx = 0; ndx < 2; ndx++)
+               m_textures.push_back(TestTextureCubeSp(new pipeline::TestTextureCube(vk::mapVkFormat(m_testParameters.format), m_testParameters.size)));
+
+       // Fill first with gradient texture.
+       static const tcu::Vec4 gradients[tcu::CUBEFACE_LAST][2] =
+       {
+               { tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f), tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f) }, // negative x
+               { tcu::Vec4(0.5f, 0.0f, 0.0f, 1.0f), tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f) }, // positive x
+               { tcu::Vec4(0.0f, 0.5f, 0.0f, 1.0f), tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f) }, // negative y
+               { tcu::Vec4(0.0f, 0.0f, 0.5f, 1.0f), tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f) }, // positive y
+               { tcu::Vec4(0.0f, 0.0f, 0.0f, 0.5f), tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f) }, // negative z
+               { tcu::Vec4(0.5f, 0.5f, 0.5f, 1.0f), tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f) }  // positive z
+       };
+
+       for (int face = 0; face < tcu::CUBEFACE_LAST; face++)
+       {
+               for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+               {
+                       tcu::fillWithComponentGradients(m_textures[0]->getLevel(levelNdx, face), gradients[face][0]*cScale + cBias, gradients[face][1]*cScale + cBias);
+               }
+       }
+
+       // Fill second with grid texture.
+       for (int face = 0; face < tcu::CUBEFACE_LAST; face++)
+       {
+               for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+               {
+                       const deUint32  step    = 0x00ffffff / (numLevels*tcu::CUBEFACE_LAST);
+                       const deUint32  rgb             = step*levelNdx*face;
+                       const deUint32  colorA  = 0xff000000 | rgb;
+                       const deUint32  colorB  = 0xff000000 | ~rgb;
+
+                       tcu::fillWithGrid(m_textures[1]->getLevel(levelNdx, face), 4, tcu::RGBA(colorA).toVec()*cScale + cBias, tcu::RGBA(colorB).toVec()*cScale + cBias);
+               }
+       }
+
+       // Upload.
+       for (vector<TestTextureCubeSp>::iterator i = m_textures.begin(); i != m_textures.end(); i++)
+       {
+               m_renderer.addCubeTexture(*i);
+       }
+
+       // Compute cases
+       {
+               const int tex0  = 0;
+               const int tex1  = m_textures.size() > 1 ? 1 : 0;
+
+               if (m_testParameters.onlySampleFaceInterior)
+               {
+                       m_cases.push_back(FilterCase(tex0, tcu::Vec2(-0.8f, -0.8f), tcu::Vec2(0.8f,  0.8f)));   // minification
+                       m_cases.push_back(FilterCase(tex0, tcu::Vec2(0.5f, 0.65f), tcu::Vec2(0.8f,  0.8f)));    // magnification
+                       m_cases.push_back(FilterCase(tex1, tcu::Vec2(-0.8f, -0.8f), tcu::Vec2(0.8f,  0.8f)));   // minification
+                       m_cases.push_back(FilterCase(tex1, tcu::Vec2(0.2f, 0.2f), tcu::Vec2(0.6f,  0.5f)));             // magnification
+               }
+               else
+               {
+                       m_cases.push_back(FilterCase(tex0, tcu::Vec2(-1.25f, -1.2f), tcu::Vec2(1.2f, 1.25f)));  // minification
+
+                       m_cases.push_back(FilterCase(tex0, tcu::Vec2(0.8f, 0.8f), tcu::Vec2(1.25f, 1.20f)));    // magnification
+                       m_cases.push_back(FilterCase(tex1, tcu::Vec2(-1.19f, -1.3f), tcu::Vec2(1.1f, 1.35f)));  // minification
+                       m_cases.push_back(FilterCase(tex1, tcu::Vec2(-1.2f, -1.1f), tcu::Vec2(-0.8f, -0.8f)));  // magnification
+               }
+       }
+}
+
+TextureCubeFilteringTestInstance::~TextureCubeFilteringTestInstance (void)
+{
+}
+
+const char* getFaceDesc (const tcu::CubeFace face)
+{
+       switch (face)
+       {
+               case tcu::CUBEFACE_NEGATIVE_X:  return "-X";
+               case tcu::CUBEFACE_POSITIVE_X:  return "+X";
+               case tcu::CUBEFACE_NEGATIVE_Y:  return "-Y";
+               case tcu::CUBEFACE_POSITIVE_Y:  return "+Y";
+               case tcu::CUBEFACE_NEGATIVE_Z:  return "-Z";
+               case tcu::CUBEFACE_POSITIVE_Z:  return "+Z";
+               default:
+                       DE_ASSERT(false);
+                       return DE_NULL;
+       }
+}
+
+tcu::TestStatus TextureCubeFilteringTestInstance::iterate (void)
+{
+       tcu::TestLog&                                           log                     = m_context.getTestContext().getLog();
+
+       const pipeline::TestTextureCube&        texture         = m_renderer.getCubeTexture(m_cases[m_caseNdx].textureIndex);
+       const tcu::TextureFormat                        texFmt          = texture.getTextureFormat();
+       const tcu::TextureFormatInfo            fmtInfo         = tcu::getTextureFormatInfo(texFmt);
+       const FilterCase&                                       curCase         = m_cases[m_caseNdx];
+       ReferenceParams                                         refParams       (TEXTURETYPE_CUBE);
+
+       // Params for reference computation.
+       refParams.sampler                                       = util::createSampler(Sampler::CLAMP_TO_EDGE, Sampler::CLAMP_TO_EDGE, m_testParameters.minFilter, m_testParameters.magFilter);
+       refParams.sampler.seamlessCubeMap       = true;
+       refParams.samplerType                           = getSamplerType(texFmt);
+       refParams.lodMode                                       = LODMODE_EXACT;
+       refParams.colorBias                                     = fmtInfo.lookupBias;
+       refParams.colorScale                            = fmtInfo.lookupScale;
+
+       log << TestLog::Message << "Coordinates: " << curCase.bottomLeft << " -> " << curCase.topRight << TestLog::EndMessage;
+
+       for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; faceNdx++)
+       {
+               const tcu::CubeFace             face            = tcu::CubeFace(faceNdx);
+               tcu::Surface                    rendered        (m_renderer.getRenderWidth(), m_renderer.getRenderHeight());
+               vector<float>                   texCoord;
+
+               computeQuadTexCoordCube(texCoord, face, curCase.bottomLeft, curCase.topRight);
+
+               log << TestLog::Message << "Face " << getFaceDesc(face) << TestLog::EndMessage;
+
+               // \todo Log texture coordinates.
+
+               m_renderer.renderQuad(rendered, curCase.textureIndex, &texCoord[0], refParams);
+
+               {
+                       const bool                              isNearestOnly   = m_testParameters.minFilter == Sampler::NEAREST && m_testParameters.magFilter == Sampler::NEAREST;
+                       const tcu::IVec4                formatBitDepth  = getTextureFormatBitDepth(vk::mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+                       const tcu::PixelFormat  pixelFormat             (formatBitDepth[0], formatBitDepth[1], formatBitDepth[2], formatBitDepth[3]);
+                       const tcu::IVec4                colorBits               = max(getBitsVec(pixelFormat) - (isNearestOnly ? 1 : 2), tcu::IVec4(0)); // 1 inaccurate bit if nearest only, 2 otherwise
+                       tcu::LodPrecision               lodPrecision;
+                       tcu::LookupPrecision    lookupPrecision;
+
+                       lodPrecision.derivateBits               = 10;
+                       lodPrecision.lodBits                    = 5;
+                       lookupPrecision.colorThreshold  = tcu::computeFixedPointThreshold(colorBits) / refParams.colorScale;
+                       lookupPrecision.coordBits               = tcu::IVec3(10,10,10);
+                       lookupPrecision.uvwBits                 = tcu::IVec3(6,6,0);
+                       lookupPrecision.colorMask               = getCompareMask(pixelFormat);
+
+                       const bool isHighQuality = verifyTextureResult(m_context.getTestContext(), rendered.getAccess(), (tcu::TextureCubeView)texture.getTexture(),
+                                                                                                                  &texCoord[0], refParams, lookupPrecision, lodPrecision, pixelFormat);
+
+                       if (!isHighQuality)
+                       {
+                               // Evaluate against lower precision requirements.
+                               lodPrecision.lodBits    = 4;
+                               lookupPrecision.uvwBits = tcu::IVec3(4,4,0);
+
+                               log << TestLog::Message << "Warning: Verification against high precision requirements failed, trying with lower requirements." << TestLog::EndMessage;
+
+                               const bool isOk = verifyTextureResult(m_context.getTestContext(), rendered.getAccess(), (tcu::TextureCubeView)texture.getTexture(),
+                                                                                                         &texCoord[0], refParams, lookupPrecision, lodPrecision, pixelFormat);
+
+                               if (!isOk)
+                               {
+                                       log << TestLog::Message << "ERROR: Verification against low precision requirements failed, failing test case." << TestLog::EndMessage;
+                                       return tcu::TestStatus::fail("Image verification failed");
+                               }
+                       }
+               }
+       }
+
+       m_caseNdx += 1;
+       return m_caseNdx < (int)m_cases.size() ? tcu::TestStatus::incomplete() : tcu::TestStatus::pass("Pass");
+}
+
+// 2D array filtering
+
+class Texture2DArrayFilteringTestInstance : public TestInstance
+{
+public:
+       typedef Texture2DArrayTestCaseParameters        ParameterType;
+
+                                                                                               Texture2DArrayFilteringTestInstance             (Context& context, const ParameterType& testParameters);
+                                                                                               ~Texture2DArrayFilteringTestInstance    (void);
+
+       virtual tcu::TestStatus                                         iterate                                                                 (void);
+
+private:
+                                                                                               Texture2DArrayFilteringTestInstance             (const Texture2DArrayFilteringTestInstance&);
+       Texture2DArrayFilteringTestInstance&            operator=                                                               (const Texture2DArrayFilteringTestInstance&);
+
+       struct FilterCase
+       {
+               int                                                     textureIndex;
+               tcu::Vec2                                       lod;
+               tcu::Vec2                                       offset;
+               tcu::Vec2                                       layerRange;
+
+               FilterCase (void)
+                       : textureIndex(-1)
+               {
+               }
+
+               FilterCase (const int tex_, const tcu::Vec2& lod_, const tcu::Vec2& offset_, const tcu::Vec2& layerRange_)
+                       : textureIndex  (tex_)
+                       , lod                   (lod_)
+                       , offset                (offset_)
+                       , layerRange    (layerRange_)
+               {
+               }
+       };
+
+       const ParameterType                             m_testParameters;
+       vector<TestTexture2DArraySp>    m_textures;
+       vector<FilterCase>                              m_cases;
+       TextureRenderer                                 m_renderer;
+       int                                                             m_caseNdx;
+};
+
+Texture2DArrayFilteringTestInstance::Texture2DArrayFilteringTestInstance (Context& context, const ParameterType& testParameters)
+       : TestInstance                  (context)
+       , m_testParameters              (testParameters)
+       , m_renderer                    (context, testParameters.sampleCount, TEX3D_VIEWPORT_WIDTH, TEX3D_VIEWPORT_HEIGHT)
+       , m_caseNdx                             (0)
+{
+       const tcu::TextureFormatInfo    fmtInfo         = tcu::getTextureFormatInfo(vk::mapVkFormat(m_testParameters.format));
+       const tcu::Vec4                                 cScale          = fmtInfo.valueMax-fmtInfo.valueMin;
+       const tcu::Vec4                                 cBias           = fmtInfo.valueMin;
+       const int                                               numLevels       = deLog2Floor32(de::max(m_testParameters.width, m_testParameters.height)) + 1;
+
+       // Create textures.
+       m_textures.reserve(2);
+       for (int ndx = 0; ndx < 2; ndx++)
+               m_textures.push_back(TestTexture2DArraySp(new pipeline::TestTexture2DArray(vk::mapVkFormat(m_testParameters.format), m_testParameters.width, m_testParameters.height, m_testParameters.numLayers)));
+
+       const tcu::IVec4 levelSwz[] =
+       {
+               tcu::IVec4(0,1,2,3),
+               tcu::IVec4(2,1,3,0),
+               tcu::IVec4(3,0,1,2),
+               tcu::IVec4(1,3,2,0),
+       };
+
+       // Fill first gradient texture (gradient direction varies between layers).
+       for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+       {
+               for (int layerNdx = 0; layerNdx < m_testParameters.numLayers; layerNdx++)
+               {
+                       const tcu::PixelBufferAccess levelBuf = m_textures[0]->getLevel(levelNdx, layerNdx);
+
+                       const tcu::IVec4        swz             = levelSwz[layerNdx%DE_LENGTH_OF_ARRAY(levelSwz)];
+                       const tcu::Vec4         gMin    = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f).swizzle(swz[0],swz[1],swz[2],swz[3])*cScale + cBias;
+                       const tcu::Vec4         gMax    = tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f).swizzle(swz[0],swz[1],swz[2],swz[3])*cScale + cBias;
+
+                       tcu::fillWithComponentGradients(levelBuf, gMin, gMax);
+               }
+       }
+
+       // Fill second with grid texture (each layer has unique colors).
+       for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+       {
+               for (int layerNdx = 0; layerNdx < m_testParameters.numLayers; layerNdx++)
+               {
+                       const tcu::PixelBufferAccess levelBuf = m_textures[1]->getLevel(levelNdx, layerNdx);
+
+                       const deUint32  step    = 0x00ffffff / (numLevels*m_testParameters.numLayers - 1);
+                       const deUint32  rgb             = step * (levelNdx + layerNdx*numLevels);
+                       const deUint32  colorA  = 0xff000000 | rgb;
+                       const deUint32  colorB  = 0xff000000 | ~rgb;
+
+                       tcu::fillWithGrid(levelBuf, 4, tcu::RGBA(colorA).toVec()*cScale + cBias, tcu::RGBA(colorB).toVec()*cScale + cBias);
+               }
+       }
+
+       // Upload.
+       for (vector<TestTexture2DArraySp>::const_iterator i = m_textures.begin(); i != m_textures.end(); i++)
+       {
+               m_renderer.add2DArrayTexture(*i);
+       }
+
+       // Test cases
+       m_cases.push_back(FilterCase(0, tcu::Vec2( 1.5f,  2.8f  ),      tcu::Vec2(-1.0f, -2.7f), tcu::Vec2(-0.5f, float(m_testParameters.numLayers)+0.5f)));
+       m_cases.push_back(FilterCase(1, tcu::Vec2( 0.2f,  0.175f),      tcu::Vec2(-2.0f, -3.7f), tcu::Vec2(-0.5f, float(m_testParameters.numLayers)+0.5f)));
+       m_cases.push_back(FilterCase(1, tcu::Vec2(-0.8f, -2.3f  ),      tcu::Vec2( 0.2f, -0.1f), tcu::Vec2(float(m_testParameters.numLayers)+0.5f, -0.5f)));
+       m_cases.push_back(FilterCase(0, tcu::Vec2(-2.0f, -1.5f  ),      tcu::Vec2(-0.1f,  0.9f), tcu::Vec2(1.50001f, 1.49999f)));
+}
+
+Texture2DArrayFilteringTestInstance::~Texture2DArrayFilteringTestInstance (void)
+{
+}
+
+tcu::TestStatus Texture2DArrayFilteringTestInstance::iterate (void)
+{
+       tcu::TestLog&                                           log                     = m_context.getTestContext().getLog();
+
+       const FilterCase&                                       curCase         = m_cases[m_caseNdx];
+       const pipeline::TestTexture2DArray&     texture         = m_renderer.get2DArrayTexture(curCase.textureIndex);
+       const tcu::TextureFormat                        texFmt          = texture.getTextureFormat();
+       const tcu::TextureFormatInfo            fmtInfo         = tcu::getTextureFormatInfo(texFmt);
+       ReferenceParams                                         refParams       (TEXTURETYPE_2D_ARRAY);
+       tcu::Surface                                            rendered        (m_renderer.getRenderWidth(), m_renderer.getRenderHeight());
+       tcu::Vec3                                                       texCoord[4];
+       const float* const                                      texCoordPtr     = (const float*)&texCoord[0];
+
+       // Params for reference computation.
+
+       refParams.sampler               = util::createSampler(m_testParameters.wrapS, m_testParameters.wrapT, m_testParameters.minFilter, m_testParameters.magFilter);
+       refParams.samplerType   = getSamplerType(texFmt);
+       refParams.lodMode               = LODMODE_EXACT;
+       refParams.colorBias             = fmtInfo.lookupBias;
+       refParams.colorScale    = fmtInfo.lookupScale;
+
+       // Compute texture coordinates.
+       log << TestLog::Message << "Approximate lod per axis = " << curCase.lod << ", offset = " << curCase.offset << TestLog::EndMessage;
+
+       {
+               const float     lodX    = curCase.lod.x();
+               const float     lodY    = curCase.lod.y();
+               const float     oX              = curCase.offset.x();
+               const float     oY              = curCase.offset.y();
+               const float     sX              = deFloatExp2(lodX) * float(m_renderer.getRenderWidth()) / float(m_textures[0]->getTexture().getWidth());
+               const float     sY              = deFloatExp2(lodY) * float(m_renderer.getRenderHeight()) / float(m_textures[0]->getTexture().getHeight());
+               const float     l0              = curCase.layerRange.x();
+               const float     l1              = curCase.layerRange.y();
+
+               texCoord[0] = tcu::Vec3(oX,             oY,             l0);
+               texCoord[1] = tcu::Vec3(oX,             oY+sY,  l0*0.5f + l1*0.5f);
+               texCoord[2] = tcu::Vec3(oX+sX,  oY,             l0*0.5f + l1*0.5f);
+               texCoord[3] = tcu::Vec3(oX+sX,  oY+sY,  l1);
+       }
+
+       m_renderer.renderQuad(rendered, curCase.textureIndex, texCoordPtr, refParams);
+
+       {
+
+               const bool                              isNearestOnly   = m_testParameters.minFilter == Sampler::NEAREST && m_testParameters.magFilter == Sampler::NEAREST;
+               const tcu::IVec4                formatBitDepth  = getTextureFormatBitDepth(vk::mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+               const tcu::PixelFormat  pixelFormat             (formatBitDepth[0], formatBitDepth[1], formatBitDepth[2], formatBitDepth[3]);
+               const tcu::IVec4                colorBits               = max(getBitsVec(pixelFormat) - (isNearestOnly ? 1 : 2), tcu::IVec4(0)); // 1 inaccurate bit if nearest only, 2 otherwise
+               tcu::LodPrecision               lodPrecision;
+               tcu::LookupPrecision    lookupPrecision;
+
+               lodPrecision.derivateBits               = 18;
+               lodPrecision.lodBits                    = 6;
+               lookupPrecision.colorThreshold  = tcu::computeFixedPointThreshold(colorBits) / refParams.colorScale;
+               lookupPrecision.coordBits               = tcu::IVec3(20,20,20);
+               lookupPrecision.uvwBits                 = tcu::IVec3(7,7,0);
+               lookupPrecision.colorMask               = getCompareMask(pixelFormat);
+
+               const bool isHighQuality = verifyTextureResult(m_context.getTestContext(), rendered.getAccess(), (tcu::Texture2DArrayView)texture.getTexture(),
+                                                                                                          texCoordPtr, refParams, lookupPrecision, lodPrecision, pixelFormat);
+
+               if (!isHighQuality)
+               {
+                       // Evaluate against lower precision requirements.
+                       lodPrecision.lodBits    = 4;
+                       lookupPrecision.uvwBits = tcu::IVec3(4,4,0);
+
+                       log << TestLog::Message << "Warning: Verification against high precision requirements failed, trying with lower requirements." << TestLog::EndMessage;
+
+                       const bool isOk = verifyTextureResult(m_context.getTestContext(), rendered.getAccess(), (tcu::Texture2DArrayView)texture.getTexture(),
+                                                                                                 texCoordPtr, refParams, lookupPrecision, lodPrecision, pixelFormat);
+
+                       if (!isOk)
+                       {
+                               log << TestLog::Message << "ERROR: Verification against low precision requirements failed, failing test case." << TestLog::EndMessage;
+                               return tcu::TestStatus::fail("Image verification failed");
+                       }
+               }
+       }
+
+       m_caseNdx += 1;
+       return m_caseNdx < (int)m_cases.size() ? tcu::TestStatus::incomplete() : tcu::TestStatus::pass("Pass");
+}
+
+// 3D filtering
+
+class Texture3DFilteringTestInstance : public TestInstance
+{
+public:
+       typedef Texture3DTestCaseParameters     ParameterType;
+
+                                                                               Texture3DFilteringTestInstance          (Context& context, const ParameterType& testParameters);
+                                                                               ~Texture3DFilteringTestInstance         (void);
+
+       virtual tcu::TestStatus                         iterate                                                         (void);
+
+private:
+                                                                               Texture3DFilteringTestInstance          (const Texture3DFilteringTestInstance& other);
+       Texture3DFilteringTestInstance&         operator=                                                       (const Texture3DFilteringTestInstance& other);
+
+       struct FilterCase
+       {
+               int                                             textureIndex;
+               tcu::Vec3                               lod;
+               tcu::Vec3                               offset;
+
+               FilterCase (void)
+                       : textureIndex(-1)
+               {
+               }
+
+               FilterCase (const int tex_, const tcu::Vec3& lod_, const tcu::Vec3& offset_)
+                       : textureIndex  (tex_)
+                       , lod                   (lod_)
+                       , offset                (offset_)
+               {
+               }
+       };
+
+       const ParameterType                     m_testParameters;
+       vector<TestTexture3DSp>         m_textures;
+       vector<FilterCase>                      m_cases;
+       TextureRenderer                         m_renderer;
+       int                                                     m_caseNdx;
+};
+
+Texture3DFilteringTestInstance::Texture3DFilteringTestInstance (Context& context, const ParameterType& testParameters)
+       : TestInstance                  (context)
+       , m_testParameters              (testParameters)
+       , m_renderer                    (context, testParameters.sampleCount, TEX3D_VIEWPORT_WIDTH, TEX3D_VIEWPORT_HEIGHT)
+       , m_caseNdx                             (0)
+{
+       const tcu::TextureFormatInfo    fmtInfo         = tcu::getTextureFormatInfo(vk::mapVkFormat(m_testParameters.format));
+       const tcu::Vec4                                 cScale          = fmtInfo.valueMax-fmtInfo.valueMin;
+       const tcu::Vec4                                 cBias           = fmtInfo.valueMin;
+       const int                                               numLevels       = deLog2Floor32(de::max(de::max(m_testParameters.width, m_testParameters.height), m_testParameters.depth)) + 1;
+
+       // Create textures.
+       m_textures.reserve(2);
+       for (int ndx = 0; ndx < 2; ndx++)
+               m_textures.push_back(TestTexture3DSp(new pipeline::TestTexture3D(vk::mapVkFormat(m_testParameters.format), m_testParameters.width, m_testParameters.height, m_testParameters.depth)));
+
+       // Fill first gradient texture.
+       for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+       {
+               const tcu::Vec4 gMin = tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f)*cScale + cBias;
+               const tcu::Vec4 gMax = tcu::Vec4(1.0f, 1.0f, 1.0f, 0.0f)*cScale + cBias;
+
+               tcu::fillWithComponentGradients(m_textures[0]->getLevel(levelNdx, 0), gMin, gMax);
+       }
+
+       // Fill second with grid texture.
+       for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+       {
+               const deUint32  step    = 0x00ffffff / numLevels;
+               const deUint32  rgb             = step*levelNdx;
+               const deUint32  colorA  = 0xff000000 | rgb;
+               const deUint32  colorB  = 0xff000000 | ~rgb;
+
+               tcu::fillWithGrid(m_textures[1]->getLevel(levelNdx, 0), 4, tcu::RGBA(colorA).toVec()*cScale + cBias, tcu::RGBA(colorB).toVec()*cScale + cBias);
+       }
+
+       // Upload.
+       for (vector<TestTexture3DSp>::const_iterator i = m_textures.begin(); i != m_textures.end(); i++)
+       {
+               m_renderer.add3DTexture(*i);
+       }
+
+       // Test cases
+       m_cases.push_back(FilterCase(0, tcu::Vec3(1.5f, 2.8f, 1.0f),    tcu::Vec3(-1.0f, -2.7f, -2.275f)));
+       m_cases.push_back(FilterCase(0, tcu::Vec3(-2.0f, -1.5f, -1.8f), tcu::Vec3(-0.1f, 0.9f, -0.25f)));
+       m_cases.push_back(FilterCase(1, tcu::Vec3(0.2f, 0.175f, 0.3f),  tcu::Vec3(-2.0f, -3.7f, -1.825f)));
+       m_cases.push_back(FilterCase(1, tcu::Vec3(-0.8f, -2.3f, -2.5f), tcu::Vec3(0.2f, -0.1f, 1.325f)));
+}
+
+Texture3DFilteringTestInstance::~Texture3DFilteringTestInstance (void)
+{
+}
+
+tcu::TestStatus Texture3DFilteringTestInstance::iterate (void)
+{
+       tcu::TestLog&                                           log                     = m_context.getTestContext().getLog();
+
+       const pipeline::TestTexture3D&  texture         = m_renderer.get3DTexture(m_cases[m_caseNdx].textureIndex);
+       const tcu::TextureFormat                texFmt          = texture.getTextureFormat();
+       const tcu::TextureFormatInfo    fmtInfo         = tcu::getTextureFormatInfo(texFmt);
+       const FilterCase&                               curCase         = m_cases[m_caseNdx];
+       ReferenceParams                                 refParams       (TEXTURETYPE_3D);
+       tcu::Surface                                    rendered        (m_renderer.getRenderWidth(), m_renderer.getRenderHeight());
+       tcu::Vec3                                               texCoord[4];
+       const float* const                              texCoordPtr     = (const float*)&texCoord[0];
+
+       // Params for reference computation.
+       refParams.sampler               = util::createSampler(m_testParameters.wrapS, m_testParameters.wrapT, m_testParameters.wrapR, m_testParameters.minFilter, m_testParameters.magFilter);
+       refParams.samplerType   = getSamplerType(texFmt);
+       refParams.lodMode               = LODMODE_EXACT;
+       refParams.colorBias             = fmtInfo.lookupBias;
+       refParams.colorScale    = fmtInfo.lookupScale;
+
+       // Compute texture coordinates.
+       log << TestLog::Message << "Approximate lod per axis = " << curCase.lod << ", offset = " << curCase.offset << TestLog::EndMessage;
+
+       {
+               const float     lodX    = curCase.lod.x();
+               const float     lodY    = curCase.lod.y();
+               const float     lodZ    = curCase.lod.z();
+               const float     oX              = curCase.offset.x();
+               const float     oY              = curCase.offset.y();
+               const float oZ          = curCase.offset.z();
+               const float     sX              = deFloatExp2(lodX) * float(m_renderer.getRenderWidth())                                                                                / float(m_textures[0]->getTexture().getWidth());
+               const float     sY              = deFloatExp2(lodY) * float(m_renderer.getRenderHeight())                                                                               / float(m_textures[0]->getTexture().getHeight());
+               const float     sZ              = deFloatExp2(lodZ) * float(de::max(m_renderer.getRenderWidth(), m_renderer.getRenderHeight())) / float(m_textures[0]->getTexture().getDepth());
+
+               texCoord[0] = tcu::Vec3(oX,             oY,             oZ);
+               texCoord[1] = tcu::Vec3(oX,             oY+sY,  oZ + sZ*0.5f);
+               texCoord[2] = tcu::Vec3(oX+sX,  oY,             oZ + sZ*0.5f);
+               texCoord[3] = tcu::Vec3(oX+sX,  oY+sY,  oZ + sZ);
+       }
+
+       m_renderer.renderQuad(rendered, curCase.textureIndex, texCoordPtr, refParams);
+
+       {
+               const bool                              isNearestOnly   = m_testParameters.minFilter == Sampler::NEAREST && m_testParameters.magFilter == Sampler::NEAREST;
+               const tcu::IVec4                formatBitDepth  = getTextureFormatBitDepth(vk::mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+               const tcu::PixelFormat  pixelFormat             (formatBitDepth[0], formatBitDepth[1], formatBitDepth[2], formatBitDepth[3]);
+               const tcu::IVec4                colorBits               = max(getBitsVec(pixelFormat) - (isNearestOnly ? 1 : 2), tcu::IVec4(0)); // 1 inaccurate bit if nearest only, 2 otherwise
+               tcu::LodPrecision               lodPrecision;
+               tcu::LookupPrecision    lookupPrecision;
+
+               lodPrecision.derivateBits               = 18;
+               lodPrecision.lodBits                    = 6;
+               lookupPrecision.colorThreshold  = tcu::computeFixedPointThreshold(colorBits) / refParams.colorScale;
+               lookupPrecision.coordBits               = tcu::IVec3(20,20,20);
+               lookupPrecision.uvwBits                 = tcu::IVec3(7,7,7);
+               lookupPrecision.colorMask               = getCompareMask(pixelFormat);
+
+               const bool isHighQuality = verifyTextureResult(m_context.getTestContext(), rendered.getAccess(), (tcu::Texture3DView)texture.getTexture(),
+                                                                                                          texCoordPtr, refParams, lookupPrecision, lodPrecision, pixelFormat);
+
+               if (!isHighQuality)
+               {
+                       // Evaluate against lower precision requirements.
+                       lodPrecision.lodBits    = 4;
+                       lookupPrecision.uvwBits = tcu::IVec3(4,4,4);
+
+                       log << TestLog::Message << "Warning: Verification against high precision requirements failed, trying with lower requirements." << TestLog::EndMessage;
+
+                       const bool isOk = verifyTextureResult(m_context.getTestContext(), rendered.getAccess(), (tcu::Texture3DView)texture.getTexture(),
+                                                                                                 texCoordPtr, refParams, lookupPrecision, lodPrecision, pixelFormat);
+
+                       if (!isOk)
+                       {
+                               log << TestLog::Message << "ERROR: Verification against low precision requirements failed, failing test case." << TestLog::EndMessage;
+                               return tcu::TestStatus::fail("Image verification failed");
+                       }
+               }
+       }
+
+       m_caseNdx += 1;
+       return m_caseNdx < (int)m_cases.size() ? tcu::TestStatus::incomplete() : tcu::TestStatus::pass("Pass");
+}
+
+bool verifierCanBeUsed(const VkFormat format, const Sampler::FilterMode minFilter, const Sampler::FilterMode magFilter)
+{
+       const tcu::TextureFormat                                textureFormat           = mapVkFormat(format);
+       const tcu::TextureChannelClass                  textureChannelClass     = tcu::getTextureChannelClass(textureFormat.type);
+
+       return !(!(textureChannelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT ||
+                          textureChannelClass == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT   ||
+                          textureChannelClass == tcu::TEXTURECHANNELCLASS_FLOATING_POINT) &&
+                         (tcu::TexVerifierUtil::isLinearFilter(minFilter) || tcu::TexVerifierUtil::isLinearFilter(magFilter)));
+}
+
+void populateTextureFilteringTests (tcu::TestCaseGroup* textureFilteringTests)
+{
+       tcu::TestContext&       testCtx         = textureFilteringTests->getTestContext();
+
+       static const struct
+       {
+               const char* const                       name;
+               const Sampler::WrapMode         mode;
+       } wrapModes[] =
+       {
+               { "repeat",                                     Sampler::REPEAT_GL                      },
+               { "mirrored_repeat",            Sampler::MIRRORED_REPEAT_GL     },
+               { "clamp_to_edge",                      Sampler::CLAMP_TO_EDGE          },
+               { "clamp_to_border",            Sampler::CLAMP_TO_BORDER        },
+               { "mirror_clamp_to_edge",       Sampler::MIRRORED_ONCE          }
+       };
+
+       static const struct
+       {
+               const char* const                       name;
+               const Sampler::FilterMode       mode;
+       } minFilterModes[] =
+       {
+               { "nearest",                            Sampler::NEAREST                                        },
+               { "linear",                                     Sampler::LINEAR                                         },
+               { "nearest_mipmap_nearest",     Sampler::NEAREST_MIPMAP_NEAREST         },
+               { "linear_mipmap_nearest",      Sampler::LINEAR_MIPMAP_NEAREST          },
+               { "nearest_mipmap_linear",      Sampler::NEAREST_MIPMAP_LINEAR          },
+               { "linear_mipmap_linear",       Sampler::LINEAR_MIPMAP_LINEAR           }
+       };
+
+       static const struct
+       {
+               const char* const                       name;
+               const Sampler::FilterMode       mode;
+       } magFilterModes[] =
+       {
+               { "nearest",                            Sampler::NEAREST },
+               { "linear",                                     Sampler::LINEAR  }
+       };
+
+       static const struct
+       {
+               const int       width;
+               const int       height;
+       } sizes2D[] =
+       {
+               {   4,    8 },
+               {  32,   64 },
+               { 128,  128     },
+               {   3,    7 },
+               {  31,   55 },
+               { 127,   99 }
+       };
+
+       static const struct
+       {
+               const int       size;
+       } sizesCube[] =
+       {
+               {   8 },
+               {  64 },
+               { 128 },
+               {   7 },
+               {  63 }
+       };
+
+       static const struct
+       {
+               const int       width;
+               const int       height;
+               const int       numLayers;
+       } sizes2DArray[] =
+       {
+               {   4,   8,   8 },
+               {  32,  64,  16 },
+               { 128,  32,  64 },
+               {   3,   7,   5 },
+               {  63,  63,  63 }
+       };
+
+       static const struct
+       {
+               const int       width;
+               const int       height;
+               const int       depth;
+       } sizes3D[] =
+       {
+               {   4,   8,   8 },
+               {  32,  64,  16 },
+               { 128,  32,  64 },
+               {   3,   7,   5 },
+               {  63,  63,  63 }
+       };
+
+       static const struct
+       {
+               const char* const       name;
+               const VkFormat          format;
+       } filterableFormatsByType[] =
+       {
+               { "r16g16b16a16_sfloat",        VK_FORMAT_R16G16B16A16_SFLOAT           },
+               { "b10g11r11_ufloat",           VK_FORMAT_B10G11R11_UFLOAT_PACK32       },
+               { "e5b9g9r9_ufloat",            VK_FORMAT_E5B9G9R9_UFLOAT_PACK32        },
+               { "r8g8b8a8_unorm",                     VK_FORMAT_R8G8B8A8_UNORM                        },
+               { "r8g8b8a8_snorm",                     VK_FORMAT_R8G8B8A8_SNORM                        },
+               { "r5g6b5_unorm",                       VK_FORMAT_R5G6B5_UNORM_PACK16           },
+               { "r4g4b4a4_unorm",                     VK_FORMAT_R4G4B4A4_UNORM_PACK16         },
+               { "r5g5b5a1_unorm",                     VK_FORMAT_R5G5B5A1_UNORM_PACK16         },
+               { "a8b8g8r8_srgb",                      VK_FORMAT_A8B8G8R8_SRGB_PACK32          },
+               { "a1r5g5b5_unorm",                     VK_FORMAT_A1R5G5B5_UNORM_PACK16         }
+       };
+
+       // 2D texture filtering.
+       {
+               de::MovePtr<tcu::TestCaseGroup> group2D                         (new tcu::TestCaseGroup(testCtx, "2d", "2D Texture Filtering"));
+
+               de::MovePtr<tcu::TestCaseGroup> formatsGroup            (new tcu::TestCaseGroup(testCtx, "formats", "2D Texture Formats"));
+               de::MovePtr<tcu::TestCaseGroup> sizesGroup                      (new tcu::TestCaseGroup(testCtx, "sizes", "Texture Sizes"));
+               de::MovePtr<tcu::TestCaseGroup> combinationsGroup       (new tcu::TestCaseGroup(testCtx, "combinations", "Filter and wrap mode combinations"));
+
+               // Formats.
+               for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(filterableFormatsByType); fmtNdx++)
+               {
+                       for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++)
+                       {
+                               const Sampler::FilterMode       minFilter               = minFilterModes[filterNdx].mode;
+                               const char* const                       filterName              = minFilterModes[filterNdx].name;
+                               const bool                                      isMipmap                = minFilter != Sampler::NEAREST && minFilter != Sampler::LINEAR;
+                               const char* const                       formatName              = filterableFormatsByType[fmtNdx].name;
+                               const string                            name                    = string(formatName) + "_" + filterName;
+                               Texture2DTestCaseParameters     testParameters;
+
+                               testParameters.format           = filterableFormatsByType[fmtNdx].format;
+                               testParameters.minFilter        = minFilter;
+                               testParameters.magFilter        = isMipmap ? Sampler::LINEAR : minFilter;
+
+                               testParameters.wrapS            = Sampler::REPEAT_GL;
+                               testParameters.wrapT            = Sampler::REPEAT_GL;
+                               testParameters.width            = 64;
+                               testParameters.height           = 64;
+
+                               testParameters.programs.push_back(PROGRAM_2D_FLOAT);
+                               testParameters.programs.push_back(PROGRAM_2D_UINT);
+
+                               // Some combinations of the tests have to be skipped due to the restrictions of the verifiers.
+                               if (verifierCanBeUsed(testParameters.format, testParameters.minFilter, testParameters.magFilter))
+                               {
+                                       formatsGroup->addChild(new TextureTestCase<Texture2DFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+                               }
+                       }
+               }
+
+               // Sizes.
+               for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(sizes2D); sizeNdx++)
+               {
+                       for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++)
+                       {
+                               const Sampler::FilterMode       minFilter               = minFilterModes[filterNdx].mode;
+                               const char* const                       filterName              = minFilterModes[filterNdx].name;
+                               const bool                                      isMipmap                = minFilter != Sampler::NEAREST && minFilter != Sampler::LINEAR;
+                               const string                            name                    = de::toString(sizes2D[sizeNdx].width) + "x" + de::toString(sizes2D[sizeNdx].height) + "_" + filterName;
+                               Texture2DTestCaseParameters     testParameters;
+
+                               testParameters.format           = VK_FORMAT_R8G8B8A8_UNORM;
+                               testParameters.minFilter        = minFilter;
+                               testParameters.magFilter        = isMipmap ? Sampler::LINEAR : minFilter;
+                               testParameters.wrapS            = Sampler::REPEAT_GL;
+                               testParameters.wrapT            = Sampler::REPEAT_GL;
+                               testParameters.width            = sizes2D[sizeNdx].width;
+                               testParameters.height           = sizes2D[sizeNdx].height;
+
+                               testParameters.programs.push_back(PROGRAM_2D_FLOAT);
+
+                               sizesGroup->addChild(new TextureTestCase<Texture2DFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+                       }
+               }
+
+               // Wrap modes.
+               for (int minFilterNdx = 0; minFilterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); minFilterNdx++)
+               {
+                       for (int magFilterNdx = 0; magFilterNdx < DE_LENGTH_OF_ARRAY(magFilterModes); magFilterNdx++)
+                       {
+                               for (int wrapSNdx = 0; wrapSNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapSNdx++)
+                               {
+                                       for (int wrapTNdx = 0; wrapTNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapTNdx++)
+                                       {
+                                               const string    name            = string(minFilterModes[minFilterNdx].name) + "_" + magFilterModes[magFilterNdx].name + "_" + wrapModes[wrapSNdx].name + "_" + wrapModes[wrapTNdx].name;
+                                               Texture2DTestCaseParameters     testParameters;
+
+                                               testParameters.format           = VK_FORMAT_R8G8B8A8_UNORM;
+                                               testParameters.minFilter        = minFilterModes[minFilterNdx].mode;
+                                               testParameters.magFilter        = magFilterModes[magFilterNdx].mode;
+                                               testParameters.wrapS            = wrapModes[wrapSNdx].mode;
+                                               testParameters.wrapT            = wrapModes[wrapTNdx].mode;
+                                               testParameters.width            = 63;
+                                               testParameters.height           = 57;
+
+                                               testParameters.programs.push_back(PROGRAM_2D_FLOAT);
+
+                                               combinationsGroup->addChild(new TextureTestCase<Texture2DFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+                                       }
+                               }
+                       }
+               }
+
+               group2D->addChild(formatsGroup.release());
+               group2D->addChild(sizesGroup.release());
+               group2D->addChild(combinationsGroup.release());
+
+               textureFilteringTests->addChild(group2D.release());
+       }
+
+       // Cube map texture filtering.
+       {
+               de::MovePtr<tcu::TestCaseGroup> groupCube                               (new tcu::TestCaseGroup(testCtx, "cube", "Cube Map Texture Filtering"));
+
+               de::MovePtr<tcu::TestCaseGroup> formatsGroup                    (new tcu::TestCaseGroup(testCtx, "formats", "2D Texture Formats"));
+               de::MovePtr<tcu::TestCaseGroup> sizesGroup                              (new tcu::TestCaseGroup(testCtx, "sizes", "Texture Sizes"));
+               de::MovePtr<tcu::TestCaseGroup> combinationsGroup               (new tcu::TestCaseGroup(testCtx, "combinations", "Filter and wrap mode combinations"));
+               de::MovePtr<tcu::TestCaseGroup> onlyFaceInteriorGroup   (new tcu::TestCaseGroup(testCtx, "no_edges_visible", "Don't sample anywhere near a face's edges"));
+
+               // Formats.
+               for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(filterableFormatsByType); fmtNdx++)
+               {
+                       for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++)
+                       {
+                               const Sampler::FilterMode                               minFilter       = minFilterModes[filterNdx].mode;
+                               const char* const                                               filterName      = minFilterModes[filterNdx].name;
+                               const bool                                                              isMipmap        = minFilter != Sampler::NEAREST && minFilter != Sampler::LINEAR;
+                               const char* const                                               formatName      = filterableFormatsByType[fmtNdx].name;
+                               const string                                                    name            = string(formatName) + "_" + filterName;
+                               TextureCubeFilteringTestCaseParameters  testParameters;
+
+                               testParameters.format                                   = filterableFormatsByType[fmtNdx].format;
+                               testParameters.minFilter                                = minFilter;
+                               testParameters.magFilter                                = isMipmap ? Sampler::LINEAR : minFilter;
+
+                               testParameters.wrapS                                    = Sampler::REPEAT_GL;
+                               testParameters.wrapT                                    = Sampler::REPEAT_GL;
+                               testParameters.onlySampleFaceInterior   = false;
+                               testParameters.size                                             = 64;
+
+                               testParameters.programs.push_back(PROGRAM_CUBE_FLOAT);
+                               testParameters.programs.push_back(PROGRAM_CUBE_UINT);
+
+                               // Some tests have to be skipped due to the restrictions of the verifiers.
+                               if (verifierCanBeUsed(testParameters.format, testParameters.minFilter, testParameters.magFilter))
+                               {
+                                       formatsGroup->addChild(new TextureTestCase<TextureCubeFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+                               }
+                       }
+               }
+
+               // Sizes.
+               for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(sizesCube); sizeNdx++)
+               {
+                       for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++)
+                       {
+                               const Sampler::FilterMode                               minFilter               = minFilterModes[filterNdx].mode;
+                               const char* const                                               filterName              = minFilterModes[filterNdx].name;
+                               const bool                                                              isMipmap                = minFilter != Sampler::NEAREST && minFilter != Sampler::LINEAR;
+                               const string                                                    name                    = de::toString(sizesCube[sizeNdx].size) + "x" + de::toString(sizesCube[sizeNdx].size) + "_" + filterName;
+                               TextureCubeFilteringTestCaseParameters  testParameters;
+
+                               testParameters.format                                   = VK_FORMAT_R8G8B8A8_UNORM;
+                               testParameters.minFilter                                = minFilter;
+                               testParameters.magFilter                                = isMipmap ? Sampler::LINEAR : minFilter;
+                               testParameters.wrapS                                    = Sampler::REPEAT_GL;
+                               testParameters.wrapT                                    = Sampler::REPEAT_GL;
+                               testParameters.onlySampleFaceInterior   = false;
+                               testParameters.size                                             = sizesCube[sizeNdx].size;
+
+                               testParameters.programs.push_back(PROGRAM_CUBE_FLOAT);
+
+                               sizesGroup->addChild(new TextureTestCase<TextureCubeFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+
+                       }
+               }
+
+               // Filter/wrap mode combinations.
+               for (int minFilterNdx = 0; minFilterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); minFilterNdx++)
+               {
+                       for (int magFilterNdx = 0; magFilterNdx < DE_LENGTH_OF_ARRAY(magFilterModes); magFilterNdx++)
+                       {
+                               for (int wrapSNdx = 0; wrapSNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapSNdx++)
+                               {
+                                       for (int wrapTNdx = 0; wrapTNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapTNdx++)
+                                       {
+                                               const string                                                    name                    = string(minFilterModes[minFilterNdx].name) + "_" + magFilterModes[magFilterNdx].name + "_" + wrapModes[wrapSNdx].name + "_" + wrapModes[wrapTNdx].name;
+                                               TextureCubeFilteringTestCaseParameters  testParameters;
+
+                                               testParameters.format                                   = VK_FORMAT_R8G8B8A8_UNORM;
+                                               testParameters.minFilter                                = minFilterModes[minFilterNdx].mode;
+                                               testParameters.magFilter                                = magFilterModes[magFilterNdx].mode;
+                                               testParameters.wrapS                                    = wrapModes[wrapSNdx].mode;
+                                               testParameters.wrapT                                    = wrapModes[wrapTNdx].mode;
+                                               testParameters.onlySampleFaceInterior   = false;
+                                               testParameters.size                                             = 63;
+
+                                               testParameters.programs.push_back(PROGRAM_CUBE_FLOAT);
+
+                                               combinationsGroup->addChild(new TextureTestCase<TextureCubeFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+                                       }
+                               }
+                       }
+               }
+
+               // Cases with no visible cube edges.
+               for (int isLinearI = 0; isLinearI <= 1; isLinearI++)
+               {
+                       const bool                                                              isLinear                = isLinearI != 0;
+                       const string                                                    name                    = isLinear ? "linear" : "nearest";
+                       TextureCubeFilteringTestCaseParameters  testParameters;
+
+                       testParameters.format                                   = VK_FORMAT_R8G8B8A8_UNORM;
+                       testParameters.minFilter                                = isLinear ? Sampler::LINEAR : Sampler::NEAREST;
+                       testParameters.magFilter                                = isLinear ? Sampler::LINEAR : Sampler::NEAREST;
+                       testParameters.wrapS                                    = Sampler::REPEAT_GL;
+                       testParameters.wrapT                                    = Sampler::REPEAT_GL;
+                       testParameters.onlySampleFaceInterior   = true;
+                       testParameters.size                                             = 63;
+
+                       testParameters.programs.push_back(PROGRAM_CUBE_FLOAT);
+
+                       onlyFaceInteriorGroup->addChild(new TextureTestCase<TextureCubeFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+               }
+
+               groupCube->addChild(formatsGroup.release());
+               groupCube->addChild(sizesGroup.release());
+               groupCube->addChild(combinationsGroup.release());
+               groupCube->addChild(onlyFaceInteriorGroup.release());
+
+               textureFilteringTests->addChild(groupCube.release());
+       }
+
+       // 2D array texture filtering.
+       {
+               de::MovePtr<tcu::TestCaseGroup> group2DArray            (new tcu::TestCaseGroup(testCtx, "2d_array", "2D Array Texture Filtering"));
+
+               de::MovePtr<tcu::TestCaseGroup> formatsGroup            (new tcu::TestCaseGroup(testCtx, "formats", "2D Array Texture Formats"));
+               de::MovePtr<tcu::TestCaseGroup> sizesGroup                      (new tcu::TestCaseGroup(testCtx, "sizes", "Texture Sizes"));
+               de::MovePtr<tcu::TestCaseGroup> combinationsGroup       (new tcu::TestCaseGroup(testCtx, "combinations", "Filter and wrap mode combinations"));
+
+               // Formats.
+               for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(filterableFormatsByType); fmtNdx++)
+               {
+                       for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++)
+                       {
+                               const Sampler::FilterMode                       minFilter               = minFilterModes[filterNdx].mode;
+                               const char* const                                       filterName              = minFilterModes[filterNdx].name;
+                               const bool                                                      isMipmap                = minFilter != Sampler::NEAREST && minFilter != Sampler::LINEAR;
+                               const char* const                                       formatName              = filterableFormatsByType[fmtNdx].name;
+                               const string                                            name                    = string(formatName) + "_" + filterName;
+                               Texture2DArrayTestCaseParameters        testParameters;
+
+                               testParameters.format           = filterableFormatsByType[fmtNdx].format;
+                               testParameters.minFilter        = minFilter;
+                               testParameters.magFilter        = isMipmap ? Sampler::LINEAR : minFilter;
+
+                               testParameters.wrapS            = Sampler::REPEAT_GL;
+                               testParameters.wrapT            = Sampler::REPEAT_GL;
+                               testParameters.width            = 128;
+                               testParameters.height           = 128;
+                               testParameters.numLayers        = 8;
+
+                               testParameters.programs.push_back(PROGRAM_2D_ARRAY_FLOAT);
+                               testParameters.programs.push_back(PROGRAM_2D_ARRAY_UINT);
+
+                               // Some tests have to be skipped due to the restrictions of the verifiers.
+                               if (verifierCanBeUsed(testParameters.format, testParameters.minFilter, testParameters.magFilter))
+                               {
+                                       formatsGroup->addChild(new TextureTestCase<Texture2DArrayFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+                               }
+                       }
+               }
+
+               // Sizes.
+               for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(sizes2DArray); sizeNdx++)
+               {
+                       for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++)
+                       {
+                               const Sampler::FilterMode                       minFilter               = minFilterModes[filterNdx].mode;
+                               const char* const                                       filterName              = minFilterModes[filterNdx].name;
+                               const bool                                                      isMipmap                = minFilter != Sampler::NEAREST && minFilter != Sampler::LINEAR;
+                               const string                                            name                    = de::toString(sizes2DArray[sizeNdx].width) + "x" + de::toString(sizes2DArray[sizeNdx].height) + "x" + de::toString(sizes2DArray[sizeNdx].numLayers) + "_" + filterName;
+                               Texture2DArrayTestCaseParameters        testParameters;
+
+                               testParameters.format           = VK_FORMAT_R8G8B8A8_UNORM;
+                               testParameters.minFilter        = minFilter;
+                               testParameters.magFilter        = isMipmap ? Sampler::LINEAR : minFilter;
+                               testParameters.wrapS            = Sampler::REPEAT_GL;
+                               testParameters.wrapT            = Sampler::REPEAT_GL;
+                               testParameters.width            = sizes2DArray[sizeNdx].width;
+                               testParameters.height           = sizes2DArray[sizeNdx].height;
+                               testParameters.numLayers        = sizes2DArray[sizeNdx].numLayers;
+
+                               testParameters.programs.push_back(PROGRAM_2D_ARRAY_FLOAT);
+
+                               sizesGroup->addChild(new TextureTestCase<Texture2DArrayFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+                       }
+               }
+
+               // Wrap modes.
+               for (int minFilterNdx = 0; minFilterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); minFilterNdx++)
+               {
+                       for (int magFilterNdx = 0; magFilterNdx < DE_LENGTH_OF_ARRAY(magFilterModes); magFilterNdx++)
+                       {
+                               for (int wrapSNdx = 0; wrapSNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapSNdx++)
+                               {
+                                       for (int wrapTNdx = 0; wrapTNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapTNdx++)
+                                       {
+                                               const string                                            name                    = string(minFilterModes[minFilterNdx].name) + "_" + magFilterModes[magFilterNdx].name + "_" + wrapModes[wrapSNdx].name + "_" + wrapModes[wrapTNdx].name;
+                                               Texture2DArrayTestCaseParameters        testParameters;
+
+                                               testParameters.format           = VK_FORMAT_R8G8B8A8_UNORM;
+                                               testParameters.minFilter        = minFilterModes[minFilterNdx].mode;
+                                               testParameters.magFilter        = magFilterModes[magFilterNdx].mode;
+                                               testParameters.wrapS            = wrapModes[wrapSNdx].mode;
+                                               testParameters.wrapT            = wrapModes[wrapTNdx].mode;
+                                               testParameters.width            = 123;
+                                               testParameters.height           = 107;
+                                               testParameters.numLayers        = 7;
+
+                                               testParameters.programs.push_back(PROGRAM_2D_ARRAY_FLOAT);
+
+                                               combinationsGroup->addChild(new TextureTestCase<Texture2DArrayFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+                                       }
+                               }
+                       }
+               }
+
+               group2DArray->addChild(formatsGroup.release());
+               group2DArray->addChild(sizesGroup.release());
+               group2DArray->addChild(combinationsGroup.release());
+
+               textureFilteringTests->addChild(group2DArray.release());
+       }
+
+       // 3D texture filtering.
+       {
+               de::MovePtr<tcu::TestCaseGroup> group3D                         (new tcu::TestCaseGroup(testCtx, "3d", "3D Texture Filtering"));
+
+               de::MovePtr<tcu::TestCaseGroup> formatsGroup            (new tcu::TestCaseGroup(testCtx, "formats", "3D Texture Formats"));
+               de::MovePtr<tcu::TestCaseGroup> sizesGroup                      (new tcu::TestCaseGroup(testCtx, "sizes", "Texture Sizes"));
+               de::MovePtr<tcu::TestCaseGroup> combinationsGroup       (new tcu::TestCaseGroup(testCtx, "combinations", "Filter and wrap mode combinations"));
+
+               // Formats.
+               for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(filterableFormatsByType); fmtNdx++)
+               {
+                       for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++)
+                       {
+                               const Sampler::FilterMode       minFilter               = minFilterModes[filterNdx].mode;
+                               const char* const                       filterName              = minFilterModes[filterNdx].name;
+                               const bool                                      isMipmap                = minFilter != Sampler::NEAREST && minFilter != Sampler::LINEAR;
+                               const char* const                       formatName              = filterableFormatsByType[fmtNdx].name;
+                               const string                            name                    = string(formatName) + "_" + filterName;
+                               Texture3DTestCaseParameters     testParameters;
+
+                               testParameters.format           = filterableFormatsByType[fmtNdx].format;
+                               testParameters.minFilter        = minFilter;
+                               testParameters.magFilter        = isMipmap ? Sampler::LINEAR : minFilter;
+
+                               testParameters.wrapS            = Sampler::REPEAT_GL;
+                               testParameters.wrapT            = Sampler::REPEAT_GL;
+                               testParameters.wrapR            = Sampler::REPEAT_GL;
+                               testParameters.width            = 64;
+                               testParameters.height           = 64;
+                               testParameters.depth            = 64;
+
+                               testParameters.programs.push_back(PROGRAM_3D_FLOAT);
+                               testParameters.programs.push_back(PROGRAM_3D_UINT);
+
+                               // Some tests have to be skipped due to the restrictions of the verifiers.
+                               if (verifierCanBeUsed(testParameters.format, testParameters.minFilter, testParameters.magFilter))
+                               {
+                                       formatsGroup->addChild(new TextureTestCase<Texture3DFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+                               }
+                       }
+               }
+
+               // Sizes.
+               for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(sizes3D); sizeNdx++)
+               {
+                       for (int filterNdx = 0; filterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); filterNdx++)
+                       {
+                               const Sampler::FilterMode               minFilter               = minFilterModes[filterNdx].mode;
+                               const char* const                               filterName              = minFilterModes[filterNdx].name;
+                               const bool                                              isMipmap                = minFilter != Sampler::NEAREST && minFilter != Sampler::LINEAR;
+                               const string                                    name                    = de::toString(sizes3D[sizeNdx].width) + "x" + de::toString(sizes3D[sizeNdx].height) + "x" + de::toString(sizes3D[sizeNdx].depth) + "_" + filterName;
+                               Texture3DTestCaseParameters             testParameters;
+
+                               testParameters.format           = VK_FORMAT_R8G8B8A8_UNORM;
+                               testParameters.minFilter        = minFilter;
+                               testParameters.magFilter        = isMipmap ? Sampler::LINEAR : minFilter;
+                               testParameters.wrapS            = Sampler::REPEAT_GL;
+                               testParameters.wrapT            = Sampler::REPEAT_GL;
+                               testParameters.wrapR            = Sampler::REPEAT_GL;
+                               testParameters.width            = sizes3D[sizeNdx].width;
+                               testParameters.height           = sizes3D[sizeNdx].height;
+                               testParameters.depth            = sizes3D[sizeNdx].depth;
+
+                               testParameters.programs.push_back(PROGRAM_3D_FLOAT);
+
+                               sizesGroup->addChild(new TextureTestCase<Texture3DFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+                       }
+               }
+
+               // Wrap modes.
+               for (int minFilterNdx = 0; minFilterNdx < DE_LENGTH_OF_ARRAY(minFilterModes); minFilterNdx++)
+               {
+                       for (int magFilterNdx = 0; magFilterNdx < DE_LENGTH_OF_ARRAY(magFilterModes); magFilterNdx++)
+                       {
+                               for (int wrapSNdx = 0; wrapSNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapSNdx++)
+                               {
+                                       for (int wrapTNdx = 0; wrapTNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapTNdx++)
+                                       {
+                                               for (int wrapRNdx = 0; wrapRNdx < DE_LENGTH_OF_ARRAY(wrapModes); wrapRNdx++)
+                                               {
+                                                       const string                            name                    = string(minFilterModes[minFilterNdx].name) + "_" + magFilterModes[magFilterNdx].name + "_" + wrapModes[wrapSNdx].name + "_" + wrapModes[wrapTNdx].name + "_" + wrapModes[wrapRNdx].name;
+                                                       Texture3DTestCaseParameters     testParameters;
+
+                                                       testParameters.format           = VK_FORMAT_R8G8B8A8_UNORM;
+                                                       testParameters.minFilter        = minFilterModes[minFilterNdx].mode;
+                                                       testParameters.magFilter        = magFilterModes[magFilterNdx].mode;
+                                                       testParameters.wrapS            = wrapModes[wrapSNdx].mode;
+                                                       testParameters.wrapT            = wrapModes[wrapTNdx].mode;
+                                                       testParameters.wrapR            = wrapModes[wrapRNdx].mode;
+                                                       testParameters.width            = 63;
+                                                       testParameters.height           = 57;
+                                                       testParameters.depth            = 67;
+
+                                                       testParameters.programs.push_back(PROGRAM_3D_FLOAT);
+
+                                                       combinationsGroup->addChild(new TextureTestCase<Texture3DFilteringTestInstance>(testCtx, name.c_str(), "", testParameters));
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               group3D->addChild(formatsGroup.release());
+               group3D->addChild(sizesGroup.release());
+               group3D->addChild(combinationsGroup.release());
+
+               textureFilteringTests->addChild(group3D.release());
+       }
+}
+
+} // anonymous
+
+tcu::TestCaseGroup*    createTextureFilteringTests     (tcu::TestContext& testCtx)
+{
+       return createTestGroup(testCtx, "filtering", "Texture filtering tests.", populateTextureFilteringTests);
+}
+
+} // texture
+} // vkt
@@ -1,11 +1,12 @@
 #ifndef _VKTTEXTUREFILTERINGTESTS_HPP
 #define _VKTTEXTUREFILTERINGTESTS_HPP
-
-/*-------------------------------------------------------------------------
+/*------------------------------------------------------------------------
  * Vulkan Conformance Tests
  * ------------------------
  *
- * Copyright (c) 2016 Google Inc.
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2014 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +22,7 @@
  *
  *//*!
  * \file
- * \brief Texture filtering tests
+ * \brief Texture filtering tests.
  *//*--------------------------------------------------------------------*/
 
 #include "tcuDefs.hpp"
 
 namespace vkt
 {
-namespace texture_filtering
+namespace texture
 {
 
-tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx);
+tcu::TestCaseGroup*    createTextureFilteringTests     (tcu::TestContext& testCtx);
 
-} // texture_filtering
+} // texture
 } // vkt
 
 #endif // _VKTTEXTUREFILTERINGTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureMipmapTests.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureMipmapTests.cpp
new file mode 100644 (file)
index 0000000..bb5558e
--- /dev/null
@@ -0,0 +1,2157 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Mipmapping tests.
+ *//*--------------------------------------------------------------------*/
+
+#include "vktTextureMipmapTests.hpp"
+
+#include "deRandom.hpp"
+#include "deString.h"
+#include "gluShaderUtil.hpp"
+#include "gluTextureTestUtil.hpp"
+#include "tcuMatrix.hpp"
+#include "tcuMatrixUtil.hpp"
+#include "tcuPixelFormat.hpp"
+#include "tcuTexLookupVerifier.hpp"
+#include "tcuTextureUtil.hpp"
+#include "tcuVectorUtil.hpp"
+#include "vkImageUtil.hpp"
+#include "vktTestGroupUtil.hpp"
+#include "vktTextureTestUtil.hpp"
+
+using namespace vk;
+
+namespace vkt
+{
+namespace texture
+{
+namespace
+{
+
+using std::string;
+using std::vector;
+using tcu::TestLog;
+using tcu::Vec2;
+using tcu::Vec3;
+using tcu::Vec4;
+using tcu::IVec4;
+using tcu::Sampler;
+using tcu::TextureFormat;
+using namespace texture::util;
+using namespace glu::TextureTestUtil;
+
+float getMinLodForCell (int cellNdx)
+{
+       static const float s_values[] =
+       {
+               1.0f,
+               3.5f,
+               2.0f,
+               -2.0f,
+               0.0f,
+               3.0f,
+               10.0f,
+               4.8f,
+               5.8f,
+               5.7f,
+               -1.9f,
+               4.0f,
+               6.5f,
+               7.1f,
+               -1e10,
+               1000.f
+       };
+       return s_values[cellNdx % DE_LENGTH_OF_ARRAY(s_values)];
+}
+
+float getMaxLodForCell (int cellNdx)
+{
+       static const float s_values[] =
+       {
+               0.0f,
+               0.2f,
+               0.7f,
+               0.4f,
+               1.3f,
+               0.0f,
+               0.5f,
+               1.2f,
+               -2.0f,
+               1.0f,
+               0.1f,
+               0.3f,
+               2.7f,
+               1.2f,
+               10.0f,
+               -1000.f,
+               1e10f
+       };
+       return s_values[cellNdx % DE_LENGTH_OF_ARRAY(s_values)];
+}
+
+enum CoordType
+{
+       COORDTYPE_BASIC,                //!< texCoord = translateScale(position).
+       COORDTYPE_BASIC_BIAS,   //!< Like basic, but with bias values.
+       COORDTYPE_AFFINE,               //!< texCoord = translateScaleRotateShear(position).
+       COORDTYPE_PROJECTED,    //!< Projected coordinates, w != 1
+
+       COORDTYPE_LAST
+};
+
+struct TextureMipmapCommonTestCaseParameters
+{
+                                                       TextureMipmapCommonTestCaseParameters           (void);
+       CoordType                               coordType;
+       const char*                             minFilterName;
+};
+
+TextureMipmapCommonTestCaseParameters::TextureMipmapCommonTestCaseParameters (void)
+       : coordType                             (COORDTYPE_BASIC)
+       , minFilterName                 (NULL)
+{
+}
+
+struct Texture2DMipmapTestCaseParameters : public Texture2DTestCaseParameters, public TextureMipmapCommonTestCaseParameters
+{
+};
+
+struct TextureCubeMipmapTestCaseParameters : public TextureCubeTestCaseParameters, public TextureMipmapCommonTestCaseParameters
+{
+};
+
+struct Texture3DMipmapTestCaseParameters : public Texture3DTestCaseParameters, public TextureMipmapCommonTestCaseParameters
+{
+};
+
+// Texture2DMipmapTestInstance
+class Texture2DMipmapTestInstance : public TestInstance
+{
+public:
+       typedef Texture2DMipmapTestCaseParameters       ParameterType;
+
+                                                                       Texture2DMipmapTestInstance             (Context& context, const ParameterType& testParameters);
+                                                                       ~Texture2DMipmapTestInstance    (void);
+
+       virtual tcu::TestStatus                 iterate                                                 (void);
+
+private:
+                                                                       Texture2DMipmapTestInstance             (const Texture2DMipmapTestInstance& other);
+       Texture2DMipmapTestInstance&    operator=                                               (const Texture2DMipmapTestInstance& other);
+
+       const ParameterType                             m_testParameters;
+       TestTexture2DSp                                 m_texture;
+       TextureRenderer                                 m_renderer;
+};
+
+Texture2DMipmapTestInstance::Texture2DMipmapTestInstance (Context& context, const Texture2DMipmapTestCaseParameters& testParameters)
+       : TestInstance          (context)
+       , m_testParameters      (testParameters)
+       , m_renderer            (context, testParameters.sampleCount, testParameters.width*4, testParameters.height*4)
+{
+       TCU_CHECK_INTERNAL(!(m_testParameters.coordType == COORDTYPE_PROJECTED && m_testParameters.sampleCount != VK_SAMPLE_COUNT_1_BIT));
+
+       m_texture = TestTexture2DSp(new pipeline::TestTexture2D(vk::mapVkFormat(m_testParameters.format), m_testParameters.width, m_testParameters.height));
+
+       const int numLevels = deLog2Floor32(de::max(m_testParameters.width, m_testParameters.height))+1;
+
+       // Fill texture with colored grid.
+       for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+       {
+               const deUint32  step    = 0xff / (numLevels-1);
+               const deUint32  inc             = deClamp32(step*levelNdx, 0x00, 0xff);
+               const deUint32  dec             = 0xff - inc;
+               const deUint32  rgb             = (inc << 16) | (dec << 8) | 0xff;
+               const deUint32  color   = 0xff000000 | rgb;
+
+               tcu::clear(m_texture->getLevel(levelNdx, 0), tcu::RGBA(color).toVec());
+       }
+
+       // Upload texture data.
+       m_renderer.add2DTexture(m_texture);
+}
+
+Texture2DMipmapTestInstance::~Texture2DMipmapTestInstance (void)
+{
+}
+
+static void getBasicTexCoord2D (std::vector<float>& dst, int cellNdx)
+{
+       static const struct
+       {
+               const Vec2      bottomLeft;
+               const Vec2      topRight;
+       } s_basicCoords[] =
+       {
+               { Vec2(-0.1f,  0.1f), Vec2( 0.8f,  1.0f) },
+               { Vec2(-0.3f, -0.6f), Vec2( 0.7f,  0.4f) },
+               { Vec2(-0.3f,  0.6f), Vec2( 0.7f, -0.9f) },
+               { Vec2(-0.8f,  0.6f), Vec2( 0.7f, -0.9f) },
+
+               { Vec2(-0.5f, -0.5f), Vec2( 1.5f,  1.5f) },
+               { Vec2( 1.0f, -1.0f), Vec2(-1.3f,  1.0f) },
+               { Vec2( 1.2f, -1.0f), Vec2(-1.3f,  1.6f) },
+               { Vec2( 2.2f, -1.1f), Vec2(-1.3f,  0.8f) },
+
+               { Vec2(-1.5f,  1.6f), Vec2( 1.7f, -1.4f) },
+               { Vec2( 2.0f,  1.6f), Vec2( 2.3f, -1.4f) },
+               { Vec2( 1.3f, -2.6f), Vec2(-2.7f,  2.9f) },
+               { Vec2(-0.8f, -6.6f), Vec2( 6.0f, -0.9f) },
+
+               { Vec2( -8.0f,   9.0f), Vec2(  8.3f,  -7.0f) },
+               { Vec2(-16.0f,  10.0f), Vec2( 18.3f,  24.0f) },
+               { Vec2( 30.2f,  55.0f), Vec2(-24.3f,  -1.6f) },
+               { Vec2(-33.2f,  64.1f), Vec2( 32.1f, -64.1f) },
+       };
+
+       DE_ASSERT(de::inBounds(cellNdx, 0, DE_LENGTH_OF_ARRAY(s_basicCoords)));
+
+       const Vec2& bottomLeft  = s_basicCoords[cellNdx].bottomLeft;
+       const Vec2& topRight    = s_basicCoords[cellNdx].topRight;
+
+       computeQuadTexCoord2D(dst, bottomLeft, topRight);
+}
+
+static void getAffineTexCoord2D (std::vector<float>& dst, int cellNdx)
+{
+       // Use basic coords as base.
+       getBasicTexCoord2D(dst, cellNdx);
+
+       // Rotate based on cell index.
+       const float             angle           = 2.0f*DE_PI * ((float)cellNdx / 16.0f);
+       const tcu::Mat2 rotMatrix       = tcu::rotationMatrix(angle);
+
+       // Second and third row are sheared.
+       const float             shearX          = de::inRange(cellNdx, 4, 11) ? (float)(15-cellNdx) / 16.0f : 0.0f;
+       const tcu::Mat2 shearMatrix     = tcu::shearMatrix(tcu::Vec2(shearX, 0.0f));
+
+       const tcu::Mat2 transform       = rotMatrix * shearMatrix;
+       const Vec2              p0                      = transform * Vec2(dst[0], dst[1]);
+       const Vec2              p1                      = transform * Vec2(dst[2], dst[3]);
+       const Vec2              p2                      = transform * Vec2(dst[4], dst[5]);
+       const Vec2              p3                      = transform * Vec2(dst[6], dst[7]);
+
+       dst[0] = p0.x();        dst[1] = p0.y();
+       dst[2] = p1.x();        dst[3] = p1.y();
+       dst[4] = p2.x();        dst[5] = p2.y();
+       dst[6] = p3.x();        dst[7] = p3.y();
+}
+
+tcu::TestStatus Texture2DMipmapTestInstance::iterate (void)
+{
+       const Sampler::FilterMode       magFilter               = Sampler::NEAREST;
+       const int                                       viewportWidth   = m_renderer.getRenderWidth();
+       const int                                       viewportHeight  = m_renderer.getRenderHeight();
+
+       ReferenceParams                         refParams               (TEXTURETYPE_2D);
+       vector<float>                           texCoord;
+
+       const bool                                      isProjected             = m_testParameters.coordType == COORDTYPE_PROJECTED;
+       const bool                                      useLodBias              = m_testParameters.coordType == COORDTYPE_BASIC_BIAS;
+
+       tcu::Surface                            renderedFrame   (viewportWidth, viewportHeight);
+
+       // Viewport is divided into 4x4 grid.
+       const int                                       gridWidth               = 4;
+       const int                                       gridHeight              = 4;
+       const int                                       cellWidth               = viewportWidth / gridWidth;
+       const int                                       cellHeight              = viewportHeight / gridHeight;
+
+       // Sampling parameters.
+       refParams.sampler               = util::createSampler(m_testParameters.wrapS, m_testParameters.wrapT, m_testParameters.minFilter, magFilter);
+       refParams.samplerType   = getSamplerType(vk::mapVkFormat(m_testParameters.format));
+       refParams.flags                 = (isProjected ? ReferenceParams::PROJECTED : 0) | (useLodBias ? ReferenceParams::USE_BIAS : 0);
+       refParams.lodMode               = LODMODE_EXACT; // Use ideal lod.
+
+       // Bias values.
+       static const float s_bias[] = { 1.0f, -2.0f, 0.8f, -0.5f, 1.5f, 0.9f, 2.0f, 4.0f };
+
+       // Projection values.
+       static const Vec4 s_projections[] =
+       {
+               Vec4(1.2f, 1.0f, 0.7f, 1.0f),
+               Vec4(1.3f, 0.8f, 0.6f, 2.0f),
+               Vec4(0.8f, 1.0f, 1.7f, 0.6f),
+               Vec4(1.2f, 1.0f, 1.7f, 1.5f)
+       };
+
+       // Render cells.
+       for (int gridY = 0; gridY < gridHeight; gridY++)
+       {
+               for (int gridX = 0; gridX < gridWidth; gridX++)
+               {
+                       const int       curX            = cellWidth*gridX;
+                       const int       curY            = cellHeight*gridY;
+                       const int       curW            = gridX+1 == gridWidth ? (viewportWidth-curX) : cellWidth;
+                       const int       curH            = gridY+1 == gridHeight ? (viewportHeight-curY) : cellHeight;
+                       const int       cellNdx         = gridY*gridWidth + gridX;
+
+                       // Compute texcoord.
+                       switch (m_testParameters.coordType)
+                       {
+                               case COORDTYPE_BASIC_BIAS:      // Fall-through.
+                               case COORDTYPE_PROJECTED:
+                               case COORDTYPE_BASIC:           getBasicTexCoord2D      (texCoord, cellNdx);    break;
+                               case COORDTYPE_AFFINE:          getAffineTexCoord2D     (texCoord, cellNdx);    break;
+                               default:                                        DE_ASSERT(DE_FALSE);
+                       }
+
+                       if (isProjected)
+                               refParams.w = s_projections[cellNdx % DE_LENGTH_OF_ARRAY(s_projections)];
+
+                       if (useLodBias)
+                               refParams.bias = s_bias[cellNdx % DE_LENGTH_OF_ARRAY(s_bias)];
+
+                       m_renderer.setViewport((float)curX, (float)curY, (float)curW, (float)curH);
+                       m_renderer.renderQuad(renderedFrame, 0, &texCoord[0], refParams);
+               }
+       }
+
+       // Compare and log.
+       {
+               const tcu::IVec4                formatBitDepth  = getTextureFormatBitDepth(vk::mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+               const tcu::PixelFormat  pixelFormat             (formatBitDepth[0], formatBitDepth[1], formatBitDepth[2], formatBitDepth[3]);
+               const bool                              isTrilinear             = m_testParameters.minFilter == Sampler::NEAREST_MIPMAP_LINEAR || m_testParameters.minFilter == Sampler::LINEAR_MIPMAP_LINEAR;
+               tcu::Surface                    referenceFrame  (viewportWidth, viewportHeight);
+               tcu::Surface                    errorMask               (viewportWidth, viewportHeight);
+               tcu::LookupPrecision    lookupPrec;
+               tcu::LodPrecision               lodPrec;
+               int                                             numFailedPixels = 0;
+
+               lookupPrec.coordBits            = tcu::IVec3(20, 20, 0);
+               lookupPrec.uvwBits                      = tcu::IVec3(16, 16, 0); // Doesn't really matter since pixels are unicolored.
+               lookupPrec.colorThreshold       = tcu::computeFixedPointThreshold(max(getBitsVec(pixelFormat) - (isTrilinear ? 2 : 1), tcu::IVec4(0)));
+               lookupPrec.colorMask            = getCompareMask(pixelFormat);
+               lodPrec.derivateBits            = 10;
+               lodPrec.lodBits                         = isProjected ? 6 : 8;
+
+               for (int gridY = 0; gridY < gridHeight; gridY++)
+               {
+                       for (int gridX = 0; gridX < gridWidth; gridX++)
+                       {
+                               const int       curX            = cellWidth*gridX;
+                               const int       curY            = cellHeight*gridY;
+                               const int       curW            = gridX+1 == gridWidth ? (viewportWidth-curX) : cellWidth;
+                               const int       curH            = gridY+1 == gridHeight ? (viewportHeight-curY) : cellHeight;
+                               const int       cellNdx         = gridY*gridWidth + gridX;
+
+                               // Compute texcoord.
+                               switch (m_testParameters.coordType)
+                               {
+                                       case COORDTYPE_BASIC_BIAS:      // Fall-through.
+                                       case COORDTYPE_PROJECTED:
+                                       case COORDTYPE_BASIC:           getBasicTexCoord2D      (texCoord, cellNdx);    break;
+                                       case COORDTYPE_AFFINE:          getAffineTexCoord2D     (texCoord, cellNdx);    break;
+                                       default:                                        DE_ASSERT(DE_FALSE);
+                               }
+
+                               if (isProjected)
+                                       refParams.w = s_projections[cellNdx % DE_LENGTH_OF_ARRAY(s_projections)];
+
+                               if (useLodBias)
+                                       refParams.bias = s_bias[cellNdx % DE_LENGTH_OF_ARRAY(s_bias)];
+
+                               // Render ideal result
+                               sampleTexture(tcu::SurfaceAccess(referenceFrame, pixelFormat, curX, curY, curW, curH),
+                                                         m_texture->getTexture(), &texCoord[0], refParams);
+
+                               // Compare this cell
+                               numFailedPixels += computeTextureLookupDiff(tcu::getSubregion(renderedFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                                       tcu::getSubregion(referenceFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                                       tcu::getSubregion(errorMask.getAccess(), curX, curY, curW, curH),
+                                                                                                                       m_texture->getTexture(), &texCoord[0], refParams,
+                                                                                                                       lookupPrec, lodPrec, m_context.getTestContext().getWatchDog());
+                       }
+               }
+
+               if (numFailedPixels > 0)
+                       m_context.getTestContext().getLog() << TestLog::Message << "ERROR: Image verification failed, found " << numFailedPixels << " invalid pixels!" << TestLog::EndMessage;
+
+               m_context.getTestContext().getLog() << TestLog::ImageSet("Result", "Verification result")
+                                                                                       << TestLog::Image("Rendered", "Rendered image", renderedFrame);
+
+               if (numFailedPixels > 0)
+               {
+                       m_context.getTestContext().getLog() << TestLog::Image("Reference", "Ideal reference", referenceFrame)
+                                                                                               << TestLog::Image("ErrorMask", "Error mask", errorMask);
+               }
+
+               m_context.getTestContext().getLog() << TestLog::EndImageSet;
+
+               {
+                       const bool isOk = numFailedPixels == 0;
+                       return isOk ? tcu::TestStatus::pass("pass") : tcu::TestStatus::fail("fail");
+               }
+       }
+}
+
+// TextureCubeMipmapTestInstance
+class TextureCubeMipmapTestInstance : public TestInstance
+{
+public:
+       typedef TextureCubeMipmapTestCaseParameters     ParameterType;
+
+                                                                       TextureCubeMipmapTestInstance   (Context& context, const ParameterType& testParameters);
+                                                                       ~TextureCubeMipmapTestInstance  (void);
+
+       virtual tcu::TestStatus                 iterate                                                 (void);
+
+private:
+                                                                       TextureCubeMipmapTestInstance   (const TextureCubeMipmapTestInstance& other);
+       TextureCubeMipmapTestInstance&  operator=                                               (const TextureCubeMipmapTestInstance& other);
+
+       const ParameterType                             m_testParameters;
+       TestTextureCubeSp                               m_texture;
+       TextureRenderer                                 m_renderer;
+};
+
+TextureCubeMipmapTestInstance::TextureCubeMipmapTestInstance (Context& context, const TextureCubeMipmapTestCaseParameters& testParameters)
+       : TestInstance          (context)
+       , m_testParameters      (testParameters)
+       , m_renderer            (context, m_testParameters.sampleCount, m_testParameters.size*2, m_testParameters.size*2)
+{
+       TCU_CHECK_INTERNAL(!(m_testParameters.coordType == COORDTYPE_PROJECTED && m_testParameters.sampleCount != VK_SAMPLE_COUNT_1_BIT));
+
+       m_texture = TestTextureCubeSp(new pipeline::TestTextureCube(vk::mapVkFormat(m_testParameters.format), m_testParameters.size));
+
+       const int numLevels = deLog2Floor32(m_testParameters.size)+1;
+
+       // Fill texture with colored grid.
+       for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; faceNdx++)
+       {
+               for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+               {
+                       const deUint32  step    = 0xff / (numLevels-1);
+                       const deUint32  inc             = deClamp32(step*levelNdx, 0x00, 0xff);
+                       const deUint32  dec             = 0xff - inc;
+                       deUint32                rgb             = 0;
+
+                       switch (faceNdx)
+                       {
+                               case 0: rgb = (inc << 16) | (dec << 8) | 255; break;
+                               case 1: rgb = (255 << 16) | (inc << 8) | dec; break;
+                               case 2: rgb = (dec << 16) | (255 << 8) | inc; break;
+                               case 3: rgb = (dec << 16) | (inc << 8) | 255; break;
+                               case 4: rgb = (255 << 16) | (dec << 8) | inc; break;
+                               case 5: rgb = (inc << 16) | (255 << 8) | dec; break;
+                       }
+
+                       const deUint32  color   = 0xff000000 | rgb;
+                       tcu::clear(m_texture->getLevel(levelNdx, (tcu::CubeFace)faceNdx), tcu::RGBA(color).toVec());
+               }
+       }
+
+       m_renderer.addCubeTexture(m_texture);
+}
+
+TextureCubeMipmapTestInstance::~TextureCubeMipmapTestInstance (void)
+{
+}
+
+static void randomPartition (vector<IVec4>& dst, de::Random& rnd, int x, int y, int width, int height)
+{
+       const int       minWidth        = 8;
+       const int       minHeight       = 8;
+
+       const bool      partition       = rnd.getFloat() > 0.4f;
+       const bool      partitionX      = partition && width > minWidth && rnd.getBool();
+       const bool      partitionY      = partition && height > minHeight && !partitionX;
+
+       if (partitionX)
+       {
+               const int split = width/2 + rnd.getInt(-width/4, +width/4);
+               randomPartition(dst, rnd, x, y, split, height);
+               randomPartition(dst, rnd, x+split, y, width-split, height);
+       }
+       else if (partitionY)
+       {
+               const int split = height/2 + rnd.getInt(-height/4, +height/4);
+               randomPartition(dst, rnd, x, y, width, split);
+               randomPartition(dst, rnd, x, y+split, width, height-split);
+       }
+       else
+               dst.push_back(IVec4(x, y, width, height));
+}
+
+static void computeGridLayout (vector<IVec4>& dst, int width, int height)
+{
+       de::Random rnd(7);
+       randomPartition(dst, rnd, 0, 0, width, height);
+}
+
+tcu::TestStatus TextureCubeMipmapTestInstance::iterate (void)
+{
+       const int                       viewportWidth   = m_renderer.getRenderWidth();
+       const int                       viewportHeight  = m_renderer.getRenderHeight();
+
+       const bool                      isProjected             = m_testParameters.coordType == COORDTYPE_PROJECTED;
+       const bool                      useLodBias              = m_testParameters.coordType == COORDTYPE_BASIC_BIAS;
+
+       ReferenceParams         refParams               (TEXTURETYPE_CUBE);
+       vector<float>           texCoord;
+       tcu::Surface            renderedFrame   (viewportWidth, viewportHeight);
+
+       refParams.sampler               = util::createSampler(m_testParameters.wrapS, m_testParameters.wrapT, m_testParameters.minFilter, m_testParameters.magFilter);
+       refParams.samplerType   = getSamplerType(vk::mapVkFormat(m_testParameters.format));
+       refParams.flags                 = (isProjected ? ReferenceParams::PROJECTED : 0) | (useLodBias ? ReferenceParams::USE_BIAS : 0);
+       refParams.lodMode               = LODMODE_EXACT; // Use ideal lod.
+
+       // Compute grid.
+       vector<IVec4> gridLayout;
+       computeGridLayout(gridLayout, viewportWidth, viewportHeight);
+
+       // Bias values.
+       static const float s_bias[] = { 1.0f, -2.0f, 0.8f, -0.5f, 1.5f, 0.9f, 2.0f, 4.0f };
+
+       // Projection values \note Less agressive than in 2D case due to smaller quads.
+       static const Vec4 s_projections[] =
+       {
+               Vec4(1.2f, 1.0f, 0.7f, 1.0f),
+               Vec4(1.3f, 0.8f, 0.6f, 1.1f),
+               Vec4(0.8f, 1.0f, 1.2f, 0.8f),
+               Vec4(1.2f, 1.0f, 1.3f, 0.9f)
+       };
+
+       // Render with GL
+       for (int cellNdx = 0; cellNdx < (int)gridLayout.size(); cellNdx++)
+       {
+               const float                     curX            = (float)gridLayout[cellNdx].x();
+               const float                     curY            = (float)gridLayout[cellNdx].y();
+               const float                     curW            = (float)gridLayout[cellNdx].z();
+               const float                     curH            = (float)gridLayout[cellNdx].w();
+               const tcu::CubeFace     cubeFace        = (tcu::CubeFace)(cellNdx % tcu::CUBEFACE_LAST);
+
+               DE_ASSERT(m_testParameters.coordType != COORDTYPE_AFFINE); // Not supported.
+               computeQuadTexCoordCube(texCoord, cubeFace);
+
+               if (isProjected)
+               {
+                       refParams.flags |= ReferenceParams::PROJECTED;
+                       refParams.w              = s_projections[cellNdx % DE_LENGTH_OF_ARRAY(s_projections)];
+               }
+
+               if (useLodBias)
+               {
+                       refParams.flags |= ReferenceParams::USE_BIAS;
+                       refParams.bias   = s_bias[cellNdx % DE_LENGTH_OF_ARRAY(s_bias)];
+               }
+
+               // Render
+               m_renderer.setViewport(curX, curY, curW, curH);
+               m_renderer.renderQuad(renderedFrame, 0, &texCoord[0], refParams);
+       }
+
+       // Render reference and compare
+       {
+               const tcu::IVec4                formatBitDepth          = getTextureFormatBitDepth(vk::mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+               const tcu::PixelFormat  pixelFormat                     (formatBitDepth[0], formatBitDepth[1], formatBitDepth[2], formatBitDepth[3]);
+               tcu::Surface                    referenceFrame          (viewportWidth, viewportHeight);
+               tcu::Surface                    errorMask                       (viewportWidth, viewportHeight);
+               int                                             numFailedPixels         = 0;
+               tcu::LookupPrecision    lookupPrec;
+               tcu::LodPrecision               lodPrec;
+
+               // Params for rendering reference
+               refParams.sampler                                       = util::createSampler(m_testParameters.wrapS, m_testParameters.wrapT, m_testParameters.minFilter, m_testParameters.magFilter);
+               refParams.sampler.seamlessCubeMap       = true;
+               refParams.lodMode                                       = LODMODE_EXACT;
+
+               // Comparison parameters
+               lookupPrec.colorMask            = getCompareMask(pixelFormat);
+               lookupPrec.colorThreshold       = tcu::computeFixedPointThreshold(max(getBitsVec(pixelFormat)-2, tcu::IVec4(0)));
+               lookupPrec.coordBits            = isProjected ? tcu::IVec3(8) : tcu::IVec3(10);
+               lookupPrec.uvwBits                      = tcu::IVec3(5,5,0);
+               lodPrec.derivateBits            = 10;
+               lodPrec.lodBits                         = isProjected ? 3 : 6;
+
+               for (int cellNdx = 0; cellNdx < (int)gridLayout.size(); cellNdx++)
+               {
+                       const int                               curX            = gridLayout[cellNdx].x();
+                       const int                               curY            = gridLayout[cellNdx].y();
+                       const int                               curW            = gridLayout[cellNdx].z();
+                       const int                               curH            = gridLayout[cellNdx].w();
+                       const tcu::CubeFace             cubeFace        = (tcu::CubeFace)(cellNdx % tcu::CUBEFACE_LAST);
+
+                       DE_ASSERT(m_testParameters.coordType != COORDTYPE_AFFINE); // Not supported.
+                       computeQuadTexCoordCube(texCoord, cubeFace);
+
+                       if (isProjected)
+                       {
+                               refParams.flags |= ReferenceParams::PROJECTED;
+                               refParams.w              = s_projections[cellNdx % DE_LENGTH_OF_ARRAY(s_projections)];
+                       }
+
+                       if (useLodBias)
+                       {
+                               refParams.flags |= ReferenceParams::USE_BIAS;
+                               refParams.bias   = s_bias[cellNdx % DE_LENGTH_OF_ARRAY(s_bias)];
+                       }
+
+                       // Render ideal reference.
+                       {
+                               tcu::SurfaceAccess idealDst(referenceFrame, pixelFormat, curX, curY, curW, curH);
+                               sampleTexture(idealDst, m_texture->getTexture(), &texCoord[0], refParams);
+                       }
+
+                       // Compare this cell
+                       numFailedPixels += computeTextureLookupDiff(tcu::getSubregion(renderedFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                               tcu::getSubregion(referenceFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                               tcu::getSubregion(errorMask.getAccess(), curX, curY, curW, curH),
+                                                                                                               m_texture->getTexture(), &texCoord[0], refParams,
+                                                                                                               lookupPrec, lodPrec, m_context.getTestContext().getWatchDog());
+               }
+
+               if (numFailedPixels > 0)
+               {
+                       m_context.getTestContext().getLog() << TestLog::Message << "ERROR: Image verification failed, found " << numFailedPixels << " invalid pixels!" << TestLog::EndMessage;
+               }
+
+               m_context.getTestContext().getLog() << TestLog::ImageSet("Result", "Verification result")
+                                                                                       << TestLog::Image("Rendered", "Rendered image", renderedFrame);
+
+               if (numFailedPixels > 0)
+               {
+                       m_context.getTestContext().getLog() << TestLog::Image("Reference", "Ideal reference", referenceFrame)
+                                                                                               << TestLog::Image("ErrorMask", "Error mask", errorMask);
+               }
+
+               m_context.getTestContext().getLog() << TestLog::EndImageSet;
+
+               {
+                       const bool isOk = numFailedPixels == 0;
+                       return isOk ? tcu::TestStatus::pass("pass") : tcu::TestStatus::fail("fail");
+               }
+       }
+}
+
+// Texture3DMipmapTestInstance
+class Texture3DMipmapTestInstance : public TestInstance
+{
+public:
+       typedef Texture3DMipmapTestCaseParameters       ParameterType;
+
+                                                                       Texture3DMipmapTestInstance             (Context& context, const ParameterType& testParameters);
+                                                                       ~Texture3DMipmapTestInstance    (void);
+
+       virtual tcu::TestStatus                 iterate                                                 (void);
+
+private:
+                                                                       Texture3DMipmapTestInstance             (const Texture3DMipmapTestInstance& other);
+       Texture3DMipmapTestInstance&    operator=                                               (const Texture3DMipmapTestInstance& other);
+
+       const ParameterType                             m_testParameters;
+       TestTexture3DSp                                 m_texture;
+       TextureRenderer                                 m_renderer;
+};
+
+Texture3DMipmapTestInstance::Texture3DMipmapTestInstance (Context& context, const Texture3DMipmapTestCaseParameters& testParameters)
+       : TestInstance          (context)
+       , m_testParameters      (testParameters)
+       , m_renderer            (context, testParameters.sampleCount, testParameters.width*4, testParameters.height*4)
+{
+       TCU_CHECK_INTERNAL(!(m_testParameters.coordType == COORDTYPE_PROJECTED && m_testParameters.sampleCount != VK_SAMPLE_COUNT_1_BIT));
+
+       const tcu::TextureFormat&       texFmt          = mapVkFormat(testParameters.format);
+       tcu::TextureFormatInfo          fmtInfo         = tcu::getTextureFormatInfo(texFmt);
+       const tcu::Vec4&                        cScale          = fmtInfo.lookupScale;
+       const tcu::Vec4&                        cBias           = fmtInfo.lookupBias;
+       const int                                       numLevels       = deLog2Floor32(de::max(de::max(testParameters.width, testParameters.height), testParameters.depth))+1;
+
+       m_texture = TestTexture3DSp(new pipeline::TestTexture3D(vk::mapVkFormat(m_testParameters.format), m_testParameters.width, m_testParameters.height, m_testParameters.depth));
+
+       // Fill texture with colored grid.
+       for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+       {
+               const deUint32  step    = 0xff / (numLevels-1);
+               const deUint32  inc             = deClamp32(step*levelNdx, 0x00, 0xff);
+               const deUint32  dec             = 0xff - inc;
+               const deUint32  rgb             = (0xff << 16) | (dec << 8) | inc;
+               const deUint32  color   = 0xff000000 | rgb;
+
+               tcu::clear(m_texture->getLevel(levelNdx, 0), tcu::RGBA(color).toVec()*cScale + cBias);
+       }
+
+       m_renderer.add3DTexture(m_texture);
+}
+
+Texture3DMipmapTestInstance::~Texture3DMipmapTestInstance (void)
+{
+}
+
+static void getBasicTexCoord3D (std::vector<float>& dst, int cellNdx)
+{
+       static const struct
+       {
+               const float sScale;
+               const float sBias;
+               const float tScale;
+               const float tBias;
+               const float rScale;
+               const float rBias;
+       } s_params[] =
+       {
+       //              sScale  sBias   tScale  tBias   rScale  rBias
+               {        0.9f,  -0.1f,   0.7f,   0.3f,   0.8f,   0.9f   },
+               {        1.2f,  -0.1f,   1.1f,   0.3f,   1.0f,   0.9f   },
+               {        1.5f,   0.7f,   0.9f,  -0.3f,   1.1f,   0.1f   },
+               {        1.2f,   0.7f,  -2.3f,  -0.3f,   1.1f,   0.2f   },
+               {        1.1f,   0.8f,  -1.3f,  -0.3f,   2.9f,   0.9f   },
+               {        3.4f,   0.8f,   4.0f,   0.0f,  -3.3f,  -1.0f   },
+               {       -3.4f,  -0.1f,  -4.0f,   0.0f,  -5.1f,   1.0f   },
+               {       -4.0f,  -0.1f,   3.4f,   0.1f,   5.7f,   0.0f   },
+               {       -5.6f,   0.0f,   0.5f,   1.2f,   3.9f,   4.0f   },
+               {        5.0f,  -2.0f,   3.1f,   1.2f,   5.1f,   0.2f   },
+               {        2.5f,  -2.0f,   6.3f,   3.0f,   5.1f,   0.2f   },
+               {       -8.3f,   0.0f,   7.1f,   3.0f,   2.0f,   0.2f   },
+               {        3.8f,   0.0f,   9.7f,   1.0f,   7.0f,   0.7f   },
+               {       13.3f,   0.0f,   7.1f,   3.0f,   2.0f,   0.2f   },
+               {       16.0f,   8.0f,  12.7f,   1.0f,  17.1f,   0.7f   },
+               {       15.3f,   0.0f,  20.1f,   3.0f,  33.0f,   3.2f   }
+       };
+
+       const float sScale      = s_params[cellNdx%DE_LENGTH_OF_ARRAY(s_params)].sScale;
+       const float sBias       = s_params[cellNdx%DE_LENGTH_OF_ARRAY(s_params)].sBias;
+       const float tScale      = s_params[cellNdx%DE_LENGTH_OF_ARRAY(s_params)].tScale;
+       const float tBias       = s_params[cellNdx%DE_LENGTH_OF_ARRAY(s_params)].tBias;
+       const float rScale      = s_params[cellNdx%DE_LENGTH_OF_ARRAY(s_params)].rScale;
+       const float rBias       = s_params[cellNdx%DE_LENGTH_OF_ARRAY(s_params)].rBias;
+
+       dst.resize(3*4);
+
+       dst[0] = sBias;                 dst[ 1] = tBias;                        dst[ 2] = rBias;
+       dst[3] = sBias;                 dst[ 4] = tBias+tScale;         dst[ 5] = rBias+rScale*0.5f;
+       dst[6] = sBias+sScale;  dst[ 7] = tBias;                        dst[ 8] = rBias+rScale*0.5f;
+       dst[9] = sBias+sScale;  dst[10] = tBias+tScale;         dst[11] = rBias+rScale;
+}
+
+static void getAffineTexCoord3D (std::vector<float>& dst, int cellNdx)
+{
+       // Use basic coords as base.
+       getBasicTexCoord3D(dst, cellNdx);
+
+       // Rotate based on cell index.
+       const float             angleX          = 0.0f + 2.0f*DE_PI * ((float)cellNdx / 16.0f);
+       const float             angleY          = 1.0f + 2.0f*DE_PI * ((float)cellNdx / 32.0f);
+       const tcu::Mat3 rotMatrix       = tcu::rotationMatrixX(angleX) * tcu::rotationMatrixY(angleY);
+
+       const Vec3              p0                      = rotMatrix * Vec3(dst[0], dst[ 1], dst[ 2]);
+       const Vec3              p1                      = rotMatrix * Vec3(dst[3], dst[ 4], dst[ 5]);
+       const Vec3              p2                      = rotMatrix * Vec3(dst[6], dst[ 7], dst[ 8]);
+       const Vec3              p3                      = rotMatrix * Vec3(dst[9], dst[10], dst[11]);
+
+       dst[0] = p0.x();        dst[ 1] = p0.y();       dst[ 2] = p0.z();
+       dst[3] = p1.x();        dst[ 4] = p1.y();       dst[ 5] = p1.z();
+       dst[6] = p2.x();        dst[ 7] = p2.y();       dst[ 8] = p2.z();
+       dst[9] = p3.x();        dst[10] = p3.y();       dst[11] = p3.z();
+}
+
+tcu::TestStatus Texture3DMipmapTestInstance::iterate (void)
+{
+       const tcu::TextureFormat&               texFmt                  = m_texture->getTextureFormat();
+       const tcu::TextureFormatInfo    fmtInfo                 = tcu::getTextureFormatInfo(texFmt);
+       const Sampler::FilterMode               magFilter               = Sampler::NEAREST;
+       const int                                               viewportWidth   = m_renderer.getRenderWidth();
+       const int                                               viewportHeight  = m_renderer.getRenderHeight();
+
+       const bool                                              isProjected             = m_testParameters.coordType == COORDTYPE_PROJECTED;
+       const bool                                              useLodBias              = m_testParameters.coordType == COORDTYPE_BASIC_BIAS;
+
+       // Viewport is divided into 4x4 grid.
+       const int                                               gridWidth               = 4;
+       const int                                               gridHeight              = 4;
+       const int                                               cellWidth               = viewportWidth / gridWidth;
+       const int                                               cellHeight              = viewportHeight / gridHeight;
+
+       ReferenceParams                                 refParams               (TEXTURETYPE_3D);
+
+       tcu::Surface                                    renderedFrame   (viewportWidth, viewportHeight);
+       vector<float>                                   texCoord;
+
+       // Sampling parameters.
+       refParams.sampler               = util::createSampler(m_testParameters.wrapS, m_testParameters.wrapT, m_testParameters.minFilter, magFilter);
+       refParams.samplerType   = getSamplerType(texFmt);
+
+       refParams.colorBias             = fmtInfo.lookupBias;
+       refParams.colorScale    = fmtInfo.lookupScale;
+       refParams.flags                 = (isProjected ? ReferenceParams::PROJECTED : 0) | (useLodBias ? ReferenceParams::USE_BIAS : 0);
+
+       // Bias values.
+       static const float s_bias[] = { 1.0f, -2.0f, 0.8f, -0.5f, 1.5f, 0.9f, 2.0f, 4.0f };
+
+       // Projection values.
+       static const Vec4 s_projections[] =
+       {
+               Vec4(1.2f, 1.0f, 0.7f, 1.0f),
+               Vec4(1.3f, 0.8f, 0.6f, 2.0f),
+               Vec4(0.8f, 1.0f, 1.7f, 0.6f),
+               Vec4(1.2f, 1.0f, 1.7f, 1.5f)
+       };
+
+       // Render cells.
+       for (int gridY = 0; gridY < gridHeight; gridY++)
+       {
+               for (int gridX = 0; gridX < gridWidth; gridX++)
+               {
+                       const int       curX            = cellWidth*gridX;
+                       const int       curY            = cellHeight*gridY;
+                       const int       curW            = gridX+1 == gridWidth ? (viewportWidth-curX) : cellWidth;
+                       const int       curH            = gridY+1 == gridHeight ? (viewportHeight-curY) : cellHeight;
+                       const int       cellNdx         = gridY*gridWidth + gridX;
+
+                       // Compute texcoord.
+                       switch (m_testParameters.coordType)
+                       {
+                               case COORDTYPE_BASIC_BIAS:      // Fall-through.
+                               case COORDTYPE_PROJECTED:
+                               case COORDTYPE_BASIC:           getBasicTexCoord3D      (texCoord, cellNdx);    break;
+                               case COORDTYPE_AFFINE:          getAffineTexCoord3D     (texCoord, cellNdx);    break;
+                               default:                                        DE_ASSERT(DE_FALSE);
+                       }
+
+                       // Set projection.
+                       if (isProjected)
+                               refParams.w = s_projections[cellNdx % DE_LENGTH_OF_ARRAY(s_projections)];
+
+                       // Set LOD bias.
+                       if (useLodBias)
+                               refParams.bias = s_bias[cellNdx % DE_LENGTH_OF_ARRAY(s_bias)];
+
+                       m_renderer.setViewport((float)curX, (float)curY, (float)curW, (float)curH);
+                       m_renderer.renderQuad(renderedFrame, 0, &texCoord[0], refParams);
+               }
+       }
+
+       // Compare and log
+       {
+               const tcu::IVec4                formatBitDepth  = getTextureFormatBitDepth(vk::mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+               const tcu::PixelFormat  pixelFormat             (formatBitDepth[0], formatBitDepth[1], formatBitDepth[2], formatBitDepth[3]);
+               const bool                              isTrilinear             = m_testParameters.minFilter == Sampler::NEAREST_MIPMAP_LINEAR || m_testParameters.minFilter == Sampler::LINEAR_MIPMAP_LINEAR;
+               tcu::Surface                    referenceFrame  (viewportWidth, viewportHeight);
+               tcu::Surface                    errorMask               (viewportWidth, viewportHeight);
+               tcu::LookupPrecision    lookupPrec;
+               tcu::LodPrecision               lodPrec;
+               int                                             numFailedPixels = 0;
+
+               lookupPrec.coordBits            = tcu::IVec3(20, 20, 20);
+               lookupPrec.uvwBits                      = tcu::IVec3(16, 16, 16); // Doesn't really matter since pixels are unicolored.
+               lookupPrec.colorThreshold       = tcu::computeFixedPointThreshold(max(getBitsVec(pixelFormat) - (isTrilinear ? 2 : 1), tcu::IVec4(0)));
+               lookupPrec.colorMask            = getCompareMask(pixelFormat);
+               lodPrec.derivateBits            = 10;
+               lodPrec.lodBits                         = isProjected ? 6 : 8;
+
+               for (int gridY = 0; gridY < gridHeight; gridY++)
+               {
+                       for (int gridX = 0; gridX < gridWidth; gridX++)
+                       {
+                               const int       curX            = cellWidth*gridX;
+                               const int       curY            = cellHeight*gridY;
+                               const int       curW            = gridX+1 == gridWidth ? (viewportWidth-curX) : cellWidth;
+                               const int       curH            = gridY+1 == gridHeight ? (viewportHeight-curY) : cellHeight;
+                               const int       cellNdx         = gridY*gridWidth + gridX;
+
+                               switch (m_testParameters.coordType)
+                               {
+                                       case COORDTYPE_BASIC_BIAS:      // Fall-through.
+                                       case COORDTYPE_PROJECTED:
+                                       case COORDTYPE_BASIC:           getBasicTexCoord3D      (texCoord, cellNdx);    break;
+                                       case COORDTYPE_AFFINE:          getAffineTexCoord3D     (texCoord, cellNdx);    break;
+                                       default:                                        DE_ASSERT(DE_FALSE);
+                               }
+
+                               if (isProjected)
+                                       refParams.w = s_projections[cellNdx % DE_LENGTH_OF_ARRAY(s_projections)];
+
+                               if (useLodBias)
+                                       refParams.bias = s_bias[cellNdx % DE_LENGTH_OF_ARRAY(s_bias)];
+
+                               // Render ideal result
+                               sampleTexture(tcu::SurfaceAccess(referenceFrame, pixelFormat, curX, curY, curW, curH),
+                                                         m_texture->getTexture(), &texCoord[0], refParams);
+
+                               // Compare this cell
+                               numFailedPixels += computeTextureLookupDiff(tcu::getSubregion(renderedFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                                       tcu::getSubregion(referenceFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                                       tcu::getSubregion(errorMask.getAccess(), curX, curY, curW, curH),
+                                                                                                                       m_texture->getTexture(), &texCoord[0], refParams,
+                                                                                                                       lookupPrec, lodPrec, m_context.getTestContext().getWatchDog());
+                       }
+               }
+
+               if (numFailedPixels > 0)
+                       m_context.getTestContext().getLog() << TestLog::Message << "ERROR: Image verification failed, found " << numFailedPixels << " invalid pixels!" << TestLog::EndMessage;
+
+               m_context.getTestContext().getLog() << TestLog::ImageSet("Result", "Verification result")
+                                                                                       << TestLog::Image("Rendered", "Rendered image", renderedFrame);
+
+               if (numFailedPixels > 0)
+               {
+                       m_context.getTestContext().getLog() << TestLog::Image("Reference", "Ideal reference", referenceFrame)
+                                                                                               << TestLog::Image("ErrorMask", "Error mask", errorMask);
+               }
+
+               m_context.getTestContext().getLog() << TestLog::EndImageSet;
+
+               {
+                       const bool isOk = numFailedPixels == 0;
+                       return isOk ? tcu::TestStatus::pass("pass") : tcu::TestStatus::fail("fail");
+               }
+       }
+}
+
+// Texture2DLodControlTestInstance
+class Texture2DLodControlTestInstance : public TestInstance
+{
+public:
+       typedef Texture2DMipmapTestCaseParameters       ParameterType;
+
+                                                                               Texture2DLodControlTestInstance         (Context& context, const ParameterType& testParameters);
+                                                                               ~Texture2DLodControlTestInstance        (void);
+
+       virtual tcu::TestStatus                         iterate                                                         (void);
+
+protected:
+       virtual void                                            getReferenceParams                                      (ReferenceParams& params, int cellNdx) = 0;
+
+       const int                                                       m_texWidth;
+       const int                                                       m_texHeight;
+
+private:
+                                                                               Texture2DLodControlTestInstance         (const Texture2DLodControlTestInstance& other);
+       Texture2DLodControlTestInstance&        operator=                                                       (const Texture2DLodControlTestInstance& other);
+
+       const ParameterType                                     m_testParameters;
+       tcu::Sampler::FilterMode                        m_minFilter;
+       TestTexture2DSp                                         m_texture;
+       TextureRenderer                                         m_renderer;
+};
+
+Texture2DLodControlTestInstance::Texture2DLodControlTestInstance (Context& context, const Texture2DMipmapTestCaseParameters& testParameters)
+       : TestInstance          (context)
+       , m_texWidth            (64) //64
+       , m_texHeight           (64)//64
+       , m_testParameters      (testParameters)
+       , m_minFilter           (testParameters.minFilter)
+       , m_texture                     (DE_NULL)
+       , m_renderer            (context, testParameters.sampleCount, m_texWidth*4, m_texHeight*4)
+{
+       const VkFormat  format          = VK_FORMAT_R8G8B8A8_UNORM;
+       const int               numLevels       = deLog2Floor32(de::max(m_texWidth, m_texHeight))+1;
+
+       m_texture = TestTexture2DSp(new pipeline::TestTexture2D(vk::mapVkFormat(format), m_texWidth, m_texHeight));
+
+       // Fill texture with colored grid.
+       for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+       {
+               const deUint32  step    = 0xff / (numLevels-1);
+               const deUint32  inc             = deClamp32(step*levelNdx, 0x00, 0xff);
+               const deUint32  dec             = 0xff - inc;
+               const deUint32  rgb             = (inc << 16) | (dec << 8) | 0xff;
+               const deUint32  color   = 0xff000000 | rgb;
+
+               tcu::clear(m_texture->getLevel(levelNdx, 0), tcu::RGBA(color).toVec());
+       }
+
+       m_renderer.add2DTexture(m_texture);
+}
+
+Texture2DLodControlTestInstance::~Texture2DLodControlTestInstance (void)
+{
+}
+
+tcu::TestStatus Texture2DLodControlTestInstance::iterate (void)
+{
+       const tcu::Sampler::WrapMode    wrapS                   = Sampler::REPEAT_GL;
+       const tcu::Sampler::WrapMode    wrapT                   = Sampler::REPEAT_GL;
+       const tcu::Sampler::FilterMode  magFilter               = Sampler::NEAREST;
+
+       const tcu::Texture2D&                   refTexture              = m_texture->getTexture();
+
+       const int                                               viewportWidth   = m_renderer.getRenderWidth();
+       const int                                               viewportHeight  = m_renderer.getRenderHeight();
+
+       tcu::Sampler                                    sampler                 = util::createSampler(wrapS, wrapT, m_minFilter, magFilter);
+
+       ReferenceParams                                 refParams               (TEXTURETYPE_2D, sampler);
+       vector<float>                                   texCoord;
+       tcu::Surface                                    renderedFrame   (viewportWidth, viewportHeight);
+
+       // Viewport is divided into 4x4 grid.
+       const int                                               gridWidth               = 4;
+       const int                                               gridHeight              = 4;
+       const int                                               cellWidth               = viewportWidth / gridWidth;
+       const int                                               cellHeight              = viewportHeight / gridHeight;
+
+       refParams.maxLevel = deLog2Floor32(de::max(m_texWidth, m_texHeight));
+
+       // Render cells.
+       for (int gridY = 0; gridY < gridHeight; gridY++)
+       {
+               for (int gridX = 0; gridX < gridWidth; gridX++)
+               {
+                       const int       curX            = cellWidth*gridX;
+                       const int       curY            = cellHeight*gridY;
+                       const int       curW            = gridX+1 == gridWidth ? (viewportWidth-curX) : cellWidth;
+                       const int       curH            = gridY+1 == gridHeight ? (viewportHeight-curY) : cellHeight;
+                       const int       cellNdx         = gridY*gridWidth + gridX;
+
+                       // Compute texcoord.
+                       getBasicTexCoord2D(texCoord, cellNdx);
+                       // Render
+                       getReferenceParams(refParams,cellNdx);
+                       m_renderer.setViewport((float)curX, (float)curY, (float)curW, (float)curH);
+                       m_renderer.getTextureBinding(0)->updateTextureViewMipLevels(refParams.baseLevel, refParams.maxLevel);
+                       m_renderer.renderQuad(renderedFrame, 0, &texCoord[0], refParams);
+               }
+       }
+
+       // Compare and log.
+       {
+               const tcu::IVec4                formatBitDepth  = getTextureFormatBitDepth(vk::mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+               const tcu::PixelFormat  pixelFormat             (formatBitDepth[0], formatBitDepth[1], formatBitDepth[2], formatBitDepth[3]);
+               const bool                              isTrilinear             = m_minFilter == Sampler::NEAREST_MIPMAP_LINEAR || m_minFilter == Sampler::LINEAR_MIPMAP_LINEAR;
+               tcu::Surface                    referenceFrame  (viewportWidth, viewportHeight);
+               tcu::Surface                    errorMask               (viewportWidth, viewportHeight);
+               tcu::LookupPrecision    lookupPrec;
+               tcu::LodPrecision               lodPrec;
+               int                                             numFailedPixels = 0;
+
+               lookupPrec.coordBits            = tcu::IVec3(20, 20, 0);
+               lookupPrec.uvwBits                      = tcu::IVec3(16, 16, 0); // Doesn't really matter since pixels are unicolored.
+               lookupPrec.colorThreshold       = tcu::computeFixedPointThreshold(max(getBitsVec(pixelFormat) - (isTrilinear ? 2 : 1), tcu::IVec4(0)));
+               lookupPrec.colorMask            = getCompareMask(pixelFormat);
+               lodPrec.derivateBits            = 10;
+               lodPrec.lodBits                         = 8;
+
+               for (int gridY = 0; gridY < gridHeight; gridY++)
+               {
+                       for (int gridX = 0; gridX < gridWidth; gridX++)
+                       {
+                               const int       curX            = cellWidth*gridX;
+                               const int       curY            = cellHeight*gridY;
+                               const int       curW            = gridX+1 == gridWidth ? (viewportWidth-curX) : cellWidth;
+                               const int       curH            = gridY+1 == gridHeight ? (viewportHeight-curY) : cellHeight;
+                               const int       cellNdx         = gridY*gridWidth + gridX;
+
+                               getBasicTexCoord2D(texCoord, cellNdx);
+                               getReferenceParams(refParams, cellNdx);
+
+                               // Render ideal result
+                               sampleTexture(tcu::SurfaceAccess(referenceFrame, pixelFormat, curX, curY, curW, curH),
+                                                         refTexture, &texCoord[0], refParams);
+
+                               // Compare this cell
+                               numFailedPixels += computeTextureLookupDiff(tcu::getSubregion(renderedFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                                       tcu::getSubregion(referenceFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                                       tcu::getSubregion(errorMask.getAccess(), curX, curY, curW, curH),
+                                                                                                                       m_texture->getTexture(), &texCoord[0], refParams,
+                                                                                                                       lookupPrec, lodPrec, m_context.getTestContext().getWatchDog());
+                       }
+               }
+
+               if (numFailedPixels > 0)
+                       m_context.getTestContext().getLog() << TestLog::Message << "ERROR: Image verification failed, found " << numFailedPixels << " invalid pixels!" << TestLog::EndMessage;
+
+               m_context.getTestContext().getLog() << TestLog::ImageSet("Result", "Verification result")
+                                                                                       << TestLog::Image("Rendered", "Rendered image", renderedFrame);
+
+               if (numFailedPixels > 0)
+               {
+                       m_context.getTestContext().getLog() << TestLog::Image("Reference", "Ideal reference", referenceFrame)
+                                                                                               << TestLog::Image("ErrorMask", "Error mask", errorMask);
+               }
+
+               m_context.getTestContext().getLog() << TestLog::EndImageSet;
+
+               {
+                       const bool isOk = numFailedPixels == 0;
+                       return isOk ? tcu::TestStatus::pass("pass") : tcu::TestStatus::fail("fail");
+               }
+       }
+}
+
+class Texture2DMinLodTestInstance : public Texture2DLodControlTestInstance
+{
+public:
+       Texture2DMinLodTestInstance (Context& context, const Texture2DMipmapTestCaseParameters& testParameters)
+               : Texture2DLodControlTestInstance(context, testParameters)
+       {
+       }
+
+protected:
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.minLod = getMinLodForCell(cellNdx);
+       }
+};
+
+class Texture2DMaxLodTestInstance : public Texture2DLodControlTestInstance
+{
+public:
+       Texture2DMaxLodTestInstance (Context& context, const Texture2DMipmapTestCaseParameters& testParameters)
+               : Texture2DLodControlTestInstance(context, testParameters)
+       {
+       }
+
+protected:
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.maxLod = getMaxLodForCell(cellNdx);
+       }
+};
+
+class Texture2DBaseLevelTestInstance : public Texture2DLodControlTestInstance
+{
+public:
+       Texture2DBaseLevelTestInstance (Context& context, const Texture2DMipmapTestCaseParameters& testParameters)
+               : Texture2DLodControlTestInstance(context, testParameters)
+               , m_testParam (testParameters)
+       {
+       }
+
+protected:
+       const Texture2DMipmapTestCaseParameters m_testParam;
+
+       int getBaseLevel (int cellNdx) const
+       {
+               const int       numLevels       = deLog2Floor32(de::max(m_texWidth, m_texHeight))+1;
+               const int       baseLevel       = (deInt32Hash(cellNdx) ^ deStringHash(m_testParam.minFilterName) ^ 0xac2f274a) % numLevels;
+
+               return baseLevel;
+       }
+
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.baseLevel = getBaseLevel(cellNdx);
+       }
+};
+
+class Texture2DMaxLevelTestInstance : public Texture2DLodControlTestInstance
+{
+public:
+       Texture2DMaxLevelTestInstance (Context& context, const Texture2DMipmapTestCaseParameters& testParameters)
+               : Texture2DLodControlTestInstance(context, testParameters)
+               , m_testParam (testParameters)
+       {
+       }
+
+protected:
+       const Texture2DMipmapTestCaseParameters m_testParam;
+
+       int getMaxLevel (int cellNdx) const
+       {
+               const int       numLevels       = deLog2Floor32(de::max(m_texWidth, m_texHeight))+1;
+               const int       maxLevel        = (deInt32Hash(cellNdx) ^ deStringHash(m_testParam.minFilterName) ^ 0x82cfa4e) % numLevels;
+
+               return maxLevel;
+       }
+
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.maxLevel = getMaxLevel(cellNdx);
+       }
+};
+
+// TextureCubeLodControlTestInstance
+class TextureCubeLodControlTestInstance : public TestInstance
+{
+public:
+       typedef TextureCubeMipmapTestCaseParameters     ParameterType;
+
+                                                                               TextureCubeLodControlTestInstance       (Context& context, const ParameterType& testParameters);
+                                                                               ~TextureCubeLodControlTestInstance      (void);
+
+       virtual tcu::TestStatus                         iterate                                                         (void);
+
+protected:
+       virtual void                                            getReferenceParams                                      (ReferenceParams& params, int cellNdx)  = DE_NULL;
+
+       const int                                                       m_texSize;
+
+private:
+                                                                               TextureCubeLodControlTestInstance       (const TextureCubeLodControlTestInstance& other);
+       TextureCubeLodControlTestInstance&      operator=                                                       (const TextureCubeLodControlTestInstance& other);
+
+       const ParameterType                                     m_testParameters;
+       tcu::Sampler::FilterMode                        m_minFilter;
+       TestTextureCubeSp                                       m_texture;
+       TextureRenderer                                         m_renderer;
+};
+
+TextureCubeLodControlTestInstance::TextureCubeLodControlTestInstance (Context& context, const TextureCubeMipmapTestCaseParameters& testParameters)
+       : TestInstance          (context)
+       , m_texSize                     (64)
+       , m_testParameters      (testParameters)
+       , m_minFilter           (testParameters.minFilter)
+       , m_texture                     (DE_NULL)
+       , m_renderer            (context, testParameters.sampleCount, m_texSize*2, m_texSize*2)
+{
+       const VkFormat  format          = VK_FORMAT_R8G8B8A8_UNORM;
+       const int               numLevels       = deLog2Floor32(m_texSize)+1;
+
+       m_texture = TestTextureCubeSp(new pipeline::TestTextureCube(vk::mapVkFormat(format), m_texSize));
+
+       // Fill texture with colored grid.
+       for (int faceNdx = 0; faceNdx < tcu::CUBEFACE_LAST; faceNdx++)
+       {
+               for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+               {
+                       const deUint32  step    = 0xff / (numLevels-1);
+                       const deUint32  inc             = deClamp32(step*levelNdx, 0x00, 0xff);
+                       const deUint32  dec             = 0xff - inc;
+                       deUint32                rgb             = 0;
+
+                       switch (faceNdx)
+                       {
+                               case 0: rgb = (inc << 16) | (dec << 8) | 255; break;
+                               case 1: rgb = (255 << 16) | (inc << 8) | dec; break;
+                               case 2: rgb = (dec << 16) | (255 << 8) | inc; break;
+                               case 3: rgb = (dec << 16) | (inc << 8) | 255; break;
+                               case 4: rgb = (255 << 16) | (dec << 8) | inc; break;
+                               case 5: rgb = (inc << 16) | (255 << 8) | dec; break;
+                       }
+
+                       const deUint32  color   = 0xff000000 | rgb;
+
+                       tcu::clear(m_texture->getLevel(levelNdx, (tcu::CubeFace)faceNdx), tcu::RGBA(color).toVec());
+               }
+       }
+
+       m_renderer.addCubeTexture(m_texture);
+}
+
+TextureCubeLodControlTestInstance::~TextureCubeLodControlTestInstance (void)
+{
+}
+
+tcu::TestStatus TextureCubeLodControlTestInstance::iterate (void)
+{
+       const tcu::Sampler::WrapMode    wrapS                   = Sampler::CLAMP_TO_EDGE;
+       const tcu::Sampler::WrapMode    wrapT                   = Sampler::CLAMP_TO_EDGE;
+       const tcu::Sampler::FilterMode  magFilter               = Sampler::NEAREST;
+
+       const tcu::TextureCube&                 refTexture              = m_texture->getTexture();
+       const int                                               viewportWidth   = m_renderer.getRenderWidth();
+       const int                                               viewportHeight  = m_renderer.getRenderHeight();
+
+       tcu::Sampler                                    sampler                 = util::createSampler(wrapS, wrapT, m_minFilter, magFilter);
+       ReferenceParams                                 refParams               (TEXTURETYPE_CUBE, sampler);
+       vector<float>                                   texCoord;
+       tcu::Surface                                    renderedFrame   (viewportWidth, viewportHeight);
+
+       refParams.maxLevel = deLog2Floor32(m_texSize);
+
+       // Compute grid.
+       vector<tcu::IVec4> gridLayout;
+       computeGridLayout(gridLayout, viewportWidth, viewportHeight);
+
+       for (int cellNdx = 0; cellNdx < (int)gridLayout.size(); cellNdx++)
+       {
+               const int                       curX            = gridLayout[cellNdx].x();
+               const int                       curY            = gridLayout[cellNdx].y();
+               const int                       curW            = gridLayout[cellNdx].z();
+               const int                       curH            = gridLayout[cellNdx].w();
+               const tcu::CubeFace     cubeFace        = (tcu::CubeFace)(cellNdx % tcu::CUBEFACE_LAST);
+
+               computeQuadTexCoordCube(texCoord, cubeFace);
+               getReferenceParams(refParams, cellNdx);
+
+               // Render with GL.
+               m_renderer.setViewport((float)curX, (float)curY, (float)curW, (float)curH);
+               m_renderer.getTextureBinding(0)->updateTextureViewMipLevels(refParams.baseLevel, refParams.maxLevel);
+               m_renderer.renderQuad(renderedFrame, 0, &texCoord[0], refParams);
+       }
+
+       // Render reference and compare
+       {
+               const tcu::IVec4                formatBitDepth          = getTextureFormatBitDepth(mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+               const tcu::PixelFormat  pixelFormat                     (formatBitDepth[0], formatBitDepth[1], formatBitDepth[2], formatBitDepth[3]);
+               tcu::Surface                    referenceFrame          (viewportWidth, viewportHeight);
+               tcu::Surface                    errorMask                       (viewportWidth, viewportHeight);
+               int                                             numFailedPixels         = 0;
+               tcu::LookupPrecision    lookupPrec;
+               tcu::LodPrecision               lodPrec;
+
+               // Params for rendering reference
+               refParams.sampler                                       = util::createSampler(wrapS, wrapT, m_testParameters.minFilter, magFilter);
+               refParams.sampler.seamlessCubeMap       = true;
+               refParams.lodMode                                       = LODMODE_EXACT;
+
+               // Comparison parameters
+               lookupPrec.colorMask                            = getCompareMask(pixelFormat);
+               lookupPrec.colorThreshold                       = tcu::computeFixedPointThreshold(max(getBitsVec(pixelFormat)-2, IVec4(0)));
+               lookupPrec.coordBits                            = tcu::IVec3(10);
+               lookupPrec.uvwBits                                      = tcu::IVec3(5,5,0);
+               lodPrec.derivateBits                            = 10;
+               lodPrec.lodBits                                         = 6;
+
+               for (int cellNdx = 0; cellNdx < (int)gridLayout.size(); cellNdx++)
+               {
+                       const int                               curX            = gridLayout[cellNdx].x();
+                       const int                               curY            = gridLayout[cellNdx].y();
+                       const int                               curW            = gridLayout[cellNdx].z();
+                       const int                               curH            = gridLayout[cellNdx].w();
+                       const tcu::CubeFace             cubeFace        = (tcu::CubeFace)(cellNdx % tcu::CUBEFACE_LAST);
+
+                       computeQuadTexCoordCube(texCoord, cubeFace);
+                       getReferenceParams(refParams, cellNdx);
+
+                       // Render ideal reference.
+                       {
+                               tcu::SurfaceAccess idealDst(referenceFrame, pixelFormat, curX, curY, curW, curH);
+                               sampleTexture(idealDst, refTexture, &texCoord[0], refParams);
+                       }
+
+                       // Compare this cell
+                       numFailedPixels += computeTextureLookupDiff(tcu::getSubregion(renderedFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                               tcu::getSubregion(referenceFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                               tcu::getSubregion(errorMask.getAccess(), curX, curY, curW, curH),
+                                                                                                               m_texture->getTexture(), &texCoord[0], refParams,
+                                                                                                               lookupPrec, lodPrec,  m_context.getTestContext().getWatchDog());
+               }
+
+               if (numFailedPixels > 0)
+                        m_context.getTestContext().getLog() << TestLog::Message << "ERROR: Image verification failed, found " << numFailedPixels << " invalid pixels!" << TestLog::EndMessage;
+
+                m_context.getTestContext().getLog() << TestLog::ImageSet("Result", "Verification result")
+                                                                                        << TestLog::Image("Rendered", "Rendered image", renderedFrame);
+
+               if (numFailedPixels > 0)
+               {
+                        m_context.getTestContext().getLog() << TestLog::Image("Reference", "Ideal reference", referenceFrame)
+                                                                                                << TestLog::Image("ErrorMask", "Error mask", errorMask);
+               }
+
+                m_context.getTestContext().getLog() << TestLog::EndImageSet;
+
+               {
+                       const bool isOk = numFailedPixels == 0;
+                       return isOk ? tcu::TestStatus::pass("pass") : tcu::TestStatus::fail("fail");
+               }
+       }
+}
+
+class TextureCubeMinLodTestInstance : public TextureCubeLodControlTestInstance
+{
+public:
+       TextureCubeMinLodTestInstance (Context& context, const TextureCubeMipmapTestCaseParameters& testParameters)
+               : TextureCubeLodControlTestInstance(context, testParameters)
+       {
+       }
+
+protected:
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.minLod = getMinLodForCell(cellNdx);
+       }
+};
+
+class TextureCubeMaxLodTestInstance : public TextureCubeLodControlTestInstance
+{
+public:
+       TextureCubeMaxLodTestInstance (Context& context, const TextureCubeMipmapTestCaseParameters& testParameters)
+               : TextureCubeLodControlTestInstance(context, testParameters)
+       {
+       }
+
+protected:
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.maxLod = getMaxLodForCell(cellNdx);
+       }
+};
+
+class TextureCubeBaseLevelTestInstance : public TextureCubeLodControlTestInstance
+{
+public:
+       TextureCubeBaseLevelTestInstance (Context& context, const TextureCubeMipmapTestCaseParameters& testParameters)
+               : TextureCubeLodControlTestInstance(context, testParameters)
+               , m_testParam (testParameters)
+       {
+       }
+
+protected:
+       const TextureCubeMipmapTestCaseParameters m_testParam;
+
+       int getBaseLevel (int cellNdx) const
+       {
+               const int       numLevels       = deLog2Floor32(m_texSize)+1;
+               const int       baseLevel       = (deInt32Hash(cellNdx) ^ deStringHash(m_testParam.minFilterName) ^ 0x23fae13) % numLevels;
+
+               return baseLevel;
+       }
+
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.baseLevel = getBaseLevel(cellNdx);
+       }
+};
+
+class TextureCubeMaxLevelTestInstance : public TextureCubeLodControlTestInstance
+{
+public:
+       TextureCubeMaxLevelTestInstance (Context& context, const TextureCubeMipmapTestCaseParameters& testParameters)
+               : TextureCubeLodControlTestInstance(context, testParameters)
+               , m_testParam (testParameters)
+       {
+       }
+
+protected:
+       const TextureCubeMipmapTestCaseParameters m_testParam;
+       int getMaxLevel (int cellNdx) const
+       {
+               const int       numLevels       = deLog2Floor32(m_texSize)+1;
+               const int       maxLevel        = (deInt32Hash(cellNdx) ^ deStringHash(m_testParam.minFilterName) ^ 0x974e21) % numLevels;
+
+               return maxLevel;
+       }
+
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.maxLevel = getMaxLevel(cellNdx);
+       }
+};
+
+// Texture3DLodControlTestInstance
+class Texture3DLodControlTestInstance : public TestInstance
+{
+public:
+       typedef Texture3DMipmapTestCaseParameters       ParameterType;
+
+                                                                               Texture3DLodControlTestInstance         (Context& context, const ParameterType& testParameters);
+                                                                               ~Texture3DLodControlTestInstance        (void);
+
+       virtual tcu::TestStatus                         iterate                                                         (void);
+
+protected:
+       virtual void                                            getReferenceParams                                      (ReferenceParams& params, int cellNdx)  = DE_NULL;
+
+       const int                                                       m_texWidth;
+       const int                                                       m_texHeight;
+       const int                                                       m_texDepth;
+
+private:
+                                                                               Texture3DLodControlTestInstance         (const Texture3DLodControlTestInstance& other);
+       Texture3DLodControlTestInstance&        operator=                                                       (const Texture3DLodControlTestInstance& other);
+
+       const ParameterType                                     m_testParameters;
+       tcu::Sampler::FilterMode                        m_minFilter;
+       TestTexture3DSp                                         m_texture;
+       TextureRenderer                                         m_renderer;
+};
+
+Texture3DLodControlTestInstance::Texture3DLodControlTestInstance (Context& context, const Texture3DMipmapTestCaseParameters& testParameters)
+       : TestInstance          (context)
+       , m_texWidth            (32)
+       , m_texHeight           (32)
+       , m_texDepth            (32)
+       , m_testParameters      (testParameters)
+       , m_minFilter           (testParameters.minFilter)
+       , m_texture                     (DE_NULL)
+       , m_renderer            (context, testParameters.sampleCount, m_texWidth*4, m_texHeight*4)
+{
+       const VkFormat                  format          = VK_FORMAT_R8G8B8A8_UNORM;
+       tcu::TextureFormatInfo  fmtInfo         = tcu::getTextureFormatInfo(mapVkFormat(format));
+       const tcu::Vec4&                cScale          = fmtInfo.lookupScale;
+       const tcu::Vec4&                cBias           = fmtInfo.lookupBias;
+       const int                               numLevels       = deLog2Floor32(de::max(de::max(m_texWidth, m_texHeight), m_texDepth))+1;
+
+       m_texture = TestTexture3DSp(new pipeline::TestTexture3D(vk::mapVkFormat(format), m_texWidth, m_texHeight, m_texDepth));
+
+       // Fill texture with colored grid.
+       for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
+       {
+               const deUint32  step    = 0xff / (numLevels-1);
+               const deUint32  inc             = deClamp32(step*levelNdx, 0x00, 0xff);
+               const deUint32  dec             = 0xff - inc;
+               const deUint32  rgb             = (inc << 16) | (dec << 8) | 0xff;
+               const deUint32  color   = 0xff000000 | rgb;
+
+               tcu::clear(m_texture->getLevel(levelNdx, 0), tcu::RGBA(color).toVec()*cScale + cBias);
+       }
+
+       m_renderer.add3DTexture(m_texture);
+}
+
+Texture3DLodControlTestInstance::~Texture3DLodControlTestInstance (void)
+{
+}
+
+tcu::TestStatus Texture3DLodControlTestInstance::iterate (void)
+{
+       const tcu::Sampler::WrapMode    wrapS                   = Sampler::CLAMP_TO_EDGE;
+       const tcu::Sampler::WrapMode    wrapT                   = Sampler::CLAMP_TO_EDGE;
+       const tcu::Sampler::WrapMode    wrapR                   = Sampler::CLAMP_TO_EDGE;
+       const tcu::Sampler::FilterMode  magFilter               = Sampler::NEAREST;
+
+       const tcu::Texture3D&                   refTexture              = m_texture->getTexture();
+       const tcu::TextureFormat&               texFmt                  = refTexture.getFormat();
+       const tcu::TextureFormatInfo    fmtInfo                 = tcu::getTextureFormatInfo(texFmt);
+       const int                                               viewportWidth   = m_renderer.getRenderWidth();
+       const int                                               viewportHeight  = m_renderer.getRenderHeight();
+
+       tcu::Sampler                                    sampler                 = util::createSampler(wrapS, wrapT, m_minFilter, magFilter);
+       ReferenceParams                                 refParams               (TEXTURETYPE_3D, sampler);
+       vector<float>                                   texCoord;
+       tcu::Surface                                    renderedFrame   (viewportWidth, viewportHeight);
+
+       // Viewport is divided into 4x4 grid.
+       const int                                               gridWidth               = 4;
+       const int                                               gridHeight              = 4;
+       const int                                               cellWidth               = viewportWidth / gridWidth;
+       const int                                               cellHeight              = viewportHeight / gridHeight;
+
+       // Sampling parameters.
+       refParams.sampler               = util::createSampler(wrapS, wrapT, wrapR, m_testParameters.minFilter, magFilter);
+       refParams.samplerType   = getSamplerType(texFmt);
+       refParams.colorBias             = fmtInfo.lookupBias;
+       refParams.colorScale    = fmtInfo.lookupScale;
+       refParams.maxLevel              = deLog2Floor32(de::max(de::max(m_texWidth, m_texHeight), m_texDepth));
+
+       // Render cells.
+       for (int gridY = 0; gridY < gridHeight; gridY++)
+       {
+               for (int gridX = 0; gridX < gridWidth; gridX++)
+               {
+                       const int       curX            = cellWidth*gridX;
+                       const int       curY            = cellHeight*gridY;
+                       const int       curW            = gridX+1 == gridWidth ? (viewportWidth-curX) : cellWidth;
+                       const int       curH            = gridY+1 == gridHeight ? (viewportHeight-curY) : cellHeight;
+                       const int       cellNdx         = gridY*gridWidth + gridX;
+
+                       // Compute texcoord.
+                       getBasicTexCoord3D(texCoord, cellNdx);
+
+                       getReferenceParams(refParams,cellNdx);
+                       //Render
+                       m_renderer.setViewport((float)curX, (float)curY, (float)curW, (float)curH);
+                       m_renderer.getTextureBinding(0)->updateTextureViewMipLevels(refParams.baseLevel, refParams.maxLevel);
+                       m_renderer.renderQuad(renderedFrame, 0, &texCoord[0], refParams);
+               }
+       }
+
+       // Compare and log
+       {
+               const tcu::IVec4                formatBitDepth  = getTextureFormatBitDepth(mapVkFormat(VK_FORMAT_R8G8B8A8_UNORM));
+               const tcu::PixelFormat  pixelFormat             (formatBitDepth[0], formatBitDepth[1], formatBitDepth[2], formatBitDepth[3]);
+               const bool                              isTrilinear             = m_minFilter == Sampler::NEAREST_MIPMAP_LINEAR || m_minFilter == Sampler::LINEAR_MIPMAP_LINEAR;
+               tcu::Surface                    referenceFrame  (viewportWidth, viewportHeight);
+               tcu::Surface                    errorMask               (viewportWidth, viewportHeight);
+               tcu::LookupPrecision    lookupPrec;
+               tcu::LodPrecision               lodPrec;
+               int                                             numFailedPixels = 0;
+
+               lookupPrec.coordBits            = tcu::IVec3(20, 20, 20);
+               lookupPrec.uvwBits                      = tcu::IVec3(16, 16, 16); // Doesn't really matter since pixels are unicolored.
+               lookupPrec.colorThreshold       = tcu::computeFixedPointThreshold(max(getBitsVec(pixelFormat) - (isTrilinear ? 2 : 1), tcu::IVec4(0)));
+               lookupPrec.colorMask            = getCompareMask(pixelFormat);
+               lodPrec.derivateBits            = 10;
+               lodPrec.lodBits                         = 8;
+
+               for (int gridY = 0; gridY < gridHeight; gridY++)
+               {
+                       for (int gridX = 0; gridX < gridWidth; gridX++)
+                       {
+                               const int       curX            = cellWidth*gridX;
+                               const int       curY            = cellHeight*gridY;
+                               const int       curW            = gridX+1 == gridWidth ? (viewportWidth-curX) : cellWidth;
+                               const int       curH            = gridY+1 == gridHeight ? (viewportHeight-curY) : cellHeight;
+                               const int       cellNdx         = gridY*gridWidth + gridX;
+
+                               getBasicTexCoord3D(texCoord, cellNdx);
+                               getReferenceParams(refParams, cellNdx);
+
+                               // Render ideal result
+                               sampleTexture(tcu::SurfaceAccess(referenceFrame, pixelFormat, curX, curY, curW, curH),
+                                                         refTexture, &texCoord[0], refParams);
+
+                               // Compare this cell
+                               numFailedPixels += computeTextureLookupDiff(tcu::getSubregion(renderedFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                                       tcu::getSubregion(referenceFrame.getAccess(), curX, curY, curW, curH),
+                                                                                                                       tcu::getSubregion(errorMask.getAccess(), curX, curY, curW, curH),
+                                                                                                                       m_texture->getTexture(), &texCoord[0], refParams,
+                                                                                                                       lookupPrec, lodPrec, m_context.getTestContext().getWatchDog());
+                       }
+               }
+
+               if (numFailedPixels > 0)
+               {
+                       m_context.getTestContext().getLog() << TestLog::Message << "ERROR: Image verification failed, found " << numFailedPixels << " invalid pixels!" << TestLog::EndMessage;
+               }
+
+               m_context.getTestContext().getLog() << TestLog::ImageSet("Result", "Verification result")
+                                                                                       << TestLog::Image("Rendered", "Rendered image", renderedFrame);
+
+               if (numFailedPixels > 0)
+               {
+                       m_context.getTestContext().getLog() << TestLog::Image("Reference", "Ideal reference", referenceFrame)
+                                                                                               << TestLog::Image("ErrorMask", "Error mask", errorMask);
+               }
+
+               m_context.getTestContext().getLog() << TestLog::EndImageSet;
+
+               {
+                       const bool isOk = numFailedPixels == 0;
+                       return isOk ? tcu::TestStatus::pass("pass") : tcu::TestStatus::fail("fail");
+               }
+       }
+}
+
+class Texture3DMinLodTestInstance : public Texture3DLodControlTestInstance
+{
+public:
+       Texture3DMinLodTestInstance (Context& context, const Texture3DMipmapTestCaseParameters& testParameters)
+               : Texture3DLodControlTestInstance(context, testParameters)
+       {
+       }
+
+protected:
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.minLod = getMinLodForCell(cellNdx);
+       }
+};
+
+class Texture3DMaxLodTestInstance : public Texture3DLodControlTestInstance
+{
+public:
+       Texture3DMaxLodTestInstance (Context& context, const Texture3DMipmapTestCaseParameters& testParameters)
+               : Texture3DLodControlTestInstance(context, testParameters)
+       {
+       }
+
+protected:
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.maxLod = getMaxLodForCell(cellNdx);
+       }
+};
+
+class Texture3DBaseLevelTestInstance : public Texture3DLodControlTestInstance
+{
+public:
+       Texture3DBaseLevelTestInstance (Context& context, const Texture3DMipmapTestCaseParameters& testParameters)
+               : Texture3DLodControlTestInstance(context, testParameters)
+               ,m_testParam (testParameters)
+       {
+       }
+
+protected:
+       const Texture3DMipmapTestCaseParameters m_testParam;
+
+       int getBaseLevel (int cellNdx) const
+       {
+               const int       numLevels       = deLog2Floor32(de::max(m_texWidth, de::max(m_texHeight, m_texDepth)))+1;
+               const int       baseLevel       = (deInt32Hash(cellNdx) ^ deStringHash(m_testParam.minFilterName) ^ 0x7347e9) % numLevels;
+
+               return baseLevel;
+       }
+
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.baseLevel = getBaseLevel(cellNdx);
+       }
+};
+
+class Texture3DMaxLevelTestInstance : public Texture3DLodControlTestInstance
+{
+public:
+       Texture3DMaxLevelTestInstance (Context& context, const Texture3DMipmapTestCaseParameters& testParameters)
+               : Texture3DLodControlTestInstance(context, testParameters)
+               ,m_testParam (testParameters)
+       {
+       }
+
+protected:
+       const Texture3DMipmapTestCaseParameters m_testParam;
+
+       int getMaxLevel (int cellNdx) const
+       {
+               const int       numLevels       = deLog2Floor32(de::max(m_texWidth, de::max(m_texHeight, m_texDepth)))+1;
+               const int       maxLevel        = (deInt32Hash(cellNdx) ^ deStringHash(m_testParam.minFilterName) ^ 0x9111e7) % numLevels;
+
+               return maxLevel;
+       }
+
+       void getReferenceParams (ReferenceParams& params, int cellNdx)
+       {
+               params.maxLevel = getMaxLevel(cellNdx);
+       }
+};
+
+void populateTextureMipmappingTests (tcu::TestCaseGroup* textureMipmappingTests)
+{
+       tcu::TestContext&       testCtx         = textureMipmappingTests->getTestContext();
+
+       static const struct
+       {
+               const char*                             name;
+               const Sampler::WrapMode mode;
+       } wrapModes[] =
+       {
+               { "clamp",              Sampler::CLAMP_TO_EDGE          },
+               { "repeat",             Sampler::REPEAT_GL                      },
+               { "mirror",             Sampler::MIRRORED_REPEAT_GL     }
+       };
+
+       static const struct
+       {
+               const char*                                     name;
+               const Sampler::FilterMode       mode;
+       } minFilterModes[] =
+       {
+               { "nearest_nearest",    Sampler::NEAREST_MIPMAP_NEAREST },
+               { "linear_nearest",             Sampler::LINEAR_MIPMAP_NEAREST  },
+               { "nearest_linear",             Sampler::NEAREST_MIPMAP_LINEAR  },
+               { "linear_linear",              Sampler::LINEAR_MIPMAP_LINEAR   }
+       };
+
+       static const struct
+       {
+               const char*                                     name;
+               const Sampler::FilterMode       mode;
+       } magFilterModes[] =
+       {
+               { "nearest",    Sampler::NEAREST},
+               { "linear",             Sampler::LINEAR}
+       };
+
+
+       static const struct
+       {
+               const CoordType         type;
+               const char*                     name;
+               const char*                     desc;
+       } coordTypes[] =
+       {
+               { COORDTYPE_BASIC,              "basic",                "Mipmapping with translated and scaled coordinates" },
+               { COORDTYPE_AFFINE,             "affine",               "Mipmapping with affine coordinate transform"           },
+               { COORDTYPE_PROJECTED,  "projected",    "Mipmapping with perspective projection"                        }
+       };
+
+       static const struct
+       {
+               const char*             name;
+               const int               width;
+               const int               height;
+       } tex2DSizes[] =
+       {
+               { DE_NULL,              64, 64 }, // Default.
+               { "npot",               63, 57 },
+               { "non_square", 32, 64 }
+       };
+
+       static const struct
+       {
+               const char*             name;
+               const int               width;
+               const int               height;
+               const int               depth;
+       } tex3DSizes[] =
+       {
+               { DE_NULL,              32, 32, 32 }, // Default.
+               { "npot",               33, 29, 27 }
+       };
+
+       const int cubeMapSize = 64;
+
+       static const struct
+       {
+               const CoordType         type;
+               const char*                     name;
+               const char*                     desc;
+       } cubeCoordTypes[] =
+       {
+               { COORDTYPE_BASIC,              "basic",                "Mipmapping with translated and scaled coordinates" },
+               { COORDTYPE_PROJECTED,  "projected",    "Mipmapping with perspective projection"                        },
+               { COORDTYPE_BASIC_BIAS, "bias",                 "User-supplied bias value"                                                      }
+       };
+
+       // 2D cases.
+       {
+               de::MovePtr<tcu::TestCaseGroup> group2D                         (new tcu::TestCaseGroup(testCtx, "2d", "2D Mipmap Filtering"));
+
+               de::MovePtr<tcu::TestCaseGroup> biasGroup2D                     (new tcu::TestCaseGroup(testCtx, "bias", "User-supplied bias value"));
+               de::MovePtr<tcu::TestCaseGroup> minLodGroup2D           (new tcu::TestCaseGroup(testCtx, "min_lod", "Lod control: min lod"));
+               de::MovePtr<tcu::TestCaseGroup> maxLodGroup2D           (new tcu::TestCaseGroup(testCtx, "max_lod", "Lod control: max lod"));
+               de::MovePtr<tcu::TestCaseGroup> baseLevelGroup2D        (new tcu::TestCaseGroup(testCtx, "base_level", "Base level"));
+               de::MovePtr<tcu::TestCaseGroup> maxLevelGroup2D         (new tcu::TestCaseGroup(testCtx, "max_level", "Max level"));
+
+               for (int coordType = 0; coordType < DE_LENGTH_OF_ARRAY(coordTypes); coordType++)
+               {
+                       de::MovePtr<tcu::TestCaseGroup> coordTypeGroup          (new tcu::TestCaseGroup(testCtx, coordTypes[coordType].name, coordTypes[coordType].desc));
+
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               for (int wrapMode = 0; wrapMode < DE_LENGTH_OF_ARRAY(wrapModes); wrapMode++)
+                               {
+                                       // Add non_square variants to basic cases only.
+                                       int sizeEnd = coordTypes[coordType].type == COORDTYPE_BASIC ? DE_LENGTH_OF_ARRAY(tex2DSizes) : 1;
+
+                                       for (int size = 0; size < sizeEnd; size++)
+                                       {
+                                               Texture2DMipmapTestCaseParameters       testParameters;
+
+                                               testParameters.coordType        = coordTypes[coordType].type;
+                                               testParameters.minFilter        = minFilterModes[minFilter].mode;
+                                               testParameters.wrapS            = wrapModes[wrapMode].mode;
+                                               testParameters.wrapT            = wrapModes[wrapMode].mode;
+                                               testParameters.format           = VK_FORMAT_R8G8B8A8_UNORM; //not sure (GL_RGBA)
+                                               testParameters.width            = tex2DSizes[size].width;
+                                               testParameters.height           = tex2DSizes[size].height;
+                                               testParameters.programs.push_back(PROGRAM_2D_FLOAT);
+
+                                               std::ostringstream name;
+                                               name << minFilterModes[minFilter].name
+                                                        << "_" << wrapModes[wrapMode].name;
+
+                                               if (tex2DSizes[size].name)
+                                                       name << "_" << tex2DSizes[size].name;
+
+                                               coordTypeGroup->addChild(new TextureTestCase<Texture2DMipmapTestInstance>(testCtx, name.str().c_str(), "", testParameters));
+                                       }
+                               }
+                       }
+
+                       group2D->addChild(coordTypeGroup.release());
+               }
+
+               // 2D bias variants.
+               {
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               Texture2DMipmapTestCaseParameters       testParameters;
+
+                               testParameters.coordType        = COORDTYPE_BASIC_BIAS;
+                               testParameters.minFilter        = minFilterModes[minFilter].mode;
+                               testParameters.magFilter        = minFilterModes[minFilter].mode;
+                               testParameters.wrapS            = Sampler::REPEAT_GL;
+                               testParameters.wrapT            = Sampler::REPEAT_GL;
+                               testParameters.format           = VK_FORMAT_R8G8B8A8_UNORM; //not sure (GL_RGBA)
+                               testParameters.width            = tex2DSizes[0].width;
+                               testParameters.height           = tex2DSizes[0].height;
+                               testParameters.programs.push_back(PROGRAM_2D_FLOAT_BIAS);
+
+                               std::ostringstream name;
+                               name << minFilterModes[minFilter].name;
+
+                               biasGroup2D->addChild(new TextureTestCase<Texture2DMipmapTestInstance>(testCtx, name.str().c_str(), "", testParameters));
+                       }
+               }
+
+               // 2D LOD controls.
+               {
+                       // MIN_LOD
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               Texture2DMipmapTestCaseParameters       testParameters;
+                               testParameters.minFilter        = minFilterModes[minFilter].mode;
+                               testParameters.programs.push_back(PROGRAM_2D_FLOAT);
+
+                               minLodGroup2D->addChild(new TextureTestCase<Texture2DMinLodTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+
+                       // MAX_LOD
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               Texture2DMipmapTestCaseParameters       testParameters;
+                               testParameters.minFilter = minFilterModes[minFilter].mode;
+                               testParameters.programs.push_back(PROGRAM_2D_FLOAT);
+
+                               maxLodGroup2D->addChild(new TextureTestCase<Texture2DMaxLodTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+               }
+
+               {
+                       // BASE_LEVEL
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               Texture2DMipmapTestCaseParameters       testParameters;
+                               testParameters.minFilter = minFilterModes[minFilter].mode;
+                               testParameters.minFilterName = minFilterModes[minFilter].name;
+                               testParameters.programs.push_back(PROGRAM_2D_FLOAT);
+
+                               baseLevelGroup2D->addChild(new TextureTestCase<Texture2DBaseLevelTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+
+                       // MAX_LEVEL
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               Texture2DMipmapTestCaseParameters       testParameters;
+                               testParameters.minFilter = minFilterModes[minFilter].mode;
+                               testParameters.minFilterName = minFilterModes[minFilter].name;
+                               testParameters.programs.push_back(PROGRAM_2D_FLOAT);
+
+                               maxLevelGroup2D->addChild(new TextureTestCase<Texture2DMaxLevelTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+               }
+
+               group2D->addChild(biasGroup2D.release());
+               group2D->addChild(minLodGroup2D.release());
+               group2D->addChild(maxLodGroup2D.release());
+               group2D->addChild(baseLevelGroup2D.release());
+               group2D->addChild(maxLevelGroup2D.release());
+
+               textureMipmappingTests->addChild(group2D.release());
+       }
+
+       // Cubemap cases.
+       {
+               de::MovePtr<tcu::TestCaseGroup> groupCube                       (new tcu::TestCaseGroup(testCtx, "cubemap", "Cube Mipmap Filtering"));
+
+               de::MovePtr<tcu::TestCaseGroup> minLodGroupCube         (new tcu::TestCaseGroup(testCtx, "min_lod", "Lod control: min lod"));
+               de::MovePtr<tcu::TestCaseGroup> maxLodGroupCube         (new tcu::TestCaseGroup(testCtx, "max_lod", "Lod control: max lod"));
+               de::MovePtr<tcu::TestCaseGroup> baseLevelGroupCube      (new tcu::TestCaseGroup(testCtx, "base_level", "Base level"));
+               de::MovePtr<tcu::TestCaseGroup> maxLevelGroupCube       (new tcu::TestCaseGroup(testCtx, "max_level", "Max level"));
+
+               for (int coordType = 0; coordType < DE_LENGTH_OF_ARRAY(cubeCoordTypes); coordType++)
+               {
+                       de::MovePtr<tcu::TestCaseGroup> coordTypeGroup  (new tcu::TestCaseGroup(testCtx, cubeCoordTypes[coordType].name, cubeCoordTypes[coordType].desc));
+
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               for (int magFilter = 0; magFilter < DE_LENGTH_OF_ARRAY(magFilterModes); magFilter++)
+                               {
+                                       for (int wrapMode = 0; wrapMode < DE_LENGTH_OF_ARRAY(wrapModes); wrapMode++)
+                                       {
+                                               TextureCubeMipmapTestCaseParameters     testParameters;
+
+                                               testParameters.coordType                = cubeCoordTypes[coordType].type;
+                                               testParameters.minFilter                = minFilterModes[minFilter].mode;
+                                               testParameters.magFilter                = magFilterModes[magFilter].mode;
+                                               testParameters.minFilterName    = minFilterModes[minFilter].name;
+                                               testParameters.wrapS                    = wrapModes[wrapMode].mode;
+                                               testParameters.wrapT                    = wrapModes[wrapMode].mode;
+                                               testParameters.format                   = VK_FORMAT_R8G8B8A8_UNORM;
+                                               testParameters.size                             = cubeMapSize;
+                                               testParameters.programs.push_back(PROGRAM_CUBE_FLOAT);
+                                               testParameters.programs.push_back(PROGRAM_CUBE_FLOAT_BIAS);
+
+                                               std::ostringstream name;
+                                               name << minFilterModes[minFilter].name
+                                                        << "_" << magFilterModes[magFilter].name
+                                                        << "_" << wrapModes[wrapMode].name;
+
+                                               coordTypeGroup->addChild(new TextureTestCase<TextureCubeMipmapTestInstance>(testCtx, name.str().c_str(), "", testParameters));
+                                       }
+                               }
+                       }
+
+                       groupCube->addChild(coordTypeGroup.release());
+               }
+
+               // Cubemap LOD controls.
+               {
+                       // MIN_LOD
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               TextureCubeMipmapTestCaseParameters     testParameters;
+                               testParameters.minFilter        = minFilterModes[minFilter].mode;
+                               testParameters.programs.push_back(PROGRAM_CUBE_FLOAT);
+
+                               minLodGroupCube->addChild(new TextureTestCase<TextureCubeMinLodTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+
+                       // MAX_LOD
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               TextureCubeMipmapTestCaseParameters     testParameters;
+                               testParameters.minFilter        = minFilterModes[minFilter].mode;
+                               testParameters.programs.push_back(PROGRAM_CUBE_FLOAT);
+
+                               maxLodGroupCube->addChild(new TextureTestCase<TextureCubeMaxLodTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+               }
+
+               {
+                       // BASE_LEVEL
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               TextureCubeMipmapTestCaseParameters     testParameters;
+                               testParameters.minFilter = minFilterModes[minFilter].mode;
+                               testParameters.minFilterName = minFilterModes[minFilter].name;
+                               testParameters.programs.push_back(PROGRAM_CUBE_FLOAT);
+
+                               baseLevelGroupCube->addChild(new TextureTestCase<TextureCubeBaseLevelTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+
+                       // MAX_LEVEL
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               TextureCubeMipmapTestCaseParameters     testParameters;
+                               testParameters.minFilter = minFilterModes[minFilter].mode;
+                               testParameters.minFilterName = minFilterModes[minFilter].name;
+                               testParameters.programs.push_back(PROGRAM_CUBE_FLOAT);
+
+                               maxLevelGroupCube->addChild(new TextureTestCase<TextureCubeMaxLevelTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+               }
+
+               groupCube->addChild(minLodGroupCube.release());
+               groupCube->addChild(maxLodGroupCube.release());
+               groupCube->addChild(baseLevelGroupCube.release());
+               groupCube->addChild(maxLevelGroupCube.release());
+
+               textureMipmappingTests->addChild(groupCube.release());
+       }
+
+       // 3D cases.
+       {
+               de::MovePtr<tcu::TestCaseGroup> group3D                         (new tcu::TestCaseGroup(testCtx, "3d", "3D Mipmap Filtering"));
+
+               de::MovePtr<tcu::TestCaseGroup> biasGroup3D                     (new tcu::TestCaseGroup(testCtx, "bias", "User-supplied bias value"));
+               de::MovePtr<tcu::TestCaseGroup> minLodGroup3D           (new tcu::TestCaseGroup(testCtx, "min_lod", "Lod control: min lod"));
+               de::MovePtr<tcu::TestCaseGroup> maxLodGroup3D           (new tcu::TestCaseGroup(testCtx, "max_lod", "Lod control: max lod"));
+               de::MovePtr<tcu::TestCaseGroup> baseLevelGroup3D        (new tcu::TestCaseGroup(testCtx, "base_level", "Base level"));
+               de::MovePtr<tcu::TestCaseGroup> maxLevelGroup3D         (new tcu::TestCaseGroup(testCtx, "max_level", "Max level"));
+
+               for (int coordType = 0; coordType < DE_LENGTH_OF_ARRAY(coordTypes); coordType++)
+               {
+                       de::MovePtr<tcu::TestCaseGroup> coordTypeGroup  (new tcu::TestCaseGroup(testCtx, coordTypes[coordType].name, coordTypes[coordType].desc));
+
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               for (int wrapMode = 0; wrapMode < DE_LENGTH_OF_ARRAY(wrapModes); wrapMode++)
+                               {
+                                       // Add other size variants to basic cases only.
+                                       int sizeEnd = coordTypes[coordType].type == COORDTYPE_BASIC ? DE_LENGTH_OF_ARRAY(tex3DSizes) : 1;
+
+                                       Texture3DMipmapTestCaseParameters       testParameters;
+
+                                       testParameters.coordType                = coordTypes[coordType].type;
+                                       testParameters.minFilter                = minFilterModes[minFilter].mode;
+                                       testParameters.minFilterName    = minFilterModes[minFilter].name;
+                                       testParameters.wrapR                    = wrapModes[wrapMode].mode;
+                                       testParameters.wrapS                    = wrapModes[wrapMode].mode;
+                                       testParameters.wrapT                    = wrapModes[wrapMode].mode;
+                                       testParameters.format                   = VK_FORMAT_R8G8B8A8_UNORM;
+                                       testParameters.programs.push_back(PROGRAM_3D_FLOAT);
+
+                                       for (int size = 0; size < sizeEnd; size++)
+                                       {
+                                               testParameters.width                    = tex3DSizes[size].width;
+                                               testParameters.height                   = tex3DSizes[size].height;
+                                               testParameters.depth                    = tex3DSizes[size].depth;
+
+                                               std::ostringstream name;
+                                               name << minFilterModes[minFilter].name
+                                                        << "_" << wrapModes[wrapMode].name;
+
+                                               if (tex3DSizes[size].name)
+                                                       name << "_" << tex3DSizes[size].name;
+
+                                               coordTypeGroup->addChild(new TextureTestCase<Texture3DMipmapTestInstance>(testCtx, name.str().c_str(), "", testParameters));
+                                       }
+                               }
+                       }
+
+                       group3D->addChild(coordTypeGroup.release());
+               }
+
+               // 3D bias variants.
+               {
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               Texture3DMipmapTestCaseParameters       testParameters;
+                               testParameters.coordType                        = COORDTYPE_BASIC_BIAS;
+                               testParameters.minFilter                        = minFilterModes[minFilter].mode;
+                               testParameters.wrapR                            = Sampler::REPEAT_GL;
+                               testParameters.wrapS                            = Sampler::REPEAT_GL;
+                               testParameters.wrapT                            = Sampler::REPEAT_GL;
+                               testParameters.format                           = VK_FORMAT_R8G8B8A8_UNORM;
+                               testParameters.width                            = tex3DSizes[0].width;
+                               testParameters.height                           = tex3DSizes[0].height;
+                               testParameters.depth                            = tex3DSizes[0].depth;
+
+                               testParameters.programs.push_back(PROGRAM_3D_FLOAT);
+                               testParameters.programs.push_back(PROGRAM_3D_FLOAT_BIAS);
+
+                               biasGroup3D->addChild(new TextureTestCase<Texture3DMipmapTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+               }
+
+               // 3D LOD controls.
+               {
+                       // MIN_LOD
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               Texture3DMipmapTestCaseParameters       testParameters;
+                               testParameters.minFilter                        = minFilterModes[minFilter].mode;
+                               testParameters.programs.push_back(PROGRAM_3D_FLOAT);
+
+                               minLodGroup3D->addChild(new TextureTestCase<Texture3DMinLodTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+
+                       // MAX_LOD
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               Texture3DMipmapTestCaseParameters       testParameters;
+                               testParameters.minFilter                        = minFilterModes[minFilter].mode;
+                               testParameters.programs.push_back(PROGRAM_3D_FLOAT);
+
+                               maxLodGroup3D->addChild(new TextureTestCase<Texture3DMaxLodTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+               }
+
+               {
+                       // BASE_LEVEL
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               Texture3DMipmapTestCaseParameters       testParameters;
+                               testParameters.minFilter                        = minFilterModes[minFilter].mode;
+                               testParameters.minFilterName            = minFilterModes[minFilter].name;
+                               testParameters.programs.push_back(PROGRAM_3D_FLOAT);
+
+                               baseLevelGroup3D->addChild(new TextureTestCase<Texture3DBaseLevelTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+
+                       // MAX_LEVEL
+                       for (int minFilter = 0; minFilter < DE_LENGTH_OF_ARRAY(minFilterModes); minFilter++)
+                       {
+                               Texture3DMipmapTestCaseParameters       testParameters;
+                               testParameters.minFilter                        = minFilterModes[minFilter].mode;
+                               testParameters.minFilterName            = minFilterModes[minFilter].name;
+                               testParameters.programs.push_back(PROGRAM_3D_FLOAT);
+
+                               maxLevelGroup3D->addChild(new TextureTestCase<Texture3DMaxLevelTestInstance>(testCtx, minFilterModes[minFilter].name, "", testParameters));
+                       }
+               }
+
+               group3D->addChild(biasGroup3D.release());
+               group3D->addChild(minLodGroup3D.release());
+               group3D->addChild(maxLodGroup3D.release());
+               group3D->addChild(baseLevelGroup3D.release());
+               group3D->addChild(maxLevelGroup3D.release());
+
+               textureMipmappingTests->addChild(group3D.release());
+       }
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createTextureMipmappingTests (tcu::TestContext& testCtx)
+{
+       return createTestGroup(testCtx, "mipmap", "Texture mipmapping tests.", populateTextureMipmappingTests);
+}
+
+} // texture
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureMipmapTests.hpp b/external/vulkancts/modules/vulkan/texture/vktTextureMipmapTests.hpp
new file mode 100644 (file)
index 0000000..ff8dd71
--- /dev/null
@@ -0,0 +1,42 @@
+#ifndef _VKTTEXTUREMIPMAPTESTS_HPP
+#define _VKTTEXTUREMIPMAPTESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Mipmapping tests.
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+#include "vktTestCase.hpp"
+
+namespace vkt
+{
+namespace texture
+{
+
+tcu::TestCaseGroup*    createTextureMipmappingTests    (tcu::TestContext& testCtx);
+
+} // texture
+} // vkt
+
+#endif // _VKTTEXTUREMIPMAPTESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.cpp
new file mode 100644 (file)
index 0000000..bb2a83e
--- /dev/null
@@ -0,0 +1,1812 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Texture test utilities.
+ *//*--------------------------------------------------------------------*/
+
+#include "vktTextureTestUtil.hpp"
+
+#include "deFilePath.hpp"
+#include "deMath.h"
+#include "tcuCompressedTexture.hpp"
+#include "tcuImageIO.hpp"
+#include "tcuStringTemplate.hpp"
+#include "tcuTestLog.hpp"
+#include "vkBuilderUtil.hpp"
+#include "vkImageUtil.hpp"
+#include "vkPrograms.hpp"
+#include "vkQueryUtil.hpp"
+#include "vkRefUtil.hpp"
+#include "vkTypeUtil.hpp"
+#include <map>
+#include <string>
+#include <vector>
+
+using tcu::TestLog;
+
+using namespace vk;
+using namespace glu::TextureTestUtil;
+
+namespace vkt
+{
+namespace texture
+{
+namespace util
+{
+
+struct ShaderParameters {
+       float           bias;                           //!< User-supplied bias.
+       float           ref;                            //!< Reference value for shadow lookups.
+       tcu::Vec2       padding;                        //!< Shader uniform padding.
+       tcu::Vec4       colorScale;                     //!< Scale for texture color values.
+       tcu::Vec4       colorBias;                      //!< Bias for texture color values.
+};
+
+const char* getProgramName(Program program)
+{
+       switch (program)
+       {
+               case PROGRAM_2D_FLOAT:                  return "2D_FLOAT";
+               case PROGRAM_2D_INT:                    return "2D_INT";
+               case PROGRAM_2D_UINT:                   return "2D_UINT";
+               case PROGRAM_2D_SHADOW:                 return "2D_SHADOW";
+               case PROGRAM_2D_FLOAT_BIAS:             return "2D_FLOAT_BIAS";
+               case PROGRAM_2D_INT_BIAS:               return "2D_INT_BIAS";
+               case PROGRAM_2D_UINT_BIAS:              return "2D_UINT_BIAS";
+               case PROGRAM_2D_SHADOW_BIAS:    return "2D_SHADOW_BIAS";
+               case PROGRAM_1D_FLOAT:                  return "1D_FLOAT";
+               case PROGRAM_1D_INT:                    return "1D_INT";
+               case PROGRAM_1D_UINT:                   return "1D_UINT";
+               case PROGRAM_1D_SHADOW:                 return "1D_SHADOW";
+               case PROGRAM_1D_FLOAT_BIAS:             return "1D_FLOAT_BIAS";
+               case PROGRAM_1D_INT_BIAS:               return "1D_INT_BIAS";
+               case PROGRAM_1D_UINT_BIAS:              return "1D_UINT_BIAS";
+               case PROGRAM_1D_SHADOW_BIAS:    return "1D_SHADOW_BIAS";
+               case PROGRAM_CUBE_FLOAT:                return "CUBE_FLOAT";
+               case PROGRAM_CUBE_INT:                  return "CUBE_INT";
+               case PROGRAM_CUBE_UINT:                 return "CUBE_UINT";
+               case PROGRAM_CUBE_SHADOW:               return "CUBE_SHADOW";
+               case PROGRAM_CUBE_FLOAT_BIAS:   return "CUBE_FLOAT_BIAS";
+               case PROGRAM_CUBE_INT_BIAS:             return "CUBE_INT_BIAS";
+               case PROGRAM_CUBE_UINT_BIAS:    return "CUBE_UINT_BIAS";
+               case PROGRAM_CUBE_SHADOW_BIAS:  return "CUBE_SHADOW_BIAS";
+               case PROGRAM_2D_ARRAY_FLOAT:    return "2D_ARRAY_FLOAT";
+               case PROGRAM_2D_ARRAY_INT:              return "2D_ARRAY_INT";
+               case PROGRAM_2D_ARRAY_UINT:             return "2D_ARRAY_UINT";
+               case PROGRAM_2D_ARRAY_SHADOW:   return "2D_ARRAY_SHADOW";
+               case PROGRAM_3D_FLOAT:                  return "3D_FLOAT";
+               case PROGRAM_3D_INT:                    return "3D_INT";
+               case PROGRAM_3D_UINT:                   return "3D_UINT";
+               case PROGRAM_3D_FLOAT_BIAS:             return "3D_FLOAT_BIAS";
+               case PROGRAM_3D_INT_BIAS:               return "3D_INT_BIAS";
+               case PROGRAM_3D_UINT_BIAS:              return "3D_UINT_BIAS";
+               case PROGRAM_CUBE_ARRAY_FLOAT:  return "CUBE_ARRAY_FLOAT";
+               case PROGRAM_CUBE_ARRAY_INT:    return "CUBE_ARRAY_INT";
+               case PROGRAM_CUBE_ARRAY_UINT:   return "CUBE_ARRAY_UINT";
+               case PROGRAM_CUBE_ARRAY_SHADOW: return "CUBE_ARRAY_SHADOW";
+               case PROGRAM_1D_ARRAY_FLOAT:    return "1D_ARRAY_FLOAT";
+               case PROGRAM_1D_ARRAY_INT:              return "1D_ARRAY_INT";
+               case PROGRAM_1D_ARRAY_UINT:             return "1D_ARRAY_UINT";
+               case PROGRAM_1D_ARRAY_SHADOW:   return "1D_ARRAY_SHADOW";
+               case PROGRAM_BUFFER_FLOAT:              return "BUFFER_FLOAT";
+               case PROGRAM_BUFFER_INT:                return "BUFFER_INT";
+               case PROGRAM_BUFFER_UINT:               return "BUFFER_UINT";
+               default:
+                       DE_ASSERT(false);
+       }
+       return NULL;
+}
+
+VkImageViewType textureTypeToImageViewType (TextureBinding::Type type)
+{
+       switch (type)
+       {
+               case TextureBinding::TYPE_2D:                   return VK_IMAGE_VIEW_TYPE_2D;
+               case TextureBinding::TYPE_2D_ARRAY:             return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
+               case TextureBinding::TYPE_CUBE_MAP:             return VK_IMAGE_VIEW_TYPE_CUBE;
+               case TextureBinding::TYPE_3D:                   return VK_IMAGE_VIEW_TYPE_3D;
+               default:
+                       DE_ASSERT(false);
+       }
+
+       return VK_IMAGE_VIEW_TYPE_2D;
+}
+
+VkImageType imageViewTypeToImageType (VkImageViewType type)
+{
+       switch (type)
+       {
+               case VK_IMAGE_VIEW_TYPE_2D:
+               case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
+               case VK_IMAGE_VIEW_TYPE_CUBE:                   return VK_IMAGE_TYPE_2D;
+               case VK_IMAGE_VIEW_TYPE_3D:                             return VK_IMAGE_TYPE_3D;
+               default:
+                       DE_ASSERT(false);
+       }
+
+       return VK_IMAGE_TYPE_2D;
+}
+
+void initializePrograms(vk::SourceCollections& programCollection, glu::Precision texCoordPrecision, const std::vector<Program>& programs)
+{
+       static const char* vertShaderTemplate =
+               "${VTX_HEADER}"
+               "layout(location = 0) ${VTX_IN} highp vec4 a_position;\n"
+               "layout(location = 1) ${VTX_IN} ${PRECISION} ${TEXCOORD_TYPE} a_texCoord;\n"
+               "layout(location = 0) ${VTX_OUT} ${PRECISION} ${TEXCOORD_TYPE} v_texCoord;\n"
+               "${VTX_OUT} gl_PerVertex { vec4 gl_Position; };\n"
+               "\n"
+               "void main (void)\n"
+               "{\n"
+               "       gl_Position = a_position;\n"
+               "       v_texCoord = a_texCoord;\n"
+               "}\n";
+
+       static const char* fragShaderTemplate =
+               "${FRAG_HEADER}"
+               "layout(location = 0) ${FRAG_IN} ${PRECISION} ${TEXCOORD_TYPE} v_texCoord;\n"
+               "layout(location = 0) out mediump vec4 ${FRAG_COLOR};\n"
+               "layout (set=0, binding=0, std140) uniform Block \n"
+               "{\n"
+               "  ${PRECISION} float u_bias;\n"
+               "  ${PRECISION} float u_ref;\n"
+               "  ${PRECISION} vec4 u_colorScale;\n"
+               "  ${PRECISION} vec4 u_colorBias;\n"
+               "};\n\n"
+               "layout (set=1, binding=0) uniform ${PRECISION} ${SAMPLER_TYPE} u_sampler;\n"
+               "void main (void)\n"
+               "{\n"
+               "       ${FRAG_COLOR} = ${LOOKUP} * u_colorScale + u_colorBias;\n"
+               "}\n";
+
+       tcu::StringTemplate                                     vertexSource    (vertShaderTemplate);
+       tcu::StringTemplate                                     fragmentSource  (fragShaderTemplate);
+
+       for (std::vector<Program>::const_iterator programIt = programs.begin(); programIt != programs.end(); ++programIt)
+       {
+               Program                                                         program = *programIt;
+               std::map<std::string, std::string>      params;
+
+               bool    isCube          = de::inRange<int>(program, PROGRAM_CUBE_FLOAT, PROGRAM_CUBE_SHADOW_BIAS);
+               bool    isArray         = de::inRange<int>(program, PROGRAM_2D_ARRAY_FLOAT, PROGRAM_2D_ARRAY_SHADOW)
+                                                               || de::inRange<int>(program, PROGRAM_1D_ARRAY_FLOAT, PROGRAM_1D_ARRAY_SHADOW);
+
+               bool    is1D            = de::inRange<int>(program, PROGRAM_1D_FLOAT, PROGRAM_1D_SHADOW_BIAS)
+                                                               || de::inRange<int>(program, PROGRAM_1D_ARRAY_FLOAT, PROGRAM_1D_ARRAY_SHADOW)
+                                                               || de::inRange<int>(program, PROGRAM_BUFFER_FLOAT, PROGRAM_BUFFER_UINT);
+
+               bool    is2D            = de::inRange<int>(program, PROGRAM_2D_FLOAT, PROGRAM_2D_SHADOW_BIAS)
+                                                               || de::inRange<int>(program, PROGRAM_2D_ARRAY_FLOAT, PROGRAM_2D_ARRAY_SHADOW);
+
+               bool    is3D            = de::inRange<int>(program, PROGRAM_3D_FLOAT, PROGRAM_3D_UINT_BIAS);
+               bool    isCubeArray     = de::inRange<int>(program, PROGRAM_CUBE_ARRAY_FLOAT, PROGRAM_CUBE_ARRAY_SHADOW);
+
+               const std::string       version = glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450);
+
+               params["FRAG_HEADER"]   = version + "\n";
+               params["VTX_HEADER"]    = version + "\n";
+               params["VTX_IN"]                = "in";
+               params["VTX_OUT"]               = "out";
+               params["FRAG_IN"]               = "in";
+               params["FRAG_COLOR"]    = "dEQP_FragColor";
+
+               params["PRECISION"]             = glu::getPrecisionName(texCoordPrecision);
+
+               if (isCubeArray)
+                       params["TEXCOORD_TYPE"] = "vec4";
+               else if (isCube || (is2D && isArray) || is3D)
+                       params["TEXCOORD_TYPE"] = "vec3";
+               else if ((is1D && isArray) || is2D)
+                       params["TEXCOORD_TYPE"] = "vec2";
+               else if (is1D)
+                       params["TEXCOORD_TYPE"] = "float";
+               else
+                       DE_ASSERT(DE_FALSE);
+
+               const char*     sampler = DE_NULL;
+               const char*     lookup  = DE_NULL;
+
+               switch (program)
+               {
+                       case PROGRAM_2D_FLOAT:                  sampler = "sampler2D";                          lookup = "texture(u_sampler, v_texCoord)";                                                                                              break;
+                       case PROGRAM_2D_INT:                    sampler = "isampler2D";                         lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_2D_UINT:                   sampler = "usampler2D";                         lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_2D_SHADOW:                 sampler = "sampler2DShadow";            lookup = "vec4(texture(u_sampler, vec3(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";                    break;
+                       case PROGRAM_2D_FLOAT_BIAS:             sampler = "sampler2D";                          lookup = "texture(u_sampler, v_texCoord, u_bias)";                                                                              break;
+                       case PROGRAM_2D_INT_BIAS:               sampler = "isampler2D";                         lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";                                                                break;
+                       case PROGRAM_2D_UINT_BIAS:              sampler = "usampler2D";                         lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";                                                                break;
+                       case PROGRAM_2D_SHADOW_BIAS:    sampler = "sampler2DShadow";            lookup = "vec4(texture(u_sampler, vec3(v_texCoord, u_ref), u_bias), 0.0, 0.0, 1.0)";    break;
+                       case PROGRAM_1D_FLOAT:                  sampler = "sampler1D";                          lookup = "texture(u_sampler, v_texCoord)";                                                                                              break;
+                       case PROGRAM_1D_INT:                    sampler = "isampler1D";                         lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_1D_UINT:                   sampler = "usampler1D";                         lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_1D_SHADOW:                 sampler = "sampler1DShadow";            lookup = "vec4(texture(u_sampler, vec3(v_texCoord, 0.0, u_ref)), 0.0, 0.0, 1.0)";               break;
+                       case PROGRAM_1D_FLOAT_BIAS:             sampler = "sampler1D";                          lookup = "texture(u_sampler, v_texCoord, u_bias)";                                                                              break;
+                       case PROGRAM_1D_INT_BIAS:               sampler = "isampler1D";                         lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";                                                                break;
+                       case PROGRAM_1D_UINT_BIAS:              sampler = "usampler1D";                         lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";                                                                break;
+                       case PROGRAM_1D_SHADOW_BIAS:    sampler = "sampler1DShadow";            lookup = "vec4(texture(u_sampler, vec3(v_texCoord, 0.0, u_ref), u_bias), 0.0, 0.0, 1.0)";       break;
+                       case PROGRAM_CUBE_FLOAT:                sampler = "samplerCube";                        lookup = "texture(u_sampler, v_texCoord)";                                                                                              break;
+                       case PROGRAM_CUBE_INT:                  sampler = "isamplerCube";                       lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_CUBE_UINT:                 sampler = "usamplerCube";                       lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_CUBE_SHADOW:               sampler = "samplerCubeShadow";          lookup = "vec4(texture(u_sampler, vec4(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";                    break;
+                       case PROGRAM_CUBE_FLOAT_BIAS:   sampler = "samplerCube";                        lookup = "texture(u_sampler, v_texCoord, u_bias)";                                                                              break;
+                       case PROGRAM_CUBE_INT_BIAS:             sampler = "isamplerCube";                       lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";                                                                break;
+                       case PROGRAM_CUBE_UINT_BIAS:    sampler = "usamplerCube";                       lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";                                                                break;
+                       case PROGRAM_CUBE_SHADOW_BIAS:  sampler = "samplerCubeShadow";          lookup = "vec4(texture(u_sampler, vec4(v_texCoord, u_ref), u_bias), 0.0, 0.0, 1.0)";    break;
+                       case PROGRAM_2D_ARRAY_FLOAT:    sampler = "sampler2DArray";                     lookup = "texture(u_sampler, v_texCoord)";                                                                                              break;
+                       case PROGRAM_2D_ARRAY_INT:              sampler = "isampler2DArray";            lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_2D_ARRAY_UINT:             sampler = "usampler2DArray";            lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_2D_ARRAY_SHADOW:   sampler = "sampler2DArrayShadow";       lookup = "vec4(texture(u_sampler, vec4(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";                    break;
+                       case PROGRAM_3D_FLOAT:                  sampler = "sampler3D";                          lookup = "texture(u_sampler, v_texCoord)";                                                                                              break;
+                       case PROGRAM_3D_INT:                    sampler = "isampler3D";                         lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_3D_UINT:                   sampler = "usampler3D";                         lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_3D_FLOAT_BIAS:             sampler = "sampler3D";                          lookup = "texture(u_sampler, v_texCoord, u_bias)";                                                                              break;
+                       case PROGRAM_3D_INT_BIAS:               sampler = "isampler3D";                         lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";                                                                break;
+                       case PROGRAM_3D_UINT_BIAS:              sampler = "usampler3D";                         lookup = "vec4(texture(u_sampler, v_texCoord, u_bias))";                                                                break;
+                       case PROGRAM_CUBE_ARRAY_FLOAT:  sampler = "samplerCubeArray";           lookup = "texture(u_sampler, v_texCoord)";                                                                                              break;
+                       case PROGRAM_CUBE_ARRAY_INT:    sampler = "isamplerCubeArray";          lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_CUBE_ARRAY_UINT:   sampler = "usamplerCubeArray";          lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_CUBE_ARRAY_SHADOW: sampler = "samplerCubeArrayShadow";     lookup = "vec4(texture(u_sampler, v_texCoord, u_ref), 0.0, 0.0, 1.0)";                  break;
+                       case PROGRAM_1D_ARRAY_FLOAT:    sampler = "sampler1DArray";                     lookup = "texture(u_sampler, v_texCoord)";                                                                                              break;
+                       case PROGRAM_1D_ARRAY_INT:              sampler = "isampler1DArray";            lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_1D_ARRAY_UINT:             sampler = "usampler1DArray";            lookup = "vec4(texture(u_sampler, v_texCoord))";                                                                                break;
+                       case PROGRAM_1D_ARRAY_SHADOW:   sampler = "sampler1DArrayShadow";       lookup = "vec4(texture(u_sampler, vec3(v_texCoord, u_ref)), 0.0, 0.0, 1.0)";                    break;
+                       case PROGRAM_BUFFER_FLOAT:              sampler = "samplerBuffer";                      lookup = "texelFetch(u_sampler, int(v_texCoord))";                                                                              break;
+                       case PROGRAM_BUFFER_INT:                sampler = "isamplerBuffer";                     lookup = "vec4(texelFetch(u_sampler, int(v_texCoord)))";                                                                break;
+                       case PROGRAM_BUFFER_UINT:               sampler = "usamplerBuffer";                     lookup = "vec4(texelFetch(u_sampler, int(v_texCoord)))";                                                                break;
+                       default:
+                               DE_ASSERT(false);
+               }
+
+               params["SAMPLER_TYPE"]  = sampler;
+               params["LOOKUP"]                = lookup;
+
+               programCollection.glslSources.add("vertext_" + std::string(getProgramName(program))) << glu::VertexSource(vertexSource.specialize(params));
+               programCollection.glslSources.add("fragment_" + std::string(getProgramName(program))) << glu::FragmentSource(fragmentSource.specialize(params));
+       }
+}
+
+TextureBinding::TextureBinding (Context& context)
+       : m_context                     (context)
+{
+}
+
+TextureBinding::TextureBinding (Context& context, const TestTextureSp& textureData, const TextureBinding::Type type)
+       : m_context                     (context)
+       , m_type                        (type)
+       , m_textureData         (textureData)
+{
+       updateTextureData(m_textureData, m_type);
+}
+
+void TextureBinding::updateTextureData (const TestTextureSp& textureData, const TextureBinding::Type textureType)
+{
+       const DeviceInterface&                                          vkd                                             = m_context.getDeviceInterface();
+       const VkDevice                                                          vkDevice                                = m_context.getDevice();
+       const VkQueue                                                           queue                                   = m_context.getUniversalQueue();
+       const deUint32                                                          queueFamilyIndex                = m_context.getUniversalQueueFamilyIndex();
+       Allocator&                                                                      allocator                               = m_context.getDefaultAllocator();
+
+       m_type                  = textureType;
+       m_textureData   = textureData;
+
+       const bool                                                                      isCube                                  = m_type == TYPE_CUBE_MAP;
+       const VkImageCreateFlags                                        imageCreateFlags                = isCube ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT : 0;
+       const VkImageViewType                                           imageViewType                   = textureTypeToImageViewType(textureType);
+       const VkImageType                                                       imageType                               = imageViewTypeToImageType(imageViewType);
+       const VkImageTiling                                                     imageTiling                             = VK_IMAGE_TILING_OPTIMAL;
+       const VkImageUsageFlags                                         imageUsageFlags                 = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+       const VkFormat                                                          format                                  = mapTextureFormat(textureData->getTextureFormat());
+       const tcu::UVec3                                                        textureDimension                = textureData->getTextureDimension();
+       const deUint32                                                          mipLevels                               = textureData->getNumLevels();
+       const deUint32                                                          arraySize                               = textureData->getArraySize();
+       vk::VkImageFormatProperties                                     imageFormatProperties;
+       const VkResult                                                          imageFormatQueryResult  = m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(m_context.getPhysicalDevice(), format, imageType, imageTiling, imageUsageFlags, imageCreateFlags, &imageFormatProperties);
+
+       if (imageFormatQueryResult == VK_ERROR_FORMAT_NOT_SUPPORTED)
+       {
+               TCU_THROW(NotSupportedError, (std::string("Format not supported: ") + vk::getFormatName(format)).c_str());
+       }
+       else
+               VK_CHECK(imageFormatQueryResult);
+
+       if (imageFormatProperties.maxArrayLayers < arraySize)
+               TCU_THROW(NotSupportedError, ("Maximum array layers number for this format is not enough for this test."));
+
+       if (imageFormatProperties.maxMipLevels < mipLevels)
+               TCU_THROW(NotSupportedError, ("Maximum mimap level number for this format is not enough for this test."));
+
+       if (imageFormatProperties.maxExtent.width < textureDimension.x() ||
+               imageFormatProperties.maxExtent.height < textureDimension.y() ||
+               imageFormatProperties.maxExtent.depth < textureDimension.z())
+       {
+               TCU_THROW(NotSupportedError, ("Maximum image dimension for this format is not enough for this test."));
+       }
+
+       // Create image
+       const VkImageCreateInfo                                         imageParams                             =
+       {
+               VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,                                                    // VkStructureType                      sType;
+               DE_NULL,                                                                                                                // const void*                          pNext;
+               imageCreateFlags,                                                                                               // VkImageCreateFlags           flags;
+               imageType,                                                                                                              // VkImageType                          imageType;
+               format,                                                                                                                 // VkFormat                                     format;
+               {                                                                                                                               // VkExtent3D                           extent;
+                       (deUint32)textureDimension.x(),
+                       (deUint32)textureDimension.y(),
+                       (deUint32)textureDimension.z()
+               },
+               mipLevels,                                                                                                              // deUint32                                     mipLevels;
+               arraySize,                                                                                                              // deUint32                                     arrayLayers;
+               VK_SAMPLE_COUNT_1_BIT,                                                                                  // VkSampleCountFlagBits        samples;
+               imageTiling,                                                                                                    // VkImageTiling                        tiling;
+               imageUsageFlags,                                                                                                // VkImageUsageFlags            usage;
+               VK_SHARING_MODE_EXCLUSIVE,                                                                              // VkSharingMode                        sharingMode;
+               1u,                                                                                                                             // deUint32                                     queueFamilyIndexCount;
+               &queueFamilyIndex,                                                                                              // const deUint32*                      pQueueFamilyIndices;
+               VK_IMAGE_LAYOUT_UNDEFINED                                                                               // VkImageLayout                        initialLayout;
+       };
+
+       m_textureImage                  = createImage(vkd, vkDevice, &imageParams);
+       m_textureImageMemory    = allocator.allocate(getImageMemoryRequirements(vkd, vkDevice, *m_textureImage), MemoryRequirement::Any);
+       VK_CHECK(vkd.bindImageMemory(vkDevice, *m_textureImage, m_textureImageMemory->getMemory(), m_textureImageMemory->getOffset()));
+
+       updateTextureViewMipLevels(0, mipLevels - 1);
+
+       pipeline::uploadTestTexture(vkd, vkDevice, queue, queueFamilyIndex, allocator, *m_textureData, *m_textureImage);
+}
+
+void TextureBinding::updateTextureViewMipLevels (deUint32 baseLevel, deUint32 maxLevel)
+{
+       const DeviceInterface&                                          vkd                                             = m_context.getDeviceInterface();
+       const VkDevice                                                          vkDevice                                = m_context.getDevice();
+       const vk::VkImageViewType                                       imageViewType                   = textureTypeToImageViewType(m_type);
+       const vk::VkFormat                                                      format                                  = mapTextureFormat(m_textureData->getTextureFormat());
+       const bool                                                                      isShadowTexture                 = tcu::hasDepthComponent(m_textureData->getTextureFormat().order);
+       const VkImageAspectFlags                                        aspectMask                              = isShadowTexture ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT;
+       const deUint32                                                          layerCount                              = m_textureData->getArraySize();
+       const vk::VkImageViewCreateInfo                         viewParams                              =
+       {
+               vk::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,   // VkStructureType                      sType;
+               NULL,                                                                                   // const voide*                         pNext;
+               0u,                                                                                             // VkImageViewCreateFlags       flags;
+               *m_textureImage,                                                                // VkImage                                      image;
+               imageViewType,                                                                  // VkImageViewType                      viewType;
+               format,                                                                                 // VkFormat                                     format;
+               makeComponentMappingRGBA(),                                             // VkComponentMapping           components;
+               {
+                       aspectMask,                                                                     // VkImageAspectFlags   aspectMask;
+                       baseLevel,                                                                      // deUint32                             baseMipLevel;
+                       maxLevel-baseLevel+1,                                           // deUint32                             levelCount;
+                       0,                                                                                      // deUint32                             baseArrayLayer;
+                       layerCount                                                                      // deUint32                             layerCount;
+               },                                                                                              // VkImageSubresourceRange      subresourceRange;
+       };
+
+       m_textureImageView              = createImageView(vkd, vkDevice, &viewParams);
+}
+
+const deUint16         TextureRenderer::s_vertexIndices[6] = { 0, 1, 2, 2, 1, 3 };
+const VkDeviceSize     TextureRenderer::s_vertexIndexBufferSize = sizeof(TextureRenderer::s_vertexIndices);
+
+TextureRenderer::TextureRenderer (Context& context, VkSampleCountFlagBits sampleCount, deUint32 renderWidth, deUint32 renderHeight)
+       : m_context                                     (context)
+       , m_log                                         (context.getTestContext().getLog())
+       , m_renderWidth                         (renderWidth)
+       , m_renderHeight                        (renderHeight)
+       , m_sampleCount                         (sampleCount)
+       , m_multisampling                       (m_sampleCount != VK_SAMPLE_COUNT_1_BIT)
+       , m_imageFormat                         (VK_FORMAT_R8G8B8A8_UNORM)
+       , m_textureFormat                       (vk::mapVkFormat(m_imageFormat))
+       , m_uniformBufferSize           (sizeof(ShaderParameters))
+       , m_resultBufferSize            (renderWidth * renderHeight * m_textureFormat.getPixelSize())
+       , m_viewportOffsetX                     (0.0f)
+       , m_viewportOffsetY                     (0.0f)
+       , m_viewportWidth                       ((float)renderWidth)
+       , m_viewportHeight                      ((float)renderHeight)
+{
+       const DeviceInterface&                                          vkd                                             = m_context.getDeviceInterface();
+       const VkDevice                                                          vkDevice                                = m_context.getDevice();
+       const deUint32                                                          queueFamilyIndex                = m_context.getUniversalQueueFamilyIndex();
+       Allocator&                                                                      allocator                               = m_context.getDefaultAllocator();
+
+       // Command Pool
+       {
+               const VkCommandPoolCreateInfo                   cmdPoolCreateInfo               =
+               {
+                       VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,                                     // VkStructureType             sType;
+                       DE_NULL,                                                                                                        // const void*                 pNext;
+                       VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,                        // VkCommandPoolCreateFlags    flags;
+                       queueFamilyIndex                                                                                        // deUint32                    queueFamilyIndex;
+               };
+
+               m_commandPool = createCommandPool(vkd, vkDevice, &cmdPoolCreateInfo, DE_NULL);
+       }
+
+       // Image
+       {
+               const VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+               VkImageFormatProperties properties;
+
+               if ((m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(m_context.getPhysicalDevice(),
+                                                                                                                                                                        m_imageFormat,
+                                                                                                                                                                        VK_IMAGE_TYPE_2D,
+                                                                                                                                                                        VK_IMAGE_TILING_OPTIMAL,
+                                                                                                                                                                        imageUsage,
+                                                                                                                                                                        0,
+                                                                                                                                                                        &properties) == VK_ERROR_FORMAT_NOT_SUPPORTED))
+               {
+                       TCU_THROW(NotSupportedError, "Format not supported");
+               }
+
+               if ((properties.sampleCounts & m_sampleCount) != m_sampleCount)
+               {
+                       TCU_THROW(NotSupportedError, "Format not supported");
+               }
+
+               const VkImageCreateInfo                                 imageCreateInfo                 =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,            // VkStructureType                      sType;
+                       DE_NULL,                                                                        // const void*                          pNext;
+                       0u,                                                                                     // VkImageCreateFlags           flags;
+                       VK_IMAGE_TYPE_2D,                                                       // VkImageType                          imageType;
+                       m_imageFormat,                                                          // VkFormat                                     format;
+                       { m_renderWidth, m_renderHeight, 1u },          // VkExtent3D                           extent;
+                       1u,                                                                                     // deUint32                                     mipLevels;
+                       1u,                                                                                     // deUint32                                     arrayLayers;
+                       m_sampleCount,                                                          // VkSampleCountFlagBits        samples;
+                       VK_IMAGE_TILING_OPTIMAL,                                        // VkImageTiling                        tiling;
+                       imageUsage,                                                                     // VkImageUsageFlags            usage;
+                       VK_SHARING_MODE_EXCLUSIVE,                                      // VkSharingMode                        sharingMode;
+                       1u,                                                                                     // deUint32                                     queueFamilyIndexCount;
+                       &queueFamilyIndex,                                                      // const deUint32*                      pQueueFamilyIndices;
+                       VK_IMAGE_LAYOUT_UNDEFINED                                       // VkImageLayout                        initialLayout;
+               };
+
+               m_image = vk::createImage(vkd, vkDevice, &imageCreateInfo, DE_NULL);
+
+               m_imageMemory   = allocator.allocate(getImageMemoryRequirements(vkd, vkDevice, *m_image), MemoryRequirement::Any);
+               VK_CHECK(vkd.bindImageMemory(vkDevice, *m_image, m_imageMemory->getMemory(), m_imageMemory->getOffset()));
+       }
+
+       // Image View
+       {
+               const VkImageViewCreateInfo                             imageViewCreateInfo             =
+               {
+                       VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,       // VkStructureType                              sType;
+                       DE_NULL,                                                                        // const void*                                  pNext;
+                       0u,                                                                                     // VkImageViewCreateFlags               flags;
+                       *m_image,                                                                       // VkImage                                              image;
+                       VK_IMAGE_VIEW_TYPE_2D,                                          // VkImageViewType                              viewType;
+                       m_imageFormat,                                                          // VkFormat                                             format;
+                       makeComponentMappingRGBA(),                                     // VkComponentMapping                   components;
+                       {
+                               VK_IMAGE_ASPECT_COLOR_BIT,                                      // VkImageAspectFlags                   aspectMask;
+                               0u,                                                                                     // deUint32                                             baseMipLevel;
+                               1u,                                                                                     // deUint32                                             mipLevels;
+                               0u,                                                                                     // deUint32                                             baseArrayLayer;
+                               1u,                                                                                     // deUint32                                             arraySize;
+                       },                                                                                      // VkImageSubresourceRange              subresourceRange;
+               };
+
+               m_imageView = vk::createImageView(vkd, vkDevice, &imageViewCreateInfo, DE_NULL);
+       }
+
+       if (m_multisampling)
+       {
+               {
+                       // Resolved Image
+                       const VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+                       VkImageFormatProperties properties;
+
+                       if ((m_context.getInstanceInterface().getPhysicalDeviceImageFormatProperties(m_context.getPhysicalDevice(),
+                                                                                                                                                                                m_imageFormat,
+                                                                                                                                                                                VK_IMAGE_TYPE_2D,
+                                                                                                                                                                                VK_IMAGE_TILING_OPTIMAL,
+                                                                                                                                                                                imageUsage,
+                                                                                                                                                                                0,
+                                                                                                                                                                                &properties) == VK_ERROR_FORMAT_NOT_SUPPORTED))
+                       {
+                               TCU_THROW(NotSupportedError, "Format not supported");
+                       }
+
+                       const VkImageCreateInfo                                 imageCreateInfo                 =
+                       {
+                               VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,            // VkStructureType                      sType;
+                               DE_NULL,                                                                        // const void*                          pNext;
+                               0u,                                                                                     // VkImageCreateFlags           flags;
+                               VK_IMAGE_TYPE_2D,                                                       // VkImageType                          imageType;
+                               m_imageFormat,                                                          // VkFormat                                     format;
+                               { m_renderWidth, m_renderHeight, 1u },          // VkExtent3D                           extent;
+                               1u,                                                                                     // deUint32                                     mipLevels;
+                               1u,                                                                                     // deUint32                                     arrayLayers;
+                               VK_SAMPLE_COUNT_1_BIT,                                          // VkSampleCountFlagBits        samples;
+                               VK_IMAGE_TILING_OPTIMAL,                                        // VkImageTiling                        tiling;
+                               imageUsage,                                                                     // VkImageUsageFlags            usage;
+                               VK_SHARING_MODE_EXCLUSIVE,                                      // VkSharingMode                        sharingMode;
+                               1u,                                                                                     // deUint32                                     queueFamilyIndexCount;
+                               &queueFamilyIndex,                                                      // const deUint32*                      pQueueFamilyIndices;
+                               VK_IMAGE_LAYOUT_UNDEFINED                                       // VkImageLayout                        initialLayout;
+                       };
+
+                       m_resolvedImage                 = vk::createImage(vkd, vkDevice, &imageCreateInfo, DE_NULL);
+                       m_resolvedImageMemory   = allocator.allocate(getImageMemoryRequirements(vkd, vkDevice, *m_resolvedImage), MemoryRequirement::Any);
+                       VK_CHECK(vkd.bindImageMemory(vkDevice, *m_resolvedImage, m_resolvedImageMemory->getMemory(), m_resolvedImageMemory->getOffset()));
+               }
+
+               // Resolved Image View
+               {
+                       const VkImageViewCreateInfo                             imageViewCreateInfo             =
+                       {
+                               VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,       // VkStructureType                              sType;
+                               DE_NULL,                                                                        // const void*                                  pNext;
+                               0u,                                                                                     // VkImageViewCreateFlags               flags;
+                               *m_resolvedImage,                                                       // VkImage                                              image;
+                               VK_IMAGE_VIEW_TYPE_2D,                                          // VkImageViewType                              viewType;
+                               m_imageFormat,                                                          // VkFormat                                             format;
+                               makeComponentMappingRGBA(),                                     // VkComponentMapping                   components;
+                               {
+                                       VK_IMAGE_ASPECT_COLOR_BIT,                                      // VkImageAspectFlags                   aspectMask;
+                                       0u,                                                                                     // deUint32                                             baseMipLevel;
+                                       1u,                                                                                     // deUint32                                             mipLevels;
+                                       0u,                                                                                     // deUint32                                             baseArrayLayer;
+                                       1u,                                                                                     // deUint32                                             arraySize;
+                               },                                                                                      // VkImageSubresourceRange              subresourceRange;
+                       };
+
+                       m_resolvedImageView = vk::createImageView(vkd, vkDevice, &imageViewCreateInfo, DE_NULL);
+               }
+       }
+
+       // Render Pass
+       {
+               const VkImageLayout                                             imageLayout                             = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+               const VkAttachmentDescription                   attachmentDesc[]                =
+               {
+                       {
+                               0u,                                                                                                     // VkAttachmentDescriptionFlags         flags;
+                               m_imageFormat,                                                                          // VkFormat                                                     format;
+                               m_sampleCount,                                                                          // VkSampleCountFlagBits                        samples;
+                               VK_ATTACHMENT_LOAD_OP_LOAD,                                                                                             // VkAttachmentLoadOp                           loadOp;
+                               VK_ATTACHMENT_STORE_OP_STORE,                                           // VkAttachmentStoreOp                          storeOp;
+                               VK_ATTACHMENT_LOAD_OP_DONT_CARE,                                        // VkAttachmentLoadOp                           stencilLoadOp;
+                               VK_ATTACHMENT_STORE_OP_DONT_CARE,                                       // VkAttachmentStoreOp                          stencilStoreOp;
+                               imageLayout,                                                                            // VkImageLayout                                        initialLayout;
+                               imageLayout,                                                                            // VkImageLayout                                        finalLayout;
+                       },
+                       {
+                               0u,                                                                                                     // VkAttachmentDescriptionFlags         flags;
+                               m_imageFormat,                                                                          // VkFormat                                                     format;
+                               VK_SAMPLE_COUNT_1_BIT,                                                          // VkSampleCountFlagBits                        samples;
+                               VK_ATTACHMENT_LOAD_OP_DONT_CARE,                                        // VkAttachmentLoadOp                           loadOp;
+                               VK_ATTACHMENT_STORE_OP_STORE,                                           // VkAttachmentStoreOp                          storeOp;
+                               VK_ATTACHMENT_LOAD_OP_DONT_CARE,                                        // VkAttachmentLoadOp                           stencilLoadOp;
+                               VK_ATTACHMENT_STORE_OP_DONT_CARE,                                       // VkAttachmentStoreOp                          stencilStoreOp;
+                               imageLayout,                                                                            // VkImageLayout                                        initialLayout;
+                               imageLayout,                                                                            // VkImageLayout                                        finalLayout;
+                       }
+               };
+
+               const VkAttachmentReference                             attachmentRef                   =
+               {
+                       0u,                                                                                                     // deUint32                                                     attachment;
+                       imageLayout,                                                                            // VkImageLayout                                        layout;
+               };
+
+               const VkAttachmentReference                             resolveAttachmentRef    =
+               {
+                       1u,                                                                                                     // deUint32                                                     attachment;
+                       imageLayout,                                                                            // VkImageLayout                                        layout;
+               };
+
+               const VkSubpassDescription                              subpassDesc                             =
+               {
+                       0u,                                                                                                     // VkSubpassDescriptionFlags            flags;
+                       VK_PIPELINE_BIND_POINT_GRAPHICS,                                        // VkPipelineBindPoint                          pipelineBindPoint;
+                       0u,                                                                                                     // deUint32                                                     inputAttachmentCount;
+                       DE_NULL,                                                                                        // const VkAttachmentReference*         pInputAttachments;
+                       1u,                                                                                                     // deUint32                                                     colorAttachmentCount;
+                       &attachmentRef,                                                                         // const VkAttachmentReference*         pColorAttachments;
+                       m_multisampling ? &resolveAttachmentRef : DE_NULL,      // const VkAttachmentReference*         pResolveAttachments;
+                       DE_NULL,                                                                                        // const VkAttachmentReference*         pDepthStencilAttachment;
+                       0u,                                                                                                     // deUint32                                                     preserveAttachmentCount;
+                       DE_NULL,                                                                                        // const VkAttachmentReference*         pPreserveAttachments;
+               };
+
+               const VkRenderPassCreateInfo                    renderPassCreateInfo    =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,                      // VkStructureType                                      sType;
+                       DE_NULL,                                                                                        // const void*                                          pNext;
+                       0u,                                                                                                     // VkRenderPassCreateFlags                      flags;
+                       m_multisampling ? 2u : 1u,                                                      // deUint32                                                     attachmentCount;
+                       attachmentDesc,                                                                         // const VkAttachmentDescription*       pAttachments;
+                       1u,                                                                                                     // deUint32                                                     subpassCount;
+                       &subpassDesc,                                                                           // const VkSubpassDescription*          pSubpasses;
+                       0u,                                                                                                     // deUint32                                                     dependencyCount;
+                       DE_NULL,                                                                                        // const VkSubpassDependency*           pDependencies;
+               };
+
+               m_renderPass =  createRenderPass(vkd, vkDevice, &renderPassCreateInfo, DE_NULL);
+       }
+
+       // Vertex index buffer
+       {
+               const VkBufferCreateInfo                        indexBufferParams               =
+               {
+                       VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,           // VkStructureType              sType;
+                       DE_NULL,                                                                        // const void*                  pNext;
+                       0u,                                                                                     // VkBufferCreateFlags  flags;
+                       s_vertexIndexBufferSize,                                        // VkDeviceSize                 size;
+                       VK_BUFFER_USAGE_INDEX_BUFFER_BIT,                       // VkBufferUsageFlags   usage;
+                       VK_SHARING_MODE_EXCLUSIVE,                                      // VkSharingMode                sharingMode;
+                       1u,                                                                                     // deUint32                             queueFamilyCount;
+                       &queueFamilyIndex                                                       // const deUint32*              pQueueFamilyIndices;
+               };
+
+               m_vertexIndexBuffer                     = createBuffer(vkd, vkDevice, &indexBufferParams);
+               m_vertexIndexBufferMemory       = allocator.allocate(getBufferMemoryRequirements(vkd, vkDevice, *m_vertexIndexBuffer), MemoryRequirement::HostVisible);
+
+               VK_CHECK(vkd.bindBufferMemory(vkDevice, *m_vertexIndexBuffer, m_vertexIndexBufferMemory->getMemory(), m_vertexIndexBufferMemory->getOffset()));
+
+               // Load vertices into vertex buffer
+               deMemcpy(m_vertexIndexBufferMemory->getHostPtr(), s_vertexIndices, s_vertexIndexBufferSize);
+               flushMappedMemoryRange(vkd, vkDevice, m_vertexIndexBufferMemory->getMemory(), m_vertexIndexBufferMemory->getOffset(), s_vertexIndexBufferSize);
+       }
+
+       // FrameBuffer
+       {
+               const VkImageView                                               attachments[]                   =
+               {
+                       *m_imageView,
+                       *m_resolvedImageView,
+               };
+
+               const VkFramebufferCreateInfo                   framebufferCreateInfo   =
+               {
+                       VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,      // VkStructureType                      sType;
+                       DE_NULL,                                                                        // const void*                          pNext;
+                       0u,                                                                                     // VkFramebufferCreateFlags     flags;
+                       *m_renderPass,                                                          // VkRenderPass                         renderPass;
+                       m_multisampling ? 2u : 1u,                                      // deUint32                                     attachmentCount;
+                       attachments,                                                            // const VkImageView*           pAttachments;
+                       m_renderWidth,                                                          // deUint32                                     width;
+                       m_renderHeight,                                                         // deUint32                                     height;
+                       1u,                                                                                     // deUint32                                     layers;
+               };
+
+               m_frameBuffer = createFramebuffer(vkd, vkDevice, &framebufferCreateInfo, DE_NULL);
+       }
+
+       // Uniform Buffer
+       {
+               const VkBufferCreateInfo                                bufferCreateInfo                =
+               {
+                       VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,           // VkStructureType              sType;
+                       DE_NULL,                                                                        // const void*                  pNext;
+                       0u,                                                                                     // VkBufferCreateFlags  flags;
+                       m_uniformBufferSize,                                            // VkDeviceSize                 size;
+                       VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,                     // VkBufferUsageFlags   usage;
+                       VK_SHARING_MODE_EXCLUSIVE,                                      // VkSharingMode                sharingMode;
+                       1u,                                                                                     // deUint32                             queueFamilyIndexCount;
+                       &queueFamilyIndex                                                       // const deUint32*              pQueueFamilyIndices;
+               };
+
+               m_uniformBuffer                 = createBuffer(vkd, vkDevice, &bufferCreateInfo);
+               m_uniformBufferMemory   = allocator.allocate(getBufferMemoryRequirements(vkd, vkDevice, *m_uniformBuffer), MemoryRequirement::HostVisible);
+
+               VK_CHECK(vkd.bindBufferMemory(vkDevice, *m_uniformBuffer, m_uniformBufferMemory->getMemory(), m_uniformBufferMemory->getOffset()));
+       }
+
+       // DescriptorPool
+       {
+               DescriptorPoolBuilder                                   descriptorPoolBuilder;
+
+               descriptorPoolBuilder.addType(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
+               descriptorPoolBuilder.addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
+               m_descriptorPool = descriptorPoolBuilder.build(vkd, vkDevice, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 2u);
+       }
+
+       // Fence
+       {
+               const VkFenceCreateInfo                                 fenceParams                                     =
+               {
+                       VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,    // VkStructureType              sType;
+                       DE_NULL,                                                                // const void*                  pNext;
+                       VK_FENCE_CREATE_SIGNALED_BIT                    // VkFenceCreateFlags   flags;
+               };
+
+               m_fence = createFence(vkd, vkDevice, &fenceParams);
+       }
+
+       // Result Buffer
+       {
+               const VkBufferCreateInfo                                bufferCreateInfo                =
+               {
+                       VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,           // VkStructureType              sType;
+                       DE_NULL,                                                                        // const void*                  pNext;
+                       0u,                                                                                     // VkBufferCreateFlags  flags;
+                       m_resultBufferSize,                                                     // VkDeviceSize                 size;
+                       VK_BUFFER_USAGE_TRANSFER_DST_BIT,                       // VkBufferUsageFlags   usage;
+                       VK_SHARING_MODE_EXCLUSIVE,                                      // VkSharingMode                sharingMode;
+                       1u,                                                                                     // deUint32                             queueFamilyIndexCount;
+                       &queueFamilyIndex                                                       // const deUint32*              pQueueFamilyIndices;
+               };
+
+               m_resultBuffer                  = createBuffer(vkd, vkDevice, &bufferCreateInfo);
+               m_resultBufferMemory    = allocator.allocate(getBufferMemoryRequirements(vkd, vkDevice, *m_resultBuffer), MemoryRequirement::HostVisible);
+
+               VK_CHECK(vkd.bindBufferMemory(vkDevice, *m_resultBuffer, m_resultBufferMemory->getMemory(), m_resultBufferMemory->getOffset()));
+       }
+
+       clearImage(*m_image);
+       if(m_multisampling)
+               clearImage(*m_resolvedImage);
+}
+
+TextureRenderer::~TextureRenderer (void)
+{
+}
+
+void TextureRenderer::clearImage(VkImage image)
+{
+       const DeviceInterface&                  vkd                                     = m_context.getDeviceInterface();
+       const VkDevice                                  vkDevice                        = m_context.getDevice();
+       Move<VkCommandBuffer>                   commandBuffer;
+       const VkQueue                                   queue                           = m_context.getUniversalQueue();
+
+       const VkImageSubresourceRange   subResourcerange        =
+       {
+               VK_IMAGE_ASPECT_COLOR_BIT,              // VkImageAspectFlags   aspectMask;
+               0,                                                              // deUint32                             baseMipLevel;
+               1,                                                              // deUint32                             levelCount;
+               0,                                                              // deUint32                             baseArrayLayer;
+               1                                                               // deUint32                             layerCount;
+       };
+
+       const VkCommandBufferAllocateInfo               cmdBufferAllocateInfo   =
+       {
+               VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,                         // VkStructureType             sType;
+               DE_NULL,                                                                                                        // const void*                 pNext;
+               *m_commandPool,                                                                                         // VkCommandPool               commandPool;
+               VK_COMMAND_BUFFER_LEVEL_PRIMARY,                                                        // VkCommandBufferLevel        level;
+               1                                                                                                                       // deUint32                    commandBufferCount;
+       };
+
+       commandBuffer = allocateCommandBuffer(vkd, vkDevice, &cmdBufferAllocateInfo);
+
+       const VkCommandBufferBeginInfo          cmdBufferBeginInfo              =
+       {
+               VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,    // VkStructureType                                                      sType;
+               DE_NULL,                                                                                // const void*                                                          pNext;
+               0u,                                                                                             // VkCmdBufferOptimizeFlags                                     flags;
+               DE_NULL                                                                                 // const VkCommandBufferInheritanceInfo*        pInheritanceInfo;
+       };
+
+       VK_CHECK(vkd.beginCommandBuffer(*commandBuffer, &cmdBufferBeginInfo));
+
+       addImageTransitionBarrier(*commandBuffer, image,
+                                                         VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,                            // VkPipelineStageFlags         srcStageMask
+                                                         VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,                           // VkPipelineStageFlags         dstStageMask
+                                                         0,                                                                                            // VkAccessFlags                        srcAccessMask
+                                                         VK_ACCESS_TRANSFER_WRITE_BIT,                                         // VkAccessFlags                        dstAccessMask
+                                                         VK_IMAGE_LAYOUT_UNDEFINED,                                            // VkImageLayout                        oldLayout;
+                                                         VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);                        // VkImageLayout                        newLayout;
+
+       VkClearColorValue color = makeClearValueColorF32(0.0f, 0.0f, 0.0f, 1.0f).color;
+       vkd.cmdClearColorImage(*commandBuffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &color, 1, &subResourcerange);
+
+       addImageTransitionBarrier(*commandBuffer, image,
+                                                         VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,                            // VkPipelineStageFlags         srcStageMask
+                                                         VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,                           // VkPipelineStageFlags         dstStageMask
+                                                         VK_ACCESS_TRANSFER_WRITE_BIT,                                         // VkAccessFlags                        srcAccessMask
+                                                         VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                         // VkAccessFlags                        dstAccessMask
+                                                         VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,                         // VkImageLayout                        oldLayout;
+                                                         VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);            // VkImageLayout                        newLayout;
+
+       VK_CHECK(vkd.endCommandBuffer(*commandBuffer));
+
+       const VkSubmitInfo                                      submitInfo                              =
+       {
+               VK_STRUCTURE_TYPE_SUBMIT_INFO,                  // VkStructureType                              sType;
+               DE_NULL,                                                                // const void*                                  pNext;
+               0u,                                                                             // deUint32                                             waitSemaphoreCount;
+               DE_NULL,                                                                // const VkSemaphore*                   pWaitSemaphores;
+               DE_NULL,                                                                // const VkPipelineStageFlags*  pWaitDstStageMask;
+               1u,                                                                             // deUint32                                             commandBufferCount;
+               &commandBuffer.get(),                                   // const VkCommandBuffer*               pCommandBuffers;
+               0u,                                                                             // deUint32                                             signalSemaphoreCount;
+               DE_NULL,                                                                // const VkSemaphore*                   pSignalSemaphores;
+       };
+
+       VK_CHECK(vkd.resetFences(vkDevice, 1, &m_fence.get()));
+       VK_CHECK(vkd.queueSubmit(queue, 1, &submitInfo, *m_fence));
+       VK_CHECK(vkd.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
+}
+
+void TextureRenderer::add2DTexture (const TestTexture2DSp& texture)
+{
+       m_textureBindings.push_back(TextureBindingSp(new TextureBinding(m_context, texture, TextureBinding::TYPE_2D)));
+}
+
+void TextureRenderer::addCubeTexture (const TestTextureCubeSp& texture)
+{
+       m_textureBindings.push_back(TextureBindingSp(new TextureBinding(m_context, texture, TextureBinding::TYPE_CUBE_MAP)));
+}
+
+void TextureRenderer::add2DArrayTexture (const TestTexture2DArraySp& texture)
+{
+       m_textureBindings.push_back(TextureBindingSp(new TextureBinding(m_context, texture, TextureBinding::TYPE_2D_ARRAY)));
+}
+
+void TextureRenderer::add3DTexture (const TestTexture3DSp& texture)
+{
+       m_textureBindings.push_back(TextureBindingSp(new TextureBinding(m_context, texture, TextureBinding::TYPE_3D)));
+}
+
+const pipeline::TestTexture2D& TextureRenderer::get2DTexture (int textureIndex) const
+{
+       DE_ASSERT(m_textureBindings.size() > (size_t)textureIndex);
+       DE_ASSERT(m_textureBindings[textureIndex]->getType() == TextureBinding::TYPE_2D);
+
+       return dynamic_cast<const pipeline::TestTexture2D&>(m_textureBindings[textureIndex]->getTestTexture());
+}
+
+const pipeline::TestTextureCube& TextureRenderer::getCubeTexture (int textureIndex) const
+{
+       DE_ASSERT(m_textureBindings.size() > (size_t)textureIndex);
+       DE_ASSERT(m_textureBindings[textureIndex]->getType() == TextureBinding::TYPE_CUBE_MAP);
+
+       return dynamic_cast<const pipeline::TestTextureCube&>(m_textureBindings[textureIndex]->getTestTexture());
+}
+
+const pipeline::TestTexture2DArray& TextureRenderer::get2DArrayTexture (int textureIndex) const
+{
+       DE_ASSERT(m_textureBindings.size() > (size_t)textureIndex);
+       DE_ASSERT(m_textureBindings[textureIndex]->getType() == TextureBinding::TYPE_2D_ARRAY);
+
+       return dynamic_cast<const pipeline::TestTexture2DArray&>(m_textureBindings[textureIndex]->getTestTexture());
+}
+
+const pipeline::TestTexture3D& TextureRenderer::get3DTexture (int textureIndex) const
+{
+       DE_ASSERT(m_textureBindings.size() > (size_t)textureIndex);
+       DE_ASSERT(m_textureBindings[textureIndex]->getType() == TextureBinding::TYPE_3D);
+
+       return dynamic_cast<const pipeline::TestTexture3D&>(m_textureBindings[textureIndex]->getTestTexture());
+}
+
+void TextureRenderer::setViewport (float viewportX, float viewportY, float viewportW, float viewportH)
+{
+       m_viewportHeight = viewportH;
+       m_viewportWidth = viewportW;
+       m_viewportOffsetX = viewportX;
+       m_viewportOffsetY = viewportY;
+}
+
+TextureBinding* TextureRenderer::getTextureBinding (int textureIndex) const
+{
+       DE_ASSERT(m_textureBindings.size() > (size_t)textureIndex);
+       return m_textureBindings[textureIndex].get();
+}
+
+deUint32 TextureRenderer::getRenderWidth (void) const
+{
+       return m_renderWidth;
+}
+
+deUint32 TextureRenderer::getRenderHeight (void) const
+{
+       return m_renderHeight;
+}
+
+Move<VkDescriptorSet> TextureRenderer::makeDescriptorSet (const VkDescriptorPool descriptorPool, const VkDescriptorSetLayout setLayout) const
+{
+       const DeviceInterface&                                          vkd                                             = m_context.getDeviceInterface();
+       const VkDevice                                                          vkDevice                                = m_context.getDevice();
+
+       const VkDescriptorSetAllocateInfo                       allocateParams                  =
+       {
+                       VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,         // VkStructureType                                      sType
+                       DE_NULL,                                                                                        // const void*                                          pNext
+                       descriptorPool,                                                                         // VkDescriptorPool                                     descriptorPool
+                       1u,                                                                                                     // deUint32                                                     descriptorSetCount
+                       &setLayout,                                                                                     // const VkDescriptorSetLayout*         pSetLayouts
+       };
+       return allocateDescriptorSet(vkd, vkDevice, &allocateParams);
+}
+
+void TextureRenderer::addImageTransitionBarrier(VkCommandBuffer commandBuffer, VkImage image, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkImageLayout oldLayout, VkImageLayout newLayout) const
+{
+       const DeviceInterface&                  vkd                                     = m_context.getDeviceInterface();
+
+       const VkImageSubresourceRange   subResourcerange        =
+       {
+               VK_IMAGE_ASPECT_COLOR_BIT,              // VkImageAspectFlags   aspectMask;
+               0,                                                              // deUint32                             baseMipLevel;
+               1,                                                              // deUint32                             levelCount;
+               0,                                                              // deUint32                             baseArrayLayer;
+               1                                                               // deUint32                             layerCount;
+       };
+
+       const VkImageMemoryBarrier              imageBarrier            =
+       {
+               VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,         // VkStructureType                      sType;
+               DE_NULL,                                                                        // const void*                          pNext;
+               srcAccessMask,                                                          // VkAccessFlags                        srcAccessMask;
+               dstAccessMask,                                                          // VkAccessFlags                        dstAccessMask;
+               oldLayout,                                                                      // VkImageLayout                        oldLayout;
+               newLayout,                                                                      // VkImageLayout                        newLayout;
+               VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     srcQueueFamilyIndex;
+               VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                                     destQueueFamilyIndex;
+               image,                                                                          // VkImage                                      image;
+               subResourcerange                                                        // VkImageSubresourceRange      subresourceRange;
+       };
+
+       vkd.cmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, 0, 0, DE_NULL, 0, DE_NULL, 1, &imageBarrier);
+}
+
+
+void TextureRenderer::renderQuad (tcu::Surface& result, int texUnit, const float* texCoord, TextureType texType)
+{
+       renderQuad(result, texUnit, texCoord, ReferenceParams(texType));
+}
+
+void TextureRenderer::renderQuad (tcu::Surface& result, int texUnit, const float* texCoord, const ReferenceParams& params)
+{
+       const DeviceInterface&          vkd                                             = m_context.getDeviceInterface();
+       const VkDevice                          vkDevice                                = m_context.getDevice();
+       const VkQueue                           queue                                   = m_context.getUniversalQueue();
+       const deUint32                          queueFamilyIndex                = m_context.getUniversalQueueFamilyIndex();
+       Allocator&                                      allocator                               = m_context.getDefaultAllocator();
+
+       tcu::Vec4                                       wCoord                                  = params.flags & RenderParams::PROJECTED ? params.w : tcu::Vec4(1.0f);
+       bool                                            useBias                                 = !!(params.flags & RenderParams::USE_BIAS);
+       bool                                            logUniforms                             = !!(params.flags & RenderParams::LOG_UNIFORMS);
+
+       // Render quad with texture.
+       float                                           position[]                              =
+       {
+               -1.0f*wCoord.x(), -1.0f*wCoord.x(), 0.0f, wCoord.x(),
+               -1.0f*wCoord.y(), +1.0f*wCoord.y(), 0.0f, wCoord.y(),
+               +1.0f*wCoord.z(), -1.0f*wCoord.z(), 0.0f, wCoord.z(),
+               +1.0f*wCoord.w(), +1.0f*wCoord.w(), 0.0f, wCoord.w()
+       };
+
+       Program                                         progSpec                                = PROGRAM_LAST;
+       int                                                     numComps                                = 0;
+
+       if (params.texType == TEXTURETYPE_2D)
+       {
+               numComps = 2;
+
+               switch (params.samplerType)
+               {
+                       case SAMPLERTYPE_FLOAT:         progSpec = useBias ? PROGRAM_2D_FLOAT_BIAS      : PROGRAM_2D_FLOAT;             break;
+                       case SAMPLERTYPE_INT:           progSpec = useBias ? PROGRAM_2D_INT_BIAS        : PROGRAM_2D_INT;               break;
+                       case SAMPLERTYPE_UINT:          progSpec = useBias ? PROGRAM_2D_UINT_BIAS       : PROGRAM_2D_UINT;              break;
+                       case SAMPLERTYPE_SHADOW:        progSpec = useBias ? PROGRAM_2D_SHADOW_BIAS     : PROGRAM_2D_SHADOW;    break;
+                       default:                                        DE_ASSERT(false);
+               }
+       }
+       else if (params.texType == TEXTURETYPE_1D)
+       {
+               numComps = 1;
+
+               switch (params.samplerType)
+               {
+                       case SAMPLERTYPE_FLOAT:         progSpec = useBias ? PROGRAM_1D_FLOAT_BIAS      : PROGRAM_1D_FLOAT;             break;
+                       case SAMPLERTYPE_INT:           progSpec = useBias ? PROGRAM_1D_INT_BIAS        : PROGRAM_1D_INT;               break;
+                       case SAMPLERTYPE_UINT:          progSpec = useBias ? PROGRAM_1D_UINT_BIAS       : PROGRAM_1D_UINT;              break;
+                       case SAMPLERTYPE_SHADOW:        progSpec = useBias ? PROGRAM_1D_SHADOW_BIAS     : PROGRAM_1D_SHADOW;    break;
+                       default:                                        DE_ASSERT(false);
+               }
+       }
+       else if (params.texType == TEXTURETYPE_CUBE)
+       {
+               numComps = 3;
+
+               switch (params.samplerType)
+               {
+                       case SAMPLERTYPE_FLOAT:         progSpec = useBias ? PROGRAM_CUBE_FLOAT_BIAS    : PROGRAM_CUBE_FLOAT;   break;
+                       case SAMPLERTYPE_INT:           progSpec = useBias ? PROGRAM_CUBE_INT_BIAS              : PROGRAM_CUBE_INT;             break;
+                       case SAMPLERTYPE_UINT:          progSpec = useBias ? PROGRAM_CUBE_UINT_BIAS             : PROGRAM_CUBE_UINT;    break;
+                       case SAMPLERTYPE_SHADOW:        progSpec = useBias ? PROGRAM_CUBE_SHADOW_BIAS   : PROGRAM_CUBE_SHADOW;  break;
+                       default:                                        DE_ASSERT(false);
+               }
+       }
+       else if (params.texType == TEXTURETYPE_3D)
+       {
+               numComps = 3;
+
+               switch (params.samplerType)
+               {
+                       case SAMPLERTYPE_FLOAT:         progSpec = useBias ? PROGRAM_3D_FLOAT_BIAS      : PROGRAM_3D_FLOAT;             break;
+                       case SAMPLERTYPE_INT:           progSpec = useBias ? PROGRAM_3D_INT_BIAS        : PROGRAM_3D_INT;               break;
+                       case SAMPLERTYPE_UINT:          progSpec = useBias ? PROGRAM_3D_UINT_BIAS       : PROGRAM_3D_UINT;              break;
+                       default:                                        DE_ASSERT(false);
+               }
+       }
+       else if (params.texType == TEXTURETYPE_2D_ARRAY)
+       {
+               DE_ASSERT(!useBias); // \todo [2012-02-17 pyry] Support bias.
+
+               numComps = 3;
+
+               switch (params.samplerType)
+               {
+                       case SAMPLERTYPE_FLOAT:         progSpec = PROGRAM_2D_ARRAY_FLOAT;      break;
+                       case SAMPLERTYPE_INT:           progSpec = PROGRAM_2D_ARRAY_INT;        break;
+                       case SAMPLERTYPE_UINT:          progSpec = PROGRAM_2D_ARRAY_UINT;       break;
+                       case SAMPLERTYPE_SHADOW:        progSpec = PROGRAM_2D_ARRAY_SHADOW;     break;
+                       default:                                        DE_ASSERT(false);
+               }
+       }
+       else if (params.texType == TEXTURETYPE_CUBE_ARRAY)
+       {
+               DE_ASSERT(!useBias);
+
+               numComps = 4;
+
+               switch (params.samplerType)
+               {
+                       case SAMPLERTYPE_FLOAT:         progSpec = PROGRAM_CUBE_ARRAY_FLOAT;    break;
+                       case SAMPLERTYPE_INT:           progSpec = PROGRAM_CUBE_ARRAY_INT;              break;
+                       case SAMPLERTYPE_UINT:          progSpec = PROGRAM_CUBE_ARRAY_UINT;             break;
+                       case SAMPLERTYPE_SHADOW:        progSpec = PROGRAM_CUBE_ARRAY_SHADOW;   break;
+                       default:                                        DE_ASSERT(false);
+               }
+       }
+       else if (params.texType == TEXTURETYPE_1D_ARRAY)
+       {
+               DE_ASSERT(!useBias); // \todo [2012-02-17 pyry] Support bias.
+
+               numComps = 2;
+
+               switch (params.samplerType)
+               {
+                       case SAMPLERTYPE_FLOAT:         progSpec = PROGRAM_1D_ARRAY_FLOAT;      break;
+                       case SAMPLERTYPE_INT:           progSpec = PROGRAM_1D_ARRAY_INT;        break;
+                       case SAMPLERTYPE_UINT:          progSpec = PROGRAM_1D_ARRAY_UINT;       break;
+                       case SAMPLERTYPE_SHADOW:        progSpec = PROGRAM_1D_ARRAY_SHADOW;     break;
+                       default:                                        DE_ASSERT(false);
+               }
+       }
+       else if (params.texType == TEXTURETYPE_BUFFER)
+       {
+               numComps = 1;
+
+               switch (params.samplerType)
+               {
+                       case SAMPLERTYPE_FETCH_FLOAT:   progSpec = PROGRAM_BUFFER_FLOAT;        break;
+                       case SAMPLERTYPE_FETCH_INT:             progSpec = PROGRAM_BUFFER_INT;          break;
+                       case SAMPLERTYPE_FETCH_UINT:    progSpec = PROGRAM_BUFFER_UINT;         break;
+                       default:                                                DE_ASSERT(false);
+               }
+       }
+       else
+               DE_ASSERT(DE_FALSE);
+
+       Unique<VkShaderModule>                                  vertexShaderModule              (createShaderModule(vkd, vkDevice, m_context.getBinaryCollection().get("vertext_" + std::string(getProgramName(progSpec))), 0));
+       Unique<VkShaderModule>                                  fragmentShaderModule    (createShaderModule(vkd, vkDevice, m_context.getBinaryCollection().get("fragment_" + std::string(getProgramName(progSpec))), 0));
+
+       Move<VkSampler>                                                 sampler;
+       Move<VkDescriptorSet>                                   descriptorSet[2];
+       Move<VkDescriptorSetLayout>                             descriptorSetLayout[2];
+       Move<VkPipelineLayout>                                  pipelineLayout;
+
+       Move<VkCommandBuffer>                                   commandBuffer;
+       Move<VkPipeline>                                                graphicsPipeline;
+       Move<VkBuffer>                                                  vertexBuffer;
+       de::MovePtr<Allocation>                                 vertexBufferMemory;
+       const deUint32                                                  positionDataSize                = deUint32(sizeof(float) * 4 * 4);
+       const deUint32                                                  textureCoordDataSize    = deUint32(sizeof(float) * numComps * 4);
+
+       const VkPhysicalDeviceProperties                properties                              = m_context.getDeviceProperties();
+
+       if (positionDataSize > properties.limits.maxVertexInputAttributeOffset)
+       {
+               std::stringstream message;
+               message << "Larger vertex input attribute offset is needed (" << positionDataSize << ") than the available maximum (" << properties.limits.maxVertexInputAttributeOffset << ").";
+               TCU_THROW(NotSupportedError, message.str().c_str());
+       }
+
+       // Create Graphics Pipeline
+       {
+               const VkPipelineShaderStageCreateInfo   shaderStageParams[2]    =
+               {
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,            // VkStructureType                                      sType;
+                               DE_NULL,                                                                                                        // const void*                                          pNext;
+                               0,                                                                                                                      // VkPipelineShaderStageCreateFlags flags;
+                               VK_SHADER_STAGE_VERTEX_BIT,                                                                     // VkShaderStage                                        stage;
+                               *vertexShaderModule,                                                                            // VkShaderModule                                       shader;
+                               "main",                                                                                                         // const char*                                          pName;
+                               DE_NULL                                                                                                         // const VkSpecializationInfo*          pSpecializationInfo;
+                       },
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,            // VkStructureType                                      sType;
+                               DE_NULL,                                                                                                        // const void*                                          pNext;
+                               0,                                                                                                                      // VkPipelineShaderStageCreateFlags flags;
+                               VK_SHADER_STAGE_FRAGMENT_BIT,                                                           // VkShaderStage                                        stage;
+                               *fragmentShaderModule,                                                                          // VkShaderModule                                       shader;
+                               "main",                                                                                                         // const char*                                          pName;
+                               DE_NULL                                                                                                         // const VkSpecializationInfo*          pSpecializationInfo;
+                       }
+               };
+
+               const deUint32                                                  vertexPositionStrideSize                        = deUint32(sizeof(tcu::Vec4));
+               const deUint32                                                  vertexTextureStrideSize                         = deUint32(numComps * sizeof(float));
+
+               const VkVertexInputBindingDescription   vertexInputBindingDescription[2]        =
+               {
+                       {
+                               0u,                                                             // deUint32                                     binding;
+                               vertexPositionStrideSize,               // deUint32                                     strideInBytes;
+                               VK_VERTEX_INPUT_RATE_VERTEX             // VkVertexInputStepRate        stepRate;
+                       },
+                       {
+                               1u,                                                             // deUint32                                     binding;
+                               vertexTextureStrideSize,                // deUint32                                     strideInBytes;
+                               VK_VERTEX_INPUT_RATE_VERTEX             // VkVertexInputStepRate        stepRate;
+                       }
+               };
+
+               VkFormat                                                                textureCoordinateFormat                 = VK_FORMAT_R32G32B32A32_SFLOAT;
+
+               switch (numComps) {
+                       case 1: textureCoordinateFormat = VK_FORMAT_R32_SFLOAT;                         break;
+                       case 2: textureCoordinateFormat = VK_FORMAT_R32G32_SFLOAT;                      break;
+                       case 3: textureCoordinateFormat = VK_FORMAT_R32G32B32_SFLOAT;           break;
+                       case 4: textureCoordinateFormat = VK_FORMAT_R32G32B32A32_SFLOAT;        break;
+                       default:
+                               DE_ASSERT(false);
+               }
+
+               const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[2] =
+               {
+                       {
+                               0u,                                                                     // deUint32     location;
+                               0u,                                                                     // deUint32     binding;
+                               VK_FORMAT_R32G32B32A32_SFLOAT,          // VkFormat     format;
+                               0u                                                                      // deUint32     offsetInBytes;
+                       },
+                       {
+                               1u,                                                                     // deUint32     location;
+                               1u,                                                                     // deUint32     binding;
+                               textureCoordinateFormat,                        // VkFormat     format;
+                               positionDataSize                                        // deUint32     offsetInBytes;
+                       }
+               };
+
+               const VkPipelineVertexInputStateCreateInfo      vertexInputStateParams =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,              // VkStructureType                                                      sType;
+                       DE_NULL,                                                                                                                // const void*                                                          pNext;
+                       0,                                                                                                                              // VkPipelineVertexInputStateCreateFlags        flags;
+                       2u,                                                                                                                             // deUint32                                                                     bindingCount;
+                       vertexInputBindingDescription,                                                                  // const VkVertexInputBindingDescription*       pVertexBindingDescriptions;
+                       2u,                                                                                                                             // deUint32                                                                     attributeCount;
+                       vertexInputAttributeDescriptions                                                                // const VkVertexInputAttributeDescription*     pVertexAttributeDescriptions;
+               };
+
+               const VkPipelineInputAssemblyStateCreateInfo    inputAssemblyStateParams =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,    // VkStructureType                                                      sType;
+                       DE_NULL,                                                                                                                // const void*                                                          pNext;
+                       0,                                                                                                                              // VkPipelineInputAssemblyStateCreateFlags      flags;
+                       VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,                                                    // VkPrimitiveTopology                                          topology;
+                       VK_FALSE                                                                                                                // VkBool32                                                                     primitiveRestartEnable;
+               };
+
+               const VkViewport                                                viewport =
+               {
+                       m_viewportOffsetX,                      // float        originX;
+                       m_viewportOffsetY,                      // float        originY;
+                       m_viewportWidth,                        // float        width;
+                       m_viewportHeight,                       // float        height;
+                       0.0f,                                           // float        minDepth;
+                       1.0f                                            // float        maxDepth;
+               };
+
+               const VkRect2D                                                  scissor =
+               {
+                       { 0, 0 },                                                                                                               // VkOffset2D  offset;
+                       { m_renderWidth, m_renderHeight }                                                               // VkExtent2D  extent;
+               };
+
+               const VkPipelineViewportStateCreateInfo viewportStateParams =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,                  // VkStructureType                                              sType;
+                       DE_NULL,                                                                                                                // const void*                                                  pNext;
+                       0,                                                                                                                              // VkPipelineViewportStateCreateFlags   flags;
+                       1u,                                                                                                                             // deUint32                                                             viewportCount;
+                       &viewport,                                                                                                              // const VkViewport*                                    pViewports;
+                       1u,                                                                                                                             // deUint32                                                             scissorCount;
+                       &scissor                                                                                                                // const VkRect2D*                                              pScissors;
+               };
+
+               const VkPipelineMultisampleStateCreateInfo multisampleStateParams =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,               // VkStructureType                                                      sType;
+                       DE_NULL,                                                                                                                // const void*                                                          pNext;
+                       0u,                                                                                                                             // VkPipelineMultisampleStateCreateFlags        flags;
+                       m_sampleCount,                                                                                                  // VkSampleCountFlagBits                                        rasterizationSamples;
+                       VK_FALSE,                                                                                                               // VkBool32                                                                     sampleShadingEnable;
+                       0.0f,                                                                                                                   // float                                                                        minSampleShading;
+                       DE_NULL,                                                                                                                // const VkSampleMask*                                          pSampleMask;
+                       VK_FALSE,                                                                                                               // VkBool32                                                                     alphaToCoverageEnable;
+                       VK_FALSE                                                                                                                // VkBool32                                                                     alphaToOneEnable;
+               };
+
+               const VkPipelineRasterizationStateCreateInfo    rasterizationStateCreateInfo    =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,             // VkStructureType                                                      sType;
+                       DE_NULL,                                                                                                                // const void*                                                          pNext;
+                       0,                                                                                                                              // VkPipelineRasterizationStateCreateFlags      flags;
+                       VK_FALSE,                                                                                                               // VkBool32                                                                     depthClipEnable;
+                       VK_FALSE,                                                                                                               // VkBool32                                                                     rasterizerDiscardEnable;
+                       VK_POLYGON_MODE_FILL,                                                                                   // VkFillMode                                                           fillMode;
+                       VK_CULL_MODE_NONE,                                                                                              // VkCullMode                                                           cullMode;
+                       VK_FRONT_FACE_COUNTER_CLOCKWISE,                                                                // VkFrontFace                                                          frontFace;
+                       VK_FALSE,                                                                                                               // VkBool32                                                                     depthBiasEnable;
+                       0.0f,                                                                                                                   // float                                                                        depthBias;
+                       0.0f,                                                                                                                   // float                                                                        depthBiasClamp;
+                       0.0f,                                                                                                                   // float                                                                        slopeScaledDepthBias;
+                       1.0f,                                                                                                                   // float                                                                        lineWidth;
+               };
+
+               const VkPipelineColorBlendAttachmentState       colorBlendAttachmentState       =
+               {
+                       VK_FALSE,                                                                                                       // VkBool32                     blendEnable;
+                       VK_BLEND_FACTOR_ONE,                                                                            // VkBlend                      srcBlendColor;
+                       VK_BLEND_FACTOR_ZERO,                                                                           // VkBlend                      destBlendColor;
+                       VK_BLEND_OP_ADD,                                                                                        // VkBlendOp            blendOpColor;
+                       VK_BLEND_FACTOR_ONE,                                                                            // VkBlend                      srcBlendAlpha;
+                       VK_BLEND_FACTOR_ZERO,                                                                           // VkBlend                      destBlendAlpha;
+                       VK_BLEND_OP_ADD,                                                                                        // VkBlendOp            blendOpAlpha;
+                       (VK_COLOR_COMPONENT_R_BIT |
+                        VK_COLOR_COMPONENT_G_BIT |
+                        VK_COLOR_COMPONENT_B_BIT |
+                        VK_COLOR_COMPONENT_A_BIT)                                                                      // VkChannelFlags       channelWriteMask;
+               };
+
+               const VkPipelineColorBlendStateCreateInfo       colorBlendStateParams           =
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,       // VkStructureType                                                              sType;
+                       DE_NULL,                                                                                                        // const void*                                                                  pNext;
+                       0,                                                                                                                      // VkPipelineColorBlendStateCreateFlags                 flags;
+                       VK_FALSE,                                                                                                       // VkBool32                                                                             logicOpEnable;
+                       VK_LOGIC_OP_COPY,                                                                                       // VkLogicOp                                                                    logicOp;
+                       1u,                                                                                                                     // deUint32                                                                             attachmentCount;
+                       &colorBlendAttachmentState,                                                                     // const VkPipelineColorBlendAttachmentState*   pAttachments;
+                       { 0.0f, 0.0f, 0.0f, 0.0f },                                                                     // float                                                                                blendConst[4];
+               };
+
+               const VkSamplerCreateInfo                                       samplerCreateInfo                       = mapSampler(params.sampler, m_textureBindings[texUnit]->getTestTexture().getTextureFormat(), params.minLod, params.maxLod);
+
+               if (samplerCreateInfo.magFilter == VK_FILTER_LINEAR || samplerCreateInfo.minFilter == VK_FILTER_LINEAR || samplerCreateInfo.mipmapMode == VK_SAMPLER_MIPMAP_MODE_LINEAR)
+               {
+                       const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(m_context.getInstanceInterface(), m_context.getPhysicalDevice(), mapTextureFormat(m_textureBindings[texUnit]->getTestTexture().getTextureFormat()));
+                       if (!(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT))
+                               TCU_THROW(NotSupportedError, "Linear filtering for this image format is not supported");
+               }
+
+               sampler = createSampler(vkd, vkDevice, &samplerCreateInfo);
+
+               descriptorSetLayout[0] = DescriptorSetLayoutBuilder()
+                                                                                       .addSingleBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_FRAGMENT_BIT)
+                                                                                               .build(vkd, vkDevice);
+
+               descriptorSetLayout[1] = DescriptorSetLayoutBuilder()
+                                                                                       .addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, &sampler.get())
+                                                                                       .build(vkd, vkDevice);
+
+
+               descriptorSet[0] = makeDescriptorSet(*m_descriptorPool, *descriptorSetLayout[0]);
+               descriptorSet[1] = makeDescriptorSet(*m_descriptorPool, *descriptorSetLayout[1]);
+
+               {
+                       const VkDescriptorBufferInfo                    descriptorBufferInfo    =
+                       {
+                               *m_uniformBuffer,                                                       // VkBuffer             buffer;
+                               0u,                                                                                     // VkDeviceSize offset;
+                               VK_WHOLE_SIZE                                                           // VkDeviceSize range;
+                       };
+
+                       DescriptorSetUpdateBuilder()
+                               .writeSingle(*descriptorSet[0], DescriptorSetUpdateBuilder::Location::binding(0), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &descriptorBufferInfo)
+                               .update(vkd, vkDevice);
+               }
+
+               {
+                       VkDescriptorImageInfo                                   descriptorImageInfo             =
+                       {
+                               *sampler,                                                                               // VkSampler            sampler;
+                               m_textureBindings[texUnit]->getImageView(),             // VkImageView          imageView;
+                               VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL                // VkImageLayout        imageLayout;
+                       };
+
+                       DescriptorSetUpdateBuilder()
+                               .writeSingle(*descriptorSet[1], DescriptorSetUpdateBuilder::Location::binding(0), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &descriptorImageInfo)
+                               .update(vkd, vkDevice);
+               }
+
+               // Pipeline Layout
+               {
+                       VkDescriptorSetLayout                                   descriptorSetLayouts[2]         =
+                       {
+                               *descriptorSetLayout[0],
+                               *descriptorSetLayout[1]
+                       };
+
+                       const VkPipelineLayoutCreateInfo                pipelineLayoutCreateInfo        =
+                       {
+                               VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,          // VkStructureType                              sType;
+                               DE_NULL,                                                                                        // const void*                                  pNext;
+                               0u,                                                                                                     // VkPipelineLayoutCreateFlags  flags;
+                               2u,                                                                                                     // deUint32                                             descriptorSetCount;
+                               descriptorSetLayouts,                                                           // const VkDescriptorSetLayout* pSetLayouts;
+                               0u,                                                                                                     // deUint32                                             pushConstantRangeCount;
+                               DE_NULL                                                                                         // const VkPushConstantRange*   pPushConstantRanges;
+                       };
+
+                       pipelineLayout = createPipelineLayout(vkd, vkDevice, &pipelineLayoutCreateInfo);
+               }
+
+               const VkGraphicsPipelineCreateInfo graphicsPipelineParams =
+               {
+                       VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,        // VkStructureType                                                                      sType;
+                       DE_NULL,                                                                                        // const void*                                                                          pNext;
+                       0u,                                                                                                     // VkPipelineCreateFlags                                                        flags;
+                       2u,                                                                                                     // deUint32                                                                                     stageCount;
+                       shaderStageParams,                                                                      // const VkPipelineShaderStageCreateInfo*                       pStages;
+                       &vertexInputStateParams,                                                        // const VkPipelineVertexInputStateCreateInfo*          pVertexInputState;
+                       &inputAssemblyStateParams,                                                      // const VkPipelineInputAssemblyStateCreateInfo*        pInputAssemblyState;
+                       DE_NULL,                                                                                        // const VkPipelineTessellationStateCreateInfo*         pTessellationState;
+                       &viewportStateParams,                                                           // const VkPipelineViewportStateCreateInfo*                     pViewportState;
+                       &rasterizationStateCreateInfo,                                          // const VkPipelineRasterStateCreateInfo*                       pRasterizationState;
+                       &multisampleStateParams,                                                        // const VkPipelineMultisampleStateCreateInfo*          pMultisampleState;
+                       DE_NULL,                                                                                        // const VkPipelineDepthStencilStateCreateInfo*         pDepthStencilState;
+                       &colorBlendStateParams,                                                         // const VkPipelineColorBlendStateCreateInfo*           pColorBlendState;
+                       DE_NULL,                                                                                        // const VkPipelineDynamicStateCreateInfo*                      pDynamicState;
+                       *pipelineLayout,                                                                        // VkPipelineLayout                                                                     layout;
+                       *m_renderPass,                                                                          // VkRenderPass                                                                         renderPass;
+                       0u,                                                                                                     // deUint32                                                                                     subpass;
+                       0u,                                                                                                     // VkPipeline                                                                           basePipelineHandle;
+                       0u                                                                                                      // deInt32                                                                                      basePipelineIndex;
+               };
+
+               graphicsPipeline                = createGraphicsPipeline(vkd, vkDevice, DE_NULL, &graphicsPipelineParams);
+       }
+
+       // Create Vertex Buffer
+       {
+               const VkBufferCreateInfo                        vertexBufferParams              =
+               {
+                       VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,           // VkStructureType              sType;
+                       DE_NULL,                                                                        // const void*                  pNext;
+                       0u,                                                                                     // VkBufferCreateFlags  flags;
+                       positionDataSize + textureCoordDataSize,        // VkDeviceSize                 size;
+                       VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,                      // VkBufferUsageFlags   usage;
+                       VK_SHARING_MODE_EXCLUSIVE,                                      // VkSharingMode                sharingMode;
+                       1u,                                                                                     // deUint32                             queueFamilyCount;
+                       &queueFamilyIndex                                                       // const deUint32*              pQueueFamilyIndices;
+               };
+
+               vertexBuffer            = createBuffer(vkd, vkDevice, &vertexBufferParams);
+               vertexBufferMemory      = allocator.allocate(getBufferMemoryRequirements(vkd, vkDevice, *vertexBuffer), MemoryRequirement::HostVisible);
+
+               VK_CHECK(vkd.bindBufferMemory(vkDevice, *vertexBuffer, vertexBufferMemory->getMemory(), vertexBufferMemory->getOffset()));
+
+               // Load vertices into vertex buffer
+               deMemcpy(vertexBufferMemory->getHostPtr(), position, positionDataSize);
+               deMemcpy(reinterpret_cast<deUint8*>(vertexBufferMemory->getHostPtr()) +  positionDataSize, texCoord, textureCoordDataSize);
+               flushMappedMemoryRange(vkd, vkDevice, vertexBufferMemory->getMemory(), vertexBufferMemory->getOffset(), vertexBufferParams.size);
+       }
+
+       // Create Command Buffer
+       {
+               const VkCommandBufferAllocateInfo               cmdBufferAllocateInfo   =
+               {
+                       VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,                         // VkStructureType             sType;
+                       DE_NULL,                                                                                                        // const void*                 pNext;
+                       *m_commandPool,                                                                                         // VkCommandPool               commandPool;
+                       VK_COMMAND_BUFFER_LEVEL_PRIMARY,                                                        // VkCommandBufferLevel        level;
+                       1                                                                                                                       // deUint32                    commandBufferCount;
+               };
+
+               commandBuffer = allocateCommandBuffer(vkd, vkDevice, &cmdBufferAllocateInfo);
+       }
+
+       // Begin Command Buffer
+       {
+               const VkCommandBufferBeginInfo          cmdBufferBeginInfo              =
+               {
+                       VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,    // VkStructureType                                                      sType;
+                       DE_NULL,                                                                                // const void*                                                          pNext;
+                       0u,                                                                                             // VkCmdBufferOptimizeFlags                                     flags;
+                       DE_NULL                                                                                 // const VkCommandBufferInheritanceInfo*        pInheritanceInfo;
+               };
+
+               VK_CHECK(vkd.beginCommandBuffer(*commandBuffer, &cmdBufferBeginInfo));
+       }
+
+       // Begin Render Pass
+       {
+               const VkRenderPassBeginInfo                     renderPassBeginInfo             =
+               {
+                       VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,                               // VkStructureType              sType;
+                       DE_NULL,                                                                                                // const void*                  pNext;
+                       *m_renderPass,                                                                                  // VkRenderPass                 renderPass;
+                       *m_frameBuffer,                                                                                 // VkFramebuffer                framebuffer;
+                       {
+                               { 0, 0 },
+                               { m_renderWidth, m_renderHeight }
+                       },                                                                                                              // VkRect2D                             renderArea;
+                       0u,                                                                                                             // deUint32                             clearValueCount;
+                       DE_NULL                                                                                                 // const VkClearValue*  pClearValues;
+               };
+
+               vkd.cmdBeginRenderPass(*commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+       }
+
+       const VkDeviceSize                                              vertexBufferOffset              = 0;
+
+       vkd.cmdBindPipeline(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *graphicsPipeline);
+       vkd.cmdBindDescriptorSets(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 0u, 1, &descriptorSet[0].get(), 0u, DE_NULL);
+       vkd.cmdBindDescriptorSets(*commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLayout, 1u, 1, &descriptorSet[1].get(), 0u, DE_NULL);
+       vkd.cmdBindVertexBuffers(*commandBuffer, 0, 1, &vertexBuffer.get(), &vertexBufferOffset);
+       vkd.cmdBindVertexBuffers(*commandBuffer, 1, 1, &vertexBuffer.get(), &vertexBufferOffset);
+       vkd.cmdBindIndexBuffer(*commandBuffer, *m_vertexIndexBuffer, 0, VK_INDEX_TYPE_UINT16);
+       vkd.cmdDrawIndexed(*commandBuffer, 6, 1, 0, 0, 0);
+       vkd.cmdEndRenderPass(*commandBuffer);
+
+       // Copy Image
+       {
+               const VkBufferMemoryBarrier                     bufferBarrier                   =
+               {
+                       VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,        // VkStructureType              sType;
+                       DE_NULL,                                                                        // const void*                  pNext;
+                       VK_ACCESS_TRANSFER_WRITE_BIT,                           // VkMemoryOutputFlags  outputMask;
+                       VK_ACCESS_HOST_READ_BIT,                                        // VkMemoryInputFlags   inputMask;
+                       VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                             srcQueueFamilyIndex;
+                       VK_QUEUE_FAMILY_IGNORED,                                        // deUint32                             destQueueFamilyIndex;
+                       *m_resultBuffer,                                                        // VkBuffer                             buffer;
+                       0u,                                                                                     // VkDeviceSize                 offset;
+                       m_resultBufferSize                                                      // VkDeviceSize                 size;
+               };
+
+               const VkBufferImageCopy                         copyRegion                              =
+               {
+                       0u,                                                                                     // VkDeviceSize                         bufferOffset;
+                       m_renderWidth,                                                          // deUint32                                     bufferRowLength;
+                       m_renderHeight,                                                         // deUint32                                     bufferImageHeight;
+                       {
+                               VK_IMAGE_ASPECT_COLOR_BIT,
+                               0u,
+                               0u,
+                               1u
+                       },                                                                                      // VkImageSubresourceCopy       imageSubresource;
+                       { 0, 0, 0 },                                                            // VkOffset3D                           imageOffset;
+                       { m_renderWidth, m_renderHeight, 1u }           // VkExtent3D                           imageExtent;
+               };
+
+               addImageTransitionBarrier(*commandBuffer,
+                                                                 m_multisampling ? *m_resolvedImage : *m_image,
+                                                                 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,                // VkPipelineStageFlags         srcStageMask
+                                                                 VK_PIPELINE_STAGE_TRANSFER_BIT,                                               // VkPipelineStageFlags         dstStageMask
+                                                                 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;
+
+               if (m_multisampling)
+                       vkd.cmdCopyImageToBuffer(*commandBuffer, *m_resolvedImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *m_resultBuffer, 1, &copyRegion);
+               else
+                       vkd.cmdCopyImageToBuffer(*commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *m_resultBuffer, 1, &copyRegion);
+
+               vkd.cmdPipelineBarrier(*commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, &bufferBarrier, 0, (const VkImageMemoryBarrier*)DE_NULL);
+
+               addImageTransitionBarrier(*commandBuffer,
+                                                                 m_multisampling ? *m_resolvedImage : *m_image,
+                                                                 VK_PIPELINE_STAGE_TRANSFER_BIT,                                       // VkPipelineStageFlags         srcStageMask
+                                                                 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,        // VkPipelineStageFlags         dstStageMask
+                                                                 VK_ACCESS_TRANSFER_READ_BIT,                                          // VkAccessFlags                        srcAccessMask
+                                                                 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,                         // VkAccessFlags                        dstAccessMask
+                                                                 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,                         // VkImageLayout                        oldLayout;
+                                                                 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);            // VkImageLayout                        newLayout;
+       }
+
+       VK_CHECK(vkd.endCommandBuffer(*commandBuffer));
+
+       // Upload uniform buffer data
+       {
+               const ShaderParameters  shaderParameters        =
+               {
+                       params.bias,                    // float                bias;                           //!< User-supplied bias.
+                       params.ref,                             // float                ref;                            //!< Reference value for shadow lookups.
+                       tcu::Vec2(),                    // tcu::Vec2    padding;                        //!< Shader uniform padding.
+                       params.colorScale,              // tcu::Vec4    colorScale;                     //!< Scale for texture color values.
+                       params.colorBias                // tcu::Vec4    colorBias;                      //!< Bias for texture color values.
+               };
+               const deUint32          shaderParamsSize = sizeof(shaderParameters);
+               deMemcpy(m_uniformBufferMemory->getHostPtr(), &shaderParameters, shaderParamsSize);
+               flushMappedMemoryRange(vkd, vkDevice, m_uniformBufferMemory->getMemory(), m_uniformBufferMemory->getOffset(), shaderParamsSize);
+
+               if (logUniforms)
+                       m_log << TestLog::Message << "u_sampler = " << texUnit << TestLog::EndMessage;
+
+               if (useBias)
+               {
+                       if (logUniforms)
+                               m_log << TestLog::Message << "u_bias = " << shaderParameters.bias << TestLog::EndMessage;
+               }
+
+               if (params.samplerType == SAMPLERTYPE_SHADOW)
+               {
+                       if (logUniforms)
+                               m_log << TestLog::Message << "u_ref = " << shaderParameters.ref << TestLog::EndMessage;
+               }
+
+               if (logUniforms)
+               {
+                       m_log << TestLog::Message << "u_colorScale = " << shaderParameters.colorScale << TestLog::EndMessage;
+                       m_log << TestLog::Message << "u_colorBias = " << shaderParameters.colorBias << TestLog::EndMessage;
+               }
+       }
+
+       // Submit
+       {
+               const VkSubmitInfo                                      submitInfo                              =
+               {
+                       VK_STRUCTURE_TYPE_SUBMIT_INFO,                  // VkStructureType                              sType;
+                       DE_NULL,                                                                // const void*                                  pNext;
+                       0u,                                                                             // deUint32                                             waitSemaphoreCount;
+                       DE_NULL,                                                                // const VkSemaphore*                   pWaitSemaphores;
+                       DE_NULL,                                                                // const VkPipelineStageFlags*  pWaitDstStageMask;
+                       1u,                                                                             // deUint32                                             commandBufferCount;
+                       &commandBuffer.get(),                                   // const VkCommandBuffer*               pCommandBuffers;
+                       0u,                                                                             // deUint32                                             signalSemaphoreCount;
+                       DE_NULL,                                                                // const VkSemaphore*                   pSignalSemaphores;
+               };
+
+               VK_CHECK(vkd.resetFences(vkDevice, 1, &m_fence.get()));
+               VK_CHECK(vkd.queueSubmit(queue, 1, &submitInfo, *m_fence));
+               VK_CHECK(vkd.waitForFences(vkDevice, 1, &m_fence.get(), true, ~(0ull) /* infinity */));
+       }
+
+       invalidateMappedMemoryRange(vkd, vkDevice, m_resultBufferMemory->getMemory(), m_resultBufferMemory->getOffset(), m_resultBufferSize);
+
+       tcu::copy(result.getAccess(), tcu::ConstPixelBufferAccess(m_textureFormat, tcu::IVec3(m_renderWidth, m_renderHeight, 1u), m_resultBufferMemory->getHostPtr()));
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Map Vulkan sampler parameters to tcu::Sampler.
+ *
+ * If no mapping is found, throws tcu::InternalError.
+ *
+ * \param wrapU                        U-component wrap mode
+ * \param wrapV                        V-component wrap mode
+ * \param wrapW                        W-component wrap mode
+ * \param minFilterMode        Minification filter mode
+ * \param magFilterMode        Magnification filter mode
+ * \return Sampler description.
+ *//*--------------------------------------------------------------------*/
+tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::WrapMode wrapW, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode)
+{
+       return tcu::Sampler(wrapU, wrapV, wrapW,
+                                               minFilterMode, magFilterMode,
+                                               0.0f /* lod threshold */,
+                                               true /* normalized coords */,
+                                               tcu::Sampler::COMPAREMODE_NONE /* no compare */,
+                                               0 /* compare channel */,
+                                               tcu::Vec4(0.0f) /* border color, not used */);
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Map Vulkan sampler parameters to tcu::Sampler.
+ *
+ * If no mapping is found, throws tcu::InternalError.
+ *
+ * \param wrapU                        U-component wrap mode
+ * \param wrapV                        V-component wrap mode
+ * \param minFilterMode        Minification filter mode
+ * \param minFilterMode        Magnification filter mode
+ * \return Sampler description.
+ *//*--------------------------------------------------------------------*/
+tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode)
+{
+       return createSampler(wrapU, wrapV, wrapU, minFilterMode, magFilterMode);
+}
+
+/*--------------------------------------------------------------------*//*!
+ * \brief Map Vulkan sampler parameters to tcu::Sampler.
+ *
+ * If no mapping is found, throws tcu::InternalError.
+ *
+ * \param wrapU                        U-component wrap mode
+ * \param minFilterMode        Minification filter mode
+ * \return Sampler description.
+ *//*--------------------------------------------------------------------*/
+tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode)
+{
+       return createSampler(wrapU, wrapU, wrapU, minFilterMode, magFilterMode);
+}
+
+TestTexture2DSp loadTexture2D (const tcu::Archive& archive, const std::vector<std::string>& filenames)
+{
+       DE_ASSERT(filenames.size() > 0);
+
+       TestTexture2DSp texture;
+
+       std::string ext = de::FilePath(filenames[0]).getFileExtension();
+
+       if (ext == "png")
+       {
+
+               for (size_t fileIndex = 0; fileIndex < filenames.size(); ++fileIndex)
+               {
+                       tcu::TextureLevel level;
+
+                       tcu::ImageIO::loadImage(level, archive, filenames[fileIndex].c_str());
+
+                       TCU_CHECK_INTERNAL(level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8) ||
+                                                                                          level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGB, tcu::TextureFormat::UNORM_INT8));
+
+                       if (fileIndex == 0)
+                               texture = TestTexture2DSp(new pipeline::TestTexture2D(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), level.getWidth(), level.getHeight()));
+
+                       tcu::copy(texture->getLevel((int)fileIndex, 0), level.getAccess());
+               }
+       }
+       else if (ext == "pkm")
+       {
+
+               for (size_t fileIndex = 0; fileIndex < filenames.size(); ++fileIndex)
+               {
+                       // Compressed texture.
+                       tcu::CompressedTexture  level;
+
+                       tcu::ImageIO::loadPKM(level, archive, filenames[fileIndex].c_str());
+
+                       tcu::TextureFormat              uncompressedFormat              = tcu::getUncompressedFormat(level.getFormat());
+                       std::vector<deUint8>    uncompressedData                (uncompressedFormat.getPixelSize() * level.getWidth() * level.getHeight(), 0);
+                       tcu::PixelBufferAccess  decompressedBuffer              (uncompressedFormat, level.getWidth(), level.getHeight(), 1, uncompressedData.data());
+
+                       tcu::TextureFormat              commonFormat                    = tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
+                       std::vector<deUint8>    commonFromatData                (commonFormat.getPixelSize() * level.getWidth() * level.getHeight(), 0);
+                       tcu::PixelBufferAccess  commonFormatBuffer              (commonFormat, level.getWidth(), level.getHeight(), 1, commonFromatData.data());
+
+                       if (fileIndex == 0)
+                               texture = TestTexture2DSp(new pipeline::TestTexture2D(commonFormat, level.getWidth(), level.getHeight()));
+
+                       level.decompress(decompressedBuffer, tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_LDR));
+
+                       tcu::copy(commonFormatBuffer, decompressedBuffer);
+                       tcu::copy(texture->getLevel((int)fileIndex, 0), commonFormatBuffer);
+               }
+       }
+       else
+               TCU_FAIL("Unsupported file format");
+
+       return texture;
+}
+
+TestTextureCubeSp loadTextureCube (const tcu::Archive& archive, const std::vector<std::string>& filenames)
+{
+       DE_ASSERT(filenames.size() > 0);
+       DE_STATIC_ASSERT(tcu::CUBEFACE_LAST == 6);
+       TCU_CHECK((int)filenames.size() % tcu::CUBEFACE_LAST == 0);
+
+       TestTextureCubeSp texture;
+
+       std::string ext = de::FilePath(filenames[0]).getFileExtension();
+
+       if (ext == "png")
+       {
+
+               for (size_t fileIndex = 0; fileIndex < filenames.size(); ++fileIndex)
+               {
+                       tcu::TextureLevel level;
+
+                       tcu::ImageIO::loadImage(level, archive, filenames[fileIndex].c_str());
+
+                       TCU_CHECK_INTERNAL(level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8) ||
+                                                                                          level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGB, tcu::TextureFormat::UNORM_INT8));
+
+                       TCU_CHECK( level.getWidth() == level.getHeight());
+
+                       if (fileIndex == 0)
+                               texture = TestTextureCubeSp(new pipeline::TestTextureCube(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), level.getWidth()));
+
+                       tcu::copy(texture->getLevel((int)fileIndex / 6, (int)fileIndex % 6), level.getAccess());
+               }
+       }
+       else if (ext == "pkm")
+       {
+               for (size_t fileIndex = 0; fileIndex < filenames.size(); ++fileIndex)
+               {
+                       // Compressed texture.
+                       tcu::CompressedTexture  level;
+
+                       tcu::ImageIO::loadPKM(level, archive, filenames[fileIndex].c_str());
+
+                       TCU_CHECK( level.getWidth() == level.getHeight());
+
+                       tcu::TextureFormat              uncompressedFormat                              = tcu::getUncompressedFormat(level.getFormat());
+                       std::vector<deUint8>    uncompressedData                                (uncompressedFormat.getPixelSize() * level.getWidth() * level.getHeight(), 0);
+                       tcu::PixelBufferAccess  decompressedBuffer                              (uncompressedFormat, level.getWidth(), level.getHeight(), 1, uncompressedData.data());
+
+                       tcu::TextureFormat              commonFormat                                    = tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
+                       std::vector<deUint8>    commonFromatData                                (commonFormat.getPixelSize() * level.getWidth() * level.getHeight(), 0);
+                       tcu::PixelBufferAccess  commonFormatBuffer                              (commonFormat, level.getWidth(), level.getHeight(), 1, commonFromatData.data());
+
+                       if (fileIndex == 0)
+                               texture = TestTextureCubeSp(new pipeline::TestTextureCube(commonFormat, level.getWidth()));
+
+                       level.decompress(decompressedBuffer, tcu::TexDecompressionParams(tcu::TexDecompressionParams::ASTCMODE_LDR));
+
+                       tcu::copy(commonFormatBuffer, decompressedBuffer);
+                       tcu::copy(texture->getLevel((int)fileIndex / 6, (int)fileIndex % 6), commonFormatBuffer);
+               }
+       }
+       else
+               TCU_FAIL("Unsupported file format");
+
+       return texture;
+}
+
+TextureCommonTestCaseParameters::TextureCommonTestCaseParameters (void)
+       : sampleCount                   (VK_SAMPLE_COUNT_1_BIT)
+       , texCoordPrecision             (glu::PRECISION_HIGHP)
+       , minFilter                             (tcu::Sampler::LINEAR)
+       , magFilter                             (tcu::Sampler::LINEAR)
+       , wrapS                                 (tcu::Sampler::REPEAT_GL)
+       , wrapT                                 (tcu::Sampler::REPEAT_GL)
+       , format                                (VK_FORMAT_R8G8B8A8_UNORM)
+{
+}
+
+Texture2DTestCaseParameters::Texture2DTestCaseParameters (void)
+       : width                                 (64)
+       , height                                (64)
+{
+}
+
+TextureCubeTestCaseParameters::TextureCubeTestCaseParameters (void)
+       : size                                  (64)
+{
+}
+
+Texture2DArrayTestCaseParameters::Texture2DArrayTestCaseParameters (void)
+       : numLayers                             (8)
+{
+}
+
+Texture3DTestCaseParameters::Texture3DTestCaseParameters (void)
+       : wrapR                                 (tcu::Sampler::REPEAT_GL)
+       , depth                                 (64)
+{
+}
+
+} // util
+} // texture
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.hpp b/external/vulkancts/modules/vulkan/texture/vktTextureTestUtil.hpp
new file mode 100644 (file)
index 0000000..cddd0e3
--- /dev/null
@@ -0,0 +1,323 @@
+#ifndef _VKTTEXTURETESTUTIL_HPP
+#define _VKTTEXTURETESTUTIL_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Texture test utilities.
+ *
+ * About coordinates:
+ *  + Quads consist of 2 triangles, rendered using explicit indices.
+ *  + All TextureTestUtil functions and classes expect texture coordinates
+ *    for quads to be specified in order (-1, -1), (-1, 1), (1, -1), (1, 1).
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuSurface.hpp"
+
+#include "vkDefs.hpp"
+#include "vktTestCase.hpp"
+
+#include "gluShaderProgram.hpp"
+#include "gluTextureTestUtil.hpp"
+#include "deSharedPtr.hpp"
+
+#include "../pipeline/vktPipelineImageUtil.hpp"
+
+namespace vkt
+{
+
+namespace texture
+{
+
+namespace util
+{
+
+enum Program
+{
+       PROGRAM_2D_FLOAT = 0,
+       PROGRAM_2D_INT,
+       PROGRAM_2D_UINT,
+       PROGRAM_2D_SHADOW,
+
+       PROGRAM_2D_FLOAT_BIAS,
+       PROGRAM_2D_INT_BIAS,
+       PROGRAM_2D_UINT_BIAS,
+       PROGRAM_2D_SHADOW_BIAS,
+
+       PROGRAM_1D_FLOAT,
+       PROGRAM_1D_INT,
+       PROGRAM_1D_UINT,
+       PROGRAM_1D_SHADOW,
+
+       PROGRAM_1D_FLOAT_BIAS,
+       PROGRAM_1D_INT_BIAS,
+       PROGRAM_1D_UINT_BIAS,
+       PROGRAM_1D_SHADOW_BIAS,
+
+       PROGRAM_CUBE_FLOAT,
+       PROGRAM_CUBE_INT,
+       PROGRAM_CUBE_UINT,
+       PROGRAM_CUBE_SHADOW,
+
+       PROGRAM_CUBE_FLOAT_BIAS,
+       PROGRAM_CUBE_INT_BIAS,
+       PROGRAM_CUBE_UINT_BIAS,
+       PROGRAM_CUBE_SHADOW_BIAS,
+
+       PROGRAM_1D_ARRAY_FLOAT,
+       PROGRAM_1D_ARRAY_INT,
+       PROGRAM_1D_ARRAY_UINT,
+       PROGRAM_1D_ARRAY_SHADOW,
+
+       PROGRAM_2D_ARRAY_FLOAT,
+       PROGRAM_2D_ARRAY_INT,
+       PROGRAM_2D_ARRAY_UINT,
+       PROGRAM_2D_ARRAY_SHADOW,
+
+       PROGRAM_3D_FLOAT,
+       PROGRAM_3D_INT,
+       PROGRAM_3D_UINT,
+
+       PROGRAM_3D_FLOAT_BIAS,
+       PROGRAM_3D_INT_BIAS,
+       PROGRAM_3D_UINT_BIAS,
+
+       PROGRAM_CUBE_ARRAY_FLOAT,
+       PROGRAM_CUBE_ARRAY_INT,
+       PROGRAM_CUBE_ARRAY_UINT,
+       PROGRAM_CUBE_ARRAY_SHADOW,
+
+       PROGRAM_BUFFER_FLOAT,
+       PROGRAM_BUFFER_INT,
+       PROGRAM_BUFFER_UINT,
+
+       PROGRAM_LAST
+};
+
+void initializePrograms(vk::SourceCollections& programCollection, glu::Precision texCoordPrecision, const std::vector<Program>& programs);
+
+typedef de::SharedPtr<pipeline::TestTexture>           TestTextureSp;
+typedef de::SharedPtr<pipeline::TestTexture2D>         TestTexture2DSp;
+typedef de::SharedPtr<pipeline::TestTextureCube>       TestTextureCubeSp;
+typedef de::SharedPtr<pipeline::TestTexture2DArray>    TestTexture2DArraySp;
+typedef de::SharedPtr<pipeline::TestTexture3D>         TestTexture3DSp;
+
+class TextureBinding {
+public:
+       enum Type
+       {
+               TYPE_NONE = 0,
+               TYPE_2D,
+               TYPE_CUBE_MAP,
+               TYPE_2D_ARRAY,
+               TYPE_3D,
+
+               TYPE_LAST
+       };
+                                                                               TextureBinding                          (Context& context);
+                                                                               TextureBinding                          (Context& context, const TestTextureSp& textureData, const Type type);
+       vk::VkImage                                                     getImage                                        (void) { return *m_textureImage; }
+       vk::VkImageView                                         getImageView                            (void) { return *m_textureImageView; }
+       Type                                                            getType                                         (void) { return m_type; }
+       const pipeline::TestTexture&            getTestTexture                          (void) { return *m_textureData; }
+       void                                                            updateTextureViewMipLevels      (deUint32 baseLevel, deUint32 maxLevel);
+
+private:
+                                                                               TextureBinding                          (const TextureBinding&);        // not allowed!
+       TextureBinding&                                         operator=                                       (const TextureBinding&);        // not allowed!
+
+       void                                                            updateTextureData                       (const TestTextureSp& textureData, const Type type);
+
+       Context&                                                        m_context;
+       Type                                                            m_type;
+       TestTextureSp                                           m_textureData;
+       vk::Move<vk::VkImage>                           m_textureImage;
+       de::MovePtr<vk::Allocation>                     m_textureImageMemory;
+       vk::Move<vk::VkImageView>                       m_textureImageView;
+};
+
+typedef de::SharedPtr<TextureBinding>  TextureBindingSp;
+
+class TextureRenderer
+{
+public:
+                                                                               TextureRenderer                         (Context& context, vk::VkSampleCountFlagBits sampleCount, deUint32 renderWidth, deUint32 renderHeight);
+                                                                               ~TextureRenderer                        (void);
+
+       void                                                            renderQuad                                      (tcu::Surface& result, int texUnit, const float* texCoord, glu::TextureTestUtil::TextureType texType);
+       void                                                            renderQuad                                      (tcu::Surface& result, int texUnit, const float* texCoord, const glu::TextureTestUtil::ReferenceParams& params);
+
+       void                                                            clearImage                                      (vk::VkImage image);
+       void                                                            add2DTexture                            (const TestTexture2DSp& texture);
+       const pipeline::TestTexture2D&          get2DTexture                            (int textureIndex) const;
+
+       void                                                            addCubeTexture                          (const TestTextureCubeSp& texture);
+       const pipeline::TestTextureCube&        getCubeTexture                          (int textureIndex) const;
+
+       void                                                            add2DArrayTexture                       (const TestTexture2DArraySp& texture);
+       const pipeline::TestTexture2DArray&     get2DArrayTexture                       (int textureIndex) const;
+
+       void                                                            add3DTexture                            (const TestTexture3DSp& texture);
+       const pipeline::TestTexture3D&          get3DTexture                            (int textureIndex) const;
+
+       void                                                            setViewport                                     (float viewportX, float viewportY, float viewportW, float viewportH);
+
+       TextureBinding*                                         getTextureBinding                       (int textureIndex) const;
+
+       deUint32                                                        getRenderWidth                          (void) const;
+       deUint32                                                        getRenderHeight                         (void) const;
+
+protected:
+                                                                               TextureRenderer                         (const TextureRenderer& other);
+       TextureRenderer&                                        operator=                                       (const TextureRenderer& other);
+
+       Context&                                                        m_context;
+       tcu::TestLog&                                           m_log;
+
+       const deUint32                                          m_renderWidth;
+       const deUint32                                          m_renderHeight;
+       const vk::VkSampleCountFlagBits         m_sampleCount;
+       const deBool                                            m_multisampling;
+
+       const vk::VkFormat                                      m_imageFormat;
+       const tcu::TextureFormat                        m_textureFormat;
+
+       vk::Move<vk::VkImage>                           m_image;
+       de::MovePtr<vk::Allocation>                     m_imageMemory;
+       vk::Move<vk::VkImageView>                       m_imageView;
+
+       vk::Move<vk::VkImage>                           m_resolvedImage;
+       de::MovePtr<vk::Allocation>                     m_resolvedImageMemory;
+       vk::Move<vk::VkImageView>                       m_resolvedImageView;
+
+       vk::Move<vk::VkCommandPool>                     m_commandPool;
+       vk::Move<vk::VkRenderPass>                      m_renderPass;
+       vk::Move<vk::VkFramebuffer>                     m_frameBuffer;
+
+       vk::Move<vk::VkDescriptorPool>          m_descriptorPool;
+
+       vk::Move<vk::VkBuffer>                          m_uniformBuffer;
+       de::MovePtr<vk::Allocation>                     m_uniformBufferMemory;
+       const vk::VkDeviceSize                          m_uniformBufferSize;
+
+       vk::Move<vk::VkBuffer>                          m_vertexIndexBuffer;
+       de::MovePtr<vk::Allocation>                     m_vertexIndexBufferMemory;
+       static const vk::VkDeviceSize           s_vertexIndexBufferSize;
+       static const deUint16                           s_vertexIndices[6];
+
+       vk::Move<vk::VkFence>                           m_fence;
+
+       vk::Move<vk::VkBuffer>                          m_resultBuffer;
+       de::MovePtr<vk::Allocation>                     m_resultBufferMemory;
+       const vk::VkDeviceSize                          m_resultBufferSize;
+
+       std::vector<TextureBindingSp>           m_textureBindings;
+
+       float                                                           m_viewportOffsetX;
+       float                                                           m_viewportOffsetY;
+       float                                                           m_viewportWidth;
+       float                                                           m_viewportHeight;
+
+private:
+       vk::Move<vk::VkDescriptorSet>           makeDescriptorSet                       (const vk::VkDescriptorPool descriptorPool, const vk::VkDescriptorSetLayout setLayout) const;
+       void                                                            addImageTransitionBarrier       (vk::VkCommandBuffer commandBuffer, vk::VkImage image, vk::VkPipelineStageFlags srcStageMask, vk::VkPipelineStageFlags dstStageMask, vk::VkAccessFlags srcAccessMask, vk::VkAccessFlags dstAccessMask, vk::VkImageLayout oldLayout, vk::VkImageLayout newLayout) const;
+
+};
+
+tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::WrapMode wrapW, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode);
+tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode);
+tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode);
+
+TestTexture2DSp loadTexture2D (const tcu::Archive& archive, const std::vector<std::string>& filenames);
+TestTextureCubeSp loadTextureCube (const tcu::Archive& archive, const std::vector<std::string>& filenames);
+
+template <typename INSTANCE_TYPE>
+class TextureTestCase : public TestCase
+{
+public:
+                                                                               TextureTestCase (tcu::TestContext& context, const std::string& name, const std::string& description, const typename INSTANCE_TYPE::ParameterType& testParameters)
+                                                                                               : TestCase                              (context, name, description)
+                                                                                               , m_testsParameters             (testParameters)
+                                                                               {}
+
+       virtual TestInstance*                           createInstance                          (Context& context) const
+                                                                               {
+                                                                                       return new INSTANCE_TYPE(context, m_testsParameters);
+                                                                               }
+
+       virtual void                                            initPrograms                            (vk::SourceCollections& programCollection) const
+                                                                               {
+                                                                                       initializePrograms(programCollection, m_testsParameters.texCoordPrecision, m_testsParameters.programs);
+                                                                               }
+
+protected:
+       const typename INSTANCE_TYPE::ParameterType m_testsParameters;
+};
+
+struct TextureCommonTestCaseParameters
+{
+                                                               TextureCommonTestCaseParameters (void);
+
+       vk::VkSampleCountFlagBits       sampleCount;
+       glu::Precision                          texCoordPrecision;
+
+       tcu::Sampler::FilterMode        minFilter;
+       tcu::Sampler::FilterMode        magFilter;
+       tcu::Sampler::WrapMode          wrapS;
+       tcu::Sampler::WrapMode          wrapT;
+
+       vk::VkFormat                            format;
+
+       std::vector<util::Program>      programs;
+};
+
+struct Texture2DTestCaseParameters : public TextureCommonTestCaseParameters
+{
+                                                               Texture2DTestCaseParameters             (void);
+       int                                                     width;
+       int                                                     height;
+};
+
+struct TextureCubeTestCaseParameters : public TextureCommonTestCaseParameters
+{
+                                                               TextureCubeTestCaseParameters   (void);
+       int                                                     size;
+};
+
+struct Texture2DArrayTestCaseParameters : public Texture2DTestCaseParameters
+{
+                                                               Texture2DArrayTestCaseParameters(void);
+       int                                                     numLayers;
+};
+
+struct Texture3DTestCaseParameters : public Texture2DTestCaseParameters
+{
+                                                               Texture3DTestCaseParameters             (void);
+       tcu::Sampler::WrapMode          wrapR;
+       int                                                     depth;
+};
+
+} // util
+} // texture
+} // vkt
+
+#endif // _VKTTEXTURETESTUTIL_HPP
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureTests.cpp b/external/vulkancts/modules/vulkan/texture/vktTextureTests.cpp
new file mode 100644 (file)
index 0000000..897cea4
--- /dev/null
@@ -0,0 +1,56 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Texture tests.
+ *//*--------------------------------------------------------------------*/
+
+#include "vktTextureTests.hpp"
+#include "vktTestGroupUtil.hpp"
+#include "vktTextureFilteringTests.hpp"
+#include "vktTextureMipmapTests.hpp"
+#include "vktTextureFilteringExplicitLodTests.hpp"
+
+namespace vkt
+{
+namespace texture
+{
+namespace
+{
+
+void createTextureTests (tcu::TestCaseGroup* textureTests)
+{
+       tcu::TestContext&       testCtx = textureTests->getTestContext();
+
+       textureTests->addChild(createTextureFilteringTests      (testCtx));
+       textureTests->addChild(createTextureMipmappingTests     (testCtx));
+       textureTests->addChild(createExplicitLodTests           (testCtx));
+}
+
+} // anonymous
+
+tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx)
+{
+       return createTestGroup(testCtx, "texture", "Texture Tests", createTextureTests);
+}
+
+} // texture
+} // vkt
diff --git a/external/vulkancts/modules/vulkan/texture/vktTextureTests.hpp b/external/vulkancts/modules/vulkan/texture/vktTextureTests.hpp
new file mode 100644 (file)
index 0000000..35d3cdb
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef _VKTTEXTURETESTS_HPP
+#define _VKTTEXTURETESTS_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2016 The Khronos Group Inc.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *//*!
+ * \file
+ * \brief Functional texture tests.
+ *//*--------------------------------------------------------------------*/
+
+#include "tcuDefs.hpp"
+#include "tcuTestCase.hpp"
+
+namespace vkt
+{
+namespace texture
+{
+
+tcu::TestCaseGroup*            createTests     (tcu::TestContext& testCtx);
+
+} // texture
+} // vkt
+
+#endif // _VKTTEXTURETESTS_HPP
diff --git a/external/vulkancts/modules/vulkan/texture_filtering/CMakeLists.txt b/external/vulkancts/modules/vulkan/texture_filtering/CMakeLists.txt
deleted file mode 100644 (file)
index 01861e9..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-include_directories(.. ../shaderexecutor)
-
-set(DEQP_VK_TEXTURE_FILTERING_SRCS
-  vktTextureFilteringTests.cpp
-  vktTextureFilteringTests.hpp
-  vktSampleVerifier.cpp
-  vktSampleVerifier.hpp
-  vktSampleVerifierUtil.cpp
-  vktSampleVerifierUtil.hpp
-  vktTextureFilteringExplicitLodTests.cpp
-  vktTextureFilteringExplicitLodTests.hpp
-)
-
-set(DEQP_VK_TEXTURE_FILTERING_LIBS
-  deqp-vk-common
-  deqp-vk-shaderexecutor
-  tcutil
-  vkutil
-)
-
-add_library(deqp-vk-texture-filtering STATIC ${DEQP_VK_TEXTURE_FILTERING_SRCS})
-target_link_libraries(deqp-vk-texture-filtering ${DEQP_VK_TEXTURE_FITLERING_LIBS})
index 8b39504..7231823 100644 (file)
@@ -59,7 +59,6 @@
 #include "vktShaderRenderTextureGatherTests.hpp"
 #include "vktShaderBuiltinTests.hpp"
 #include "vktOpaqueTypeIndexingTests.hpp"
-#include "vktTextureFilteringTests.hpp"
 #include "vktUniformBlockTests.hpp"
 #include "vktDynamicStateTests.hpp"
 #include "vktSSBOLayoutTests.hpp"
@@ -75,6 +74,7 @@
 #include "vktRasterizationTests.hpp"
 #include "vktClippingTests.hpp"
 #include "vktFragmentOperationsTests.hpp"
+#include "vktTextureTests.hpp"
 
 #include <vector>
 #include <sstream>
@@ -394,8 +394,8 @@ void TestPackage::init (void)
        addChild(tessellation::createTests              (m_testCtx));
        addChild(rasterization::createTests             (m_testCtx));
        addChild(clipping::createTests                  (m_testCtx));
-       addChild(texture_filtering::createTests (m_testCtx));
        addChild(FragmentOperations::createTests(m_testCtx));
+       addChild(texture::createTests                   (m_testCtx));
 }
 
 } // vkt
index 064efed..1d927b0 100644 (file)
@@ -331,4 +331,7 @@ dEQP-VK.api.copy_and_blit.blit_image.all_formats.a1r5g5b5_unorm_pack16_r32g32b32
 dEQP-VK.spirv_assembly.instruction.compute.opfunord.*
 
 # New tests from AOSP
-dEQP-VK.texture_filtering.*
+dEQP-VK.texture.explicit_lod.*
+
+# Exclude tests which are not on the Android CTS mustpass list
+dEQP-VK.texture.mipmap.2d.projected.*
index f0953ab..f5bf7fd 100644 (file)
@@ -11978,6 +11978,18 @@ dEQP-VK.api.copy_and_blit.resolve_image.with_regions_8_bit
 dEQP-VK.api.copy_and_blit.resolve_image.with_regions_16_bit
 dEQP-VK.api.copy_and_blit.resolve_image.with_regions_32_bit
 dEQP-VK.api.copy_and_blit.resolve_image.with_regions_64_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_2_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_4_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_8_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_16_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_32_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_copy_before_resolving_64_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_2_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_4_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_8_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_16_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_32_bit
+dEQP-VK.api.copy_and_blit.resolve_image.whole_array_image_64_bit
 dEQP-VK.api.image_clearing.clear_color_image.1d_r4g4_unorm_pack8
 dEQP-VK.api.image_clearing.clear_color_image.1d_r4g4b4a4_unorm_pack16
 dEQP-VK.api.image_clearing.clear_color_image.1d_b4g4r4a4_unorm_pack16
@@ -67824,14 +67836,6 @@ dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_clear_depth_stencil_im
 dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_resolve_image_method
 dEQP-VK.pipeline.timestamp.transfer_tests.host_stage_with_copy_query_pool_results_method
 dEQP-VK.pipeline.timestamp.misc_tests.timestamp_only
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_depth
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_stencil
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_depth
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_stencil
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_depth_no_attachment
-dEQP-VK.pipeline.early_fragment.no_early_fragment_tests_stencil_no_attachment
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_depth_no_attachment
-dEQP-VK.pipeline.early_fragment.early_fragment_tests_stencil_no_attachment
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_fragment_stage
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_geometry_stage_fragment_stage
 dEQP-VK.pipeline.cache.graphics_tests.vertex_stage_tessellation_control_stage_tessellation_evaluation_stage_fragment_stage
@@ -96277,6 +96281,240 @@ dEQP-VK.image.load_store.buffer.r8g8b8a8_sint
 dEQP-VK.image.load_store.buffer.r32_sint
 dEQP-VK.image.load_store.buffer.r8g8b8a8_unorm
 dEQP-VK.image.load_store.buffer.r8g8b8a8_snorm
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32g32b32a32_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r16g16b16a16_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d.r32_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_2
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_4
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_8
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_16
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_32
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_unorm.samples_64
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_2
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_4
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_8
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_16
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_32
+dEQP-VK.image.load_store_multisample.2d.r8g8b8a8_snorm.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sfloat_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sfloat_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_sfloat_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_uint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_uint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_uint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_uint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32g32b32a32_sint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r16g16b16a16_sint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_sint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r32_sint_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_unorm_single_layer.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm.samples_64
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_2
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_4
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_8
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_16
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_32
+dEQP-VK.image.load_store_multisample.2d_array.r8g8b8a8_snorm_single_layer.samples_64
 dEQP-VK.image.format_reinterpret.1d.r32g32b32a32_sfloat_r32g32b32a32_uint
 dEQP-VK.image.format_reinterpret.1d.r32g32b32a32_sfloat_r32g32b32a32_sint
 dEQP-VK.image.format_reinterpret.1d.r16g16b16a16_sfloat_r16g16b16a16_uint
@@ -109367,3 +109605,3019 @@ dEQP-VK.fragment_operations.scissor.triangles.inside
 dEQP-VK.fragment_operations.scissor.triangles.partially_inside
 dEQP-VK.fragment_operations.scissor.triangles.outside
 dEQP-VK.fragment_operations.scissor.triangles.crossing
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_1
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_2
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_3
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_4
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_5
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_6
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_7
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_8
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_9
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_10
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_11
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_12
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_13
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_14
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_15
+dEQP-VK.fragment_operations.scissor.multi_viewport.scissor_16
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_depth
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_stencil
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_depth
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_stencil
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_depth_no_attachment
+dEQP-VK.fragment_operations.early_fragment.no_early_fragment_tests_stencil_no_attachment
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_depth_no_attachment
+dEQP-VK.fragment_operations.early_fragment.early_fragment_tests_stencil_no_attachment
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_nearest
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_linear
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r16g16b16a16_sfloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_nearest
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_linear
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.b10g11r11_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_nearest
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_linear
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.e5b9g9r9_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r8g8b8a8_snorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_linear
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r5g6b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_nearest
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_linear
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r4g4b4a4_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_linear
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.r5g5b5a1_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_nearest
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_linear
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.a8b8g8r8_srgb_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_nearest
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_linear
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.formats.a1r5g5b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.4x8_nearest
+dEQP-VK.texture.filtering.2d.sizes.4x8_linear
+dEQP-VK.texture.filtering.2d.sizes.4x8_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.4x8_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.4x8_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.4x8_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.32x64_nearest
+dEQP-VK.texture.filtering.2d.sizes.32x64_linear
+dEQP-VK.texture.filtering.2d.sizes.32x64_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.32x64_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.32x64_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.32x64_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.128x128_nearest
+dEQP-VK.texture.filtering.2d.sizes.128x128_linear
+dEQP-VK.texture.filtering.2d.sizes.128x128_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.128x128_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.128x128_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.128x128_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.3x7_nearest
+dEQP-VK.texture.filtering.2d.sizes.3x7_linear
+dEQP-VK.texture.filtering.2d.sizes.3x7_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.3x7_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.3x7_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.3x7_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.31x55_nearest
+dEQP-VK.texture.filtering.2d.sizes.31x55_linear
+dEQP-VK.texture.filtering.2d.sizes.31x55_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.31x55_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.31x55_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.31x55_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.127x99_nearest
+dEQP-VK.texture.filtering.2d.sizes.127x99_linear
+dEQP-VK.texture.filtering.2d.sizes.127x99_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.127x99_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d.sizes.127x99_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d.sizes.127x99_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_nearest
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_linear
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r16g16b16a16_sfloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_nearest
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_linear
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.b10g11r11_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_nearest
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_linear
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.e5b9g9r9_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r8g8b8a8_snorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_linear
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r5g6b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_nearest
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_linear
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r4g4b4a4_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_linear
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.r5g5b5a1_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_nearest
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_linear
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.a8b8g8r8_srgb_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_nearest
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_linear
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.formats.a1r5g5b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.8x8_nearest
+dEQP-VK.texture.filtering.cube.sizes.8x8_linear
+dEQP-VK.texture.filtering.cube.sizes.8x8_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.8x8_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.8x8_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.8x8_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.64x64_nearest
+dEQP-VK.texture.filtering.cube.sizes.64x64_linear
+dEQP-VK.texture.filtering.cube.sizes.64x64_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.64x64_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.64x64_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.64x64_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.128x128_nearest
+dEQP-VK.texture.filtering.cube.sizes.128x128_linear
+dEQP-VK.texture.filtering.cube.sizes.128x128_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.128x128_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.128x128_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.128x128_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.7x7_nearest
+dEQP-VK.texture.filtering.cube.sizes.7x7_linear
+dEQP-VK.texture.filtering.cube.sizes.7x7_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.7x7_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.7x7_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.7x7_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.63x63_nearest
+dEQP-VK.texture.filtering.cube.sizes.63x63_linear
+dEQP-VK.texture.filtering.cube.sizes.63x63_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.63x63_linear_mipmap_nearest
+dEQP-VK.texture.filtering.cube.sizes.63x63_nearest_mipmap_linear
+dEQP-VK.texture.filtering.cube.sizes.63x63_linear_mipmap_linear
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.cube.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.cube.no_edges_visible.nearest
+dEQP-VK.texture.filtering.cube.no_edges_visible.linear
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_linear
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r16g16b16a16_sfloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_nearest
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_linear
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.b10g11r11_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_nearest
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_linear
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.e5b9g9r9_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r8g8b8a8_snorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g6b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r4g4b4a4_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.r5g5b5a1_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_linear
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.a8b8g8r8_srgb_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_linear
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.formats.a1r5g5b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_linear
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.4x8x8_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_linear
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.32x64x16_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_linear
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.128x32x64_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_linear
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.3x7x5_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_linear
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_linear_mipmap_nearest
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_nearest_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.sizes.63x63x63_linear_mipmap_linear
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.2d_array.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_nearest
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_linear
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r16g16b16a16_sfloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_nearest
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_linear
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.b10g11r11_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_nearest
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_linear
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.e5b9g9r9_ufloat_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r8g8b8a8_snorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_linear
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r5g6b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_nearest
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_linear
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r4g4b4a4_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_linear
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.r5g5b5a1_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_nearest
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_linear
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.a8b8g8r8_srgb_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_nearest
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_linear
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.formats.a1r5g5b5_unorm_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_nearest
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_linear
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.4x8x8_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_nearest
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_linear
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.32x64x16_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_nearest
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_linear
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.128x32x64_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_nearest
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_linear
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.3x7x5_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_nearest
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_linear
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_nearest_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_linear_mipmap_nearest
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_nearest_mipmap_linear
+dEQP-VK.texture.filtering.3d.sizes.63x63x63_linear_mipmap_linear
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_nearest_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.nearest_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_nearest_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirrored_repeat_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_clamp_to_border_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirrored_repeat_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_clamp_to_border_mirror_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirrored_repeat
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_edge
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_clamp_to_border
+dEQP-VK.texture.filtering.3d.combinations.linear_mipmap_linear_linear_mirror_clamp_to_edge_mirror_clamp_to_edge_mirror_clamp_to_edge
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_clamp
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_clamp_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_clamp_non_square
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_repeat
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_repeat_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_repeat_non_square
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_mirror
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_mirror_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_nearest_mirror_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_clamp
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_clamp_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_clamp_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_repeat
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_repeat_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_repeat_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_mirror
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_mirror_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_nearest_mirror_non_square
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_clamp
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_clamp_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_clamp_non_square
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_repeat
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_repeat_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_repeat_non_square
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_mirror
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_mirror_npot
+dEQP-VK.texture.mipmap.2d.basic.nearest_linear_mirror_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_clamp
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_clamp_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_clamp_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_repeat
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_repeat_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_repeat_non_square
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_mirror
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_mirror_npot
+dEQP-VK.texture.mipmap.2d.basic.linear_linear_mirror_non_square
+dEQP-VK.texture.mipmap.2d.affine.nearest_nearest_clamp
+dEQP-VK.texture.mipmap.2d.affine.nearest_nearest_repeat
+dEQP-VK.texture.mipmap.2d.affine.nearest_nearest_mirror
+dEQP-VK.texture.mipmap.2d.affine.linear_nearest_clamp
+dEQP-VK.texture.mipmap.2d.affine.linear_nearest_repeat
+dEQP-VK.texture.mipmap.2d.affine.linear_nearest_mirror
+dEQP-VK.texture.mipmap.2d.affine.nearest_linear_clamp
+dEQP-VK.texture.mipmap.2d.affine.nearest_linear_repeat
+dEQP-VK.texture.mipmap.2d.affine.nearest_linear_mirror
+dEQP-VK.texture.mipmap.2d.affine.linear_linear_clamp
+dEQP-VK.texture.mipmap.2d.affine.linear_linear_repeat
+dEQP-VK.texture.mipmap.2d.affine.linear_linear_mirror
+dEQP-VK.texture.mipmap.2d.bias.nearest_nearest
+dEQP-VK.texture.mipmap.2d.bias.linear_nearest
+dEQP-VK.texture.mipmap.2d.bias.nearest_linear
+dEQP-VK.texture.mipmap.2d.bias.linear_linear
+dEQP-VK.texture.mipmap.2d.min_lod.nearest_nearest
+dEQP-VK.texture.mipmap.2d.min_lod.linear_nearest
+dEQP-VK.texture.mipmap.2d.min_lod.nearest_linear
+dEQP-VK.texture.mipmap.2d.min_lod.linear_linear
+dEQP-VK.texture.mipmap.2d.max_lod.nearest_nearest
+dEQP-VK.texture.mipmap.2d.max_lod.linear_nearest
+dEQP-VK.texture.mipmap.2d.max_lod.nearest_linear
+dEQP-VK.texture.mipmap.2d.max_lod.linear_linear
+dEQP-VK.texture.mipmap.2d.base_level.nearest_nearest
+dEQP-VK.texture.mipmap.2d.base_level.linear_nearest
+dEQP-VK.texture.mipmap.2d.base_level.nearest_linear
+dEQP-VK.texture.mipmap.2d.base_level.linear_linear
+dEQP-VK.texture.mipmap.2d.max_level.nearest_nearest
+dEQP-VK.texture.mipmap.2d.max_level.linear_nearest
+dEQP-VK.texture.mipmap.2d.max_level.nearest_linear
+dEQP-VK.texture.mipmap.2d.max_level.linear_linear
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.linear_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.nearest_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.basic.linear_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.linear_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.nearest_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.projected.linear_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.linear_nearest_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.nearest_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_nearest_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_nearest_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_nearest_mirror
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_linear_clamp
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_linear_repeat
+dEQP-VK.texture.mipmap.cubemap.bias.linear_linear_linear_mirror
+dEQP-VK.texture.mipmap.cubemap.min_lod.nearest_nearest
+dEQP-VK.texture.mipmap.cubemap.min_lod.linear_nearest
+dEQP-VK.texture.mipmap.cubemap.min_lod.nearest_linear
+dEQP-VK.texture.mipmap.cubemap.min_lod.linear_linear
+dEQP-VK.texture.mipmap.cubemap.max_lod.nearest_nearest
+dEQP-VK.texture.mipmap.cubemap.max_lod.linear_nearest
+dEQP-VK.texture.mipmap.cubemap.max_lod.nearest_linear
+dEQP-VK.texture.mipmap.cubemap.max_lod.linear_linear
+dEQP-VK.texture.mipmap.cubemap.base_level.nearest_nearest
+dEQP-VK.texture.mipmap.cubemap.base_level.linear_nearest
+dEQP-VK.texture.mipmap.cubemap.base_level.nearest_linear
+dEQP-VK.texture.mipmap.cubemap.base_level.linear_linear
+dEQP-VK.texture.mipmap.cubemap.max_level.nearest_nearest
+dEQP-VK.texture.mipmap.cubemap.max_level.linear_nearest
+dEQP-VK.texture.mipmap.cubemap.max_level.nearest_linear
+dEQP-VK.texture.mipmap.cubemap.max_level.linear_linear
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_clamp
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_clamp_npot
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_repeat
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_repeat_npot
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_mirror
+dEQP-VK.texture.mipmap.3d.basic.nearest_nearest_mirror_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_clamp
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_clamp_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_repeat
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_repeat_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_mirror
+dEQP-VK.texture.mipmap.3d.basic.linear_nearest_mirror_npot
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_clamp
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_clamp_npot
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_repeat
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_repeat_npot
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_mirror
+dEQP-VK.texture.mipmap.3d.basic.nearest_linear_mirror_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_clamp
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_clamp_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_repeat
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_repeat_npot
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_mirror
+dEQP-VK.texture.mipmap.3d.basic.linear_linear_mirror_npot
+dEQP-VK.texture.mipmap.3d.affine.nearest_nearest_clamp
+dEQP-VK.texture.mipmap.3d.affine.nearest_nearest_repeat
+dEQP-VK.texture.mipmap.3d.affine.nearest_nearest_mirror
+dEQP-VK.texture.mipmap.3d.affine.linear_nearest_clamp
+dEQP-VK.texture.mipmap.3d.affine.linear_nearest_repeat
+dEQP-VK.texture.mipmap.3d.affine.linear_nearest_mirror
+dEQP-VK.texture.mipmap.3d.affine.nearest_linear_clamp
+dEQP-VK.texture.mipmap.3d.affine.nearest_linear_repeat
+dEQP-VK.texture.mipmap.3d.affine.nearest_linear_mirror
+dEQP-VK.texture.mipmap.3d.affine.linear_linear_clamp
+dEQP-VK.texture.mipmap.3d.affine.linear_linear_repeat
+dEQP-VK.texture.mipmap.3d.affine.linear_linear_mirror
+dEQP-VK.texture.mipmap.3d.projected.nearest_nearest_clamp
+dEQP-VK.texture.mipmap.3d.projected.nearest_nearest_repeat
+dEQP-VK.texture.mipmap.3d.projected.nearest_nearest_mirror
+dEQP-VK.texture.mipmap.3d.projected.linear_nearest_clamp
+dEQP-VK.texture.mipmap.3d.projected.linear_nearest_repeat
+dEQP-VK.texture.mipmap.3d.projected.linear_nearest_mirror
+dEQP-VK.texture.mipmap.3d.projected.nearest_linear_clamp
+dEQP-VK.texture.mipmap.3d.projected.nearest_linear_repeat
+dEQP-VK.texture.mipmap.3d.projected.nearest_linear_mirror
+dEQP-VK.texture.mipmap.3d.projected.linear_linear_clamp
+dEQP-VK.texture.mipmap.3d.projected.linear_linear_repeat
+dEQP-VK.texture.mipmap.3d.projected.linear_linear_mirror
+dEQP-VK.texture.mipmap.3d.bias.nearest_nearest
+dEQP-VK.texture.mipmap.3d.bias.linear_nearest
+dEQP-VK.texture.mipmap.3d.bias.nearest_linear
+dEQP-VK.texture.mipmap.3d.bias.linear_linear
+dEQP-VK.texture.mipmap.3d.min_lod.nearest_nearest
+dEQP-VK.texture.mipmap.3d.min_lod.linear_nearest
+dEQP-VK.texture.mipmap.3d.min_lod.nearest_linear
+dEQP-VK.texture.mipmap.3d.min_lod.linear_linear
+dEQP-VK.texture.mipmap.3d.max_lod.nearest_nearest
+dEQP-VK.texture.mipmap.3d.max_lod.linear_nearest
+dEQP-VK.texture.mipmap.3d.max_lod.nearest_linear
+dEQP-VK.texture.mipmap.3d.max_lod.linear_linear
+dEQP-VK.texture.mipmap.3d.base_level.nearest_nearest
+dEQP-VK.texture.mipmap.3d.base_level.linear_nearest
+dEQP-VK.texture.mipmap.3d.base_level.nearest_linear
+dEQP-VK.texture.mipmap.3d.base_level.linear_linear
+dEQP-VK.texture.mipmap.3d.max_level.nearest_nearest
+dEQP-VK.texture.mipmap.3d.max_level.linear_nearest
+dEQP-VK.texture.mipmap.3d.max_level.nearest_linear
+dEQP-VK.texture.mipmap.3d.max_level.linear_linear