Run dynamic_state tests for pipeline library
authorPiotr Byszewski <piotr.byszewski@mobica.com>
Wed, 26 Jan 2022 12:44:25 +0000 (13:44 +0100)
committerPiotr Byszewski <piotr.byszewski@mobica.com>
Fri, 28 Jan 2022 12:04:50 +0000 (13:04 +0100)
dynamic_state group was ported to also test
VK_KHR_graphics_pipeline_library extension.

Components: Vulkan

VK-GL-CTS issue: 3310

Affects:
dEQP-VK.dynamic_state.*

Change-Id: Ibb90c9b99a620dc0b1d71d87d810d96fdc5d4677

27 files changed:
AndroidGen.mk
android/cts/master/src/vk-master-2019-03-01.txt
android/cts/master/vk-master-2019-03-01/dynamic-state.txt
android/cts/master/vk-master-2021-03-01/dynamic-state.txt
android/cts/master/vk-master/dynamic-state.txt
external/vulkancts/framework/vulkan/CMakeLists.txt
external/vulkancts/framework/vulkan/vkPipelineConstructionUtil.cpp [new file with mode: 0644]
external/vulkancts/framework/vulkan/vkPipelineConstructionUtil.hpp [new file with mode: 0644]
external/vulkancts/modules/vulkan/dynamic_state/CMakeLists.txt
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateBaseClass.cpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateBaseClass.hpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateCBTests.cpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateCBTests.hpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateDSTests.cpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateDSTests.hpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateGeneralTests.cpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateGeneralTests.hpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateInheritanceTests.cpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateInheritanceTests.hpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.cpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateRSTests.hpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTestCaseUtil.hpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateTests.cpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateVPTests.cpp
external/vulkancts/modules/vulkan/dynamic_state/vktDynamicStateVPTests.hpp
external/vulkancts/modules/vulkan/pipeline/vktPipelineLibraryTests.cpp
external/vulkancts/mustpass/master/vk-default/dynamic-state.txt

index e93fc21..2b781e9 100644 (file)
@@ -42,6 +42,7 @@ LOCAL_SRC_FILES := \
        external/vulkancts/framework/vulkan/vkNoRenderDocUtil.cpp \
        external/vulkancts/framework/vulkan/vkNullDriver.cpp \
        external/vulkancts/framework/vulkan/vkObjUtil.cpp \
+       external/vulkancts/framework/vulkan/vkPipelineConstructionUtil.cpp \
        external/vulkancts/framework/vulkan/vkPlatform.cpp \
        external/vulkancts/framework/vulkan/vkPrograms.cpp \
        external/vulkancts/framework/vulkan/vkQueryUtil.cpp \
index 3261b42..9b0b07e 100644 (file)
@@ -297854,21 +297854,21 @@ dEQP-VK.ubo.random.8bit.scalar.96
 dEQP-VK.ubo.random.8bit.scalar.97
 dEQP-VK.ubo.random.8bit.scalar.98
 dEQP-VK.ubo.random.8bit.scalar.99
-dEQP-VK.dynamic_state.vp_state.viewport
-dEQP-VK.dynamic_state.vp_state.scissor
-dEQP-VK.dynamic_state.vp_state.viewport_array
-dEQP-VK.dynamic_state.rs_state.depth_bias
-dEQP-VK.dynamic_state.rs_state.depth_bias_clamp
-dEQP-VK.dynamic_state.rs_state.line_width
-dEQP-VK.dynamic_state.cb_state.blend_constants
-dEQP-VK.dynamic_state.ds_state.depth_bounds_1
-dEQP-VK.dynamic_state.ds_state.depth_bounds_2
-dEQP-VK.dynamic_state.ds_state.stencil_params_basic_1
-dEQP-VK.dynamic_state.ds_state.stencil_params_basic_2
-dEQP-VK.dynamic_state.ds_state.stencil_params_advanced
-dEQP-VK.dynamic_state.general_state.state_switch
-dEQP-VK.dynamic_state.general_state.bind_order
-dEQP-VK.dynamic_state.general_state.state_persistence
+dEQP-VK.dynamic_state.monolithic.vp_state.viewport
+dEQP-VK.dynamic_state.monolithic.vp_state.scissor
+dEQP-VK.dynamic_state.monolithic.vp_state.viewport_array
+dEQP-VK.dynamic_state.monolithic.rs_state.depth_bias
+dEQP-VK.dynamic_state.monolithic.rs_state.depth_bias_clamp
+dEQP-VK.dynamic_state.monolithic.rs_state.line_width
+dEQP-VK.dynamic_state.monolithic.cb_state.blend_constants
+dEQP-VK.dynamic_state.monolithic.ds_state.depth_bounds_1
+dEQP-VK.dynamic_state.monolithic.ds_state.depth_bounds_2
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_basic_1
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_basic_2
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_advanced
+dEQP-VK.dynamic_state.monolithic.general_state.state_switch
+dEQP-VK.dynamic_state.monolithic.general_state.bind_order
+dEQP-VK.dynamic_state.monolithic.general_state.state_persistence
 dEQP-VK.ssbo.layout.single_basic_type.std140.lowp_float
 dEQP-VK.ssbo.layout.single_basic_type.std140.mediump_float
 dEQP-VK.ssbo.layout.single_basic_type.std140.highp_float
index f40b8a3..34062ce 100644 (file)
@@ -1,15 +1,15 @@
-dEQP-VK.dynamic_state.vp_state.viewport
-dEQP-VK.dynamic_state.vp_state.scissor
-dEQP-VK.dynamic_state.vp_state.viewport_array
-dEQP-VK.dynamic_state.rs_state.depth_bias
-dEQP-VK.dynamic_state.rs_state.depth_bias_clamp
-dEQP-VK.dynamic_state.rs_state.line_width
-dEQP-VK.dynamic_state.cb_state.blend_constants
-dEQP-VK.dynamic_state.ds_state.depth_bounds_1
-dEQP-VK.dynamic_state.ds_state.depth_bounds_2
-dEQP-VK.dynamic_state.ds_state.stencil_params_basic_1
-dEQP-VK.dynamic_state.ds_state.stencil_params_basic_2
-dEQP-VK.dynamic_state.ds_state.stencil_params_advanced
-dEQP-VK.dynamic_state.general_state.state_switch
-dEQP-VK.dynamic_state.general_state.bind_order
-dEQP-VK.dynamic_state.general_state.state_persistence
+dEQP-VK.dynamic_state.monolithic.vp_state.viewport
+dEQP-VK.dynamic_state.monolithic.vp_state.scissor
+dEQP-VK.dynamic_state.monolithic.vp_state.viewport_array
+dEQP-VK.dynamic_state.monolithic.rs_state.depth_bias
+dEQP-VK.dynamic_state.monolithic.rs_state.depth_bias_clamp
+dEQP-VK.dynamic_state.monolithic.rs_state.line_width
+dEQP-VK.dynamic_state.monolithic.cb_state.blend_constants
+dEQP-VK.dynamic_state.monolithic.ds_state.depth_bounds_1
+dEQP-VK.dynamic_state.monolithic.ds_state.depth_bounds_2
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_basic_1
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_basic_2
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_advanced
+dEQP-VK.dynamic_state.monolithic.general_state.state_switch
+dEQP-VK.dynamic_state.monolithic.general_state.bind_order
+dEQP-VK.dynamic_state.monolithic.general_state.state_persistence
index 30b6faf..0dd3f24 100644 (file)
-dEQP-VK.dynamic_state.rs_state.nonzero_depth_bias_constant
-dEQP-VK.dynamic_state.rs_state.nonzero_depth_bias_clamp
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_width.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_width.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bias.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bias.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.blend_constants.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.blend_constants.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_compare_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_compare_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_write_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_write_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_reference.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_reference.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.discard_rectangle_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.discard_rectangle_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.sample_locations_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.sample_locations_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.fragment_shading_rate_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.fragment_shading_rate_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_stipple_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_stipple_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.cull_mode_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.cull_mode_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.front_face_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.front_face_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.primitive_topology_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.primitive_topology_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.vertex_input_binding_stride_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.vertex_input_binding_stride_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_write_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_write_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_compare_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_compare_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_w_scaling_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_w_scaling_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_shading_rate_palette_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_shading_rate_palette_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_coarse_sample_order_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_coarse_sample_order_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.exclusive_scissor_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.exclusive_scissor_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_width.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_width.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bias.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bias.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.blend_constants.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.blend_constants.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_compare_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_compare_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_write_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_write_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_reference.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_reference.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.discard_rectangle_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.discard_rectangle_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.sample_locations_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.sample_locations_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.fragment_shading_rate_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.fragment_shading_rate_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_stipple_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_stipple_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.cull_mode_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.cull_mode_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.front_face_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.front_face_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.primitive_topology_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.primitive_topology_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.vertex_input_binding_stride_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.vertex_input_binding_stride_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_write_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_write_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_compare_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_compare_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_w_scaling_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_w_scaling_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.exclusive_scissor_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.exclusive_scissor_nv.after
-dEQP-VK.dynamic_state.compute_transfer.multi.compute.before
-dEQP-VK.dynamic_state.compute_transfer.multi.compute.after
-dEQP-VK.dynamic_state.compute_transfer.multi.transfer.before
-dEQP-VK.dynamic_state.compute_transfer.multi.transfer.after
-dEQP-VK.dynamic_state.inheritance.baseline
-dEQP-VK.dynamic_state.inheritance.primary
-dEQP-VK.dynamic_state.inheritance.secondary
-dEQP-VK.dynamic_state.inheritance.split
-dEQP-VK.dynamic_state.inheritance.primary_with_count
-dEQP-VK.dynamic_state.inheritance.secondary_with_count
+dEQP-VK.dynamic_state.monolithic.rs_state.nonzero_depth_bias_constant
+dEQP-VK.dynamic_state.monolithic.rs_state.nonzero_depth_bias_clamp
+dEQP-VK.dynamic_state.monolithic.inheritance.baseline
+dEQP-VK.dynamic_state.monolithic.inheritance.primary
+dEQP-VK.dynamic_state.monolithic.inheritance.secondary
+dEQP-VK.dynamic_state.monolithic.inheritance.split
+dEQP-VK.dynamic_state.monolithic.inheritance.primary_with_count
+dEQP-VK.dynamic_state.monolithic.inheritance.secondary_with_count
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_width.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_width.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bias.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bias.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.blend_constants.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.blend_constants.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_compare_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_compare_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_write_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_write_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_reference.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_reference.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.discard_rectangle_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.discard_rectangle_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.sample_locations_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.sample_locations_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.fragment_shading_rate_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.fragment_shading_rate_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_stipple_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_stipple_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.cull_mode_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.cull_mode_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.front_face_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.front_face_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.primitive_topology_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.primitive_topology_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.vertex_input_binding_stride_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.vertex_input_binding_stride_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_write_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_write_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_compare_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_compare_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_w_scaling_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_w_scaling_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_shading_rate_palette_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_shading_rate_palette_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_coarse_sample_order_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_coarse_sample_order_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.exclusive_scissor_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.exclusive_scissor_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_width.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_width.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bias.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bias.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.blend_constants.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.blend_constants.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_compare_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_compare_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_write_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_write_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_reference.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_reference.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.discard_rectangle_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.discard_rectangle_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.sample_locations_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.sample_locations_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.fragment_shading_rate_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.fragment_shading_rate_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_stipple_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_stipple_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.cull_mode_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.cull_mode_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.front_face_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.front_face_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.primitive_topology_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.primitive_topology_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.vertex_input_binding_stride_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.vertex_input_binding_stride_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_write_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_write_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_compare_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_compare_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_w_scaling_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_w_scaling_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.exclusive_scissor_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.exclusive_scissor_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.compute.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.compute.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.transfer.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.transfer.after
+dEQP-VK.dynamic_state.pipeline_library.vp_state.viewport
+dEQP-VK.dynamic_state.pipeline_library.vp_state.scissor
+dEQP-VK.dynamic_state.pipeline_library.vp_state.viewport_array
+dEQP-VK.dynamic_state.pipeline_library.rs_state.depth_bias
+dEQP-VK.dynamic_state.pipeline_library.rs_state.depth_bias_clamp
+dEQP-VK.dynamic_state.pipeline_library.rs_state.line_width
+dEQP-VK.dynamic_state.pipeline_library.rs_state.nonzero_depth_bias_constant
+dEQP-VK.dynamic_state.pipeline_library.rs_state.nonzero_depth_bias_clamp
+dEQP-VK.dynamic_state.pipeline_library.cb_state.blend_constants
+dEQP-VK.dynamic_state.pipeline_library.ds_state.depth_bounds_1
+dEQP-VK.dynamic_state.pipeline_library.ds_state.depth_bounds_2
+dEQP-VK.dynamic_state.pipeline_library.ds_state.stencil_params_basic_1
+dEQP-VK.dynamic_state.pipeline_library.ds_state.stencil_params_basic_2
+dEQP-VK.dynamic_state.pipeline_library.ds_state.stencil_params_advanced
+dEQP-VK.dynamic_state.pipeline_library.general_state.state_switch
+dEQP-VK.dynamic_state.pipeline_library.general_state.bind_order
+dEQP-VK.dynamic_state.pipeline_library.general_state.state_persistence
+dEQP-VK.dynamic_state.pipeline_library.inheritance.baseline
+dEQP-VK.dynamic_state.pipeline_library.inheritance.primary
+dEQP-VK.dynamic_state.pipeline_library.inheritance.secondary
+dEQP-VK.dynamic_state.pipeline_library.inheritance.split
+dEQP-VK.dynamic_state.pipeline_library.inheritance.primary_with_count
+dEQP-VK.dynamic_state.pipeline_library.inheritance.secondary_with_count
+dEQP-VK.dynamic_state.fast_linked_library.vp_state.viewport
+dEQP-VK.dynamic_state.fast_linked_library.vp_state.scissor
+dEQP-VK.dynamic_state.fast_linked_library.vp_state.viewport_array
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.depth_bias
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.depth_bias_clamp
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.line_width
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.nonzero_depth_bias_constant
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.nonzero_depth_bias_clamp
+dEQP-VK.dynamic_state.fast_linked_library.cb_state.blend_constants
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.depth_bounds_1
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.depth_bounds_2
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.stencil_params_basic_1
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.stencil_params_basic_2
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.stencil_params_advanced
+dEQP-VK.dynamic_state.fast_linked_library.general_state.state_switch
+dEQP-VK.dynamic_state.fast_linked_library.general_state.bind_order
+dEQP-VK.dynamic_state.fast_linked_library.general_state.state_persistence
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.baseline
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.primary
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.secondary
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.split
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.primary_with_count
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.secondary_with_count
index f20dc1b..71a0361 100644 (file)
-dEQP-VK.dynamic_state.vp_state.viewport
-dEQP-VK.dynamic_state.vp_state.scissor
-dEQP-VK.dynamic_state.vp_state.viewport_array
-dEQP-VK.dynamic_state.rs_state.depth_bias
-dEQP-VK.dynamic_state.rs_state.depth_bias_clamp
-dEQP-VK.dynamic_state.rs_state.line_width
-dEQP-VK.dynamic_state.rs_state.nonzero_depth_bias_constant
-dEQP-VK.dynamic_state.rs_state.nonzero_depth_bias_clamp
-dEQP-VK.dynamic_state.cb_state.blend_constants
-dEQP-VK.dynamic_state.ds_state.depth_bounds_1
-dEQP-VK.dynamic_state.ds_state.depth_bounds_2
-dEQP-VK.dynamic_state.ds_state.stencil_params_basic_1
-dEQP-VK.dynamic_state.ds_state.stencil_params_basic_2
-dEQP-VK.dynamic_state.ds_state.stencil_params_advanced
-dEQP-VK.dynamic_state.general_state.state_switch
-dEQP-VK.dynamic_state.general_state.bind_order
-dEQP-VK.dynamic_state.general_state.state_persistence
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_width.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_width.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bias.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bias.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.blend_constants.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.blend_constants.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_compare_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_compare_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_write_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_write_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_reference.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_reference.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.discard_rectangle_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.discard_rectangle_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.sample_locations_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.sample_locations_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.fragment_shading_rate_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.fragment_shading_rate_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_stipple_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_stipple_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.cull_mode_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.cull_mode_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.front_face_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.front_face_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.primitive_topology_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.primitive_topology_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.vertex_input_binding_stride_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.vertex_input_binding_stride_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_write_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_write_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_compare_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_compare_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_w_scaling_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_w_scaling_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_shading_rate_palette_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_shading_rate_palette_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_coarse_sample_order_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_coarse_sample_order_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.exclusive_scissor_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.exclusive_scissor_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_width.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_width.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bias.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bias.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.blend_constants.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.blend_constants.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_compare_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_compare_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_write_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_write_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_reference.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_reference.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.discard_rectangle_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.discard_rectangle_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.sample_locations_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.sample_locations_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.fragment_shading_rate_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.fragment_shading_rate_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_stipple_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_stipple_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.cull_mode_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.cull_mode_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.front_face_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.front_face_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.primitive_topology_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.primitive_topology_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.vertex_input_binding_stride_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.vertex_input_binding_stride_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_write_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_write_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_compare_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_compare_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_w_scaling_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_w_scaling_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.exclusive_scissor_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.exclusive_scissor_nv.after
-dEQP-VK.dynamic_state.compute_transfer.multi.compute.before
-dEQP-VK.dynamic_state.compute_transfer.multi.compute.after
-dEQP-VK.dynamic_state.compute_transfer.multi.transfer.before
-dEQP-VK.dynamic_state.compute_transfer.multi.transfer.after
-dEQP-VK.dynamic_state.inheritance.baseline
-dEQP-VK.dynamic_state.inheritance.primary
-dEQP-VK.dynamic_state.inheritance.secondary
-dEQP-VK.dynamic_state.inheritance.split
-dEQP-VK.dynamic_state.inheritance.primary_with_count
-dEQP-VK.dynamic_state.inheritance.secondary_with_count
+dEQP-VK.dynamic_state.monolithic.vp_state.viewport
+dEQP-VK.dynamic_state.monolithic.vp_state.scissor
+dEQP-VK.dynamic_state.monolithic.vp_state.viewport_array
+dEQP-VK.dynamic_state.monolithic.rs_state.depth_bias
+dEQP-VK.dynamic_state.monolithic.rs_state.depth_bias_clamp
+dEQP-VK.dynamic_state.monolithic.rs_state.line_width
+dEQP-VK.dynamic_state.monolithic.rs_state.nonzero_depth_bias_constant
+dEQP-VK.dynamic_state.monolithic.rs_state.nonzero_depth_bias_clamp
+dEQP-VK.dynamic_state.monolithic.cb_state.blend_constants
+dEQP-VK.dynamic_state.monolithic.ds_state.depth_bounds_1
+dEQP-VK.dynamic_state.monolithic.ds_state.depth_bounds_2
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_basic_1
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_basic_2
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_advanced
+dEQP-VK.dynamic_state.monolithic.general_state.state_switch
+dEQP-VK.dynamic_state.monolithic.general_state.bind_order
+dEQP-VK.dynamic_state.monolithic.general_state.state_persistence
+dEQP-VK.dynamic_state.monolithic.inheritance.baseline
+dEQP-VK.dynamic_state.monolithic.inheritance.primary
+dEQP-VK.dynamic_state.monolithic.inheritance.secondary
+dEQP-VK.dynamic_state.monolithic.inheritance.split
+dEQP-VK.dynamic_state.monolithic.inheritance.primary_with_count
+dEQP-VK.dynamic_state.monolithic.inheritance.secondary_with_count
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_width.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_width.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bias.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bias.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.blend_constants.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.blend_constants.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_compare_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_compare_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_write_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_write_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_reference.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_reference.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.discard_rectangle_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.discard_rectangle_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.sample_locations_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.sample_locations_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.fragment_shading_rate_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.fragment_shading_rate_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_stipple_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_stipple_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.cull_mode_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.cull_mode_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.front_face_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.front_face_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.primitive_topology_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.primitive_topology_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.vertex_input_binding_stride_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.vertex_input_binding_stride_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_write_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_write_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_compare_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_compare_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_w_scaling_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_w_scaling_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_shading_rate_palette_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_shading_rate_palette_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_coarse_sample_order_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_coarse_sample_order_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.exclusive_scissor_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.exclusive_scissor_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_width.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_width.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bias.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bias.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.blend_constants.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.blend_constants.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_compare_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_compare_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_write_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_write_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_reference.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_reference.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.discard_rectangle_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.discard_rectangle_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.sample_locations_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.sample_locations_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.fragment_shading_rate_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.fragment_shading_rate_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_stipple_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_stipple_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.cull_mode_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.cull_mode_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.front_face_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.front_face_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.primitive_topology_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.primitive_topology_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.vertex_input_binding_stride_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.vertex_input_binding_stride_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_write_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_write_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_compare_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_compare_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_w_scaling_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_w_scaling_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.exclusive_scissor_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.exclusive_scissor_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.compute.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.compute.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.transfer.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.transfer.after
+dEQP-VK.dynamic_state.pipeline_library.vp_state.viewport
+dEQP-VK.dynamic_state.pipeline_library.vp_state.scissor
+dEQP-VK.dynamic_state.pipeline_library.vp_state.viewport_array
+dEQP-VK.dynamic_state.pipeline_library.rs_state.depth_bias
+dEQP-VK.dynamic_state.pipeline_library.rs_state.depth_bias_clamp
+dEQP-VK.dynamic_state.pipeline_library.rs_state.line_width
+dEQP-VK.dynamic_state.pipeline_library.rs_state.nonzero_depth_bias_constant
+dEQP-VK.dynamic_state.pipeline_library.rs_state.nonzero_depth_bias_clamp
+dEQP-VK.dynamic_state.pipeline_library.cb_state.blend_constants
+dEQP-VK.dynamic_state.pipeline_library.ds_state.depth_bounds_1
+dEQP-VK.dynamic_state.pipeline_library.ds_state.depth_bounds_2
+dEQP-VK.dynamic_state.pipeline_library.ds_state.stencil_params_basic_1
+dEQP-VK.dynamic_state.pipeline_library.ds_state.stencil_params_basic_2
+dEQP-VK.dynamic_state.pipeline_library.ds_state.stencil_params_advanced
+dEQP-VK.dynamic_state.pipeline_library.general_state.state_switch
+dEQP-VK.dynamic_state.pipeline_library.general_state.bind_order
+dEQP-VK.dynamic_state.pipeline_library.general_state.state_persistence
+dEQP-VK.dynamic_state.pipeline_library.inheritance.baseline
+dEQP-VK.dynamic_state.pipeline_library.inheritance.primary
+dEQP-VK.dynamic_state.pipeline_library.inheritance.secondary
+dEQP-VK.dynamic_state.pipeline_library.inheritance.split
+dEQP-VK.dynamic_state.pipeline_library.inheritance.primary_with_count
+dEQP-VK.dynamic_state.pipeline_library.inheritance.secondary_with_count
+dEQP-VK.dynamic_state.fast_linked_library.vp_state.viewport
+dEQP-VK.dynamic_state.fast_linked_library.vp_state.scissor
+dEQP-VK.dynamic_state.fast_linked_library.vp_state.viewport_array
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.depth_bias
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.depth_bias_clamp
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.line_width
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.nonzero_depth_bias_constant
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.nonzero_depth_bias_clamp
+dEQP-VK.dynamic_state.fast_linked_library.cb_state.blend_constants
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.depth_bounds_1
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.depth_bounds_2
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.stencil_params_basic_1
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.stencil_params_basic_2
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.stencil_params_advanced
+dEQP-VK.dynamic_state.fast_linked_library.general_state.state_switch
+dEQP-VK.dynamic_state.fast_linked_library.general_state.bind_order
+dEQP-VK.dynamic_state.fast_linked_library.general_state.state_persistence
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.baseline
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.primary
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.secondary
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.split
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.primary_with_count
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.secondary_with_count
index 0358d41..17d4ebe 100644 (file)
@@ -77,6 +77,8 @@ set(VKUTILNOSHADER_SRCS
        vkDeviceProperties.inl
        vkRayTracingUtil.hpp
        vkRayTracingUtil.cpp
+       vkPipelineConstructionUtil.hpp
+       vkPipelineConstructionUtil.cpp
        )
 
 set(VKUTIL_SRCS
diff --git a/external/vulkancts/framework/vulkan/vkPipelineConstructionUtil.cpp b/external/vulkancts/framework/vulkan/vkPipelineConstructionUtil.cpp
new file mode 100644 (file)
index 0000000..ffa61c0
--- /dev/null
@@ -0,0 +1,700 @@
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 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 Wrapper that can construct monolithic pipeline or use
+          VK_KHR_graphics_pipeline_library for pipeline construction
+ *//*--------------------------------------------------------------------*/
+
+#include "vkRefUtil.hpp"
+#include "vkQueryUtil.hpp"
+#include "deSharedPtr.hpp"
+#include "tcuVector.hpp"
+#include "tcuVectorType.hpp"
+#include "vkPipelineConstructionUtil.hpp"
+
+namespace vk
+{
+
+static const VkVertexInputBindingDescription defaultVertexInputBindingDescription
+{
+       0u,                                                                                                                             // deUint32                                                                             binding
+       sizeof(tcu::Vec4),                                                                                              // deUint32                                                                             stride
+       VK_VERTEX_INPUT_RATE_VERTEX,                                                                    // VkVertexInputRate                                                    inputRate
+};
+
+static const VkVertexInputAttributeDescription defaultVertexInputAttributeDescription
+{
+       0u,                                                                                                                             // deUint32                                                                             location
+       0u,                                                                                                                             // deUint32                                                                             binding
+       VK_FORMAT_R32G32B32A32_SFLOAT,                                                                  // VkFormat                                                                             format
+       0u                                                                                                                              // deUint32                                                                             offset
+};
+
+static const VkPipelineVertexInputStateCreateInfo defaultVertexInputState
+{
+       VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,              // VkStructureType                                                              sType
+       DE_NULL,                                                                                                                // const void*                                                                  pNext
+       (VkPipelineVertexInputStateCreateFlags)0,                                               // VkPipelineVertexInputStateCreateFlags                flags
+       1u,                                                                                                                             // deUint32                                                                             vertexBindingDescriptionCount
+       &defaultVertexInputBindingDescription,                                                  // const VkVertexInputBindingDescription*               pVertexBindingDescriptions
+       1u,                                                                                                                             // deUint32                                                                             vertexAttributeDescriptionCount
+       &defaultVertexInputAttributeDescription                                                 // const VkVertexInputAttributeDescription*             pVertexAttributeDescriptions
+};
+
+static const VkStencilOpState defaultStencilOpState
+{
+       VK_STENCIL_OP_KEEP,                                                                                             // VkStencilOp                                                                  failOp
+       VK_STENCIL_OP_KEEP,                                                                                             // VkStencilOp                                                                  passOp
+       VK_STENCIL_OP_KEEP,                                                                                             // VkStencilOp                                                                  depthFailOp
+       VK_COMPARE_OP_NEVER,                                                                                    // VkCompareOp                                                                  compareOp
+       0u,                                                                                                                             // deUint32                                                                             compareMask
+       0u,                                                                                                                             // deUint32                                                                             writeMask
+       0u                                                                                                                              // deUint32                                                                             reference
+};
+
+static const VkPipelineDepthStencilStateCreateInfo defaultDepthStencilState
+{
+       VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,             // VkStructureType                                                              sType
+       DE_NULL,                                                                                                                // const void*                                                                  pNext
+       0u,                                                                                                                             // VkPipelineDepthStencilStateCreateFlags               flags
+       VK_FALSE,                                                                                                               // VkBool32                                                                             depthTestEnable
+       VK_FALSE,                                                                                                               // VkBool32                                                                             depthWriteEnable
+       VK_COMPARE_OP_LESS_OR_EQUAL,                                                                    // VkCompareOp                                                                  depthCompareOp
+       VK_FALSE,                                                                                                               // VkBool32                                                                             depthBoundsTestEnable
+       VK_FALSE,                                                                                                               // VkBool32                                                                             stencilTestEnable
+       defaultStencilOpState,                                                                                  // VkStencilOpState                                                             front
+       defaultStencilOpState,                                                                                  // VkStencilOpState                                                             back
+       0.0f,                                                                                                                   // float                                                                                minDepthBounds
+       1.0f,                                                                                                                   // float                                                                                maxDepthBounds
+};
+
+static const VkPipelineMultisampleStateCreateInfo defaultMultisampleState
+{
+       VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,               // VkStructureType                                                              sType
+       DE_NULL,                                                                                                                // const void*                                                                  pNext
+       0u,                                                                                                                             // VkPipelineMultisampleStateCreateFlags                flags
+       VK_SAMPLE_COUNT_1_BIT,                                                                                  // VkSampleCountFlagBits                                                rasterizationSamples
+       VK_FALSE,                                                                                                               // VkBool32                                                                             sampleShadingEnable
+       1.0f,                                                                                                                   // float                                                                                minSampleShading
+       DE_NULL,                                                                                                                // const VkSampleMask*                                                  pSampleMask
+       VK_FALSE,                                                                                                               // VkBool32                                                                             alphaToCoverageEnable
+       VK_FALSE                                                                                                                // VkBool32                                                                             alphaToOneEnable
+};
+
+static const VkPipelineColorBlendAttachmentState defaultColorBlendAttachmentState
+{
+       VK_FALSE,                                                                                                               // VkBool32                                                                             blendEnable
+       VK_BLEND_FACTOR_ZERO,                                                                                   // VkBlendFactor                                                                srcColorBlendFactor
+       VK_BLEND_FACTOR_ZERO,                                                                                   // VkBlendFactor                                                                dstColorBlendFactor
+       VK_BLEND_OP_ADD,                                                                                                // VkBlendOp                                                                    colorBlendOp
+       VK_BLEND_FACTOR_ZERO,                                                                                   // VkBlendFactor                                                                srcAlphaBlendFactor
+       VK_BLEND_FACTOR_ZERO,                                                                                   // VkBlendFactor                                                                dstAlphaBlendFactor
+       VK_BLEND_OP_ADD,                                                                                                // VkBlendOp                                                                    alphaBlendOp
+       0xf                                                                                                                             // VkColorComponentFlags                                                colorWriteMask
+};
+
+static const VkPipelineColorBlendStateCreateInfo defaultColorBlendState
+{
+       VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,               // VkStructureType                                                              sType
+       DE_NULL,                                                                                                                // const void*                                                                  pNext
+       0u,                                                                                                                             // VkPipelineColorBlendStateCreateFlags                 flags
+       VK_FALSE,                                                                                                               // VkBool32                                                                             logicOpEnable
+       VK_LOGIC_OP_CLEAR,                                                                                              // VkLogicOp                                                                    logicOp
+       1u,                                                                                                                             // deUint32                                                                             attachmentCount
+       &defaultColorBlendAttachmentState,                                                              // const VkPipelineColorBlendAttachmentState*   pAttachments
+       { 0.0f, 0.0f, 0.0f, 0.0f }                                                                              // float                                                                                blendConstants[4]
+};
+
+VkGraphicsPipelineLibraryCreateInfoKHR makeGraphicsPipelineLibraryCreateInfo(const VkGraphicsPipelineLibraryFlagsKHR flags)
+{
+       return
+       {
+               VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_KHR,    // VkStructureType                                              sType;
+               DE_NULL,                                                                                                                // void*                                                                pNext;
+               flags,                                                                                                                  // VkGraphicsPipelineLibraryFlagsKHR    flags;
+       };
+}
+
+// Structure storing *CreateInfo structures that do not need to exist in memory after pipeline was constructed.
+struct GraphicsPipelineWrapper::InternalData
+{
+       const DeviceInterface&                                                          vk;
+       VkDevice                                                                                        device;
+       const PipelineConstructionType                                          pipelineConstructionType;
+       const VkPipelineCreateFlags                                                     pipelineFlags;
+
+       // attribute used for making sure pipeline is configured in correct order
+       VkGraphicsPipelineLibraryFlagsKHR                                       setupStates;
+
+       std::vector<VkPipelineShaderStageCreateInfo>            pipelineShaderStages;
+       VkPipelineInputAssemblyStateCreateInfo                          inputAssemblyState;
+       VkPipelineRasterizationStateCreateInfo                          defaultRasterizationState;
+       VkPipelineViewportStateCreateInfo                                       viewportState;
+       VkPipelineTessellationStateCreateInfo                           tessellationState;
+       VkPipelineFragmentShadingRateStateCreateInfoKHR*        pFragmentShadingRateState;
+       const VkPipelineDynamicStateCreateInfo*                         pDynamicState;
+
+       deBool                                                                                          useViewportState;
+       deBool                                                                                          useDefaultRasterizationState;
+       deBool                                                                                          useDefaultDepthStencilState;
+       deBool                                                                                          useDefaultColorBlendState;
+       deBool                                                                                          useDefaultMultisampleState;
+
+       VkGraphicsPipelineCreateInfo                                            monolithicPipelineCreateInfo;
+
+       // initialize with most common values
+       InternalData(const DeviceInterface& vkd, VkDevice vkDevice, const PipelineConstructionType constructionType, const VkPipelineCreateFlags pipelineCreateFlags)
+               : vk                                            (vkd)
+               , device                                        (vkDevice)
+               , pipelineConstructionType      (constructionType)
+               , pipelineFlags                         (pipelineCreateFlags)
+               , setupStates                           (0u)
+               , inputAssemblyState
+               {
+                       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
+                       VK_FALSE                                                                                                                // VkBool32                                                                             primitiveRestartEnable
+               }
+               , defaultRasterizationState
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,             // VkStructureType                                                              sType
+                       DE_NULL,                                                                                                                // const void*                                                                  pNext
+                       0u,                                                                                                                             // 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
+               }
+               , viewportState
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,                  // VkStructureType                                                              sType
+                       DE_NULL,                                                                                                                // const void*                                                                  pNext
+                       (VkPipelineViewportStateCreateFlags)0,                                                  // VkPipelineViewportStateCreateFlags                   flags
+                       1u,                                                                                                                             // deUint32                                                                             viewportCount
+                       DE_NULL,                                                                                                                // const VkViewport*                                                    pViewports
+                       1u,                                                                                                                             // deUint32                                                                             scissorCount
+                       DE_NULL                                                                                                                 // const VkRect2D*                                                              pScissors
+               }
+               , tessellationState
+               {
+                       VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,              // VkStructureType                                                              sType
+                       DE_NULL,                                                                                                                // const void*                                                                  pNext
+                       0u,                                                                                                                             // VkPipelineTessellationStateCreateFlags               flags
+                       3u                                                                                                                              // deUint32                                                                             patchControlPoints
+               }
+               , pFragmentShadingRateState             (DE_NULL)
+               , pDynamicState                                 (DE_NULL)
+               , useViewportState                              (DE_TRUE)
+               , useDefaultRasterizationState  (DE_FALSE)
+               , useDefaultDepthStencilState   (DE_FALSE)
+               , useDefaultColorBlendState             (DE_FALSE)
+               , useDefaultMultisampleState    (DE_FALSE)
+       {
+               monolithicPipelineCreateInfo = initVulkanStructure();
+       }
+};
+
+GraphicsPipelineWrapper::GraphicsPipelineWrapper(const DeviceInterface&                                vk,
+                                                                                                VkDevice                                                       device,
+                                                                                                const PipelineConstructionType         pipelineConstructionType,
+                                                                                                const VkPipelineCreateFlags            flags)
+       : m_internalData        (new InternalData(vk, device, pipelineConstructionType, flags))
+{
+}
+
+GraphicsPipelineWrapper::GraphicsPipelineWrapper(GraphicsPipelineWrapper&& pw)
+       : m_pipelineFinal       (pw.m_pipelineFinal)
+       , m_internalData        (pw.m_internalData)
+{
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setMonolithicPipelineLayout(const VkPipelineLayout layout)
+{
+       // make sure pipeline was not already built
+       DE_ASSERT(m_pipelineFinal.get() == DE_NULL);
+
+       m_internalData->monolithicPipelineCreateInfo.layout = layout;
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setDynamicState(const VkPipelineDynamicStateCreateInfo* dynamicState)
+{
+       // make sure states are not yet setup - all pipeline states must know about dynamic state
+       DE_ASSERT(m_internalData && m_internalData->setupStates == 0u);
+
+       m_internalData->pDynamicState                                                           = dynamicState;
+       m_internalData->monolithicPipelineCreateInfo.pDynamicState      = dynamicState;
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setDefaultTopology(const VkPrimitiveTopology topology)
+{
+       // topology is needed by vertex input state, make sure vertex input state was not setup yet
+       DE_ASSERT(m_internalData && (m_internalData->setupStates == 0u));
+
+       m_internalData->inputAssemblyState.topology = topology;
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setDefaultPatchControlPoints(const deUint32 patchControlPoints)
+{
+       // patchControlPoints are needed by pre-rasterization shader state, make sure pre-rasterization state was not setup yet
+       DE_ASSERT(m_internalData && (m_internalData->setupStates < VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_KHR));
+
+       m_internalData->tessellationState.patchControlPoints = patchControlPoints;
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setDefaultRasterizerDiscardEnable(const deBool rasterizerDiscardEnable)
+{
+       // rasterizerDiscardEnable is used in pre-rasterization shader state, make sure pre-rasterization state was not setup yet
+       DE_ASSERT(m_internalData && (m_internalData->setupStates < VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_KHR));
+
+       m_internalData->defaultRasterizationState.rasterizerDiscardEnable = rasterizerDiscardEnable;
+
+       return *this;
+}
+
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setDefaultRasterizationState()
+{
+       // RasterizationState is used in pre-rasterization shader state, make sure this state was not setup yet
+       DE_ASSERT(m_internalData && (m_internalData->setupStates < VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_KHR));
+
+       m_internalData->useDefaultRasterizationState = DE_TRUE;
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setDefaultDepthStencilState()
+{
+       // DepthStencilState is used in fragment shader state, make sure fragment shader state was not setup yet
+       DE_ASSERT(m_internalData && (m_internalData->setupStates < VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_KHR));
+
+       m_internalData->useDefaultDepthStencilState = DE_TRUE;
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setDefaultColorBlendState()
+{
+       // ColorBlendState is used in fragment shader state, make sure fragment shader state was not setup yet
+       DE_ASSERT(m_internalData && (m_internalData->setupStates < VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_KHR));
+
+       m_internalData->useDefaultColorBlendState = DE_TRUE;
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setDefaultMultisampleState()
+{
+       // MultisampleState is used in fragment shader state, make sure fragment shader state was not setup yet
+       DE_ASSERT(m_internalData && (m_internalData->setupStates < VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_KHR));
+
+       m_internalData->useDefaultMultisampleState = DE_TRUE;
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setDefaultViewportsCount(deUint32 viewportCount)
+{
+       // ViewportState is used in pre-rasterization shader state, make sure pre-rasterization state was not setup yet
+       DE_ASSERT(m_internalData && (m_internalData->setupStates < VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_KHR));
+
+       m_internalData->viewportState.viewportCount = viewportCount;
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setDefaultScissorsCount(deUint32 scissorCount)
+{
+       // ViewportState is used in pre-rasterization shader state, make sure pre-rasterization state was not setup yet
+       DE_ASSERT(m_internalData && (m_internalData->setupStates < VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_KHR));
+
+       m_internalData->viewportState.scissorCount = scissorCount;
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::disableViewportState()
+{
+       // ViewportState is used in pre-rasterization shader state, make sure pre-rasterization state was not setup yet
+       DE_ASSERT(m_internalData && (m_internalData->setupStates < VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_KHR));
+
+       m_internalData->useViewportState = DE_FALSE;
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setupVertexInputStete(const VkPipelineVertexInputStateCreateInfo*            vertexInputState,
+                                                                                                                                               const VkPipelineInputAssemblyStateCreateInfo*   inputAssemblyState)
+{
+       // make sure pipeline was not already build
+       DE_ASSERT(m_pipelineFinal.get() == DE_NULL);
+
+       // make sure states are set in order - no need to complicate logic to support out of order specification - this state needs to be set first
+       DE_ASSERT(m_internalData && (m_internalData->setupStates == 0u));
+       m_internalData->setupStates = VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_KHR;
+
+       const auto pVertexInputState    = vertexInputState ? vertexInputState : &defaultVertexInputState;
+       const auto pInputAssemblyState  = inputAssemblyState ? inputAssemblyState : &m_internalData->inputAssemblyState;
+
+       if (m_internalData->pipelineConstructionType == PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC)
+       {
+               m_internalData->monolithicPipelineCreateInfo.pVertexInputState          = pVertexInputState;
+               m_internalData->monolithicPipelineCreateInfo.pInputAssemblyState        = pInputAssemblyState;
+       }
+       else
+       {
+               const auto libraryCreateInfo = makeGraphicsPipelineLibraryCreateInfo(VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_KHR);
+
+               VkGraphicsPipelineCreateInfo pipelinePartCreateInfo = initVulkanStructure();
+               pipelinePartCreateInfo.pNext                            = &libraryCreateInfo;
+               pipelinePartCreateInfo.flags                            = m_internalData->pipelineFlags | VK_PIPELINE_CREATE_LIBRARY_BIT_KHR;
+               pipelinePartCreateInfo.pVertexInputState        = pVertexInputState;
+               pipelinePartCreateInfo.pInputAssemblyState      = pInputAssemblyState;
+               pipelinePartCreateInfo.pDynamicState            = m_internalData->pDynamicState;
+
+               if (m_internalData->pipelineConstructionType == PIPELINE_CONSTRUCTION_TYPE_FAST_LINKED_LIBRARY)
+                       pipelinePartCreateInfo.flags |= VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_KHR;
+
+               m_pipelineParts[0] = createGraphicsPipeline(m_internalData->vk, m_internalData->device, DE_NULL, &pipelinePartCreateInfo);
+       }
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setupPreRasterizationShaderState(const std::vector<VkViewport>&                                      viewports,
+                                                                                                                                                                  const std::vector<VkRect2D>&                                         scissors,
+                                                                                                                                                                  const VkPipelineLayout                                                       layout,
+                                                                                                                                                                  const VkRenderPass                                                           renderPass,
+                                                                                                                                                                  const deUint32                                                                       subpass,
+                                                                                                                                                                  const VkShaderModule                                                         vertexShaderModule,
+                                                                                                                                                                  const VkPipelineRasterizationStateCreateInfo*        rasterizationState,
+                                                                                                                                                                  const VkShaderModule                                                         tessellationControlShaderModule,
+                                                                                                                                                                  const VkShaderModule                                                         tessellationEvalShaderModule,
+                                                                                                                                                                  const VkShaderModule                                                         geometryShaderModule,
+                                                                                                                                                                  const VkSpecializationInfo*                                          specializationInfo)
+{
+       // make sure pipeline was not already build
+       DE_ASSERT(m_pipelineFinal.get() == DE_NULL);
+
+       // make sure states are set in order - no need to complicate logic to support out of order specification - this state needs to be set second
+       DE_ASSERT(m_internalData && (m_internalData->setupStates == VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_KHR));
+       m_internalData->setupStates |= VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_KHR;
+
+       const bool hasTesc = (tessellationControlShaderModule != DE_NULL);
+       const bool hasTese = (tessellationEvalShaderModule != DE_NULL);
+       const bool hasGeom = (geometryShaderModule != DE_NULL);
+
+       const auto pRasterizationState = rasterizationState ? rasterizationState
+                                                                                                               : (m_internalData->useDefaultRasterizationState ? &m_internalData->defaultRasterizationState : DE_NULL);
+       const auto pTessellationState   = (hasTesc || hasTese) ? &m_internalData->tessellationState : DE_NULL;
+       const auto pViewportState               = m_internalData->useViewportState ? &m_internalData->viewportState : DE_NULL;
+
+       // reserve space for all stages including fragment - this is needed when we create monolithic pipeline
+       m_internalData->pipelineShaderStages = std::vector<VkPipelineShaderStageCreateInfo>(2u + hasTesc + hasTese + hasGeom,
+       {
+               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
+               specializationInfo                                                                              // const VkSpecializationInfo*                  pSpecializationInfo
+       });
+
+       std::vector<VkPipelineShaderStageCreateInfo>::iterator currStage = m_internalData->pipelineShaderStages.begin() + 1;
+       if (hasTesc)
+       {
+               currStage->stage        = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
+               currStage->module       = tessellationControlShaderModule;
+               ++currStage;
+       }
+       if (hasTese)
+       {
+               currStage->stage        = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
+               currStage->module       = tessellationEvalShaderModule;
+               ++currStage;
+       }
+       if (hasGeom)
+       {
+               currStage->stage        = VK_SHADER_STAGE_GEOMETRY_BIT;
+               currStage->module       = geometryShaderModule;
+       }
+
+       if (pViewportState)
+       {
+               if (!viewports.empty())
+               {
+                       pViewportState->viewportCount   = (deUint32)viewports.size();
+                       pViewportState->pViewports              = &viewports[0];
+               }
+               if (!scissors.empty())
+               {
+                       pViewportState->scissorCount    = (deUint32)scissors.size();
+                       pViewportState->pScissors               = &scissors[0];
+               }
+       }
+
+       if (m_internalData->pipelineConstructionType == PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC)
+       {
+               // make sure we dont overwrite layout specified with setupMonolithicPipelineLayout
+               if (m_internalData->monolithicPipelineCreateInfo.layout == 0)
+                       m_internalData->monolithicPipelineCreateInfo.layout = layout;
+
+               m_internalData->monolithicPipelineCreateInfo.renderPass                         = renderPass;
+               m_internalData->monolithicPipelineCreateInfo.subpass                            = subpass;
+               m_internalData->monolithicPipelineCreateInfo.pRasterizationState        = pRasterizationState;
+               m_internalData->monolithicPipelineCreateInfo.pViewportState                     = pViewportState;
+               m_internalData->monolithicPipelineCreateInfo.stageCount                         = 1u + hasTesc + hasTese + hasGeom;
+               m_internalData->monolithicPipelineCreateInfo.pStages                            = m_internalData->pipelineShaderStages.data();
+               m_internalData->monolithicPipelineCreateInfo.pTessellationState         = pTessellationState;
+       }
+       else
+       {
+               const auto libraryCreateInfo = makeGraphicsPipelineLibraryCreateInfo(VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_KHR);
+
+               VkGraphicsPipelineCreateInfo pipelinePartCreateInfo = initVulkanStructure();
+               pipelinePartCreateInfo.pNext                            = &libraryCreateInfo;
+               pipelinePartCreateInfo.flags                            = m_internalData->pipelineFlags | VK_PIPELINE_CREATE_LIBRARY_BIT_KHR;
+               pipelinePartCreateInfo.layout                           = layout;
+               pipelinePartCreateInfo.renderPass                       = renderPass;
+               pipelinePartCreateInfo.subpass                          = subpass;
+               pipelinePartCreateInfo.pRasterizationState      = pRasterizationState;
+               pipelinePartCreateInfo.pViewportState           = pViewportState;
+               pipelinePartCreateInfo.stageCount                       = 1u + hasTesc + hasTese + hasGeom;
+               pipelinePartCreateInfo.pStages                          = m_internalData->pipelineShaderStages.data();
+               pipelinePartCreateInfo.pTessellationState       = pTessellationState;
+               pipelinePartCreateInfo.pDynamicState            = m_internalData->pDynamicState;
+
+               if (m_internalData->pipelineConstructionType == PIPELINE_CONSTRUCTION_TYPE_FAST_LINKED_LIBRARY)
+                       pipelinePartCreateInfo.flags |= VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_KHR;
+
+               m_pipelineParts[1] = createGraphicsPipeline(m_internalData->vk, m_internalData->device, DE_NULL, &pipelinePartCreateInfo);
+       }
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setupFragmentShaderState(const VkPipelineLayout                                                              layout,
+                                                                                                                                                  const VkRenderPass                                                                   renderPass,
+                                                                                                                                                  const deUint32                                                                               subpass,
+                                                                                                                                                  const VkShaderModule                                                                 fragmentShaderModule,
+                                                                                                                                                  const VkPipelineDepthStencilStateCreateInfo*                 depthStencilState,
+                                                                                                                                                  const VkPipelineMultisampleStateCreateInfo*                  multisampleState,
+                                                                                                                                                  VkPipelineFragmentShadingRateStateCreateInfoKHR*             fragmentShadingRateState,
+                                                                                                                                                  const VkSpecializationInfo*                                                  specializationInfo)
+{
+       // make sure pipeline was not already build
+       DE_ASSERT(m_pipelineFinal.get() == DE_NULL);
+
+       // make sure states are set in order - no need to complicate logic to support out of order specification - this state needs to be set third
+       DE_ASSERT(m_internalData && (m_internalData->setupStates == (VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_KHR |
+                                                                                                                                VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_KHR)));
+       m_internalData->setupStates |= VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_KHR;
+
+       m_internalData->pFragmentShadingRateState = fragmentShadingRateState;
+
+       const auto pDepthStencilState   = depthStencilState ? depthStencilState
+                                                                                                               : (m_internalData->useDefaultDepthStencilState ? &defaultDepthStencilState : DE_NULL);
+       const auto pMultisampleState    = multisampleState ? multisampleState
+                                                                                                               : (m_internalData->useDefaultMultisampleState ? &defaultMultisampleState : DE_NULL);
+       const bool hasFrag                              = (fragmentShaderModule != DE_NULL);
+
+       deUint32 stageIndex = 1;
+       if (hasFrag)
+       {
+               // find free space for fragment shader
+               for (; stageIndex < 5; ++stageIndex)
+               {
+                       if (m_internalData->pipelineShaderStages[stageIndex].stage == VK_SHADER_STAGE_VERTEX_BIT)
+                       {
+                               m_internalData->pipelineShaderStages[stageIndex].stage                                  = VK_SHADER_STAGE_FRAGMENT_BIT;
+                               m_internalData->pipelineShaderStages[stageIndex].module                                 = fragmentShaderModule;
+                               m_internalData->pipelineShaderStages[stageIndex].pSpecializationInfo    = specializationInfo;
+                               break;
+                       }
+               }
+       }
+
+       if (m_internalData->pipelineConstructionType == PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC)
+       {
+               m_internalData->monolithicPipelineCreateInfo.pNext                              = m_internalData->pFragmentShadingRateState;
+               m_internalData->monolithicPipelineCreateInfo.pDepthStencilState = pDepthStencilState;
+               m_internalData->monolithicPipelineCreateInfo.pMultisampleState  = pMultisampleState;
+               m_internalData->monolithicPipelineCreateInfo.stageCount                 += !!fragmentShaderModule;
+       }
+       else
+       {
+               auto libraryCreateInfo = makeGraphicsPipelineLibraryCreateInfo(VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_KHR);
+               libraryCreateInfo.pNext = m_internalData->pFragmentShadingRateState;
+
+               VkGraphicsPipelineCreateInfo pipelinePartCreateInfo = initVulkanStructure();
+               pipelinePartCreateInfo.pNext                            = &libraryCreateInfo;
+               pipelinePartCreateInfo.flags                            = m_internalData->pipelineFlags | VK_PIPELINE_CREATE_LIBRARY_BIT_KHR;
+               pipelinePartCreateInfo.layout                           = layout;
+               pipelinePartCreateInfo.renderPass                       = renderPass;
+               pipelinePartCreateInfo.subpass                          = subpass;
+               pipelinePartCreateInfo.pDepthStencilState       = pDepthStencilState;
+               pipelinePartCreateInfo.pMultisampleState        = pMultisampleState;
+               pipelinePartCreateInfo.stageCount                       = hasFrag;
+               pipelinePartCreateInfo.pStages                          = hasFrag ? &m_internalData->pipelineShaderStages[stageIndex] : DE_NULL;
+               pipelinePartCreateInfo.pDynamicState            = m_internalData->pDynamicState;
+
+               if (m_internalData->pipelineConstructionType == PIPELINE_CONSTRUCTION_TYPE_FAST_LINKED_LIBRARY)
+                       pipelinePartCreateInfo.flags |= VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_KHR;
+
+               m_pipelineParts[2] = createGraphicsPipeline(m_internalData->vk, m_internalData->device, DE_NULL, &pipelinePartCreateInfo);
+       }
+
+       return *this;
+}
+
+GraphicsPipelineWrapper& GraphicsPipelineWrapper::setupFragmentOutputState(const VkRenderPass                                                  renderPass,
+                                                                                                                                                  const deUint32                                                               subpass,
+                                                                                                                                                  const VkPipelineColorBlendStateCreateInfo*   colorBlendState,
+                                                                                                                                                  const VkPipelineMultisampleStateCreateInfo*  multisampleState)
+{
+       // make sure pipeline was not already build
+       DE_ASSERT(m_pipelineFinal.get() == DE_NULL);
+
+       // make sure states are set in order - no need to complicate logic to support out of order specification - this state needs to be set last
+       DE_ASSERT(m_internalData && (m_internalData->setupStates == (VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_KHR |
+                                                                                                                                VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_KHR |
+                                                                                                                                VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_KHR)));
+       m_internalData->setupStates |= VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_KHR;
+
+       const auto pColorBlendState             = colorBlendState ? colorBlendState
+                                                                                                               : (m_internalData->useDefaultColorBlendState ? &defaultColorBlendState : DE_NULL);
+       const auto pMultisampleState    = multisampleState ? multisampleState
+                                                                                                               : (m_internalData->useDefaultMultisampleState ? &defaultMultisampleState : DE_NULL);
+
+       if (m_internalData->pipelineConstructionType == PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC)
+       {
+               m_internalData->monolithicPipelineCreateInfo.pNext                              = m_internalData->pFragmentShadingRateState;
+               m_internalData->monolithicPipelineCreateInfo.flags                              = m_internalData->pipelineFlags;
+               m_internalData->monolithicPipelineCreateInfo.pColorBlendState   = pColorBlendState;
+               m_internalData->monolithicPipelineCreateInfo.pMultisampleState  = pMultisampleState;
+       }
+       else
+       {
+               auto libraryCreateInfo = makeGraphicsPipelineLibraryCreateInfo(VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_KHR);
+               libraryCreateInfo.pNext = m_internalData->pFragmentShadingRateState;
+
+               VkGraphicsPipelineCreateInfo pipelinePartCreateInfo = initVulkanStructure();
+               pipelinePartCreateInfo.pNext                            = &libraryCreateInfo;
+               pipelinePartCreateInfo.flags                            = m_internalData->pipelineFlags | VK_PIPELINE_CREATE_LIBRARY_BIT_KHR;
+               pipelinePartCreateInfo.renderPass                       = renderPass;
+               pipelinePartCreateInfo.subpass                          = subpass;
+               pipelinePartCreateInfo.pColorBlendState         = pColorBlendState;
+               pipelinePartCreateInfo.pMultisampleState        = pMultisampleState;
+               pipelinePartCreateInfo.pDynamicState            = m_internalData->pDynamicState;
+
+               if (m_internalData->pipelineConstructionType == PIPELINE_CONSTRUCTION_TYPE_FAST_LINKED_LIBRARY)
+                       pipelinePartCreateInfo.flags |= VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_KHR;
+
+               m_pipelineParts[3] = createGraphicsPipeline(m_internalData->vk, m_internalData->device, DE_NULL, &pipelinePartCreateInfo);
+       }
+
+       return *this;
+}
+
+void GraphicsPipelineWrapper::buildPipeline(const VkPipelineCache                                                              pipelineCache,
+                                                                                       const VkPipeline                                                                        basePipelineHandle,
+                                                                                       const deInt32                                                                           basePipelineIndex,
+                                                                                       const VkPipelineCreationFeedbackCreateInfoEXT*          creationFeedback)
+{
+       // make sure we are not trying to build pipeline second time
+       DE_ASSERT(m_pipelineFinal.get() == DE_NULL);
+
+       // make sure all states were set
+       DE_ASSERT(m_internalData && (m_internalData->setupStates == (VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_KHR |
+                                                                                                                                VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_KHR |
+                                                                                                                                VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_KHR |
+                                                                                                                                VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_KHR)));
+
+       VkGraphicsPipelineCreateInfo*   pointerToCreateInfo     = &m_internalData->monolithicPipelineCreateInfo;
+       VkGraphicsPipelineCreateInfo    linkedCreateInfo        = initVulkanStructure();
+       VkPipeline                                              rawPipelines[4];
+       VkPipelineLibraryCreateInfoKHR  linkingInfo
+       {
+               VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR,             // VkStructureType              sType;
+               creationFeedback,                                                                               // const void*                  pNext;
+               4,                                                                                                              // deUint32                             libraryCount;
+               rawPipelines                                                                                    // const VkPipeline*    pLibraries;
+       };
+
+       if (m_internalData->pipelineConstructionType != PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC)
+       {
+               for (deUint32 i = 0; i < 4; ++i)
+                       rawPipelines[i] = m_pipelineParts[i].get();
+
+               linkedCreateInfo.pNext  = &linkingInfo;
+               linkedCreateInfo.flags  = m_internalData->pipelineFlags;
+               pointerToCreateInfo             = &linkedCreateInfo;
+       }
+       else if (creationFeedback)
+       {
+               // if pNext is not NULL logic to handle pNext chain should be added
+               DE_ASSERT(pointerToCreateInfo->pNext == DE_NULL);
+               pointerToCreateInfo->pNext = creationFeedback;
+       }
+
+       pointerToCreateInfo->basePipelineHandle = basePipelineHandle;
+       pointerToCreateInfo->basePipelineIndex  = basePipelineIndex;
+
+       m_pipelineFinal = createGraphicsPipeline(m_internalData->vk, m_internalData->device, pipelineCache, pointerToCreateInfo);
+
+       // pipeline was created - we can free CreateInfo structures
+       m_internalData.clear();
+}
+
+deBool GraphicsPipelineWrapper::wasBuild() const
+{
+       return !!m_pipelineFinal.get();
+}
+
+VkPipeline GraphicsPipelineWrapper::getPipeline() const
+{
+       DE_ASSERT(m_pipelineFinal.get() != DE_NULL);
+       return m_pipelineFinal.get();
+}
+
+void GraphicsPipelineWrapper::destroyPipeline(void)
+{
+       DE_ASSERT(m_pipelineFinal.get() != DE_NULL);
+
+       m_pipelineFinal = Move<VkPipeline>();
+}
+
+} // vk
diff --git a/external/vulkancts/framework/vulkan/vkPipelineConstructionUtil.hpp b/external/vulkancts/framework/vulkan/vkPipelineConstructionUtil.hpp
new file mode 100644 (file)
index 0000000..ec895a8
--- /dev/null
@@ -0,0 +1,171 @@
+#ifndef _VKPIPELINECONSTRUCTIONUTIL_HPP
+#define _VKPIPELINECONSTRUCTIONUTIL_HPP
+/*------------------------------------------------------------------------
+ * Vulkan Conformance Tests
+ * ------------------------
+ *
+ * Copyright (c) 2021 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 Wrapper that can construct monolithic pipeline or use
+          VK_KHR_graphics_pipeline_library for pipeline construction.
+ *//*--------------------------------------------------------------------*/
+
+#include "vkRef.hpp"
+#include "vkDefs.hpp"
+#include "tcuDefs.hpp"
+#include "deSharedPtr.hpp"
+#include <vector>
+
+namespace vk
+{
+
+enum PipelineConstructionType
+{
+       PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC                   = 0,    // Construct legacy - monolithic pipeline
+       PIPELINE_CONSTRUCTION_TYPE_OPTIMISED_LIBRARY,                   // Use VK_KHR_graphics_pipeline_library and construc pipeline out of 4 pipeline parts
+       PIPELINE_CONSTRUCTION_TYPE_FAST_LINKED_LIBRARY                  // Same as PIPELINE_CONSTRUCTION_TYPE_OPTIMISED_LIBRARY but with fast linking
+};
+
+// Class that can build monolithic pipeline or fully separated pipeline libraries
+// depending on PipelineType specified in the constructor.
+// Rarely needed configuration was extracted to setDefault*/disable* functions while common
+// state setup is provided as arguments of four setup* functions - one for each state group.
+class GraphicsPipelineWrapper
+{
+public:
+                                                               GraphicsPipelineWrapper                         (const DeviceInterface&                         vk,
+                                                                                                                                        VkDevice                                                       device,
+                                                                                                                                        const PipelineConstructionType         pipelineConstructionType,
+                                                                                                                                        const VkPipelineCreateFlags            flags = 0u);
+
+                                                               GraphicsPipelineWrapper                         (GraphicsPipelineWrapper&&);
+
+                                                               ~GraphicsPipelineWrapper                        (void) = default;
+
+
+       // By default pipelineLayout used for monotlithic pipeline is taken from layout specified
+       // in setupPreRasterizationShaderState but when there are also descriptor sets needed for fragment
+       // shader bindings then separate pipeline layout for monolithic pipeline must be provided
+       GraphicsPipelineWrapper&        setMonolithicPipelineLayout                     (const VkPipelineLayout layout);
+
+
+       // By default dynamic state has to be specified before specifying other CreateInfo structures
+       GraphicsPipelineWrapper&        setDynamicState                                         (const VkPipelineDynamicStateCreateInfo* dynamicState);
+
+       // Specify topology that is used by default InputAssemblyState in vertex input state. This needs to be
+       // specified only when there is no custom InputAssemblyState provided in setupVertexInputStete and when
+       // topology is diferent then VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST which is used by default.
+       GraphicsPipelineWrapper&        setDefaultTopology                                      (const VkPrimitiveTopology topology);
+
+       // Specify patch control points that is used by default TessellationState in pre-rasterization shader state.
+       // This can to be specified only when there is no custom TessellationState provided in
+       // setupPreRasterizationShaderState and when patchControlPoints is diferent then 3 which is used by default.
+       GraphicsPipelineWrapper&        setDefaultPatchControlPoints            (const deUint32 patchControlPoints);
+
+       // Enable discarding of primitives that is used by default RasterizationState in pre-rasterization shader state.
+       // This can be specified only when there is no custom RasterizationState provided in setupPreRasterizationShaderState.
+       GraphicsPipelineWrapper&        setDefaultRasterizerDiscardEnable       (const deBool rasterizerDiscardEnable = DE_TRUE);
+
+       // When some states are not provided then default structures can be used. This behaviour can be turned on by one of below methods.
+       // Some tests require those states to be NULL so we can't assume using default versions.
+       GraphicsPipelineWrapper&        setDefaultRasterizationState            (void);
+       GraphicsPipelineWrapper&        setDefaultDepthStencilState                     (void);
+       GraphicsPipelineWrapper&        setDefaultColorBlendState                       (void);
+       GraphicsPipelineWrapper&        setDefaultMultisampleState                      (void);
+
+       // Pre-rasterization shader state uses provieded viewports and scissors to create ViewportState. By default
+       // number of viewports and scissors is same as number of items in vector but when vectors are empty then by
+       // default count of viewports/scissors is set to 1. This can be changed by below functions.
+       GraphicsPipelineWrapper&        setDefaultViewportsCount                        (deUint32 viewportCount = 0u);
+       GraphicsPipelineWrapper&        setDefaultScissorsCount                         (deUint32 scissorCount = 0u);
+
+       // Pre-rasterization shader state uses provieded viewports and scissors to create ViewportState. When disableViewportState
+       // is used then ViewportState won't be constructed and NULL will be used.
+       GraphicsPipelineWrapper&        disableViewportState                            (void);
+
+
+       // Setup vertex input state. When VertexInputState or InputAssemblyState are not provided then default structures will be used.
+       GraphicsPipelineWrapper&        setupVertexInputStete                           (const VkPipelineVertexInputStateCreateInfo*            vertexInputState = DE_NULL,
+                                                                                                                                        const VkPipelineInputAssemblyStateCreateInfo*          inputAssemblyState = DE_NULL);
+
+       // Setup pre-rasterization shader state.
+       GraphicsPipelineWrapper&        setupPreRasterizationShaderState        (const std::vector<VkViewport>&                                         viewports,
+                                                                                                                                        const std::vector<VkRect2D>&                                           scissors,
+                                                                                                                                        const VkPipelineLayout                                                         layout,
+                                                                                                                                        const VkRenderPass                                                                     renderPass,
+                                                                                                                                        const deUint32                                                                         subpass,
+                                                                                                                                        const VkShaderModule                                                           vertexShaderModule,
+                                                                                                                                        const VkPipelineRasterizationStateCreateInfo*          rasterizationState = DE_NULL,
+                                                                                                                                        const VkShaderModule                                                           tessellationControlShaderModule = DE_NULL,
+                                                                                                                                        const VkShaderModule                                                           tessellationEvalShaderModule = DE_NULL,
+                                                                                                                                        const VkShaderModule                                                           geometryShaderModule = DE_NULL,
+                                                                                                                                        const VkSpecializationInfo*                                            specializationInfo = DE_NULL);
+
+       // Setup fragment shader state.
+       GraphicsPipelineWrapper&        setupFragmentShaderState                        (const VkPipelineLayout                                                         layout,
+                                                                                                                                        const VkRenderPass                                                                     renderPass,
+                                                                                                                                        const deUint32                                                                         subpass,
+                                                                                                                                        const VkShaderModule                                                           fragmentShaderModule,
+                                                                                                                                        const VkPipelineDepthStencilStateCreateInfo*           depthStencilState = DE_NULL,
+                                                                                                                                        const VkPipelineMultisampleStateCreateInfo*            multisampleState = DE_NULL,
+                                                                                                                                        VkPipelineFragmentShadingRateStateCreateInfoKHR*       fragmentShadingRateState = DE_NULL,
+                                                                                                                                        const VkSpecializationInfo*                                            specializationInfo = DE_NULL);
+
+       // Setup fragment output state.
+       GraphicsPipelineWrapper&        setupFragmentOutputState                        (const VkRenderPass                                                                     renderPass,
+                                                                                                                                        const deUint32                                                                         subpass = 0u,
+                                                                                                                                        const VkPipelineColorBlendStateCreateInfo*                     colorBlendState = DE_NULL,
+                                                                                                                                        const VkPipelineMultisampleStateCreateInfo*            multisampleState = DE_NULL/*,
+                                                                                                                                        const VkPipelineRenderingCreateInfoKHR*                        rendering = DE_NULL*/);
+
+
+       // Build pipeline object out of provided state.
+       void                                            buildPipeline                                           (const VkPipelineCache                                                          pipelineCache = DE_NULL,
+                                                                                                                                        const VkPipeline                                                                       basePipelineHandle = DE_NULL,
+                                                                                                                                        const deInt32                                                                          basePipelineIndex = 0,
+                                                                                                                                        const VkPipelineCreationFeedbackCreateInfoEXT*         creationFeedback = DE_NULL);
+
+       // Returns true when pipeline was build using buildPipeline method.
+       deBool                                          wasBuild                                                        (void) const;
+
+       // Get compleate pipeline. GraphicsPipelineWrapper preserves ovnership and will desroy pipeline in its destructor.
+       vk::VkPipeline                          getPipeline                                                     (void) const;
+
+       // Destroy compleate pipeline - pipeline parts are not destroyed.
+       void                                            destroyPipeline                                         (void);
+
+protected:
+
+       // No default constructor - use parametrized constructor or emplace_back in case of vectors.
+       GraphicsPipelineWrapper() = default;
+
+       struct InternalData;
+
+protected:
+
+       // Store partial pipelines when non monolithic construction was used.
+       Move<VkPipeline>                                m_pipelineParts[4];
+
+       // Store monolithic pipeline or linked pipeline libraries.
+       Move<VkPipeline>                                m_pipelineFinal;
+
+       // Store internal data that is needed only for pipeline construction.
+       de::SharedPtr<InternalData>             m_internalData;
+};
+} // vk
+
+#endif // _VKPIPELINECONSTRUCTIONUTIL_HPP
index 76ca72c..9b4b8e3 100644 (file)
@@ -1,6 +1,7 @@
 include_directories(
        ..
        ../draw
+       ../util
        )
 
 set(DEQP_VK_DYNAMIC_STATE_SRCS
index 22baf45..c309014 100644 (file)
@@ -35,11 +35,12 @@ namespace DynamicState
 
 using namespace Draw;
 
-DynamicStateBaseClass::DynamicStateBaseClass (Context& context, const char* vertexShaderName, const char* fragmentShaderName)
+DynamicStateBaseClass::DynamicStateBaseClass (Context& context, vk::PipelineConstructionType pipelineConstructionType, const char* vertexShaderName, const char* fragmentShaderName)
        : TestInstance                          (context)
-       , m_colorAttachmentFormat   (vk::VK_FORMAT_R8G8B8A8_UNORM)
+       , m_colorAttachmentFormat       (vk::VK_FORMAT_R8G8B8A8_UNORM)
        , m_topology                            (vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP)
        , m_vk                                          (context.getDeviceInterface())
+       , m_pipeline                            (context.getDeviceInterface(), context.getDevice(), pipelineConstructionType)
        , m_vertexShaderName            (vertexShaderName)
        , m_fragmentShaderName          (fragmentShaderName)
 {
@@ -166,24 +167,31 @@ void DynamicStateBaseClass::initFramebuffer (const vk::VkDevice device)
 
 void DynamicStateBaseClass::initPipeline (const vk::VkDevice device)
 {
-       const vk::Unique<vk::VkShaderModule> vs(createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
-       const vk::Unique<vk::VkShaderModule> fs(createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
-
-       const PipelineCreateInfo::ColorBlendState::Attachment vkCbAttachmentState;
-
-       PipelineCreateInfo pipelineCreateInfo(*m_pipelineLayout, *m_renderPass, 0, 0);
-       pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
-       pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
-       pipelineCreateInfo.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
-       pipelineCreateInfo.addState(PipelineCreateInfo::InputAssemblerState(m_topology));
-       pipelineCreateInfo.addState(PipelineCreateInfo::ColorBlendState(1, &vkCbAttachmentState));
-       pipelineCreateInfo.addState(PipelineCreateInfo::ViewportState(1));
-       pipelineCreateInfo.addState(PipelineCreateInfo::DepthStencilState());
-       pipelineCreateInfo.addState(PipelineCreateInfo::RasterizerState());
-       pipelineCreateInfo.addState(PipelineCreateInfo::MultiSampleState());
-       pipelineCreateInfo.addState(PipelineCreateInfo::DynamicState());
-
-       m_pipeline = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo);
+       const PipelineCreateInfo::ColorBlendState::Attachment   attachmentState;
+       const PipelineCreateInfo::ColorBlendState                               colorBlendState(1, &attachmentState);
+       const PipelineCreateInfo::RasterizerState                               rasterizerState;
+       const PipelineCreateInfo::DepthStencilState                             depthStencilState;
+       const PipelineCreateInfo::DynamicState                                  dynamicState;
+
+       const vk::Unique<vk::VkShaderModule>    vs                      (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
+       const vk::Unique<vk::VkShaderModule>    fs                      (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
+       std::vector<vk::VkViewport>                             viewports       { { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f } };
+       std::vector<vk::VkRect2D>                               scissors        { { { 0u, 0u }, { 0u, 0u } }};
+
+       m_pipeline.setDefaultTopology(m_topology)
+                         .setDynamicState(static_cast<const vk::VkPipelineDynamicStateCreateInfo*>(&dynamicState))
+                         .setDefaultMultisampleState()
+                         .setupVertexInputStete(&m_vertexInputState)
+                         .setupPreRasterizationShaderState(viewports,
+                                                                                               scissors,
+                                                                                               *m_pipelineLayout,
+                                                                                               *m_renderPass,
+                                                                                               0u,
+                                                                                               *vs,
+                                                                                               static_cast<const vk::VkPipelineRasterizationStateCreateInfo*>(&rasterizerState))
+                         .setupFragmentShaderState(*m_pipelineLayout, *m_renderPass, 0u, *fs, static_cast<const vk::VkPipelineDepthStencilStateCreateInfo*>(&depthStencilState))
+                         .setupFragmentOutputState(*m_renderPass, 0u, static_cast<const vk::VkPipelineColorBlendStateCreateInfo*>(&colorBlendState))
+                         .buildPipeline();
 }
 
 tcu::TestStatus DynamicStateBaseClass::iterate (void)
index f179c72..1804219 100644 (file)
@@ -31,6 +31,7 @@
 #include "vktDrawImageObjectUtil.hpp"
 #include "vktDrawBufferObjectUtil.hpp"
 #include "vktDrawCreateInfoUtil.hpp"
+#include "vkPipelineConstructionUtil.hpp"
 
 namespace vkt
 {
@@ -40,7 +41,8 @@ namespace DynamicState
 class DynamicStateBaseClass : public TestInstance
 {
 public:
-       DynamicStateBaseClass (Context& context, const char* vertexShaderName, const char* fragmentShaderName);
+       DynamicStateBaseClass (Context& context, vk::PipelineConstructionType pipelineConstructionType,
+                                                  const char* vertexShaderName, const char* fragmentShaderName);
 
 protected:
        void                                    initialize                                              (void);
@@ -91,7 +93,7 @@ protected:
 
        const vk::DeviceInterface&                                              m_vk;
 
-       vk::Move<vk::VkPipeline>                                                m_pipeline;
+       vk::GraphicsPipelineWrapper                                             m_pipeline;
        vk::Move<vk::VkPipelineLayout>                                  m_pipelineLayout;
 
        de::SharedPtr<Draw::Image>                                              m_colorTargetImage;
index 499a6df..1b2e55a 100644 (file)
@@ -47,8 +47,8 @@ namespace
 class BlendConstantsTestInstance : public DynamicStateBaseClass
 {
 public:
-       BlendConstantsTestInstance (Context& context, ShaderMap shaders)
-               : DynamicStateBaseClass (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       BlendConstantsTestInstance (Context& context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : DynamicStateBaseClass (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
        {
                m_topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
 
@@ -62,27 +62,33 @@ public:
 
        virtual void initPipeline (const vk::VkDevice device)
        {
-               const vk::Unique<vk::VkShaderModule> vs (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
-               const vk::Unique<vk::VkShaderModule> fs (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
-
-               const vk::VkPipelineColorBlendAttachmentState VkPipelineColorBlendAttachmentState =
-                       PipelineCreateInfo::ColorBlendState::Attachment(VK_TRUE,
-                                                                                                                       vk::VK_BLEND_FACTOR_SRC_ALPHA, vk::VK_BLEND_FACTOR_CONSTANT_COLOR, vk::VK_BLEND_OP_ADD,
-                                                                                                                       vk::VK_BLEND_FACTOR_SRC_ALPHA, vk::VK_BLEND_FACTOR_CONSTANT_ALPHA, vk::VK_BLEND_OP_ADD);
-
-               PipelineCreateInfo pipelineCreateInfo(*m_pipelineLayout, *m_renderPass, 0, 0);
-               pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
-               pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
-               pipelineCreateInfo.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
-               pipelineCreateInfo.addState(PipelineCreateInfo::InputAssemblerState(m_topology));
-               pipelineCreateInfo.addState(PipelineCreateInfo::ColorBlendState(1, &VkPipelineColorBlendAttachmentState));
-               pipelineCreateInfo.addState(PipelineCreateInfo::ViewportState(1));
-               pipelineCreateInfo.addState(PipelineCreateInfo::DepthStencilState());
-               pipelineCreateInfo.addState(PipelineCreateInfo::RasterizerState());
-               pipelineCreateInfo.addState(PipelineCreateInfo::MultiSampleState());
-               pipelineCreateInfo.addState(PipelineCreateInfo::DynamicState());
-
-               m_pipeline = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo);
+               const vk::Unique<vk::VkShaderModule>    vs                      (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
+               const vk::Unique<vk::VkShaderModule>    fs                      (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
+               std::vector<vk::VkViewport>                             viewports       { { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f } };
+               std::vector<vk::VkRect2D>                               scissors        { { { 0u, 0u }, { 0u, 0u } } };
+
+               const PipelineCreateInfo::ColorBlendState::Attachment   attachmentState(VK_TRUE,
+                                                                                                                                                               vk::VK_BLEND_FACTOR_SRC_ALPHA, vk::VK_BLEND_FACTOR_CONSTANT_COLOR, vk::VK_BLEND_OP_ADD,
+                                                                                                                                                               vk::VK_BLEND_FACTOR_SRC_ALPHA, vk::VK_BLEND_FACTOR_CONSTANT_ALPHA, vk::VK_BLEND_OP_ADD);
+               const PipelineCreateInfo::ColorBlendState                               colorBlendState(1, static_cast<const vk::VkPipelineColorBlendAttachmentState*>(&attachmentState));
+               const PipelineCreateInfo::RasterizerState                               rasterizerState;
+               const PipelineCreateInfo::DepthStencilState                             depthStencilState;
+               const PipelineCreateInfo::DynamicState                                  dynamicState;
+
+               m_pipeline.setDefaultTopology(m_topology)
+                                 .setDynamicState(static_cast<const vk::VkPipelineDynamicStateCreateInfo*>(&dynamicState))
+                                 .setDefaultMultisampleState()
+                                 .setupVertexInputStete(&m_vertexInputState)
+                                 .setupPreRasterizationShaderState(viewports,
+                                                                                                       scissors,
+                                                                                                       *m_pipelineLayout,
+                                                                                                       *m_renderPass,
+                                                                                                       0u,
+                                                                                                       *vs,
+                                                                                                       static_cast<const vk::VkPipelineRasterizationStateCreateInfo*>(&rasterizerState))
+                                 .setupFragmentShaderState(*m_pipelineLayout, *m_renderPass, 0u, *fs, static_cast<const vk::VkPipelineDepthStencilStateCreateInfo*>(&depthStencilState))
+                                 .setupFragmentOutputState(*m_renderPass, 0u, static_cast<const vk::VkPipelineColorBlendStateCreateInfo*>(&colorBlendState))
+                                 .buildPipeline();
        }
 
        virtual tcu::TestStatus iterate (void)
@@ -94,7 +100,7 @@ public:
                const vk::VkClearColorValue clearColor = { { 1.0f, 1.0f, 1.0f, 1.0f } };
                beginRenderPassWithClearColor(clearColor);
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline.getPipeline());
 
                // bind states here
                setDynamicViewportState(WIDTH, HEIGHT);
@@ -154,8 +160,9 @@ public:
 
 } //anonymous
 
-DynamicStateCBTests::DynamicStateCBTests (tcu::TestContext& testCtx)
-       : TestCaseGroup (testCtx, "cb_state", "Tests for color blend state")
+DynamicStateCBTests::DynamicStateCBTests (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType)
+       : TestCaseGroup                                 (testCtx, "cb_state", "Tests for color blend state")
+       , m_pipelineConstructionType    (pipelineConstructionType)
 {
        /* Left blank on purpose */
 }
@@ -167,7 +174,7 @@ void DynamicStateCBTests::init (void)
        ShaderMap shaderPaths;
        shaderPaths[glu::SHADERTYPE_VERTEX] = "vulkan/dynamic_state/VertexFetch.vert";
        shaderPaths[glu::SHADERTYPE_FRAGMENT] = "vulkan/dynamic_state/VertexFetch.frag";
-       addChild(new InstanceFactory<BlendConstantsTestInstance>(m_testCtx, "blend_constants", "Check if blend constants are working properly", shaderPaths));
+       addChild(new InstanceFactory<BlendConstantsTestInstance>(m_testCtx, "blend_constants", "Check if blend constants are working properly", m_pipelineConstructionType, shaderPaths));
 }
 
 } // DynamicState
index eeae9d7..edfae5f 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "tcuDefs.hpp"
 #include "vktTestCase.hpp"
+#include "vkPipelineConstructionUtil.hpp"
 
 namespace vkt
 {
@@ -35,13 +36,15 @@ namespace DynamicState
 class DynamicStateCBTests : public tcu::TestCaseGroup
 {
 public:
-                                                       DynamicStateCBTests                     (tcu::TestContext& testCtx);
+                                                       DynamicStateCBTests                     (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType);
                                                        ~DynamicStateCBTests            (void);
        void                                    init                                            (void);
 
 private:
        DynamicStateCBTests                                                                     (const DynamicStateCBTests &other);
        DynamicStateCBTests&    operator=                                       (const DynamicStateCBTests &other);
+
+       vk::PipelineConstructionType    m_pipelineConstructionType;
 };
 
 } // DynamicState
index af7ac93..1609a88 100644 (file)
@@ -58,12 +58,14 @@ namespace
 class DepthStencilBaseCase : public TestInstance
 {
 public:
-       DepthStencilBaseCase (Context& context, const char* vertexShaderName, const char* fragmentShaderName)
+       DepthStencilBaseCase (Context& context, vk::PipelineConstructionType pipelineConstructionType, const char* vertexShaderName, const char* fragmentShaderName)
                : TestInstance                                          (context)
                , m_colorAttachmentFormat                       (vk::VK_FORMAT_R8G8B8A8_UNORM)
                , m_depthStencilAttachmentFormat        (vk::VK_FORMAT_UNDEFINED)
                , m_topology                                            (vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP)
                , m_vk                                                          (context.getDeviceInterface())
+               , m_pipeline_1                                          (m_vk, context.getDevice(), pipelineConstructionType)
+               , m_pipeline_2                                          (m_vk, context.getDevice(), pipelineConstructionType)
                , m_vertexShaderName                            (vertexShaderName)
                , m_fragmentShaderName                          (fragmentShaderName)
        {
@@ -84,8 +86,8 @@ protected:
 
        const vk::DeviceInterface&                                              m_vk;
 
-       vk::Move<vk::VkPipeline>                                                m_pipeline_1;
-       vk::Move<vk::VkPipeline>                                                m_pipeline_2;
+       vk::GraphicsPipelineWrapper                                             m_pipeline_1;
+       vk::GraphicsPipelineWrapper                                             m_pipeline_2;
        vk::Move<vk::VkPipelineLayout>                                  m_pipelineLayout;
 
        de::SharedPtr<Image>                                                    m_colorTargetImage;
@@ -236,34 +238,43 @@ protected:
                        2,
                        vertexInputAttributeDescriptions);
 
-               const PipelineCreateInfo::ColorBlendState::Attachment vkCbAttachmentState;
-
-               PipelineCreateInfo pipelineCreateInfo_1(*m_pipelineLayout, *m_renderPass, 0, 0);
-               pipelineCreateInfo_1.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
-               pipelineCreateInfo_1.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::InputAssemblerState(m_topology));
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::ColorBlendState(1, &vkCbAttachmentState));
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::ViewportState(1));
-               pipelineCreateInfo_1.addState(m_depthStencilState_1);
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::RasterizerState());
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::MultiSampleState());
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::DynamicState());
-
-               PipelineCreateInfo pipelineCreateInfo_2(*m_pipelineLayout, *m_renderPass, 0, 0);
-               pipelineCreateInfo_2.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
-               pipelineCreateInfo_2.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::InputAssemblerState(m_topology));
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::ColorBlendState(1, &vkCbAttachmentState));
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::ViewportState(1));
-               pipelineCreateInfo_2.addState(m_depthStencilState_2);
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::RasterizerState());
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::MultiSampleState());
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::DynamicState());
-
-               m_pipeline_1 = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo_1);
-               m_pipeline_2 = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo_2);
+               std::vector<vk::VkViewport>             viewports       { { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f } };
+               std::vector<vk::VkRect2D>               scissors        { { { 0u, 0u }, { 0u, 0u } } };
+
+               const PipelineCreateInfo::ColorBlendState::Attachment   attachmentState;
+               const PipelineCreateInfo::ColorBlendState                               colorBlendState(1u, static_cast<const vk::VkPipelineColorBlendAttachmentState*>(&attachmentState));
+               const PipelineCreateInfo::RasterizerState                               rasterizerState;
+               PipelineCreateInfo::DynamicState                                                dynamicState;
+
+               m_pipeline_1.setDefaultTopology(m_topology)
+                                       .setDynamicState(static_cast<const vk::VkPipelineDynamicStateCreateInfo*>(&dynamicState))
+                                       .setDefaultMultisampleState()
+                                       .setupVertexInputStete(&m_vertexInputState)
+                                       .setupPreRasterizationShaderState(viewports,
+                                                                                                         scissors,
+                                                                                                         *m_pipelineLayout,
+                                                                                                         *m_renderPass,
+                                                                                                         0u,
+                                                                                                         *vs,
+                                                                                                         static_cast<const vk::VkPipelineRasterizationStateCreateInfo*>(&rasterizerState))
+                                       .setupFragmentShaderState(*m_pipelineLayout, *m_renderPass, 0u, *fs, static_cast<const vk::VkPipelineDepthStencilStateCreateInfo*>(&m_depthStencilState_1))
+                                       .setupFragmentOutputState(*m_renderPass, 0u, static_cast<const vk::VkPipelineColorBlendStateCreateInfo*>(&colorBlendState))
+                                       .buildPipeline();
+
+               m_pipeline_2.setDefaultTopology(m_topology)
+                                       .setDynamicState(static_cast<const vk::VkPipelineDynamicStateCreateInfo*>(&dynamicState))
+                                       .setDefaultMultisampleState()
+                                       .setupVertexInputStete(&m_vertexInputState)
+                                       .setupPreRasterizationShaderState(viewports,
+                                                                                                         scissors,
+                                                                                                         *m_pipelineLayout,
+                                                                                                         *m_renderPass,
+                                                                                                         0u,
+                                                                                                         *vs,
+                                                                                                         static_cast<const vk::VkPipelineRasterizationStateCreateInfo*>(&rasterizerState))
+                                       .setupFragmentShaderState(*m_pipelineLayout, *m_renderPass, 0u, *fs, static_cast<const vk::VkPipelineDepthStencilStateCreateInfo*>(&m_depthStencilState_2))
+                                       .setupFragmentOutputState(*m_renderPass, 0u, static_cast<const vk::VkPipelineColorBlendStateCreateInfo*>(&colorBlendState))
+                                       .buildPipeline();
 
                std::vector<vk::VkImageView> attachments(2);
                attachments[0] = *m_colorTargetView;
@@ -391,8 +402,8 @@ protected:
 class DepthBoundsParamTestInstance : public DepthStencilBaseCase
 {
 public:
-       DepthBoundsParamTestInstance (Context &context, ShaderMap shaders)
-               : DepthStencilBaseCase (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       DepthBoundsParamTestInstance (Context &context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : DepthStencilBaseCase (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
        {
                m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 0.375f, 1.0f), tcu::RGBA::green().toVec()));
                m_data.push_back(PositionColorVertex(tcu::Vec4(0.0f, 1.0f, 0.375f, 1.0f), tcu::RGBA::green().toVec()));
@@ -437,11 +448,11 @@ public:
                const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
                m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_1);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline_1.getPipeline());
                m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 0, 0);
                m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 4, 0);
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_2);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline_2.getPipeline());
                m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 8, 0);
 
                endRenderPass(m_vk, *m_cmdBuffer);
@@ -501,8 +512,9 @@ public:
        };
        static const float                                      depthBounds[DEPTH_BOUNDS_COUNT];
 
-                                                               DepthBoundsTestInstance         (Context&                               context,
-                                                                                                                        ShaderMap                              shaders);
+                                                               DepthBoundsTestInstance         (Context&                                               context,
+                                                                                                                        vk::PipelineConstructionType   pipelineConstructionType,
+                                                                                                                        ShaderMap                                              shaders);
        virtual void                            initRenderPass                          (const vk::VkDevice             device);
        virtual void                            initFramebuffer                         (const vk::VkDevice             device);
        virtual void                            initPipeline                            (const vk::VkDevice             device);
@@ -520,8 +532,8 @@ const float DepthBoundsTestInstance::depthBounds[DEPTH_BOUNDS_COUNT] =
        0.9f
 };
 
-DepthBoundsTestInstance::DepthBoundsTestInstance(Context& context, ShaderMap shaders)
-       : DynamicStateBaseClass         (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+DepthBoundsTestInstance::DepthBoundsTestInstance(Context& context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+       : DynamicStateBaseClass         (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
        , m_depthAttachmentFormat       (vk::VK_FORMAT_D16_UNORM)
 {
        const vk::VkDevice device = m_context.getDevice();
@@ -607,27 +619,33 @@ void DepthBoundsTestInstance::initFramebuffer (const vk::VkDevice device)
 
 void DepthBoundsTestInstance::initPipeline (const vk::VkDevice device)
 {
-       const vk::Unique<vk::VkShaderModule> vs(createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
-       const vk::Unique<vk::VkShaderModule> fs(createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
-
-       const PipelineCreateInfo::ColorBlendState::Attachment vkCbAttachmentState;
-
-       PipelineCreateInfo pipelineCreateInfo(*m_pipelineLayout, *m_renderPass, 0, 0);
-       pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
-       pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
-       pipelineCreateInfo.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
-       pipelineCreateInfo.addState(PipelineCreateInfo::InputAssemblerState(m_topology));
-       pipelineCreateInfo.addState(PipelineCreateInfo::ColorBlendState(1, &vkCbAttachmentState));
-       pipelineCreateInfo.addState(PipelineCreateInfo::ViewportState(1));
-       pipelineCreateInfo.addState(PipelineCreateInfo::DepthStencilState(false, false, vk::VK_COMPARE_OP_NEVER, true));
-       pipelineCreateInfo.addState(PipelineCreateInfo::RasterizerState());
-       pipelineCreateInfo.addState(PipelineCreateInfo::MultiSampleState());
-       pipelineCreateInfo.addState(PipelineCreateInfo::DynamicState());
-
-       m_pipeline = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo);
+       const vk::Unique<vk::VkShaderModule>    vs                      (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
+       const vk::Unique<vk::VkShaderModule>    fs                      (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
+       std::vector<vk::VkViewport>                             viewports       { { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f } };
+       std::vector<vk::VkRect2D>                               scissors        { { { 0u, 0u }, { 0u, 0u } } };
+
+       const PipelineCreateInfo::ColorBlendState::Attachment   attachmentState;
+       const PipelineCreateInfo::ColorBlendState                               colorBlendState(1u, static_cast<const vk::VkPipelineColorBlendAttachmentState*>(&attachmentState));
+       const PipelineCreateInfo::RasterizerState                               rasterizerState;
+       const PipelineCreateInfo::DepthStencilState                             depthStencilState(false, false, vk::VK_COMPARE_OP_NEVER, true);
+       const PipelineCreateInfo::DynamicState                                  dynamicState;
+
+       m_pipeline.setDefaultTopology(m_topology)
+                         .setDynamicState(static_cast<const vk::VkPipelineDynamicStateCreateInfo*>(&dynamicState))
+                         .setDefaultMultisampleState()
+                         .setupVertexInputStete(&m_vertexInputState)
+                         .setupPreRasterizationShaderState(viewports,
+                                                                                               scissors,
+                                                                                               *m_pipelineLayout,
+                                                                                               *m_renderPass,
+                                                                                               0u,
+                                                                                               *vs,
+                                                                                               static_cast<const vk::VkPipelineRasterizationStateCreateInfo*>(&rasterizerState))
+                         .setupFragmentShaderState(*m_pipelineLayout, *m_renderPass, 0u, *fs, static_cast<const vk::VkPipelineDepthStencilStateCreateInfo*>(&depthStencilState))
+                         .setupFragmentOutputState(*m_renderPass, 0u, static_cast<const vk::VkPipelineColorBlendStateCreateInfo*>(&colorBlendState))
+                         .buildPipeline();
 }
 
-
 tcu::TestStatus DepthBoundsTestInstance::iterate (void)
 {
        tcu::TestLog            &log            = m_context.getTestContext().getLog();
@@ -684,7 +702,7 @@ tcu::TestStatus DepthBoundsTestInstance::iterate (void)
        setDynamicBlendState();
        setDynamicDepthStencilState(depthBounds[DEPTH_BOUNDS_MIN], depthBounds[DEPTH_BOUNDS_MAX]);
 
-       m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+       m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline.getPipeline());
 
        const vk::VkDeviceSize  vertexBufferOffset      = 0;
        const vk::VkBuffer              vertexBuffer            = m_vertexBuffer->object();
@@ -737,10 +755,11 @@ protected:
        tcu::Vec4 m_expectedColor;
 
 public:
-       StencilParamsBasicTestInstance (Context& context, const char* vertexShaderName, const char* fragmentShaderName,
+       StencilParamsBasicTestInstance (Context& context, vk::PipelineConstructionType pipelineConstructionType,
+                                                                       const char* vertexShaderName, const char* fragmentShaderName,
                                                                        const deUint32 writeMask, const deUint32 readMask,
                                                                        const deUint32 expectedValue, const tcu::Vec4 expectedColor)
-               : DepthStencilBaseCase  (context, vertexShaderName, fragmentShaderName)
+               : DepthStencilBaseCase  (context, pipelineConstructionType, vertexShaderName, fragmentShaderName)
                , m_expectedColor               (1.0f, 1.0f, 1.0f, 1.0f)
        {
                m_writeMask = writeMask;
@@ -813,11 +832,11 @@ public:
                const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
                m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_1);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline_1.getPipeline());
                setDynamicDepthStencilState(-1.0f, 1.0f, 0xFF, m_writeMask, 0x0F, 0xFF, m_writeMask, 0x0F);
                m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 0, 0);
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_2);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline_2.getPipeline());
                setDynamicDepthStencilState(-1.0f, 1.0f, m_readMask, 0xFF, m_expectedValue, m_readMask, 0xFF, m_expectedValue);
                m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 4, 0);
 
@@ -868,7 +887,7 @@ class StencilParamsBasicTestCase : public TestCase
 protected:
        TestInstance* createInstance(Context& context) const
        {
-               return new StencilParamsBasicTestInstance(context, "VertexFetch.vert", "VertexFetch.frag",
+               return new StencilParamsBasicTestInstance(context, m_pipelineConstructionType, "VertexFetch.vert", "VertexFetch.frag",
                        m_writeMask, m_readMask, m_expectedValue, m_expectedColor);
        }
 
@@ -881,20 +900,34 @@ protected:
                        glu::FragmentSource(ShaderSourceProvider::getSource(m_testCtx.getArchive(), "vulkan/dynamic_state/VertexFetch.frag"));
        }
 
-       deUint32 m_writeMask;
-       deUint32 m_readMask;
-       deUint32 m_expectedValue;
-       tcu::Vec4 m_expectedColor;
+       virtual void checkSupport(Context& context) const
+       {
+               if (m_pipelineConstructionType != vk::PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC)
+               {
+                       context.requireDeviceFunctionality("VK_KHR_graphics_pipeline_library");
+                       if ((m_pipelineConstructionType == vk::PIPELINE_CONSTRUCTION_TYPE_FAST_LINKED_LIBRARY) &&
+                               !context.getGraphicsPipelineLibraryProperties().graphicsPipelineLibraryFastLinking)
+                               TCU_THROW(NotSupportedError, "graphicsPipelineLibraryFastLinking is not supported");
+               }
+       }
+
+       vk::PipelineConstructionType    m_pipelineConstructionType;
+       deUint32                                                m_writeMask;
+       deUint32                                                m_readMask;
+       deUint32                                                m_expectedValue;
+       tcu::Vec4                                               m_expectedColor;
 
 public:
        StencilParamsBasicTestCase (tcu::TestContext& context, const char *name, const char *description,
+                                                               const vk::PipelineConstructionType pipelineConstructionType,
                                                                const deUint32 writeMask, const deUint32 readMask,
                                                                const deUint32 expectedValue, const tcu::Vec4 expectedColor)
-               : TestCase                              (context, name, description)
-               , m_writeMask                   (writeMask)
-               , m_readMask                    (readMask)
-               , m_expectedValue               (expectedValue)
-               , m_expectedColor               (expectedColor)
+               : TestCase                                              (context, name, description)
+               , m_pipelineConstructionType    (pipelineConstructionType)
+               , m_writeMask                                   (writeMask)
+               , m_readMask                                    (readMask)
+               , m_expectedValue                               (expectedValue)
+               , m_expectedColor                               (expectedColor)
        {
        }
 };
@@ -902,8 +935,8 @@ public:
 class StencilParamsAdvancedTestInstance : public DepthStencilBaseCase
 {
 public:
-       StencilParamsAdvancedTestInstance (Context& context, ShaderMap shaders)
-               : DepthStencilBaseCase (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       StencilParamsAdvancedTestInstance (Context& context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : DepthStencilBaseCase (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
        {
                m_data.push_back(PositionColorVertex(tcu::Vec4(-0.5f, 0.5f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
                m_data.push_back(PositionColorVertex(tcu::Vec4(0.5f, 0.5f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
@@ -970,11 +1003,11 @@ public:
                const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
                m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_1);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline_1.getPipeline());
                setDynamicDepthStencilState(-1.0f, 1.0f, 0xFF, 0x0E, 0x0F, 0xFF, 0x0E, 0x0F);
                m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 0, 0);
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline_2);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline_2.getPipeline());
                setDynamicDepthStencilState(-1.0f, 1.0f, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0x0E);
                m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 4, 0);
 
@@ -1029,8 +1062,9 @@ void checkDepthBoundsSupport (Context& context)
 
 } //anonymous
 
-DynamicStateDSTests::DynamicStateDSTests (tcu::TestContext& testCtx)
-       : TestCaseGroup (testCtx, "ds_state", "Tests for depth stencil state")
+DynamicStateDSTests::DynamicStateDSTests (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType)
+       : TestCaseGroup                                 (testCtx, "ds_state", "Tests for depth stencil state")
+       , m_pipelineConstructionType    (pipelineConstructionType)
 {
        /* Left blank on purpose */
 }
@@ -1045,11 +1079,11 @@ void DynamicStateDSTests::init (void)
        shaderPaths[glu::SHADERTYPE_VERTEX] = "vulkan/dynamic_state/VertexFetch.vert";
        shaderPaths[glu::SHADERTYPE_FRAGMENT] = "vulkan/dynamic_state/VertexFetch.frag";
 
-       addChild(new InstanceFactory<DepthBoundsParamTestInstance, FunctionSupport0>(m_testCtx, "depth_bounds_1", "Perform depth bounds test 1", shaderPaths, checkDepthBoundsSupport));
-       addChild(new InstanceFactory<DepthBoundsTestInstance, FunctionSupport0>(m_testCtx, "depth_bounds_2", "Perform depth bounds test 1", shaderPaths, checkDepthBoundsSupport));
-       addChild(new StencilParamsBasicTestCase(m_testCtx, "stencil_params_basic_1", "Perform basic stencil test 1", 0x0D, 0x06, 0x05, tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f)));
-       addChild(new StencilParamsBasicTestCase(m_testCtx, "stencil_params_basic_2", "Perform basic stencil test 2", 0x06, 0x02, 0x05, tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f)));
-       addChild(new InstanceFactory<StencilParamsAdvancedTestInstance>(m_testCtx, "stencil_params_advanced", "Perform advanced stencil test", shaderPaths));
+       addChild(new InstanceFactory<DepthBoundsParamTestInstance, FunctionSupport0>(m_testCtx, "depth_bounds_1", "Perform depth bounds test 1", m_pipelineConstructionType, shaderPaths, checkDepthBoundsSupport));
+       addChild(new InstanceFactory<DepthBoundsTestInstance, FunctionSupport0>(m_testCtx, "depth_bounds_2", "Perform depth bounds test 1", m_pipelineConstructionType, shaderPaths, checkDepthBoundsSupport));
+       addChild(new StencilParamsBasicTestCase(m_testCtx, "stencil_params_basic_1", "Perform basic stencil test 1", m_pipelineConstructionType, 0x0D, 0x06, 0x05, tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f)));
+       addChild(new StencilParamsBasicTestCase(m_testCtx, "stencil_params_basic_2", "Perform basic stencil test 2", m_pipelineConstructionType, 0x06, 0x02, 0x05, tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f)));
+       addChild(new InstanceFactory<StencilParamsAdvancedTestInstance>(m_testCtx, "stencil_params_advanced", "Perform advanced stencil test", m_pipelineConstructionType, shaderPaths));
 }
 
 } // DynamicState
index 5820632..1399701 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "tcuDefs.hpp"
 #include "vktTestCase.hpp"
+#include "vkPipelineConstructionUtil.hpp"
 
 namespace vkt
 {
@@ -35,13 +36,15 @@ namespace DynamicState
 class DynamicStateDSTests : public tcu::TestCaseGroup
 {
 public:
-                                                       DynamicStateDSTests             (tcu::TestContext& testCtx);
+                                                       DynamicStateDSTests             (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType);
                                                        ~DynamicStateDSTests    (void);
        void                                    init                                    (void);
 
 private:
        DynamicStateDSTests                                                             (const DynamicStateDSTests& other);
        DynamicStateDSTests&    operator=                               (const DynamicStateDSTests& other);
+
+       vk::PipelineConstructionType    m_pipelineConstructionType;
 };
 
 } // DynamicState
index 254eab1..2b5b93d 100644 (file)
@@ -56,8 +56,8 @@ namespace
 class StateSwitchTestInstance : public DynamicStateBaseClass
 {
 public:
-       StateSwitchTestInstance (Context &context, ShaderMap shaders)
-               : DynamicStateBaseClass (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       StateSwitchTestInstance (Context &context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : DynamicStateBaseClass (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
        {
                m_topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
 
@@ -86,7 +86,7 @@ public:
                setDynamicBlendState();
                setDynamicDepthStencilState();
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline.getPipeline());
 
                const vk::VkDeviceSize vertexBufferOffset       = 0;
                const vk::VkBuffer vertexBuffer                         = m_vertexBuffer->object();
@@ -148,8 +148,8 @@ public:
 class BindOrderTestInstance : public DynamicStateBaseClass
 {
 public:
-       BindOrderTestInstance (Context& context, ShaderMap shaders)
-               : DynamicStateBaseClass (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       BindOrderTestInstance (Context& context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : DynamicStateBaseClass (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
        {
                m_topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
 
@@ -179,7 +179,7 @@ public:
                setDynamicDepthStencilState();
                setDynamicViewportState(1, &viewport, &scissor_1);
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline.getPipeline());
 
                const vk::VkDeviceSize vertexBufferOffset = 0;
                const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
@@ -243,11 +243,12 @@ public:
 class StatePersistenceTestInstance : public DynamicStateBaseClass
 {
 protected:
-       vk::Move<vk::VkPipeline> m_pipelineAdditional;
+       vk::GraphicsPipelineWrapper     m_pipelineAdditional;
 
 public:
-       StatePersistenceTestInstance (Context& context, ShaderMap shaders)
-               : DynamicStateBaseClass (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       StatePersistenceTestInstance (Context& context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : DynamicStateBaseClass (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+               , m_pipelineAdditional  (context.getDeviceInterface(), context.getDevice(), pipelineConstructionType)
        {
                m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
                m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::green().toVec()));
@@ -265,38 +266,46 @@ public:
        }
        virtual void initPipeline (const vk::VkDevice device)
        {
-               // shaders
-               const vk::Unique<vk::VkShaderModule> vs (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
-               const vk::Unique<vk::VkShaderModule> fs (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
-
-               const PipelineCreateInfo::ColorBlendState::Attachment vkCbAttachmentState;
-
-               PipelineCreateInfo pipelineCreateInfo_1(*m_pipelineLayout, *m_renderPass, 0, 0);
-               pipelineCreateInfo_1.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
-               pipelineCreateInfo_1.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::InputAssemblerState(vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP));
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::ColorBlendState(1, &vkCbAttachmentState));
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::ViewportState(1));
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::DepthStencilState());
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::RasterizerState());
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::MultiSampleState());
-               pipelineCreateInfo_1.addState(PipelineCreateInfo::DynamicState());
-
-               PipelineCreateInfo pipelineCreateInfo_2(*m_pipelineLayout, *m_renderPass, 0, 0);
-               pipelineCreateInfo_2.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
-               pipelineCreateInfo_2.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::InputAssemblerState(vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST));
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::ColorBlendState(1, &vkCbAttachmentState));
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::ViewportState(1));
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::DepthStencilState());
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::RasterizerState());
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::MultiSampleState());
-               pipelineCreateInfo_2.addState(PipelineCreateInfo::DynamicState());
-
-               m_pipeline = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo_1);
-               m_pipelineAdditional = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo_2);
+               const vk::Unique<vk::VkShaderModule>    vs                      (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
+               const vk::Unique<vk::VkShaderModule>    fs                      (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
+               std::vector<vk::VkViewport>                             viewports       { { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f } };
+               std::vector<vk::VkRect2D>                               scissors        { { { 0u, 0u }, { 0u, 0u } } };
+
+               const PipelineCreateInfo::ColorBlendState::Attachment   attachmentState;
+               const PipelineCreateInfo::ColorBlendState                               colorBlendState(1, static_cast<const vk::VkPipelineColorBlendAttachmentState*>(&attachmentState));
+               const PipelineCreateInfo::RasterizerState                               rasterizerState;
+               const PipelineCreateInfo::DepthStencilState                             depthStencilState;
+               const PipelineCreateInfo::DynamicState                                  dynamicState;
+
+               m_pipeline.setDefaultTopology(vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP)
+                                 .setDynamicState(static_cast<const vk::VkPipelineDynamicStateCreateInfo*>(&dynamicState))
+                                 .setDefaultMultisampleState()
+                                 .setupVertexInputStete(&m_vertexInputState)
+                                 .setupPreRasterizationShaderState(viewports,
+                                                                                                       scissors,
+                                                                                                       *m_pipelineLayout,
+                                                                                                       *m_renderPass,
+                                                                                                       0u,
+                                                                                                       *vs,
+                                                                                                       static_cast<const vk::VkPipelineRasterizationStateCreateInfo*>(&rasterizerState))
+                                 .setupFragmentShaderState(*m_pipelineLayout, *m_renderPass, 0u, *fs, static_cast<const vk::VkPipelineDepthStencilStateCreateInfo*>(&depthStencilState))
+                                 .setupFragmentOutputState(*m_renderPass, 0u, static_cast<const vk::VkPipelineColorBlendStateCreateInfo*>(&colorBlendState))
+                                 .buildPipeline();
+
+               m_pipelineAdditional.setDefaultTopology(vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST)
+                                 .setDynamicState(static_cast<const vk::VkPipelineDynamicStateCreateInfo*>(&dynamicState))
+                                 .setDefaultMultisampleState()
+                                 .setupVertexInputStete(&m_vertexInputState)
+                                 .setupPreRasterizationShaderState(viewports,
+                                                                                                       scissors,
+                                                                                                       *m_pipelineLayout,
+                                                                                                       *m_renderPass,
+                                                                                                       0u,
+                                                                                                       *vs,
+                                                                                                       static_cast<const vk::VkPipelineRasterizationStateCreateInfo*>(&rasterizerState))
+                                 .setupFragmentShaderState(*m_pipelineLayout, *m_renderPass, 0u, *fs, static_cast<const vk::VkPipelineDepthStencilStateCreateInfo*>(&depthStencilState))
+                                 .setupFragmentOutputState(*m_renderPass, 0u, static_cast<const vk::VkPipelineColorBlendStateCreateInfo*>(&colorBlendState))
+                                 .buildPipeline();
        }
 
        virtual tcu::TestStatus iterate(void)
@@ -316,7 +325,7 @@ public:
                setDynamicBlendState();
                setDynamicDepthStencilState();
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline.getPipeline());
 
                const vk::VkDeviceSize vertexBufferOffset = 0;
                const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
@@ -327,7 +336,7 @@ public:
                // draw quad using vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
                m_vk.cmdDraw(*m_cmdBuffer, 4, 1, 0, 0);
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineAdditional);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineAdditional.getPipeline());
 
                // bind second state
                setDynamicViewportState(1, &viewport, &scissor_2);
@@ -380,8 +389,9 @@ public:
 
 } //anonymous
 
-DynamicStateGeneralTests::DynamicStateGeneralTests (tcu::TestContext& testCtx)
-       : TestCaseGroup (testCtx, "general_state", "General tests for dynamic states")
+DynamicStateGeneralTests::DynamicStateGeneralTests (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType)
+       : TestCaseGroup                                 (testCtx, "general_state", "General tests for dynamic states")
+       , m_pipelineConstructionType    (pipelineConstructionType)
 {
        /* Left blank on purpose */
 }
@@ -394,9 +404,9 @@ void DynamicStateGeneralTests::init (void)
        shaderPaths[glu::SHADERTYPE_VERTEX] = "vulkan/dynamic_state/VertexFetch.vert";
        shaderPaths[glu::SHADERTYPE_FRAGMENT] = "vulkan/dynamic_state/VertexFetch.frag";
 
-       addChild(new InstanceFactory<StateSwitchTestInstance>(m_testCtx, "state_switch", "Perform multiple draws with different VP states (scissor test)", shaderPaths));
-       addChild(new InstanceFactory<BindOrderTestInstance>(m_testCtx, "bind_order", "Check if binding order is not important for pipeline configuration", shaderPaths));
-       addChild(new InstanceFactory<StatePersistenceTestInstance>(m_testCtx, "state_persistence", "Check if bound states are persistent across pipelines", shaderPaths));
+       addChild(new InstanceFactory<StateSwitchTestInstance>(m_testCtx, "state_switch", "Perform multiple draws with different VP states (scissor test)", m_pipelineConstructionType, shaderPaths));
+       addChild(new InstanceFactory<BindOrderTestInstance>(m_testCtx, "bind_order", "Check if binding order is not important for pipeline configuration", m_pipelineConstructionType, shaderPaths));
+       addChild(new InstanceFactory<StatePersistenceTestInstance>(m_testCtx, "state_persistence", "Check if bound states are persistent across pipelines", m_pipelineConstructionType, shaderPaths));
 }
 
 } // DynamicState
index d139806..0df8cd3 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "tcuDefs.hpp"
 #include "vktTestCase.hpp"
+#include "vkPipelineConstructionUtil.hpp"
 
 namespace vkt
 {
@@ -35,13 +36,15 @@ namespace DynamicState
 class DynamicStateGeneralTests : public tcu::TestCaseGroup
 {
 public:
-                                                               DynamicStateGeneralTests        (tcu::TestContext& testCtx);
+                                                               DynamicStateGeneralTests        (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType);
                                                                ~DynamicStateGeneralTests       (void);
        void                                            init                                            (void);
 
 private:
        DynamicStateGeneralTests                                                                (const DynamicStateGeneralTests& other);
        DynamicStateGeneralTests&       operator=                                       (const DynamicStateGeneralTests& other);
+
+       vk::PipelineConstructionType    m_pipelineConstructionType;
 };
 
 } // DynamicState
index d59702b..c117884 100644 (file)
@@ -160,16 +160,13 @@ class InheritanceTestInstance : public TestInstance
        // Shader modules for graphics pipelines.
        Move<VkShaderModule> m_vertModule, m_geomModule, m_fragModule;
 
-       // Vertex, geometry, fragment stages for creating the pipeline.
-       VkPipelineShaderStageCreateInfo m_stages[3];
-
        // Geometry shader pipeline, converts points into rasterized
        // struct Rectangles using geometry shader, which also selects the
        // viewport to use. Pipeline array maps viewport/scissor count to
        // the pipeline to use (special value 0 indicates that
        // viewport/scissor count is dynamic state).
-       Move<VkPipelineLayout> m_rectanglePipelineLayout;
-       Move<VkPipeline>         m_rectanglePipelines[kMaxViewports + 1];
+       Move<VkPipelineLayout>                                  m_rectanglePipelineLayout;
+       std::vector<GraphicsPipelineWrapper>    m_rectanglePipelines;
 
        // Command pool
        Move<VkCommandPool> m_cmdPool;
@@ -186,7 +183,7 @@ class InheritanceTestInstance : public TestInstance
        float m_cpuDepthBuffer[kHeight][kWidth];
 
 public:
-       InheritanceTestInstance(Context& context, InheritanceMode inheritanceMode);
+       InheritanceTestInstance(Context& context, PipelineConstructionType pipelineConstructionType, InheritanceMode inheritanceMode);
        tcu::TestStatus iterate(void);
 
 private:
@@ -287,14 +284,6 @@ static const VkPipelineVertexInputStateCreateInfo vertexInput = {
        VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, NULL,
        0, 1, &binding, 4, attributes };
 
-static const VkPipelineInputAssemblyStateCreateInfo assembly {
-       VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, NULL,
-       0, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_FALSE };
-
-static const VkPipelineViewportStateCreateInfo viewportTemplate = {
-       VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, NULL,
-       0, 0, NULL, 0, NULL };
-
 static const VkPipelineRasterizationStateCreateInfo rasterization = {
        VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, NULL,
        0,
@@ -305,10 +294,6 @@ static const VkPipelineRasterizationStateCreateInfo rasterization = {
        VK_FRONT_FACE_COUNTER_CLOCKWISE,
        VK_FALSE, 0.0f, 0.0f, 0.0f, 1.0f };
 
-static const VkPipelineMultisampleStateCreateInfo multisample = {
-       VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, NULL,
-       0, VK_SAMPLE_COUNT_1_BIT, VK_FALSE, 0.0f, NULL, VK_FALSE, VK_FALSE };
-
 static const VkPipelineDepthStencilStateCreateInfo depthStencil = {
        VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, NULL,
        0, VK_TRUE, VK_TRUE, VK_COMPARE_OP_LESS,
@@ -337,45 +322,6 @@ static const VkPipelineDynamicStateCreateInfo dynamicStateWithCount = {
        VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, NULL,
        0, 2, dynamicStateWithCountData };
 
-// Fill in the given graphics pipeline state. The caller needs to
-// provide space to store the generated
-// VkPipelineViewportStateCreateInfo, and provide the render pass,
-// pipeline layout, shader modules, and the viewport/scissor count (0
-// to use VK_DYNAMIC_STATE_VIEWPORT/SCISSOR_WITH_COUNT_EXT)
-static void fill(VkRenderPass                       renderPass,
-                                VkPipelineLayout                   layout,
-                                deUint32                           staticViewportScissorCount,
-                                deUint32                           stageCount,
-                                const VkPipelineShaderStageCreateInfo* pStages,
-                                VkGraphicsPipelineCreateInfo*      outCreateInfo,
-                                VkPipelineViewportStateCreateInfo* outViewportState)
-{
-       outCreateInfo->sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
-       outCreateInfo->pNext = NULL;
-       outCreateInfo->flags = 0;
-       outCreateInfo->stageCount = stageCount;
-       outCreateInfo->pStages = pStages;
-       outCreateInfo->pVertexInputState = &vertexInput;
-       outCreateInfo->pInputAssemblyState = &assembly;
-       outCreateInfo->pTessellationState = NULL;
-       outCreateInfo->pViewportState = outViewportState;
-       outCreateInfo->pRasterizationState = &rasterization;
-       outCreateInfo->pMultisampleState = &multisample;
-       outCreateInfo->pDepthStencilState = &depthStencil;
-       outCreateInfo->pColorBlendState = &blend;
-       outCreateInfo->pDynamicState = staticViewportScissorCount == 0 ? &dynamicStateWithCount : &dynamicState;
-       outCreateInfo->layout = layout;
-       outCreateInfo->renderPass = renderPass;
-       outCreateInfo->subpass = 0;
-       outCreateInfo->basePipelineHandle = 0;
-       outCreateInfo->basePipelineIndex = 0;
-
-       VkPipelineViewportStateCreateInfo viewportState = viewportTemplate;
-       viewportState.viewportCount = staticViewportScissorCount;
-       viewportState.scissorCount  = staticViewportScissorCount;
-       *outViewportState = viewportState;
-}
-
 } // end namespace pipelinestate
 
 
@@ -432,9 +378,8 @@ VkImageCreateInfo makeDepthImageInfo(Context& context)
 }
 
 
-
 // Initialize the Vulkan state for the tests.
-InheritanceTestInstance::InheritanceTestInstance(Context& context, InheritanceMode inheritanceMode)
+InheritanceTestInstance::InheritanceTestInstance(Context& context, PipelineConstructionType pipelineConstructionType, InheritanceMode inheritanceMode)
        : TestInstance(context)
        , m_in(context.getInstanceInterface())
        , m_vk(context.getDeviceInterface())
@@ -524,37 +469,19 @@ InheritanceTestInstance::InheritanceTestInstance(Context& context, InheritanceMo
 
        // Compile graphics pipeline stages.
        m_vertModule = vk::createShaderModule(m_vk, dev, m_context.getBinaryCollection().get("vert"), 0u);
-       m_stages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
-       m_stages[0].pNext = NULL;
-       m_stages[0].flags = 0;
-       m_stages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
-       m_stages[0].module = m_vertModule.get();
-       m_stages[0].pName = "main";
-       m_stages[0].pSpecializationInfo = NULL;
-
        m_geomModule = vk::createShaderModule(m_vk, dev, m_context.getBinaryCollection().get("geom"), 0u);
-       m_stages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
-       m_stages[1].pNext = NULL;
-       m_stages[1].flags = 0;
-       m_stages[1].stage = VK_SHADER_STAGE_GEOMETRY_BIT;
-       m_stages[1].module = m_geomModule.get();
-       m_stages[1].pName = "main";
-       m_stages[1].pSpecializationInfo = NULL;
-
        m_fragModule = vk::createShaderModule(m_vk, dev, m_context.getBinaryCollection().get("frag"), 0u);
-       m_stages[2].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
-       m_stages[2].pNext = NULL;
-       m_stages[2].flags = 0;
-       m_stages[2].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
-       m_stages[2].module = m_fragModule.get();
-       m_stages[2].pName = "main";
-       m_stages[2].pSpecializationInfo = NULL;
 
        // Set up pipeline layout (empty)
        VkPipelineLayoutCreateInfo pipelineLayoutInfo{ };
        pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
        m_rectanglePipelineLayout = createPipelineLayout(m_vk, dev, &pipelineLayoutInfo, NULL);
+
        // Graphics pipelines are created on-the-fly later.
+       deUint32 size = kMaxViewports + 1;
+       m_rectanglePipelines.reserve(size);
+       for (deUint32 i = 0; i < size; ++i)
+               m_rectanglePipelines.emplace_back(m_vk, m_context.getDevice(), pipelineConstructionType);
 
        // Command pool and command buffers.
        VkCommandPoolCreateInfo poolInfo {
@@ -687,18 +614,39 @@ void InheritanceTestInstance::startRenderCmds(const TestGeometry& geometry)
                staticViewportCount = 0;
                break;
        }
-       VkPipeline graphicsPipeline = m_rectanglePipelines[staticViewportCount].get();
-       if (!graphicsPipeline)
+       DE_ASSERT(staticViewportCount < m_rectanglePipelines.size());
+       if (!m_rectanglePipelines[staticViewportCount].wasBuild())
        {
-               VkGraphicsPipelineCreateInfo pipelineInfo;
-               VkPipelineViewportStateCreateInfo viewportInfo;
-               pipelinestate::fill(
-                       m_renderPass.get(), m_rectanglePipelineLayout.get(), staticViewportCount,
-                       3, m_stages,
-                       &pipelineInfo, &viewportInfo);
-               m_rectanglePipelines[staticViewportCount] = createGraphicsPipeline(m_vk, m_context.getDevice(), 0, &pipelineInfo, NULL);
-               graphicsPipeline = m_rectanglePipelines[staticViewportCount].get();
+               const std::vector<VkViewport>   viewports;
+               const std::vector<VkRect2D>             scissors;
+
+               m_rectanglePipelines[staticViewportCount]
+                       .setDynamicState((staticViewportCount == 0) ? &pipelinestate::dynamicStateWithCount : &pipelinestate::dynamicState)
+                       .setDefaultTopology(VK_PRIMITIVE_TOPOLOGY_POINT_LIST)
+                       .setDefaultViewportsCount(staticViewportCount)
+                       .setDefaultScissorsCount(staticViewportCount)
+                       .setDefaultMultisampleState()
+                       .setDefaultColorBlendState()
+                       .setupVertexInputStete(&pipelinestate::vertexInput)
+                       .setupPreRasterizationShaderState(viewports,
+                                                                                         scissors,
+                                                                                         *m_rectanglePipelineLayout,
+                                                                                         *m_renderPass,
+                                                                                         0u,
+                                                                                         *m_vertModule,
+                                                                                         &pipelinestate::rasterization,
+                                                                                         DE_NULL,
+                                                                                         DE_NULL,
+                                                                                         *m_geomModule)
+                       .setupFragmentShaderState(*m_rectanglePipelineLayout,
+                                                                         *m_renderPass,
+                                                                         0u,
+                                                                         *m_fragModule,
+                                                                         &pipelinestate::depthStencil)
+                       .setupFragmentOutputState(*m_renderPass, 0u, &pipelinestate::blend)
+                       .buildPipeline();
        }
+       const VkPipeline graphicsPipeline = m_rectanglePipelines[staticViewportCount].getPipeline();
        m_vk.cmdBindPipeline(m_subpassCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline);
 
        // Bind vertex buffer and draw.
@@ -1073,16 +1021,19 @@ tcu::TestStatus InheritanceTestInstance::iterate(void)
 class InheritanceTestCase : public TestCase
 {
 public:
-       InheritanceTestCase (tcu::TestContext& testCtx, InheritanceMode inheritanceMode,
+       InheritanceTestCase (tcu::TestContext& testCtx,
+                                                vk::PipelineConstructionType pipelineConstructionType, InheritanceMode inheritanceMode,
                                                 const char* name, const char* description)
-               : TestCase(testCtx, name, description), m_inheritanceMode(inheritanceMode)
+               : TestCase(testCtx, name, description)
+               , m_pipelineConstructionType    (pipelineConstructionType)
+               , m_inheritanceMode                             (inheritanceMode)
        {
 
        }
 
        TestInstance* createInstance (Context& context) const
        {
-               return new InheritanceTestInstance(context, m_inheritanceMode);
+               return new InheritanceTestInstance(context, m_pipelineConstructionType, m_inheritanceMode);
        }
 
        virtual void checkSupport (Context& context) const
@@ -1092,6 +1043,14 @@ public:
                {
                        context.requireDeviceFunctionality("VK_EXT_extended_dynamic_state");
                }
+
+               if (m_pipelineConstructionType != PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC)
+               {
+                       context.requireDeviceFunctionality("VK_KHR_graphics_pipeline_library");
+                       if ((m_pipelineConstructionType == PIPELINE_CONSTRUCTION_TYPE_FAST_LINKED_LIBRARY) &&
+                               !context.getGraphicsPipelineLibraryProperties().graphicsPipelineLibraryFastLinking)
+                               TCU_THROW(NotSupportedError, "graphicsPipelineLibraryFastLinking is not supported");
+               }
        }
 
        virtual void initPrograms (vk::SourceCollections& programCollection) const
@@ -1101,32 +1060,34 @@ public:
                programCollection.glslSources.add("frag") << glu::FragmentSource(pipelinestate::frag_glsl);
        }
 private:
-       InheritanceMode        m_inheritanceMode;
+       vk::PipelineConstructionType    m_pipelineConstructionType;
+       InheritanceMode                                 m_inheritanceMode;
 };
 
 } // anonymous namespace
 
 
-DynamicStateInheritanceTests::DynamicStateInheritanceTests (tcu::TestContext& testCtx)
-       : TestCaseGroup(testCtx, "inheritance", "Tests for inherited viewport/scissor state")
+DynamicStateInheritanceTests::DynamicStateInheritanceTests (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType)
+       : TestCaseGroup                                 (testCtx, "inheritance", "Tests for inherited viewport/scissor state")
+       , m_pipelineConstructionType    (pipelineConstructionType)
 {
 
 }
 
 void DynamicStateInheritanceTests::init (void)
 {
-       addChild(new InheritanceTestCase(m_testCtx, kInheritanceDisabled, "baseline",
-                        "Baseline, no viewport/scissor inheritance"));
-       addChild(new InheritanceTestCase(m_testCtx, kInheritFromPrimary, "primary",
-                        "Inherit viewport/scissor from calling primary command buffer"));
-       addChild(new InheritanceTestCase(m_testCtx, kInheritFromSecondary, "secondary",
-                        "Inherit viewport/scissor from another secondary command buffer"));
-       addChild(new InheritanceTestCase(m_testCtx, kSplitInheritance, "split",
-                        "Inherit some viewports/scissors from primary, some from secondary"));
-       addChild(new InheritanceTestCase(m_testCtx, kInheritFromPrimaryWithCount, "primary_with_count",
-                        "Inherit viewport/scissor with count from calling primary command buffer"));
-       addChild(new InheritanceTestCase(m_testCtx, kInheritFromSecondaryWithCount, "secondary_with_count",
-                        "Inherit viewport/scissor with count from another secondary command buffer"));
+       addChild(new InheritanceTestCase(m_testCtx, m_pipelineConstructionType, kInheritanceDisabled,
+                        "baseline", "Baseline, no viewport/scissor inheritance"));
+       addChild(new InheritanceTestCase(m_testCtx, m_pipelineConstructionType, kInheritFromPrimary,
+                        "primary", "Inherit viewport/scissor from calling primary command buffer"));
+       addChild(new InheritanceTestCase(m_testCtx, m_pipelineConstructionType, kInheritFromSecondary,
+                        "secondary", "Inherit viewport/scissor from another secondary command buffer"));
+       addChild(new InheritanceTestCase(m_testCtx, m_pipelineConstructionType, kSplitInheritance,
+                        "split", "Inherit some viewports/scissors from primary, some from secondary"));
+       addChild(new InheritanceTestCase(m_testCtx, m_pipelineConstructionType, kInheritFromPrimaryWithCount,
+                        "primary_with_count", "Inherit viewport/scissor with count from calling primary command buffer"));
+       addChild(new InheritanceTestCase(m_testCtx, m_pipelineConstructionType, kInheritFromSecondaryWithCount,
+                        "secondary_with_count", "Inherit viewport/scissor with count from another secondary command buffer"));
 }
 
 } // DynamicState
index 72c2a46..19b9313 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "tcuDefs.hpp"
 #include "vktTestCase.hpp"
+#include "vkPipelineConstructionUtil.hpp"
 
 namespace vkt
 {
@@ -34,11 +35,13 @@ namespace DynamicState
 class DynamicStateInheritanceTests : public tcu::TestCaseGroup
 {
 public:
-       DynamicStateInheritanceTests (tcu::TestContext& testCtx);
+       DynamicStateInheritanceTests (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType);
        void init (void);
 private:
        DynamicStateInheritanceTests (const DynamicStateInheritanceTests& other); // not implemented
        DynamicStateInheritanceTests& operator= (const DynamicStateInheritanceTests& other); // not implemented
+
+       vk::PipelineConstructionType    m_pipelineConstructionType;
 };
 
 } // DynamicState
index d15ac45..47f6288 100644 (file)
@@ -57,12 +57,13 @@ namespace
 class DepthBiasBaseCase : public TestInstance
 {
 public:
-       DepthBiasBaseCase (Context& context, const char* vertexShaderName, const char* fragmentShaderName)
+       DepthBiasBaseCase (Context& context, vk::PipelineConstructionType pipelineConstructionType, const char* vertexShaderName, const char* fragmentShaderName)
                : TestInstance                                          (context)
                , m_colorAttachmentFormat                       (vk::VK_FORMAT_R8G8B8A8_UNORM)
                , m_depthStencilAttachmentFormat        (vk::VK_FORMAT_UNDEFINED)
                , m_topology                                            (vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP)
                , m_vk                                                          (context.getDeviceInterface())
+               , m_pipeline                                            (m_vk, context.getDevice(), pipelineConstructionType)
                , m_vertexShaderName                            (vertexShaderName)
                , m_fragmentShaderName                          (fragmentShaderName)
        {
@@ -83,7 +84,7 @@ protected:
 
        const vk::DeviceInterface&                                              m_vk;
 
-       vk::Move<vk::VkPipeline>                                                m_pipeline;
+       vk::GraphicsPipelineWrapper                                             m_pipeline;
        vk::Move<vk::VkPipelineLayout>                                  m_pipelineLayout;
 
        de::SharedPtr<Image>                                                    m_colorTargetImage;
@@ -227,21 +228,29 @@ protected:
                                                                                                                                  2,
                                                                                                                                  vertexInputAttributeDescriptions);
 
-               const PipelineCreateInfo::ColorBlendState::Attachment vkCbAttachmentState;
+               std::vector<vk::VkViewport>             viewports       { { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f } };
+               std::vector<vk::VkRect2D>               scissors        { { { 0u, 0u }, { 0u, 0u } } };
+
+               const PipelineCreateInfo::ColorBlendState::Attachment   attachmentState;
+               const PipelineCreateInfo::ColorBlendState                               colorBlendState(1u, static_cast<const vk::VkPipelineColorBlendAttachmentState*>(&attachmentState));
+               const PipelineCreateInfo::RasterizerState                               rasterizerState;
+               PipelineCreateInfo::DynamicState                                                dynamicState;
+
+               m_pipeline.setDefaultTopology(m_topology)
+                                 .setDynamicState(static_cast<const vk::VkPipelineDynamicStateCreateInfo*>(&dynamicState))
+                                 .setDefaultMultisampleState()
+                                 .setupVertexInputStete(&m_vertexInputState)
+                                 .setupPreRasterizationShaderState(viewports,
+                                                                                                       scissors,
+                                                                                                       *m_pipelineLayout,
+                                                                                                       *m_renderPass,
+                                                                                                       0u,
+                                                                                                       *vs,
+                                                                                                       static_cast<const vk::VkPipelineRasterizationStateCreateInfo*>(&rasterizerState))
+                                 .setupFragmentShaderState(*m_pipelineLayout, *m_renderPass, 0u, *fs, static_cast<const vk::VkPipelineDepthStencilStateCreateInfo*>(&m_depthStencilState))
+                                 .setupFragmentOutputState(*m_renderPass, 0u, static_cast<const vk::VkPipelineColorBlendStateCreateInfo*>(&colorBlendState))
+                                 .buildPipeline();
 
-               PipelineCreateInfo pipelineCreateInfo(*m_pipelineLayout, *m_renderPass, 0, 0);
-               pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
-               pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
-               pipelineCreateInfo.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
-               pipelineCreateInfo.addState(PipelineCreateInfo::InputAssemblerState(m_topology));
-               pipelineCreateInfo.addState(PipelineCreateInfo::ColorBlendState(1, &vkCbAttachmentState));
-               pipelineCreateInfo.addState(PipelineCreateInfo::ViewportState(1));
-               pipelineCreateInfo.addState(m_depthStencilState);
-               pipelineCreateInfo.addState(PipelineCreateInfo::RasterizerState());
-               pipelineCreateInfo.addState(PipelineCreateInfo::MultiSampleState());
-               pipelineCreateInfo.addState(PipelineCreateInfo::DynamicState());
-
-               m_pipeline = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo);
 
                std::vector<vk::VkImageView> attachments(2);
                attachments[0] = *m_colorTargetView;
@@ -369,8 +378,8 @@ protected:
 class DepthBiasParamTestInstance : public DepthBiasBaseCase
 {
 public:
-       DepthBiasParamTestInstance (Context& context, ShaderMap shaders)
-               : DepthBiasBaseCase (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       DepthBiasParamTestInstance (Context& context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : DepthBiasBaseCase (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
        {
                m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 0.5f, 1.0f), tcu::RGBA::blue().toVec()));
                m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 0.5f, 1.0f), tcu::RGBA::blue().toVec()));
@@ -407,7 +416,7 @@ public:
                setDynamicBlendState();
                setDynamicDepthStencilState();
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline.getPipeline());
 
                const vk::VkDeviceSize vertexBufferOffset       = 0;
                const vk::VkBuffer vertexBuffer                         = m_vertexBuffer->object();
@@ -471,8 +480,8 @@ public:
 class DepthBiasClampParamTestInstance : public DepthBiasBaseCase
 {
 public:
-       DepthBiasClampParamTestInstance (Context& context, ShaderMap shaders)
-               : DepthBiasBaseCase (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       DepthBiasClampParamTestInstance (Context& context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : DepthBiasBaseCase (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
        {
                m_data.push_back(PositionColorVertex(tcu::Vec4(-1.0f, 1.0f, 0.0f, 1.0f), tcu::RGBA::blue().toVec()));
                m_data.push_back(PositionColorVertex(tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f), tcu::RGBA::blue().toVec()));
@@ -503,7 +512,7 @@ public:
                setDynamicBlendState();
                setDynamicDepthStencilState();
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline.getPipeline());
 
                const vk::VkDeviceSize vertexBufferOffset = 0;
                const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
@@ -564,8 +573,8 @@ public:
 class LineWidthParamTestInstance : public DynamicStateBaseClass
 {
 public:
-       LineWidthParamTestInstance (Context& context, ShaderMap shaders)
-               : DynamicStateBaseClass (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       LineWidthParamTestInstance (Context& context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : DynamicStateBaseClass (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
        {
                m_topology = vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
 
@@ -592,7 +601,7 @@ public:
                setDynamicDepthStencilState();
                setDynamicRasterizationState(deFloatFloor(deviceProperties.limits.lineWidthRange[1]));
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline.getPipeline());
 
                const vk::VkDeviceSize vertexBufferOffset       = 0;
                const vk::VkBuffer vertexBuffer                         = m_vertexBuffer->object();
@@ -666,6 +675,7 @@ struct DepthBiasNonZeroPushConstants
 
 struct DepthBiasNonZeroParams
 {
+       vk::PipelineConstructionType    pipelineConstructionType;
        float                                                   depthBiasConstant;
        float                                                   depthBiasClamp;
        DepthBiasNonZeroPushConstants   pushConstants;
@@ -719,6 +729,14 @@ void DepthBiasNonZeroCase::checkSupport (Context& context) const
        const auto& features = context.getDeviceFeatures();
        if (m_params.depthBiasClamp != 0.0f && !features.depthBiasClamp)
                TCU_THROW(NotSupportedError, "Depth bias clamping not supported");
+
+       if (m_params.pipelineConstructionType != vk::PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC)
+       {
+               context.requireDeviceFunctionality("VK_KHR_graphics_pipeline_library");
+               if ((m_params.pipelineConstructionType == vk::PIPELINE_CONSTRUCTION_TYPE_FAST_LINKED_LIBRARY) &&
+                       !context.getGraphicsPipelineLibraryProperties().graphicsPipelineLibraryFastLinking)
+                       TCU_THROW(NotSupportedError, "graphicsPipelineLibraryFastLinking is not supported");
+       }
 }
 
 void DepthBiasNonZeroCase::initPrograms (vk::SourceCollections& programCollection) const
@@ -958,8 +976,9 @@ tcu::TestStatus DepthBiasNonZeroInstance::iterate (void)
 
 } //anonymous
 
-DynamicStateRSTests::DynamicStateRSTests (tcu::TestContext& testCtx)
-       : TestCaseGroup (testCtx, "rs_state", "Tests for rasterizer state")
+DynamicStateRSTests::DynamicStateRSTests (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType)
+       : TestCaseGroup                                 (testCtx, "rs_state", "Tests for rasterizer state")
+       , m_pipelineConstructionType    (pipelineConstructionType)
 {
        /* Left blank on purpose */
 }
@@ -974,32 +993,34 @@ void DynamicStateRSTests::init (void)
        shaderPaths[glu::SHADERTYPE_VERTEX]             = "vulkan/dynamic_state/VertexFetch.vert";
        shaderPaths[glu::SHADERTYPE_FRAGMENT]   = "vulkan/dynamic_state/VertexFetch.frag";
 
-       addChild(new InstanceFactory<DepthBiasParamTestInstance>(m_testCtx, "depth_bias", "Test depth bias functionality", shaderPaths));
-       addChild(new InstanceFactory<DepthBiasClampParamTestInstance, FunctionSupport0>(m_testCtx, "depth_bias_clamp", "Test depth bias clamp functionality", shaderPaths, checkDepthBiasClampSupport));
-       addChild(new InstanceFactory<LineWidthParamTestInstance, FunctionSupport0>(m_testCtx, "line_width", "Draw a line with width set to max defined by physical device", shaderPaths, checkWideLinesSupport));
+       addChild(new InstanceFactory<DepthBiasParamTestInstance>(m_testCtx, "depth_bias", "Test depth bias functionality", m_pipelineConstructionType, shaderPaths));
+       addChild(new InstanceFactory<DepthBiasClampParamTestInstance, FunctionSupport0>(m_testCtx, "depth_bias_clamp", "Test depth bias clamp functionality", m_pipelineConstructionType, shaderPaths, checkDepthBiasClampSupport));
+       addChild(new InstanceFactory<LineWidthParamTestInstance, FunctionSupport0>(m_testCtx, "line_width", "Draw a line with width set to max defined by physical device", m_pipelineConstructionType, shaderPaths, checkWideLinesSupport));
 
        {
-               const DepthBiasNonZeroParams params =
+               const DepthBiasNonZeroParams params
                {
-                       16384.0f,       //      float                                                   depthBiasConstant;
-                       0.0f,           //      float                                                   depthBiasClamp;
-                       {                       //      DepthBiasNonZeroPushConstants   pushConstants;
-                               0.375f, //              float geometryDepth;
-                               0.5f,   //              float minDepth;
-                               1.0f,   //              float maxDepth;
+                       m_pipelineConstructionType,             // vk::PipelineConstructionType pipelineConstructionType
+                       16384.0f,                                               //      float                                                   depthBiasConstant;
+                       0.0f,                                                   //      float                                                   depthBiasClamp;
+                       {                                                               //      DepthBiasNonZeroPushConstants   pushConstants;
+                               0.375f,                                         //              float geometryDepth;
+                               0.5f,                                           //              float minDepth;
+                               1.0f,                                           //              float maxDepth;
                        },
                };
                addChild(new DepthBiasNonZeroCase(m_testCtx, "nonzero_depth_bias_constant", "", params));
        }
        {
-               const DepthBiasNonZeroParams params =
+               const DepthBiasNonZeroParams params
                {
-                       16384.0f,               //      float                                                   depthBiasConstant;
-                       0.125f,                 //      float                                                   depthBiasClamp;
-                       {                               //      DepthBiasNonZeroPushConstants   pushConstants;
-                               0.375f,         //              float geometryDepth;
-                               0.46875f,       //              float minDepth;
-                               0.53125f,       //              float maxDepth;
+                       m_pipelineConstructionType,             // vk::PipelineConstructionType         pipelineConstructionType;
+                       16384.0f,                                               //      float                                                   depthBiasConstant;
+                       0.125f,                                                 //      float                                                   depthBiasClamp;
+                       {                                                               //      DepthBiasNonZeroPushConstants   pushConstants;
+                               0.375f,                                         //              float geometryDepth;
+                               0.46875f,                                       //              float minDepth;
+                               0.53125f,                                       //              float maxDepth;
                        },
                };
                addChild(new DepthBiasNonZeroCase(m_testCtx, "nonzero_depth_bias_clamp", "", params));
index 1d11bf1..86aa526 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "tcuDefs.hpp"
 #include "vktTestCase.hpp"
+#include "vkPipelineConstructionUtil.hpp"
 
 namespace vkt
 {
@@ -35,13 +36,15 @@ namespace DynamicState
 class DynamicStateRSTests : public tcu::TestCaseGroup
 {
 public:
-                                       DynamicStateRSTests                     (tcu::TestContext& testCtx);
+                                       DynamicStateRSTests                     (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType);
                                        ~DynamicStateRSTests            (void);
        void                    init(void);
 
 private:
        DynamicStateRSTests                                                     (const DynamicStateRSTests& other);
        DynamicStateRSTests&            operator=               (const DynamicStateRSTests& other);
+
+       vk::PipelineConstructionType    m_pipelineConstructionType;
 };
 
 } // DynamicState
index e9f4131..ad07257 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "gluShaderUtil.hpp"
 #include "vkPrograms.hpp"
+#include "vkPipelineConstructionUtil.hpp"
 
 #include "deUniquePtr.hpp"
 
@@ -58,24 +59,28 @@ class InstanceFactory : public TestCase
 {
 public:
        InstanceFactory (tcu::TestContext& testCtx, const std::string& name, const std::string& desc,
+               const vk::PipelineConstructionType pipelineConstructionType,
                const std::map<glu::ShaderType, const char*> shaderPaths)
-               : TestCase              (testCtx, name, desc)
-               , m_shaderPaths (shaderPaths)
-               , m_support             ()
+               : TestCase                                              (testCtx, name, desc)
+               , m_pipelineConstructionType    (pipelineConstructionType)
+               , m_shaderPaths                                 (shaderPaths)
+               , m_support                                             ()
        {
        }
 
        InstanceFactory (tcu::TestContext& testCtx, const std::string& name, const std::string& desc,
+               const vk::PipelineConstructionType pipelineConstructionType,
                const std::map<glu::ShaderType, const char*> shaderPaths, const Support& support)
-               : TestCase              (testCtx, name, desc)
-               , m_shaderPaths (shaderPaths)
-               , m_support             (support)
+               : TestCase                                                      (testCtx, name, desc)
+               , m_pipelineConstructionType            (pipelineConstructionType)
+               , m_shaderPaths                                         (shaderPaths)
+               , m_support                                                     (support)
        {
        }
 
        TestInstance*   createInstance  (Context& context) const
        {
-               return new Instance(context, m_shaderPaths);
+               return new Instance(context, m_pipelineConstructionType, m_shaderPaths);
        }
 
        virtual void    initPrograms    (vk::SourceCollections& programCollection) const
@@ -89,12 +94,21 @@ public:
 
        virtual void    checkSupport    (Context& context) const
        {
+               if (m_pipelineConstructionType != vk::PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC)
+               {
+                       context.requireDeviceFunctionality("VK_KHR_graphics_pipeline_library");
+                       if ((m_pipelineConstructionType == vk::PIPELINE_CONSTRUCTION_TYPE_FAST_LINKED_LIBRARY) &&
+                               !context.getGraphicsPipelineLibraryProperties().graphicsPipelineLibraryFastLinking)
+                               TCU_THROW(NotSupportedError, "graphicsPipelineLibraryFastLinking is not supported");
+               }
+
                m_support.checkSupport(context);
        }
 
 private:
-       const ShaderMap m_shaderPaths;
-       const Support   m_support;
+       const vk::PipelineConstructionType      m_pipelineConstructionType;
+       const ShaderMap                                         m_shaderPaths;
+       const Support                                           m_support;
 };
 
 } // DynamicState
index e7398cf..7746cbf 100644 (file)
@@ -41,24 +41,34 @@ namespace DynamicState
 namespace
 {
 
-void createChildren (tcu::TestCaseGroup* group)
+void createChildren (tcu::TestCaseGroup* group, vk::PipelineConstructionType pipelineConstructionType)
 {
        tcu::TestContext&       testCtx         = group->getTestContext();
 
-       group->addChild(new DynamicStateVPTests(testCtx));
-       group->addChild(new DynamicStateRSTests(testCtx));
-       group->addChild(new DynamicStateCBTests(testCtx));
-       group->addChild(new DynamicStateDSTests(testCtx));
-       group->addChild(new DynamicStateGeneralTests(testCtx));
-       group->addChild(createDynamicStateComputeTests(testCtx));
-       group->addChild(new DynamicStateInheritanceTests(testCtx));
+       group->addChild(new DynamicStateVPTests                         (testCtx, pipelineConstructionType));
+       group->addChild(new DynamicStateRSTests                         (testCtx, pipelineConstructionType));
+       group->addChild(new DynamicStateCBTests                         (testCtx, pipelineConstructionType));
+       group->addChild(new DynamicStateDSTests                         (testCtx, pipelineConstructionType));
+       group->addChild(new DynamicStateGeneralTests            (testCtx, pipelineConstructionType));
+       group->addChild(new DynamicStateInheritanceTests        (testCtx, pipelineConstructionType));
+
+       if (pipelineConstructionType == vk::PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC)
+               group->addChild(createDynamicStateComputeTests  (testCtx));
 }
 
 } // anonymous
 
 tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx)
 {
-       return createTestGroup(testCtx, "dynamic_state", "Dynamic State Tests", createChildren);
+       de::MovePtr<tcu::TestCaseGroup> monolithicGroup                 (createTestGroup(testCtx, "monolithic",                         "Monolithic pipeline tests",                                    createChildren, vk::PIPELINE_CONSTRUCTION_TYPE_MONOLITHIC));
+       de::MovePtr<tcu::TestCaseGroup> pipelineLibraryGroup    (createTestGroup(testCtx, "pipeline_library",           "Graphics pipeline library tests",                              createChildren, vk::PIPELINE_CONSTRUCTION_TYPE_OPTIMISED_LIBRARY));
+       de::MovePtr<tcu::TestCaseGroup> fastLinkedLibraryGroup  (createTestGroup(testCtx, "fast_linked_library",        "Fast linked graphics pipeline library tests",  createChildren, vk::PIPELINE_CONSTRUCTION_TYPE_FAST_LINKED_LIBRARY));
+
+       de::MovePtr<tcu::TestCaseGroup> mainGroup(new tcu::TestCaseGroup(testCtx, "dynamic_state", "Dynamic State Tests"));
+       mainGroup->addChild(monolithicGroup.release());
+       mainGroup->addChild(pipelineLibraryGroup.release());
+       mainGroup->addChild(fastLinkedLibraryGroup.release());
+       return mainGroup.release();
 }
 
 } // DynamicState
index a35c669..c480fb5 100644 (file)
@@ -47,8 +47,8 @@ namespace
 class ViewportStateBaseCase : public DynamicStateBaseClass
 {
 public:
-       ViewportStateBaseCase (Context& context, const char* vertexShaderName, const char* fragmentShaderName)
-               : DynamicStateBaseClass (context, vertexShaderName, fragmentShaderName)
+       ViewportStateBaseCase (Context& context, vk::PipelineConstructionType pipelineConstructionType, const char* vertexShaderName, const char* fragmentShaderName)
+               : DynamicStateBaseClass (context, pipelineConstructionType, vertexShaderName, fragmentShaderName)
        {}
 
        void initialize(void)
@@ -85,7 +85,7 @@ public:
                // set states here
                setDynamicStates();
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline.getPipeline());
 
                const vk::VkDeviceSize vertexBufferOffset = 0;
                const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
@@ -121,8 +121,8 @@ public:
 class ViewportParamTestInstance : public ViewportStateBaseCase
 {
 public:
-       ViewportParamTestInstance (Context& context, ShaderMap shaders)
-               : ViewportStateBaseCase (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       ViewportParamTestInstance (Context& context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : ViewportStateBaseCase (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
        {
                ViewportStateBaseCase::initialize();
        }
@@ -168,8 +168,8 @@ public:
 class ScissorParamTestInstance : public ViewportStateBaseCase
 {
 public:
-       ScissorParamTestInstance (Context& context, ShaderMap shaders)
-               : ViewportStateBaseCase (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       ScissorParamTestInstance (Context& context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : ViewportStateBaseCase (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
        {
                ViewportStateBaseCase::initialize();
        }
@@ -219,8 +219,8 @@ protected:
 
 public:
 
-       ViewportArrayTestInstance (Context& context, ShaderMap shaders)
-               : DynamicStateBaseClass (context, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
+       ViewportArrayTestInstance (Context& context, vk::PipelineConstructionType pipelineConstructionType, ShaderMap shaders)
+               : DynamicStateBaseClass (context, pipelineConstructionType, shaders[glu::SHADERTYPE_VERTEX], shaders[glu::SHADERTYPE_FRAGMENT])
                , m_geometryShaderName  (shaders[glu::SHADERTYPE_GEOMETRY])
        {
                for (int i = 0; i < 4; i++)
@@ -236,26 +236,35 @@ public:
 
        virtual void initPipeline (const vk::VkDevice device)
        {
-               const vk::Unique<vk::VkShaderModule> vs(createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
-               const vk::Unique<vk::VkShaderModule> gs(createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_geometryShaderName), 0));
-               const vk::Unique<vk::VkShaderModule> fs(createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
-
-               const PipelineCreateInfo::ColorBlendState::Attachment vkCbAttachmentState;
-
-               PipelineCreateInfo pipelineCreateInfo(*m_pipelineLayout, *m_renderPass, 0, 0);
-               pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*vs, "main", vk::VK_SHADER_STAGE_VERTEX_BIT));
-               pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*gs, "main", vk::VK_SHADER_STAGE_GEOMETRY_BIT));
-               pipelineCreateInfo.addShader(PipelineCreateInfo::PipelineShaderStage(*fs, "main", vk::VK_SHADER_STAGE_FRAGMENT_BIT));
-               pipelineCreateInfo.addState(PipelineCreateInfo::VertexInputState(m_vertexInputState));
-               pipelineCreateInfo.addState(PipelineCreateInfo::InputAssemblerState(m_topology));
-               pipelineCreateInfo.addState(PipelineCreateInfo::ColorBlendState(1, &vkCbAttachmentState));
-               pipelineCreateInfo.addState(PipelineCreateInfo::ViewportState(4));
-               pipelineCreateInfo.addState(PipelineCreateInfo::DepthStencilState());
-               pipelineCreateInfo.addState(PipelineCreateInfo::RasterizerState());
-               pipelineCreateInfo.addState(PipelineCreateInfo::MultiSampleState());
-               pipelineCreateInfo.addState(PipelineCreateInfo::DynamicState());
-
-               m_pipeline = vk::createGraphicsPipeline(m_vk, device, DE_NULL, &pipelineCreateInfo);
+               const vk::Unique<vk::VkShaderModule>    vs                      (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_vertexShaderName), 0));
+               const vk::Unique<vk::VkShaderModule>    gs                      (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_geometryShaderName), 0));
+               const vk::Unique<vk::VkShaderModule>    fs                      (createShaderModule(m_vk, device, m_context.getBinaryCollection().get(m_fragmentShaderName), 0));
+               std::vector<vk::VkViewport>                             viewports       (4u, { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f });
+               std::vector<vk::VkRect2D>                               scissors        (4u, { { 0u, 0u }, { 0u, 0u } });
+
+               const PipelineCreateInfo::ColorBlendState::Attachment   attachmentState;
+               const PipelineCreateInfo::ColorBlendState                               colorBlendState(1u, static_cast<const vk::VkPipelineColorBlendAttachmentState*>(&attachmentState));
+               const PipelineCreateInfo::RasterizerState                               rasterizerState;
+               const PipelineCreateInfo::DepthStencilState                             depthStencilState;
+               PipelineCreateInfo::DynamicState                                                dynamicState;
+
+               m_pipeline.setDefaultTopology(m_topology)
+                                 .setDynamicState(static_cast<const vk::VkPipelineDynamicStateCreateInfo*>(&dynamicState))
+                                 .setDefaultMultisampleState()
+                                 .setupVertexInputStete(&m_vertexInputState)
+                                 .setupPreRasterizationShaderState(viewports,
+                                                                                                       scissors,
+                                                                                                       *m_pipelineLayout,
+                                                                                                       *m_renderPass,
+                                                                                                       0u,
+                                                                                                       *vs,
+                                                                                                       static_cast<const vk::VkPipelineRasterizationStateCreateInfo*>(&rasterizerState),
+                                                                                                       DE_NULL,
+                                                                                                       DE_NULL,
+                                                                                                       *gs)
+                                 .setupFragmentShaderState(*m_pipelineLayout, *m_renderPass, 0u, *fs, static_cast<const vk::VkPipelineDepthStencilStateCreateInfo*>(&depthStencilState))
+                                 .setupFragmentOutputState(*m_renderPass, 0u, static_cast<const vk::VkPipelineColorBlendStateCreateInfo*>(&colorBlendState))
+                                 .buildPipeline();
        }
 
        virtual tcu::TestStatus iterate (void)
@@ -293,7 +302,7 @@ public:
                setDynamicBlendState();
                setDynamicDepthStencilState();
 
-               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+               m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipeline.getPipeline());
 
                const vk::VkDeviceSize vertexBufferOffset = 0;
                const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
@@ -353,8 +362,9 @@ void checkGeometryAndMultiViewportSupport (Context& context)
 
 } //anonymous
 
-DynamicStateVPTests::DynamicStateVPTests (tcu::TestContext& testCtx)
-       : TestCaseGroup (testCtx, "vp_state", "Tests for viewport state")
+DynamicStateVPTests::DynamicStateVPTests (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType)
+       : TestCaseGroup                                 (testCtx, "vp_state", "Tests for viewport state")
+       , m_pipelineConstructionType    (pipelineConstructionType)
 {
        /* Left blank on purpose */
 }
@@ -369,11 +379,11 @@ void DynamicStateVPTests::init (void)
        shaderPaths[glu::SHADERTYPE_VERTEX] = "vulkan/dynamic_state/VertexFetch.vert";
        shaderPaths[glu::SHADERTYPE_FRAGMENT] = "vulkan/dynamic_state/VertexFetch.frag";
 
-       addChild(new InstanceFactory<ViewportParamTestInstance>(m_testCtx, "viewport", "Set viewport which is twice bigger than screen size", shaderPaths));
-       addChild(new InstanceFactory<ScissorParamTestInstance>(m_testCtx, "scissor", "Perform a scissor test on 1/4 bottom-left part of the surface", shaderPaths));
+       addChild(new InstanceFactory<ViewportParamTestInstance>(m_testCtx, "viewport", "Set viewport which is twice bigger than screen size", m_pipelineConstructionType, shaderPaths));
+       addChild(new InstanceFactory<ScissorParamTestInstance>(m_testCtx, "scissor", "Perform a scissor test on 1/4 bottom-left part of the surface", m_pipelineConstructionType, shaderPaths));
 
        shaderPaths[glu::SHADERTYPE_GEOMETRY] = "vulkan/dynamic_state/ViewportArray.geom";
-       addChild(new InstanceFactory<ViewportArrayTestInstance, FunctionSupport0>(m_testCtx, "viewport_array", "Multiple viewports and scissors", shaderPaths, checkGeometryAndMultiViewportSupport));
+       addChild(new InstanceFactory<ViewportArrayTestInstance, FunctionSupport0>(m_testCtx, "viewport_array", "Multiple viewports and scissors", m_pipelineConstructionType, shaderPaths, checkGeometryAndMultiViewportSupport));
 }
 
 } // DynamicState
index e9fa3cd..4f17c92 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "tcuDefs.hpp"
 #include "vktTestCase.hpp"
+#include "vkPipelineConstructionUtil.hpp"
 
 namespace vkt
 {
@@ -35,13 +36,15 @@ namespace DynamicState
 class DynamicStateVPTests : public tcu::TestCaseGroup
 {
 public:
-                                                       DynamicStateVPTests                     (tcu::TestContext& testCtx);
+                                                       DynamicStateVPTests                     (tcu::TestContext& testCtx, vk::PipelineConstructionType pipelineConstructionType);
                                                        ~DynamicStateVPTests            (void);
        void                                    init                                            (void);
 
 private:
        DynamicStateVPTests                                                                     (const DynamicStateVPTests& other);
        DynamicStateVPTests&    operator=                                       (const DynamicStateVPTests& other);
+
+       vk::PipelineConstructionType    m_pipelineConstructionType;
 };
 
 } // DynamicState
index fc6a9fa..70fc228 100644 (file)
@@ -905,7 +905,7 @@ bool PipelineLibraryTestInstance::runTest (RuntimePipelineTreeConfiguration&        run
 
        // Queue commands and read results.
        {
-               const tcu::IVec2                                        renderSize                                      = { RENDER_SIZE_WIDTH, RENDER_SIZE_HEIGHT };
+               const tcu::UVec2                                        renderSize                                      = { RENDER_SIZE_WIDTH, RENDER_SIZE_HEIGHT };
                const VkRect2D                                          renderArea                                      = makeRect2D(renderSize.x(), renderSize.y());
                const de::MovePtr<BufferWithMemory>     vertexBuffer                            = makeVertexBuffer();
                const deUint32                                          vertexCount                                     = static_cast<deUint32>(m_vertexData.size());
@@ -942,8 +942,9 @@ bool PipelineLibraryTestInstance::runTest (RuntimePipelineTreeConfiguration&        run
                        }
                        endRenderPass(vk, *cmdBuffer);
 
-                       copyImageToBuffer(vk, *cmdBuffer, *colorImage, *colorBuffer, renderSize);
-                       copyImageToBuffer(vk, *cmdBuffer, *depthImage, *depthBuffer, renderSize, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1u, VK_IMAGE_ASPECT_DEPTH_BIT, VK_IMAGE_ASPECT_DEPTH_BIT);
+                       const tcu::IVec2 size = { (deInt32)renderSize.x(), (deInt32)renderSize.y() };
+                       copyImageToBuffer(vk, *cmdBuffer, *colorImage, *colorBuffer, size);
+                       copyImageToBuffer(vk, *cmdBuffer, *depthImage, *depthBuffer, size, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1u, VK_IMAGE_ASPECT_DEPTH_BIT, VK_IMAGE_ASPECT_DEPTH_BIT);
                }
                endCommandBuffer(vk, *cmdBuffer);
                submitCommandsAndWait(vk, device, m_context.getUniversalQueue(), cmdBuffer.get());
index f20dc1b..71a0361 100644 (file)
-dEQP-VK.dynamic_state.vp_state.viewport
-dEQP-VK.dynamic_state.vp_state.scissor
-dEQP-VK.dynamic_state.vp_state.viewport_array
-dEQP-VK.dynamic_state.rs_state.depth_bias
-dEQP-VK.dynamic_state.rs_state.depth_bias_clamp
-dEQP-VK.dynamic_state.rs_state.line_width
-dEQP-VK.dynamic_state.rs_state.nonzero_depth_bias_constant
-dEQP-VK.dynamic_state.rs_state.nonzero_depth_bias_clamp
-dEQP-VK.dynamic_state.cb_state.blend_constants
-dEQP-VK.dynamic_state.ds_state.depth_bounds_1
-dEQP-VK.dynamic_state.ds_state.depth_bounds_2
-dEQP-VK.dynamic_state.ds_state.stencil_params_basic_1
-dEQP-VK.dynamic_state.ds_state.stencil_params_basic_2
-dEQP-VK.dynamic_state.ds_state.stencil_params_advanced
-dEQP-VK.dynamic_state.general_state.state_switch
-dEQP-VK.dynamic_state.general_state.bind_order
-dEQP-VK.dynamic_state.general_state.state_persistence
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_width.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_width.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bias.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bias.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.blend_constants.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.blend_constants.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_compare_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_compare_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_write_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_write_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_reference.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_reference.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.discard_rectangle_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.discard_rectangle_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.sample_locations_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.sample_locations_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.fragment_shading_rate_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.fragment_shading_rate_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_stipple_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.line_stipple_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.cull_mode_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.cull_mode_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.front_face_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.front_face_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.primitive_topology_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.primitive_topology_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.scissor_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.vertex_input_binding_stride_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.vertex_input_binding_stride_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_write_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_write_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_compare_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_compare_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.depth_bounds_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.stencil_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_w_scaling_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_w_scaling_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_shading_rate_palette_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_shading_rate_palette_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_coarse_sample_order_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.viewport_coarse_sample_order_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.compute.exclusive_scissor_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.compute.exclusive_scissor_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_width.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_width.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bias.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bias.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.blend_constants.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.blend_constants.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_compare_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_compare_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_write_mask.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_write_mask.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_reference.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_reference.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.discard_rectangle_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.discard_rectangle_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.sample_locations_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.sample_locations_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.fragment_shading_rate_khr.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.fragment_shading_rate_khr.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_stipple_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.line_stipple_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.cull_mode_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.cull_mode_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.front_face_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.front_face_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.primitive_topology_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.primitive_topology_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor_with_count_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.scissor_with_count_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.vertex_input_binding_stride_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.vertex_input_binding_stride_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_write_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_write_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_compare_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_compare_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.depth_bounds_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_test_enable_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_test_enable_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_op_ext.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.stencil_op_ext.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_w_scaling_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_w_scaling_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.after
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.exclusive_scissor_nv.before
-dEQP-VK.dynamic_state.compute_transfer.single.transfer.exclusive_scissor_nv.after
-dEQP-VK.dynamic_state.compute_transfer.multi.compute.before
-dEQP-VK.dynamic_state.compute_transfer.multi.compute.after
-dEQP-VK.dynamic_state.compute_transfer.multi.transfer.before
-dEQP-VK.dynamic_state.compute_transfer.multi.transfer.after
-dEQP-VK.dynamic_state.inheritance.baseline
-dEQP-VK.dynamic_state.inheritance.primary
-dEQP-VK.dynamic_state.inheritance.secondary
-dEQP-VK.dynamic_state.inheritance.split
-dEQP-VK.dynamic_state.inheritance.primary_with_count
-dEQP-VK.dynamic_state.inheritance.secondary_with_count
+dEQP-VK.dynamic_state.monolithic.vp_state.viewport
+dEQP-VK.dynamic_state.monolithic.vp_state.scissor
+dEQP-VK.dynamic_state.monolithic.vp_state.viewport_array
+dEQP-VK.dynamic_state.monolithic.rs_state.depth_bias
+dEQP-VK.dynamic_state.monolithic.rs_state.depth_bias_clamp
+dEQP-VK.dynamic_state.monolithic.rs_state.line_width
+dEQP-VK.dynamic_state.monolithic.rs_state.nonzero_depth_bias_constant
+dEQP-VK.dynamic_state.monolithic.rs_state.nonzero_depth_bias_clamp
+dEQP-VK.dynamic_state.monolithic.cb_state.blend_constants
+dEQP-VK.dynamic_state.monolithic.ds_state.depth_bounds_1
+dEQP-VK.dynamic_state.monolithic.ds_state.depth_bounds_2
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_basic_1
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_basic_2
+dEQP-VK.dynamic_state.monolithic.ds_state.stencil_params_advanced
+dEQP-VK.dynamic_state.monolithic.general_state.state_switch
+dEQP-VK.dynamic_state.monolithic.general_state.bind_order
+dEQP-VK.dynamic_state.monolithic.general_state.state_persistence
+dEQP-VK.dynamic_state.monolithic.inheritance.baseline
+dEQP-VK.dynamic_state.monolithic.inheritance.primary
+dEQP-VK.dynamic_state.monolithic.inheritance.secondary
+dEQP-VK.dynamic_state.monolithic.inheritance.split
+dEQP-VK.dynamic_state.monolithic.inheritance.primary_with_count
+dEQP-VK.dynamic_state.monolithic.inheritance.secondary_with_count
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_width.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_width.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bias.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bias.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.blend_constants.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.blend_constants.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_compare_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_compare_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_write_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_write_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_reference.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_reference.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.discard_rectangle_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.discard_rectangle_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.sample_locations_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.sample_locations_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.ray_tracing_pipeline_stack_size_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.fragment_shading_rate_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.fragment_shading_rate_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_stipple_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.line_stipple_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.cull_mode_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.cull_mode_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.front_face_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.front_face_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.primitive_topology_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.primitive_topology_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.scissor_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.vertex_input_binding_stride_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.vertex_input_binding_stride_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_write_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_write_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_compare_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_compare_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.depth_bounds_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.stencil_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_w_scaling_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_w_scaling_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_shading_rate_palette_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_shading_rate_palette_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_coarse_sample_order_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.viewport_coarse_sample_order_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.exclusive_scissor_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.exclusive_scissor_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_width.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_width.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bias.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bias.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.blend_constants.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.blend_constants.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_compare_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_compare_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_write_mask.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_write_mask.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_reference.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_reference.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.discard_rectangle_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.discard_rectangle_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.sample_locations_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.sample_locations_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.ray_tracing_pipeline_stack_size_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.fragment_shading_rate_khr.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.fragment_shading_rate_khr.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_stipple_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.line_stipple_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.cull_mode_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.cull_mode_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.front_face_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.front_face_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.primitive_topology_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.primitive_topology_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor_with_count_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.scissor_with_count_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.vertex_input_binding_stride_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.vertex_input_binding_stride_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_write_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_write_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_compare_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_compare_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.depth_bounds_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_test_enable_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_test_enable_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_op_ext.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.stencil_op_ext.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_w_scaling_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_w_scaling_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_shading_rate_palette_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.viewport_coarse_sample_order_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.exclusive_scissor_nv.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.single.transfer.exclusive_scissor_nv.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.compute.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.compute.after
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.transfer.before
+dEQP-VK.dynamic_state.monolithic.compute_transfer.multi.transfer.after
+dEQP-VK.dynamic_state.pipeline_library.vp_state.viewport
+dEQP-VK.dynamic_state.pipeline_library.vp_state.scissor
+dEQP-VK.dynamic_state.pipeline_library.vp_state.viewport_array
+dEQP-VK.dynamic_state.pipeline_library.rs_state.depth_bias
+dEQP-VK.dynamic_state.pipeline_library.rs_state.depth_bias_clamp
+dEQP-VK.dynamic_state.pipeline_library.rs_state.line_width
+dEQP-VK.dynamic_state.pipeline_library.rs_state.nonzero_depth_bias_constant
+dEQP-VK.dynamic_state.pipeline_library.rs_state.nonzero_depth_bias_clamp
+dEQP-VK.dynamic_state.pipeline_library.cb_state.blend_constants
+dEQP-VK.dynamic_state.pipeline_library.ds_state.depth_bounds_1
+dEQP-VK.dynamic_state.pipeline_library.ds_state.depth_bounds_2
+dEQP-VK.dynamic_state.pipeline_library.ds_state.stencil_params_basic_1
+dEQP-VK.dynamic_state.pipeline_library.ds_state.stencil_params_basic_2
+dEQP-VK.dynamic_state.pipeline_library.ds_state.stencil_params_advanced
+dEQP-VK.dynamic_state.pipeline_library.general_state.state_switch
+dEQP-VK.dynamic_state.pipeline_library.general_state.bind_order
+dEQP-VK.dynamic_state.pipeline_library.general_state.state_persistence
+dEQP-VK.dynamic_state.pipeline_library.inheritance.baseline
+dEQP-VK.dynamic_state.pipeline_library.inheritance.primary
+dEQP-VK.dynamic_state.pipeline_library.inheritance.secondary
+dEQP-VK.dynamic_state.pipeline_library.inheritance.split
+dEQP-VK.dynamic_state.pipeline_library.inheritance.primary_with_count
+dEQP-VK.dynamic_state.pipeline_library.inheritance.secondary_with_count
+dEQP-VK.dynamic_state.fast_linked_library.vp_state.viewport
+dEQP-VK.dynamic_state.fast_linked_library.vp_state.scissor
+dEQP-VK.dynamic_state.fast_linked_library.vp_state.viewport_array
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.depth_bias
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.depth_bias_clamp
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.line_width
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.nonzero_depth_bias_constant
+dEQP-VK.dynamic_state.fast_linked_library.rs_state.nonzero_depth_bias_clamp
+dEQP-VK.dynamic_state.fast_linked_library.cb_state.blend_constants
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.depth_bounds_1
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.depth_bounds_2
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.stencil_params_basic_1
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.stencil_params_basic_2
+dEQP-VK.dynamic_state.fast_linked_library.ds_state.stencil_params_advanced
+dEQP-VK.dynamic_state.fast_linked_library.general_state.state_switch
+dEQP-VK.dynamic_state.fast_linked_library.general_state.bind_order
+dEQP-VK.dynamic_state.fast_linked_library.general_state.state_persistence
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.baseline
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.primary
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.secondary
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.split
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.primary_with_count
+dEQP-VK.dynamic_state.fast_linked_library.inheritance.secondary_with_count