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 \
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 \
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 \
$(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
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
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
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
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
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
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
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
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
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
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
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
};
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;
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*);
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;
/* 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;
#include "vkBasicTypes.inl"
+#define VK_CORE_FORMAT_LAST ((vk::VkFormat)(vk::VK_FORMAT_ASTC_12x12_SRGB_BLOCK+1))
+
namespace wsi
{
{
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);
+}
CmdDebugMarkerBeginEXTFunc cmdDebugMarkerBeginEXT;
CmdDebugMarkerEndEXTFunc cmdDebugMarkerEndEXT;
CmdDebugMarkerInsertEXTFunc cmdDebugMarkerInsertEXT;
+CmdDrawIndirectCountAMDFunc cmdDrawIndirectCountAMD;
+CmdDrawIndexedIndirectCountAMDFunc cmdDrawIndexedIndirectCountAMD;
+GetMemoryWin32HandleNVFunc getMemoryWin32HandleNV;
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);
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)
{
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:
#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))
{
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)
{
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)
{
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)
{
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;
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);
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
};
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);
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");
/* 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");
{
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);
+}
/* 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;
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),
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[] =
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),
};
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);
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);
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)
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;
}
}
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;
}
}
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);
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;
+}
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;
+};
+
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;
/* 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;
"vkCreateDebugReportCallbackEXT",
"vkDestroyDebugReportCallbackEXT",
"vkDebugReportMessageEXT",
+
+ # VK_NV_external_memory_capabilities
+ "vkGetPhysicalDeviceExternalImageFormatPropertiesNV"
]
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
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
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)
add_subdirectory(spirv_assembly)
add_subdirectory(shaderrender)
add_subdirectory(shaderexecutor)
-add_subdirectory(texture_filtering)
add_subdirectory(memory)
add_subdirectory(ubo)
add_subdirectory(dynamic_state)
add_subdirectory(synchronization)
add_subdirectory(clipping)
add_subdirectory(fragment_ops)
+add_subdirectory(texture)
include_directories(
api
spirv_assembly
shaderrender
shaderexecutor
- texture_filtering
memory
ubo
dynamic_state
synchronization
clipping
fragment_ops
+ texture
)
set(DEQP_VK_COMMON_SRCS
deqp-vk-spirv-assembly
deqp-vk-shaderrender
deqp-vk-shaderexecutor
- deqp-vk-texture-filtering
deqp-vk-memory
deqp-vk-ubo
deqp-vk-dynamic-state
deqp-vk-synchronization
deqp-vk-clipping
deqp-vk-fragment-ops
+ deqp-vk-texture
)
add_library(deqp-vk-common STATIC ${DEQP_VK_COMMON_SRCS})
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;
#include "deStringUtil.hpp"
#include "deUniquePtr.hpp"
+#include "deMath.h"
#include "tcuImageCompare.hpp"
#include "tcuTexture.hpp"
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;
};
};
+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:
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
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)
{
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;
};
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();
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
{
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 =
{
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;
}
};
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[] =
(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;
(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;
},
};
(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)
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
{
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
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;
}
};
{
{
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;
},
};
(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;
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.
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();
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());
}
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();
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));
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();
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());
}
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();
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());
}
// 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;
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;
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))
// 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.
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 |
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] =
{
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 =
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 =
{
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);
+ }
}
}
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();
{
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;
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
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;
}
},
};
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 =
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)
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
" 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"
VK_FORMAT_R8_SINT,
VK_FORMAT_R8_SRGB,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormats16Bit[] =
{
VK_FORMAT_R16_SINT,
VK_FORMAT_R16_SFLOAT,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormats24Bit[] =
{
VK_FORMAT_B8G8R8_SINT,
VK_FORMAT_B8G8R8_SRGB,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormats32Bit[] =
{
VK_FORMAT_R32_SINT,
VK_FORMAT_R32_SFLOAT,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormats48Bit[] =
{
VK_FORMAT_R16G16B16_SINT,
VK_FORMAT_R16G16B16_SFLOAT,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormats64Bit[] =
{
VK_FORMAT_R64_SINT,
VK_FORMAT_R64_SFLOAT,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormats96Bit[] =
{
VK_FORMAT_R32G32B32_SINT,
VK_FORMAT_R32G32B32_SFLOAT,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormats128Bit[] =
{
VK_FORMAT_R64G64_SINT,
VK_FORMAT_R64G64_SFLOAT,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormats192Bit[] =
{
VK_FORMAT_R64G64B64_SINT,
VK_FORMAT_R64G64B64_SFLOAT,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormats256Bit[] =
{
VK_FORMAT_R64G64B64A64_SINT,
VK_FORMAT_R64G64B64A64_SFLOAT,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat* colorImageFormatsToTest[] =
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;
VK_FORMAT_R64G64B64_UINT,
VK_FORMAT_R64G64B64A64_UINT,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormatsSInts[] =
{
VK_FORMAT_R64G64B64_SINT,
VK_FORMAT_R64G64B64A64_SINT,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormatsFloats[] =
{
// VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
// VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const VkFormat compatibleFormatsSrgb[] =
{
// VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
// VK_FORMAT_ASTC_12x12_SRGB_BLOCK,
- VK_FORMAT_LAST
+ VK_FORMAT_UNDEFINED
};
const struct {
{
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;
// 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 =
{
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 =
{
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 =
{
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 =
{
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 =
{
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)
{
// 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 =
{
// 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 =
{
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 =
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 =
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 =
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 =
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));
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;
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));
// 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++)
{
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);
blittingImageTests->addChild(blitImgSimpleTests.release());
blittingImageTests->addChild(blitImgAllFormatsTests.release());
-
// Resolve image to image testcases.
const VkSampleCountFlagBits samples[] =
{
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 =
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 =
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 =
}
}
+ {
+ 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());
{
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);
{}
ImageFormatPropertyCase (void)
- : format (VK_FORMAT_LAST)
+ : format (VK_FORMAT_UNDEFINED)
, imageType (VK_IMAGE_TYPE_LAST)
, tiling (VK_IMAGE_TILING_LAST)
{}
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);
{
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
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
* \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)
// 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[] =
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);
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
// 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);
// 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;
return testGroup.release();
}
-} // pipeline
+} // FragmentOperations
} // vkt
-#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
#include "vktFragmentOperationsMakeUtil.hpp"
#include "vkTypeUtil.hpp"
#include "vkPrograms.hpp"
-#include "vkRefUtil.hpp"
#include "vkQueryUtil.hpp"
#include <vector>
#include "vkDefs.hpp"
#include "vkRef.hpp"
+#include "vkRefUtil.hpp"
#include "vkMemUtil.hpp"
#include "deUniquePtr.hpp"
#include "tcuVector.hpp"
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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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, ®ion);
+ }
+ // 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
-/*-------------------------------------------------------------------------
+#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
*//*--------------------------------------------------------------------*/
#include "vktFragmentOperationsScissorTests.hpp"
+#include "vktFragmentOperationsScissorMultiViewportTests.hpp"
#include "vktTestCaseUtil.hpp"
+#include "vktTestGroupUtil.hpp"
#include "vktFragmentOperationsMakeUtil.hpp"
#include "vkDefs.hpp"
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 =
{
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.
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;
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);
{
VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex;
VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex;
*m_colorImage, // VkImage image;
- m_colorSubresourceRange, // VkImageSubresourceRange subresourceRange;
+ m_colorSubresourceRange, // VkImageSubresourceRange subresourceRange;
},
};
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, ®ion);
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);
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
{
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
#include "vktFragmentOperationsTests.hpp"
#include "vktTestGroupUtil.hpp"
#include "vktFragmentOperationsScissorTests.hpp"
+#include "vktFragmentOperationsEarlyFragmentTests.hpp"
namespace vkt
{
{
tcu::TestContext& testCtx = fragmentOperationsTestsGroup->getTestContext();
- fragmentOperationsTestsGroup->addChild(createScissorTests(testCtx));
+ fragmentOperationsTestsGroup->addChild(createScissorTests (testCtx));
+ fragmentOperationsTestsGroup->addChild(createEarlyFragmentTests (testCtx));
}
} // anonymous
vktImageSizeTests.hpp
vktImageTexture.cpp
vktImageTexture.hpp
+ vktImageMultisampleLoadStoreTests.cpp
+ vktImageMultisampleLoadStoreTests.hpp
+ vktImageLoadStoreUtil.cpp
+ vktImageLoadStoreUtil.hpp
)
set(DEQP_VK_IMAGE_LIBS
#include "vktImageLoadStoreTests.hpp"
#include "vktTestCaseUtil.hpp"
#include "vktImageTestsUtil.hpp"
+#include "vktImageLoadStoreUtil.hpp"
#include "vktImageTexture.hpp"
#include "vkDefs.hpp"
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())
}
}
-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,
}
}
-#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();
vk.cmdPipelineBarrier(cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, (VkDependencyFlags)0, 0, (const VkMemoryBarrier*)DE_NULL, 1, ©Barrier, 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:
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"
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())
{
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"
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),
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());
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());
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]));
}
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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, ©Region);
+ }
+ {
+ 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
--- /dev/null
+#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
#include "vktImageTests.hpp"
#include "vktImageLoadStoreTests.hpp"
+#include "vktImageMultisampleLoadStoreTests.hpp"
#include "vktImageQualifiersTests.hpp"
#include "vktImageSizeTests.hpp"
#include "vktTestGroupUtil.hpp"
imageTests->addChild(createImageStoreTests(testCtx));
imageTests->addChild(createImageLoadStoreTests(testCtx));
+ imageTests->addChild(createImageMultisampleLoadStoreTests(testCtx));
imageTests->addChild(createImageFormatReinterpretTests(testCtx));
imageTests->addChild(createImageQualifiersTests(testCtx));
imageTests->addChild(createImageSizeTests(testCtx));
}
}
-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;
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
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
return tcu::getPixelSize(vk::mapVkFormat(format)) * imageSize.x() * imageSize.y() * imageSize.z();
}
+std::string getFormatShortString (const vk::VkFormat format);
+
} // image
} // 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;
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;
}
}
+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)
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)
vktPipelineTimestampTests.hpp
vktPipelineVertexUtil.cpp
vktPipelineVertexUtil.hpp
- vktPipelineEarlyFragmentTests.cpp
- vktPipelineEarlyFragmentTests.hpp
vktPipelineCacheTests.cpp
vktPipelineCacheTests.hpp
vktPipelineMakeUtil.cpp
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,
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();
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;
}
};
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;
}
};
VK_CHECK(vk.waitForFences(device, 1, &fence.get(), true, ~(0ull) /* infinity */));
}
-
// Utilities for test textures
template<typename TcuTextureType>
return levels;
}
-
// TestTexture
TestTexture::TestTexture (const tcu::TextureFormat& format, int width, int height, int depth)
{
std::vector<deUint32> offsetMultiples;
std::vector<VkBufferImageCopy> regions;
- deUint32 layerDataOffset = 0;
+ deUint32 layerDataOffset = 0;
offsetMultiples.push_back(4);
}
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++)
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();
}
}
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);
return m_texture;
}
+tcu::Texture1D& TestTexture1D::getTexture (void)
+{
+ return m_texture;
+}
// TestTexture1DArray
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)
return m_texture;
}
+tcu::Texture2D& TestTexture2D::getTexture (void)
+{
+ return m_texture;
+}
// TestTexture2DArray
return m_texture;
}
+tcu::Texture2DArray& TestTexture2DArray::getTexture (void)
+{
+ return m_texture;
+}
+
int TestTexture2DArray::getArraySize (void) const
{
return m_texture.getNumLayers();
return m_texture;
}
+tcu::Texture3D& TestTexture3D::getTexture (void)
+{
+ return m_texture;
+}
// TestTextureCube
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
return m_texture;
}
+tcu::TextureCube& TestTextureCube::getTexture (void)
+{
+ return m_texture;
+}
+
// TestTextureCubeArray
TestTextureCubeArray::TestTextureCubeArray (const tcu::TextureFormat& format, int size, int arraySize)
return m_texture;
}
+tcu::TextureCubeArray& TestTextureCubeArray::getTexture (void)
+{
+ return m_texture;
+}
+
} // pipeline
} // vkt
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);
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
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
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
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
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
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
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
#include "vktPipelineMultisampleInterpolationTests.hpp"
#include "vktPipelineVertexInputTests.hpp"
#include "vktPipelineTimestampTests.hpp"
-#include "vktPipelineEarlyFragmentTests.hpp"
#include "vktPipelineCacheTests.hpp"
#include "vktTestGroupUtil.hpp"
pipelineTests->addChild(createVertexInputTests (testCtx));
pipelineTests->addChild(createInputAssemblyTests (testCtx));
pipelineTests->addChild(createTimestampTests (testCtx));
- pipelineTests->addChild(createEarlyFragmentTests (testCtx));
pipelineTests->addChild(createCacheTests (testCtx));
}
--- /dev/null
+# 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})
namespace vkt
{
-namespace texture_filtering
+namespace texture
{
using namespace vk;
return verifySampleImpl(args, result, nullStream);
}
-} // texture_filtering
+} // texture
} // vkt
namespace vkt
{
-namespace texture_filtering
+namespace texture
{
struct SampleArguments
const std::vector<tcu::ConstPixelBufferAccess>& m_pba;
};
-} // texture_filtering
+} // texture
} // vkt
#endif // _VKTSAMPLEVERIFIER_HPP
namespace vkt
{
-namespace texture_filtering
+namespace texture
{
namespace util
{
}
} // util
-} // texture_filtering
+} // texture
} // vkt
namespace vkt
{
-namespace texture_filtering
+namespace texture
{
namespace util
{
}
} // util
-} // texture_filtering
+} // texture
} // vkt
#endif // _VKTSAMPLEVERIFIERUTIL_HPP
namespace vkt
{
-namespace texture_filtering
+namespace texture
{
using namespace tcu;
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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
#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.
*
*//*!
* \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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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, ©Region);
+ else
+ vkd.cmdCopyImageToBuffer(*commandBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, *m_resultBuffer, 1, ©Region);
+
+ 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
--- /dev/null
+#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
--- /dev/null
+/*------------------------------------------------------------------------
+ * 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
--- /dev/null
+#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
+++ /dev/null
-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})
#include "vktShaderRenderTextureGatherTests.hpp"
#include "vktShaderBuiltinTests.hpp"
#include "vktOpaqueTypeIndexingTests.hpp"
-#include "vktTextureFilteringTests.hpp"
#include "vktUniformBlockTests.hpp"
#include "vktDynamicStateTests.hpp"
#include "vktSSBOLayoutTests.hpp"
#include "vktRasterizationTests.hpp"
#include "vktClippingTests.hpp"
#include "vktFragmentOperationsTests.hpp"
+#include "vktTextureTests.hpp"
#include <vector>
#include <sstream>
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
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.*
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
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
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
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